U
    *}f6                  &   @   s  d dl mZmZm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 G dd deZeejG dd	 d	eZeejG d
d deZeejG dd deZeejG dd deZeejG dd deZeZeeG dd deZeeG dd deZeeG dd deZeeG dd deZeeG dd deZeeG dd deZeeG dd deZeeG d d! d!eZeeG d"d# d#eZ eeG d$d% d%eZ!eeG d&d' d'eZ"eeG d(d) d)eZ#eeG d*d+ d+eZ$eeG d,d- d-eZ%eeG d.d/ d/eZ&eeG d0d1 d1eZ'eeG d2d3 d3eZ(eeG d4d5 d5eZ)ee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eG d9d: d:eZ,dGd;d<Z-dHd=d>Z.G d?d@ d@eZ/G dAdB dBeZ0G dCdD dDeZ1ej'e'ej&e&ej%e%ej$e$ej#e#ej"e"ej2e(ej3e)ej4e*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Z5dEdF Z6dS )I    )absolute_importdivisionprint_functionN)utils)ObjectIdentifier)_get_backendc                   @   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   P/tmp/pip-unpacked-wheel-x36vw73o/cryptography/hazmat/primitives/asymmetric/ec.pyr      s&   r   c                   @   s(   e Zd Zejdd Zejdd ZdS )EllipticCurvec                 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_size/   s    zEllipticCurve.key_sizeN)r	   r
   r   abcabstractpropertyr$   r&   r   r   r   r    r!   '   s   
r!   c                   @   s   e Zd Zejdd ZdS )EllipticCurveSignatureAlgorithmc                 C   s   dS )z@
        The digest algorithm used with this signature.
        Nr   r"   r   r   r    	algorithm8   s    z)EllipticCurveSignatureAlgorithm.algorithmN)r	   r
   r   r'   r(   r*   r   r   r   r    r)   6   s   r)   c                   @   s`   e Zd Zejdd Zejdd Zejdd Zejdd Z	ejd	d
 Z
ejdd ZdS )EllipticCurvePrivateKeyc                 C   s   dS )zN
        Returns an AsymmetricSignatureContext used for signing data.
        Nr   )r#   signature_algorithmr   r   r    signerA   s    zEllipticCurvePrivateKey.signerc                 C   s   dS )z}
        Performs a key exchange operation using the provided algorithm with the
        provided peer's public key.
        Nr   )r#   r*   Zpeer_public_keyr   r   r    exchangeG   s    z EllipticCurvePrivateKey.exchangec                 C   s   dS )zB
        The EllipticCurvePublicKey for this private key.
        Nr   r"   r   r   r    
public_keyN   s    z"EllipticCurvePrivateKey.public_keyc                 C   s   dS z8
        The EllipticCurve that this key is on.
        Nr   r"   r   r   r    curveT   s    zEllipticCurvePrivateKey.curvec                 C   s   dS r%   r   r"   r   r   r    r&   Z   s    z EllipticCurvePrivateKey.key_sizec                 C   s   dS )z 
        Signs the data
        Nr   )r#   datar,   r   r   r    sign`   s    zEllipticCurvePrivateKey.signN)r	   r
   r   r'   abstractmethodr-   r.   r/   r(   r1   r&   r3   r   r   r   r    r+   ?   s   




r+   c                   @   s(   e Zd Zejdd Zejdd ZdS )(EllipticCurvePrivateKeyWithSerializationc                 C   s   dS )z9
        Returns an EllipticCurvePrivateNumbers.
        Nr   r"   r   r   r    private_numbersi   s    z8EllipticCurvePrivateKeyWithSerialization.private_numbersc                 C   s   dS z6
        Returns the key serialized as bytes.
        Nr   )r#   encodingformatZencryption_algorithmr   r   r    private_byteso   s    z6EllipticCurvePrivateKeyWithSerialization.private_bytesN)r	   r
   r   r'   r4   r6   r:   r   r   r   r    r5   g   s   
r5   c                   @   sl   e Zd Zejdd Zejdd Zejdd Zejdd Z	ejd	d
 Z
ejdd Zedd ZdS )EllipticCurvePublicKeyc                 C   s   dS )zQ
        Returns an AsymmetricVerificationContext used for signing data.
        Nr   )r#   	signaturer,   r   r   r    verifierx   s    zEllipticCurvePublicKey.verifierc                 C   s   dS r0   r   r"   r   r   r    r1   ~   s    zEllipticCurvePublicKey.curvec                 C   s   dS r%   r   r"   r   r   r    r&      s    zEllipticCurvePublicKey.key_sizec                 C   s   dS )z8
        Returns an EllipticCurvePublicNumbers.
        Nr   r"   r   r   r    public_numbers   s    z%EllipticCurvePublicKey.public_numbersc                 C   s   dS r7   r   )r#   r8   r9   r   r   r    public_bytes   s    z#EllipticCurvePublicKey.public_bytesc                 C   s   dS )z5
        Verifies the signature of the data.
        Nr   )r#   r<   r2   r,   r   r   r    verify   s    zEllipticCurvePublicKey.verifyc                 C   sb   t d| t|tstdt|dkr2tdt|ddkrJtdddl	m
} |||S )Nr2   'curve must be an EllipticCurve instancer   z%data must not be an empty byte string)         %Unsupported elliptic curve point type)backend)r   _check_bytes
isinstancer!   	TypeErrorlen
ValueErrorsix
indexbytesZ,cryptography.hazmat.backends.openssl.backendrF   Z load_elliptic_curve_public_bytes)clsr1   r2   rF   r   r   r    from_encoded_point   s    
z)EllipticCurvePublicKey.from_encoded_pointN)r	   r
   r   r'   r4   r=   r(   r1   r&   r>   r?   r@   classmethodrO   r   r   r   r    r;   v   s   





