o
    Œõ±j"Y  ã                   @   sÒ  d dl mZ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mZmZmZmZmZmZmZmZmZ ddlmZ ddlmZmZ ddlmZ dd	lmZ ejd
k rZeZ e!Z"ndd„ Z e	ƒ Z#e#dkrie$dƒ‚g d¢Z%ddddœZ&d d ddœZ'dd„ Z(dd„ Z)dd„ Z*dd„ Z+dd„ Z,	 dd „ Z-G d!d"„ d"ƒZ.G d#d$„ d$ƒZ/e/dddƒZ0e.d%d&d'ƒZ1e/e1d(d)d*ƒZ2e.d+d&d,ƒZ3e/e3d-d.d/ƒZ4e.d0d&d1ƒZ5e/e5d2d3d4ƒZ6e.d5d&d6ƒZ7e/e7d7d8d9ƒZ8e.d:d&d;ƒZ9e/e9d<d=d>ƒZ:dS )?é    )Úunicode_literalsÚdivisionÚabsolute_importÚprint_functionNé   )Úbackend)
ÚCertificateÚDSASignatureÚECDomainParametersÚECPointBitStringÚECPrivateKeyÚint_from_bytesÚPrivateKeyAlgorithmÚPrivateKeyInfoÚPublicKeyAlgorithmÚPublicKeyInfo)Úpretty_message)Ú	type_nameÚbyte_cls)Ú
rand_bytes)ÚSignatureError)é   c                 C   s
   t | gƒS ©N)Úbytes)Únum© r   ú‚/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/oscrypto/_ecdsa.pyÚchr_cls   s   
r   Ú	winlegacyz2Pure-python ECDSA code is only for Windows XP/2003)Úec_generate_pairÚec_compute_public_key_pointÚec_public_key_infoÚ
ecdsa_signÚecdsa_verifyé    é0   éB   ©Ú	secp256r1Ú	secp384r1Ú	secp521r1é   c                 C   sº   | t g d¢ƒvrttdt| ƒƒƒ‚t|  }tttdœ|  }	 t|ƒ}t	|dd�}|dkr2||j
k r2nqtdtdtd| d	�d
œƒtd|dœƒdœƒ}t|ƒ}| ¡ |d jd< t|| ƒ|fS )a³  
    Generates a EC public/private key pair

    :param curve:
        A unicode string. Valid values include "secp256r1", "secp384r1" and
        "secp521r1".

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type

    :return:
        A 2-element tuple of (asn1crypto.keys.PublicKeyInfo,
        asn1crypto.keys.PrivateKeyInfo)
    r'   ú\
            curve must be one of "secp256r1", "secp384r1", "secp521r1", not %s
            TF©Úsignedr   ÚecÚnamed©ÚnameÚvalue©Ú	algorithmÚ
parametersÚecPrivkeyVer1)ÚversionÚprivate_key)r8   Úprivate_key_algorithmr9   r9   Ú
public_key)ÚsetÚ
ValueErrorr   ÚreprÚCURVE_BYTESÚSECP256R1_BASE_POINTÚSECP384R1_BASE_POINTÚSECP521R1_BASE_POINTr   r   Úorderr   r   r
   r   r    ÚcopyÚparsedr!   )ÚcurveÚcurve_num_bytesÚcurve_base_pointÚprivate_key_bytesÚprivate_key_intÚprivate_key_infoÚec_pointr   r   r   r   C   sF   üýüûþþþ÷r   c                 C   s¬   t | tƒsttdt| ƒƒƒ‚| j\}}|dkrttdƒƒ‚|dkr'ttdƒƒ‚|dkrD|tg d¢ƒvr<ttdt|ƒƒƒ‚t	t
tdœ| }|| d	 jd	 j }t |j|j¡S )
a  
    Constructs the PublicKeyInfo for a PrivateKeyInfo

    :param private_key:
        An asn1crypto.keys.PrivateKeyInfo object

    :raises:
        ValueError - when any of the parameters contain an invalid value

    :return:
        An asn1crypto.keys.ECPointBitString object
    zy
            private_key must be an instance of the
            asn1crypto.keys.PrivateKeyInfo class, not %s
            Úimplicit_cazj
            Unable to compute public key for EC key using Implicit CA
            parameters
            Ú	specifiedzX
            Unable to compute public key for EC key over a specified field
            r0   r'   zj
                Named curve must be one of "secp256r1", "secp384r1", "secp521r1", not %s
                r9   )Ú
