
    ʏes                     h   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- G d de      Z.d Z/d Z0d Z1d Z2d Z3 G d  d!      Z4 G d" d#e4      Z5 G d$ d%e4      Z6 G d& d'e4      Z7 G d( d)e4      Z8 G d* d+e5e.      Z9 G d, d-e5e.      Z: G d. d/e5e.      Z; G d0 d1e6e.      Z< G d2 d3e6e.      Z= G d4 d5e6e.      Z> G d6 d7e7e.      Z? G d8 d9e7e.      Z@ G d: d;e7e.      ZA G d< d=e7e.      ZB G d> d?e6e.      ZC G d@ dAe6e.      ZD G dB dCe6e.      ZE G dD dEe8e.      ZF G dF dG      ZG G dH dIeG      ZH G dJ dKeHe.      ZI G dL dMeHe.      ZJ G dN dOeHe.      ZK G dP dQeG      ZL G dR dSeLe.      ZM G dT dUeLe.      ZN G dV dWeLe.      ZO G dX dYeG      ZP G dZ d[ePe.      ZQ G d\ d]ePe.      ZR G d^ d_ePe.      ZS G d` daeG      ZT G db dceTe.      ZU G dd deeTe.      ZV G df dgeTe.      ZW G dh dieGe.      ZX G dj dkeGe.      ZY G dl dmeY      ZZ G dn doeY      Z[ G dp dqeY      Z\ G dr dse4e.      Z] G dt du      Z^ G dv dwe^      Z_ G dx dye_e.      Z` G dz d{e_e.      Za G d| d}e_e.      Zb G d~ de^      Zc G d dece.      Zd G d dece.      Ze G d dece.      Zf G d de7e.      Zg G d de7e.      Zh G d de7e.      Zi G d d      Zjy)    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 @  c                       e Zd Zeed               Zeed               Zeed               Zeed               Zeed               Z	ed        Z
y)JWAAlgorithmc                      y)zThe algorithm NameN selfs    ./usr/lib/python3/dist-packages/jwcrypto/jwa.pynamezJWAAlgorithm.name$           c                      y)zA short descriptionNr#   r$   s    r&   descriptionzJWAAlgorithm.description)   r(   r)   c                      y)zThe algorithm key sizeNr#   r$   s    r&   keysizezJWAAlgorithm.keysize.   r(   r)   c                      y)zOne of 'alg', 'enc' or 'JWK'Nr#   r$   s    r&   algorithm_usage_locationz%JWAAlgorithm.algorithm_usage_location3   r(   r)   c                      y)zOne of 'sig', 'kex', 'enc'Nr#   r$   s    r&   algorithm_usezJWAAlgorithm.algorithm_use8   r(   r)   c                 R    	 | j                   S # t        $ r | j                  cY S w xY w)zThe input key size)wrap_key_sizeAttributeErrorr-   r$   s    r&   input_keysizezJWAAlgorithm.input_keysize=   s,    	 %%% 	 <<	 s    &&N)__name__
__module____qualname__propertyr   r'   r+   r-   r/   r1   r5   r#   r)   r&   r!   r!   "   s    !  ! "  " %  % +  + )  )    r)   r!   )	metaclassc                     t        |       dz  S N   )lenxs    r&   _bitsizerA   F   s    q6A:r)   c                     | dz  S r<   r#   r?   s    r&   _inbytesrC   J   s    6Mr)   c                 d    | dz  dk7  rt        d      t        j                  t        |             S )Nr=   r   zlength must be a multiple of 8)
ValueErrorosurandomrC   r?   s    r&   _randombitsrH   N   s,    1uz9::::hqk""r)   c                 v    dj                  |       }|dz   dz  dz  }t        |j                  |d      d |       S )Nz{:x}   r=      0)formatr   rjust)nbitseilens       r&   _encode_intrS   U   s?    aAAX!Oq DQWWT3'.//r)   c                 ,    t        t        |       d      S )N   )intr   )rO   s    r&   _decode_intrW   [   s    wqz2r)   c                       e Zd Zd Zd Zy)_RawJWSc                     t         NNotImplementedErrorr%   keypayloads      r&   signz_RawJWS.signa       !!r)   c                     t         r[   r\   r%   r_   r`   	signatures       r&   verifyz_RawJWS.verifyd   rb   r)   Nr6   r7   r8   ra   rf   r#   r)   r&   rY   rY   _       ""r)   rY   c                   $    e Zd Zd Zd Zd Zd Zy)_RawHMACc                 0    t               | _        || _        y r[   )r   backendhashfnr%   rm   s     r&   __init__z_RawHMAC.__init__j   s    &(r)   c                     t        j                  || j                  | j                        }|j	                  |       |S )Nrl   )r   HMACrm   rl   update)r%   r_   r`   hs       r&   _hmac_setupz_RawHMAC._hmac_setupn   s-    IIc4;;=	r)   c                 z    t        |j                  d            }| j                  ||      }|j                         S Nra   )r   
get_op_keyru   finalize)r%   r_   r`   skeyrt   s        r&   ra   z_RawHMAC.signs   s3    v 67T7+zz|r)   c                 ~    t        |j                  d            }| j                  ||      }|j                  |       y Nrf   )r   rx   ru   rf   )r%   r_   r`   re   vkeyrt   s         r&   rf   z_RawHMAC.verifyx   s3    x 89T7+	r)   N)r6   r7   r8   ro   ru   ra   rf   r#   r)   r&   rj   rj   h   s    

