
    +h,                    0   d dl mZ d dlZd dlmZmZmZ d dlmZm	Z	 d dl
mZ d dlmZ ej                  rd dlmZ 	 	 	 	 ddZdd	Zdd
ZddZddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZ G d dej0                        Z G d dej4                        Zy)    )annotationsN)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm_evp_pkey_derive)serialization)ec)Backendc                l    t        | t        j                        st        dt        j
                        y )Nz/Unsupported elliptic curve signature algorithm.)
isinstancer
   ECDSAr   r    UNSUPPORTED_PUBLIC_KEY_ALGORITHM)signature_algorithms    Z/var/www/html/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/ec.py_check_signature_algorithmr      s1     )2884"=55
 	
 5    c                b   | j                   j                  |      }| j                  || j                  j                  k7         | j                   j                  |      }|| j                   j                  k(  rt        d      | j                   j                  s)| j                   j                  |      dk(  rt        d      | j                   j                  |      }| j                  || j                  j                  k7         | j                  j                  |      j                  d      }|S )Nz@ECDSA keys with explicit parameters are unsupported at this timer   ascii)_libEC_KEY_get0_groupopenssl_assert_ffiNULLEC_GROUP_get_curve_name	NID_undef
ValueErrorCRYPTOGRAPHY_IS_LIBRESSLEC_GROUP_get_asn1_flag
OBJ_nid2snstringdecode)backendec_keygroupnid
curve_namesns         r   _ec_key_curve_snr)   #   s    LL**62E5GLL$5$556
,,
.
.u
5C gll$$$N
 	
 LL11LL//6!;N
 	
 ((-J:):)::;			Z	(	/	/	8BIr   c                d    | j                   j                  || j                   j                         y)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   EC_KEY_set_asn1_flagOPENSSL_EC_NAMED_CURVE)r#   ec_cdatas     r   _mark_asn1_named_ec_curver.   A   s%     LL%%',,55r   c                ^   | j                   j                  |      }| j                  || j                  j                  k7         | j                   j                  |      }| j                  || j                  j                  k7         | j                   j                  ||      rt        d      y )Nz;Cannot load an EC public key where the point is at infinity)r   EC_KEY_get0_public_keyr   r   r   r   EC_POINT_is_at_infinityr   )r#   r-   pointr%   s       r   _check_key_infinityr3   M   s    LL//9E5GLL$5$556LL**84E5GLL$5$556||++E59I
 	
 :r   c                    	 t        j                  |          S # t        $ r t        | dt        j
                        w xY w)Nz" is not a supported elliptic curve)r
   _CURVE_TYPESKeyErrorr   r   UNSUPPORTED_ELLIPTIC_CURVE)r#   r(   s     r   _sn_to_elliptic_curver8   X   sI    
r"$$ 
"d45//
 	

s	    'A _EllipticCurvePrivateKeyc                   | j                   j                  |j                        }| j                  |dkD         | 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   
ECDSA_size_ec_keyr   r   new
ECDSA_signlenbuffer)r#   private_keydatamax_sizesigbuf
siglen_ptrress          r   _ecdsa_sig_signrH   b   s     ||&&{':':;H8a<(\\/:F!!"2A6J
,,
!
!	4TFJ0C0CC 3!8$<<v&A77r   _EllipticCurvePublicKeyc           	         | j                   j                  d|t        |      |t        |      |j                        }|dk7  r| j	                          t
        y )Nr   r;   )r   ECDSA_verifyr@   r=   _consume_errorsr   )r#   
public_key	signaturerC   rG   s        r   _ecdsa_sig_verifyrO   q   sS     ,,
#
#	4TIs9~z7I7IC ax! r   c                      e Zd Zd
dZedd       Zedd       Z	 	 	 	 	 	 ddZddZddZ		 	 	 	 	 	 	 	 ddZ
	 	 	 	 	 	 ddZy	)r9   c                    || _         || _        || _        t        ||      }t	        ||      | _        t        ||       t        ||       y N_backendr=   	_evp_pkeyr)   r8   _curver.   r3   selfr#   ec_key_cdataevp_pkeyr(   s        r   __init__z!_EllipticCurvePrivateKey.__init__   E    #!g|4+GR8!'<8G\2r   c                    | j                   S rR   rV   rX   s    r   curvez_EllipticCurvePrivateKey.curve       {{r   c                .    | j                   j                  S rR   r`   key_sizer_   s    r   rd   z!_EllipticCurvePrivateKey.key_size       zz"""r   c                4   | j                   j                  || j                        st        dt        j
                        |j                  j                  | j                  j                  k7  rt        d      t        | j                   | j                  |      S )Nz1This backend does not support the ECDH algorithm.z2peer_public_key and self are not on the same curve)
