
ํยะZ  ใ               @   s  d  Z  d d l 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 e j e  Z Gd d	   d	 e j  Z Gd
 d   d e e j  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e e  Z Gd d   d e e  Z Gd d   d e  Z e j e d e	 j   Z  e j e d e	 j!   Z" e j e d e	 j#   Z$ e j e d e	 j   Z% e j e d e	 j!   Z& e j e d e	 j#   Z' e j e d e	 j   Z( e j e d e	 j!   Z) e j e d e	 j#   Z* e j e d   Z+ e j e d    Z, e j 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ฺjwkc               @   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               @   sฒ   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)N)ฺ
isinstancer   ฺNotImplementedr   )r   ฺotherr   r   r   ฺ__eq__#   s    zJWASignature.__eq__c             C   s   t  |  j |  j f  S)N)ฺhashฺ	__class__r   )r   r   r   r   ฺ__hash__(   s    zJWASignature.__hash__c             C   s   |  | k S)Nr   )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   ฺregister.   s    zJWASignature.registerc             C   s   |  j  S)N)r   )r   r   r   r   ฺto_partial_json4   s    zJWASignature.to_partial_jsonc             C   s   |  j  | S)N)r   )r   Zjobjr   r   r   ฺ	from_json7   s    zJWASignature.from_jsonc             C   s   t     d S)z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``.N)r!   )r   r"   r#   ฺsigr   r   r   ฺverify@   s    zJWASignature.verifyc             C   s   |  j  S)N)r   )r   r   r   r   ฺ__repr__E   s    zJWASignature.__repr__N)r
   r   r   r   r   r   r   r   r   ฺclassmethodr   r   r    ฺabcฺabstractmethodr$   r&   r'   r   r   r   r   r      s   r   c                   sC   e  Z d  Z e j Z   f d d   Z d d   Z d d   Z   S)ฺ_JWAHSc                s&   t  t |   j |  |   |  _ d  S)N)ฺsuperr+   r   r   )r   r   ฺhash_)r   r   r   r   M   s    z_JWAHS.__init__c             C   s5   t  j | |  j d t   } | j |  | j   S)Nฺbackend)r   ฺHMACr   r   ฺupdateฺfinalize)r   r"   r#   ฺsignerr   r   r   r$   Q   s    z_JWAHS.signc             C   s   t  j | |  j d t   } | j |  y | j |  WnB t j j k
 r } z t	 j
 | d d d SWYd  d  } ~ Xn Xd Sd  S)Nr.   ฺexc_infoTF)r   r/   r   r   r0   r&   ฺcryptographyฺ
exceptionsฺInvalidSignatureฺloggerฺdebug)r   r"   r#   r%   ฺverifierฺerrorr   r   r   r&   V   s    z_JWAHS.verify)	r
   r   r   r   ZJWKOctฺktyr   r$   r&   r   r   )r   r   r+   I   s   	r+   c               @   s=   e  Z d  Z e j Z e Z e Z d d   Z	 d d   Z
 d S)ฺ_JWARSAc             C   sO  t  | d  } y; | r1 | j | |  j |  j  S| j |  j |  j  } Wn t k
 r } z' t j | d d t j	 d   WYd d } ~ XnM t
 k
 r฿ } z- t j | d d t j	 t |    WYd d } ~ Xn X| j |  y | j   SWnM t
 k
 rJ} z- t j | d d t j	 t |    WYd d } ~ Xn Xd S)zSign the ``msg`` using ``key``.r$   r3   Tz%Public key cannot be used for signingN)ฺhasattrr$   r   r   r2   ฺAttributeErrorr7   r8   r   ฺErrorฺ
ValueErrorฺstrr0   r1   )r   r"   r#   ฺnew_apir2   r:   r   r   r   r$   h   s"    !(z_JWARSA.signc             C   sฝ   t  | d  } | s= | j | |  j |  j  } | j |  y3 | re | j | | |  j |  j  n
 | j   WnB t j j k
 rด } z t	 j
 | d d d SWYd d } ~ Xn Xd Sd S)z,Verify the ``msg` and ``sig`` using ``key``.r&   r3   TFN)r=   r9   r   r   r0   r&   r4   r5   r6   r7   r8   )r   r"   r#   r%   rB   r9   r:   r   r   r   r&   }   s    z_JWARSA.verifyN)r
   r   r   r   ZJWKRSAr;   r   r   r   r$   r&   r   r   r   r   r<   b   s
   	r<   c                   s"   e  Z d  Z   f d d   Z   S)ฺ_JWARSc                s5   t  t |   j |  t j   |  _ |   |  _ d  S)N)r,   rC   r   r   ZPKCS1v15r   )r   r   r-   )r   r   r   r      s    z_JWARS.__init__)r
   r   r   r   r   r   )r   r   rC      s   rC   c                   s"   e  Z d  Z   f d d   Z   S)ฺ_JWAPSc                sS   t  t |   j |  t j d t j |    d t j j  |  _ |   |  _ d  S)NZmgfZsalt_length)r,   rD   r   r   ZPSSZMGF1Z
MAX_LENGTHr   )r   r   r-   )r   r   r   r      s
    	z_JWAPS.__init__)r
   r   r   r   r   r   )r   r   rD      s   rD   c               @   s(   e  Z d  Z d d   Z d d   Z d S)ฺ_JWAESc             C   s   t     d  S)N)r!   )r   r"   r#   r   r   r   r$   ฆ   s    z_JWAES.signc             C   s   t     d  S)N)r!   )r   r"   r#   r%   r   r   r   r&   ฉ   s    z_JWAES.verifyN)r
   r   r   r$   r&   r   r   r   r   rE   ข   s   rE   ฺHS256ฺHS384ฺHS512ฺRS256ฺRS384ฺRS512ฺPS256ฺPS384ฺPS512ฺES256ฺES384ฺES512).r   r)   ฺcollectionsZloggingZcryptography.exceptionsr4   Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   Zjosepyr   r   r   Z	getLoggerr
   r7   ZJSONDeSerializabler	   ฺHashabler   r+   ฺobjectr<   rC   rD   rE   r   ZSHA256rF   ZSHA384rG   ZSHA512rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   r   r   r   r   ฺ<module>   s:   -.