r)   rj   c                       e Zd Zd Zd Zd Zy)_RawRSAc                      || _         || _        y r[   )padfnrm   )r%   r   rm   s      r&   ro   z_RawRSA.__init__   s    
r)   c                 r    |j                  d      }|j                  || j                  | j                        S rw   )rx   ra   r   rm   r%   r_   r`   rz   s       r&   ra   z_RawRSA.sign   s+    ~~f%yy$**dkk::r)   c                 v    |j                  d      }|j                  ||| j                  | j                         y r|   )rx   rf   r   rm   r%   r_   r`   re   pkeys        r&   rf   z_RawRSA.verify   s*    ~~h'Iw

DKK@r)   N)r6   r7   r8   ro   ra   rf   r#   r)   r&   r   r   ~   s    ;Ar)   r   c                   .    e Zd Zd Zed        Zd Zd Zy)_RawECc                      || _         || _        y r[   )_curverm   )r%   curverm   s      r&   ro   z_RawEC.__init__   s    r)   c                     | j                   S r[   )r   r$   s    r&   r   z_RawEC.curve   s    {{r)   c                    |j                  d| j                        }|j                  }|j                  |t	        j
                  | j                              }t        j                  |      \  }}t        ||      t        ||      z   S rw   )
rx   r   key_sizera   r   ECDSArm   ec_utilsdecode_dss_signaturerS   )r%   r_   r`   rz   sizere   rss           r&   ra   z_RawEC.sign   si    ~~fdkk2}}IIgrxx'<=	,,Y711d#k!T&:::r)   c                 X   |j                  d| j                        }|d t        |      dz   }|t        |      dz  d  }t        j                  t        t        |      d      t        t        |      d            }|j                  ||t        j                  | j                               y )Nrf   rK   rU   )rx   r   r>   r   encode_dss_signaturerV   r   rf   r   r   rm   )r%   r_   r`   re   r   r   r   enc_signatures           r&   rf   z_RawEC.verify   s    ~~h4*s9~*+c)n)*+ 55
BWQZ!46M7BHHT[[,ABr)   N)r6   r7   r8   ro   r9   r   ra   rf   r#   r)   r&   r   r      s&      ;Cr)   r   c                       e Zd Zd Zd Zy)_RawNonec                      y)N r#   r^   s      r&   ra   z_RawNone.sign   s    r)   c                 P    |d   dk7  s|j                         dk7  rt        d      y )Nktyoctr   z'The "none" signature cannot be verified)rx   r   rd   s       r&   rf   z_RawNone.verify   s-    u:#.."2b"8"#LMM #9r)   Nrg   r#   r)   r&   r   r      s    Nr)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_HS256HS256zHMAC using SHA-256   algsigc                 P    t         t        |   t        j                                y r[   )superr   ro   r
   SHA256r%   	__class__s    r&   ro   z_HS256.__init__       fd$V]]_5r)   
