o
    h9Ra#                     @   s  d Z ddlZddlZddlmZmZm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mZ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 ddlmZ 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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+Z0e"(e%d ej-Z1e"(e&d!ej)Z2e"(e&d"ej+Z3e"(e&d#ej-Z4e"(e'd$ej)Z5e"(e'd%ej+Z6e"(e'd&ej-Z7dS )'zZJSON Web Algorithms.

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

    N)DictAnyCallable)default_backend)hashes)hmac)paddingecrsa)decode_dss_signature)encode_dss_signature)HashAlgorithm)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                	   @   s   e Zd ZU dZi Zeed f ed< eed< deddfddZ	d	ede
fd
dZdefddZedddZdefddZededd fddZejdededefddZejdededede
fddZdefddZdS ) JWASignaturez-Base class for JSON Web Signature Algorithms.
SIGNATURESktynamereturnNc                 C   s
   || _ d S Nr   )selfr   r   r   r   __init__&   s   
zJWASignature.__init__otherc                 C   s   t |tstS | j|jkS r   )
isinstancer   NotImplementedr   )r    r"   r   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__signature_clsc                 C   s   || j |j< |S )z(Register class for JSON deserialization.)r   r   )clsr*   r   r   r   register1   s   zJWASignature.registerc                 C      | j S r   r   r(   r   r   r   to_partial_json7      zJWASignature.to_partial_jsonjobjc                 C   s
   | j | S r   )r   )r+   r0   r   r   r   	from_json:   s   
zJWASignature.from_jsonkeymsgc                 C      t  )Sign the ``msg`` using ``key``.NotImplementedError)r    r2   r3   r   r   r   sign>      zJWASignature.signsigc                 C   r4   )z-Verify the ``msg`` and ``sig`` using ``key``.r6   )r    r2   r3   r:   r   r   r   verifyC   r9   zJWASignature.verifyc                 C   r-   r   r   r(   r   r   r   __repr__H   r/   zJWASignature.__repr__)r*   r   r   r   )r   r   r   r   r   r   str__annotations__r   r!   boolr%   intr)   classmethodr,   r.   r1   abcabstractmethodbytesr8   r;   r<   r   r   r   r   r   !   s"   
 r   c                       sd   e Zd ZejZdedeg ef f fddZ	de
de
de
fdd	Zde
de
d
e
defddZ  ZS )_JWAHSr   hash_c                       t  | | | _d S r   superr!   r&   r    r   rF   r'   r   r   r!   O      z_JWAHS.__init__r2   r3   r   c                 C   s&   t j|| jt d}|| | S )Nbackend)r   HMACr&   r   updatefinalize)r    r2   r3   signerr   r   r   r8   S   s   
z_JWAHS.signr:   c              
   C   sh   t j|| jt d}|| z|| W dS  tjjy3 } zt	j
|dd W Y d }~dS d }~ww )NrM   Texc_infoF)r   rO   r&   r   rP   r;   cryptography
exceptionsInvalidSignatureloggerdebug)r    r2   r3   r:   verifiererrorr   r   r   r;   X   s   
z_JWAHS.verify)r   r   r   r   JWKOctr   r=   r   r   r!   rD   r8   r?   r;   __classcell__r   r   rK   r   rE   L   s
    "rE   c                   @   s`   e Zd ZU ejZeZee	d< eZ
ee	d< dejdedefddZdejdededefd	d
ZdS )_JWARSAr   r&   r2   r3   r   c              
   C   s   t |d}z|r||| j| jW S || j| j}W n1 ty3 } ztj|dd t	dd}~w t
yL } ztj|dd t	t|d}~ww || z| W S  t
yq } ztj|dd t	t|d}~ww )r5   r8   TrS   %Public key cannot be used for signingN)hasattrr8   r   r&   rR   AttributeErrorrX   rY   r   Error
ValueErrorr=   rP   rQ   r    r2   r3   new_apirR   r[   r   r   r   r8   i   s,   



z_JWARSA.signr:   c              
   C   s   t |d}|s||| j| j}|| z|r%|||| j| j W dS |  W dS  tjjyG } zt	j
