o
     `'/                     @   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eG dd deZeeG dd deZeejG dd deZ e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   }home/ych/rk3568/buildroot/output/rockchip_rk3568/host/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/ec.py_check_signature_algorithm   s   r   c                 C   s   | j |}| || jjk | j |}|| j jkrtd| j js/| j 	|dkr/td| j 
|}| || jjk | 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_IS_LIBRESSLZEC_GROUP_get_asn1_flagZ
OBJ_nid2snstringdecode)backendZec_keygroupnidZ
curve_namesnr   r   r   _ec_key_curve_sn"   s$   r$   c                 C   s   | 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   s0   zt j|  W S  ty   td|tjw )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}| |dk | jd|}| jdd}| j d|t||||j}| |dk | 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datamax_sizeZsigbufZ
siglen_ptrresr   r   r   _ecdsa_sig_signV   s   r2   c                 C   s8   | j d|t||t||j}|dkr|   td S )Nr   r)   )r   ZECDSA_verifyr,   r*   Z_consume_errorsr   )r    
public_key	signaturer/   r1   r   r   r   _ecdsa_sig_verifyc   s   r5   c                   @   $   e Zd Zdd Zdd Zdd ZdS )_ECDSASignatureContextc                 C   s   || _ || _t||| _d S N)_backend_private_keyr   Hash_digest)selfr    r.   	algorithmr   r   r   __init__n   s   z_ECDSASignatureContext.__init__c                 C      | j | d S r8   r<   updater=   r/   r   r   r   rB   s      z_ECDSASignatureContext.updatec                 C   s   | j  }t| j| j|S r8   )r<   finalizer2   r9   r:   r=   digestr   r   r   rE   v   s   
z_ECDSASignatureContext.finalizeN)__name__
__module____qualname__r?   rB   rE   r   r   r   r   r7   l   s    r7   c                   @   r6   )_ECDSAVerificationContextc                 C   s$   || _ || _|| _t||| _d S r8   )r9   _public_key
_signaturer   r;   r<   )r=   r    r3   r4   r>   r   r   r   r?   ~   s   z"_ECDSAVerificationContext.__init__c                 C   r@   r8   rA   rC   r   r   r   rB      rD   z _ECDSAVerificationContext.updatec                 C   s"   | j  }t| j| j| j| d S r8   )r<   rE   r5   r9   rL   rM   rF   r   r   r   verify   s   
z _ECDSAVerificationContext.verifyN)rH   rI   rJ   r?   rB   rN   r   r   r   r   rK   |   s    rK   c                   @   sZ   e Zd Zdd Ze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   6   || _ || _|| _t||}t||| _t|| d S r8   r9   r*   	_evp_pkeyr$   r(   _curver%   r=   r    Zec_key_cdataevp_pkeyr#   r   r   r   r?         
z!_EllipticCurvePrivateKey.__init__rS   c                 C      | j jS r8   curvekey_sizer=   r   r   r   rZ         z!_EllipticCurvePrivateKey.key_sizec                 C   s(   t   t| t|j t| j| |jS r8   )r   r   r
   r>   r7   r9   )r=   r   r   r   r   signer   s   

z_EllipticCurvePrivateKey.signerc                 C   s   | j || jstdtj|jj| jjkrtd| j j	| j
}| j j|d d }| j |dk | j jd|}| j j|j
}| j j|||| j
| j jj}| j |dk | 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[])r9   Z+elliptic_curve_exchange_algorithm_supportedrY   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-   )r=   r>   Zpeer_public_keyr!   Zz_lenZz_bufZpeer_keyrr   r   r   exchange   s0   z!_EllipticCurvePrivateKey.exchangec                 C   s   | j j| j}| j || j jjk | j j|}| j |}| j j	| j}| j || j jjk | j j
||}| j |dk | j |}t| j ||S )Nr)   )r9   r   r   r*   r   r   r   r   Z_ec_key_new_by_curve_nidrb   ZEC_KEY_set_public_keyZ_ec_cdata_to_evp_pkey_EllipticCurvePublicKey)r=   r!   Z	curve_nidZpublic_ec_keypointr1   rU   r   r   r   r3      s   z#_EllipticCurvePrivateKey.public_keyc                 C   s2   | j j| j}| j |}tj||   dS )N)private_valuepublic_numbers)	r9   r   ZEC_KEY_get0_private_keyr*   
_bn_to_intr   ZEllipticCurvePrivateNumbersr3   rh   )r=   Zbnrg   r   r   r   private_numbers   s   
z(_EllipticCurvePrivateKey.private_numbersc                 C   s   | j |||| | j| jS r8   )r9   Z_private_key_bytesrR   r*   )r=   encodingr'   Zencryption_algorithmr   r   r   private_bytes   s   z&_EllipticCurvePrivateKey.private_bytesc                 C   s*   t | t| j||j\}}t| j| |S r8   )r   r	   r9   
_algorithmr2   )r=   r/   r   r>   r   r   r   sign   s
   
z_EllipticCurvePrivateKey.signN)rH   rI   rJ   r?   r   read_only_propertyrY   propertyrZ   r]   rd   r3   rj   rl   rn   r   r   r   r   rO      s    
	

rO   c                   @   sR   e Zd Zdd ZedZedd Zdd Z	dd	 Z
d
d Zdd Zdd ZdS )re   c                 C   rP   r8   rQ   rT   r   r   r   r?      rV   z _EllipticCurvePublicKey.__init__rS   c                 C   rW   r8   rX   r[   r   r   r   rZ      r\   z _EllipticCurvePublicKey.key_sizec                 C   s6   t   td| t| t|j t| j| ||jS )Nr4   )r   r   _check_bytesr   r
   r>   rK   r9   )r=   r4   r   r   r   r   verifier  s   
z _EllipticCurvePublicKey.verifierc           
      C   s   | j | j\}}| j j| j}| j || j jjk | j  2}| j j	|}| j j	|}||||||}| j |dk | j 
|}| j 
|}	W d    n1 sVw   Y  tj||	| jdS )Nr)   )xyrY   )r9   Z _ec_key_determine_group_get_funcr*   r   rb   r   r   r   _tmp_bn_ctxZ
BN_CTX_getri   r   ZEllipticCurvePublicNumbersrS   )
r=   Zget_funcr!   rf   bn_ctxZbn_xZbn_yr1   rs   rt   r   r   r   rh     s   
z&_EllipticCurvePublicKey.public_numbersc           	   	   C   s$  |t jju r| jjj}n|t jju sJ | jjj}| jj| j	}| j
|| jjjk | jj| j	}| j
|| jjjk | j ;}| jj|||| jjjd|}| j
|dk | jjd|}| jj||||||}| j
||k W d    n1 sw   Y  | jj|d d  S )Nr   zchar[])r   PublicFormatCompressedPointr9   r   ZPOINT_CONVERSION_COMPRESSEDUncompressedPointZPOINT_CONVERSION_UNCOMPRESSEDr   r*   r   r   r   rb   ru   ZEC_POINT_point2octr+   r-   )	r=   r'   
conversionr!   rf   rv   buflenbufr1   r   r   r   _encode_point  s(   
z%_EllipticCurvePublicKey._encode_pointc                 C   sl   |t jju s|t jju s|t jju r+|t jjus"|t jjt jjfvr&td| |S | j	||| | j
d S )NzKX962 encoding must be used with CompressedPoint or UncompressedPoint format)r   ZEncodingZX962rw   rx   ry   ra   r}   r9   Z_public_key_bytesrR   )r=   rk   r'   r   r   r   public_bytes6  s"   



z$_EllipticCurvePublicKey.public_bytesc                 C   s0   t | t| j||j\}}t| j| || d S r8   )r   r	   r9   rm   r5   )r=   r4   r/   r   r>   r   r   r   rN   L  s
   
z_EllipticCurvePublicKey.verifyN)rH   rI   rJ   r?   r   ro   rY   rp   rZ   rr   rh   r}   r~   rN   r   r   r   r   re      s    
	

re   N)#
__future__r   r   r   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(   r2   r5   Zregister_interfaceobjectr7   rK   Z(EllipticCurvePrivateKeyWithSerializationrO   Z'EllipticCurvePublicKeyWithSerializationre   r   r   r   r   <module>   s(   
	

a