o
    <‘ði“c  ã                   @   s\  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 d	Zd
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)ÚJWKSeti   i  @Ú	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 TypeÚCritical)ÚalgÚencÚzipÚjkuÚjwkÚkidÚx5uÚx5cÚx5tzx5t#S256ÚtypÚctyÚcrit)zRSA-OAEPzRSA-OAEP-256ÚA128KWÚA192KWÚA256KWÚdirzECDH-ESzECDH-ES+A128KWzECDH-ES+A192KWzECDH-ES+A256KWÚ	A128GCMKWÚ	A192GCMKWÚ	A256GCMKWzPBES2-HS256+A128KWzPBES2-HS384+A192KWzPBES2-HS512+A256KWzA128CBC-HS256zA192CBC-HS384zA256CBC-HS512ÚA128GCMÚA192GCMÚ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__© úK/root/parts/websockify/install/lib/python3.10/site-packages/jwcrypto/jwe.pyr)   <   s   zInvalidJWEData.__init__)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   Ú__classcell__r0   r0   r.   r1   r&   5   s    r&   c                   @   sì   e Zd ZdZ			d1dd„Zdd„ Zdd	„ Zed
d„ ƒZej	dd„ ƒZdd„ Z
d2dd„Zdd„ Zdd„ Zd2dd„Zd3dd„Zdd„ Zdd„ Zefdd„Zd4d!d"„Zd2d#d$„Zed%d&„ ƒZed'd(„ ƒZed)d*„ ƒZd+d,„ Zd-d.„ Zd/d0„ ZdS )5ÚJWEzGJSON Web Encryption object

    This object represent a JWE token.
    NTc
           
      C   sö   d| _ i | _d| _ttƒ| _|	| _|r| j |¡ |dur,t|t	ƒr&|| _n| 
d¡| _d| _d| _|r9|| jd< |rNt|tƒrEt|ƒ}nt|ƒ || jd< |rct|tƒrZt|ƒ}nt|ƒ || jd< |rh|| _ |rs| j||d� dS |rytdƒ‚dS )aŽ  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
        :param flattened: Use flattened serialization syntax (default True)
        Núutf-8ÚaadÚ	protectedÚunprotected)Úheaderz-Header is allowed only with default recipient)Ú_allowed_algsÚobjectsÚ	plaintextr   ÚJWEHeaderRegistryÚheader_registryÚ	flattenedÚupdateÚ
isinstanceÚbytesÚencodeÚcekÚ
decryptlogÚdictr
   r	   Úadd_recipientÚ
ValueError)
r*   r?   r:   r;   r9   ÚalgsÚ	recipientr<   rA   rB   r0   r0   r1   r)   T   s@   








ÿzJWE.__init__c                 C   ó$   | j pt}||vrtdƒ‚t |¡S ©NzAlgorithm not allowed)r=   Údefault_allowed_algsÚInvalidJWEOperationr   Úkeymgmt_alg©r*   ÚnameÚallowedr0   r0   r1   Ú_jwa_keymgmt‡   ó   

zJWE._jwa_keymgmtc                 C   rN   rO   )r=   rP   rQ   r   Úencryption_algrS   r0   r0   r1   Ú_jwa_enc�   rW   zJWE._jwa_encc                 C   s   | j r| j S tS )z‚Allowed algorithms.

        The list of allowed algorithms.
        Can be changed by setting a list of algorithm names.
        )r=   rP   ©r*   r0   r0   r1   Úallowed_algs“   s   zJWE.allowed_algsc                 C   s   t |tƒs	tdƒ‚|| _d S )NzAllowed Algs must be a list)rD   ÚlistÚ	TypeErrorr=   )r*   rL   r0   r0   r1   r[       s   

c                 C   s4   t | ¡ ƒD ]}||v rtd| ƒ‚q| |¡ |S )NzDuplicate header: "%s")r\   Úkeysr&   rC   )r*   Úh1Úh2Úkr0   r0   r1   Ú_merge_headers¦   s   ÿ
zJWE._merge_headersc                 C   sh   i }d| j v rt| j d ƒ}|  ||¡}d| j v r&t| j d ƒ}|  ||¡}|r2t|ƒ}|  ||¡}|S )Nr:   r;   )r>   r	   rb   )r*   r<   ÚjhÚphÚuhÚrhr0   r0   r1   Ú_get_jose_header­   s   

