o
    <‘ði<�  ã                   @   sN  d dl Z d dlZd dlmZmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZ d dlmZ d dlmZ d dlmZmZ d dl m!Z! d dl"m#Z# d dl"m$Z$ d dl"m%Z% d dl"m&Z& d dl"m'Z' d dl"m(Z(m)Z) d dl"m*Z* d dl+m,Z, dZ-	 dZ.	 G dd„ ded�Z/dd„ Z0dd„ Z1d d!„ Z2d"d#„ Z3d$d%„ Z4G d&d'„ d'ƒZ5G d(d)„ d)e5ƒZ6G d*d+„ d+e5ƒZ7G d,d-„ d-e5ƒZ8G d.d/„ d/e5ƒZ9G d0d1„ d1e6e/ƒZ:G d2d3„ d3e6e/ƒZ;G d4d5„ d5e6e/ƒZ<G d6d7„ d7e7e/ƒZ=G d8d9„ d9e7e/ƒZ>G d:d;„ d;e7e/ƒZ?G d<d=„ d=e8e/ƒZ@G d>d?„ d?e8e/ƒZAG d@dA„ dAe8e/ƒZBG dBdC„ dCe8e/ƒZCG dDdE„ dEe7e/ƒZDG dFdG„ dGe7e/ƒZEG dHdI„ dIe7e/ƒZFG dJdK„ dKe9e/ƒZGG dLdM„ dMƒZHG dNdO„ dOeHƒZIG dPdQ„ dQeIe/ƒZJG dRdS„ dSeIe/ƒZKG dTdU„ dUeIe/ƒZLG dVdW„ dWeHƒZMG dXdY„ dYeMe/ƒZNG dZd[„ d[eMe/ƒZOG d\d]„ d]eMe/ƒZPG d^d_„ d_eHƒZQG d`da„ daeQe/ƒZRG dbdc„ dceQe/ƒZSG ddde„ deeQe/ƒZTG dfdg„ dgeHƒZUG dhdi„ dieUe/ƒZVG djdk„ dkeUe/ƒZWG dldm„ dmeUe/ƒZXG dndo„ doeHe/ƒZYG dpdq„ dqeHe/ƒZZG drds„ dseZƒZ[G dtdu„ dueZƒZ\G dvdw„ dweZƒZ]G dxdy„ dye5e/ƒZ^G dzd{„ d{e5e/ƒZ_G d|d}„ d}e5e/ƒZ`G d~d„ dƒZaG d€d�„ d�eaƒZbG d‚dƒ„ dƒebe/ƒZcG d„d…„ d…ebe/ƒZdG d†d‡„ d‡ebe/ƒZeG dˆd‰„ d‰eaƒZfG dŠd‹„ d‹efe/ƒZgG dŒd�„ d�efe/ƒZhG dŽd�„ d�efe/ƒZiG d�d‘„ d‘e8e/ƒZjG d’d“„ d“e8e/ƒZkG d”d•„ d•e8e/ƒZlG d–d—„ d—ƒZmdS )˜é    N)ÚABCMetaÚabstractmethod)ÚhexlifyÚ	unhexlify)ÚInvalidSignature)Údefault_backend)Úconstant_timeÚhashesÚhmac)Úec)Úpadding)Úutils)ÚCipherÚ
algorithmsÚmodes)ÚConcatKDFHash)Ú
PBKDF2HMAC)Úaes_key_unwrapÚaes_key_wrap)ÚPKCS7)ÚInvalidCEKeyLength)ÚInvalidJWAAlgorithm)ÚInvalidJWEKeyLength)ÚInvalidJWEKeyType)ÚInvalidJWEOperation)Úbase64url_decodeÚbase64url_encode)Újson_decode)ÚJWKi @  Tc                   @   sh   e Zd Zeedd„ ƒƒZeedd„ ƒƒZeedd„ ƒƒZeedd„ ƒƒZeed	d
„ ƒƒZ	edd„ ƒZ
dS )ÚJWAAlgorithmc                 C   ó   dS )zThe algorithm NameN© ©Úselfr!   r!   úK/root/parts/websockify/install/lib/python3.10/site-packages/jwcrypto/jwa.pyÚname7   ó    zJWAAlgorithm.namec                 C   r    )zA short descriptionNr!   r"   r!   r!   r$   Údescription<   r&   zJWAAlgorithm.descriptionc                 C   r    )zThe algorithm key sizeNr!   r"   r!   r!   r$   ÚkeysizeA   r&   zJWAAlgorithm.keysizec                 C   r    )zOne of 'alg', 'enc' or 'JWK'Nr!   r"   r!   r!   r$   Úalgorithm_usage_locationF   r&   z%JWAAlgorithm.algorithm_usage_locationc                 C   r    )zOne of 'sig', 'kex', 'enc'Nr!   r"   r!   r!   r$   Úalgorithm_useK   r&   zJWAAlgorithm.algorithm_usec                 C   s"   z| j W S  ty   | j Y S w )zThe input key size)Úwrap_key_sizeÚAttributeErrorr(   r"   r!   r!   r$   Úinput_keysizeP   s
   