rT   +elliptic_curve_exchange_algorithm_supportedr`   r   r   UNSUPPORTED_EXCHANGE_ALGORITHMnamer   r   rU   )rX   	algorithmpeer_public_keys      r   exchangez!_EllipticCurvePrivateKey.exchange   s     MMEE4:: 'C77 
   %%8D   t~~OOr   c                   | j                   j                  j                  | j                        }| j                   j	                  || j                   j
                  j                  k7         | j                   j                  j                  |      }| j                   j                  |      }| j                   j                  j                  | j                        }| j                   j	                  || j                   j
                  j                  k7         | j                   j                  j                  ||      }| j                   j	                  |dk(         | j                   j                  |      }t        | j                   ||      S Nr;   )rT   r   r   r=   r   r   r   r   _ec_key_new_by_curve_nidr0   EC_KEY_set_public_key_ec_cdata_to_evp_pkeyrI   )rX   r%   	curve_nidpublic_ec_keyr2   rG   rZ   s          r   rM   z#_EllipticCurvePrivateKey.public_key   s   ""44T\\B$$Udmm.@.@.E.E%EFMM&&>>uE	>>yI""99$,,G$$Udmm.@.@.E.E%EFmm  66}eL$$SAX.==66}E&t}}mXNNr   c                    | j                   j                  j                  | j                        }| j                   j	                  |      }t        j                  || j                         j                               S )N)private_valuepublic_numbers)	rT   r   EC_KEY_get0_private_keyr=   
_bn_to_intr
   EllipticCurvePrivateNumbersrM   rv   )rX   bnru   s      r   private_numbersz(_EllipticCurvePrivateKey.private_numbers   s]    ]]77E004--'??,;;=
 	
r   c                j    | j                   j                  |||| | j                  | j                        S rR   )rT   _private_key_bytesrU   r=   )rX   encodingformatencryption_algorithms       r   private_bytesz&_EllipticCurvePrivateKey.private_bytes   s5     }}// NNLL
 	
r   c                x    t        |       t        ||j                        \  }}t        | j                  | |      S rR   )r   r   rj   rH   rT   )rX   rC   r   _s       r   signz_EllipticCurvePrivateKey.sign   s<    
 	##671))
a t}}dD99r   Nr#   r   returnec.EllipticCurver   int)rj   zec.ECDHrk   ec.EllipticCurvePublicKeyr   bytes)r   r   )r   zec.EllipticCurvePrivateNumbers)r~   serialization.Encodingr   zserialization.PrivateFormatr   z(serialization.KeySerializationEncryptionr   r   )rC   r   r   "ec.EllipticCurveSignatureAlgorithmr   r   )__name__
__module____qualname__r[   propertyr`   rd   rl   rM   r{   r   r    r   r   r9   r9      s    3   # #P P3LP	P(O"

(
 ,
 G	

 


:
: @
: 
	
:r   c                  |    e Zd Zd
dZedd       Zedd       ZddZddZddZ		 	 	 	 	 	 ddZ
	 	 	 	 	 	 	 	 ddZy	)rI   c                    || _         || _        || _        t        ||      }t	        ||      | _        t        ||       t        ||       y rR   rS   rW   s        r   r[   z _EllipticCurvePublicKey.__init__   r\   r   c                    | j                   S rR   r^   r_   s    r   r`   z_EllipticCurvePublicKey.curve   ra   r   c                .    | j                   j                  S rR   rc   r_   s    r   rd   z _EllipticCurvePublicKey.key_size   re   r   c                    t        |t              st        S | j                  j                  j                  | j                  |j                        dk(  S rn   )r   rI   NotImplementedrT   r   EVP_PKEY_cmprU   )rX   others     r   __eq__z_EllipticCurvePublicKey.__eq__   sD    %!89!! MM++DNNEOOL	
r   c                   | j                   j                  j                  | j                        }| j                   j	                  || j                   j
                  j                  k7         | j                   j                  j                  | j                        }| j                   j	                  || j                   j
                  j                  k7         | j                   j                         5 }| j                   j                  j                  |      }| j                   j                  j                  |      }| j                   j                  j                  |||||      }| j                   j	                  |dk(         | j                   j                  |      }| j                   j                  |      }d d d        t        j                  | j                        S # 1 sw Y   +xY w)Nr;   )xyr`   )rT   r   r   r=   r   r   r   r0   _tmp_bn_ctx
BN_CTX_getEC_POINT_get_affine_coordinatesrx   r
   EllipticCurvePublicNumbersrV   )	rX   r%   r2   bn_ctxbn_xbn_yrG   r   r   s	            r   rv   z&_EllipticCurvePublicKey.public_numbers   sg   ""44T\\B$$Udmm.@.@.E.E%EF""99$,,G$$Udmm.@.@.E.E%EF]]&&( 
	/F==%%008D==%%008D--$$DDudD&C MM((2((.A((.A
	/ ,,qAT[[II
	/ 
	/s   1CG##G,c           	        |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                  j                  j                  k7         | j                  j                  j                  | j                        }| j                  j                  || j                  j                  j                  k7         | j                  j                         5 }| j                  j                  j                  |||| j                  j                  j                  d|      }| j                  j                  |dkD         | j                  j                  j!                  d|      }| j                  j                  j                  ||||||      }| j                  j                  ||k(         d d d        | j                  j                  j#                        d d  S # 1 sw Y   1xY w)Nr   zchar[])r	   PublicFormatCompressedPointrT   r   POINT_CONVERSION_COMPRESSEDUncompressedPointPOINT_CONVERSION_UNCOMPRESSEDr   r=   r   r   r   r0   r   EC_POINT_point2octr>   rA   )	rX   r   
conversionr%   r2   r   buflenbufrG   s	            r   _encode_pointz%_EllipticCurvePublicKey._encode_point  s   ]//???++GGJ]77IIIII++IIJ""44T\\B$$Udmm.@.@.E.E%EF""99$,,G$$Udmm.@.@.E.E%EF]]&&( 		8F]]''::uj$--*<*<*A*A1fF MM((!4--$$((6:C--$$77uj#vvC MM((37		8 }}!!((-a00		8 		8s   ,CI11I:c                   |t         j                  j                  u s8|t         j                  j                  u s|t         j                  j
                  u rn|t         j                  j                  us6|t         j                  j                  t         j                  j
                  fvrt        d      | j                  |      S | j                  j                  ||| | j                  d       S )NzKX962 encoding must be used with CompressedPoint or UncompressedPoint format)r	   EncodingX962r   r   r   r   r   rT   _public_key_bytesrU   )rX   r~   r   s      r   public_bytesz$_EllipticCurvePublicKey.public_bytes$  s     ..33333CCC33EEE}55:::f**::**<<M ? !/ 
 %%f--==22&$ r   c                |    t        |       t        ||j                        \  }}t        | j                  | ||       y rR   )r   r   rj   rO   rT   )rX   rN   rC   r   r   s        r   verifyz_EllipticCurvePublicKey.verify=  s;     	##671))
a 	$--y$?r   Nr   r   r   )r   objectr   bool)r   zec.EllipticCurvePublicNumbers)r   serialization.PublicFormatr   r   )r~   r   r   r   r   r   )rN   r   rC   r   r   r   r   None)r   r   r   r[   r   r`   rd   r   rv   r   r   r   r   r   r   rI   rI      s    3   # #
J*10( + 
	2@@ @ @	@
 
@r   )r   r   r   r   )r#   r   r   strr   )r#   r   r   r   )r#   r   r(   r   r   r   )r#   r   rB   r9   rC   r   r   r   )
r#   r   rM   rI   rN   r   rC   r   r   r   )
__future__r   typingcryptography.exceptionsr   r   r   *cryptography.hazmat.backends.openssl.utilsr   r   cryptography.hazmat.primitivesr	   )cryptography.hazmat.primitives.asymmetricr
   TYPE_CHECKING,cryptography.hazmat.backends.openssl.backendr   r   r)   r.   r3   r8   rH   rO   EllipticCurvePrivateKeyr9   EllipticCurvePublicKeyrI   r   r   r   <module>r      s   
 #  
 9 8	D
;
	
<	

88#;8CH8
8'  	
 
Y:r99 Y:xm@b77 m@r   