Ë
    ýQµiÇ.  ã                  ó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   € ô Ð)¬2¯8©8Ô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ø   € Ø�L‰L×*Ñ*¨6Ó2€EØ×Ñ˜5 G§L¡L×$5Ñ$5Ñ5Ô6à
�,‰,×
.Ñ
.¨uÓ
5€Cð ˆg�l‰l×$Ñ$Ò$ÜØNó
ð 	
ð �L‰L×1Ò1Ø�L‰L×/Ñ/°Ó6¸!Ò;äØNó
ð 	
ð —‘×(Ñ(¨Ó-€JØ×Ñ˜:¨¯©×):Ñ):Ñ:Ô;à	�‰×	Ñ	˜ZÓ	(×	/Ñ	/°Ó	8€BØ€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%   € ð ‡L�L×%Ñ%Ø�'—,‘,×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�   € Ø�L‰L×/Ñ/°Ó9€EØ×Ñ˜5 G§L¡L×$5Ñ$5Ñ5Ô6Ø�L‰L×*Ñ*¨8Ó4€EØ×Ñ˜5 G§L¡L×$5Ñ$5Ñ5Ô6Ø‡|�|×+Ñ+¨E°5Ô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�   € Ø�L‰L×*Ñ*¨8Ó4€EØ×Ñ˜5 G§L¡L×$5Ñ$5Ñ5Ô6Ø	�‰×	,Ñ	,¨UÓ	3€BØ×!Ñ! "Ó%€HØ�1‚}Ø�<‰<×(Ñ(¨Ó2°aÒ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Ø×Ñ˜8 a™<Ô(à�\‰\×ÑÐ/°Ó:€FØ—‘×!Ñ!Ð"2°AÓ6€JØ
�,‰,×
!Ñ
!Ø	ˆ4”�T“˜F J°×0CÑ0Có€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“˜I¤s¨9£~°z×7IÑ7Ió€Cð ˆa‚xØ×ÑÔ!ÜÐð 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ˆÜ+¨G°RÓ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˜   ó   € à�z‰z×"Ñ"Ð"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�   € ð �M‰M×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Ñ4°T·\±\ÓBˆØ�‰×$Ñ$ U¨d¯m©m×.@Ñ.@×.EÑ.EÑ%EÔFà—M‘M×&Ñ&×>Ñ>¸uÓEˆ	ØŸ™×>Ñ>¸yÓIˆà—‘×"Ñ"×9Ñ9¸$¿,¹,ÓGˆØ�‰×$Ñ$ U¨d¯m©m×.@Ñ.@×.EÑ.EÑ%EÔFà�m‰m× Ñ ×6Ñ6°}ÀeÓLˆØ�‰×$Ñ$ S¨A¡XÔ.à—=‘=×6Ñ6°}ÓEˆä& t§}¡}°mÀXÓ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   € ð �}‰}×/Ñ/ØØØ ØØ�N‰NØ�L‰Ló
ð 	
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Ÿ}™}¨d°DÓ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ˆÜ+¨G°RÓ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Ü!Ð!ð �M‰M×Ñ×+Ñ+¨D¯N©N¸E¿O¹OÓ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Ñ4°T·\±\ÓBˆØ�‰×$Ñ$ U¨d¯m©m×.@Ñ.@×.EÑ.EÑ%EÔFà—‘×"Ñ"×9Ñ9¸$¿,¹,ÓGˆØ�‰×$Ñ$ U¨d¯m©m×.@Ñ.@×.EÑ.EÑ%EÔFà�]‰]×&Ñ&Ó(ð 
	/¨FØ—=‘=×%Ñ%×0Ñ0°Ó8ˆDØ—=‘=×%Ñ%×0Ñ0°Ó8ˆDà—-‘-×$Ñ$×DÑDØ�u˜d D¨&óˆCð �M‰M×(Ñ(¨°©Ô2à—‘×(Ñ(¨Ó.ˆAØ—‘×(Ñ(¨Ó.ˆA÷
	/ô ×,Ñ,¨q°A¸T¿[¹[Ô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ÑG‰Jàœ]×7Ñ7×IÑIÑIÐIÐIØŸ™×+Ñ+×IÑIˆJà—‘×"Ñ"×4Ñ4°T·\±\ÓBˆØ�‰×$Ñ$ U¨d¯m©m×.@Ñ.@×.EÑ.EÑ%EÔFØ—‘×"Ñ"×9Ñ9¸$¿,¹,ÓGˆØ�‰×$Ñ$ U¨d¯m©m×.@Ñ.@×.EÑ.EÑ%EÔFØ�]‰]×&Ñ&Ó(ð 		8¨FØ—]‘]×'Ñ'×:Ñ:Ø�u˜j¨$¯-©-×*<Ñ*<×*AÑ*AÀ1ÀfóˆFð �M‰M×(Ñ(¨°!©Ô4Ø—-‘-×$Ñ$×(Ñ(¨°6Ó:ˆCØ—-‘-×$Ñ$×7Ñ7Ø�u˜j¨#¨v°vóˆCð �M‰M×(Ñ(¨°3©Ô7÷		8ð �}‰}×!Ñ!×(Ñ(¨Ó-©aÐ0Ð0÷		8ð 		8ús   Å,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ó*1ð0à(ðð +ðð 
ó	ð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Ø#;ð8ØCHð8à
ó8ðØðà'ðð ðð ð	ð
 
óôY:˜r×9Ñ9ô Y:ôxn@˜b×7Ñ7õ n@r   