a
    !f]                     @   sP  d dl Z d dlmZ d dlmZmZ d dlmZmZ d dlmZm	Z	 d dlm
Z
mZ d dlmZ d dlmZ ed	d
ddedd
ddedd
ddedd
d
dedd
d
dedd
ddedd
d
dedd
d
dedd
d
dedd
d
dedd
ddedd
ddedddddZg dZG dd deZejZejZejZejZG dd dZdS )    N)common)JWExceptionJWKeyNotFound)JWSEHeaderParameterJWSEHeaderRegistry)base64url_decodebase64url_encode)json_decodejson_encode)JWA)JWKSetZ	AlgorithmFTzEncryption AlgorithmzCompression AlgorithmzJWK Set URLzJSON Web KeyzKey IDz	X.509 URLzX.509 Certificate Chainz"X.509 Certificate SHA-1 Thumbprintz$X.509 Certificate SHA-256 ThumbprintTypezContent TypeZCritical)algenczipZjkuZjwkkidZx5uZx5cZx5tzx5t#S256typZctycrit)zRSA-OAEPzRSA-OAEP-256ZA128KWZA192KWZA256KWdirzECDH-ESzECDH-ES+A128KWzECDH-ES+A192KWzECDH-ES+A256KWZ	A128GCMKWZ	A192GCMKWZ	A256GCMKWzPBES2-HS256+A128KWzPBES2-HS384+A192KWzPBES2-HS512+A256KWzA128CBC-HS256zA192CBC-HS384zA256CBC-HS512ZA128GCMZA192GCMZA256GCMc                       s"   e Zd ZdZd fdd	Z  ZS )InvalidJWEDatazvInvalid JWE Object.

    This exception is raised when the JWE Object is invalid and/or
    improperly formatted.
    Nc                    s:   d }|r|}nd}|r&|dt | 7 }tt| | d S )Nz!Unknown Data Verification Failurez {%s})strsuperr   __init__)selfmessage	exceptionmsg	__class__ M/var/www/html/python-backend/venv/lib/python3.9/site-packages/jwcrypto/jwe.pyr   8   s    zInvalidJWEData.__init__)NN)__name__
__module____qualname____doc__r   __classcell__r   r   r   r    r   1   s   r   c                   @   s   e Zd ZdZd/ddZdd Zdd Zed	d
 Zej	dd
 Zdd Z
d0ddZdd Zdd Zd1ddZd2ddZdd Zdd Zdd Zdd  Zd3d!d"Zed#d$ Zed%d& Zed'd( Zd)d* Zd+d, Zd-d. ZdS )4JWEzGJSON Web Encryption object

    This object represent a JWE token.
    Nc	           	      C   s   d| _ i | _d| _tt| _|r,| j| |durRt|trF|| _n|	d| _d| _
d| _|rl|| jd< |rt|trt|}nt| || jd< |rt|trt|}nt| || jd< |r|| _ |r| j||d n|rtddS )aB  Creates a JWE token.

        :param plaintext(bytes): An arbitrary plaintext to be encrypted.
        :param protected: A JSON string with the protected header.
        :param unprotected: A JSON string with the shared unprotected header.
        :param aad(bytes): Arbitrary additional authenticated data
        :param algs: An optional list of allowed algorithms
        :param recipient: An optional, default recipient key
        :param header: An optional header for the default recipient
        :param header_registry: Optional additions to the header registry
        Nutf-8aad	protectedunprotected)headerz-Header is allowed only with default recipient)_allowed_algsobjects	plaintextr   JWEHeaderRegistryheader_registryupdate
isinstancebytesencodecek
decryptlogdictr
   r	   add_recipient
