
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
kZ4                 @   s  d dl Z d dlZd dlZddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZ yd dlmZ d dlmZmZmZ d dlmZmZmZmZmZ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' d dl(m)Z) dZ*W n e+k
r   dZ*Y nX e,ddddddddddg
Z-dd Z.G dd de/Z0G dd de0Z1G dd  d e0Z2e*rG d!d" d"e0Z3G d#d$ d$e0Z4G d%d& d&e3Z5dS )'    N   )constant_time_comparestring_types)InvalidKeyError)base64url_decodebase64url_encodeder_to_raw_signatureforce_bytesforce_unicodefrom_base64url_uintraw_to_der_signatureto_base64url_uint)hashes)load_pem_private_keyload_pem_public_keyload_ssh_public_key)RSAPrivateKeyRSAPublicKeyRSAPrivateNumbersRSAPublicNumbersrsa_recover_prime_factorsrsa_crt_dmp1rsa_crt_dmq1rsa_crt_iqmp)EllipticCurvePrivateKeyEllipticCurvePublicKey)ecpadding)default_backend)InvalidSignatureTFRS256RS384RS512ES256ES384ES521ES512PS256PS384PS512c              C   s   t  ttjttjttjd} tr| jttjttjttjttjttjttjttjt	t	jt	t	jt	t	jd
 | S )zE
    Returns the algorithms that are implemented by the library.
    )ZnoneZHS256ZHS384ZHS512)
r    r!   r"   r#   r$   r%   r&   r'   r(   r)   )
NoneAlgorithmHMACAlgorithmSHA256SHA384SHA512
has_cryptoupdateRSAAlgorithmECAlgorithmRSAPSSAlgorithm)Zdefault_algorithms r4    /usr/lib/python3.6/algorithms.pyget_default_algorithms&   s"    r6   c               @   s@   e Zd ZdZdd Zdd Zdd Zedd	 Ze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keyr4   r4   r5   prepare_keyF   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)r8   )r9   msgr:   r4   r4   r5   signM   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)r8   )r9   r<   r:   sigr4   r4   r5   verifyT   s    zAlgorithm.verifyc             C   s   t dS )z7
        Serializes a given RSA key into a JWK
        N)r8   )key_objr4   r4   r5   to_jwk[   s    zAlgorithm.to_jwkc             C   s   t dS )zb
        Deserializes a given RSA key from JWK back into a PublicKey or PrivateKey object
        N)r8   )jwkr4   r4   r5   from_jwkb   s    zAlgorithm.from_jwkN)
__name__
__module____qualname____doc__r;   r=   r?   staticmethodrA   rC   r4   r4   r4   r5   r7   B   s   r7   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   )r9   r:   r4   r4   r5   r;   o   s
    zNoneAlgorithm.prepare_keyc             C   s   dS )N    r4   )r9   r<   r:   r4   r4   r5   r=   x   s    zNoneAlgorithm.signc             C   s   dS )NFr4   )r9   r<   r:   r>   r4   r4   r5   r?   {   s    zNoneAlgorithm.verifyN)rD   rE   rF   rG   r;   r=   r?   r4   r4   r4   r5   r*   j   s   	r*   c               @   sZ   e Zd ZdZejZejZej	Z
dd Zdd Zedd Ze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)r9   rK   r4   r4   r5   __init__   s    zHMACAlgorithm.__init__c                s6   t   ddddg}t fdd|D r2td S )Ns   -----BEGIN PUBLIC KEY-----s   -----BEGIN CERTIFICATE-----s   -----BEGIN RSA PUBLIC KEY-----s   ssh-rsac                s   g | ]}| kqS r4   r4   ).0Zstring_value)r:   r4   r5   
<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.)r	   anyr   )r9   r:   Zinvalid_stringsr4   )r:   r5   r;      s    zHMACAlgorithm.prepare_keyc             C   s   t jttt| ddS )Noct)kkty)jsondumpsr
   r   r	   )r@   r4   r4   r5   rA      s    zHMACAlgorithm.to_jwkc             C   s,   t j| }|jddkr tdt|d S )NrR   rP   zNot an HMAC keyrQ   )rS   loadsgetr   r   )rB   objr4   r4   r5   rC      s    
zHMACAlgorithm.from_jwkc             C   s   t j||| jj S )N)hmacnewrK   Zdigest)r9   r<   r:   r4   r4   r5   r=      s    zHMACAlgorithm.signc             C   s   t || j||S )N)r   r=   )r9   r<   r:   r>   r4   r4   r5   r?      s    zHMACAlgorithm.verifyN)rD   rE   rF   rG   hashlibZsha256r,   Zsha384r-   Zsha512r.   rL   r;   rH   rA   rC   r=   r?   r4   r4   r4   r5   r+      s   	r+   c               @   sZ   e Zd ZdZejZejZejZdd Zdd Z	e
dd Ze
dd	 Zd
d Zdd ZdS )r1   z~
        Performs signing and verification operations using
        RSASSA-PKCS-v1_5 and the specified hash function.
        c             C   s
   || _ d S )N)rK   )r9   rK   r4   r4   r5   rL      s    zRSAAlgorithm.__init__c             C   s   t |tst |tr|S t |tr~t|}y.|jdrFt|t d}nt|d t d}W q t	k
