U
    bxW                     @   s  d dl Z d dlZd dl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 zd dlZd dlm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!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 dZ1W n e2k
r   dZ1Y nX ddddddddddddhZ3dd Z4G dd dZ5G dd  d e5Z6G d!d" d"e5Z7e1rG d#d$ d$e5Z8G d%d& d&e5Z9G d'd( d(e8Z:G d)d* d*e5Z;dS )+    N   InvalidKeyError)	base64url_decodebase64url_encodeder_to_raw_signatureforce_bytesfrom_base64url_uintis_pem_format
is_ssh_keyraw_to_der_signatureto_base64url_uint)InvalidSignature)hashes)ecpadding)EllipticCurvePrivateKeyEllipticCurvePublicKey)Ed448PrivateKeyEd448PublicKey)Ed25519PrivateKeyEd25519PublicKey)RSAPrivateKeyRSAPrivateNumbersRSAPublicKeyRSAPublicNumbersrsa_crt_dmp1rsa_crt_dmq1rsa_crt_iqmprsa_recover_prime_factors)EncodingNoEncryptionPrivateFormatPublicFormatload_pem_private_keyload_pem_public_keyload_ssh_public_keyTFRS256RS384RS512ES256ES256KES384ES521ES512PS256PS384PS512EdDSAc                  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t	t	jt
 d | S )zE
    Returns the algorithms that are implemented by the library.
    )noneZHS256ZHS384ZHS512)r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   )NoneAlgorithmHMACAlgorithmSHA256SHA384SHA512
has_cryptoupdateRSAAlgorithmECAlgorithmRSAPSSAlgorithmOKPAlgorithm)Zdefault_algorithms r?   2/tmp/pip-unpacked-wheel-ivybibab/jwt/algorithms.pyget_default_algorithmsK   s0    rA   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keyr?   r?   r@   prepare_keyr   s    zAlgorithm.prepare_keyc                 C   s   t dS )zn
        Returns a digital signature for the specified message
        using the specified key value.
        NrC   rF   msgrG   r?   r?   r@   signy   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.
        NrC   rF   rJ   rG   sigr?   r?   r@   verify   s    zAlgorithm.verifyc                 C   s   t dS )z7
        Serializes a given RSA key into a JWK
        NrC   key_objr?   r?   r@   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
        NrC   )jwkr?   r?   r@   from_jwk   s    zAlgorithm.from_jwkN)
__name__
__module____qualname____doc__rH   rK   rN   staticmethodrQ   rS   r?   r?   r?   r@   rB   m   s   
rB   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r4   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   rE   r?   r?   r@   rH      s
    zNoneAlgorithm.prepare_keyc                 C   s   dS )N    r?   rI   r?   r?   r@   rK      s    zNoneAlgorithm.signc                 C   s   dS )NFr?   rL   r?   r?   r@   rN      s    zNoneAlgorithm.verifyN)rT   rU   rV   rW   rH   rK   rN   r?   r?   r?   r@   r4      s   	r4   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 )r5   zf
    Performs signing and verification operations using HMAC
    and the specified hash function.
    c                 C   s
   || _ d S Nhash_algrF   r]   r?   r?   r@   __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   rE   r?   r?   r@   rH      s    zHMACAlgorithm.prepare_keyc                 C   s   t tt|  ddS )Noct)kkty)jsondumpsr   r   decoderO   r?   r?   r@   rQ      s
    zHMACAlgorithm.to_jwkc                 C   sn   z.t | trt| }nt | tr(| }ntW n tk
