
    Ki,                     F   d dl Z d dl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 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 ddlmZ ddlmZ ddlmZ  G d de      Z  G d de      Z! G d de      Z" G d de      Z# G d de      Z$d(dZ% e         e!dd  ejL                                e!d!d" ejN                   ejP                   ejR                                ejR                         d             e!d#d$ ejN                   ejP                   ejT                                ejT                         d             e"d%       e"d&       e"d'       e#d%       e#d&       e#d'       e$d       e$d%       e$d&       e$d'      gZ+y))    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                   .    e Zd ZdZdZd Zd ZddZd Zy)	DirectAlgorithmdirz$Direct use of a shared symmetric keyc                 ,    t        j                  |      S Nr   
import_keyselfraw_datas     i/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/authlib/jose/rfc7518/jwe_algs.pyprepare_keyzDirectAlgorithm.prepare_key         **    c                     i S r    )r   enc_algkeys      r   generate_presetzDirectAlgorithm.generate_preset    s    	r"   Nc                 z    |j                  d      }t        |      dz  |j                  k7  rt        d      d|dS )Nencrypt   zInvalid "cek" lengthr"   ekcek)
get_op_keylenCEK_SIZE
ValueErrorr   r%   headersr&   presetr-   s         r   wrapzDirectAlgorithm.wrap#   s=    nnY's8a<7+++344#&&r"   c                     |j                  d      }t        |      dz  |j                  k7  r"t        j                  |j                  dz        }|S )Ndecryptr*   )r.   r/   r0   secretstoken_bytes)r   r%   r,   r3   r&   r-   s         r   unwrapzDirectAlgorithm.unwrap)   sF    nnY's8a<7+++%%g&6&6!&;<C
r"   r   )	__name__
__module____qualname__namedescriptionr    r'   r5   r:   r$   r"   r   r   r      s     D8K+'r"   r   c                   0    e Zd ZdZd Zd Zd ZddZd Zy)	RSAAlgorithmi   c                 B    || _         |dk(  | _        || _        || _        y )NRSA1_5)r>   
deprecatedr?   r   )r   r>   r?   pad_fns       r   __init__zRSAAlgorithm.__init__5   s$    	(*&r"   c                 ,    t        j                  |      S r   )r   r   r   s     r   r    zRSAAlgorithm.prepare_key;   r!   r"   c                 *    |j                         }d|iS Nr-   generate_cekr   r%   r&   r-   s       r   r'   zRSAAlgorithm.generate_preset>       ""$s|r"   Nc                     |r
d|v r|d   }n|j                         }|j                  d      }|j                  | j                  k  rt        d      |j	                  || j
                        }||dS )Nr-   wrapKeyz.A key of size 2048 bits or larger MUST be usedr+   )rK   r.   key_sizer1   r)   r   )r   r%   r3   r&   r4   r-   op_keyr,   s           r   r5   zRSAAlgorithm.wrapB   sk    evo-C&&(C	*??T]]*MNN^^C.%%r"   c                     |j                  d      }|j                  || j                        }t        |      dz  |j                  k7  r"t        j                  |j                  dz        }|S N	unwrapKeyr*   )r.   r7   r   r/   r0   r8   r9   r   r%   r,   r3   r&   rQ   r-   s          r   r:   zRSAAlgorithm.unwrapN   sZ    ,nnR.s8a<7+++%%g&6&6!&;<C
r"   r   )	r;   r<   r=   rP   rF   r    r'   r5   r:   r$   r"   r   rA   rA   0   s"     H+
&r"   rA   c                   8    e Zd Zd Zd Zd Zd Zd Zd	dZd Z	y)
AESAlgorithmc                 >    d| d| _         d| d| _        || _        y )NAKWzAES Key Wrap using -bit keyr>   r?   rP   r   rP   s     r   rF   zAESAlgorithm.__init__W   s*    z$	0
(C r"   c                 ,    t        j                  |      S r   r   r   s     r   r    zAESAlgorithm.prepare_key\   r!   r"   c                 *    |j                         }d|iS rI   rJ   rL   s       r   r'   zAESAlgorithm.generate_preset_   rM   r"   c                 l    t        |      dz  | j                  k7  rt        d| j                   d      y Nr*   zA key of size z bits is required.r/   rP   r1   r   r&   s     r   
_check_keyzAESAlgorithm._check_keyc   4    s8a<4==(~dmm_<NOPP )r"   c                 z    |j                  d      }| j                  |       t        ||t                     }||dS )NrO   r+   )r.   rd   r   r   )r   r-   r&   rQ   r,   s        r   wrap_cekzAESAlgorithm.wrap_cekg   s8    	*&#'89%%r"   Nc                 ^    |r
d|v r|d   }n|j                         }| j                  ||      S rI   )rK   rg   r2   s         r   r5   zAESAlgorithm.wrapm   s3    evo-C&&(C}}S#&&r"   c                     |j                  d      }| j                  |       t        ||t                     }t	        |      dz  |j
                  k7  r"t        j                  |j
                  dz        }|S rS   )r.   rd   r
   r   r/   r0   r8   r9   rU   s          r   r:   zAESAlgorithm.unwrapt   sc    ,VR):;s8a<7+++%%g&6&6!&;<C