r6   r7   r8   r'   r+   r-   r/   r1   ro   __classcell__r   s   @r&   r   r      '    D&KG$M6 6r)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_HS384HS384zHMAC using SHA-384  r   r   c                 P    t         t        |   t        j                                y r[   )r   r   ro   r
   SHA384r   s    r&   ro   z_HS384.__init__   r   r)   r   r   s   @r&   r   r      r   r)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_HS512HS512zHMAC using SHA-512   r   r   c                 P    t         t        |   t        j                                y r[   )r   r   ro   r
   SHA512r   s    r&   ro   z_HS512.__init__   r   r)   r   r   s   @r&   r   r      r   r)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_RS256RS256zRSASSA-PKCS1-v1_5 using SHA-256   r   r   c                 v    t         t        |   t        j                         t        j                                y r[   )r   r   ro   r   PKCS1v15r
   r   r   s    r&   ro   z_RS256.__init__   #    fd$W%5%5%7Ir)   r   r   s   @r&   r   r      )    D3KG$MJ Jr)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_RS384RS384zRSASSA-PKCS1-v1_5 using SHA-384r   r   r   c                 v    t         t        |   t        j                         t        j                                y r[   )r   r   ro   r   r   r
   r   r   s    r&   ro   z_RS384.__init__   r   r)   r   r   s   @r&   r   r      r   r)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_RS512RS512zRSASSA-PKCS1-v1_5 using SHA-512r   r   r   c                 v    t         t        |   t        j                         t        j                                y r[   )r   r   ro   r   r   r
   r   r   s    r&   ro   z_RS512.__init__   r   r)   r   r   s   @r&   r   r      r   r)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_ES256ES256zECDSA using P-256 and SHA-256r   r   r   c                 R    t         t        |   dt        j                                y )NzP-256)r   r   ro   r
   r   r   s    r&   ro   z_ES256.__init__       fd$Wfmmo>r)   r   r   s   @r&   r   r      '    D1KG$M? ?r)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_ES256KES256Kz'ECDSA using secp256k1 curve and SHA-256r   r   r   c                 R    t         t        |   dt        j                                y )N	secp256k1)r   r   ro   r
   r   r   s    r&   ro   z_ES256K.__init__  s    gt%k6==?Cr)   r   r   s   @r&   r   r     s)    D;KG$MD Dr)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_ES384ES384zECDSA using P-384 and SHA-384r   r   r   c                 R    t         t        |   dt        j                                y )NzP-384)r   r   ro   r
   r   r   s    r&   ro   z_ES384.__init__  r   r)   r   r   s   @r&   r   r     r   r)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_ES512ES512zECDSA using P-521 and SHA-512r   r   r   c                 R    t         t        |   dt        j                                y )NzP-521)r   r   ro   r
   r   r   s    r&   ro   z_ES512.__init__#  r   r)   r   r   s   @r&   r   r     r   r)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_PS256PS256z.RSASSA-PSS using SHA-256 and MGF1 with SHA-256r   r   r   c                     t        j                  t        j                  t        j                               t        j                  j
                        }t        t        | #  |t        j                                y r[   )	r   PSSMGF1r
   r   digest_sizer   r   ro   r%   r   r   s     r&   ro   z_PS256.__init__/  F    GLL9"MM557fd$UFMMO<r)   r   r   s   @r&   r   r   '  '    DBKG$M= =r)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_PS384PS384z.RSASSA-PSS using SHA-384 and MGF1 with SHA-384r   r   r   c                     t        j                  t        j                  t        j                               t        j                  j
                        }t        t        | #  |t        j                                y r[   )	r   r   r   r
   r   r   r   r   ro   r   s     r&   ro   z_PS384.__init__=  r   r)   r   r   s   @r&   r   r   5  r   r)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_PS512PS512z.RSASSA-PSS using SHA-512 and MGF1 with SHA-512r   r   r   c                     t        j                  t        j                  t        j                               t        j                  j
                        }t        t        | #  |t        j                                y r[   )	r   r   r   r
   r   r   r   r   ro   r   s     r&   ro   z_PS512.__init__K  r   r)   r   r   s   @r&   r   r   C  r   r)   r   c                        e Zd ZdZdZdZdZdZy)_Nonenonez%No digital signature or MAC performedr   r   r   Nr6   r7   r8   r'   r+   r-   r/   r1   r#   r)   r&   r   r   Q  s    D9KG$Mr)   r   c                       e Zd Zd Zd Zy)_RawKeyMgmtc                     t         r[   r\   )r%   r_   bitsizecekheaderss        r&   wrapz_RawKeyMgmt.wrap\  rb   r)   c                     t         r[   r\   )r%   r_   r   ekr   s        r&   unwrapz_RawKeyMgmt.unwrap_  rb   r)   N)r6   r7   r8   r   r   r#   r)   r&   r   r   Z  rh   r)   r   c                   $    e Zd Zd Zd Zd Zd Zy)_RSAc                     || _         y r[   )r   )r%   r   s     r&   ro   z_RSA.__init__e  s	    
r)   c                 h    t        |t              st        d      |d   dk7  rt        d|d         y )Nkey is not a JWK objectr   RSA
isinstancer   rE   r   r%   r_   s     r&   
_check_keyz_RSA._check_keyh  :    #s#677u:#E3u:66 r)   c                     | j                  |       |st        |      }|j                  d      }|j                  || j                        }||dS )NwrapKeyr   r   )r  rH   rx   encryptr   r%   r_   r   r   r   rkr   s          r&   r   z	_RSA.wrapo  sH    g&C^^I&ZZTZZ("%%r)   c                     | j                  |       |j                  d      }|j                  || j                        }t	        |      |k7  rt        |t	        |            |S )N	unwrapKey)r  rx   decryptr   rA   r   r%   r_   r   r   r   r  r   s          r&   r   z_RSA.unwrapw  sR    ^^K(jjTZZ(C=G#%gx}==
r)   N)r6   r7   r8   ro   r  r   r   r#   r)   r&   r   r   c  s    7&r)   r   c                   <     e Zd ZdZdZdZdZdZ fdZ fdZ	 xZ
S )_Rsa15RSA1_5zRSAES-PKCS1-v1_5r   r   kexc                 P    t         t        |   t        j                                y r[   )r   r  ro   r   r   r   s    r&   ro   z_Rsa15.__init__  s    fd$W%5%5%78r)   c                     | j                  |       t        |      }	 t        t        |   ||||      }t        d      # t        $ r |cY S w xY w)NDummy)r  rH   r   r  r   rE   	Exception)r%   r_   r   r   r   r   r   s         r&   r   z_Rsa15.unwrap  sX     '"	,S'2wGC W%% 	J	s   !A   AA)r6   r7   r8   r'   r+   r-   r/   r1   ro   r   r   r   s   @r&   r  r    s,    D$KG$M9 r)   r  c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_RsaOaepRSA-OAEPz#RSAES OAEP using default parametersr   r   r  c                     t         t        |   t        j                  t        j
                  t        j                               t        j                         d              y r[   )r   r  ro   r   OAEPr   r
   SHA1r   s    r&   ro   z_RsaOaep.__init__  s:    h&LLfkkm4.	/r)   r   r   s   @r&   r  r    s'    D7KG$M/ /r)   r  c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_RsaOaep256RSA-OAEP-256z.RSAES OAEP using SHA-256 and MGF1 with SHA-256r   r   r  c                     t         t        |   t        j                  t        j
                  t        j                               t        j                         d              y r[   )r   r"  ro   r   r  r   r
   r   r   s    r&   ro   z_RsaOaep256.__init__  s:    k4)LLfmmo6$0	1r)   r   r   s   @r&   r"  r"    s'    DBKG$M1 1r)   r"  c                   (    e Zd ZdZd Zd Zd Zd Zy)_AesKwNc                 "    t               | _        y r[   r   rl   r$   s    r&   ro   z_AesKw.__init__      &(r)   c                    t        |t              st        d      |d   dk7  rt        d|d         t	        |j                  |            }t        |      | j                  k7  rt        | j                  t        |            |S Nr  r   r   	r  r   rE   r   r   rx   rA   r-   r   r%   r_   opr  s       r&   _get_keyz_AesKw._get_key  r    #s#677u:#E3u:66cnnR01B<4<<'%dllHRLAA	r)   c                 t    | j                  |d      }|st        |      }t        ||t                     }||dS )Nr  r  )r/  rH   r   r   r  s          r&   r   z_AesKw.wrap  s;    ]]3	*g&C"c?#45"%%r)   c                     | j                  |d      }t        ||t                     }t        |      |k7  rt	        |t        |            |S )Nr  )r/  r   r   rA   r   r  s          r&   r   z_AesKw.unwrap  sE    ]]3	*R_%67C=G#%gx}==
