U
    DbX3                     @   s  d dl Z d dlZd dlZddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZmZ zd dlmZ d dlmZmZmZ d dlmZmZmZmZmZmZ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,W n e-k
r   dZ,Y nX e.ddddddddddg
Z/dd Z0G dd de1Z2G dd de2Z3G dd  d e2Z4e,rG d!d" d"e2Z5G d#d$ d$e2Z6G d%d& d&e5Z7dS )'    N   )constant_time_comparestring_typesInvalidKeyError)
base64url_decodebase64url_encodeder_to_raw_signatureforce_bytesforce_unicodefrom_base64url_uintraw_to_der_signatureto_base64url_uintis_pem_format
is_ssh_key)hashes)load_pem_private_keyload_pem_public_keyload_ssh_public_key)RSAPrivateKeyRSAPublicKeyRSAPrivateNumbersRSAPublicNumbersrsa_recover_prime_factorsrsa_crt_dmp1rsa_crt_dmq1rsa_crt_iqmp)EllipticCurvePrivateKeyEllipticCurvePublicKey)ecpadding)default_backend)InvalidSignatureTFRS256RS384RS512ES256ES384ES521ES512PS256PS384PS512c                  C   s   t  ttjttjttjd} tr| ttjttjttjttjttjttjttjt	t	jt	t	jt	t	jd
 | S )zE
    Returns the algorithms that are implemented by the library.
    )ZnoneZHS256ZHS384ZHS512)
r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   )
NoneAlgorithmHMACAlgorithmSHA256SHA384SHA512
has_cryptoupdateRSAAlgorithmECAlgorithmRSAPSSAlgorithm)Zdefault_algorithms r7   0/usr/lib/python3/dist-packages/jwt/algorithms.pyget_default_algorithms'   s&    r9   c                   @   s@   e Zd ZdZdd Zdd Zdd Zedd	 Zed
d Z	dS )	AlgorithmzH
    The interface for an algorithm used to sign and verify tokens.
    c                 C   s   t dS )z
        Performs necessary validation and conversions on the key and returns
        the key value in the proper format for sign() and verify().
        NNotImplementedErrorselfkeyr7   r7   r8   prepare_keyG   s    zAlgorithm.prepare_keyc                 C   s   t dS )zn
        Returns a digital signature for the specified message
        using the specified key value.
        Nr;   r>   msgr?   r7   r7   r8   signN   s    zAlgorithm.signc                 C   s   t dS )zz
        Verifies that the specified digital signature is valid
        for the specified message and key values.
        Nr;   r>   rB   r?   sigr7   r7   r8   verifyU   s    zAlgorithm.verifyc                 C   s   t dS )z7
        Serializes a given RSA key into a JWK
        Nr;   key_objr7   r7   r8   to_jwk\   s    zAlgorithm.to_jwkc                 C   s   t dS )zb
        Deserializes a given RSA key from JWK back into a PublicKey or PrivateKey object
        Nr;   )jwkr7   r7   r8   from_jwkc   s    zAlgorithm.from_jwkN)
__name__
__module____qualname____doc__r@   rC   rF   staticmethodrI   rK   r7   r7   r7   r8   r:   C   s   
r:   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r-   zZ
    Placeholder for use when no signing or verification
    operations are required.
    c                 C   s    |dkrd }|d k	rt d|S )N z*When alg = "none", key value must be None.r   r=   r7   r7   r8   r@   p   s
    zNoneAlgorithm.prepare_keyc                 C   s   dS )N    r7   rA   r7   r7   r8   rC   y   s    zNoneAlgorithm.signc                 C   s   dS )NFr7   rD   r7   r7   r8   rF   |   s    zNoneAlgorithm.verifyN)rL   rM   rN   rO   r@   rC   rF   r7   r7   r7   r8   r-   k   s   	r-   c                   @   sZ   e Zd ZdZejZejZej	Z
dd Zdd Zedd Zedd	 Zd
d Zdd ZdS )r.   zf
    Performs signing and verification operations using HMAC
    and the specified hash function.
    c                 C   s
   || _ d S Nhash_algr>   rU   r7   r7   r8   __init__   s    zHMACAlgorithm.__init__c                 C   s$   t |}t|st|r td|S )NzdThe specified key is an asymmetric key or x509 certificate and should not be used as an HMAC secret.)r
   r   r   r   r=   r7   r7   r8   r@      s    zHMACAlgorithm.prepare_keyc                 C   s   t ttt| ddS )Noct)kkty)jsondumpsr   r   r
   rG   r7   r7   r8   rI      s    zHMACAlgorithm.to_jwkc                 C   s,   t | }|ddkr tdt|d S )NrZ   rX   zNot an HMAC keyrY   )r[   loadsgetr   r   )rJ   objr7   r7   r8   rK      s    
zHMACAlgorithm.from_jwkc                 C   s   t ||| j S rS   )hmacnewrU   ZdigestrA   r7   r7   r8   rC      s    zHMACAlgorithm.signc                 C   s   t || ||S rS   )r   rC   rD   r7   r7   r8   rF      s    zHMACAlgorithm.verifyN)rL   rM   rN   rO   hashlibZsha256r/   Zsha384r0   Zsha512r1   rW   r@   rP   rI   rK   rC   rF   r7   r7   r7   r8   r.      s   


r.   c                   @   sZ   e Zd ZdZejZejZejZdd Zdd Z	e
dd Ze
dd	 Zd
d Zdd ZdS )r4   z~
        Performs signing and verification operations using
        RSASSA-PKCS-v1_5 and the specified hash function.
        c                 C   s
   || _ d S rS   rT   rV   r7   r7   r8   rW      s    zRSAAlgorithm.__init__c                 C   s   t |tst |tr|S t |tr~t|}z.|drFt|t d}nt|d t d}W q t	k