ÿzJWAAlgorithm.input_keysizeN)Ú__name__Ú
__module__Ú__qualname__Úpropertyr   r%   r'   r(   r)   r*   r-   r!   r!   r!   r$   r   5   s$    r   )Ú	metaclassc                 C   s   t | ƒd S ©Né   )Úlen©Úxr!   r!   r$   Ú_bitsizeY   ó   r8   c                 C   s   | d S r3   r!   r6   r!   r!   r$   Ú_inbytes]   s   r:   c                 C   s"   | d dkr
t dƒ‚t t| ƒ¡S )Nr4   r   zlength must be a multiple of 8)Ú
ValueErrorÚosÚurandomr:   r6   r!   r!   r$   Ú_randombitsa   s   r>   c                 C   s2   d  | ¡}|d d d }t| |d¡d |… ƒS )Nz{:x}é   r4   é   Ú0)Úformatr   Úrjust)ÚnÚbitsÚeÚilenr!   r!   r$   Ú_encode_inth   s   
rH   c                 C   s   t t| ƒdƒS )Né   )Úintr   )rD   r!   r!   r$   Ú_decode_intn   s   rK   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )Ú_RawJWSc                 C   ó   t ‚©N©ÚNotImplementedError©r#   ÚkeyÚpayloadr!   r!   r$   Úsignt   ó   z_RawJWS.signc                 C   rN   rO   rP   ©r#   rS   rT   Ú	signaturer!   r!   r$   Úverifyw   rV   z_RawJWS.verifyN©r.   r/   r0   rU   rY   r!   r!   r!   r$   rM   r   ó    rM   c                   @   ó0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ ZdS )
Ú_RawHMACNc                 C   s   t ƒ | _|| _d S rO   )r   ÚbackendÚhashfn©r#   r_   r!   r!   r$   Ú__init__   s   
z_RawHMAC.__init__c                 C   sD   t rt|ƒ| jk rt| jt|ƒƒ‚tj|| j| jd�}| |¡ |S )N©r^   )	Údefault_enforce_hmac_key_lengthr8   r(   r   r
   ÚHMACr_   r^   Úupdate)r#   rS   rT   Úhr!   r!   r$   Ú_hmac_setupƒ   s
   
z_RawHMAC._hmac_setupc                 C   s"   t | d¡ƒ}|  ||¡}| ¡ S ©NrU   )r   Ú
get_op_keyrg   Úfinalize)r#   rS   rT   Úskeyrf   r!   r!   r$   rU   ‹   s   z_RawHMAC.signc                 C   s(   t | d¡ƒ}|  ||¡}| |¡ d S ©NrY   )r   ri   rg   rY   )r#   rS   rT   rX   Úvkeyrf   r!   r!   r$   rY   �   s   z_RawHMAC.verify)r.   r/   r0   r(   ra   rg   rU   rY   r!   r!   r!   r$   r]   {   s    r]   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú_RawRSAc                 C   ó   || _ || _d S rO   )Úpadfnr_   )r#   rp   r_   r!   r!   r$   ra   —   ó   
z_RawRSA.__init__c                 C   s   |  d¡}| || j| j¡S rh   )ri   rU   rp   r_   ©r#   rS   rT   rk   r!   r!   r$   rU   ›   s   
z_RawRSA.signc                 C   s"   |  d¡}| ||| j| j¡ d S rl   )ri   rY   rp   r_   ©r#   rS   rT   rX   Úpkeyr!   r!   r$   rY   Ÿ   s   
z_RawRSA.verifyN)r.   r/   r0   ra   rU   rY   r!   r!   r!   r$   rn   –   s    rn   c                   @   s0   e Zd Zdd„ Zedd„ ƒZdd„ Zdd„ Zd	S )
Ú_RawECc                 C   ro   rO   )Ú_curver_   )r#   Úcurver_   r!   r!   r$   ra   ¥   rq   z_RawEC.__init__c                 C   s   | j S rO   )rv   r"   r!   r!   r$   rw   ©   s   z_RawEC.curvec                 C   sJ   |  d| j¡}|j}| |t | j¡¡}t |¡\}}t	||ƒt	||ƒ S rh   )
ri   rv   Úkey_sizerU   r   ÚECDSAr_   Úec_utilsÚdecode_dss_signaturerH   )r#   rS   rT   rk   ÚsizerX   ÚrÚsr!   r!   r$   rU   ­   s
   z_RawEC.signc                 C   sp   |  d| j¡}|d t|ƒd … }|t|ƒd d … }t tt|ƒdƒtt|ƒdƒ¡}| ||t 	| j
