U
    ]u                     @   s  d 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mZmZ zddlmZ W n  ek
r   ddlmZ Y nX eeZG d	d
 d
ejZG dd deeZG dd deZG dd deZG dd deeZG dd deeZG dd deZe edej!Z"e edej#Z$e edej%Z&e edej!Z'e edej#Z(e edej%Z)e edej!Z*e edej#Z+e edej%Z,e ed Z-e ed!Z.e ed"Z/dS )#zZJSON Web Algorithms.

https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40

    N)default_backend)hashes)hmac)padding)errors
interfacesjwk)Hashablec                   @   s   e Zd ZdZdS )JWAzJSON Web Algorithm.N)__name__
__module____qualname____doc__ r   r   ,/usr/lib/python3/dist-packages/josepy/jwa.pyr
      s   r
   c                   @   sx   e Zd ZdZi Zdd Zdd Zdd Zdd	 Ze	d
d Z
dd Ze	dd Zejdd Zejdd Zdd ZdS )JWASignaturez-Base class for JSON Web Signature Algorithms.c                 C   s
   || _ d S Nname)selfr   r   r   r   __init__$   s    zJWASignature.__init__c                 C   s   t |tstS | j|jkS r   )
isinstancer   NotImplementedr   r   otherr   r   r   __eq__'   s    
zJWASignature.__eq__c                 C   s   t | j| jfS r   )hash	__class__r   r   r   r   r   __hash__,   s    zJWASignature.__hash__c                 C   s
   | |k S r   r   r   r   r   r   __ne__/   s    zJWASignature.__ne__c                 C   s   || j |j< |S )z(Register class for JSON deserialization.)
SIGNATURESr   )clsZsignature_clsr   r   r   register2   s    zJWASignature.registerc                 C   s   | j S r   r   r   r   r   r   to_partial_json8   s    zJWASignature.to_partial_jsonc                 C   s
   | j | S r   )r!   )r"   Zjobjr   r   r   	from_json;   s    zJWASignature.from_jsonc                 C   s
   t  dS )Sign the ``msg`` using ``key``.NNotImplementedErrorr   keymsgr   r   r   sign?   s    zJWASignature.signc                 C   s
   t  dS )z-Verify the ``msg`` and ``sig`` using ``key``.Nr'   r   r*   r+   sigr   r   r   verifyD   s    zJWASignature.verifyc                 C   s   | j S r   r   r   r   r   r   __repr__I   s    zJWASignature.__repr__N)r   r   r   r   r!   r   r   r   r    classmethodr#   r$   r%   abcabstractmethodr,   r/   r0   r   r   r   r   r       s    



r   c                       s2   e Zd ZejZ fddZdd Zdd Z  Z	S )_JWAHSc                    s   t t| | | | _d S r   )superr4   r   r   r   r   Zhash_r   r   r   r   Q   s    z_JWAHS.__init__c                 C   s&   t j|| jt d}|| | S )NZbackend)r   HMACr   r   updatefinalize)r   r*   r+   signerr   r   r   r,   U   s    
z_JWAHS.signc              
   C   sp   t j|| jt d}|| z|| W n: tjjk
rf } zt	j
|dd W Y dS d }~X Y nX dS d S )Nr8   Texc_infoF)r   r9   r   r   r:   r/   cryptography
exceptionsInvalidSignatureloggerdebug)r   r*   r+   r.   verifiererrorr   r   r   r/   Z   s    
z_JWAHS.verify)
r   r   r   r   ZJWKOctktyr   r,   r/   __classcell__r   r   r7   r   r4   M   s   r4   c                   @   s*   e Zd ZejZeZeZdd Z	dd Z
dS )_JWARSAc              
   C   s  t |d}z,|r$||| j| jW S || j| j}W nv tk
rp } ztj|dd t	dW 5 d}~X Y n> t
k
r } z tj|dd t	t|W 5 d}~X Y nX || z
| W S  t
k
r } z tj|dd t	t|W 5 d}~X Y nX dS )r&   r,   Tr=   z%Public key cannot be used for signingN)hasattrr,   r   r   r<   AttributeErrorrB   rC   r   Error
ValueErrorstrr:   r;   )r   r*   r+   new_apir<   rE   r   r   r   r,   l   s"    
 

z_JWARSA.signc              
   C   s   t |d}|s*||| j| j}|| z&|rF|||| j| j n|  W n: tjjk
r } zt	j
|dd W Y dS d}~X Y nX dS dS )z,Verify the ``msg` and ``sig`` using ``key``.r/   Tr=   FN)rI   rD   r   r   r:   r/   r?   r@   rA   rB   rC   )r   r*   r+   r.   rN   rD   rE   r   r   r   r/      s    

z_JWARSA.verifyN)r   r   r   r   ZJWKRSArF   r   r   r   r,   r/   r   r   r   r   rH   f   s
   rH   c                       s   e Zd Z fddZ  ZS )_JWARSc                    s&   t t| | t | _| | _d S r   )r5   rO   r   r   ZPKCS1v15r   r6   r7   r   r   r      s    
z_JWARS.__init__r   r   r   r   rG   r   r   r7   r   rO      s   rO   c                       s   e Zd Z fddZ  ZS )_JWAPSc                    s8   t t| | tjt| tjjd| _| | _d S )N)ZmgfZsalt_length)r5   rQ   r   r   ZPSSZMGF1Z
MAX_LENGTHr   r6   r7   r   r   r      s    
z_JWAPS.__init__rP   r   r   r7   r   rQ      s   rQ   c                   @   s   e Zd Zdd Zdd ZdS )_JWAESc                 C   s
   t  d S r   r'   r)   r   r   r   r,      s    z_JWAES.signc                 C   s
   t  d S r   r'   r-   r   r   r   r/      s    z_JWAES.verifyN)r   r   r   r,   r/   r   r   r   r   rR      s   rR   HS256HS384HS512RS256RS384RS512PS256PS384PS512ES256ES384ES512)0r   r2   ZloggingZcryptography.exceptionsr?   Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   Zjosepyr   r   r   Zcollections.abcr	   ImportErrorcollectionsZ	getLoggerr   rB   ZJSONDeSerializabler
   r   r4   objectrH   rO   rQ   rR   r#   ZSHA256rS   ZSHA384rT   ZSHA512rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r   r   r   r   <module>   s@   
-.
