<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
y_5/                 @   s  d dl mZmZmZ d dlmZ d dlmZmZm	Z	 d dl
mZmZmZ d dlmZmZ d dlmZmZmZ dd Zd	d
 Zdd Zdd Zdd Zdd ZejeG dd deZejeG dd deZejejG dd deZ ejej!G dd deZ"dS )    )absolute_importdivisionprint_function)utils)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm_check_not_prehashed_warn_sign_verify_deprecated)hashesserialization)AsymmetricSignatureContextAsymmetricVerificationContextecc             C   s   t | tjstdtjd S )Nz/Unsupported elliptic curve signature algorithm.)
isinstancer   ZECDSAr   r   Z UNSUPPORTED_PUBLIC_KEY_ALGORITHM)signature_algorithm r   /usr/lib64/python3.6/ec.py_check_signature_algorithm   s    r   c             C   s   | j j|}| j|| jjk | j j|}|| j jkr>td| j jr^| j j	|dkr^td| j j
|}| j|| jjk | jj|jd}|S )Nz;ECDSA keys with unnamed curves are unsupported at this timer   ascii)_libEC_KEY_get0_groupopenssl_assert_ffiNULLEC_GROUP_get_curve_nameZ	NID_undefNotImplementedErrorZ$CRYPTOGRAPHY_OPENSSL_102U_OR_GREATERZEC_GROUP_get_asn1_flagZ
OBJ_nid2snstringdecode)backendZec_keygroupZnidZ
curve_namesnr   r   r   _ec_key_curve_sn"   s    r#   c             C   s   | j j|| j j dS )z
    Set the named curve flag on the EC_KEY. This causes OpenSSL to
    serialize EC keys along with their curve OID which makes
    deserialization easier.
    N)r   ZEC_KEY_set_asn1_flagZOPENSSL_EC_NAMED_CURVE)r    Zec_cdatar   r   r   _mark_asn1_named_ec_curve@   s    r$   c             C   s8   yt j|  S  tk
r2   tdj|tjY nX d S )Nz${} is not a supported elliptic curve)r   Z_CURVE_TYPESKeyErrorr   formatr   ZUNSUPPORTED_ELLIPTIC_CURVE)r    r"   r   r   r   _sn_to_elliptic_curveL   s    r'   c             C   sz   | j j|j}| j|dk | jjd|}| jjdd}| j jd|t||||j}| j|dk | jj|d |d  S )Nr   zunsigned char[]zunsigned int[]   )	r   Z
ECDSA_size_ec_keyr   r   newZ
ECDSA_signlenbuffer)r    private_keydataZmax_sizeZsigbufZ
siglen_ptrresr   r   r   _ecdsa_sig_signV   s    r0   c             C   s8   | j jd|t||t||j}|dkr4| j  td S )Nr   r(   )r   ZECDSA_verifyr+   r)   Z_consume_errorsr   )r    
public_key	signaturer.   r/   r   r   r   _ecdsa_sig_verifyc   s
    r3   c               @   s$   e Zd Zdd Zdd Zdd ZdS )_ECDSASignatureContextc             C   s   || _ || _tj||| _d S )N)_backend_private_keyr   Hash_digest)selfr    r-   	algorithmr   r   r   __init__n   s    z_ECDSASignatureContext.__init__c             C   s   | j j| d S )N)r8   update)r9   r.   r   r   r   r<   s   s    z_ECDSASignatureContext.updatec             C   s   | j j }t| j| j|S )N)r8   finalizer0   r5   r6   )r9   digestr   r   r   r=   v   s    
z_ECDSASignatureContext.finalizeN)__name__
__module____qualname__r;   r<   r=   r   r   r   r   r4   l   s   r4   c               @   s$   e Zd Zdd Zdd Zdd ZdS )_ECDSAVerificationContextc             C   s$   || _ || _|| _tj||| _d S )N)r5   _public_key
_signaturer   r7   r8   )r9   r    r1   r2   r:   r   r   r   r;   ~   s    z"_ECDSAVerificationContext.__init__c             C   s   | j j| d S )N)r8   r<   )r9   r.   r   r   r   r<      s    z _ECDSAVerificationContext.updatec             C   s"   | j j }t| j| j| j| d S )N)r8   r=   r3   r5   rC   rD   )r9   r>   r   r   r   verify   s    
z _ECDSAVerificationContext.verifyN)r?   r@   rA   r;   r<   rE   r   r   r   r   rB   |   s   rB   c               @   sZ   e Zd Zdd ZejdZedd Zdd Z	dd	 Z
d
d Zdd Zdd Zdd ZdS )_EllipticCurvePrivateKeyc             C   s6   || _ || _|| _t||}t||| _t|| d S )N)r5   r)   	_evp_pkeyr#   r'   _curver$   )r9   r    ec_key_cdataevp_pkeyr"   r   r   r   r;      s    
z!_EllipticCurvePrivateKey.__init__rH   c             C   s   | j jS )N)curvekey_size)r9   r   r   r   rL      s    z!_EllipticCurvePrivateKey.key_sizec             C   s(   t   t| t|j t| j| |jS )N)r   r   r
   r:   r4   r5   )r9   r   r   r   r   signer   s
    