¡¡ d S )NrY   r@   rI   )ri   rv   r5   rz   Úencode_dss_signaturerJ   r   rY   r   ry   r_   )r#   rS   rT   rX   rt   r}   r~   Úenc_signaturer!   r!   r$   rY   ´   s   ÿz_RawEC.verifyN)r.   r/   r0   ra   r1   rw   rU   rY   r!   r!   r!   r$   ru   ¤   s    
ru   c                   @   rL   )Ú_RawNonec                 C   r    )NÚ r!   rR   r!   r!   r$   rU   ¿   rV   z_RawNone.signc                 C   s$   |d dks|  ¡ dkrtdƒ‚d S )NÚktyÚoctr‚   z'The "none" signature cannot be verified)ri   r   rW   r!   r!   r$   rY   Â   s   ÿz_RawNone.verifyNrZ   r!   r!   r!   r$   r�   ½   r[   r�   c                       ó0   e Zd ZdZdZdZdZdZ‡ fdd„Z‡  Z	S )Ú_HS256ÚHS256zHMAC using SHA-256é   ÚalgÚsigc                    ó   t t| ƒ t ¡ ¡ d S rO   )Úsuperr†   ra   r	   ÚSHA256r"   ©Ú	__class__r!   r$   ra   Ï   ó   z_HS256.__init__©
r.   r/   r0   r%   r'   r(   r)   r*   ra   Ú__classcell__r!   r!   rŽ   r$   r†   Ç   ó    r†   c                       r…   )Ú_HS384ÚHS384zHMAC using SHA-384é€  r‰   rŠ   c                    r‹   rO   )rŒ   r”   ra   r	   ÚSHA384r"   rŽ   r!   r$   ra   Û   r�   z_HS384.__init__r‘   r!   r!   rŽ   r$   r”   Ó   r“   r”   c                       r…   )Ú_HS512ÚHS512zHMAC using SHA-512é   r‰   rŠ   c                    r‹   rO   )rŒ   r˜   ra   r	   ÚSHA512r"   rŽ   r!   r$   ra   ç   r�   z_HS512.__init__r‘   r!   r!   rŽ   r$   r˜   ß   r“   r˜   c                       r…   )Ú_RS256ÚRS256zRSASSA-PKCS1-v1_5 using SHA-256é   r‰   rŠ   c                    ó   t t| ƒ t ¡ t ¡ ¡ d S rO   )rŒ   rœ   ra   r   ÚPKCS1v15r	   r�   r"   rŽ   r!   r$   ra   ó   ó   z_RS256.__init__r‘   r!   r!   rŽ   r$   rœ   ë   r“   rœ   c                       r…   )Ú_RS384ÚRS384zRSASSA-PKCS1-v1_5 using SHA-384rž   r‰   rŠ   c                    rŸ   rO   )rŒ   r¢   ra   r   r    r	   r—   r"   rŽ   r!   r$   ra   ÿ   r¡   z_RS384.__init__r‘   r!   r!   rŽ   r$   r¢   ÷   r“   r¢   c                       r…   )Ú_RS512ÚRS512zRSASSA-PKCS1-v1_5 using SHA-512rž   r‰   rŠ   c                    rŸ   rO   )rŒ   r¤   ra   r   r    r	   r›   r"   rŽ   r!   r$   ra     r¡   z_RS512.__init__r‘   r!   r!   rŽ   r$   r¤     r“   r¤   c                       r…   )Ú_ES256ÚES256zECDSA using P-256 and SHA-256rˆ   r‰   rŠ   c                    ó   t t| ƒ dt ¡ ¡ d S )NzP-256)rŒ   r¦   ra   r	   r�   r"   rŽ   r!   r$   ra     ó   z_ES256.__init__r‘   r!   r!   rŽ   r$   r¦     r“   r¦   c                       r…   )Ú_ES256KÚES256Kz'ECDSA using secp256k1 curve and SHA-256rˆ   r‰   rŠ   c                    r¨   )NÚ	secp256k1)rŒ   rª   ra   r	   r�   r"   rŽ   r!   r$   ra   #  r©   z_ES256K.__init__r‘   r!   r!   rŽ   r$   rª     r“   rª   c                       r…   )Ú_ES384ÚES384zECDSA using P-384 and SHA-384r–   r‰   rŠ   c                    r¨   )NzP-384)rŒ   r­   ra   r	   r—   r"   rŽ   r!   r$   ra   /  r©   z_ES384.__init__r‘   r!   r!   rŽ   r$   r­   '  r“   r­   c                       r…   )Ú_ES512ÚES512zECDSA using P-521 and SHA-512rš   r‰   rŠ   c                    r¨   )NzP-521)rŒ   r¯   ra   r	   r›   r"   rŽ   r!   r$   ra   ;  r©   z_ES512.__init__r‘   r!   r!   rŽ   r$   r¯   3  r“   r¯   c                       r…   )Ú_PS256ÚPS256z.RSASSA-PSS using SHA-256 and MGF1 with SHA-256rž   r‰   rŠ   c                    ó4   t  t  t ¡ ¡tjj¡}tt| ƒ |t ¡ ¡ d S rO   )	r   ÚPSSÚMGF1r	   r�   Údigest_sizerŒ   r±   ra   ©r#   rp   rŽ   r!   r$   ra   G  ó   ÿz_PS256.__init__r‘   r!   r!   rŽ   r$   r±   ?  r“   r±   c                       r…   )Ú_PS384ÚPS384z.RSASSA-PSS using SHA-384 and MGF1 with SHA-384rž   r‰   rŠ   c                    r³   rO   )	r   r´   rµ   r	   r—   r¶   rŒ   r¹   ra   r·   rŽ   r!   r$   ra   U  r¸   z_PS384.__init__r‘   r!   r!   rŽ   r$   r¹   M  r“   r¹   c                       r…   )Ú_PS512ÚPS512z.RSASSA-PSS using SHA-512 and MGF1 with SHA-512rž   r‰   rŠ   c                    r³   rO   )	r   r´   rµ   r	   r›   r¶   rŒ   r»   ra   r·   rŽ   r!   r$   ra   c  r¸   z_PS512.__init__r‘   r!   r!   rŽ   r$   r»   [  r“   r»   c                   @   ó    e Zd ZdZdZdZdZdZdS )Ú_NoneÚnonez%No digital signature or MAC performedr   r‰   rŠ   N©r.   r/   r0   r%   r'   r(   r)   r*   r!   r!   r!   r$   r¾   i  ó    r¾   c                   @   rL   )Ú_RawKeyMgmtc                 C   rN   rO   rP   )r#   rS   ÚbitsizeÚcekÚheadersr!   r!   r$   Úwrapt  rV   z_RawKeyMgmt.wrapc                 C   rN   rO   rP   )r#   rS   rÃ   ÚekrÅ   r!   r!   r$   Úunwrapw  rV   z_RawKeyMgmt.unwrapN)r.   r/   r0   rÆ   rÈ   r!   r!   r!   r$   rÂ   r  r[   rÂ   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú_RSAc                 C   s
   || _ d S rO   )rp   r·   r!   r!   r$   ra   }  s   
z_RSA.__init__c                 C   ó0   t |tƒs	tdƒ‚|d dkrtd|d ƒ‚d S )Núkey is not a JWK objectrƒ   ÚRSA©Ú
isinstancer   r;   r   ©r#   rS   r!   r!   r$   Ú
_check_key€  ó
   
ÿz_RSA._check_keyc                 C   s8   |   |¡ |st|ƒ}| d¡}| || j¡}||dœS )NÚwrapKey©rÄ   rÇ   )rÐ   r>   ri   Úencryptrp   ©r#   rS   rÃ   rÄ   rÅ   ÚrkrÇ   r!   r!   r$   rÆ   ‡  s   