ValueError)	r   r.   r)   r*   r(   algsZ	recipientr+   r0   r   r   r    r   P   s<    








zJWE.__init__c                 C   s$   | j pt}||vrtdt|S NzAlgorithm not allowed)r,   default_allowed_algsInvalidJWEOperationr   Zkeymgmt_algr   nameallowedr   r   r    _jwa_keymgmt   s    
zJWE._jwa_keymgmtc                 C   s$   | j pt}||vrtdt|S r;   )r,   r<   r=   r   Zencryption_algr>   r   r   r    _jwa_enc   s    
zJWE._jwa_encc                 C   s   | j r| j S tS dS )zAllowed algorithms.

        The list of allowed algorithms.
        Can be changed by setting a list of algorithm names.
        N)r,   r<   r   r   r   r    allowed_algs   s    zJWE.allowed_algsc                 C   s   t |tstd|| _d S )NzAllowed Algs must be a list)r2   list	TypeErrorr,   )r   r:   r   r   r    rD      s    
c                 C   s4   t | D ]}||v rtd| q|| |S )NzDuplicate header: "%s")rE   keysr   r1   )r   Zh1Zh2kr   r   r    _merge_headers   s
    
zJWE._merge_headersc                 C   sh   i }d| j v r(t| j d }| ||}d| j v rLt| j d }| ||}|rdt|}| ||}|S )Nr)   r*   )r-   r	   rI   )r   r+   jhphZuhZrhr   r   r    _get_jose_header   s    

zJWE._get_jose_headerc                 C   sT   | dd }|d u rtd| |}| dd }|d u rBtd| |}||fS )Nr   zMissing "alg" from headersr   zMissing "enc" from headers)getr   rA   rB   )r   rJ   Zalgnamer   Zencnamer   r   r   r    _get_alg_enc_from_headers   s    

zJWE._get_alg_enc_from_headersc           
      C   s   t | jdd}d| jv r2|dt | jd  7 }|d}|dd }|dkrft| jdd	 }n|d u rv| j}ntd
|| j	||\}}}	|| jd< || jd< |	| jd< d S )Nr)    r(   .r'   r   DEF   Unknown compressioniv
ciphertexttag)
r   r-   rM   r4   zlibcompressr.   r9   Zencryptr5   )
r   r   r   rJ   r(   rY   datarU   rV   rW   r   r   r    _encrypt   s    



zJWE._encryptc                 C   s  | j du rtdt| j ts&tdt|tr8t|}| |}| |\}}i }|r`||d< |||j	| j
|}|d | _
d|v r|d |d< d|v rt|dd}| ||d }	t|	|d< d	| jvr| ||| d
| jv r| jd
 | nd| jv sd| jv rzg | jd
< i }
d| jv r<| jd|
d< d| jv rX| jd|
d< | jd
 |
 | jd
 | n| j| dS )a  Encrypt the plaintext with the given key.

        :param key: A JWK key or password of appropriate type for the 'alg'
         provided in the JOSE Headers.
        :param header: A JSON string representing the per-recipient header.

        :raises ValueError: if the plaintext is missing or not of type bytes.
        :raises ValueError: if the compression type is unknown.
        :raises InvalidJWAAlgorithm: if the 'alg' provided in the JOSE
         headers is missing or unknown, or otherwise not implemented.
        NzMissing plaintextzPlaintext must be 'bytes'r+   r5   Zekencrypted_keyz{}rV   
recipients)r.   r9   r2   r3   r7   r
   rL   rN   wrapwrap_key_sizer5   r	   rM   rI   r-   r[   appendpopr1   )r   keyr+   rJ   r   r   recwrappedhZnhnr   r   r    r8      sB    






zJWE.add_recipientFc              	   C   s  d| j vrtd|rbdD ]}|| j v rtd| qd| j vrLtdn,t| j d }dD ]}||vr^td| q^d	| j v rt| j d	 d
krtd| j d	 d }n| j }d|v rt|d }t| j d }| ||}t|| j d< |  }| |\}	}
| |	|
| |d= d	t
| j d t
|ddt
| j d t
| j d t
| j d gS | j }t
|d t
|d t
| j d d}
d|v rt
|d |
d< d|v rt|d |
d< d|v rt
|d |
d< d	|v rFg |
d	< |d	 D ]L}i }d|v rt
|d |d< d|v r2t|d |d< |
d	 | qn4d|v r`t
|d |
d< d|v rzt|d |
d< t|
S dS )a  Serializes the object into a JWE token.

        :param compact(boolean): if True generates the compact
         representation, otherwise generates a standard JSON format.

        :raises InvalidJWEOperation: if the object cannot be serialized
         with the compact representation and `compact` is True.
        :raises InvalidJWEOperation: if no recipients have been added
         to the object.

        :return: A json formatted string or a compact representation string
        :rtype: `str`
        rV   No available ciphertext)r(   r*   z9Can't use compact encoding when the '%s' parameter is setr)   z4Can't use compact encoding without protected headers)r   r   z@Can't use compact encoding, '%s' must be in the protected headerr]      zInvalid number of recipientsr   r+   rP   r\   rO   rU   rW   )rV   rU   rW   r*   r(   N)r-   r=   r	   lenrI   r
   rL   rN   r[   joinr   rM   r`   )r   compactinvalidrK   requiredrc   re   ZnphrJ   r   r   objer   r   r    	serialize	  s    
















zJWE.serializec                 C   s>   |D ]4}|| j vr td| q| j | jstd| qd S )NzUnknown critical header: "%s"z!Unsupported critical header: "%s")r0   r   	supported)r   r   rH   r   r   r    _check_crita  s    
zJWE._check_critc
                 C   s:   | ||j||}
||
||||	}| jd |
| _|S )NSuccess)unwrapr_   decryptr6   r`   r5   )r   r   r   rb   Zenckeyr+   r(   rU   rV   rW   r5   rZ   r   r   r    _unwrap_decryptj  s
    zJWE._unwrap_decryptc                 C   s,  |  |dd }| |di  |D ]$}|| jv r(| j|| s(tdq(| |dd }| |dd }t| j	dd}d| j	v r|d	t| j	d  7 }|
