
    ([f/,                     v   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	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mZ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j&                               e!dd ej'         ej(         ej)                               ej)                    d                     e!d d! ej'         ej(         ej*                               ej*                    d                     e"d"           e"d#           e"d$           e#d"           e#d#           e#d$           e$d           e$d"           e$d#           e$d$          gZ+dS )&    N)padding)hashes)default_backend)aes_key_wrapaes_key_unwrap)Cipher)AES)GCM)ConcatKDFHash)to_bytes	to_nativeurlsafe_b64decodeurlsafe_b64encode)JWEAlgorithm   )RSAKey)ECKey)OctKeyc                   0    e Zd ZdZdZd Zd ZddZd ZdS )	DirectAlgorithmdirz$Direct use of a shared symmetric keyc                 *    t          j        |          S Nr   
import_keyselfraw_datas     Q/var/www/piapp/venv/lib/python3.11/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                     |                     d          }t          |          dz  |j        k    rt          d          d|dS )Nencrypt   Invalid "cek" lengthr"   ekcek
get_op_keylenCEK_SIZE
ValueErrorr   r%   headersr&   presetr.   s         r   wrapzDirectAlgorithm.wrap#   sH    nnY''s88a<7+++3444#&&&r"   c                     |                     d          }t          |          dz  |j        k    rt          d          |S )Ndecryptr*   r+   r/   )r   r%   r-   r5   r&   r.   s         r   unwrapzDirectAlgorithm.unwrap)   s?    nnY''s88a<7+++3444
r"   r   )	__name__
__module____qualname__namedescriptionr    r'   r7   r:   r$   r"   r   r   r      s_        D8K+ + +  ' ' ' '    r"   r   c                   2    e Zd ZdZd Zd Zd ZddZd ZdS )	RSAAlgorithmi   c                 0    || _         || _        || _        d S r   )r>   r?   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                 2    |                                 }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|                                 }|                    d          }|j        | j        k     rt          d          |                    || j                  }||dS )Nr.   wrapKeyz.A key of size 2048 bits or larger MUST be usedr,   )rI   r0   key_sizer3   r)   r   )r   r%   r5   r&   r6   r.   op_keyr-   s           r   r7   zRSAAlgorithm.wrapA   s     	)evoo-CC&&((C	**?T]**MNNN^^C..%%%r"   c                     |                     d          }|                    || j                  }t          |          dz  |j        k    rt          d          |S N	unwrapKeyr*   r+   )r0   r9   r   r1   r2   r3   r   r%   r-   r5   r&   rO   r.   s          r   r:   zRSAAlgorithm.unwrapM   sT    ,,nnR..s88a<7+++3444
r"   r   )	r;   r<   r=   rN   rD   r    r'   r7   r:   r$   r"   r   rA   rA   0   sk         H  
+ + +  
& 
& 
& 
&    r"   rA   c                   :    e Zd Zd Zd Zd Zd Zd Zd	dZd Z	dS )
AESAlgorithmc                 @    d| d| _         d| d| _        || _        d S )NAKWzAES Key Wrap using -bit keyr>   r?   rN   r   rN   s     r   rD   zAESAlgorithm.__init__W   s2    $$$$	CCCC r"   c                 *    t          j        |          S r   r   r   s     r   r    zAESAlgorithm.prepare_key\   r!   r"   c                 2    |                                 }d|iS rG   rH   rJ   s       r   r'   zAESAlgorithm.generate_preset_   rK   r"   c                 l    t          |          dz  | j        k    rt          d| j         d          d S Nr*   zA key of size z bits is required.r1   rN   r3   r   r&   s     r   
_check_keyzAESAlgorithm._check_keyc   F    s88a<4=((BBBBD D D )(r"   c                     |                     d          }|                     |           t          ||t                                }||dS )NrM   r,   )r0   rb   r   r   )r   r.   r&   rO   r-   s        r   wrap_cekzAESAlgorithm.wrap_cekh   sJ    	**&#'8'899%%%r"   Nc                 t    |rd|v r	|d         }n|                                 }|                     ||          S rG   )rI   re   r4   s         r   r7   zAESAlgorithm.wrapn   sB     	)evoo-CC&&((C}}S#&&&r"   c                     |                     d          }|                     |           t          ||t                                }t	          |          dz  |j        k    rt          d          |S rQ   )r0   rb   r   r   r1   r2   r3   rS   s          r   r:   zAESAlgorithm.unwrapu   sh    ,,VR):):;;s88a<7+++3444
r"   r   )
r;   r<   r=   rD   r    r'   rb   re   r7   r:   r$   r"   r   rU   rU   V   s        ! ! !
+ + +  D D D
& & &' ' ' '    r"   rU   c                   N    e Zd Z eddg          Zd Zd Zd Zd Zd
dZ	d	 Z
dS )AESGCMAlgorithmivtagc                 @    d| d| _         d| d| _        || _        d S )NrW   GCMKWz Key wrapping with AES GCM using rY   rZ   r[   s     r   rD   zAESGCMAlgorithm.__init__   s2    ''''	PhPPP r"   c                 *    t          j        |          S r   r   r   s     r   r    zAESGCMAlgorithm.prepare_key   r!   r"   c                 2    |                                 }d|iS rG   rH   rJ   s       r   r'   zAESGCMAlgorithm.generate_preset   rK   r"   c                 l    t          |          dz  | j        k    rt          d| j         d          d S r_   r`   ra   s     r   rb   zAESGCMAlgorithm._check_key   rc   r"   Nc                 B   |rd|v r	|d         }n|                                 }|                    d          }|                     |           d}t          j        |dz            }t          t          |          t          |          t                                }	|		                                }
|

                    |          |
                                z   }t          t          |                    t          t          |
j                            d}|||dS )Nr.   rM   `   r*   backend)rj   rk   r-   r.   header)rI   r0   rb   osurandomr   r	   r
   r   	encryptorupdatefinalizer   r   rk   )r   r%   r5   r&   r6   r.   rO   iv_sizerj   cipherencr-   hs                r   r7   zAESGCMAlgorithm.wrap   s    	)evoo-CC&&((C	**
 Z1%%FSWWo6G6GHHH  ZZ__s||~~- -b1122.sw7788
 
 222r"   c                    |                     d          }|                     |           |                    d          }|st          d          |                    d          }|st          d          t	          t          |                    }t	          t          |                    }t          t          |          t          ||          t                                }|
                                }	|	                    |          |	                                z   }
t          |
          dz  |j        k    rt          d          |
S )	NrR   rj   zMissing "iv" in headersrk   zMissing "tag" in headersrs   r*   r+   )r0   rb   getr3   r   r   r   r	   r
   r   	decryptorrz   r{   r1   r2   )r   r%   r-   r5   r&   rO   rj   rk   r}   dr.   s              r   r:   zAESGCMAlgorithm.unwrap   s   ,,[[ 	86777kk%   	97888x||,,..FSS\\?;L;LMMMhhrllQZZ\\)s88a<7+++3444
r"   r   )r;   r<   r=   	frozensetEXTRA_HEADERSrD   r    r'   rb   r7   r:   r$   r"   r   ri   ri   ~   s        ItUm,,M! ! !
+ + +  D D D
3 3 3 32    r"   ri   c                   Z    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dS )ECDHESAlgorithm)epkapuapvNc                     |d| _         d| _        n%d| d| _         d                    |          | _        || _        t	          |          | _        d S )NzECDH-ESz(ECDH-ES in the Direct Key Agreement modez	ECDH-ES+ArX   z3ECDH-ES using Concat KDF and CEK wrapped with A{}KW)r>   r?   formatrN   rU   aeskwr[   s     r   rD   zECDHESAlgorithm.__init__   sb    !DIID0H000DI$fX..  !!(++


r"   c                 X    t          || j                  r|S t          j        |          S r   )
isinstanceALLOWED_KEY_CLSr   r   r   s     r   r    zECDHESAlgorithm.prepare_key   s-    h 455 	O)))r"   c                     |                      |          }|                     |          }||d}| j        |                                }||d<   |S )N)r   rv   r.   )_generate_ephemeral_key_prepare_headersrN   rI   )r   r%   r&   r   r   r6   r.   s          r   r'   zECDHESAlgorithm.generate_preset   s\    **3//!!#&&**=$&&((CF5Mr"   c                 2   | j         t          |d                   }nt          |d                   }t          |                    d          d          }t          |                    d          d          }t          j        d|          }||z   |z   |z   S )Nr~   algr   Tr   >I)rN   u32be_len_inputr   structpack)r   r5   bit_sizealg_idapu_infoapv_infopub_infos          r   compute_fixed_infoz"ECDHESAlgorithm.compute_fixed_info   s    = $WU^44FF$WU^44F #7;;u#5#5t<< #7;;u#5#5t<< ;tX.. 8+h66r"   c                     t          t          j                    |dz  |t                                }|                    |          S )Nr*   )	algorithmlength	otherinfort   )r   r   SHA256r   derive)r   
shared_key
fixed_infor   ckdfs        r   compute_derived_keyz#ECDHESAlgorithm.compute_derived_key   sF    mooq= #%%	
 
 
 {{:&&&r"   c                     |                     |          }|                     ||          }|                     |||          S r   )exchange_shared_keyr   r   )r   r&   pubkeyr5   r   r   r   s          r   deliverzECDHESAlgorithm.deliver   sB    ,,V44
,,Wh??
''
JIIIr"   c                 <    |                     |d         d          S )NcrvT)
is_private)generate_keyra   s     r   r   z'ECDHESAlgorithm._generate_ephemeral_key  s    E
t<<<r"   c                 F    fdj         D             }j        |d<   d|iS )Nc                 "    i | ]}||         S r$   r$   ).0kr   s     r   
<dictcomp>z4ECDHESAlgorithm._prepare_headers.<locals>.<dictcomp>  s    ???1c!f???r"   ktyr   )REQUIRED_JSON_FIELDSr   )r   r   pub_epks    ` r   r   z ECDHESAlgorithm._prepare_headers  s5    ????c&>???wr"   c                    | j         |j        }n| j         }|rd|v r|d         }i }n*|                     |          }|                     |          }|                    d          }|                     ||||          }	| j         d|	|dS |rd|v rd|d         i}
nd }
| j                            |	          }| j                            ||||
          }||d<   |S )Nr   rM   r"   ru   r.   rv   )	rN   r2   r   r   r0   r   r   r    r7   )r   r%   r5   r&   r6   r   r   r   
public_keydkpreset_for_kwkekrvs                r   r7   zECDHESAlgorithm.wrap
  s   = 'HH}H 	+evoo-CAA..s33C%%c**A^^I..
\\#z7H=== bA666 	!evoo"F5M2MM Mj$$R((Z__WgsMBB8	r"   c                 d   d|vrt          d          | j        |j        }n| j        }|                    |d                   }|                    d          }|                     ||||          }| j        |S | j                            |          }	| j                            ||||	          S )Nr   zMissing "epk" in headersrM   )	r3   rN   r2   r   r0   r   r   r    r:   )
r   r%   r-   r5   r&   r   r   r   r   r   s
             r   r:   zECDHESAlgorithm.unwrap'  s    7888= 'HH}HnnWU^,,^^I..
\\#z7H=== Ij$$R((z  "gs;;;r"   r   )r;   r<   r=   r   r   r   rD   r    r'   r   r   r   r   r   r7   r:   r$   r"   r   r   r      s        )))MO
, 
, 
, 
,* * *
  7 7 7$' ' 'J J J
= = =        :< < < < <r"   r   Fc                     | sdS |rt          t          |                     } nt          |           } t          j        dt	          |                     | z   S )Ns       r   )r   r   r   r   r1   )sbase64s     r   r   r   ;  sU     #"" hqkk**QKK;tSVV$$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         )F),rw   r   )cryptography.hazmat.primitives.asymmetricr   cryptography.hazmat.primitivesr   cryptography.hazmat.backendsr   &cryptography.hazmat.primitives.keywrapr   r   &cryptography.hazmat.primitives.ciphersr   1cryptography.hazmat.primitives.ciphers.algorithmsr	   ,cryptography.hazmat.primitives.ciphers.modesr
   ,cryptography.hazmat.primitives.kdf.concatkdfr   authlib.common.encodingr   r   r   r   authlib.jose.rfc7516r   rsa_keyr   ec_keyr   oct_keyr   r   rA   rU   ri   r   r   PKCS1v15OAEPMGF1SHA1r   JWE_ALG_ALGORITHMSr$   r"   r   <module>r      s   				  = = = = = = 1 1 1 1 1 1 8 8 8 8 8 8        : 9 9 9 9 9 A A A A A A < < < < < < F F F F F F           
 . - - - - -                      l   .# # # # #< # # #L% % % % %< % % %PA A A A Al A A AHv< v< v< v< v<l v< v< v<r) ) ) ) OL-/?w/?/A/ABBL9\W\+&+--00+&+--FFH H LH\W\-&-//22MFMOOTJJL L LLLOCOCOCODOCOCOC'   r"   