isinstancer   Ú	TypeErrorr   r   rF   r=   r<   r>   r@   rA   rB   rE   Únativer   Úfrom_coordsÚxÚy)r9   Ú
curve_typeÚdetailsÚ
base_pointÚpublic_pointr   r   r   r       s8   
û
ÿÿüýür    c                 C   sB   |t g d¢ƒvrttdt|ƒƒƒ‚ttdtd|d�dœƒ| dœƒS )aˆ  
    Constructs the PublicKeyInfo for an ECPointBitString

    :param private_key:
        An asn1crypto.keys.ECPointBitString object

    :param curve:
        A unicode string of the curve name - one of secp256r1, secp384r1 or secp521r1

    :raises:
        ValueError - when any of the parameters contain an invalid value

    :return:
        An asn1crypto.keys.PublicKeyInfo object
    r'   r,   r/   r0   r1   r4   )r5   r;   )r<   r=   r   r>   r   r   r
   )Úpublic_key_pointrF   r   r   r   r!   º   s   üþþør!   c                 C   s   t | dƒrt| jtƒsttdt| ƒƒƒ‚| j}|tg d¢ƒvr%t	tdƒƒ‚t|t
ƒs3ttdt|ƒƒƒ‚|tg d¢ƒvrDt	tdt|ƒƒƒ‚tt|ƒ}| jd j}|d j}|d j}t| }tttdœ| }	|	j}
||ƒ ¡ }t|ƒ}t|d	d
�|
 }d| }d| }t ||d | | |¡ ¡ }t |||¡ ¡ }t ||d | | |¡ ¡ }t |||¡ ¡ }d}d}	 d}t|ƒ|k rÒt |||¡ ¡ }||7 }t|ƒ|k s¿t|d|… d	d
�}|dksä||
kråq¶|	| j|
 }|dkrñq¶t||
ƒ||| |
   |
 }|dk�rq¶	 t||dœƒ ¡ S )aN  
    Generates an ECDSA signature in pure Python (thus slow)

    :param private_key:
        The PrivateKey to generate the signature with

    :param data:
        A byte string of the data the signature is for

    :param hash_algorithm:
        A unicode string of "sha1", "sha256", "sha384" or "sha512"

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the signature
    Úasn1zy
            private_key must be an instance of the
            oscrypto.asymmetric.PrivateKey class, not %s
            r'   zx
            private_key does not use one of the named curves secp256r1,
            secp384r1 or secp521r1
            ú<
            data must be a byte string, not %s
            ©Úsha1Úsha224Úsha256Úsha384Úsha512úz
            hash_algorithm must be one of "sha1", "sha224", "sha256", "sha384",
            "sha512", not %s
            r9   Fr-   ó   ó    r   Tó    )ÚrÚs)ÚhasattrrO   rZ   r   rP   r   r   rF   r<   r=   r   r>   ÚgetattrÚhashlibrE   ÚcontentsrQ   r?   r@   rA   rB   rC   ÚdigestÚlenr   ÚhmacÚnewrS   Úinverse_modr	   Údump)r9   ÚdataÚhash_algorithmÚ
curve_nameÚ	hash_funcÚec_private_keyrI   rJ   rG   rH   Únrl   Úhash_lengthÚhÚVÚKrf   rg   ÚTÚkr   r   r   r"   ß   sx   ûÿ
üû


ýüþ
r"   c                 C   sä  t | dƒ}|rt| jttfƒsttdt| ƒƒƒ‚| j}|t	g d¢ƒvr)t
tdƒƒ‚t|tƒs7ttdt|ƒƒƒ‚t|tƒsEttdt|ƒƒƒ‚|t	g d¢ƒvrVt
tdt|ƒƒƒ‚| j}t|tƒra|j}tttdœ| }|d	  ¡ \}}	|j}
t|j||	|
ƒ}zt |¡}|d
 j}|d j}W n t
y˜   tdƒ‚w d}||dk O }|||
kO }||dk O }|||
kO }|r¹tdƒ‚tt|ƒ}||ƒ ¡ }t|dd�|
 }t||
