a
    •¢]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yŽ   ddlmZ Y n0 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   sn   t j|| jtƒ d}| |¡ z| |¡ W n8 tjjyd } zt	j
|dd W Y d }~dS d }~0 0 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 nz tyr } z$tj|dd t 	d¡‚W Y d}~nHd}~0  t
y° } z(tj|dd t 	t|ƒ¡‚W Y d}~n
d}~0 0 | |¡ z
| ¡ W S  t
y } z(tj|dd t 	t|ƒ¡‚W Y d}~n
d}~0 0 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 n8 tjjyˆ } zt	j
|dd W Y d}~dS d}~0 0 dS dS )z,Verify the ``msg` and ``sig`` using ``key``.r/   Tr=   NF)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   Ú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@   
-.