zJWE._get_jose_headerc                 C   sT   |  dd ¡}|d u rtdƒ‚|  |¡}|  dd ¡}|d u r!tdƒ‚|  |¡}||fS )Nr   zMissing "alg" from headersr   zMissing "enc" from headers)Úgetr&   rV   rY   )r*   rc   Úalgnamer   Úencnamer   r0   r0   r1   Ú_get_alg_enc_from_headersº   s   

zJWE._get_alg_enc_from_headersc           
      C   s¶   t | j dd¡ƒ}d| jv r|dt | jd ƒ 7 }| d¡}| dd ¡}|dkr3t | j¡dd	… }n|d u r;| j}ntd
ƒ‚| | j	||¡\}}}	|| jd< || jd< |	| jd< d S )Nr:   Ú r9   Ú.r8   r   ÚDEFé   éüÿÿÿúUnknown compressionÚivÚ
ciphertextÚtag)
r   r>   rh   rF   ÚzlibÚcompressr?   rK   ÚencryptrG   )
r*   r   r   rc   r9   rv   Údatarr   rs   rt   r0   r0   r1   Ú_encryptÅ   s   



zJWE._encryptc                 C   sœ  | j du r	tdƒ‚t| j tƒstdƒ‚t|tƒrt|ƒ}|  |¡}|  |¡\}}i }|r0||d< | ||j	| j
|¡}|d | _
d|v rI|d |d< d|v rct| dd¡ƒ}|  ||d ¡}	t|	ƒ|d< d	| jvro|  |||¡ d
| jv r~| jd
  |¡ dS | jrÆd| jv s‹d| jv r¾g | jd
< i }
d| jv rŸ| j d¡|
d< d| jv r¬| j d¡|
d< | jd
  |
¡ | jd
  |¡ dS | j |¡ dS |g| jd
< 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<   rG   ÚekÚencrypted_keyz{}rs   Ú
recipients)r?   rK   rD   rE   rI   r
   rg   rk   ÚwrapÚwrap_key_sizerG   r	   rh   rb   r>   ry   ÚappendrB   ÚpoprC   )r*   Úkeyr<   rc   r   r   ÚrecÚwrappedÚhÚnhÚnr0   r0   r1   rJ   Ø   sF   








