
    ~h,                     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     Y/opt/mcp/mcp-sentiment/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   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                 t    |j                  d      }t        |      dz  |j                  k7  rt        d      |S )Ndecryptr*   r+   r/   )r   r%   r-   r5   r&   r.   s         r   unwrapzDirectAlgorithm.unwrap)   s7    nnY's8a<7+++344
r"   r   )	__name__
__module____qualname__namedescriptionr    r'   r7   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                 .    || _         || _        || _        y 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                 *    |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,   )rI   r0   key_sizer3   r)   r   )r   r%   r5   r&   r6   r.   op_keyr-   s           r   r7   zRSAAlgorithm.wrapA   sk    evo-C&&(C	*??T]]*MNN^^C.%%r"   c                     |j                  d      }|j                  || j                        }t        |      dz  |j                  k7  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   sK    ,nnR.s8a<7+++344
r"   r   )	r;   r<   r=   rN   rD   r    r'   r7   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?   rN   r   rN   s     r   rD   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 rG   rH   rJ   s       r   r'   zAESAlgorithm.generate_preset_   rK   r"   c                 l    t        |      dz  | j                  k7  rt        d| j                   d      y Nr*   zA key of size z bits is required.r1   rN   r3   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 )NrM   r,   )r0   rb   r   r   )r   r.   r&   rO   r-   s        r   wrap_cekzAESAlgorithm.wrap_cekg   s8    	*&#'89%%r"   Nc                 ^    |r
d|v r|d   }n|j                         }| j                  ||      S rG   )rI   re   r4   s         r   r7   zAESAlgorithm.wrapm   s3    evo-C&&(C}}S#&&r"   c                     |j                  d      }| j                  |       t        ||t                     }t	        |      dz  |j
                  k7  rt        d      |S rQ   )r0   rb   r
   r   r1   r2   r3   rS   s          r   r:   zAESAlgorithm.unwrapt   sT    ,VR):;s8a<7+++344
r"   r   )
r;   r<   r=   rD   r    r'   rb   re   r7   r:   r$   r"   r   rU   rU   V   s&    !
+Q&'r"   rU   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 )NrW   GCMKWz Key wrapping with AES GCM using rY   rZ   r[   s     r   rD   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 rG   rH   rJ   s       r   r'   zAESGCMAlgorithm.generate_preset   rK   r"   c                 l    t        |      dz  | j                  k7  rt        d| j                   d      y r_   r`   ra   s     r   rb   zAESGCMAlgorithm._check_key   rc   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.   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    evo-C&&(C	*
 ZZ1%FSWo6GH ZZ_s||~- -b12.sww78
 22r"   c                    |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        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    ,[[677kk% 788x|,.FSS\?;LMhhrlQZZ\)s8a<7+++344
r"   r   )r;   r<   r=   	frozensetEXTRA_HEADERSrD   r    r'   rb   r7   r:   r$   r"   r   ri   ri   }   s/    tUm,M!
+Q32r"   ri   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+ArX   z/ECDH-ES using Concat KDF and CEK wrapped with A)r>   r?   rN   rU   aeskwr[   s     r   rD   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   rv   r.   )_generate_ephemeral_key_prepare_headersrN   rI   )r   r%   r&   r   r   r6   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)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^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	otherinfort   )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&   pubkeyr5   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_keyra   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   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    == ''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 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== ''H}}HnnWU^,^^I.
\\#z7H=== Ijj$$R(zz  "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$'J
= :<r"   r   c                     | sy|rt        t        |             } nt        |       } t        j                  dt	        |             | z   S )Ns       r   )r   r   r   r   r1   )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         )F),rw   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   rU   ri   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"   