d
}t|tr|}d| jv r|| jd }	|	std| jd |	}|D ]}
zL| |||
|dd||| j	d | j	d | j	d 	}| jd W  qW q ty } z4|
d|
 }| jd|t| W Y d }~qd }~0 0 qd| jvrtdn4| ||||dd||| j	d | j	d | j	d 	}|dd }|dkrt|tj | _n|d u r || _ntdd S )Nr+   r   zFailed header checkr   r   r)   rO   r(   rP   r'   r   zKey ID {} not in key setr\       rU   rV   rW   rs   zKey [{}] failed: [{}]zNo working key found in key setr   rQ   rT   )rL   rM   rr   r0   Zcheck_headerr   rA   rB   r   r-   r4   r2   r   jose_headerZget_keysr   formatrv   r6   r`   	ExceptionZ
thumbprintreprrX   
decompress	MAX_WBITSr.   r9   )r   rb   ZpperJ   hdrr   r   r(   rG   Zkid_keysrH   rZ   ro   ZkeyidrY   r   r   r    _decrypts  sd    












zJWE._decryptc                 C   s  d| j vrtdg | _d}d| j v r| j d D ]\}z| || W q0 ty } z.t|trbd}| jdt|  W Y d}~q0d}~0 0 q0nZz| || j  W nF ty } z.t|trd}| jdt|  W Y d}~n
d}~0 0 | j	s|rtdt
d	t| j dS )
a@  Decrypt a JWE token.

        :param key: The (:class:`jwcrypto.jwk.JWK`) decryption key.
        :param key: A (:class:`jwcrypto.jwk.JWK`) decryption key,
         or a (:class:`jwcrypto.jwk.JWKSet`) that contains a key indexed
         by the 'kid' header or (deprecated) a string containing a password.

        :raises InvalidJWEOperation: if the key is not a JWK object.
        :raises InvalidJWEData: if the ciphertext can't be decrypted or
         the object is otherwise malformed.
        :raises JWKeyNotFound: if key is a JWKSet and the key is not found.
        rV   rg   Fr]   TzFailed: [%s]NzKey Not found in JWKSetz%No recipient matched the provided key)r-   r=   r6   r   rz   r2   r   r`   r{   r.   r   )r   rb   Z
missingkeyrc   ro   r   r   r    ru     s0    


.
*zJWE.decryptc           
   
   C   sN  i | _ d| _d| _i }zz&t|}t|d |d< t|d |d< t|d |d< d|v rxt|d }|d|d< d|v rt|d |d< d|v rt|d |d< d	|v rg |d	< |d	 D ]F}i }d
|v rt|d
 |d
< d|v rt|d |d< |d	 | qn4d
|v r&t|d
 |d
< d|v r@t|d |d< W n ty } z|	d}t
|dkrtt |t|d }|d|d< t|d }	|	dkrt|d |d
< t|d |d< t|d |d< t|d |d< W Y d}~n
d}~0 0 || _ W n6 ty8 } ztdt||W Y d}~n
d}~0 0 |rJ| | dS )a  Deserialize a JWE token.

        NOTE: Destroys any current status and tries to import the raw
        JWE provided.

        If a key is provided a decryption step will be attempted after
        the object is successfully deserialized.

        :param raw_jwe: a 'raw' JWE token (JSON Encoded or Compact
         notation) string.
        :param key: A (:class:`jwcrypto.jwk.JWK`) decryption key,
         or a (:class:`jwcrypto.jwk.JWKSet`) that contains a key indexed
         by the 'kid' header or (deprecated) a string containing a password
         (optional).

        :raises InvalidJWEData: if the raw object is an invalid JWE token.
        :raises InvalidJWEOperation: if the decryption fails.
        NrU   rV   rW   r)   r'   r*   r(   r]   r\   r+   rP      r   rh   rw   rR         zInvalid format)r-   r.   r5   r	   r   decoder
   r`   r9   splitri   r   rz   r{   ru   )