r)   r6   r7   r8   r-   ro   r/  r   r   r#   r)   r&   r&  r&    s    G)&r)   r&  c                        e Zd ZdZdZdZdZdZy)_A128KWA128KWzAES Key Wrap using 128-bit key   r   r  Nr   r#   r)   r&   r5  r5        D2KG$Mr)   r5  c                        e Zd ZdZdZdZdZdZy)_A192KWA192KWzAES Key Wrap using 192-bit key   r   r  Nr   r#   r)   r&   r:  r:    r8  r)   r:  c                        e Zd ZdZdZdZdZdZy)_A256KWA256KWzAES Key Wrap using 256-bit keyr   r   r  Nr   r#   r)   r&   r>  r>    r8  r)   r>  c                   (    e Zd ZdZd Zd Zd Zd Zy)	_AesGcmKwNc                 "    t               | _        y r[   r(  r$   s    r&   ro   z_AesGcmKw.__init__  r)  r)   c                    t        |t              st        d      |d   dk7  rt        d|d         t	        |j                  |            }t        |      | j                  k7  rt        | j                  t        |            |S r+  r,  r-  s       r&   r/  z_AesGcmKw._get_key  r0  r)   c                    | j                  |d      }|st        |      }t        d      }t        t        j                  |      t        j                  |      | j                        }|j                         }|j                  |      |j                         z   }	|j                  }
||	t        |      t        |
      ddS )Nr  `   rq   )ivtag)r   r   header)r/  rH   r   r   AESr   GCMrl   	encryptorrs   ry   rG  r   )r%   r_   r   r   r   r  rF  cipherrK  r   rG  s              r&   r   z_AesGcmKw.wrap  s    ]]3	*g&C_
r*EIIbM $.$$&	c"Y%7%7%99mm"!1"!5"23"79: 	:r)   c                    | j                  |d      }d|vrt        d      t        |d         }d|vrt        d      t        |d         }t        t	        j
                  |      t        j                  ||      | j                        }|j                         }	|	j                  |      |	j                         z   }
t        |
      |k7  rt        |t        |
            |
S )Nr  rF  z&Invalid Header, missing "iv" parameterrG  z'Invalid Header, missing "tag" parameterrq   )r/  rE   r   r   r   rI  r   rJ  rl   	decryptorrs   ry   rA   r   )r%   r_   r   r   r   r  rF  rG  rL  rN  r   s              r&   r   z_AesGcmKw.unwrap  s    ]]3	*wEFFgdm,FGGwu~.
r*EIIb#,> $.$$&	r"Y%7%7%99C=G#%gx}==
r)   r3  r#   r)   r&   rA  rA    s    G): r)   rA  c                        e Zd ZdZdZdZdZdZy)
_A128GcmKw	A128GCMKWz+Key wrapping with AES GCM using 128-bit keyr7  r   r  Nr   r#   r)   r&   rP  rP  +      D?KG$Mr)   rP  c                        e Zd ZdZdZdZdZdZy)
_A192GcmKw	A192GCMKWz+Key wrapping with AES GCM using 192-bit keyr<  r   r  Nr   r#   r)   r&   rT  rT  4  rR  r)   rT  c                        e Zd ZdZdZdZdZdZy)
_A256GcmKw	A256GCMKWz+Key wrapping with AES GCM using 256-bit keyr   r   r  Nr   r#   r)   r&   rW  rW  =  rR  r)   rW  c                   0    e Zd ZdZdZdZd Zd Zd Zd Z	y)_Pbes2HsAesKwNc                 P    t               | _        t        t        t        d| _        y N)r7  r<  r   r   rl   r5  r:  r>  aeskwmapr$   s    r&   ro   z_Pbes2HsAesKw.__init__L      &(%G'Br)   c                     |t         kD  rt        d      t        |t              s%t        |t              r|}n+|j                  d      }nt        |j                               }t	        | j                  j                  d            dz   |z   }| j                  dk(  rt        j                         }nS| j                  dk(  rt        j                         }n/| j                  dk(  rt        j                         }nt        d      t        |t        | j                         ||| j"                        }|j%                  |      }	t'        |	      | j                   k7  rt)        | j                   t+        |	            t        d	d
t-        |	            S )NzInvalid p2c value, too largeutf8    r   r   r   zUnknown Hash Size)	algorithmlengthsalt
iterationsrl   r   encr   usek)default_max_pbkdf2_iterationsrE   r  r   bytesencoder   rx   r'   hashsizer
   r   r   r   r   rC   r-   rl   deriverA   r   r>   r   )
r%   r   r_   p2sp2cplainre  hashalgkdfr  s
             r&   r/  z_Pbes2HsAesKw._get_keyP  s.   ..;<<#s##u%

6*$S^^%56ETYY%%f-.83>==CmmoG]]c!mmoG]]c!mmoG01178DLL3I"sDLLJZZB<4<<'%dllCG<<u%+;B+?@@r)   c                 l   i }d|v r't        |d         }t        |      dk  r$t        d      t        d      }t	        |      |d<   d|v r|d   }nd}||d<   | j                  |d   |||      } | j                  | j                            }	|	j                  ||||      }
t        |      dkD  r||
d	<   |
S )
Nrp  r=   z'Invalid Salt, must be 8 or more octectsr7  rq  i    r   r   rH  )	r   r>   rE   rH   r   r/  r^  r-   r   )r%   r_   r   r   r   
ret_headerrp  rq  kekaeskwrets              r&   r   z_Pbes2HsAesKw.wrapo  s    
G"75>2C3x!| !JKKc"C 0 5JuG%.CC #JummGENCc:+dll+-jjgsG4z?Q&CM
r)   c                     d|vrt        d      d|vrt        d      t        |d         }|d   }| j                  |d   |||      } | j                  | j                            }|j                  ||||      S )Nrp  z'Invalid Header, missing "p2s" parameterrq  z'Invalid Header, missing "p2c" parameterr   )rE   r   r/  r^  r-   r   )	r%   r_   r   r   r   rp  rq  rw  rx  s	            r&   r   z_Pbes2HsAesKw.unwrap  s    FGGFGGwu~.enmmGENCc:+dll+-||C"g66r)   )
r6   r7   r8   r'   r-   rn  ro   r/  r   r   r#   r)   r&   rZ  rZ  F  s'    DGHCA>,
7r)   rZ  c                   $    e Zd ZdZdZdZdZdZdZy)_Pbes2Hs256A128KwPBES2-HS256+A128KWz-PBES2 with HMAC SHA-256 and "A128KW" wrappingr7  r   r  r   N	r6   r7   r8   r'   r+   r-   r/   r1   rn  r#   r)   r&   r|  r|    !    DAKG$MHr)   r|  c                   $    e Zd ZdZdZdZdZdZdZy)_Pbes2Hs384A192KwPBES2-HS384+A192KWz-PBES2 with HMAC SHA-384 and "A192KW" wrappingr<  r   r  r   Nr~  r#   r)   r&   r  r    r  r)   r  c                   $    e Zd ZdZdZdZdZdZdZy)_Pbes2Hs512A256KwPBES2-HS512+A256KWz-PBES2 with HMAC SHA-512 and "A256KW" wrappingr   r   r  r   Nr~  r#   r)   r&   r  r    r  r)   r  c                   2    e Zd ZdZdZdZdZdZd Zd Z	d Z
y	)
_Directdirz$Direct use of a shared symmetric keyr7  r   r  c                 h    t        |t              st        d      |d   dk7  rt        d|d         y r+  r  r  s     r&   r  z_Direct._check_key  r  r)   c                     | j                  |       |r|d fS t        |j                  d            }t        |      |k7  rt	        |t        |            d|iS )Nr  r   )r  r   rx   rA   r   )r%   r_   r   r   r   rj  s         r&   r   z_Direct.wrap  sU    ;S^^I67A;'!$Whqk::qzr)   c                     | j                  |       |dk7  rt        d      t        |j                  d            }t	        |      |k7  rt        |t	        |            |S )Nr)   zInvalid Encryption Key.r  )r  rE   r   rx   rA   r   )r%   r_   r   r   r   r   s         r&   r   z_Direct.unwrap  sV    9677s~~i89C=G#%gx}==
r)   N)r6   r7   r8   r'   r+   r-   r/   r1   r  r   r   r#   r)   r&   r  r    s+    D8KG$M7r)   r  c                   >    e Zd ZdZdZdZdZdZd Zd Z	d Z
d	 Zd
 Zy)_EcdhEsECDH-ESzECDH-ES using Concat KDFr   r  Nc                 P    t               | _        t        t        t        d| _        y r\  r]  r$   s    r&   ro   z_EcdhEs.__init__  r_  r)   c                     t        |t              st        d      |d   dvrt        d|d         |d   dk(  r|d   dvrt        d|d         y y )	Nr  r   )ECOKPz	EC or OKPr  crv)X25519X448zX25519 or X448r  r  s     r&   r  z_EcdhEs._check_key  so    #s#677u:]*#KU<<u:5z!33'(8(+E
4 4 4 r)   c                    t        j                  dt        |            }|t        |j	                  d            z  }d|v rt        |d         nd}|t        j                  dt        |            z  }||z  }d|v rt        |d         nd}|t        j                  dt        |            z  }||z  }|t        j                  d|      z  }t        |t        j                        r%|j                  t        j                         |      }	n|j                  |      }	t        t        j                         t        |      || j                        }
|
j!                  |	      S )Nz>Ira  apur)   apv)rc  rd  	otherinforl   )structpackr>   rl  rm  r   r  r   EllipticCurvePrivateKeyexchangeECDHr   r
   r   rC   rl   ro  )r%   privkeypubkeyr   r   r   r  r  r  
shared_keyckdfs              r&   _derivez_EcdhEs._derive  s2    KKc#h/	U3::f-..	 3872Bwu~.V[[s3x00	S	 3872Bwu~.V[[s3x00	S	 	V[[w//	
 gr99: ))"'')V<J !))&1Jv}}$,W$5'0%)\\3 {{:&&r)   c                    | j                  |       | j                  }| j                  |t        d      |d   }|}n|d   }t        j                  |d   |d         }| j                  |j                  d      |j                  d      |||      }| j                  d	|i}	nI | j                  | j                            }
t        d
dt        |            }|
j                  ||||      }	dt        |j                               i|	d<   |	S )Nz"ECDH-ES cannot use an existing CEKrg  r   r   r  )r   r  r  r
  r   r   rh  epkrH  )r  r-   r   r   generater  rx   r^  r   r   r   export_public)r%   r_   r   r   r   dk_sizer   r  dkry  rx  rw  s               r&   r   z_EcdhEs.wrap
  s   ,,<<)*NOO%.CG%.Clls5zs5z:\\#..5..3w1 <<"+C/DMM$,,/1E%U.>r.BCC**S'38CC,=,=,? @AH
r)   c                    d|vrt        d      | j                  |       | j                  }| j                  |d   }|}n|d   }t        d	i |d   }| j	                  |j                  d      |j                  d      |||      }| j                  |S  | j                  | j                            }	t        ddt        |            }
|	j                  |
|||      }|S )
Nr  z'Invalid Header, missing "epk" parameterrg  r   r  r
  r   rh  r#   )	rE   r  r-   r   r  rx   r^  r   r   )r%   r_   r   r   r   r  r   r  r  rx  rw  r   s               r&   r   z_EcdhEs.unwrap$  s    FGG,,<<%.CG%.C#GEN#\\#..5..3w1 <<I/DMM$,,/1E%U.>r.BCC,,sGR9CJr)   )r6   r7   r8   r'   r+   r/   r1   r-   ro   r  r  r   r   r#   r)   r&   r  r    s7    D,K$MGC4!'F4r)   r  c                        e Zd ZdZdZdZdZdZy)_EcdhEsAes128KwECDH-ES+A128KWz.ECDH-ES using Concat KDF and "A128KW" wrappingr7  r   r  Nr   r#   r)   r&   r  r  <      DBKG$Mr)   r  c                        e Zd ZdZdZdZdZdZy)_EcdhEsAes192KwECDH-ES+A192KWz.ECDH-ES using Concat KDF and "A192KW" wrappingr<  r   r  Nr   r#   r)   r&   r  r  E  r  r)   r  c                        e Zd ZdZdZdZdZdZy)_EcdhEsAes256KwECDH-ES+A256KWz.ECDH-ES using Concat KDF and "A256KW" wrappingr   r   r  Nr   r#   r)   r&   r  r  N  r  r)   r  c                   ,    e Zd ZdZdZdZdZdZd Zd Z	y)_EdDsaEdDSAz'EdDSA using Ed25519 or Ed448 algorithmsr   r   Nc                 `    |d   dv r"|j                  d      }|j                  |      S t        )Nr  Ed25519Ed448ra   )rx   ra   r]   r   s       r&   ra   z_EdDsa.sign_  s2    u:-->>&)D99W%%!!r)   c                 b    |d   dv r#|j                  d      }|j                  ||      S t        )Nr  r  rf   )rx   rf   r]   r   s        r&   rf   z_EdDsa.verifye  s4    u:-->>(+D;;y'22!!r)   )
