Ë
    ”ÂiÊ,  ã                   ó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     úU/var/www/timesheet/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=   € Ø�n‰n˜YÓ'ˆÜˆs‹8�a‰<˜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   € Ø�n‰n˜YÓ'ˆÜˆs‹8�a‰<˜7×+Ñ+Ò+Ü×%Ñ% g×&6Ñ&6¸!Ñ&;Ó<ˆCØˆ
r"   r   )	Ú__name__Ú
__module__Ú__qualname__ÚnameÚdescriptionr    r'   r5   r:   r$   r"   r   r   r      s    „ Ø€DØ8€Kò+òó'ó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   € Ù�e˜v‘oØ˜‘-‰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   € Ø—‘ Ó,ˆØ�n‰n˜R §¡Ó.ˆÜˆs‹8�a‰<˜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   € Üˆs‹8�a‰<˜4Ÿ=™=Ò(Ü˜~¨d¯m©m¨_Ð<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   € Ù�e˜v‘oØ˜‘-‰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   € Ø—‘ Ó,ˆØ�‰˜ÔÜ˜V R¬Ó):Ó;ˆÜˆs‹8�a‰<˜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 Ð'ˆŒ	Ø=¸h¸ZÀxÐ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Î   € Ù�e˜v‘oØ˜‘-‰Cà×&Ñ&Ó(ˆCà—‘ 	Ó*ˆØ�‰˜Ôð
 ˆÜ× Ñ  ¨A¡Ó.ˆäœ˜F›¤S¨£W´oÓ6GÔHˆØ×ÑÓ ˆØ�Z‰Z˜‹_˜sŸ|™|›~Ñ-ˆô Ô-¨bÓ1Ó2ÜÔ.¨s¯w©wÓ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à�k‰k˜%Ó ˆÙÜÐ7Ó8Ð8äœx¨›|Ó,ˆÜ¤¨£Ó.ˆäœ˜F›¤S¨¨S£\¼?Ó;LÔMˆØ×ÑÓˆØ�h‰h�r‹l˜QŸZ™Z›\Ñ)ˆÜˆs‹8�a‰<˜7×+Ñ+Ò+Ü×%Ñ% g×&6Ñ&6¸!Ñ&;Ó<ˆCØˆ
r"   r   )r;   r<   r=   Ú	frozensetÚEXTRA_HEADERSrF   r    r'   rd   r5   r:   r$   r"   r   rk   rk   }   s/   „ Ù˜t U˜mÓ,€Mò!ò
+òòQó3ó2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   € ØÐØ!ˆDŒIØIˆDÕà# H :¨RÐ0ˆDŒIà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ØˆF�5‰MØˆ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}   € à�=‰=Ð Ü$ W¨U¡^Ó4‰Fä$ W¨U¡^Ó4ˆFô # 7§;¡;¨uÓ#5°tÓ<ˆô # 7§;¡;¨uÓ#5°tÓ<ˆô —;‘;˜t XÓ.ˆà˜Ñ  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   € ÜÜ—m‘m“oØ˜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ˆ
Ø×,Ñ,¨W°hÓ?ˆ
Ø×'Ñ'¨
°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   € à&)×&>Ñ&>Ö? �1�c˜!‘f‘9Ð?ˆÐ?ØŸ™ˆ�‰Ø�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á�e˜v‘oØ˜‘-ˆCØ‰Aà×.Ñ.¨sÓ3ˆCØ×%Ñ% cÓ*ˆAà—^‘^ IÓ.ˆ
Ø�\‰\˜#˜z¨7°HÓ=ˆà�=‰=Ð Ø b°AÑ6Ð6á�e˜v‘oØ" F¨5¡MÐ2‰Mà ˆMà�j‰j×$Ñ$ RÓ(ˆØ�Z‰Z�_‰_˜W g¨s°MÓ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à�n‰n˜W U™^Ó,ˆØ—^‘^ IÓ.ˆ
Ø�\‰\˜#˜z¨7°HÓ=ˆà�=‰=Ð ØˆIà�j‰j×$Ñ$ RÓ(ˆØ�z‰z× Ñ  ¨"¨g°sÓ;Ð;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<   € ÙØ"ÙÜœh q›kÓ*‰ä�Q‹KˆÜ�;‰;�tœS ›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—\‘\ - &§-¡-£/Ó2°M°F·M±M³OÀTÓJóñ
 �ÓÙ�ÓÙ�ÓÙ�CÓÙ�CÓÙ�CÓÙ�DÓÙ�CÓÙ�CÓÙ�CÓð-Ñ r"   