U
    ÓZjÇ$  ã                   @   sæ   d Z ddlZddlZddlZddlZ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mZmZ e e¡ZG d	d
„ d
ejƒZejG dd„ deƒƒZejG dd„ deƒƒZejG dd„ deƒƒZdS )úJSON Web Key.é    N)Údefault_backend)Úhashes)Úserialization)Úec)Úrsa)ÚerrorsÚ	json_utilÚutilc                   @   sd   e Zd ZdZdZi ZdZeZddddœZ	e
jfdd	„Zejd
d„ ƒZeddd„ƒZeddd„ƒZdS )ÚJWKr   Zkty© N)ú,ú:T)ÚindentÚ
separatorsÚ	sort_keysc              	      sP   t j|ƒ tƒ d�}| tjt‡ fdd„t ˆ  	¡ ¡D ƒƒfˆ j
Ž ¡ ¡ | ¡ S )zgCompute JWK Thumbprint.

        https://tools.ietf.org/html/rfc7638

        :returns: bytes

        )Úbackendc                 3   s$   | ]\}}|ˆ j kr||fV  qd S ©N)Úrequired)Ú.0ÚkÚv©Úselfr   úM/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/josepy/jwk.pyÚ	<genexpr>3   s    
ÿz!JWK.thumbprint.<locals>.<genexpr>)r   ZHashr   ÚupdateÚjsonÚdumpsÚdictÚsixÚ	iteritemsÚto_jsonÚ_thumbprint_json_dumps_paramsÚencodeÚfinalize)r   Zhash_functionÚdigestr   r   r   Ú
thumbprint)   s    ÿý
zJWK.thumbprintc                 C   s
   t ƒ ‚dS )ziGenerate JWK with public key.

        For symmetric cryptosystems, this would return ``self``.

        N©ÚNotImplementedErrorr   r   r   r   Ú
public_key8   s    zJWK.public_keyc                 C   sÚ   |d krt ƒ n|}i }tjtjfD ]L}z||||ƒW   S  tttjjfk
rl } z|||< W 5 d }~X Y q"X q"tj	tj
fD ]H}z|||ƒW   S  ttjjfk
rÂ } z|||< W 5 d }~X Y q|X q|t d |¡¡‚d S )NzUnable to deserialize key: {0})r   r   Zload_pem_private_keyZload_der_private_keyÚ
ValueErrorÚ	TypeErrorÚcryptographyÚ
exceptionsZUnsupportedAlgorithmZload_pem_public_keyZload_der_public_keyr   ÚErrorÚformat)ÚclsÚdataÚpasswordr   r.   ÚloaderÚerrorr   r   r   Ú_load_cryptography_keyA   s*    ÿÿÿÿzJWK._load_cryptography_keyc              
   C   sÀ   z|   |||¡}W n> tjk
rP } zt d|¡ t|d� W Y ¢S d}~X Y nX | jtk	r~t|| j	ƒs~t d 
|j| j¡¡‚t | j¡D ]}t||j	ƒrŠ||d�  S qŠt d 
|j¡¡‚dS )a°  Load serialized key as JWK.

        :param str data: Public or private key serialized as PEM or DER.
        :param str password: Optional password.
        :param backend: A `.PEMSerializationBackend` and
            `.DERSerializationBackend` provider.

        :raises errors.Error: if unable to deserialize, or unsupported
            JWK algorithm

        :returns: JWK of an appropriate type.
        :rtype: `JWK`

        z,Loading symmetric key, asymmetric failed: %s©ÚkeyNz"Unable to deserialize {0} into {1}zUnsupported algorithm: {0})r6   r   r/   ÚloggerÚdebugÚJWKOctÚtypÚNotImplementedÚ
isinstanceÚcryptography_key_typesr0   Ú	__class__r    Ú
itervaluesÚTYPES)r1   r2   r3   r   r8   r5   Zjwk_clsr   r   r   Úload[   s"      ÿ ÿzJWK.load)NN)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Útype_field_namerB   r?   r=   r   r#   r   ÚSHA256r'   ÚabcÚabstractmethodr*   Úclassmethodr6   rC   r   r   r   r   r      s    ù

r   c                   @   sJ   e Zd ZdZdZejejfZde	j
ddfZdd„ Zedd	„ ƒZd
d„ ZdS )ÚJWKESz<ES JWK.

    .. warning:: This is not yet implemented!

    ÚESZcrvÚxÚyc                 C   s
   t ƒ ‚d S r   r(   r   r   r   r   Úfields_to_partial_jsonˆ   s    zJWKES.fields_to_partial_jsonc                 C   s
   t ƒ ‚d S r   r(   ©r1   Újobjr   r   r   Úfields_from_json‹   s    zJWKES.fields_from_jsonc                 C   s
   t ƒ ‚d S r   r(   r   r   r   r   r*   �   s    zJWKES.public_keyN)rD   rE   rF   rG   r<   r   ZEllipticCurvePublicKeyZEllipticCurvePrivateKeyr?   r   rH   r   rQ   rL   rT   r*   r   r   r   r   rM   {   s    ÿ
rM   c                   @   s>   e Zd ZdZdZdZdejfZdd„ Z	e
dd„ ƒZd	d
„ ZdS )r;   zSymmetric JWK.Úoctr7   r   c                 C   s   dt  | j¡iS )Nr   )r	   Úencode_b64joser8   r   r   r   r   rQ   š   s    zJWKOct.fields_to_partial_jsonc                 C   s   | t  |d ¡d�S )Nr   r7   )r	   Údecode_b64joserR   r   r   r   rT   ¡   s    zJWKOct.fields_from_jsonc                 C   s   | S r   r   r   r   r   r   r*   ¥   s    zJWKOct.public_keyN)rD   rE   rF   rG   r<   Ú	__slots__r   rH   r   rQ   rL   rT   r*   r   r   r   r   r;   “   s   

