
[Y;"                 @   s  d  d l  Z  d  d l Z d d l m Z m Z m Z d d l m Z d d l m	 Z	 m
 Z
 y d  d l m Z d  d l 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 m Z d  d l m Z d  d l m Z d Z Wn e k
 rd Z Yn Xd d   Z  Gd d   d e!  Z" Gd d   d e"  Z# Gd d   d e"  Z$ e rGd d   d e"  Z% Gd d   d e"  Z& Gd d   d e%  Z' d S)    N   )constant_time_comparestring_types	text_type)InvalidKeyError)der_to_raw_signatureraw_to_der_signature)hashes)load_pem_private_keyload_pem_public_keyload_ssh_public_key)RSAPrivateKeyRSAPublicKey)EllipticCurvePrivateKeyEllipticCurvePublicKey)ecpadding)default_backend)InvalidSignatureTFc              C   s   d t    d t t j  d t t j  d t t j  i }  t r |  j d t t j  d t t j  d t t j  d t t j  d	 t t j  d
 t t j  d t	 t	 j  d t	 t	 j  d t	 t	 j  i	  |  S)zE
    Returns the algorithms that are implemented by the library.
    ZnoneZHS256ZHS384ZHS512ZRS256ZRS384ZRS512ZES256ZES384ZES512ZPS256ZPS384ZPS512)
NoneAlgorithmHMACAlgorithmSHA256SHA384SHA512
has_cryptoupdateRSAAlgorithmECAlgorithmRSAPSSAlgorithm)Zdefault_algorithms r   0/usr/lib/python3/dist-packages/jwt/algorithms.pyget_default_algorithms   s     	r!   c               @   s:   e  Z d  Z d Z d d   Z d d   Z 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_key;   s    zAlgorithm.prepare_keyc             C   s
   t   d S)zn
        Returns a digital signature for the specified message
        using the specified key value.
        N)r#   )r$   msgr%   r   r   r    signB   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.
        N)r#   )r$   r'   r%   sigr   r   r    verifyI   s    zAlgorithm.verifyN)__name__
__module____qualname____doc__r&   r(   r*   r   r   r   r    r"   7   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$   r%   r   r   r    r&   V   s
    zNoneAlgorithm.prepare_keyc             C   s   d S)N    r   )r$   r'   r%   r   r   r    r(   _   s    zNoneAlgorithm.signc             C   s   d S)NFr   )r$   r'   r%   r)   r   r   r    r*   b   s    zNoneAlgorithm.verifyN)r+   r,   r-   r.   r&   r(   r*   r   r   r   r    r   Q   s   	r   c               @   sa   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)r   zf
    Performs signing and verification operations using HMAC
    and the specified hash function.
    c             C   s   | |  _  d  S)N)hash_alg)r$   r1   r   r   r    __init__o   s    zHMACAlgorithm.__init__c                s   t    t  r, t    t  r, t d   t    t  rJ   j d    d d d d g } t   f d d   | D  r t d	     S)
Nz+Expecting a string- or bytes-formatted key.zutf-8s   -----BEGIN PUBLIC KEY-----s   -----BEGIN CERTIFICATE-----s   -----BEGIN RSA PUBLIC KEY-----s   ssh-rsac                s   g  |  ] } |   k  q Sr   r   ).0Zstring_value)r%   r   r    
<listcomp>   s   	 z-HMACAlgorithm.prepare_key.<locals>.<listcomp>zdThe specified key is an asymmetric key or x509 certificate and should not be used as an HMAC secret.)
isinstancer   bytes	TypeErrorr   encodeanyr   )r$   r%   Zinvalid_stringsr   )r%   r    r&   r   s     		zHMACAlgorithm.prepare_keyc             C   s   t  j | | |  j  j   S)N)hmacnewr1   Zdigest)r$   r'   r%   r   r   r    r(      s    zHMACAlgorithm.signc             C   s   t  | |  j | |   S)N)r   r(   )r$   r'   r%   r)   r   r   r    r*      s    zHMACAlgorithm.verifyN)r+   r,   r-   r.   hashlibZsha256r   Zsha384r   Zsha512r   r2   r&   r(   r*   r   r   r   r    r   f   s   			r   c               @   sa   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)r   z~
        Performs signing and verification operations using
        RSASSA-PKCS-v1_5 and the specified hash function.
        c             C   s   | |  _  d  S)N)r1   )r$   r1   r   r   r    r2      s    zRSAAlgorithm.__init__c             C   s   t  | t  s t  | t  r" | St  | t  r t  | t  rO | j d  } yF | j d  ry t | d t   } n t	 | d d  d t   } Wq t
 k
 r t | d t   } Yq Xn t d   | S)Nzutf-8s   ssh-rsabackendpasswordzExpecting a PEM-formatted key.)r5   r   r   r   r   r8   