ƒ}|| |
 }|| |
 }|| ||  }||j|
 krðtdƒ‚dS )aà  
    Verifies an ECDSA signature in pure Python (thus slow)

    :param certificate_or_public_key:
        A Certificate or PublicKey instance to verify the signature with

    :param signature:
        A byte string of the signature to verify

    :param data:
        A byte string of the data the signature is for

    :param hash_algorithm:
        A unicode string of "md5", "sha1", "sha256", "sha384" or "sha512"

    :raises:
        oscrypto.errors.SignatureError - when the signature is determined to be invalid
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library
    rZ   z·
            certificate_or_public_key must be an instance of the
            oscrypto.asymmetric.PublicKey or oscrypto.asymmetric.Certificate
            classes, not %s
            r'   z†
            certificate_or_public_key does not use one of the named curves
            secp256r1, secp384r1 or secp521r1
            zA
            signature must be a byte string, not %s
            r[   r\   rb   r;   rf   rg   zSignature is invalidr   r   Fr-   N)rh   rO   rZ   r   r   rP   r   r   rF   r<   r=   r   r>   r;   r@   rA   rB   Ú	to_coordsrC   Ú
PrimePointr	   ÚloadrQ   r   ri   rj   rl   r   rp   rS   )Úcertificate_or_public_keyÚ	signaturerr   rs   Úhas_asn1rt   rZ   rH   rS   rT   rw   rY   rf   rg   Úinvalidru   rl   ÚzÚwÚu1Úu2Ú
hash_pointr   r   r   r#   `  s|   
ú	ÿ
ü
üû
ýü

ÿ

ÿr#   c           	      C   s˜   | dk s|| kr| | } | |}}d\}}}}|dkr<t ||ƒ|f \}}}|||  |||  ||f\}}}}|dks|dksBJ ‚|dkrH|S || S )z—
    Compute the modular inverse of a (mod p)

    :param a:
        An integer

    :param p:
        An integer

    :return:
        An integer
    r   )r   r   r   r   r   )Údivmod)	ÚaÚpÚcÚdÚucÚvcÚudÚvdÚqr   r   r   rp     s   
$þrp   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú
PrimeCurvezc
    Elliptic curve over a prime field. Characteristic two field curves are not
    supported.
    c                 C   s   || _ || _|| _dS )a  
        The curve of points satisfying y^2 = x^3 + a*x + b (mod p)

        :param p:
            The prime number as an integer

        :param a:
            The component a as an integer

        :param b:
            The component b as an integer
        N)rŒ   r‹   Úb)ÚselfrŒ   r‹   r•   r   r   r   Ú__init__-  s   
zPrimeCurve.__init__c                 C   sB   |j |j  }|j|j |j }||| j|j  | j  | j dkS )z~
        :param point:
            A Point object

        :return:
            Boolean if the point is on this curve
        r   )rT   rS   r‹   r•   rŒ   )r–   ÚpointÚy2Úx3r   r   r   Úcontains?  s   	$zPrimeCurve.containsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r—   r›   r   r   r   r   r”   '  s    r”   c                   @   sB   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )r   z1
    A point on a prime-field elliptic curve
    Nc                 C   sV   || _ || _|| _|| _| j r| j  | ¡stdƒ‚| jr'| | j tkr)tdƒ‚dS dS )a)  
        :param curve:
            A PrimeCurve object

        :param x:
            The x coordinate of the point as an integer

        :param y:
            The y coordinate of the point as an integer

        :param order:
            The order of the point, as an integer - optional
        zInvalid EC pointN)rF   rS   rT   rC   r›   r=   ÚINFINITY)r–   rF   rS   rT   rC   r   r   r   r—   R  s   þzPrimePoint.__init__c                 C   s,   | j |j kr| j|jkr| j|jkrdS dS )zy
        :param other:
            A PrimePoint object

        :return:
            0 if identical, 1 otherwise
        r   r   )rF   rS   rT   ©r–   Úotherr   r   r   Ú__cmp__o  s   $zPrimePoint.__cmp__c                 C   sÀ   |t kr| S | t kr|S | j|jksJ ‚| j|jkr,| j|j | jj dkr(t S |  ¡ S | jj}|j| j t|j| j |ƒ | }|| | j |j | }|| j|  | j | }t| j||ƒS )zq
        :param other:
            A PrimePoint object

        :return:
            A PrimePoint object
        r   )r    rF   rS   rT   rŒ   Údoublerp   r   )r–   r¢   rŒ   Úl_rš   Úy3r   r   r   Ú__add__|  s   "zPrimePoint.__add__c                 C   sÔ   dd„ }|}| j r|| j  }|dkrtS | tkrtS |dks J ‚d| }t| j| j| j | j ƒ}||ƒd }| }|dkrh| ¡ }||@ dkrP||@ dkrP||  }||@ dkr`||@ dkr`|| }|d }|dks<|S )ú�
        :param other:
            An integer to multiple the Point by

        :return:
            A PrimePoint object
        c                 S   s0   | dksJ ‚d}|| krd| }|| ks|d S )Nr   r   é   r   )rS   Úresultr   r   r   Úleftmost_bit¤  s   ÿz(PrimePoint.__mul__.<locals>.leftmost_bitr   r   r©   r   )rC   r    r   rF   rS   rT   r¤   )r–   r¢   r«   ÚeÚe3Únegative_selfÚirª   r   r   r   Ú__mul__›  s,   	
