B
    `9              &   @   s8  U 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
mZ d dlmZmZmZ G dd deZG d	d
 d
e jdZG dd de jdZG dd de jdZeZG dd de jdZeZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG d d! d!eZ G d"d# d#eZ!G d$d% d%eZ"G d&d' d'eZ#G d(d) d)eZ$G d*d+ d+eZ%G d,d- d-eZ&G d.d/ d/eZ'G d0d1 d1eZ(G d2d3 d3eZ)G d4d5 d5eZ*G d6d7 d7eZ+e(e%e(e'e%e$e#e&e"e!e eeeeeeee)e*e+d8Z,ej-e.ej/e f e0d9< G d:d; d;eZ1dKeed<d=d>Z2dLe3eed?d@dAZ4G dBdC dCeZ5G dDdE dEeZ6G dFdG dGeZ7ej(e(ej'e'ej&e&ej%e%ej$e$ej#e#ej8e)ej9e*ej:e+ej"e"ejeej!e!ejeej e ejeejeejeejeejeiZ;eej/e dHdIdJZ<dS )M    N)utils)ObjectIdentifier)_get_backend)_serializationhashes)AsymmetricSignatureContextAsymmetricVerificationContextr   c               @   s   e Zd ZedZedZedZedZedZedZ	edZ
edZed	Zed
ZedZedZedZedZedZedZedZedZedZdS )EllipticCurveOIDz1.2.840.10045.3.1.1z1.3.132.0.33z1.3.132.0.10z1.2.840.10045.3.1.7z1.3.132.0.34z1.3.132.0.35z1.3.36.3.3.2.8.1.1.7z1.3.36.3.3.2.8.1.1.11z1.3.36.3.3.2.8.1.1.13z1.3.132.0.1z1.3.132.0.15z1.3.132.0.26z1.3.132.0.27z1.3.132.0.16z1.3.132.0.17z1.3.132.0.36z1.3.132.0.37z1.3.132.0.38z1.3.132.0.39N)__name__
__module____qualname__r   	SECP192R1	SECP224R1	SECP256K1	SECP256R1	SECP384R1	SECP521R1BRAINPOOLP256R1BRAINPOOLP384R1BRAINPOOLP512R1	SECT163K1	SECT163R2	SECT233K1	SECT233R1	SECT283K1	SECT283R1	SECT409K1	SECT409R1	SECT571K1	SECT571R1 r    r    [/home/dcms/DCMS/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/ec.pyr	      s&   r	   c               @   s4   e Zd ZejedddZejedddZdS )EllipticCurve)returnc             C   s   dS )z8
        The name of the curve. e.g. secp256r1.
        Nr    )selfr    r    r!   name,   s    zEllipticCurve.namec             C   s   dS )z<
        Bit size of a secret scalar for the curve.
        Nr    )r$   r    r    r!   key_size2   s    zEllipticCurve.key_sizeN)	r
   r   r   abcabstractpropertystrr%   intr&   r    r    r    r!   r"   +   s   r"   )	metaclassc               @   s.   e Zd Zejejeje	j
f dddZdS )EllipticCurveSignatureAlgorithm)r#   c             C   s   dS )z@
        The digest algorithm used with this signature.
        Nr    )r$   r    r    r!   	algorithm:   s    z)EllipticCurveSignatureAlgorithm.algorithmN)r
   r   r   r'   r(   typingUnion
asym_utilsZ	Prehashedr   ZHashAlgorithmr-   r    r    r    r!   r,   9   s   r,   c               @   s   e Zd ZejeedddZejddedddZ	ejdd	d
dZ
ejed	ddZejed	ddZejeedddZejdd	ddZejejejejedddZdS )EllipticCurvePrivateKey)signature_algorithmr#   c             C   s   dS )zN
        Returns an AsymmetricSignatureContext used for signing data.
        Nr    )r$   r2   r    r    r!   signerD   s    zEllipticCurvePrivateKey.signerECDHEllipticCurvePublicKey)r-   peer_public_keyr#   c             C   s   dS )z}
        Performs a key exchange operation using the provided algorithm with the
        provided peer's public key.
        Nr    )r$   r-   r6   r    r    r!   exchangeM   s    z EllipticCurvePrivateKey.exchange)r#   c             C   s   dS )zB
        The EllipticCurvePublicKey for this private key.
        Nr    )r$   r    r    r!   
public_keyV   s    z"EllipticCurvePrivateKey.public_keyc             C   s   dS )z8
        The EllipticCurve that this key is on.
        Nr    )r$   r    r    r!   curve\   s    zEllipticCurvePrivateKey.curvec             C   s   dS )z<
        Bit size of a secret scalar for the curve.
        Nr    )r$   r    r    r!   r&   b   s    z EllipticCurvePrivateKey.key_sizec             C   s   dS )z 
        Signs the data
        Nr    )r$   datar2   r    r    r!   signh   s    zEllipticCurvePrivateKey.signEllipticCurvePrivateNumbersc             C   s   dS )z9
        Returns an EllipticCurvePrivateNumbers.
        Nr    )r$   r    r    r!   private_numbersr   s    z'EllipticCurvePrivateKey.private_numbers)encodingformatencryption_algorithmr#   c             C   s   dS )z6
        Returns the key serialized as bytes.
        Nr    )r$   r>   r?   r@   r    r    r!   private_bytesx   s    	z%EllipticCurvePrivateKey.private_bytesN)r
   r   r   r'   abstractmethodr,   r   r3   bytesr7   r8   r(   r"   r9   r*   r&   r;   r=   r   EncodingZPrivateFormatZKeySerializationEncryptionrA   r    r    r    r!   r1   C   s,   r1   c               @   s   e Zd ZejeeedddZej	e
dddZej	edddZejd	dd
dZejejejedddZejeeeddddZee
ed dddZdS )r5   )	signaturer2   r#   c             C   s   dS )zQ
        Returns an AsymmetricVerificationContext used for signing data.
        Nr    )r$   rE   r2   r    r    r!   verifier   s    zEllipticCurvePublicKey.verifier)r#   c             C   s   dS )z8
        The EllipticCurve that this key is on.
        Nr    )r$   r    r    r!   r9      s    zEllipticCurvePublicKey.curvec             C   s   dS )z<
        Bit size of a secret scalar for the curve.
        Nr    )r$   r    r    r!   r&      s    zEllipticCurvePublicKey.key_sizeEllipticCurvePublicNumbersc             C   s   dS )z8
        Returns an EllipticCurvePublicNumbers.
        Nr    )r$   r    r    r!   public_numbers   s    z%EllipticCurvePublicKey.public_numbers)r>   r?   r#   c             C   s   dS )z6
        Returns the key serialized as bytes.
        Nr    )r$   r>   r?   r    r    r!   public_bytes   s    z#EllipticCurvePublicKey.public_bytesN)rE   r:   r2   r#   c             C   s   dS )z5
        Verifies the signature of the data.
        Nr    )r$   rE   r:   r2   r    r    r!   verify   s    	zEllipticCurvePublicKey.verify)r9   r:   r#   c             C   s^   t d| t|tstdt|dkr2td|d dkrFtdddlm} |	||S )Nr:   z'curve must be an EllipticCurve instancer   z%data must not be an empty byte string)         z%Unsupported elliptic curve point type)backend)
r   _check_bytes
isinstancer"   	TypeErrorlen
ValueErrorZ,cryptography.hazmat.backends.openssl.backendrN   Z load_elliptic_curve_public_bytes)clsr9   r:   rN   r    r    r!   from_encoded_point   s    
z)EllipticCurvePublicKey.from_encoded_point)r
   r   r   r'   rB   rC   r,   r   rF   r(   r"   r9   r*   r&   rH   r   rD   ZPublicFormatrI   rJ   classmethodrU   r    r    r    r!   r5      s,   r5   c               @   s   e Zd ZdZdZdS )r   	sect571r1i:  N)r
   r   r   r%   r&   r    r    r    r!   r      s   r   c               @   s   e Zd ZdZdZdS )r   	sect409r1i  N)r
   r   r   r%   r&   r    r    r    r!   r      s   r   c               @   s   e Zd ZdZdZdS )r   	sect283r1i  N)r
   r   r   r%   r&   r    r    r    r!   r      s   r   c               @   s   e Zd ZdZdZdS )r   	sect233r1   N)r
   r   r   r%   r&   r    r    r    r!   r      s   r   c               @   s   e Zd ZdZdZdS )r   	sect163r2   N)r
   r   r   r%   r&   r    r    r    r!   r      s   r   c               @   s   e Zd ZdZdZdS )r   	sect571k1i;  N)r
   r   r   r%   r&   r    r    r    r!   r      s   r   c               @   s   e Zd ZdZdZdS )r   	sect409k1i  N)r
   r   r   r%   r&   r    r    r    r!   r      s   r   c               @   s   e Zd ZdZdZdS )r   	sect283k1i  N)r
   r   r   r%   r&   r    r    r    r!   r      s   r   c               @   s   e Zd ZdZdZdS )r   	sect233k1r[   N)r
   r   r   r%   r&   r    r    r    r!   r      s   r   c               @   s   e Zd ZdZdZdS )r   	sect163k1r]   N)r
   r   r   r%   r&   r    r    r    r!   r      s   r   c               @   s   e Zd ZdZdZdS )r   	secp521r1i	  N)r
   r   r   r%   r&   r    r    r    r!   r     s   r   c               @   s   e Zd ZdZdZdS )r   	secp384r1i  N)r
   r   r   r%   r&   r    r    r    r!   r     s   r   c               @   s   e Zd ZdZdZdS )r   	secp256r1   N)r
   r   r   r%   r&   r    r    r    r!   r     s   r   c               @   s   e Zd ZdZdZdS )r   	secp256k1rf   N)r
   r   r   r%   r&   r    r    r    r!   r     s   r   c               @   s   e Zd ZdZdZdS )r   	secp224r1   N)r
   r   r   r%   r&   r    r    r    r!   r     s   r   c               @   s   e Zd ZdZdZdS )r   	secp192r1   N)r
   r   r   r%   r&   r    r    r    r!   r     s   r   c               @   s   e Zd ZdZdZdS )BrainpoolP256R1brainpoolP256r1rf   N)r
   r   r   r%   r&   r    r    r    r!   rl      s   rl   c               @   s   e Zd ZdZdZdS )BrainpoolP384R1brainpoolP384r1i  N)r
   r   r   r%   r&   r    r    r    r!   rn   %  s   rn   c               @   s   e Zd ZdZdZdS )BrainpoolP512R1brainpoolP512r1i   N)r
   r   r   r%   r&   r    r    r    r!   rp   *  s   rp   )Z
prime192v1Z
prime256v1rj   rh   re   rd   rc   rg   rb   ra   r`   r_   r^   r\   rZ   rY   rX   rW   rm   ro   rq   _CURVE_TYPESc               @   s   e Zd Zdd ZedZdS )ECDSAc             C   s
   || _ d S )N)
