U
    e]5                  &   @   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
 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 d/d0 d0eZ%eeG d1d2 d2eZ&eeG d3d4 d4eZ'eeG d5d6 d6eZ(e%e"e%e$e"e!e e#eeeeeeeeeee&e'e(d7Z)eeG d8d9 d9eZ*d:d; Z+d<d= Z,G d>d? d?eZ-G d@dA dAeZ.G dBdC dCeZ/ej%e%ej$e$ej#e#ej"e"ej!e!ej e ej0e&ej1e'ej2e(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Z3dDdE Z4dS )F    )absolute_importdivisionprint_functionN)utils)ObjectIdentifierc                   @   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   N/usr/lib/python3/dist-packages/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   	algorithm7   s    z)EllipticCurveSignatureAlgorithm.algorithmN)r   r	   r
   r&   r'   r)   r   r   r   r   r(   5   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   signer@   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   exchangeF   s    z EllipticCurvePrivateKey.exchangec                 C   s   dS )zB
        The EllipticCurvePublicKey for this private key.
        Nr   r!   r   r   r   
public_keyM   s    z"EllipticCurvePrivateKey.public_keyc                 C   s   dS z8
        The EllipticCurve that this key is on.
        Nr   r!   r   r   r   curveS   s    zEllipticCurvePrivateKey.curvec                 C   s   dS r$   r   r!   r   r   r   r%   Y   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'   r0   r%   r2   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_numbersh   s    z8EllipticCurvePrivateKeyWithSerialization.private_numbersc                 C   s   dS z6
        Returns the key serialized as bytes.
        Nr   )r"   encodingformatZencryption_algorithmr   r   r   private_bytesn   s    z6EllipticCurvePrivateKeyWithSerialization.private_bytesN)r   r	   r
   r&   r3   r5   r9   r   r   r   r   r4   f   s   
r4   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   verifierw   s    zEllipticCurvePublicKey.verifierc                 C   s   dS r/   r   r!   r   r   r   r0   }   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 r6   r   )r"   r7   r8   r   r   r   public_bytes   s    z#EllipticCurvePublicKey.public_bytesc                 C   s   dS )z5
        Verifies the signature of the data.
        Nr   )r"   r;   r1   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 )Nr1   '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sixZ
indexbytesZ,cryptography.hazmat.backends.openssl.backendrE   Z load_elliptic_curve_public_bytes)clsr0   r1   rE   r   r   r   from_encoded_point   s    
z)EllipticCurvePublicKey.from_encoded_pointN)r   r	   r
   r&   r3   r<   r'   r0   r%   r=   r>   r?   classmethodrM   r   r   r   r   r:   u   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  NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect283r1  NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect233r1   NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect163r2   NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect571k1i;  NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect409k1rR   NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect283k1rT   NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect233k1rV   NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	sect163k1rX   NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	secp521r1i	  NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	secp384r1  NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	secp256r1   NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	secp256k1rb   NrP   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )r   	secp224r1   NrP   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdS )r   	secp192r1   NrP   r   r   r   r   r   	  s   r   c                   @   s   e Zd ZdZdZdS )BrainpoolP256R1brainpoolP256r1rb   NrP   r   r   r   r   rh     s   rh   c                   @   s   e Zd ZdZdZdS )BrainpoolP384R1brainpoolP384r1r`   NrP   r   r   r   r   rj     s   rj   c                   @   s   e Zd ZdZdZdS )BrainpoolP512R1brainpoolP512r1i   NrP   r   r   r   r   rl     s   rl   )Z
prime192v1Z
prime256v1rf   rd   ra   r_   r^   rc   r]   r\   r[   rZ   rY   rW   rU   rS   rQ   rO   ri   rk   rm   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__rp   N)r   r	   r
   rq   r   read_only_propertyr)   r   r   r   r   rn   >  s   rn   c                 C   s
   | | S ro   )Z#generate_elliptic_curve_private_key)r0   rE   r   r   r   generate_private_keyF  s    rs   c                 C   sB   t | tjstd| dkr$tdt |ts6t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.)rG   rK   integer_typesrH   rJ   r    Z!derive_elliptic_curve_private_key)private_valuer0   rE   r   r   r   derive_private_keyJ  s    
rw   c                   @   sn   e Zd Zdd Z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.rt   )rG   rK   ru   rH   r    _y_x_curve)r"   xyr0   r   r   r   rq   X  s    


z#EllipticCurvePublicNumbers.__init__c                 C   s
   | | S ro   )Z"load_elliptic_curve_public_numbersr"   rE   r   r   r   r.   f  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.rA   
stacklevel         )	warningswarnr   DeprecatedIn25r0   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 )Nr@   zSupport for unsafe construction of public numbers from encoded data will be removed in a future version. Please use EllipticCurvePublicKey.from_encoded_pointrA   r   r   r   r      Zbigz(Invalid elliptic curve point data lengthrD   )rG   r    rH   r   r   r   r   
startswithr%   rI   Zint_from_bytesrJ   )rL   r0   r1   r   r|   r}   r   r   r   rM   y  s    


z-EllipticCurvePublicNumbers.from_encoded_pointr{   rz   ry   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 ro   )rG   rx   NotImplementedr|   r}   r0   r#   r%   r"   otherr   r   r   __eq__  s    

z!EllipticCurvePublicNumbers.__eq__c                 C   s
   | |k S ro   r   r   r   r   r   __ne__  s    z!EllipticCurvePublicNumbers.__ne__c                 C   s   t | j| j| jj| jjfS ro   )hashr|   r}   r0   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}>)r8   r!   r   r   r   __repr__  s    z#EllipticCurvePublicNumbers.__repr__N)r   r	   r
   rq   r.   r   rN   rM   r   rr   r0   r|   r}   r   r   r   r   r   r   r   r   rx   W  s   



rx   c                   @   sH   e Zd Zdd Z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.)rG   rK   ru   rH   rx   _private_value_public_numbers)r"   rv   r=   r   r   r   rq     s    
z$EllipticCurvePrivateNumbers.__init__c                 C   s
   | | S ro   )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 ro   )rG   r   r   rv   r=   r   r   r   r   r     s
    

z"EllipticCurvePrivateNumbers.__eq__c                 C   s
   | |k S ro   r   r   r   r   r   r     s    z"EllipticCurvePrivateNumbers.__ne__c                 C   s   t | j| jfS ro   )r   rv   r=   r!   r   r   r   r     s    z$EllipticCurvePrivateNumbers.__hash__N)r   r	   r
   rq   r   r   rr   rv   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)Zoidr   r   r   get_curve_for_oid  s    
r   )5Z
__future__r   r   r   r&   r   rK   Zcryptographyr   Zcryptography.hazmat._oidr   objectr   Zadd_metaclassABCMetar    r(   r*   r4   r:   Z'EllipticCurvePublicKeyWithSerializationZregister_interfacer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rh   rj   rl   Z_CURVE_TYPESrn   rs   rw   rx   r   r   r   r   r   r   r   r   r   r   r   <module>   s   


'

6W$                   