rJ   tdY nX |ddkrbtdt|d S )NKey is not valid JSONrb   r`   zNot an HMAC keyra   )	
isinstancestrrc   loadsdict
ValueErrorr   getr   )rR   objr?   r?   r@   rS      s    

zHMACAlgorithm.from_jwkc                 C   s   t ||| j S r[   )hmacnewr]   digestrI   r?   r?   r@   rK      s    zHMACAlgorithm.signc                 C   s   t || ||S r[   )rn   compare_digestrK   rL   r?   r?   r@   rN      s    zHMACAlgorithm.verifyN)rT   rU   rV   rW   hashlibsha256r6   sha384r7   sha512r8   r_   rH   rX   rQ   rS   rK   rN   r?   r?   r?   r@   r5      s   

r5   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;   z~
        Performs signing and verification operations using
        RSASSA-PKCS-v1_5 and the specified hash function.
        c                 C   s
   || _ d S r[   r\   r^   r?   r?   r@   r_      s    zRSAAlgorithm.__init__c                 C   sv   t |ttfr|S t |ttfs(tdt|}z$|drFt|}nt	|d d}W n t
k
rp   t|}Y nX |S )NExpecting a PEM-formatted key.s   ssh-rsapassword)rg   r   r   bytesrh   	TypeErrorr   
startswithr&   r$   rk   r%   rE   r?   r?   r@   rH      s    

zRSAAlgorithm.prepare_keyc                 C   s   d }t | dd r|  }ddgt|jj t|jj t|j t|j t|j	 t|j
 t|j t|j d
}nBt | dd r|  }ddgt|j t|j d}ntdt|S )Nprivate_numbersRSArK   )
rb   key_opsnedpqdpdqqirN   )rb   r~   r   r   Not a public or private key)getattrr|   r   public_numbersr   re   r   r   r   r   dmp1dmq1iqmpr   rc   rd   )rP   rm   numbersr?   r?   r@   rQ     s.    zRSAAlgorithm.to_jwkc           	   	      s  z.t | trt|  nt | tr(|  ntW n tk
rJ   tdY nX  ddkrbtdd krd krd krd krtd	d
ddddg} fdd|D }t|}|rt	|stdt
t d t d }|r4tt d t d
 t d t d t d t d |d}nHt d }t|j||j\}}t|||t||t||t|||d}| S d krd krt
t d t d }| S tdd S )Nrf   rb   r}   zNot an RSA keyr   r   r   Zothz5Unsupported RSA private key: > 2 primes not supportedr   r   r   r   r   c                    s   g | ]}| kqS r?   r?   ).0proprm   r?   r@   
<listcomp>A  s     z)RSAAlgorithm.from_jwk.<locals>.<listcomp>z@RSA key must include all parameters if any are present besides d)r   r   r   r   r   r   r   r   )rg   rh   rc   ri   rj   rk   r   rl   anyallr   r	   r   r   r   r   r   r   r   private_key
public_key)	rR   Zother_propsZprops_foundZany_props_foundr   r   r   r   r   r?   r   r@   rS   *  sv    










  


zRSAAlgorithm.from_jwkc                 C   s   | |t |  S r[   )rK   r   PKCS1v15r]   rI   r?   r?   r@   rK   t  s    zRSAAlgorithm.signc                 C   s:   z| ||t |   W dS  tk
r4   Y dS X d S )NTF)rN   r   r   r]   r   rL   r?   r?   r@   rN   w  s
    zRSAAlgorithm.verifyN)rT   rU   rV   rW   r   r6   r7   r8   r_   rH   rX   rQ   rS   rK   rN   r?   r?   r?   r@   r;      s   
#
Ir;   c                   @   sN   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ed
d ZdS )r<   zr
        Performs signing and verification operations using
        ECDSA and the specified hash function
        c                 C   s
   || _ d S r[   r\   r^   r?   r?   r@   r_     s    zECAlgorithm.__init__c                 C   s   t |ttfr|S t |ttfs(tdt|}z |drFt|}nt	|}W n  t
k
rp   t|d d}Y nX t |ttfstd|S )Nrv   s   ecdsa-sha2-rw   zcExpecting a EllipticCurvePrivateKey/EllipticCurvePublicKey. Wrong key provided for ECDSA algorithms)rg   r   r   ry   rh   rz   r   r{   r&   r%   rk   r$   r   rE   r?   r?   r@   rH     s     

zECAlgorithm.prepare_keyc                 C   s"   | |t|  }t||jS r[   )rK   r   ECDSAr]   r   curve)rF   rJ   rG   der_sigr?   r?   r@   rK     s    zECAlgorithm.signc                 C   st   zt ||j}W n tk
r&   Y dS X z0t|tr<| }|||t| 	  W dS  t
k
rn   Y dS X d S )NFT)r   r   rk   rg   r   r   rN   r   r   r]   r   )rF   rJ   rG   rM   r   r?   r?   r@   rN     s    
zECAlgorithm.verifyc                 C   s0  z.t | trt| }nt | tr(| }ntW n tk
rJ   tdY nX |ddkrbtdd|ksrd|krztdt|d}t|d}|d}|dkrt	|t	|  krd	krn n
t
 }ntd
n|dkrt	|t	|  krdkrn n
t
 }ntdn|dkr`t	|t	|  krHdkrVn n
t
 }ntdnP|dkrt	|t	|  krd	krn n
t
 }ntdntd| t
jtj|ddtj|dd|d}d|kr| S t|d}t	|t	|krtdt	||t
tj|dd| S )Nrf   rb   ZECzNot an Elliptic curve keyxycrvzP-256    z)Coords should be 32 bytes for curve P-256zP-3840   z)Coords should be 48 bytes for curve P-384zP-521B   z)Coords should be 66 bytes for curve P-521Z	secp256k1z-Coords should be 32 bytes for curve secp256k1Invalid curve: big)	byteorder)r   r   r   r   z!D should be {} bytes for curve {})rg   rh   rc   ri   rj   rk   r   rl   r   lenr   Z	SECP256R1Z	SECP384R1Z	SECP521R1Z	SECP256K1ZEllipticCurvePublicNumbersint
from_bytesr   ZEllipticCurvePrivateNumbersr   )rR   rm   r   r   r   Z	curve_objr   r   r?   r?   r@   rS     sh    


 


$


$


$

   zECAlgorithm.from_jwkN)rT   rU   rV   rW   r   r6   r7   r8   r_   rH   rK   rN   rX   rS   r?   r?   r?   r@   r<   ~  s   r<   c                   @   s    e Zd ZdZdd Zdd ZdS )r=   zA
        Performs a signature using RSASSA-PSS with MGF1
        c                 C   s*   | |tjt|  | jjd|  S )NZmgfZsalt_length)rK   r   PSSMGF1r]   digest_sizerI   r?   r?   r@   rK     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)rN   r   r   r   r]   r   r   rL   r?   r?   r@   rN     s    	zRSAPSSAlgorithm.verifyN)rT   rU   rV   rW   rK   rN   r?   r?   r?   r@   r=     s   
r=   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zed
d Z	edd Z
dS )r>   z
        Performs signing and verification operations using EdDSA

        This class requires ``cryptography>=2.6`` to be installed.
        c                 K   s   d S r[   r?   )rF   kwargsr?   r?   r@   r_   !  s    zOKPAlgorithm.__init__c                 C   s   t |ttfrlt |tr"|d}|d}d|kr>t|}n.d|krTt|d d}n|dd dkrlt|}t |tt	t
tfstd|S )	Nutf-8z-----BEGIN PUBLICz-----BEGIN PRIVATErw   r      zssh-zcExpecting a EllipticCurvePrivateKey/EllipticCurvePublicKey. Wrong key provided for EdDSA algorithms)rg   ry   rh   encodere   r%   r$   r&   r   r   r   r   r   )rF   rG   Zstr_keyr?   r?   r@   rH   $  s$    




zOKPAlgorithm.prepare_keyc                 C   s$   t |tk	rt|dn|}||S )aR  
            Sign a message ``msg`` using the EdDSA private key ``key``
            :param str|bytes msg: Message to sign
            :param Ed25519PrivateKey}Ed448PrivateKey key: A :class:`.Ed25519PrivateKey`
                or :class:`.Ed448PrivateKey` iinstance
            :return bytes signature: The signature, as bytes
            r   )typery   rK   rI   r?   r?   r@   rK   <  s    zOKPAlgorithm.signc                 C   s|   z\t |tk	rt|dn|}t |tk	r2t|dn|}t|ttfrL| }||| W dS  tjj	k
rv   Y dS X dS )a  
            Verify a given ``msg`` against a signature ``sig`` using the EdDSA key ``key``

            :param str|bytes sig: EdDSA signature to check ``msg`` against
            :param str|bytes msg: Message to sign
            :param Ed25519PrivateKey|Ed25519PublicKey|Ed448PrivateKey|Ed448PublicKey key:
                A private or public EdDSA key instance
            :return bool verified: True if signature is valid, False if not.
            r   TFN)
r   ry   rg   r   r   r   rN   cryptography
exceptionsr   rL   r?   r?   r@   rN   G  s    
zOKPAlgorithm.verifyc                 C   s   t | ttfrP| jtjtjd}t | tr.dnd}tt	t
| d|dS t | ttfr| jtjtjt d}|  jtjtjd}t | trdnd}tt	t
| t	t
| d|dS tdd S )	N)encodingformatEd25519Ed448OKP)r   rb   r   )r   r   Zencryption_algorithm)r   r   rb   r   r   )rg   r   r   Zpublic_bytesr    ZRawr#   rc   rd   r   r   re   r   r   Zprivate_bytesr"   r!   r   r   )rG   r   r   r   r?   r?   r@   rQ   \  s>    	zOKPAlgorithm.to_jwkc              
   C   s2  z.t | trt| }nt | tr(| }ntW n tk
rJ   tdY nX |ddkrbtd|d}|dkr|dkrtd| d	|krtd
t|d	}zVd|kr|dkrt	
|W S t
|W S t|d}|dkrt|W S t|W S  tk
r, } ztd|W 5 d }~X Y nX d S )Nrf   rb   r   zNot an Octet Key Pairr   r   r   r   r   zOKP should have "x" parameterr   zInvalid key parameter)rg   rh   rc   ri   rj   rk   r   rl   r   r   Zfrom_public_bytesr   r   Zfrom_private_bytesr   )rR   rm   r   r   r   errr?   r?   r@   rS     s6    


zOKPAlgorithm.from_jwkN)rT   rU   rV   rW   r_   rH   rK   rN   rX   rQ   rS   r?   r?   r?   r@   r>     s   
'r>   )<rr   rn   rc   r   r   utilsr   r   r   r   r	   r
   r   r   r   Zcryptography.exceptionsr   r   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   r   Z,cryptography.hazmat.primitives.asymmetric.ecr   r   Z/cryptography.hazmat.primitives.asymmetric.ed448r   r   Z1cryptography.hazmat.primitives.asymmetric.ed25519r   r   Z-cryptography.hazmat.primitives.asymmetric.rsar   r   r   r   r   r   r   r   Z,cryptography.hazmat.primitives.serializationr    r!   r"   r#   r$   r%   r&   r9   ModuleNotFoundErrorZrequires_cryptographyrA   rB   r4   r5   r;   r<   r=   r>   r?   r?   r?   r@   <module>   sP   ,(
$

")9 ~