r;   c                       st   e Zd ZdZdZejejfZdZ	de
jdfZ‡ fdd„Zedd	„ ƒZed
d„ ƒZdd„ Zedd„ ƒZdd„ Z‡  ZS )ÚJWKRSAzîRSA JWK.

    :ivar key: :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey`
        or :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey` wrapped
        in :class:`~josepy.util.ComparableRSAKey`

    ZRSAr7   ÚeÚnc                    s@   d|kr*t |d tjƒs*t |d ¡|d< tt| ƒj||Ž d S )Nr8   )r>   r
   ZComparableRSAKeyÚsuperrY   Ú__init__)r   ÚargsÚkwargs©r@   r   r   r]   ·   s    
 ÿzJWKRSA.__init__c                 C   s.   dd„ }t  t |t|ƒdd…  d¡ƒ¡¡S )zQEncode Base64urlUInt.

        :type data: long
        :rtype: unicode

        c                 S   s   t | ƒd rd|  S | S )Né   Ú0)Úlen)Úargr   r   r   Ú_leading_zerosÅ   s    z,JWKRSA._encode_param.<locals>._leading_zerosra   NÚL)r	   rV   ÚbinasciiÚ	unhexlifyÚhexÚrstrip)r1   r2   re   r   r   r   Ú_encode_param½   s    ÿzJWKRSA._encode_paramc                 C   s:   zt t t |¡¡dƒW S  tk
r4   t ¡ ‚Y nX dS )zDecode Base64urlUInt.é   N)Úintrg   Úhexlifyr	   rW   r+   r   ZDeserializationError)r1   r2   r   r   r   Ú_decode_paramÍ   s    zJWKRSA._decode_paramc                 C   s   t | ƒ| j ¡ d�S )Nr7   )Útyper8   r*   r   r   r   r   r*   Õ   s    zJWKRSA.public_keyc              	      s@  ‡ ‡fdd„dD ƒ\}}t j||d�}dˆkr<| tƒ ¡}núˆ  ˆd ¡}dˆkszdˆkszdˆkszd	ˆkszd
ˆkszdˆkrât‡fdd„dD ƒƒ \}}}	}
}}tdd„ |D ƒƒrÀt d |¡¡‚t‡ fdd„|D ƒƒ\}}}	}
}n6t  	|||¡\}}t  
||¡}	t  ||¡}
t  ||¡}t  ||||	|
||¡ tƒ ¡}ˆ |d�S )Nc                 3   s   | ]}ˆ   ˆ| ¡V  qd S r   ©ro   ©r   rO   rR   r   r   r   Û   s     z*JWKRSA.fields_from_json.<locals>.<genexpr>©r[   rZ   )rZ   r[   ÚdÚpÚqÚdpÚdqÚqiZothc                 3   s   | ]}ˆ   |¡V  qd S r   )Úgetrr   )rS   r   r   r   è   s    )ru   rv   rw   rx   ry   c                 s   s   | ]}|d kr|V  qd S r   r   )r   Úparamr   r   r   r   ê   s      z(Some private parameters are missing: {0}c                 3   s   | ]}ˆ   |¡V  qd S r   rq   rr   )r1   r   r   r   î   s    r7   )r   ZRSAPublicNumbersr*   r   ro   Útupler   r/   r0   Zrsa_recover_prime_factorsZrsa_crt_dmp1Zrsa_crt_dmq1Zrsa_crt_iqmpZRSAPrivateNumbersZprivate_key)r1   rS   r[   rZ   Úpublic_numbersr8   rt   ru   rv   rw   rx   ry   Ú
all_paramsr   rR   r   rT   Ø   sP    ÿÿÿÿÿÿÿ      ÿþzJWKRSA.fields_from_jsonc              	      s„   t ˆ jjtjƒr*ˆ j ¡ }|j|jdœ}n>ˆ j ¡ }ˆ j 	¡  ¡ }|j|j|j
|j|j|j|j|jdœ}t‡ fdd„t |¡D ƒƒS )Nrs   )r[   rZ   rt   ru   rv   rw   rx   ry   c                 3   s    | ]\}}|ˆ   |¡fV  qd S r   )rk   )r   r8   Úvaluer   r   r   r     s   ÿz0JWKRSA.fields_to_partial_json.<locals>.<genexpr>)r>   r8   Z_wrappedr   ÚRSAPublicKeyr}   r[   rZ   Zprivate_numbersr*   rt   ru   rv   Zdmp1Zdmq1Ziqmpr   r    r!   )r   ÚnumbersÚparamsÚprivateÚpublicr   r   r   rQ   ÿ   s&    
þ
ø
ÿzJWKRSA.fields_to_partial_json)rD   rE   rF   rG   r<   r   r€   ZRSAPrivateKeyr?   rX   r   rH   r   r]   rL   rk   ro   r*   rT   rQ   Ú__classcell__r   r   r`   r   rY   ©   s   


&rY   )rG   rJ   rg   r   ÚloggingZcryptography.exceptionsr-   r    Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   Zjosepyr   r	   r
   Ú	getLoggerrD   r9   ZTypedJSONObjectWithFieldsr   ÚregisterrM   r;   rY   r   r   r   r   Ú<module>   s(   
g