z	_RSA.wrapc                 C   s@   |   |¡ | d¡}| || j¡}t|ƒ|krt|t|ƒƒ‚|S )NÚ	unwrapKey)rÐ   ri   Údecryptrp   r8   r   ©r#   rS   rÃ   rÇ   rÅ   rÖ   rÄ   r!   r!   r$   rÈ   �  s   

z_RSA.unwrapN)r.   r/   r0   ra   rÐ   rÆ   rÈ   r!   r!   r!   r$   rÉ   {  s
    rÉ   c                       s<   e Zd ZdZdZdZdZdZ‡ fdd„Z‡ fdd	„Z	‡  Z
S )
Ú_Rsa15ÚRSA1_5zRSAES-PKCS1-v1_5rž   r‰   Úkexc                    r‹   rO   )rŒ   rÚ   ra   r   r    r"   rŽ   r!   r$   ra      r�   z_Rsa15.__init__c                    sH   |   |¡ t|ƒ}ztt| ƒ ||||¡}tdƒ‚ ty#   | Y S w )NÚDummy)rÐ   r>   rŒ   rÚ   rÈ   r;   Ú	Exception©r#   rS   rÃ   rÇ   rÅ   rÄ   rŽ   r!   r$   rÈ   £  s   
ÿz_Rsa15.unwrap)r.   r/   r0   r%   r'   r(   r)   r*   ra   rÈ   r’   r!   r!   rŽ   r$   rÚ   ˜  s    rÚ   c                       r…   )Ú_RsaOaepúRSA-OAEPz#RSAES OAEP using default parametersrž   r‰   rÜ   c                    ó,   t t| ƒ t t t ¡ ¡t ¡ d ¡¡ d S rO   )rŒ   rà   ra   r   ÚOAEPrµ   r	   ÚSHA1r"   rŽ   r!   r$   ra   ½  ó
   
ÿÿz_RsaOaep.__init__r‘   r!   r!   rŽ   r$   rà   µ  r“   rà   c                       r…   )Ú_RsaOaep256úRSA-OAEP-256z.RSAES OAEP using SHA-256 and MGF1 with SHA-256rž   r‰   rÜ   c                    râ   rO   )rŒ   ræ   ra   r   rã   rµ   r	   r�   r"   rŽ   r!   r$   ra   Ë  rå   z_RsaOaep256.__init__r‘   r!   r!   rŽ   r$   ræ   Ã  r“   ræ   c                   @   r\   )
Ú_AesKwNc                 C   ó   t ƒ | _d S rO   ©r   r^   r"   r!   r!   r$   ra   Õ  r9   z_AesKw.__init__c                 C   ó\   t |tƒs	tdƒ‚|d dkrtd|d ƒ‚t| |¡ƒ}t|ƒ| jkr,t| jt|ƒƒ‚|S ©NrË   rƒ   r„   ©	rÎ   r   r;   r   r   ri   r8   r(   r   ©r#   rS   ÚoprÖ   r!   r!   r$   Ú_get_keyØ  ó   
z_AesKw._get_keyc                 C   s0   |   |d¡}|st|ƒ}t||tƒ ƒ}||dœS )NrÔ   rÓ   )rð   r>   r   r   rÕ   r!   r!   r$   rÆ   â  s
   
z_AesKw.wrapc                 C   s8   |   |d¡}t||tƒ ƒ}t|ƒ|krt|t|ƒƒ‚|S )NrØ   )rð   r   r   r8   r   rÙ   r!   r!   r$   rÈ   ë  s
   z_AesKw.unwrap©r.   r/   r0   r(   ra   rð   rÆ   rÈ   r!   r!   r!   r$   rè   Ñ  s    
	rè   c                   @   r½   )Ú_A128KWÚA128KWzAES Key Wrap using 128-bit keyé€   r‰   rÜ   NrÀ   r!   r!   r!   r$   ró   ô  rÁ   ró   c                   @   r½   )Ú_A192KWÚA192KWzAES Key Wrap using 192-bit keyéÀ   r‰   rÜ   NrÀ   r!   r!   r!   r$   rö   ý  rÁ   rö   c                   @   r½   )Ú_A256KWÚA256KWzAES Key Wrap using 256-bit keyrˆ   r‰   rÜ   NrÀ   r!   r!   r!   r$   rù     rÁ   rù   c                   @   r\   )