r;   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   	sect409r1  NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect283r1  NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect233r1   NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect163r2   NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect571k1i;  NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect409k1rT   NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect283k1rV   NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect233k1rX   NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect163k1rZ   NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	secp521r1i	  NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	secp384r1  NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	secp256r1   NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	secp256k1rd   NrR   r   r   r   r    r      s   r   c                   @   s   e Zd ZdZdZdS )r   	secp224r1   NrR   r   r   r   r    r     s   r   c                   @   s   e Zd ZdZdZdS )r   	secp192r1   NrR   r   r   r   r    r     s   r   c                   @   s   e Zd ZdZdZdS )BrainpoolP256R1brainpoolP256r1rd   NrR   r   r   r   r    rj     s   rj   c                   @   s   e Zd ZdZdZdS )BrainpoolP384R1brainpoolP384r1rb   NrR   r   r   r   r    rl     s   rl   c                   @   s   e Zd ZdZdZdS )BrainpoolP512R1brainpoolP512r1i   NrR   r   r   r   r    rn     s   rn   )Z
prime192v1Z
prime256v1rh   rf   rc   ra   r`   re   r_   r^   r]   r\   r[   rY   rW   rU   rS   rQ   rk   rm   ro   c                   @   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__>  s    zECDSA.__init__rr   N)r	   r
   r   rs   r   read_only_propertyr*   r   r   r   r    rp   <  s   rp   c                 C   s   t |}|| S rq   )r   Z#generate_elliptic_curve_private_key)r1   rF   r   r   r    generate_private_keyD  s    ru   c                 C   sJ   t |}t| tj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./curve must provide the EllipticCurve interface.)r   rH   rL   integer_typesrI   rK   r!   Z!derive_elliptic_curve_private_key)private_valuer1   rF   r   r   r    derive_private_keyI  s    
ry   c                   @   sp   e Zd Zdd ZdddZdd Ze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 )EllipticCurvePublicNumbersc                 C   sH   t |tjrt |tjs tdt |ts2td|| _|| _|| _d S )Nzx and y must be integers.rv   )rH   rL   rw   rI   r!   _y_x_curve)r#   xyr1   r   r   r    rs   X  s     
z#EllipticCurvePublicNumbers.__init__Nc                 C   s   t |}|| S rq   )r   Z"load_elliptic_curve_public_numbersr#   rF   r   r   r    r/   e  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.rB   
stacklevel         )	warningswarnr   PersistentlyDeprecated2019r1   r&   Zint_to_bytesr~   r   )r#   byte_lengthr   r   r    encode_pointi  s    	z'EllipticCurvePublicNumbers.encode_pointc                 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 )NrA   zSupport for unsafe construction of public numbers from encoded data will be removed in a future version. Please use EllipticCurvePublicKey.from_encoded_pointrB   r   r   r   r      bigz(Invalid elliptic curve point data lengthrE   )rH   r!   rI   r   r   r   r   
startswithr&   rJ   Zint_from_bytesrK   )rN   r1   r2   r   r~   r   r   r   r    rO   z  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 rq   )rH   rz   NotImplementedr~   r   r1   r$   r&   r#   otherr   r   r    __eq__  s    

z!EllipticCurvePublicNumbers.__eq__c                 C   s
   | |k S rq   r   r   r   r   r    __ne__  s    z!EllipticCurvePublicNumbers.__ne__c                 C   s   t | j| j| jj| jjfS rq   )hashr~   r   r1   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}>)r9   r"   r   r   r    __repr__  s    z#EllipticCurvePublicNumbers.__repr__)N)r	   r
   r   rs   r/   r   rP   rO   r   rt   r1   r~   r   r   r   r   r   r   r   r   r    rz   W  s   




rz   c                   @   sJ   e Zd Zdd ZdddZedZedZdd	 Z	d
d Z
dd ZdS )EllipticCurvePrivateNumbersc                 C   s6   t |tj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.)rH   rL   rw   rI   rz   _private_value_public_numbers)r#   rx   r>   r   r   r    rs     s    
z$EllipticCurvePrivateNumbers.__init__Nc                 C   s   t |}|| S rq   )r   Z#load_elliptic_curve_private_numbersr   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 rq   )rH   r   r   rx   r>   r   r   r   r    r     s
    

z"EllipticCurvePrivateNumbers.__eq__c                 C   s
   | |k S rq   r   r   r   r   r    r     s    z"EllipticCurvePrivateNumbers.__ne__c                 C   s   t | j| jfS rq   )r   rx   r>   r"   r   r   r    r     s    z$EllipticCurvePrivateNumbers.__hash__)N)r	   r
   r   rs   r   r   rt   rx   r>   r   r   r   r   r   r   r    r     s   


	r   c                   @   s   e Zd ZdS )ECDHN)r	   r
   r   r   r   r   r    r     s   r   c                 C   s,   z
t |  W 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)oidr   r   r    get_curve_for_oid  s    
r   )N)N)7
__future__r   r   r   r'   r   rL   Zcryptographyr   Zcryptography.hazmat._oidr   Zcryptography.hazmat.backendsr   objectr   add_metaclassABCMetar!   r)   r+   r5   r;   Z'EllipticCurvePublicKeyWithSerializationZregister_interfacer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rj   rl   rn   Z_CURVE_TYPESrp   ru   ry   rz   r   r   r   r   r   r   r   r   r   r   r    <module>   s   


'

7

X%                   