
    k7i,                     H   S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJr  S SKJr  S S	KJr  S S
KJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  SSKJr  SSKJr  SSKJr   " S S\5      r  " S S\5      r! " S S\5      r" " S S\5      r# " S S\5      r$S(S jr%\ " 5       \!" SS \RL                  " 5       5      \!" S!S"\RN                  " \RP                  " \RR                  " 5       5      \RR                  " 5       S5      5      \!" S#S$\RN                  " \RP                  " \RT                  " 5       5      \RT                  " 5       S5      5      \"" S%5      \"" S&5      \"" S'5      \#" S%5      \#" S&5      \#" S'5      \$" S5      \$" S%5      \$" S&5      \$" S'5      /r+g))    N)default_backend)hashes)padding)Cipher)AES)GCM)ConcatKDFHash)aes_key_unwrap)aes_key_wrap)to_bytes)	to_native)urlsafe_b64decode)urlsafe_b64encode)JWEAlgorithm   )ECKey)OctKey)RSAKeyc                   8    \ rS rSrSrSrS rS rS
S jrS r	S	r
g)DirectAlgorithm   dirz$Direct use of a shared symmetric keyc                 .    [         R                  " U5      $ Nr   
import_keyselfraw_datas     W/home/james-whalen/.local/lib/python3.13/site-packages/authlib/jose/rfc7518/jwe_algs.pyprepare_keyDirectAlgorithm.prepare_key         **    c                     0 $ r    )r   enc_algkeys      r    generate_presetDirectAlgorithm.generate_preset    s    	r$   Nc                 |    UR                  S5      n[        U5      S-  UR                  :w  a  [        S5      eSUS.$ )Nencrypt   Invalid "cek" lengthr$   ekcek
get_op_keylenCEK_SIZE
ValueErrorr   r'   headersr(   presetr1   s         r    wrapDirectAlgorithm.wrap#   s=    nnY's8a<7+++344#&&r$   c                 v    UR                  S5      n[        U5      S-  UR                  :w  a  [        S5      eU$ )Ndecryptr-   r.   r2   )r   r'   r0   r8   r(   r1   s         r    unwrapDirectAlgorithm.unwrap)   s7    nnY's8a<7+++344
r$   r&   r   )__name__
__module____qualname____firstlineno__namedescriptionr!   r)   r:   r>   __static_attributes__r&   r$   r    r   r      s     D8K+'r$   r   c                   :    \ rS rSrSrS rS rS rS
S jrS r	S	r
g)RSAAlgorithm0   i   c                 (    Xl         X l        X0l        g r   )rD   rE   r   )r   rD   rE   pad_fns       r    __init__RSAAlgorithm.__init__5   s    	&r$   c                 .    [         R                  " U5      $ r   )r   r   r   s     r    r!   RSAAlgorithm.prepare_key:   r#   r$   c                 *    UR                  5       nSU0$ Nr1   generate_cekr   r'   r(   r1   s       r    r)   RSAAlgorithm.generate_preset=       ""$s|r$   Nc                     U(       a  SU;   a  US   nOUR                  5       nUR                  S5      nUR                  U R                  :  a  [        S5      eUR	                  XPR
                  5      nXuS.$ )Nr1   wrapKeyz.A key of size 2048 bits or larger MUST be usedr/   )rS   r3   key_sizer6   r,   r   )r   r'   r8   r(   r9   r1   op_keyr0   s           r    r:   RSAAlgorithm.wrapA   sg    evo-C&&(C	*??T]]*MNN^^C.%%r$   c                     UR                  S5      nUR                  X R                  5      n[        U5      S-  UR                  :w  a  [        S5      eU$ N	unwrapKeyr-   r.   )r3   r=   r   r4   r5   r6   r   r'   r0   r8   r(   rZ   r1   s          r    r>   RSAAlgorithm.unwrapM   sI    ,nnR.s8a<7+++344
r$   )rE   rD   r   r   )r@   rA   rB   rC   rY   rL   r!   r)   r:   r>   rF   r&   r$   r    rH   rH   0   s"     H
+
&r$   rH   c                   B    \ rS rSrS rS rS rS rS rSS jr	S	 r
S
rg)AESAlgorithmV   c                 <    SU S3U l         SU S3U l        Xl        g )NAKWzAES Key Wrap using -bit keyrD   rE   rY   r   rY   s     r    rL   AESAlgorithm.__init__W   s(    z$	0
(C r$   c                 .    [         R                  " U5      $ r   r   r   s     r    r!   AESAlgorithm.prepare_key\   r#   r$   c                 *    UR                  5       nSU0$ rQ   rR   rT   s       r    r)   AESAlgorithm.generate_preset_   rV   r$   c                 n    [        U5      S-  U R                  :w  a  [        SU R                   S35      eg Nr-   zA key of size z bits is required.r4   rY   r6   r   r(   s     r    
_check_keyAESAlgorithm._check_keyc   4    s8a<4==(~dmm_<NOPP )r$   c                 v    UR                  S5      nU R                  U5        [        X1[        5       5      nXAS.$ )NrX   r/   )r3   rs   r   r   )r   r1   r(   rZ   r0   s        r    wrap_cekAESAlgorithm.wrap_cekg   s4    	*&'89%%r$   Nc                 j    U(       a  SU;   a  US   nOUR                  5       nU R                  XS5      $ rQ   )rS   rw   r7   s         r    r:   AESAlgorithm.wrapm   s1    evo-C&&(C}}S&&r$   c                     UR                  S5      nU R                  U5        [        XR[        5       5      n[	        U5      S-  UR
                  :w  a  [        S5      eU$ r]   )r3   rs   r
   r   r4   r5   r6   r_   s          r    r>   AESAlgorithm.unwrapt   sR    ,V):;s8a<7+++344
r$   rE   rY   rD   r   )r@   rA   rB   rC   rL   r!   r)   rs   rw   r:   r>   rF   r&   r$   r    rb   rb   V   s&    !
+Q&'r$   rb   c                   P    \ rS rSr\" SS/5      rS rS rS rS r	SS	 jr
S
 rSrg)AESGCMAlgorithm}   ivtagc                 <    SU S3U l         SU S3U l        Xl        g )Nre   GCMKWz Key wrapping with AES GCM using rg   rh   ri   s     r    rL   AESGCMAlgorithm.__init__   s(    z'	=hZxP r$   c                 .    [         R                  " U5      $ r   r   r   s     r    r!   AESGCMAlgorithm.prepare_key   r#   r$   c                 *    UR                  5       nSU0$ rQ   rR   rT   s       r    r)   AESGCMAlgorithm.generate_preset   rV   r$   c                 n    [        U5      S-  U R                  :w  a  [        SU R                   S35      eg rp   rq   rr   s     r    rs   AESGCMAlgorithm._check_key   ru   r$   Nc                    U(       a  SU;   a  US   nOUR                  5       nUR                  S5      nU R                  U5        Sn[        R                  " US-  5      n[        [        U5      [        U5      [        5       S9n	U	R                  5       n
U
R                  U5      U
R                  5       -   n[        [        U5      5      [        [        U
R                  5      5      S.nXUS.$ )Nr1   rX   `   r-   backend)r   r   r0   r1   header)rS   r3   rs   osurandomr   r   r   r   	encryptorupdatefinalizer   r   r   )r   r'   r8   r(   r9   r1   rZ   iv_sizer   cipherencr0   hs                r    r:   AESGCMAlgorithm.wrap   s    evo-C&&(C	*
 ZZ1%FSWo6GH ZZ_s||~- -b12.sww78
 22r$   c                 "   UR                  S5      nU R                  U5        UR                  S5      nU(       d  [        S5      eUR                  S5      nU(       d  [        S5      e[	        [        U5      5      n[	        [        U5      5      n[        [        U5      [        Xg5      [        5       S9nUR                  5       n	U	R                  U5      U	R                  5       -   n
[        U
5      S-  UR                  :w  a  [        S5      eU
$ )	Nr^   r   zMissing "iv" in headersr   zMissing "tag" in headersr   r-   r.   )r3   rs   getr6   r   r   r   r   r   r   	decryptorr   r   r4   r5   )r   r'   r0   r8   r(   rZ   r   r   r   dr1   s              r    r>   AESGCMAlgorithm.unwrap   s    ,[[677kk% 788x|,.FS\?;LMhhrlQZZ\)s8a<7+++344
r$   r}   r   )r@   rA   rB   rC   	frozensetEXTRA_HEADERSrL   r!   r)   rs   r:   r>   rF   r&   r$   r    r   r   }   s/    tUm,M!
+Q32r$   r   c                   d    \ rS rSr/ SQr\rSS jrS rS r	S r
S rS	 rS
 rS rSS jrS rSrg)ECDHESAlgorithm   )epkapuapvNc                     Uc  SU l         SU l        OSU S3U l         SU S3U l        Xl        [        U5      U l        g )NzECDH-ESz(ECDH-ES in the Direct Key Agreement modez	ECDH-ES+Arf   z/ECDH-ES using Concat KDF and CEK wrapped with A)rD   rE   rY   rb   aeskwri   s     r    rL   ECDHESAlgorithm.__init__   sN    !DIID#H:R0DIA(2N  !!(+
r$   c                 f    [        XR                  5      (       a  U$ [        R                  " U5      $ r   )
isinstanceALLOWED_KEY_CLSr   r   r   s     r    r!   ECDHESAlgorithm.prepare_key   s)    h 4 455O))r$   c                     U R                  U5      nU R                  U5      nX4S.nU R                  b  UR                  5       nXeS'   U$ )N)r   r   r1   )_generate_ephemeral_key_prepare_headersrY   rS   )r   r'   r(   r   r   r9   r1   s          r    r)   ECDHESAlgorithm.generate_preset   sN    **3/!!#&*==$&&(C5Mr$   c                    U R                   c  [        US   5      nO[        US   5      n[        UR                  S5      S5      n[        UR                  S5      S5      n[        R                  " SU5      nX4-   U-   U-   $ )Nr   algr   Tr   >I)rY   u32be_len_inputr   structpack)r   r8   bit_sizealg_idapu_infoapv_infopub_infos          r    compute_fixed_info"ECDHESAlgorithm.compute_fixed_info   s{    == $WU^4F$WU^4F #7;;u#5t< #7;;u#5t< ;;tX. 8+h66r$   c                 x    [        [        R                  " 5       US-  U[        5       S9nUR	                  U5      $ )Nr-   )	algorithmlength	otherinfor   )r	   r   SHA256r   derive)r   
shared_key
fixed_infor   ckdfs        r    compute_derived_key#ECDHESAlgorithm.compute_derived_key   s6    mmoq= #%	
 {{:&&r$   c                 j    UR                  U5      nU R                  X45      nU R                  XVU5      $ r   )exchange_shared_keyr   r   )r   r(   pubkeyr8   r   r   r   s          r    deliverECDHESAlgorithm.deliver   s5    ,,V4
,,W?
''
IIr$   c                 (    UR                  US   SS9$ )NcrvT)
is_private)generate_keyrr   s     r    r   'ECDHESAlgorithm._generate_ephemeral_key   s    E
t<<r$   c                 n    UR                    Vs0 s H  o"X   _M	     nnUR                  US'   SU0$ s  snf )Nktyr   )REQUIRED_JSON_FIELDSr   )r   r   kpub_epks       r    r    ECDHESAlgorithm._prepare_headers  s@    &)&>&>?&>cf9&>?w @s   2c                    U R                   c  UR                  nOU R                   nU(       a  SU;   a  US   n0 nO"U R                  U5      nU R                  U5      nUR	                  S5      nU R                  XhX%5      n	U R                   c  SXS.$ U(       a  SU;   a  SUS   0n
OS n
U R                  R                  U	5      nU R                  R                  XX5      nX|S'   U$ )Nr   rX   r$   r   r1   r   )	rY   r5   r   r   r3   r   r   r!   r:   )r   r'   r8   r(   r9   r   r   r   
public_keydkpreset_for_kwkekrvs                r    r:   ECDHESAlgorithm.wrap  s    == ''H}}Hevo-CA..s3C%%c*A^^I.
\\#7=== b66evo"F5M2M Mjj$$R(ZZ__WsB8	r$   c                 j   SU;  a  [        S5      eU R                  c  UR                  nOU R                  nUR                  US   5      nUR	                  S5      nU R                  XGX55      nU R                  c  U$ U R                  R                  U5      n	U R                  R                  XX95      $ )Nr   zMissing "epk" in headersrX   )	r6   rY   r5   r   r3   r   r   r!   r>   )
r   r'   r0   r8   r(   r   r   r   r   r   s
             r    r>   ECDHESAlgorithm.unwrap%  s    788== ''H}}HnnWU^,^^I.
\\#7=== Ijj$$R(zz  g;;r$   )r   rE   rY   rD   r   )r@   rA   rB   rC   r   r   r   rL   r!   r)   r   r   r   r   r   r:   r>   rF   r&   r$   r    r   r      s?    )MO
,*
7$'J
= :<r$   r   c                     U (       d  gU(       a  [        [        U 5      5      n O[        U 5      n [        R                  " S[	        U 5      5      U -   $ )Ns       r   )r   r   r   r   r4   )sbase64s     r    r   r   9  s<    "hqk*QK;;tSV$q((r$   RSA1_5zRSAES-PKCS1-v1_5zRSA-OAEPz#RSAES OAEP using default parameterszRSA-OAEP-256z.RSAES OAEP using SHA-256 and MGF1 with SHA-256   r      )F),r   r   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   )cryptography.hazmat.primitives.asymmetricr   &cryptography.hazmat.primitives.ciphersr   1cryptography.hazmat.primitives.ciphers.algorithmsr   ,cryptography.hazmat.primitives.ciphers.modesr   ,cryptography.hazmat.primitives.kdf.concatkdfr	   &cryptography.hazmat.primitives.keywrapr
   r   authlib.common.encodingr   r   r   r   authlib.jose.rfc7516r   ec_keyr   oct_keyr   rsa_keyr   r   rH   rb   r   r   r   PKCS1v15OAEPMGF1SHA1r   JWE_ALG_ALGORITHMSr&   r$   r    <module>r      sg   	  8 1 = 9 A < F A ? , - 5 5 -   l .#< #L$< $N@l @Fv<l v<r) -w/?/?/AB-W\\&++-0&++-F
 8W\\&--/2FMMOTJ
 CCCDCCC- r$   