r6   r7   r8   r'   r+   r/   r1   r-   ra   rf   r#   r)   r&   r  r  W  s&    D;K$MG""r)   r  c                       e Zd Zd Zd Zy)_RawJWEc                     t         r[   r\   )r%   rj  aadms       r&   r  z_RawJWE.encryptn  rb   r)   c                     t         r[   r\   )r%   rj  r  rF  rQ   ts         r&   r  z_RawJWE.decryptq  rb   r)   N)r6   r7   r8   r  r  r#   r)   r&   r  r  l  rh   r)   r  c                   (    e Zd ZdZd Zd Zd Zd Zy)_AesCbcHmacSha2Nc                     t               | _        || _        t        j                  j
                  | _        | j                  dz  | _        y )NrK   )	r   rl   rm   r   rI  
block_size	blocksizer-   r3   rn   s     r&   ro   z_AesCbcHmacSha2.__init__y  s5    &(#22!\\A-r)   c                 \   t        t        |      d      }t        j                  || j                  | j
                        }|j                  |       |j                  |       |j                  |       |j                  |       |j                         }|d t        | j                         S )N@   rq   )
rS   rA   r   rr   rm   rl   rs   ry   rC   r-   )r%   rj  r  rF  rQ   alrt   r  s           r&   _macz_AesCbcHmacSha2._mac  sz    #+IIadll;				JJL((4<<())r)   c                    t        |      t        | j                        k7  rt        d      |dt        | j                         }|t        | j                        d }t        | j                        }t        t        j                  |      t        j                  |      | j                        }|j                         }t        | j                        j                         }	|	j!                  |      |	j#                         z   }
|j!                  |
      |j#                         z   }| 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 sizeNrq   )r>   rC   r3   rE   r-   rH   r  r   r   rI  r   CBCrl   rK  r   padderrs   ry   r  )r%   rj  r  r  hkeyekeyrF  rL  rK  r  padded_datarQ   r  s                r&   r  z_AesCbcHmacSha2.encrypt  s    q6Xd0011566((4<<()$,,'() (
t,eiim $.$$&	t~~&--/mmA&)::[)I,>,>,@@ IIdCQ'Aqzr)   c           	         t        |      t        | j                        k7  rt        d      |dt        | j                         }|t        | j                        d }t        j                  || j                  ||||            st        d      t        t        j                  |      t        j                  |      | j                        }|j                         }	|	j!                  |      |	j#                         z   }
t%        | j&                        j)                         }|j!                  |
      |j#                         z   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
        r  NzFailed to verify MACrq   )r>   rC   r3   rE   r-   r	   bytes_eqr  r   r   r   rI  r   r  rl   rN  rs   ry   r   r  unpadder)r%   rj  r  rF  rQ   r  r  dkeyrL  rN  dr  s               r&   r  z_AesCbcHmacSha2.decrypt  s    q6Xd0011566((4<<()$,,'() %%a4b!)DE"#9:: 
t,eiim $.$$&	Q)"4"4"66(113q!H$5$5$777r)   )r6   r7   r8   r-   ro   r  r  r  r#   r)   r&   r  r  u  s    G.*<8r)   r  c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_A128CbcHs256A128CBC-HS256z&AES_128_CBC_HMAC_SHA_256 authenticatedr7  rg  c                 P    t         t        |   t        j                                y r[   )r   r  ro   r
   r   r   s    r&   ro   z_A128CbcHs256.__init__      mT+FMMO<r)   r   r   s   @r&   r  r    '    D:KG$M= =r)   r  c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_A192CbcHs384A192CBC-HS384z&AES_192_CBC_HMAC_SHA_384 authenticatedr<  rg  c                 P    t         t        |   t        j                                y r[   )r   r  ro   r
   r   r   s    r&   ro   z_A192CbcHs384.__init__  r  r)   r   r   s   @r&   r  r    r  r)   r  c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_A256CbcHs512A256CBC-HS512z&AES_256_CBC_HMAC_SHA_512 authenticatedr   rg  c                 P    t         t        |   t        j                                y r[   )r   r  ro   r
   r   r   s    r&   ro   z_A256CbcHs512.__init__  r  r)   r   r   s   @r&   r  r    r  r)   r  c                   "    e Zd ZdZd Zd Zd Zy)_AesGcmNc                 D    t               | _        | j                  | _        y r[   )r   rl   r-   r3   r$   s    r&   ro   z_AesGcm.__init__  s    &(!\\r)   c                 8   t        d      }t        t        j                  |      t	        j
                  |      | j                        }|j                         }|j                  |       |j                  |      |j                         z   }|||j                  fS )r  rE  rq   )rH   r   r   rI  r   rJ  rl   rK  authenticate_additional_datars   ry   rG  )r%   rj  r  r  rF  rL  rK  rQ   s           r&   r  z_AesGcm.encrypt  s~     _
