
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
“k®Z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 yˆd 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*�rˆG 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 q†X 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|ƒ}|rªt|ƒ rªt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�r dˆ k�r t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 q†X 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