startswithr   r   r
   
ValueErrorr   r7   )r$   r%   r   r   r    r&      s    zRSAAlgorithm.prepare_keyc             C   s5   | j  t j   |  j    } | j |  | j   S)N)signerr   PKCS1v15r1   r   finalize)r$   r'   r%   rA   r   r   r    r(      s
    	zRSAAlgorithm.signc             C   s]   | j  | t j   |  j    } | j |  y | j   d SWn t k
 rX d SYn Xd  S)NTF)verifierr   rB   r1   r   r*   r   )r$   r'   r%   r)   rD   r   r   r    r*      s    	
zRSAAlgorithm.verifyN)r+   r,   r-   r.   r	   r   r   r   r2   r&   r(   r*   r   r   r   r    r      s   				r   c               @   sa   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)r   zr
        Performs signing and verification operations using
        ECDSA and the specified hash function
        c             C   s   | |  _  d  S)N)r1   )r$   r1   r   r   r    r2      s    zECAlgorithm.__init__c             C   s   t  | t  s t  | t  r" | St  | t  r t  | t  rO | j d  } y t | d t   } Wq t k
 r t	 | d d  d t   } Yq Xn t
 d   | S)Nzutf-8r=   r>   zExpecting a PEM-formatted key.)r5   r   r   r   r   r8   r   r   r@   r
   r7   )r$   r%   r   r   r    r&      s    #zECAlgorithm.prepare_keyc             C   sG   | j  t j |  j     } | j |  | j   } t | | j  S)N)rA   r   ECDSAr1   r   rC   r   curve)r$   r'   r%   rA   der_sigr   r   r    r(      s    zECAlgorithm.signc             C   s   y t  | | j  } Wn t k
 r. d SYn X| j | t j |  j     } | j |  y | j   d SWn t	 k
 r d SYn Xd  S)NFT)
r   rF   r@   rD   r   rE   r1   r   r*   r   )r$   r'   r%   r)   rG   rD   r   r   r    r*      s    	!
zECAlgorithm.verifyN)r+   r,   r-   r.   r	   r   r   r   r2   r&   r(   r*   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   sV   | j  t j d t j |  j    d |  j j  |  j    } | j |  | j   S)Nmgfsalt_length)rA   r   PSSMGF1r1   digest_sizer   rC   )r$   r'   r%   rA   r   r   r    r(     s    	zRSAPSSAlgorithm.signc             C   s~   | j  | t j d t j |  j    d |  j j  |  j    } | j |  y | j   d SWn t k
 ry d SYn Xd  S)NrH   rI   TF)	rD   r   rJ   rK   r1   rL   r   r*   r   )r$   r'   r%   r)   rD   r   r   r    r*     s    	
zRSAPSSAlgorithm.verifyN)r+   r,   r-   r.   r(   r*   r   r   r   r    r     s   r   )(r<   r:   compatr   r   r   
exceptionsr   Zutilsr   r   Zcryptography.hazmat.primitivesr	   Z,cryptography.hazmat.primitives.serializationr
   r   r   Z-cryptography.hazmat.primitives.asymmetric.rsar   r   Z,cryptography.hazmat.primitives.asymmetric.ecr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   Zcryptography.hazmat.backendsr   Zcryptography.exceptionsr   r   ImportErrorr!   objectr"   r   r   r   r   r   r   r   r   r    <module>   s.   
'9: