o
    c8                  	   @   s  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m	Z	 d dl
mZ G dd d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 d.d/ d/eZ#G d0d1 d1eZ$G d2d3 d3eZ%G d4d5 d5eZ&i d6e#d7e d8e#d9e"d:e d;ed<ed=e!d>ed?ed@edAedBedCedDedEedFeee$e%e&dGZ'ej(e)ej*e f e+dH< G dIdJ dJeZ,	d\dKedLej-dMefdNdOZ.	d\dPe/dKedLej-dMefdQdRZ0G dSdT dTZ1G dUdV dVZ2G dWdX dXZ3i ej#e#ej"e"ej!e!ej e ejeejeej4e$ej5e%ej6e&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Z7dYedMej*e fdZd[Z8dS )]    N)utils)ObjectIdentifier)_serializationhashesc                   @   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   Pusr/lib/python3.10/site-packages/cryptography/hazmat/primitives/asymmetric/ec.pyr      s(    r   c                   @   s4   e Zd ZejdefddZejdefddZdS )EllipticCurvereturnc                 C      dS )z8
        The name of the curve. e.g. secp256r1.
        Nr   selfr   r   r   name)       zEllipticCurve.namec                 C   r!   z<
        Bit size of a secret scalar for the curve.
        Nr   r"   r   r   r   key_size/   r%   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dejeje	j
f fddZdS )EllipticCurveSignatureAlgorithmr    c                 C   r!   )z@
        The digest algorithm used with this signature.
        Nr   r"   r   r   r   	algorithm7   r%   z)EllipticCurveSignatureAlgorithm.algorithmN)r   r   r	   r(   r)   typingUnion
asym_utils	Prehashedr   HashAlgorithmr.   r   r   r   r   r-   6   s
    r-   c                	   @   s   e Zd ZejdddddefddZejddd	Zejde	fd
dZ
ejdefddZejdededefddZejdddZejdejdejdejdefddZdS )EllipticCurvePrivateKeyr.   ECDHpeer_public_keyEllipticCurvePublicKeyr    c                 C   r!   )z}
        Performs a key exchange operation using the provided algorithm with the
        provided peer's public key.
        Nr   )r#   r.   r6   r   r   r   exchangeA   r%   z EllipticCurvePrivateKey.exchangec                 C   r!   )zB
        The EllipticCurvePublicKey for this private key.
        Nr   r"   r   r   r   
public_keyJ   r%   z"EllipticCurvePrivateKey.public_keyc                 C   r!   z8
        The EllipticCurve that this key is on.
        Nr   r"   r   r   r   curveP   r%   zEllipticCurvePrivateKey.curvec                 C   r!   r&   r   r"   r   r   r   r'   V   r%   z EllipticCurvePrivateKey.key_sizedatasignature_algorithmc                 C   r!   )z 
        Signs the data
        Nr   )r#   r<   r=   r   r   r   sign\   r%   zEllipticCurvePrivateKey.signEllipticCurvePrivateNumbersc                 C   r!   )z9
        Returns an EllipticCurvePrivateNumbers.
        Nr   r"   r   r   r   private_numbersf   r%   z'EllipticCurvePrivateKey.private_numbersencodingformatencryption_algorithmc                 C   r!   z6
        Returns the key serialized as bytes.
        Nr   )r#   rA   rB   rC   r   r   r   private_bytesl   r%   z%EllipticCurvePrivateKey.private_bytesN)r    r7   )r    r?   )r   r   r	   r(   abstractmethodbytesr8   r9   r)   r   r;   r+   r'   r-   r>   r@   r   EncodingZPrivateFormatZKeySerializationEncryptionrE   r   r   r   r   r4   @   sF    	r4   c                	   @   s   e Zd ZejdefddZejdefddZej	dddZ
ej	d	ejd
ejdefddZej	dedededdfddZedededd fddZdS )r7   r    c                 C   r!   r:   r   r"   r   r   r   r;   |   r%   zEllipticCurvePublicKey.curvec                 C   r!   r&   r   r"   r   r   r   r'      r%   zEllipticCurvePublicKey.key_sizeEllipticCurvePublicNumbersc                 C   r!   )z8
        Returns an EllipticCurvePublicNumbers.
        Nr   r"   r   r   r   public_numbers   r%   z%EllipticCurvePublicKey.public_numbersrA   rB   c                 C   r!   rD   r   )r#   rA   rB   r   r   r   public_bytes   r%   z#EllipticCurvePublicKey.public_bytes	signaturer<   r=   Nc                 C   r!   )z5
        Verifies the signature of the data.
        Nr   )r#   rL   r<   r=   r   r   r   verify   r%   zEllipticCurvePublicKey.verifyr;   c                 C   s^   t d| t|tstdt|dkrtd|d dvr#tdddlm} |	||S )Nr<   '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,cryptography.hazmat.backends.openssl.backendrT   Z load_elliptic_curve_public_bytes)clsr;   r<   rT   r   r   r   from_encoded_point   s   
z)EllipticCurvePublicKey.from_encoded_point)r    rI   )r   r   r	   r(   r)   r   r;   r+   r'   rF   rJ   r   rH   ZPublicFormatrG   rK   r-   rM   classmethodr\   r   r   r   r   r7   {   sB    	
r7   c                   @      e Zd ZdZdZdS )r   	sect571r1i:  Nr   r   r	   r$   r'   r   r   r   r   r          r   c                   @   r^   )r   	sect409r1  Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	sect283r1  Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	sect233r1   Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	sect163r2   Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	sect571k1i;  Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	sect409k1rc   Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	sect283k1re   Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	sect233k1rg   Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	sect163k1ri   Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	secp521r1i	  Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	secp384r1  Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	secp256r1   Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	secp256k1rs   Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r   	secp224r1   Nr`   r   r   r   r   r      ra   r   c                   @   r^   )r
   	secp192r1   Nr`   r   r   r   r   r
     ra   r
   c                   @   r^   )BrainpoolP256R1brainpoolP256r1rs   Nr`   r   r   r   r   ry   
  ra   ry   c                   @   r^   )BrainpoolP384R1brainpoolP384r1rq   Nr`   r   r   r   r   r{     ra   r{   c                   @   r^   )BrainpoolP512R1brainpoolP512r1i   Nr`   r   r   r   r   r}     ra   r}   Z
prime192v1Z
prime256v1rw   ru   rr   rp   ro   rt   rn   rm   rl   rk   rj   rh   rf   rd   rb   )r_   rz   r|   r~   _CURVE_TYPESc                   @   sH   e Zd Zdejejejf fddZ	e
dejejejf fddZdS )ECDSAr.   c                 C   s
   || _ d S NZ
_algorithm)r#   r.   r   r   r   __init__3  s   
zECDSA.__init__r    c                 C      | j S r   r   r"   r   r   r   r.   9  s   zECDSA.algorithmN)r   r   r	   r/   r0   r1   r2   r   r3   r   propertyr.   r   r   r   r   r   2  s    
r   r;   rT   r    c                 C      ddl m} || S Nr   rS   )rZ   rT   Z#generate_elliptic_curve_private_key)r;   rT   osslr   r   r   generate_private_key@  s   
r   private_valuec                 C   sL   ddl m} t| tstd| dkrtdt|ts td|| |S )Nr   rS   z&private_value must be an integer type.z)private_value must be a positive integer./curve must provide the EllipticCurve interface.)rZ   rT   rV   r+   rW   rY   r   Z!derive_elliptic_curve_private_key)r   r;   rT   r   r   r   r   derive_private_keyH  s   

r   c                   @   s   e Zd ZdededefddZddejdefd	d
Z	de
fddZedede
dd fddZedefddZedefddZedefddZdedefddZdefddZdefddZdS )rI   xyr;   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.r   )rV   r+   rW   r   _y_x_curve)r#   r   r   r;   r   r   r   r   \  s   

z#EllipticCurvePublicNumbers.__init__NrT   r    c                 C   r   r   )rZ   rT   Z"load_elliptic_curve_public_numbersr#   rT   r   r   r   r   r9   g  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.rO   
stacklevel         )	warningswarnr   PersistentlyDeprecated2019r;   r'   int_to_bytesr   r   )r#   byte_lengthr   r   r   encode_pointn  s   	z'EllipticCurvePublicNumbers.encode_pointr<   c                 C   s   t |ts	tdtjdtjdd |drJ|jd d }t	|d| d krFt
|d|d  d	}t
||d d  d	}| |||S td
td)NrN   zSupport for unsafe construction of public numbers from encoded data will be removed in a future version. Please use EllipticCurvePublicKey.from_encoded_pointrO   r   r   r   r      bigz(Invalid elliptic curve point data lengthrR   )rV   r   rW   r   r   r   r   
startswithr'   rX   r+   
from_bytesrY   )r[   r;   r<   r   r   r   r   r   r   r\     s   

z-EllipticCurvePublicNumbers.from_encoded_pointc                 C   r   r   )r   r"   r   r   r   r;        z EllipticCurvePublicNumbers.curvec                 C   r   r   )r   r"   r   r   r   r     r   zEllipticCurvePublicNumbers.xc                 C   r   r   )r   r"   r   r   r   r     r   zEllipticCurvePublicNumbers.yotherc                 C   sF   t |tstS | j|jko"| j|jko"| jj|jjko"| jj|jjkS r   )rV   rI   NotImplementedr   r   r;   r$   r'   r#   r   r   r   r   __eq__  s   

z!EllipticCurvePublicNumbers.__eq__c                 C   s   t | j| j| jj| jjfS r   )hashr   r   r;   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}>)rB   r"   r   r   r   __repr__  s   z#EllipticCurvePublicNumbers.__repr__r   )r   r   r	   r+   r   r   r/   Anyr7   r9   rG   r   r]   r\   r   r;   r   r   objectboolr   r   r*   r   r   r   r   r   rI   [  s*    rI   c                   @   sz   e Zd ZdedefddZ	ddejdefdd	Z	e
defd
dZe
defddZdedefddZdefddZdS )r?   r   rJ   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.)rV   r+   rW   rI   _private_value_public_numbers)r#   r   rJ   r   r   r   r     s   


z$EllipticCurvePrivateNumbers.__init__NrT   r    c                 C   r   r   )rZ   rT   Z#load_elliptic_curve_private_numbersr   r   r   r   private_key  s   
z'EllipticCurvePrivateNumbers.private_keyc                 C   r   r   )r   r"   r   r   r   r     r   z)EllipticCurvePrivateNumbers.private_valuec                 C   r   r   )r   r"   r   r   r   rJ     r   z*EllipticCurvePrivateNumbers.public_numbersr   c                 C   s&   t |tstS | j|jko| j|jkS r   )rV   r?   r   r   rJ   r   r   r   r   r     s
   

z"EllipticCurvePrivateNumbers.__eq__c                 C   s   t | j| jfS r   )r   r   rJ   r"   r   r   r   r     s   z$EllipticCurvePrivateNumbers.__hash__r   )r   r   r	   r+   rI   r   r/   r   r4   r   r   r   rJ   r   r   r   r   r   r   r   r   r?     s$    

		r?   c                   @   s   e Zd ZdS )r5   N)r   r   r	   r   r   r   r   r5     s    r5   oidc                 C   s"   zt |  W S  ty   tdw )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   r   )9r(   r/   r   cryptographyr   Zcryptography.hazmat._oidr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr1   r   ABCMetar   r-   r4   Z(EllipticCurvePrivateKeyWithSerializationr7   Z'EllipticCurvePublicKeyWithSerializationr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   ry   r{   r}   r   Dictr*   Type__annotations__r   r   r   r+   r   rI   r?   r5   r   r   r   r   r   r   r   r   r   <module>   s  

8<	
 

`.	