q)599R= $.$$&	..s3Q)"4"4"66Ay}}%%r)   c                    t        t        j                  |      t        j                  ||      | j
                        }|j                         }|j                  |       |j                  |      |j                         z   S )r  rq   )
r   r   rI  r   rJ  rl   rN  r  rs   ry   )r%   rj  r  rF  rQ   r  rL  rN  s           r&   r  z_AesGcm.decrypt  sh     
q)599R+; $.$$&	..s3"Y%7%7%999r)   )r6   r7   r8   r-   ro   r  r  r#   r)   r&   r  r    s    G*
&&:r)   r  c                        e Zd ZdZdZdZdZdZy)_A128GcmA128GCMzAES GCM using 128-bit keyr7  rg  Nr   r#   r)   r&   r  r        D-KG$Mr)   r  c                        e Zd ZdZdZdZdZdZy)_A192GcmA192GCMzAES GCM using 192-bit keyr<  rg  Nr   r#   r)   r&   r  r  !  r  r)   r  c                        e Zd ZdZdZdZdZdZy)_A256GcmA256GCMzAES GCM using 256-bit keyr   rg  Nr   r#   r)   r&   r  r  *  r  r)   r  c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_BP256R1BP256R1zsECDSA using Brainpool256R1 curve and SHA-256 (unregistered, custom-defined in breach of IETF rules by gematik GmbH)r   r   r   c                 R    t         t        |   dt        j                                y )NzBP-256)r   r  ro   r
   r   r   s    r&   ro   z_BP256R1.__init__?      h&xAr)   r   r   s   @r&   r  r  3  0    D	* 
 G$MB Br)   r  c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_BP384R1BP384R1zsECDSA using Brainpool384R1 curve and SHA-384 (unregistered, custom-defined in breach of IETF rules by gematik GmbH)r   r   r   c                 R    t         t        |   dt        j                                y )NzBP-384)r   r   ro   r
   r   r   s    r&   ro   z_BP384R1.__init__O  r  r)   r   r   s   @r&   r   r   C  r  r)   r   c                   2     e Zd ZdZdZdZdZdZ fdZ xZ	S )_BP512R1BP512R1zsECDSA using Brainpool512R1 curve and SHA-512 (unregistered, custom-defined in breach of IETF rules by gematik GmbH)r   r   r   c                 R    t         t        |   dt        j                                y )NzBP-512)r   r  ro   r
   r   r   s    r&   ro   z_BP512R1.__init___  r  r)   r   r   s   @r&   r  r  S  r  r)   r  c            	       :   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,d$Z-e.d*d&       Z/e.d'        Z0e.d(        Z1e.d)        Z2y%)+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#  r6  r;  r?  r  r  r  r  r  r  rQ  rU  rX  r}  r  r  r  r  )r  r  r  r  r  r  r  Nc                 \    | j                   |   }||j                  |k7  rt         |       S r[   )algorithms_registryr1   KeyError)clsr'   ri  r   s       r&   instantiate_algzJWA.instantiate_alg  s0    %%d+?s00C7Nur)   c                 b    	 | j                  |d      S # t        $ r t        d|z        d w xY w)Nr   ri  z(%s is not a valid Signing algorithm namer  r  r   r  r'   s     r&   signing_algzJWA.signing_alg  sM    	@&&t&77 	@% '.04'5 6;?@	@    .c                 b    	 | j                  |d      S # t        $ r t        d|z        d w xY w)Nr  r  z/%s is not a valid Key Management algorithm namer  r  s     r&   keymgmt_algzJWA.keymgmt_alg  N    	J&&t&77 	J% '8:>'? @EIJ	Jr  c                 b    	 | j                  |d      S # t        $ r t        d|z        d w xY w)Nrg  r  z+%s is not a valid Encryption algorithm namer  r  s     r&   encryption_algzJWA.encryption_alg  r  r  r[   )3r6   r7   r8   __doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r"  r5  r:  r>  r  r  r  r  r  r  rP  rT  rW  r|  r  r  r  r  r  r  r  r  r  r   r  r
  classmethodr  r  r  r  r#   r)   r&   r  r  c  s!   