ù	zPrimePoint.__mul__c                 C   s   | | S )r¨   r   r¡   r   r   r   Ú__rmul__Æ  s   	zPrimePoint.__rmul__c                 C   st   | j j}| j j}d| j | j | td| j |ƒ | }|| d| j  | }|| j|  | j | }t| j ||ƒS )zS
        :return:
            A PrimePoint object that is twice this point
        r   r©   )rF   rŒ   r‹   rS   rp   rT   r   )r–   rŒ   r‹   r¥   rš   r¦   r   r   r   r¤   Ñ  s   (zPrimePoint.doubler   )
rœ   r�   rž   rŸ   r—   r£   r§   r°   r±   r¤   r   r   r   r   r   M  s    
+r   l   ÿÿÿÿïÿÿÿÿÿÿÿÿéýÿÿÿl   ±9�³{ÆuŸ†DÜjôSg9–g(Bl   þö+ø' 1tÐ:�_|v!aÀ:@mˆl   Hò<„^ËW]™dZ{cx´ÿW\Iq l   1(¤iÆ&^#aß;æÿÿÿÿÿÿl              Àÿÿÿÿÿÿÿÿ?l   ´«FeY8¢ûwõ-X"PVdÕ/�%ÀPP!-l   !¸"X”!#BXÕtàJ9!'È|û%»V—AÃ-l   4~ 
f¬&Dvè@hº!Íf¿E0m9_qlM/l   =*¸8%éá¸(‹ÿÿÿÿÿÿÿ?l   ÿÿÿÿÿÿ?               @ÿÿ l   K`¤Oøpq^cv
3,ƒe<1ÚUê]>{|RŽ*ìÆZl   –B11e	%:f=K`¾wr�HŽ7g‹HK8ùhkl   õQ~o ²]ìl+fÚUg+<ð)Z?î8óO†?q!ãOl   Q%Æx+ÎOhóbi+}s¼ÿÿÿÿ   @ÿÿ l   ÿÿ       Àÿÿ~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿl   ï*Ø'·#.TÒÚEbc+ÆZ'@=D 1 "( ?7N2Zà_+à“|¹ñS/1fl   ·
ìdáx¢RÃ¥joyU8T(	:Ÿssé"±nèZ‚L÷8kñ&Á"_ÊUl   _Ô!òuR×Ð/‡sX0
@qa×NˆQ�N�B&JÞôxS8KJüEéYë‹	K%Þl l   s)Š«e`g®w’lX_[nÐlv|ÿÿÿÿÿÿÿÿÿÿÿÿÿl#   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿl#    ? VQ(zO†%bï95~cîte1oR{¨VÂÄ;ŒLHw>ÅlÌ-rZE]´"Sr‡&Ga9}*Fl#   f=ËÇxóK¿)H-apY$3^Q‹	ná%kù{;/K!u{4-{Š?$íO‚�d8ÑV1¶lÇ3s:·l#   Pf¢?ÚQôE$XN¨!85aZþÈUÈ½WL9îYLù¹hûzÑf«$Du13otc!û%‘pMxjRr`l#   	dp"z\}[ëzˆ3"näZ;PKÜ#
`ü7ÍrËoÁC†Qôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ);Ú
__future__r   r   r   r   rj   rn   ÚsysÚ r   Ú_asn1r   r	   r
   r   r   r   r   r   r   r   Ú_errorsr   Ú_typesr   r   Úutilr   Úerrorsr   Úversion_infoÚchrr   ÚxrangeÚrangeÚ_backendÚSystemErrorÚ__all__r?   ÚCURVE_EXTRA_BITSr   r    r!   r"   r#   rp   r”   r   r    ÚSECP192R1_CURVEÚSECP192R1_BASE_POINTÚSECP224R1_CURVEÚSECP224R1_BASE_POINTÚSECP256R1_CURVEr@   ÚSECP384R1_CURVErA   ÚSECP521R1_CURVErB   r   r   r   r   Ú<module>   sº   0

ýý<;% u/#& ýü	ýü	ýü	ýü	ýü