r   Zraw_jwerb   oZdjweprc   ro   rZ   Zekeyr   r   r    deserialize  sb    






&
&zJWE.deserializec                 C   s   | j std| j S )NzPlaintext not available)r.   r=   rC   r   r   r    payload$  s    zJWE.payloadc                 C   s*   |  | jd}t|dkr&td|S )Nr+   r   zJOSE Header not available)rL   r-   rM   ri   r=   )r   rJ   r   r   r    rx   *  s    zJWE.jose_headerc                 C   s   |  }| | |S )a  Creates a JWE object from a serialized JWE token.

        :param token: A string with the json or compat representation
         of the token.

        :raises InvalidJWEData: if the raw object is an invalid JWE token.

        :return: A JWE token
        :rtype: JWE
        )r   )clstokenrn   r   r   r    from_jose_token1  s    
zJWE.from_jose_tokenc                 C   sl   t |tsdS z|  | kW S  tyf   d| ji}|| j d|ji}||j ||k Y S 0 d S )NFr.   )r2   r&   rp   rz   r.   r1   r-   )r   otherZdata1Zdata2r   r   r    __eq__B  s    


z
JWE.__eq__c                 C   s*   z
|   W S  ty$   |   Y S 0 d S )N)rp   rz   __repr__rC   r   r   r    __str__N  s    
zJWE.__str__c              	   C   s   zd|    dW S  ty   t| j}| jd}| jd}| jd}| j}d| dd| d d	| d d
| d| d  Y S 0 d S )NzJWE.from_json_token("z")r)   r*   r(   zJWE(plaintext=z, z
protected=zunprotected=zaad=z, algs=))rp   rz   r{   r.   r-   rM   r,   )r   r.   r)   r*   r(   r:   r   r   r    r   T  s    



zJWE.__repr__)NNNNNNNN)N)N)F)N)r!   r"   r#   r$   r   rA   rB   propertyrD   setterrI   rL   rN   r[   r8   rp   rr   rv   r   ru   r   r   rx   classmethodr   r   r   r   r   r   r   r    r&   J   s>      
1



7
X		<)
L


r&   )rX   Zjwcryptor   Zjwcrypto.commonr   r   r   r   r   r   r	   r
   Zjwcrypto.jwar   Zjwcrypto.jwkr   r/   r<   r   ZInvalidCEKeyLengthZInvalidJWEKeyLengthZInvalidJWEKeyTyper=   r&   r   r   r   r    <module>   s@   