r"   r   )
r;   r<   r=   rF   r    r'   rd   rg   r5   r:   r$   r"   r   rW   rW   V   s&    !
+Q&'r"   rW   c                   F    e Zd Z eddg      Zd Zd Zd Zd Zd
dZ	d	 Z
y)AESGCMAlgorithmivtagc                 >    d| d| _         d| d| _        || _        y )NrY   GCMKWz Key wrapping with AES GCM using r[   r\   r]   s     r   rF   zAESGCMAlgorithm.__init__   s*    z'	=hZxP r"   c                 ,    t        j                  |      S r   r   r   s     r   r    zAESGCMAlgorithm.prepare_key   r!   r"   c                 *    |j                         }d|iS rI   rJ   rL   s       r   r'   zAESGCMAlgorithm.generate_preset   rM   r"   c                 l    t        |      dz  | j                  k7  rt        d| j                   d      y ra   rb   rc   s     r   rd   zAESGCMAlgorithm._check_key   re   r"   Nc                    |r
d|v r|d   }n|j                         }|j                  d      }| j                  |       d}t        j                  |dz        }t        t        |      t        |      t                     }	|	j                         }
|
j                  |      |
j                         z   }t        t        |            t        t        |
j                              d}|||dS )Nr-   rO   `   r*   backend)rl   rm   r,   r-   header)rK   r.   rd   r8   r9   r   r   r   r   	encryptorupdatefinalizer   r   rm   )r   r%   r3   r&   r4   r-   rQ   iv_sizerl   cipherencr,   hs                r   r5   zAESGCMAlgorithm.wrap   s    evo-C&&(C	*
   A.FSWo6GH ZZ_s||~- -b12.sww78
 22r"   c                 B   |j                  d      }| j                  |       |j                  d      }|st        d      |j                  d      }|st        d      t	        t        |            }t	        t        |            }t        t        |      t        ||      t                     }|j                         }	|	j                  |      |	j                         z   }
t        |
      dz  |j                  k7  r"t        j                   |j                  dz        }
|
S )NrT   rl   zMissing "iv" in headersrm   zMissing "tag" in headersru   r*   )r.   rd   getr1   r   r   r   r   r   r   	decryptorrz   r{   r/   r0   r8   r9   )r   r%   r,   r3   r&   rQ   rl   rm   r}   dr-   s              r   r:   zAESGCMAlgorithm.unwrap   s    ,[[677kk% 788x|,.FSS\?;LMhhrlQZZ\)s8a<7+++%%g&6&6!&;<C
r"   r   )r;   r<   r=   	frozensetEXTRA_HEADERSrF   r    r'   rd   r5   r:   r$   r"   r   rk   rk   }   s/    tUm,M!
+Q32r"   rk   c                   X    e Zd Zg dZeZddZd Zd Zd Z	d Z
d Zd	 Zd
 ZddZd Zy)ECDHESAlgorithm)epkapuapvNc                     |d| _         d| _        nd| d| _         d| d| _        || _        t        |      | _        y )NzECDH-ESz(ECDH-ES in the Direct Key Agreement modez	ECDH-ES+ArZ   z/ECDH-ES using Concat KDF and CEK wrapped with A)r>   r?   rP   rW   aeskwr]   s     r   rF   zECDHESAlgorithm.__init__   sP    !DIID#H:R0DIA(2N  !!(+
r"   c                 \    t        || j                        r|S t        j                  |      S r   )
isinstanceALLOWED_KEY_CLSr   r   r   s     r   r    zECDHESAlgorithm.prepare_key   s(    h 4 45O))r"   c                     | j                  |      }| j                  |      }||d}| j                  |j                         }||d<   |S )N)r   rx   r-   )_generate_ephemeral_key_prepare_headersrP   rK   )r   r%   r&   r   r   r4   r-   s          r   r'   zECDHESAlgorithm.generate_preset   sR    **3/!!#&*==$&&(CF5Mr"   c                    | j                   t        |d         }nt        |d         }t        |j                  d      d      }t        |j                  d      d      }t        j                  d|      }||z   |z   |z   S )Nr~   algr   Tr   >I)rP   u32be_len_inputr   structpack)r   r3   bit_sizealg_idapu_infoapv_infopub_infos          r   compute_fixed_infoz"ECDHESAlgorithm.compute_fixed_info   s}    == $WU^4F$WU^4F #7;;u#5t< #7;;u#5t< ;;tX. 8+h66r"   c                 |    t        t        j                         |dz  |t                     }|j	                  |      S )Nr*   )	algorithmlength	otherinforv   )r	   r   SHA256r   derive)r   
shared_key
fixed_infor   ckdfs        r   compute_derived_keyz#ECDHESAlgorithm.compute_derived_key   s6    mmoq= #%	
 {{:&&r"   c                 n    |j                  |      }| j                  ||      }| j                  |||      S r   )exchange_shared_keyr   r   )r   r&   pubkeyr3   r   r   r   s          r   deliverzECDHESAlgorithm.deliver   s9    ,,V4
,,Wh?
''
JIIr"   c                 .    |j                  |d   d      S )NcrvT)
is_private)generate_keyrc   s     r   r   z'ECDHESAlgorithm._generate_ephemeral_key   s    E
t<<r"   c                 l    |j                   D ci c]  }|||   
 }}|j                  |d<   d|iS c c}w )Nktyr   )REQUIRED_JSON_FIELDSr   )r   r   kpub_epks       r   r   z ECDHESAlgorithm._prepare_headers  sA    &)&>&>?1c!f9??w @s   1c                    | j                   |j                  }n| j                   }|rd|v r|d   }i }n"| j                  |      }| j                  |      }|j	                  d      }| j                  ||||      }	| j                   d|	|dS |rd|v rd|d   i}
nd }
| j                  j                  |	      }| j                  j                  ||||
      }||d<   |S )Nr   rO   r"   rw   r-   rx   )	rP   r0   r   r   r.   r   r   r    r5   )r   r%   r3   r&   r4   r   r   r   
public_keydkpreset_for_kwkekrvs                r   r5   zECDHESAlgorithm.wrap  s    == ''H}}Hevo-CA..s3C%%c*A^^I.
\\#z7H=== bA66evo"F5M2M Mjj$$R(ZZ__WgsMB8	r"   c                 j   d|vrt        d      | j                  |j                  }n| j                  }|j                  |d         }|j	                  d      }| j                  ||||      }| j                  |S | j                  j                  |      }	| j                  j                  ||||	      S )Nr   zMissing "epk" in headersrO   )	r1   rP   r0   r   r.   r   r   r    r:   )
r   r%   r,   r3   r&   r   r   r   r   r   s
             r   r:   zECDHESAlgorithm.unwrap%  s    788== ''H}}HnnWU^,^^I.
\\#z7H=== Ijj$$R(zz  "gs;;r"   r   )r;   r<   r=   r   r   r   rF   r    r'   r   r   r   r   r   r5   r:   r$   r"   r   r   r      s?    )MO
,*
7$'J
= :<r"   r   c                     | sy|rt        t        |             } nt        |       } t        j                  dt	        |             | z   S )Ns       r   )r   r   r   r   r/   )sbase64s     r   r   r   9  s<    "hqk*QK;;tSV$q((r"   rC   zRSAES-PKCS1-v1_5zRSA-OAEPz#RSAES OAEP using default parameterszRSA-OAEP-256z.RSAES OAEP using SHA-256 and MGF1 with SHA-256         )F),r8   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   rA   rW   rk   r   r   PKCS1v15OAEPMGF1SHA1r   JWE_ALG_ALGORITHMSr$   r"   r   <module>r      sz     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\\-&--/2MFMMOTJ
 CCCDCCC- r"   