_algorithm)r$   r-   r    r    r!   __init__I  s    zECDSA.__init__rt   N)r
   r   r   ru   r   read_only_propertyr-   r    r    r    r!   rs   H  s   rs   )r9   r#   c             C   s   t |}|| S )N)r   Z#generate_elliptic_curve_private_key)r9   rN   r    r    r!   generate_private_keyO  s    rw   )private_valuer9   r#   c             C   sH   t |}t| tstd| dkr*tdt|ts<td|| |S )Nz&private_value must be an integer type.r   z)private_value must be a positive integer.z/curve must provide the EllipticCurve interface.)r   rP   r*   rQ   rS   r"   Z!derive_elliptic_curve_private_key)rx   r9   rN   r    r    r!   derive_private_keyV  s    

ry   c               @   s   e Zd ZeeedddZdedddZeddd	Z	e
eed d
ddZedZedZedZdd Zdd Zdd Zdd ZdS )rG   )xyr9   c             C   sD   t |trt |tstdt |ts.td|| _|| _|| _d S )Nzx and y must be integers.z/curve must provide the EllipticCurve interface.)rP   r*   rQ   r"   _y_x_curve)r$   rz   r{   r9   r    r    r!   ru   g  s    
z#EllipticCurvePublicNumbers.__init__N)r#   c             C   s   t |}|| S )N)r   Z"load_elliptic_curve_public_numbers)r$   rN   r    r    r!   r8   r  s    z%EllipticCurvePublicNumbers.public_keyc             C   sB   t jdtjdd | jjd d }dt| j| t| j| S )Nzencode_point has been deprecated on EllipticCurvePublicNumbers and will be removed in a future version. Please use EllipticCurvePublicKey.public_bytes to obtain both compressed and uncompressed point encoding.rK   )
stacklevel         )	warningswarnr   PersistentlyDeprecated2019r9   r&   Zint_to_bytesrz   r{   )r$   byte_lengthr    r    r!   encode_pointv  s    z'EllipticCurvePublicNumbers.encode_point)r9   r:   r#   c             C   s   t |tstdtjdtjdd |dr|jd d }t	|d| d krt
|d|d  d	}t
||d d  d	}| |||S td
ntdd S )Nz'curve must be an EllipticCurve instancezSupport for unsafe construction of public numbers from encoded data will be removed in a future version. Please use EllipticCurvePublicKey.from_encoded_pointrK   )r   r   r   r      bigz(Invalid elliptic curve point data lengthz%Unsupported elliptic curve point type)rP   r"   rQ   r   r   r   r   
startswithr&   rR   r*   
from_bytesrS   )rT   r9   r:   r   rz   r{   r    r    r!   rU     s    


z-EllipticCurvePublicNumbers.from_encoded_pointr~   r}   r|   c             C   sF   t |tstS | j|jkoD| j|jkoD| jj|jjkoD| jj|jjkS )N)rP   rG   NotImplementedrz   r{   r9   r%   r&   )r$   otherr    r    r!   __eq__  s    
z!EllipticCurvePublicNumbers.__eq__c             C   s
   | |k S )Nr    )r$   r   r    r    r!   __ne__  s    z!EllipticCurvePublicNumbers.__ne__c             C   s   t | j| j| jj| jjfS )N)hashrz   r{   r9   r%   r&   )r$   r    r    r!   __hash__  s    z#EllipticCurvePublicNumbers.__hash__c             C   s
   d | S )NzC<EllipticCurvePublicNumbers(curve={0.curve.name}, x={0.x}, y={0.y}>)r?   )r$   r    r    r!   __repr__  s    z#EllipticCurvePublicNumbers.__repr__)N)r
   r   r   r*   r"   ru   r5   r8   rC   r   rV   rU   r   rv   r9   rz   r{   r   r   r   r   r    r    r    r!   rG   f  s   


