
    Qi.                    8   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	 	 	 	 	 	 	 	 	 	 ddZ G d dej2                        Z G d dej6                        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    I/usr/lib/python3/dist-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                @   | j                   j                  |      }| j                  || j                  j                  k7         | j                   j                  |      }| j                  |      }|dk7  r*| j                   j                  |      dk7  rt        d      y y )N   z1Invalid EC key (key out of range, infinity, etc.))	r   r   r   r   r   EC_GROUP_get0_cofactor
_bn_to_intEC_KEY_check_keyr   )r#   r-   r%   bncofactors        r   _check_key_cofactorr;   W   s    LL**84E5GLL$5$556		,	,U	3B!!"%H1}<<((2a7C  8 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_curver@   b   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[]r5   )	r   
ECDSA_size_ec_keyr   r   new
ECDSA_signlenbuffer)r#   private_keydatamax_sizesigbuf
siglen_ptrress          r   _ecdsa_sig_signrO   l   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   r5   )r   ECDSA_verifyrG   rD   _consume_errorsr   )r#   
public_key	signaturerJ   rN   s        r   _ecdsa_sig_verifyrV   {   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	)rA   c                    || _         || _        || _        t        ||      }t	        ||      | _        t        ||       t        ||       y N)_backendrD   	_evp_pkeyr)   r@   _curver.   r3   selfr#   ec_key_cdataevp_pkeyr(   s        r   __init__z!_EllipticCurvePrivateKey.__init__   sE    #!g|4+GR8!'<8G\2r   c                    | j                   S rY   r\   r^   s    r   curvez_EllipticCurvePrivateKey.curve       {{r   c                .    | j                   j                  S rY   re   key_sizerd   s    r   ri   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)
rZ   +elliptic_curve_exchange_algorithm_supportedre   r   r   UNSUPPORTED_EXCHANGE_ALGORITHMnamer   r   r[   )r^   	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 Nr5   )rZ   r   r   rD   r   r   r   r   _ec_key_new_by_curve_nidr0   EC_KEY_set_public_key_ec_cdata_to_evp_pkeyrP   )r^   r%   	curve_nidpublic_ec_keyr2   rN   r`   s          r   rT   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)	rZ   r   EC_KEY_get0_private_keyrD   r7   r
   EllipticCurvePrivateNumbersrT   r{   )r^   r9   rz   s      r   private_numbersz(_EllipticCurvePrivateKey.private_numbers   s]    ]]77E004--'??,;;=
 	
r   c                j    | j                   j                  |||| | j                  | j                        S rY   )rZ   _private_key_bytesr[   rD   )r^   encodingformatencryption_algorithms       r   private_bytesz&_EllipticCurvePrivateKey.private_bytes   s5     }}// NNLL
 	
r   c                x    t        |       t        ||j                        \  }}t        | j                  | |      S rY   )r   r   ro   rO   rZ   )r^   rJ   r   _s       r   signz_EllipticCurvePrivateKey.sign   s<    
 	##671))
a t}}dD99r   Nr#   r   returnec.EllipticCurver   int)ro   zec.ECDHrp   ec.EllipticCurvePublicKeyr   bytes)r   r   )r   zec.EllipticCurvePrivateNumbers)r   serialization.Encodingr   zserialization.PrivateFormatr   z(serialization.KeySerializationEncryptionr   r   )rJ   r   r   "ec.EllipticCurveSignatureAlgorithmr   r   )__name__
__module____qualname__ra   propertyre   ri   rq   rT   r~   r   r    r   r   rA   rA      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	)rP   c                    || _         || _        || _        t        ||      }t	        ||      | _        t        ||       t        ||       t        ||       y rY   )	rZ   rD   r[   r)   r@   r\   r.   r3   r;   r]   s        r   ra   z _EllipticCurvePublicKey.__init__   sO    #!g|4+GR8!'<8G\2G\2r   c                    | j                   S rY   rc   rd   s    r   re   z_EllipticCurvePublicKey.curve   rf   r   c                .    | j                   j                  S rY   rh   rd   s    r   ri   z _EllipticCurvePublicKey.key_size   rj   r   c                    t        |t              st        S | j                  j                  j                  | j                  |j                        dk(  S rs   )r   rP   NotImplementedrZ   r   EVP_PKEY_cmpr[   )r^   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)Nr5   )xyre   )rZ   r   r   rD   r   r   r   r0   _tmp_bn_ctx
BN_CTX_getEC_POINT_get_affine_coordinatesr7   r
   EllipticCurvePublicNumbersr\   )	r^   r%   r2   bn_ctxbn_xbn_yrN   r   r   s	            r   r{   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CompressedPointrZ   r   POINT_CONVERSION_COMPRESSEDUncompressedPointPOINT_CONVERSION_UNCOMPRESSEDr   rD   r   r   r   r0   r   EC_POINT_point2octrE   rH   )	r^   r   
conversionr%   r2   r   buflenbufrN   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   rZ   _public_key_bytesr[   )r^   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 rY   )r   r   ro   rV   rZ   )r^   rU   rJ   r   r   s        r   verifyz_EllipticCurvePublicKey.verifyH  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   )rU   r   rJ   r   r   r   r   None)r   r   r   ra   r   re   ri   r   r{   r   r   r   r   r   r   rP   rP      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   rI   rA   rJ   r   r   r   )
r#   r   rT   rP   rU   r   rJ   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   r;   r@   rO   rV   EllipticCurvePrivateKeyrA   EllipticCurvePublicKeyrP   r   r   r   <module>r      s   
 #  
 9 8	D
;
	
<	
	
88#;8CH8
8'  	
 
Y:r99 Y:xn@b77 n@r   