zJWE.add_recipientFc              	   C   sz  d| j vr	tdƒ‚|r®dD ]}|| j v rtd| ƒ‚qd| j vr$tdƒ‚t| j d ƒ}dD ]}||vr9td| ƒ‚q-d	| j v rTt| j d	 ƒd
krLt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 rÐt
|d ƒ|
d< d|v rÜt|d ƒ|
d< d|v rèt
|d ƒ|
d< d	|v �rg |
d	< |d	 D ]%}i }d|v �rt
|d ƒ|d< d|v �rt|d ƒ|d< |
d	  |¡ qõt|
ƒS d|v �r,t
|d ƒ|
d< d|v �r9t|d ƒ|
d< t|
ƒ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`
        rs   úNo available ciphertext)r9   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<   rm   r{   rl   rr   rt   )rs   rr   rt   r;   r9   )r>   rQ   r	   Úlenrb   r
   rg   rk   ry   Újoinr   rh   r   )r*   ÚcompactÚinvalidrd   Úrequiredr‚   r„   Únphrc   r   r   ÚobjÚer0   r0   r1   Ú	serialize  s�   

ÿÿÿ
ÿÿÿÿ
ü

þ


ÿ

û
ÿ
zJWE.serializec                 C   s<   |D ]}|| j vrtd| ƒ‚| j | jstd| ƒ‚qd S )NzUnknown critical header: "%s"z!Unsupported critical header: "%s")rA   r&   Ú	supported)r*   r   ra   r0   r0   r1   Ú_check_critj  s   
ÿÿüzJWE._check_critc
                 C   s:   |  ||j||¡}
| |
||||	¡}| j d¡ |
| _|S )NÚSuccess)Úunwrapr~   ÚdecryptrH   r   rG   )r*   r   r   r�   Úenckeyr<   r9   rr   rs   rt   rG   rx   r0   r0   r1   Ú_unwrap_decrypts  s
   zJWE._unwrap_decryptc                 C   sv  |   | dd ¡¡}|  | di ¡¡ |D ]}|| jv r&| j || ¡s&tdƒ‚q|  | dd ¡¡}|  | dd ¡¡}t| j	 dd¡ƒ}d| j	v rR|d	t| j	d ƒ 7 }| 
d
¡}t|tƒrÑ|}	d| jv ry| | jd ¡}
|
swtd | jd ¡ƒ‚|
}	|	D ]K}z#|  |||| dd¡||| j	d | j	d | j	d ¡	}| j d¡ W  n& tyÆ } z| d| ¡ ¡}| j d |t|ƒ¡¡ W Y d }~q{d }~ww d| jvrÐtdƒ‚n|  |||| dd¡||| j	d | j	d | j	d ¡	}| dd ¡}|dk�r-t|ƒtk�rtddt› d� ƒ‚tjtj d�}| ||¡| _|j�s|j�s+d | _tdd|› d� ƒ‚d S |d u �r7|| _d S t dƒ‚)Nr<   r   zFailed header checkr   r   r:   rl   r9   rm   r8   r   zKey ID {} not in key setr{   ó    rr   rs   rt   r”   zKey [{}] failed: [{}]zNo working key found in key setr   rn   z+Compressed data exceeds maximum allowedsizez (ú))Úwbitsz2Compressed data exceeds maximum allowedoutput sizerq   )!rg   rh   r“   rA   Úcheck_headerr&   rV   rY   r   r>   rF   rD   r   Újose_headerÚget_keysr   Úformatr˜   rH   r   Ú	ExceptionÚ
thumbprintÚreprr‰   Údefault_max_compressed_sizeru   ÚdecompressobjÚ	MAX_WBITSÚ
decompressr?   Úunconsumed_tailÚeofrK   )r*   r�   ÚppeÚmax_plaintextrc   Úhdrr   r   r9   r^   Úkid_keysra   rx   r�   Úkeyidrv   Údor0   r0   r1   Ú_decrypt|  sŠ   
€



ÿ

ü
ÿ€þ
ÿ

ü

ÿÿ
ÿÿþ

zJWE._decryptr   c                 C   s*  d| _ |dkr	t}d| jvrtdƒ‚g | _d}d| jv rR| jd D ]/}z
| j|||d� W q! tyP } zt|tƒr<d}| j 	d	t
|ƒ ¡ W Y d}~q!d}~ww n/z| j|| j|d� W n# ty€ } zt|tƒrld}| j 	d	t
|ƒ ¡ W Y d}~nd}~ww | j s“|rŠtd
ƒ‚tdt
| jƒ ƒ‚dS )a9  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.
        :param max_plaintext: Maximum plaintext size allowed, 0 means
         the library default applies. Application writers are recommended
         to set a limit here if they know what is the max plaintext size
         for their application.

        :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.
        Nr   rs   r‡   Fr|   )rª   TzFailed: [%s]zKey Not found in JWKSetz%No recipient matched the provided key)r?   Údefault_max_plaintext_sizer>   rQ   rH   r¯   r    rD   r   r   r¢   r&   )r*   r�   rª   Ú
missingkeyr‚   r�   r0   r0   r1   r–   Â  sB   


 €ýý
 €ýÿýzJWE.decryptc           
   
   C   s6  i | _ d| _d| _i }zîz�t|ƒ}t|d ƒ|d< t|d ƒ|d< t|d ƒ|d< d|v r:t|d ƒ}| d¡|d< d|v rFt|d ƒ|d< d|v rRt|d ƒ|d< d	|v rƒg |d	< |d	 D ]#}i }d
|v rnt|d
 ƒ|d
< d|v rzt|d ƒ|d< |d	  |¡ q^nd
|v r�t|d
 ƒ|d
< d|v r›t|d ƒ|d< W nX tyô } zL| 	d¡}t
|ƒdkr³tƒ |‚t|d ƒ}| d¡|d< t|d ƒ}	|	dkrÒt|d ƒ|d
< t|d ƒ|d< t|d ƒ|d< t|d ƒ|d< W Y d}~nd}~ww || _ W n t�y } ztdt|ƒƒ|‚d}~ww |�r|  |¡ dS 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.
        Nrr   rs   rt   r:   r8   r;   r9   r|   r{   r<   rm   é   r   rˆ   r™   ro   é   é   zInvalid format)r>   r?   rG   r	   r   Údecoder
   r   rK   Úsplitr‰   r&   r    r¢   r–   )
r*   Úraw_jwer�   ÚoÚdjweÚpr‚   r�   rx   Úekeyr0   r0   r1   Údeserializeó  sp   
ÿù	
ÿ€
€õ
€ÿÿzJWE.deserializec                 C   s   | j stdƒ‚| j S )NzPlaintext not available)r?   rQ   rZ   r0   r0   r1   Úpayload?  s   zJWE.payloadc                 C   s*   |   | j d¡¡}t|ƒdkrtdƒ‚|S )Nr<   r   zJOSE Header not available)rg   r>   rh   r‰   rQ   )r*   rc   r0   r0   r1   r�   E  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Útokenr�   r0   r0   r1   Úfrom_jose_tokenL  s   
zJWE.from_jose_tokenc                 C   sh   t |tƒsdS z	|  ¡ | ¡ kW S  ty3   d| ji}| | j¡ d|ji}| |j¡ ||k Y S w )NFr?   )rD   r7   r‘   r    r?   rC   r>   )r*   ÚotherÚdata1Údata2r0   r0   r1   Ú__eq__]  s   


ûz
JWE.__eq__c                 C   s&   z|   ¡ W S  ty   |  ¡  Y S w ©N)r‘   r    Ú__repr__rZ   r0   r0   r1   Ú__str__i  s
   
ÿzJWE.__str__c              	   C   s�   z	d|   ¡ › d�W S  tyG   t| jƒ}| j d¡}| j d¡}| j d¡}| j}d|› d�d|› d� d	|› d� d
|› d|› d�  Y S w )NzJWE.from_json_token("z")r:   r;   r9   zJWE(plaintext=z, z
protected=zunprotected=zaad=z, algs=rš   )r‘   r    r¢   r?   r>   rh   r=   )r*   r?   r:   r;   r9   rL   r0   r0   r1   rÆ   o  s    


ÿ
þýúzJWE.__repr__)	NNNNNNNNTrÅ   )F)r   )r2   r3   r4   r5   r)   rV   rY   Úpropertyr[   Úsetterrb   rg   rk   ry   rJ   r‘   r“   r˜   r°   r¯   r–   r¼   r½   r�   ÚclassmethodrÀ   rÄ   rÇ   rÆ   r0   r0   r0   r1   r7   N   s@    
þ3




:X		
F
1L


r7   )ru   Újwcryptor   Újwcrypto.commonr   r   r   r   r   r   r	   r
   Újwcrypto.jwar   Újwcrypto.jwkr   r£   r°   r@   rP   r&   ÚInvalidCEKeyLengthÚInvalidJWEKeyLengthÚInvalidJWEKeyTyperQ   r7   r0   r0   r0   r1   Ú<module>   sJ   ÿÿñ