rG   c               @   sX   e Zd ZeedddZdedddZe	dZ
e	d	Zd
d Zdd Zdd ZdS )r<   )rx   rH   c             C   s4   t |tstdt |ts$td|| _|| _d S )Nz!private_value must be an integer.z>public_numbers must be an EllipticCurvePublicNumbers instance.)rP   r*   rQ   rG   _private_value_public_numbers)r$   rx   rH   r    r    r!   ru     s    

z$EllipticCurvePrivateNumbers.__init__N)r#   c             C   s   t |}|| S )N)r   Z#load_elliptic_curve_private_numbers)r$   rN   r    r    r!   private_key  s    z'EllipticCurvePrivateNumbers.private_keyr   r   c             C   s&   t |tstS | j|jko$| j|jkS )N)rP   r<   r   rx   rH   )r$   r   r    r    r!   r     s    
z"EllipticCurvePrivateNumbers.__eq__c             C   s
   | |k S )Nr    )r$   r   r    r    r!   r     s    z"EllipticCurvePrivateNumbers.__ne__c             C   s   t | j| jfS )N)r   rx   rH   )r$   r    r    r!   r     s    z$EllipticCurvePrivateNumbers.__hash__)N)r
   r   r   r*   rG   ru   r1   r   r   rv   rx   rH   r   r   r   r    r    r    r!   r<     s   

	r<   c               @   s   e Zd ZdS )r4   N)r
   r   r   r    r    r    r!   r4     s   r4   )oidr#   c             C   s*   yt |  S  tk
r$   tdY nX d S )NzCThe provided object identifier has no matching elliptic curve class)_OID_TO_CURVEKeyErrorLookupError)r   r    r    r!   get_curve_for_oid   s
    r   )N)N)=r'   r.   r   Zcryptographyr   Zcryptography.hazmat._oidr   Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   r0   objectr	   ABCMetar"   r,   r1   Z(EllipticCurvePrivateKeyWithSerializationr5   Z'EllipticCurvePublicKeyWithSerializationr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rl   rn   rp   rr   Dictr)   Type__annotations__rs   rw   r*   ry   rG   r<   r4   r   r   r   r   r   r    r    r    r!   <module>   s    
AF X'