*** 	* 		*
 	* 	* 	* 	'* 	* 	* 	* 	* 	* 	* 	&*  	H!*" 	#*$ 	'%*& 	''*( 	')** 	w+*, 	7-*. 	//*0 	/1*2 	/3*4 	5*6 	Z7*8 	Z9*: 	Z;*< 	/=*> 	/?*@ 	/A*B 	C*D 	E*F 'S*X   @ @ J J J Jr)   r  )krF   r  abcr   r   binasciir   r   cryptography.exceptionsr   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr	   r
   r   )cryptography.hazmat.primitives.asymmetricr   r   r   r   &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   rk  r!   rA   rC   rH   rS   rW   rY   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r"  r&  r5  r:  r>  rA  rP  rT  rW  rZ  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&   <module>r(     s}   
  ' ' 4 8 F F 8 = G L L F @ O 8 . / / - / > '  !& ! W ! H#0" "w ,Ag ACW C2Nw N	6X| 	6	6X| 	6	6X| 	6	JWl 	J	JWl 	J	JWl 	J	?V\ 	?	Dfl 	D	?V\ 	?	?V\ 	?=Wl ==Wl ==Wl =Hl " "; :T< :/t\ /1$ 1 [  Ffl fl fl 1 1hL L L I7K I7X| | | k< Bhk< hVg g g "Wl "*" "N8g N8b	=O\ 	=	=O\ 	=	=O\ 	=+:g +:\w w w Bv| B Bv| B Bv| B OJ OJr)   