Ú	_AesGcmKwNc                 C   ré   rO   rê   r"   r!   r!   r$   ra     r9   z_AesGcmKw.__init__c                 C   rë   rì   rí   rî   r!   r!   r$   rð     rñ   z_AesGcmKw._get_keyc                 C   sv   |   |d¡}|st|ƒ}tdƒ}tt |¡t |¡| jd�}| ¡ }| 	|¡| 
¡  }	|j}
||	t|ƒt|
ƒdœdœS )NrÔ   é`   rb   )ÚivÚtag)rÄ   rÇ   Úheader)rð   r>   r   r   ÚAESr   ÚGCMr^   Ú	encryptorre   rj   rþ   r   )r#   rS   rÃ   rÄ   rÅ   rÖ   rý   Úcipherr  rÇ   rþ   r!   r!   r$   rÆ      s   ÿÿÿz_AesGcmKw.wrapc                 C   sš   |   |d¡}d|vrtdƒ‚t|d ƒ}d|vrtdƒ‚t|d ƒ}tt |¡t ||¡| jd�}| 	¡ }	|	 
|¡|	 ¡  }
t|
ƒ|krKt|t|
ƒƒ‚|
S )NrØ   rý   z&Invalid Header, missing "iv" parameterrþ   z'Invalid Header, missing "tag" parameterrb   )rð   r;   r   r   r   r   r   r  r^   Ú	decryptorre   rj   r8   r   )r#   rS   rÃ   rÇ   rÅ   rÖ   rý   rþ   r  r  rÄ   r!   r!   r$   rÈ   0  s   ÿz_AesGcmKw.unwraprò   r!   r!   r!   r$   rû     s    
rû   c                   @   r½   )Ú
_A128GcmKwÚ	A128GCMKWz+Key wrapping with AES GCM using 128-bit keyrõ   r‰   rÜ   NrÀ   r!   r!   r!   r$   r  C  rÁ   r  c                   @   r½   )Ú
_A192GcmKwÚ	A192GCMKWz+Key wrapping with AES GCM using 192-bit keyrø   r‰   rÜ   NrÀ   r!   r!   r!   r$   r  L  rÁ   r  c                   @   r½   )Ú
_A256GcmKwÚ	A256GCMKWz+Key wrapping with AES GCM using 256-bit keyrˆ   r‰   rÜ   NrÀ   r!   r!   r!   r$   r	  U  rÁ   r	  c                   @   s8   e Zd ZdZdZdZdd„ Zdd„ Zdd„ Zdd	„ Z	dS )
Ú_Pbes2HsAesKwNc                 C   ó   t ƒ | _tttdœ| _d S ©N)rõ   rø   rˆ   ©r   r^   ró   rö   rù   Úaeskwmapr"   r!   r!   r$   ra   d  ó   z_Pbes2HsAesKw.__init__c           
      C   sò   |t krtdƒ‚t|tƒst|tƒr|}n| d¡}nt| ¡ ƒ}t| j d¡ƒd | }| j	dkr7t
 ¡ }n| j	dkrAt
 ¡ }n| j	dkrKt
 ¡ }ntdƒ‚t|t| jƒ||| jd�}| |¡}	t|	ƒ| jkrpt| jt|	ƒƒ‚td	d
t|	ƒd�S )NzInvalid p2c value, too largeÚutf8ó    rˆ   r–   rš   zUnknown Hash Size)Ú	algorithmÚlengthÚsaltÚ
iterationsr^   r„   Úenc©rƒ   ÚuseÚk)Údefault_max_pbkdf2_iterationsr;   rÎ   r   ÚbytesÚencoder   ri   r%   Úhashsizer	   r�   r—   r›   r   r:   r(   r^   Úderiver8   r   r5   r   )
r#   r‰   rS   Úp2sÚp2cÚplainr  ÚhashalgÚkdfrÖ   r!   r!   r$   rð   h  s,   







ÿ
z_Pbes2HsAesKw._get_keyc                 C   sª   i }d|v rt |d ƒ}t|ƒdk rtdƒ‚n
tdƒ}t|ƒ|d< d|v r*|d }nd}||d< |  |d |||¡}| j| j ƒ }	|	 ||||¡}
t|ƒdkrS||
d	< |
S )
Nr   r4   z'Invalid Salt, must be 8 or more octectsrõ   r!  i    r‰   r   rÿ   )	r   r5   r;   r>   r   rð   r  r(   rÆ   )r#   rS   rÃ   rÄ   rÅ   Ú
ret_headerr   r!  ÚkekÚaeskwÚretr!   r!   r$   rÆ   ‡  s$   ÿ
z_Pbes2HsAesKw.wrapc           	      C   sf   d|vrt dƒ‚d|vrt dƒ‚t|d ƒ}|d }|  |d |||¡}| j| j ƒ }| ||||¡S )Nr   z'Invalid Header, missing "p2s" parameterr!  z'Invalid Header, missing "p2c" parameterr‰   )r;   r   rð   r  r(   rÈ   )	r#   rS   rÃ   rÇ   rÅ   r   r!  r&  r'  r!   r!   r$   rÈ   �  s   z_Pbes2HsAesKw.unwrap)
r.   r/   r0   r%   r(   r  ra   rð   rÆ   rÈ   r!   r!   r!   r$   r  ^  s    r  c                   @   ó$   e Zd ZdZdZdZdZdZdZdS )Ú_Pbes2Hs256A128KwúPBES2-HS256+A128KWz-PBES2 with HMAC SHA-256 and "A128KW" wrappingrõ   r‰   rÜ   rˆ   N©	r.   r/   r0   r%   r'   r(   r)   r*   r  r!   r!   r!   r$   r*  ª  ó    r*  c                   @   r)  )Ú_Pbes2Hs384A192KwúPBES2-HS384+A192KWz-PBES2 with HMAC SHA-384 and "A192KW" wrappingrø   r‰   rÜ   r–   Nr,  r!   r!   r!   r$   r.  ´  r-  r.  c                   @   r)  )Ú_Pbes2Hs512A256KwúPBES2-HS512+A256KWz-PBES2 with HMAC SHA-512 and "A256KW" wrappingrˆ   r‰   rÜ   rš   Nr,  r!   r!   r!   r$   r0  ¾  r-  r0  c                   @   s8   e Zd ZdZdZdZdZdZdd„ Zdd	„ Z	d
d„ Z
dS )Ú_DirectÚdirz$Direct use of a shared symmetric keyrõ   r‰   rÜ   c                 C   rÊ   rì   rÍ   rÏ   r!   r!   r$   rÐ   Ð  rÑ   z_Direct._check_keyc                 C   sF   |   |¡ |r|d fS t| d¡ƒ}t|ƒ|krt|t|ƒƒ‚d|iS )NrÔ   rÄ   )rÐ   r   ri   r8   r   )r#   rS   rÃ   rÄ   rÅ   r  r!   r!   r$   rÆ   Ö  s   
z_Direct.wrapc                 C   sF   |   |¡ |dkrtdƒ‚t| d¡ƒ}t|ƒ|kr!t|t|ƒƒ‚|S )Nó    zInvalid Encryption Key.rØ   )rÐ   r;   r   ri   r8   r   rß   r!   r!   r$   rÈ   ß  s   
z_Direct.unwrapN)r.   r/   r0   r%   r'   r(   r)   r*   rÐ   rÆ   rÈ   r!   r!   r!   r$   r2  È  s    	r2  c                   @   sH   e Zd ZdZdZdZdZdZdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ ZdS )Ú_EcdhEsúECDH-ESzECDH-ES using Concat KDFr‰   rÜ   Nc                 C   r  r  r  r"   r!   r!   r$   ra   ñ  r  z_EcdhEs.__init__c                 C   sZ   t |tƒs	tdƒ‚|d dvrtd|d ƒ‚|d dkr)|d dvr+td|d ƒ‚d S d S )	NrË   rƒ   )ÚECÚOKPz	EC or OKPr8  Úcrv)ÚX25519ÚX448zX25519 or X448rÍ   rÏ   r!   r!   r$   rÐ   õ  s   
ÿþz_EcdhEs._check_keyc                 C   sæ   t  dt|ƒ¡}|t| d¡ƒ7 }d|v rt|d ƒnd}|t  dt|ƒ¡7 }||7 }d|v r5t|d ƒnd}|t  dt|ƒ¡7 }||7 }|t  d|¡7 }t|tjƒr\| 	t 
¡ |¡}	n| 	|¡}	tt ¡ t|ƒ|| jd�}
|
 |	¡S )Nz>Ir  Úapur4  Úapv)r  r  Ú	otherinfor^   )ÚstructÚpackr5   r  r  r   rÎ   r   ÚEllipticCurvePrivateKeyÚexchangeÚECDHr   r	   r�   r:   r^   r  )r#   ÚprivkeyÚpubkeyr‰   rÃ   rÅ   r>  r<  r=  Ú
shared_keyÚckdfr!   r!   r$   Ú_deriveÿ  s$   
ý
z_EcdhEs._derivec                 C   sÐ   |   |¡ | j}| jd u r|d urtdƒ‚|d }|}n|d }tj|d |d d�}|  | d¡| d¡|||¡}| jd u rDd	|i}	n| j| j ƒ }
td
dt|ƒd�}|
 	||||¡}	dt
| ¡ ƒi|	d< |	S )Nz"ECDH-ES cannot use an existing CEKr  r‰   rƒ   r9  )rƒ   r9  r×   rÒ   rÄ   r„   r  Úepkrÿ   )rÐ   r(   r   r   ÚgeneraterH  ri   r  r   rÆ   r   Úexport_public)r#   rS   rÃ   rÄ   rÅ   Údk_sizer‰   rI  Údkr(  r'  r&  r!   r!   r$   rÆ   "  s(   

þ

z_EcdhEs.wrapc                 C   s²   d|vrt dƒ‚|  |¡ | j}| jd u r|d }|}n|d }td	i |d ¤Ž}|  | d¡| d¡|||¡}| jd u r?|S | j| j ƒ }	tddt|ƒd�}
|	 |
|||¡}|S )
NrI  z'Invalid Header, missing "epk" parameterr  r‰   r×   rÒ   r„   r  r!   )	r;   rÐ   r(   r   rH  ri   r  r   rÈ   )r#   rS   rÃ   rÇ   rÅ   rL  r‰   rI  rM  r'  r&  rÄ   r!   r!   r$   rÈ   <  s&   

þ
z_EcdhEs.unwrap)r.   r/   r0   r%   r'   r)   r*   r(   ra   rÐ   rH  rÆ   rÈ   r!   r!   r!   r$   r5  é  s    
#r5  c                   @   r½   )Ú_EcdhEsAes128KwúECDH-ES+A128KWz.ECDH-ES using Concat KDF and "A128KW" wrappingrõ   r‰   rÜ   NrÀ   r!   r!   r!   r$   rN  T  rÁ   rN  c                   @   r½   )Ú_EcdhEsAes192KwúECDH-ES+A192KWz.ECDH-ES using Concat KDF and "A192KW" wrappingrø   r‰   rÜ   NrÀ   r!   r!   r!   r$   rP  ]  rÁ   rP  c                   @   r½   )Ú_EcdhEsAes256KwúECDH-ES+A256KWz.ECDH-ES using Concat KDF and "A256KW" wrappingrˆ   r‰   rÜ   NrÀ   r!   r!   r!   r$   rR  f  rÁ   rR  c                   @   ó0   e Zd ZdZdZdZdZdZdd„ Zdd	„ Z	dS )
Ú_EdDsaÚEdDSAz'EdDSA using Ed25519 or Ed448 algorithmsr‰   rŠ   Nc                 C   s$   |d dv r|  d¡}| |¡S t‚)Nr9  ©ÚEd25519ÚEd448rU   )ri   rU   rQ   rr   r!   r!   r$   rU   w  s   

z_EdDsa.signc                 C   s&   |d dv r|  d¡}| ||¡S t‚)Nr9  rW  rY   )ri   rY   rQ   rs   r!   r!   r$   rY   }  s   
z_EdDsa.verify©
r.   r/   r0   r%   r'   r)   r*   r(   rU   rY   r!   r!   r!   r$   rU  o  ó    rU  c                   @   rT  )
Ú_Ed25519rX  zEdDSA using Ed25519r‰   rŠ   Nc                 C   ó.   |d dkrt d|d ƒ‚| d¡}| |¡S )Nr9  rX  rU   ©r   ri   rU   rr   r!   r!   r$   rU   Œ  ó   

z_Ed25519.signc                 C   ó0   |d dkrt d|d ƒ‚| d¡}| ||¡S )Nr9  rX  rY   ©r   ri   rY   rs   r!   r!   r$   rY   ’  ó   
z_Ed25519.verifyrZ  r!   r!   r!   r$   r\  „  r[  r\  c                   @   rT  )
Ú_Ed448rY  zEdDSA using Ed448r‰   rŠ   Nc                 C   r]  )Nr9  rY  rU   r^  rr   r!   r!   r$   rU   ¡  r_  z_Ed448.signc                 C   r`  )Nr9  rY  rY   ra  rs   r!   r!   r$   rY   §  rb  z_Ed448.verifyrZ  r!   r!   r!   r$   rc  ™  r[  rc  c                   @   rL   )Ú_RawJWEc                 C   rN   rO   rP   )r#   r  ÚaadÚmr!   r!   r$   rÔ   °  rV   z_RawJWE.encryptc                 C   rN   rO   rP   )r#   r  re  rý   rF   Útr!   r!   r$   rØ   ³  rV   z_RawJWE.decryptN)r.   r/   r0   rÔ   rØ   r!   r!   r!   r$   rd  ®  r[   rd  c                   @   r\   )
Ú_AesCbcHmacSha2Nc                 C   s(   t ƒ | _|| _tjj| _| jd | _d S )Nr@   )	r   r^   r_   r   r   Ú
block_sizeÚ	blocksizer(   r+   r`   r!   r!   r$   ra   »  s   
z_AesCbcHmacSha2.__init__c                 C   sd   t t|ƒdƒ}tj|| j| jd�}| |¡ | |¡ | |¡ | |¡ | ¡ }|d t| j	ƒ… S )Né@   rb   )
rH   r8   r
   rd   r_   r^   re   rj   r:   r(   )r#   r  re  rý   rF   Úalrf   rf  r!   r!   r$   Ú_macÁ  s   



z_AesCbcHmacSha2._macc                 C   s¸   t |ƒt| jƒkrtdƒ‚|dt| jƒ… }|t| jƒd… }t| jƒ}tt 	|¡t
 |¡| jd�}| ¡ }t| jƒ ¡ }	|	 |¡|	 ¡  }
| |
¡| ¡  }|  ||||¡}|||fS )úü Encrypt according to the selected encryption and hashing
        functions.

        :param k: Encryption key
        :param aad: Additional Authentication Data
        :param m: Plaintext

        Returns a dictionary with the computed data.
        úInvalid input key sizeNrb   )r5   r:   r+   r;   r(   r>   rj  r   r   r   r   ÚCBCr^   r  r   Úpadderre   rj   rm  )r#   r  re  rf  ÚhkeyÚekeyrý   r  r  rq  Úpadded_datarF   rg  r!   r!   r$   rÔ   Ì  s   

ÿ
z_AesCbcHmacSha2.encryptc              	   C   s´   t |ƒt| jƒkrtdƒ‚|dt| jƒ… }|t| jƒd… }t ||  ||||¡¡s/tdƒ‚t	t
 |¡t |¡| jd�}| ¡ }	|	 |¡|	 ¡  }
t| jƒ ¡ }| |
¡| ¡  S )áA   Decrypt according to the selected encryption and hashing
        functions.
        :param k: Encryption key
        :param aad: Additional Authenticated Data
        :param iv: Initialization Vector
        :param e: Ciphertext
        :param t: Authentication Tag

        Returns plaintext or raises an error
        ro  NzFailed to verify MACrb   )r5   r:   r+   r;   r(   r   Úbytes_eqrm  r   r   r   r   r   rp  r^   r  re   rj   r   rj  Úunpadder)r#   r  re  rý   rF   rg  rr  Údkeyr  r  Údrw  r!   r!   r$   rØ   ê  s   ÿz_AesCbcHmacSha2.decrypt)r.   r/   r0   r(   ra   rm  rÔ   rØ   r!   r!   r!   r$   rh  ·  s    rh  c                       ó0   e Zd ZdZdZdZdZdZ‡ fdd„Z‡  Z	S )Ú_A128CbcHs256úA128CBC-HS256z&AES_128_CBC_HMAC_SHA_256 authenticatedrõ   r  c                    r‹   rO   )rŒ   r{  ra   r	   r�   r"   rŽ   r!   r$   ra     r�   z_A128CbcHs256.__init__r‘   r!   r!   rŽ   r$   r{    r“   r{  c                       rz  )Ú_A192CbcHs384úA192CBC-HS384z&AES_192_CBC_HMAC_SHA_384 authenticatedrø   r  c                    r‹   rO   )rŒ   r}  ra   r	   r—   r"   rŽ   r!   r$   ra     r�   z_A192CbcHs384.__init__r‘   r!   r!   rŽ   r$   r}    r“   r}  c                       rz  )Ú_A256CbcHs512úA256CBC-HS512z&AES_256_CBC_HMAC_SHA_512 authenticatedrˆ   r  c                    r‹   rO   )rŒ   r  ra   r	   r›   r"   rŽ   r!   r$   ra   (  r�   z_A256CbcHs512.__init__r‘   r!   r!   rŽ   r$   r     r“   r  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )Ú_AesGcmNc                 C   s   t ƒ | _| j| _d S rO   )r   r^   r(   r+   r"   r!   r!   r$   ra   0  s   z_AesGcm.__init__c                 C   sT   t dƒ}tt |¡t |¡| jd�}| ¡ }| |¡ | 	|¡| 
¡  }|||jfS )rn  rü   rb   )r>   r   r   r   r   r  r^   r  Úauthenticate_additional_datare   rj   rþ   )r#   r  re  rf  rý   r  r  rF   r!   r!   r$   rÔ   5  s   
ÿ
z_AesGcm.encryptc                 C   sB   t t |¡t ||¡| jd�}| ¡ }| |¡ | |¡| 	¡  S )ru  rb   )
r   r   r   r   r  r^   r  r‚  re   rj   )r#   r  re  rý   rF   rg  r  r  r!   r!   r$   rØ   H  s   ÿ
z_AesGcm.decrypt)r.   r/   r0   r(   ra   rÔ   rØ   r!   r!   r!   r$   r�  ,  s
    r�  c                   @   ó    e Zd ZdZdZdZdZdZdS )Ú_A128GcmÚA128GCMzAES GCM using 128-bit keyrõ   r  NrÀ   r!   r!   r!   r$   r„  Z  rÁ   r„  c                   @   rƒ  )Ú_A192GcmÚA192GCMzAES GCM using 192-bit keyrø   r  NrÀ   r!   r!   r!   r$   r†  c  rÁ   r†  c                   @   rƒ  )Ú_A256GcmÚA256GCMzAES GCM using 256-bit keyrˆ   r  NrÀ   r!   r!   r!   r$   rˆ  l  rÁ   rˆ  c                       r…   )Ú_BP256R1ÚBP256R1zsECDSA using Brainpool256R1 curve and SHA-256 (unregistered, custom-defined in breach of IETF rules by gematik GmbH)rˆ   r‰   rŠ   c                    r¨   )NzBP-256)rŒ   rŠ  ra   r	   r�   r"   rŽ   r!   r$   ra   �  r©   z_BP256R1.__init__r‘   r!   r!   rŽ   r$   rŠ  u  ó    ÿrŠ  c                       r…   )Ú_BP384R1ÚBP384R1zsECDSA using Brainpool384R1 curve and SHA-384 (unregistered, custom-defined in breach of IETF rules by gematik GmbH)r–   r‰   rŠ   c                    r¨   )NzBP-384)rŒ   r�  ra   r	   r—   r"   rŽ   r!   r$   ra   ‘  r©   z_BP384R1.__init__r‘   r!   r!   rŽ   r$   r�  …  rŒ  r�  c                       r…   )Ú_BP512R1ÚBP512R1zsECDSA using Brainpool512R1 curve and SHA-512 (unregistered, custom-defined in breach of IETF rules by gematik GmbH)rš   r‰   rŠ   c                    r¨   )NzBP-512)rŒ   r�  ra   r	   r›   r"   rŽ   r!   r$   ra   ¡  r©   z_BP512R1.__init__r‘   r!   r!   rŽ   r$   r�  •  rŒ  r�  c                   @   s.  e Zd ZdZi de“de“de“de“de“de	“de
“d	e“d
e“de“de“de“de“de“de“de“de“i de“de“de“de“de“de“de“de“de“de“de“de “de!“d e"“d!e#“d"e$“d#e%“¥e&e'e(e)e*e+e,e-e.d$œ	¥Z/e0d.d&d'„ƒZ1e0d(d)„ ƒZ2e0d*d+„ ƒZ3e0d,d-„ ƒZ4d%S )/ÚJWAzSJWA Signing Algorithms.

    This class provides access to all JWA algorithms.
    r‡   r•   r™   r�   r£   r¥   r§   r«   r®   r°   r²   rº   r¼   r¿   rÛ   rá   rç   rô   r÷   rú   r3  r6  rO  rQ  rS  rV  r  r  r
  r+  r/  r1  r|  r~  )	r€  r…  r‡  r‰  r‹  rŽ  r�  rX  rY  Nc                 C   s&   | j | }|d ur|j|krt‚|ƒ S rO   )Úalgorithms_registryr*   ÚKeyError)Úclsr%   r  r‰   r!   r!   r$   Úinstantiate_algÙ  s   
zJWA.instantiate_algc                 C   ó.   z| j |dd�W S  ty   td| ƒd ‚w )NrŠ   ©r  z(%s is not a valid Signing algorithm name©r•  r“  r   ©r”  r%   r!   r!   r$   Úsigning_algà  ó   ÿÿÿzJWA.signing_algc                 C   r–  )NrÜ   r—  z/%s is not a valid Key Management algorithm namer˜  r™  r!   r!   r$   Úkeymgmt_algè  r›  zJWA.keymgmt_algc                 C   r–  )Nr  r—  z+%s is not a valid Encryption algorithm namer˜  r™  r!   r!   r$   Úencryption_algð  r›  zJWA.encryption_algrO   )5r.   r/   r0   Ú__doc__r†   r”   r˜   rœ   r¢   r¤   r¦   rª   r­   r¯   r±   r¹   r»   r¾   rÚ   rà   ræ   ró   rö   rù   r2  r5  rN  rP  rR  rU  r  r  r	  r*  r.  r0  r{  r}  r  r„  r†  rˆ  rŠ  r�  r�  r\  rc  r’  Úclassmethodr•  rš  rœ  r�  r!   r!   r!   r$   r‘  ¥  s²    ÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Õ.

r‘  )nr<   r?  Úabcr   r   Úbinasciir   r   Úcryptography.exceptionsr   Úcryptography.hazmat.backendsr   Úcryptography.hazmat.primitivesr   r	   r
   Ú)cryptography.hazmat.primitives.asymmetricr   r   r   rz   Ú&cryptography.hazmat.primitives.ciphersr   r   r   Ú,cryptography.hazmat.primitives.kdf.concatkdfr   Ú)cryptography.hazmat.primitives.kdf.pbkdf2r   Ú&cryptography.hazmat.primitives.keywrapr   r   Ú&cryptography.hazmat.primitives.paddingr   Újwcrypto.commonr   r   r   r   r   r   r   r   Újwcrypto.jwkr   r  rc   r   r8   r:   r>   rH   rK   rM   r]   rn   ru   r�   r†   r”   r˜   rœ   r¢   r¤   r¦   rª   r­   r¯   r±   r¹   r»   r¾   rÂ   rÉ   rÚ   rà   ræ   rè   ró   rö   rù   rû   r  r  r	  r  r*  r.  r0  r2  r5  rN  rP  rR  rU  r\  rc  rd  rh  r{  r}  r  r�  r„  r†  rˆ  rŠ  r�  r�  r‘  r!   r!   r!   r$   Ú<module>   s´   
$	
		#			4			L


!k				Q.			