z_EllipticCurvePrivateKey.signerc             C   s   | j j|| jstdtj|jj| jjkr4td| j jj	| j
}| j jj|d d }| j j|dk | j jjd|}| j jj|j
}| j jj|||| j
| j jj}| j j|dk | j jj|d | S )Nz1This backend does not support the ECDH algorithm.z2peer_public_key and self are not on the same curve      r   z	uint8_t[])r5   Z+elliptic_curve_exchange_algorithm_supportedrK   r   r   ZUNSUPPORTED_EXCHANGE_ALGORITHMname
ValueErrorr   r   r)   ZEC_GROUP_get_degreer   r   r*   EC_KEY_get0_public_keyZECDH_compute_keyr   r,   )r9   r:   Zpeer_public_keyr!   Zz_lenZz_bufZpeer_keyrr   r   r   exchange   s$    
z!_EllipticCurvePrivateKey.exchangec             C   s   | j jj| j}| j j|| j jjk | j jj|}| j j|}| j jj	| j}| j j|| j jjk | j jj
||}| j j|dk | j j|}t| j ||S )Nr(   )r5   r   r   r)   r   r   r   r   Z_ec_key_new_by_curve_nidrR   ZEC_KEY_set_public_keyZ_ec_cdata_to_evp_pkey_EllipticCurvePublicKey)r9   r!   Z	curve_nidZpublic_ec_keypointr/   rJ   r   r   r   r1      s    z#_EllipticCurvePrivateKey.public_keyc             C   s2   | j jj| j}| j j|}tj|| j j dS )N)private_valuepublic_numbers)	r5   r   ZEC_KEY_get0_private_keyr)   
_bn_to_intr   ZEllipticCurvePrivateNumbersr1   rX   )r9   ZbnrW   r   r   r   private_numbers   s
    z(_EllipticCurvePrivateKey.private_numbersc             C   s   | j j|||| | j| jS )N)r5   Z_private_key_bytesrG   r)   )r9   encodingr&   Zencryption_algorithmr   r   r   private_bytes   s    z&_EllipticCurvePrivateKey.private_bytesc             C   s*   t | t| j||j\}}t| j| |S )N)r   r	   r5   
_algorithmr0   )r9   r.   r   r:   r   r   r   sign   s    z_EllipticCurvePrivateKey.signN)r?   r@   rA   r;   r   read_only_propertyrK   propertyrL   rM   rT   r1   rZ   r\   r^   r   r   r   r   rF      s   	

rF   c               @   sR   e Zd Zdd ZejdZedd Zdd Z	dd	 Z
d
d Zdd Zdd ZdS )rU   c             C   s6   || _ || _|| _t||}t||| _t|| d S )N)r5   r)   rG   r#   r'   rH   r$   )r9   r    rI   rJ   r"   r   r   r   r;      s    
z _EllipticCurvePublicKey.__init__rH   c             C   s   | j jS )N)rK   rL   )r9   r   r   r   rL      s    z _EllipticCurvePublicKey.key_sizec             C   s6   t   tjd| t| t|j t| j| ||jS )Nr2   )r   r   _check_bytesr   r
   r:   rB   r5   )r9   r2   r   r   r   r   verifier  s    
z _EllipticCurvePublicKey.verifierc       
      C   s   | j j| j\}}| j jj| j}| j j|| j jjk | j j Z}| j jj	|}| j jj	|}||||||}| j j|dk | j j
|}| j j
|}	W d Q R X tj||	| jdS )Nr(   )xyrK   )r5   Z _ec_key_determine_group_get_funcr)   r   rR   r   r   r   _tmp_bn_ctxZ
BN_CTX_getrY   r   ZEllipticCurvePublicNumbersrH   )
r9   Zget_funcr!   rV   bn_ctxZbn_xZbn_yr/   rc   rd   r   r   r   rX     s    z&_EllipticCurvePublicKey.public_numbersc       	      C   s  |t jjkr| jjj}n|t jjks(t| jjj}| jjj	| j
}| jj|| jjjk | jjj| j
}| jj|| jjjk | jj l}| jjj|||| jjjd|}| jj|dk | jjjd|}| jjj||||||}| jj||k W d Q R X | jjj|d d  S )Nr   zchar[])r   PublicFormatCompressedPointr5   r   ZPOINT_CONVERSION_COMPRESSEDUncompressedPointAssertionErrorZPOINT_CONVERSION_UNCOMPRESSEDr   r)   r   r   r   rR   re   ZEC_POINT_point2octr*   r,   )	r9   r&   Z
conversionr!   rV   rf   ZbuflenZbufr/   r   r   r   _encode_point  s"    
z%_EllipticCurvePublicKey._encode_pointc             C   sp   |t jjks$|t jjks$|t jjkrV|t jjk	sD|t jjt jjfkrLtd| j|S | jj	||| | j
d S d S )NzKX962 encoding must be used with CompressedPoint or UncompressedPoint format)r   ZEncodingZX962rg   rh   ri   rQ   rk   r5   Z_public_key_bytesrG   )r9   r[   r&   r   r   r   public_bytes6  s    
z$_EllipticCurvePublicKey.public_bytesc             C   s0   t | t| j||j\}}t| j| || d S )N)r   r	   r5   r]   r3   )r9   r2   r.   r   r:   r   r   r   rE   L  s    z_EllipticCurvePublicKey.verifyN)r?   r@   rA   r;   r   r_   rK   r`   rL   rb   rX   rk   rl   rE   r   r   r   r   rU      s   	

rU   N)#Z
__future__r   r   r   Zcryptographyr   Zcryptography.exceptionsr   r   r   Z*cryptography.hazmat.backends.openssl.utilsr	   r
   r   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   r   r   r#   r$   r'   r0   r3   Zregister_interfaceobjectr4   rB   Z(EllipticCurvePrivateKeyWithSerializationrF   Z'EllipticCurvePublicKeyWithSerializationrU   r   r   r   r   <module>   s&   
	a