|dd W Y d}~dS d}~ww ),Verify the ``msg` and ``sig`` using ``key``.r;   TrS   NF)r`   rZ   r   r&   rP   r;   rU   rV   rW   rX   rY   )r    r2   r3   r:   re   rZ   r[   r   r   r   r;   ~   s   


z_JWARSA.verifyN)r   r   r   r   JWKRSAr   r$   r   r   r>   r&   r   r
   RSAPrivateKeyrD   r8   RSAPublicKeyr?   r;   r   r   r   r   r^   d   s   
  r^   c                       2   e Zd Zdedeg ef ddf fddZ  ZS )_JWARSr   rF   r   Nc                    s"   t  | t | _| | _d S r   )rI   r!   r   PKCS1v15r&   rJ   rK   r   r   r!      s   
z_JWARS.__init__r   r   r   r=   r   r   r!   r]   r   r   rK   r   rk          *rk   c                       rj   )_JWAPSr   rF   r   Nc                    s4   t  | tjt| tjjd| _| | _d S )N)mgfsalt_length)rI   r!   r   PSSMGF1
MAX_LENGTHr&   rJ   rK   r   r   r!      s   
z_JWAPS.__init__rm   r   r   rK   r   ro      rn   ro   c                       s   e Zd ZejZdedeg ef f fddZ	de
jdedefdd	Zde
jdedefd
dZde
jdededefddZde
jdededefddZ  ZS )_JWAECr   rF   c                    rG   r   rH   rJ   rK   r   r   r!      rL   z_JWAEC.__init__r2   r3   r   c                 C   sB   |  ||}t|\}}tj|j}|j|dd|j|dd S )r5   big)length	byteorder)_signr   r   JWKECexpected_length_for_curvecurveto_bytes)r    r2   r3   r:   drdsrw   r   r   r   r8      s   z_JWAEC.signc              
   C   s   t |d}z|r||t| jW S |t| j}W n1 ty5 } ztj|dd t	
dd }~w tyN } ztj|dd t	
t|d }~ww || z| W S  tys } ztj|dd t	
t|d }~ww )Nr8   TrS   r_   )r`   r8   r	   ECDSAr&   rR   ra   rX   rY   r   rb   rc   r=   rP   rQ   rd   r   r   r   ry      s,   



z_JWAEC._signr:   c                 C   s^   t j|j}t|d| krdS ttj|d| ddtj||d dd}| |||S )rf      Fr   rv   )rx   N)	r   rz   r{   r|   lenr   r@   
from_bytes_verify)r    r2   r3   r:   rlenasn1sigr   r   r   r;      s   z_JWAEC.verifyr   c              
   C   s   t |d}|s||t| j}|| z|r'|||t| j W dS |  W dS  tjj	yI } zt
j|dd W Y d }~dS d }~ww )Nr;   TrS   F)r`   rZ   r	   r   r&   rP   r;   rU   rV   rW   rX   rY   )r    r2   r3   r   re   rZ   r[   r   r   r   r      s   


z_JWAEC._verify)r   r   r   r   rz   r   r=   r   r   r!   r	   EllipticCurvePrivateKeyrD   r8   ry   EllipticCurvePublicKeyr?   r;   r   r]   r   r   rK   r   ru      s    $ru   HS256HS384HS512RS256RS384RS512PS256PS384PS512ES256ES384ES512)8r   rB   loggingtypingr   r   r   cryptography.exceptionsrU   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r	   r
   /cryptography.hazmat.primitives.asymmetric.utilsr   r   %cryptography.hazmat.primitives.hashesr   josepyr   r   r   collections.abcr   	getLoggerr   rX   JSONDeSerializabler   r   rE   r^   rk   ro   ru   r,   SHA256r   SHA384r   SHA512r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sD    
+-
B