
    i[f                         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mZmZmZ d dlmZ  G d	 d
e
          Z ed           ed           ed           ed          gZd ZdS )    N)default_backend)hashes)ConcatKDFHash)8InvalidEncryptionAlgorithmForECDH1PUWithKeyWrappingError)$JWEAlgorithmWithTagAwareKeyAgreement)AESAlgorithmCBCHS2EncAlgorithmECKeyu32be_len_input)OKPKeyc                       e Zd Zg dZeefZddZd Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd ZddZddZd Zd ZddZddZdS )ECDH1PUAlgorithm)epkapuapvskidNc                     |d| _         d| _        n%d| d| _         d                    |          | _        || _        t	          |          | _        d S )NzECDH-1PUz)ECDH-1PU in the Direct Key Agreement modez
ECDH-1PU+AKWz4ECDH-1PU using Concat KDF and CEK wrapped with A{}KW)namedescriptionformatkey_sizer   aeskw)selfr   s     W/var/www/piapp/venv/lib/python3.11/site-packages/authlib/jose/drafts/_jwe_algorithms.py__init__zECDH1PUAlgorithm.__init__   sb    "DIJD1X111DI$fX..  !!(++


    c                 X    t          || j                  r|S t          j        |          S N)
isinstanceALLOWED_KEY_CLSr
   
import_key)r   raw_datas     r   prepare_keyzECDH1PUAlgorithm.prepare_key   s-    h 455 	O)))r   c                     |                      |          }|                     |          }||d}| j        |                                }||d<   |S )N)r   headercek)_generate_ephemeral_key_prepare_headersr   generate_cek)r   enc_algkeyr   hpresetr'   s          r   generate_presetz ECDH1PUAlgorithm.generate_preset"   s\    **3//!!#&&**=$&&((CF5Mr   c                     ||z   S r    )r   shared_key_eshared_key_ss      r   compute_shared_keyz#ECDH1PUAlgorithm.compute_shared_key+   s    l**r   c                 `   |d}nt          |          }| j        t          |d                   }nt          |d                   }t          |                    d          d          }t          |                    d          d          }t          j        d|          |z   }||z   |z   |z   S )Nr   encalgr   Tr   z>I)r   r   getstructpack)	r   headersbit_sizetagcctagalg_idapu_infoapv_infopub_infos	            r   compute_fixed_infoz#ECDH1PUAlgorithm.compute_fixed_info.   s    ;EE#C((E = $WU^44FF$WU^44F #7;;u#5#5t<< #7;;u#5#5t<< ;tX..6 8+h66r   c                     t          t          j                    |dz  |t                                }|                    |          S )N   )	algorithmlength	otherinfobackend)r   r   SHA256r   derive)r   
shared_key
fixed_infor<   ckdfs        r   compute_derived_keyz$ECDH1PUAlgorithm.compute_derived_keyE   sF    mooq= #%%	
 
 
 {{:&&&r   c                     |                     |          }|                     |          }|                     ||          }	|                     |||          }