rz   t
|t d}Y qX ntd|S )Ns   ssh-rsa)backend)passwordr[   zExpecting a PEM-formatted key.)
isinstancer   r   r   r	   
startswithr   r   r   
ValueErrorr   	TypeError)r9   r:   r4   r4   r5   r;      s    



zRSAAlgorithm.prepare_keyc             C   s   d }t | dd r| j }ddgtt|jjtt|jjtt|jtt|jtt|j	tt|j
tt|jtt|jd
}nBt | dd r| j }ddgtt|jtt|jd}ntdtj|S )Nprivate_numbersRSAr=   )
rR   key_opsnedpqdpdqqir?   )rR   rc   rd   re   zNot a public or private key)getattrra   r
   r   public_numbersrd   re   rf   rg   rh   dmp1dmq1iqmpr   rS   rT   )r@   rW   numbersr4   r4   r5   rA      s*    zRSAAlgorithm.to_jwkc       	         s  yt j|  W n tk
r*   tdY nX  jddkrBtdd koXd koXd krfd krltd	d
ddddg} fdd|D }t|}|rt| rtdtt d t d }|rt	t d t d
 t d t d t d t d |d}nHt d }t
|j||j\}}t	|||t||t||t|||d}|jt S d krd krtt d t d }|jt S tdd S )NzKey is not valid JSONrR   rb   zNot an RSA keyrf   re   rd   Zothz5Unsupported RSA private key: > 2 primes not supportedrg   rh   ri   rj   rk   c                s   g | ]}| kqS r4   r4   )rM   Zprop)rW   r4   r5   rN   	  s    z)RSAAlgorithm.from_jwk.<locals>.<listcomp>z@RSA key must include all parameters if any are present besides d)rf   rg   rh   rn   ro   rp   rm   zNot a public or private key)rS   rU   r_   r   rV   rO   allr   r   r   r   rd   re   r   r   r   Zprivate_keyr   Z
public_key)	rB   Zother_propsZprops_foundZany_props_foundrm   rq   rf   rg   rh   r4   )rW   r5   rC      sT    






zRSAAlgorithm.from_jwkc             C   s   |j |tj | j S )N)r=   r   PKCS1v15rK   )r9   r<   r:   r4   r4   r5   r=   8  s    zRSAAlgorithm.signc             C   s6   y|j ||tj | j  dS  tk
r0   dS X d S )NTF)r?   r   rs   rK   r   )r9   r<   r:   r>   r4   r4   r5   r?   ;  s
    zRSAAlgorithm.verifyN)rD   rE   rF   rG   r   r,   r-   r.   rL   r;   rH   rA   rC   r=   r?   r4   r4   r4   r5   r1      s   $?r1   c               @   sB   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 )r2   zr
        Performs signing and verification operations using
        ECDSA and the specified hash function
        c             C   s
   || _ d S )N)rK   )r9   rK   r4   r4   r5   rL   K  s    zECAlgorithm.__init__c             C   s   t |tst |tr|S t |tr~t|}y,|jdrFt|t d}nt|t d}W q t	k
rz   t
|d t d}Y qX ntd|S )Ns   ecdsa-sha2-)r[   )r\   r[   zExpecting a PEM-formatted key.)r]   r   r   r   r	   r^   r   r   r   r_   r   r`   )r9   r:   r4   r4   r5   r;   N  s    



zECAlgorithm.prepare_keyc             C   s"   |j |tj| j }t||jS )N)r=   r   ECDSArK   r   curve)r9   r<   r:   der_sigr4   r4   r5   r=   f  s    zECAlgorithm.signc             C   s\   yt ||j}W n tk
r$   dS X y|j||tj| j  dS  tk
rV   dS X d S )NFT)r   ru   r_   r?   r   rt   rK   r   )r9   r<   r:   r>   rv   r4   r4   r5   r?   k  s    zECAlgorithm.verifyN)rD   rE   rF   rG   r   r,   r-   r.   rL   r;   r=   r?   r4   r4   r4   r5   r2   B  s   r2   c               @   s    e Zd ZdZdd Zdd ZdS )r3   zA
        Performs a signature using RSASSA-PSS with MGF1
        c             C   s*   |j |tjtj| j | jjd| j S )N)mgfsalt_length)r=   r   PSSMGF1rK   digest_size)r9   r<   r:   r4   r4   r5   r=   |  s    
zRSAPSSAlgorithm.signc             C   sJ   y0|j ||tjtj| j | jjd| j  dS  tk
rD   dS X d S )N)rw   rx   TF)r?   r   ry   rz   rK   r{   r   )r9   r<   r:   r>   r4   r4   r5   r?     s    

zRSAPSSAlgorithm.verifyN)rD   rE   rF   rG   r=   r?   r4   r4   r4   r5   r3   w  s   
r3   )6rZ   rX   rS   compatr   r   
exceptionsr   Zutilsr   r   r   r	   r
   r   r   r   Zcryptography.hazmat.primitivesr   Z,cryptography.hazmat.primitives.serializationr   r   r   Z-cryptography.hazmat.primitives.asymmetric.rsar   r   r   r   r   r   r   r   Z,cryptography.hazmat.primitives.asymmetric.ecr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   Zcryptography.hazmat.backendsr   Zcryptography.exceptionsr   r/   ImportErrorsetZrequires_cryptographyr6   objectr7   r*   r+   r1   r2   r3   r4   r4   r4   r5   <module>   s6   ((
(4 5