rz   t
|t d}Y qX ntd|S )Ns   ssh-rsabackendZpasswordrd   Expecting a PEM-formatted key.)
isinstancer   r   r   r
   
startswithr   r!   r   
ValueErrorr   	TypeErrorr=   r7   r7   r8   r@      s    


zRSAAlgorithm.prepare_keyc                 C   s   d }t | dd r|  }ddgtt|jjtt|jjtt|jtt|jtt|j	tt|j
tt|jtt|jd
}nBt | dd r|  }ddgtt|jtt|jd}ntdt|S )Nprivate_numbersRSArC   )
rZ   key_opsnedpqdpdqqirF   )rZ   rm   rn   ro   Not a public or private key)getattrrk   r   r   public_numbersrn   ro   rp   rq   rr   dmp1dmq1iqmpr   r[   r\   )rH   r_   numbersr7   r7   r8   rI      s.    zRSAAlgorithm.to_jwkc           	   	      s  zt |  W n tk
r*   tdY nX  ddkrBtdd krhd krhd krhd krptd	d
ddddg} fdd|D }t|}|rt|stdtt d t d }|rt	t d t d
 t d t d t d t d |d}nHt d }t
|j||j\}}t	|||t||t||t|||d}|t S d krd krtt d t d }|t S tdd S )NzKey is not valid JSONrZ   rl   zNot an RSA keyrp   ro   rn   Zothz5Unsupported RSA private key: > 2 primes not supportedrq   rr   rs   rt   ru   c                    s   g | ]}| kqS r7   r7   ).0Zpropr_   r7   r8   
<listcomp>  s     z)RSAAlgorithm.from_jwk.<locals>.<listcomp>z@RSA key must include all parameters if any are present besides d)rp   rq   rr   ry   rz   r{   rx   rv   )r[   r]   ri   r   r^   anyallr   r   r   r   rn   ro   r   r   r   Zprivate_keyr!   Z
public_key)	rJ   Zother_propsZprops_foundZany_props_foundrx   r|   rp   rq   rr   r7   r~   r8   rK      sf    
 







  

 
zRSAAlgorithm.from_jwkc                 C   s   | |t |  S rS   )rC   r    PKCS1v15rU   rA   r7   r7   r8   rC   2  s    zRSAAlgorithm.signc                 C   s:   z| ||t |   W dS  tk
r4   Y dS X d S )NTF)rF   r    r   rU   r"   rD   r7   r7   r8   rF   5  s
    zRSAAlgorithm.verifyN)rL   rM   rN   rO   r   r/   r0   r1   rW   r@   rP   rI   rK   rC   rF   r7   r7   r7   r8   r4      s   
#
>r4   c                   @   sB   e Zd ZdZejZejZejZdd Zdd Z	dd Z
dd	 Zd
S )r5   zr
        Performs signing and verification operations using
        ECDSA and the specified hash function
        c                 C   s
   || _ d S rS   rT   rV   r7   r7   r8   rW   E  s    zECAlgorithm.__init__c                 C   s   t |tst |tr|S t |tr~t|}z,|drFt|t d}nt|t d}W q t	k
rz   t
|d t d}Y qX ntd|S )Ns   ecdsa-sha2-rc   re   rf   )rg   r   r   r   r
   rh   r   r!   r   ri   r   rj   r=   r7   r7   r8   r@   H  s    


zECAlgorithm.prepare_keyc                 C   s"   | |t|  }t||jS rS   )rC   r   ECDSArU   r	   curve)r>   rB   r?   der_sigr7   r7   r8   rC   `  s    zECAlgorithm.signc                 C   sb   zt ||j}W n tk
r&   Y dS X z|||t|   W dS  tk
r\   Y dS X d S )NFT)r   r   ri   rF   r   r   rU   r"   )r>   rB   r?   rE   r   r7   r7   r8   rF   e  s    zECAlgorithm.verifyN)rL   rM   rN   rO   r   r/   r0   r1   rW   r@   rC   rF   r7   r7   r7   r8   r5   <  s   r5   c                   @   s    e Zd ZdZdd Zdd ZdS )r6   zA
        Performs a signature using RSASSA-PSS with MGF1
        c                 C   s*   | |tjt|  | jjd|  S )NZmgfZsalt_length)rC   r    PSSMGF1rU   digest_sizerA   r7   r7   r8   rC   v  s    zRSAPSSAlgorithm.signc              	   C   sN   z2| ||tjt|  | jjd|   W dS  tk
rH   Y dS X d S )Nr   TF)rF   r    r   r   rU   r   r"   rD   r7   r7   r8   rF     s    	zRSAPSSAlgorithm.verifyN)rL   rM   rN   rO   rC   rF   r7   r7   r7   r8   r6   q  s   
r6   )8rb   r`   r[   compatr   r   
exceptionsr   Zutilsr   r   r	   r
   r   r   r   r   r   r   Zcryptography.hazmat.primitivesr   Z,cryptography.hazmat.primitives.serializationr   r   r   Z-cryptography.hazmat.primitives.asymmetric.rsar   r   r   r   r   r   r   r   Z,cryptography.hazmat.primitives.asymmetric.ecr   r   Z)cryptography.hazmat.primitives.asymmetricr   r    Zcryptography.hazmat.backendsr!   Zcryptography.exceptionsr"   r2   ImportErrorsetZrequires_cryptographyr9   objectr:   r-   r.   r4   r5   r6   r7   r7   r7   r8   <module>   s@   0(
    (- 5