|                     |	|
|          S r   exchange_shared_keyr4   rC   rO   )r   sender_static_keysender_ephemeral_keyrecipient_pubkeyr;   r<   r=   r3   r2   rL   rM   s              r   deliver_at_senderz"ECDH1PUAlgorithm.deliver_at_senderN   sn    (<<=MNN+??@PQQ,,\<HH
,,WhDD
''
JIIIr   c                     |                     |          }|                     |          }|                     ||          }	|                     |||          }
|                     |	|
|          S r   rQ   )r   recipient_keysender_static_pubkeysender_ephemeral_pubkeyr;   r<   r=   r3   r2   rL   rM   s              r   deliver_at_recipientz%ECDH1PUAlgorithm.deliver_at_recipientW   sn    $889MNN$889PQQ,,\<HH
,,WhDD
''
JIIIr   c                 <    |                     |d         d          S )NcrvT)
is_private)generate_key)r   r,   s     r   r(   z(ECDH1PUAlgorithm._generate_ephemeral_key`   s    E
t<<<r   c                 F    fdj         D             }j        |d<   d|iS )Nc                 "    i | ]}||         S r1   r1   ).0kr   s     r   
<dictcomp>z5ECDH1PUAlgorithm._prepare_headers.<locals>.<dictcomp>e   s    ???1c!f???r   ktyr   )REQUIRED_JSON_FIELDSre   )r   r   pub_epks    ` r   r)   z!ECDH1PUAlgorithm._prepare_headersc   s5    ????c&>???wr   c                    t          |t                    st                      |rd|v r|d         }i }n*|                     |          }|                     |          }|rd|v r	|d         }n|                                }|||dS )Nr   r'   )r   r'   r&   )r    r	   r   r(   r)   r*   )r   r+   r,   
sender_keyr.   r   r-   r'   s           r   !generate_keys_and_prepare_headersz2ECDH1PUAlgorithm.generate_keys_and_prepare_headersi   s    '#566 	MJLLL 	+evoo-CAA..s33C%%c**A 	)evoo-CC&&((C3!444r   c                     | j         |j        }n| j         }|                    d          }|                     ||||||          S )NwrapKey)r   CEK_SIZE
get_op_keyrV   )	r   r+   r;   r,   ri   r   r=   r<   
public_keys	            r   _agree_upon_key_at_senderz*ECDH1PUAlgorithm._agree_upon_key_at_sender{   sK    = 'HH}H^^I..
%%j#z7HVYZZZr   c                 l    | j                             |          }| j                             ||          S r   )r   r$   wrap_cek)r   r'   dkkeks       r   	_wrap_cekzECDH1PUAlgorithm._wrap_cek   s/    j$$R((z""3,,,r   c                 b    |                      ||||||          }|                     ||          S r   )rp   ru   )	r   r+   r;   r,   ri   r   r'   r=   rs   s	            r   agree_upon_key_and_wrap_cekz,ECDH1PUAlgorithm.agree_upon_key_and_wrap_cek   s4    ++GWc:sTWXX~~c2&&&r   c                     | j         t          d          |rd|v r|d         }i }n*|                     |          }|                     |          }|                     |||||          }d||dS )Nz Invalid algorithm state detectedr   r   )ekr'   r&   )r   RuntimeErrorr(   r)   rp   )	r   r+   r;   r,   ri   r.   r   r-   rs   s	            r   wrapzECDH1PUAlgorithm.wrap   s    =$ABBB 	+evoo-CAA..s33C%%c**A++GWc:sSS"222r   c                    d|vrt          d          | j        |j        }n| j        }|                    d          }|                    |d                   }	|	                    d          }
|                     |||
|||          }| j        |S | j                            |          }| j                            ||||          S )Nr   zMissing "epk" in headersrl   )	
ValueErrorr   rm   rn   r"   r[   r   r$   unwrap)r   r+   ry   r;   r,   ri   r=   r<   sender_pubkeyr   
epk_pubkeyrs   rt   s                r   r~   zECDH1PUAlgorithm.unwrap   s    7888= 'HH}H"--i88nnWU^,,^^I..
&&sM:wPXZ]^^= Ij$$R((z  "gs;;;r   r   )__name__
__module____qualname__EXTRA_HEADERSr
   r   r!   r   r$   r/   r4   rC   rO   rV   r[   r(   r)   rj   rp   ru   rw   r{   r~   r1   r   r   r   r      s;       111MfoO
, 
, 
, 
,* * *
  + + +7 7 7.' ' 'J J JJ J J= = =     5 5 5 5$[ [ [ [- - -' ' '3 3 3 3 < < < < < <r   r            c                 D    t           D ]}|                     |           d S r   )JWE_DRAFT_ALG_ALGORITHMSregister_algorithm)clsr7   s     r   register_jwe_alg_draftr      s2    ' $ $s####$ $r   )r9   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   ,cryptography.hazmat.primitives.kdf.concatkdfr   authlib.jose.errorsr   authlib.jose.rfc7516r   authlib.jose.rfc7518r   r	   r
   r   authlib.jose.rfc8037r   r   r   r   r1   r   r   <module>r      s-    8 8 8 8 8 8 1 1 1 1 1 1 F F F F F F X X X X X X E E E E E E Y Y Y Y Y Y Y Y Y Y Y Y ' ' ' ' ' 'c< c< c< c< c<; c< c< c<N TSSS	 $ $ $ $ $r   