§
    pïg_+  ã            
       ó<  — 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ej        ddfd	„Zd
ddefd„Zdd„Zdd„Zd
ddedej        fd„Zd
ddddedefd„Zd
ddddededdf
d„Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        ZdS )é    N)ÚInvalidSignatureÚUnsupportedAlgorithmÚ_Reasons)Ú_calculate_digest_and_algorithmÚ_evp_pkey_derive)Úserialization)Úec)ÚBackendÚsignature_algorithmÚreturnc                 ón   — t          | t          j        ¦  «        st          dt          j        ¦  «        ‚d S )Nz/Unsupported elliptic curve signature algorithm.)Ú
isinstancer	   ÚECDSAr   r   Ú UNSUPPORTED_PUBLIC_KEY_ALGORITHM)r   s    úI/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/ec.pyÚ_check_signature_algorithmr      s>   € õ Ð)­2¬8Ñ4Ô4ð 
Ý"Ø=ÝÔ5ñ
ô 
ð 	
ð
ð 
ó    Úbackendr
   c                 ó8  — | 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 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)r   Úec_keyÚgroupÚnidÚ
curve_nameÚsns         r   Ú_ec_key_curve_snr)   !   s  € ØŒL×*Ò*¨6Ñ2Ô2€EØ×Ò˜5 G¤LÔ$5Ò5Ñ6Ô6Ð6à
Œ,×
.Ò
.¨uÑ
5Ô
5€Cð ˆgŒlÔ$Ò$Ð$ÝØNñ
ô 
ð 	
ð ŒLÔ1ð
àŒL×/Ò/°Ñ6Ô6¸!Ò;Ð;åØNñ
ô 
ð 	
ð ”×(Ò(¨Ñ-Ô-€JØ×Ò˜:¨¬Ô):Ò:Ñ;Ô;Ð;à	Œ×	Ò	˜ZÑ	(Ô	(×	/Ò	/°Ñ	8Ô	8€BØ€Ir   c                 óP   — | 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   ÚEC_KEY_set_asn1_flagÚOPENSSL_EC_NAMED_CURVE)r   Úec_cdatas     r   Ú_mark_asn1_named_ec_curver.   ?   s2   € ð „L×%Ò%Ø�'”,Ô5ñô ð ð ð r   c                 óN  — | j                              |¦  «        }|                      || j        j        k    ¦  «         | j                              |¦  «        }|                      || j        j        k    ¦  «         | j                              ||¦  «        rt          d¦  «        ‚d S )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   K   s¡   € ØŒL×/Ò/°Ñ9Ô9€EØ×Ò˜5 G¤LÔ$5Ò5Ñ6Ô6Ð6ØŒL×*Ò*¨8Ñ4Ô4€EØ×Ò˜5 G¤LÔ$5Ò5Ñ6Ô6Ð6Ø„|×+Ò+¨E°5Ñ9Ô9ð 
ÝØIñ
ô 
ð 	
ð
ð 
r   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   Úformatr   ÚUNSUPPORTED_ELLIPTIC_CURVE)r   r(   s     r   Ú_sn_to_elliptic_curver9   V   s^   € ð
ÝŒ˜rÔ"Ñ$Ô$Ð$øÝð 
ð 
ð 
Ý"Ø2×9Ò9¸"Ñ=Ô=ÝÔ/ñ
ô 
ð 	
ð
øøøs	   ‚ ›8AÚprivate_keyÚ_EllipticCurvePrivateKeyÚdatac                 óÂ  — | 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   Ú
ECDSA_sizeÚ_ec_keyr   r   ÚnewÚ
ECDSA_signÚlenÚbuffer)r   r:   r<   Úmax_sizeÚsigbufÚ
siglen_ptrÚress          r   Ú_ecdsa_sig_signrI   `   sÎ   € ð Œ|×&Ò& {Ô':Ñ;Ô;€HØ×Ò˜8 aš<Ñ(Ô(Ð(àŒ\×ÒÐ/°Ñ:Ô:€FØ”×!Ò!Ð"2°AÑ6Ô6€JØ
Œ,×
!Ò
!Ø	ˆ4•�T‘”˜F J°Ô0Cñô €Cð ×Ò˜3 !š8Ñ$Ô$Ð$ØŒ<×Ò˜vÑ&Ô& ¨°A¬ Ô7Ð7r   Ú
public_keyÚ_EllipticCurvePublicKeyÚ	signaturec           	      óÄ   — | j                              d|t          |¦  «        |t          |¦  «        |j        ¦  «        }|dk    r|                      ¦   «          t
          ‚d S )Nr   r>   )r   ÚECDSA_verifyrC   r@   Ú_consume_errorsr   )r   rJ   rL   r<   rH   s        r   Ú_ecdsa_sig_verifyrP   o   sa   € ð Œ,×
#Ò
#Ø	ˆ4•�T‘”˜I¥s¨9¡~¤~°zÔ7Iñô €Cð ˆa‚x€xØ×ÒÑ!Ô!Ð!ÝÐð €xr   c                   ó   — e Zd Zdd„Zedej        fd„¦   «         Zedefd„¦   «         Z	dej
        dej        defd	„Zdej        fd
„Zdej        fd„Zdej        dej        dej        defd„Zdedej        defd„ZdS )r;   r   r
   c                 óº   — || _         || _        || _        t          ||¦  «        }t	          ||¦  «        | _        t          ||¦  «         t          ||¦  «         d S ©N©Ú_backendr@   Ú	_evp_pkeyr)   r9   Ú_curver.   r3   ©Úselfr   Úec_key_cdataÚevp_pkeyr(   s        r   Ú__init__z!_EllipticCurvePrivateKey.__init__~   ó]   € ØˆŒØ#ˆŒØ!ˆŒå˜g |Ñ4Ô4ˆÝ+¨G°RÑ8Ô8ˆŒÝ! '¨<Ñ8Ô8Ð8Ý˜G \Ñ2Ô2Ð2Ð2Ð2r   r   c                 ó   — | j         S rS   ©rW   ©rY   s    r   Úcurvez_EllipticCurvePrivateKey.curveˆ   ó
   € àŒ{Ðr   c                 ó   — | j         j        S rS   ©ra   Úkey_sizer`   s    r   re   z!_EllipticCurvePrivateKey.key_sizeŒ   ó   € àŒzÔ"Ð"r   Ú	algorithmÚpeer_public_keyc                 óþ   — | j                              || j        ¦  «        st          dt          j        ¦  «        ‚|j        j        | j        j        k    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)
rU   Ú+elliptic_curve_exchange_algorithm_supportedra   r   r   ÚUNSUPPORTED_EXCHANGE_ALGORITHMÚnamer   r   rV   )rY   rg   rh   s      r   Úexchangez!_EllipticCurvePrivateKey.exchange�   s†   € ð ŒM×EÒEØ˜4œ:ñô ð	õ
 'ØCÝÔ7ñô ð ð
 Ô Ô%¨¬¬Ò8Ð8ÝØDñô ð õ   ¤¨t¬~¸ÑOÔOÐOr   c                 ó”  — | 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>   )rU   r   r   r@   r   r   r   r   Ú_ec_key_new_by_curve_nidr0   ÚEC_KEY_set_public_keyÚ_ec_cdata_to_evp_pkeyrK   )rY   r%   Ú	curve_nidÚpublic_ec_keyr2   rH   r[   s          r   rJ   z#_EllipticCurvePrivateKey.public_key¤   s  € Ø”Ô"×4Ò4°T´\ÑBÔBˆØŒ×$Ò$ U¨d¬mÔ.@Ô.EÒ%EÑFÔFÐFà”MÔ&×>Ò>¸uÑEÔEˆ	Øœ×>Ò>¸yÑIÔIˆà”Ô"×9Ò9¸$¼,ÑGÔGˆØŒ×$Ò$ U¨d¬mÔ.@Ô.EÒ%EÑFÔFÐFàŒmÔ ×6Ò6°}ÀeÑLÔLˆØŒ×$Ò$ S¨A¢XÑ.Ô.Ð.à”=×6Ò6°}ÑEÔEˆå& t¤}°mÀXÑNÔNÐNr   c                 óò   — | j         j                             | j        ¦  «        }| j                              |¦  «        }t          j        ||                      ¦   «                              ¦   «         ¬¦  «        S )N)Úprivate_valueÚpublic_numbers)	rU   r   ÚEC_KEY_get0_private_keyr@   Ú
_bn_to_intr	   ÚEllipticCurvePrivateNumbersrJ   rv   )rY   Úbnru   s      r   Úprivate_numbersz(_EllipticCurvePrivateKey.private_numbersµ   sg   € ØŒ]Ô×7Ò7¸¼ÑEÔEˆØœ×0Ò0°Ñ4Ô4ˆÝÔ-Ø'ØŸ?š?Ñ,Ô,×;Ò;Ñ=Ô=ð
ñ 
ô 
ð 	
r   Úencodingr7   Úencryption_algorithmc                 óT   — | j                              |||| | j        | j        ¦  «        S rS   )rU   Ú_private_key_bytesrV   r@   )rY   r|   r7   r}   s       r   Úprivate_bytesz&_EllipticCurvePrivateKey.private_bytes½   s4   € ð Œ}×/Ò/ØØØ ØØŒNØŒLñ
ô 
ð 	
r   r<   r   c                 ó|   — t          |¦  «         t          ||j        ¦  «        \  }}t          | j        | |¦  «        S rS   )r   r   rg   rI   rU   )rY   r<   r   Ú_s       r   Úsignz_EllipticCurvePrivateKey.signÌ   sE   € õ
 	#Ð#6Ñ7Ô7Ð7Ý1ØØÔ)ñ
ô 
‰ˆˆaõ ˜tœ}¨d°DÑ9Ô9Ð9r   N©r   r
   )Ú__name__Ú
__module__Ú__qualname__r\   Úpropertyr	   ÚEllipticCurvera   Úintre   ÚECDHÚEllipticCurvePublicKeyÚbytesrm   rJ   ry   r{   r   ÚEncodingÚPrivateFormatÚKeySerializationEncryptionr€   ÚEllipticCurveSignatureAlgorithmrƒ   © r   r   r;   r;   }   sh  € € € € € ð3ð 3ð 3ð 3ð ð�rÔ'ð ð ð ñ „Xðð ð#˜#ð #ð #ð #ñ „Xð#ðPØœðPØ35Ô3LðPà	ðPð Pð Pð Pð(O˜BÔ5ð Oð Oð Oð Oð"
 Ô!?ð 
ð 
ð 
ð 
ð
àÔ(ð
ð Ô+ð
ð ,ÔFð	
ð
 
ð
ð 
ð 
ð 
ð
:àð
:ð  Ô?ð
:ð 
ð	
:ð 
:ð 
:ð 
:ð 
:ð 
:r   c                   óÒ   — e Zd Zdd„Zedej        fd„¦   «         Zedefd„¦   «         Z	dej
        fd„Zdej        defd	„Zd
ej        dej        defd„Zdededej        ddfd„ZdS )rK   r   r
   c                 óº   — || _         || _        || _        t          ||¦  «        }t	          ||¦  «        | _        t          ||¦  «         t          ||¦  «         d S rS   rT   rX   s        r   r\   z _EllipticCurvePublicKey.__init__Ú   r]   r   r   c                 ó   — | j         S rS   r_   r`   s    r   ra   z_EllipticCurvePublicKey.curveä   rb   r   c                 ó   — | j         j        S rS   rd   r`   s    r   re   z _EllipticCurvePublicKey.key_sizeè   rf   r   c                 óÀ  — | j                              | j        ¦  «        \  }}| j         j                             | j        ¦  «        }| j                              || j         j        j        k    ¦  «         | j                              ¦   «         5 }| j         j         	                    |¦  «        }| j         j         	                    |¦  «        } ||||||¦  «        }| j                              |dk    ¦  «         | j          
                    |¦  «        }| j          
                    |¦  «        }	d d d ¦  «         n# 1 swxY w Y   t          j        ||	| j        ¬¦  «        S )Nr>   )ÚxÚyra   )rU   Ú _ec_key_determine_group_get_funcr@   r   r0   r   r   r   Ú_tmp_bn_ctxÚ
BN_CTX_getrx   r	   ÚEllipticCurvePublicNumbersrW   )
rY   Úget_funcr%   r2   Úbn_ctxÚbn_xÚbn_yrH   r˜   r™   s
             r   rv   z&_EllipticCurvePublicKey.public_numbersì   sn  € Øœ-×HÒHØŒLñ
ô 
‰ˆ�%ð ”Ô"×9Ò9¸$¼,ÑGÔGˆØŒ×$Ò$ U¨d¬mÔ.@Ô.EÒ%EÑFÔFÐFàŒ]×&Ò&Ñ(Ô(ð 	/¨FØ”=Ô%×0Ò0°Ñ8Ô8ˆDØ”=Ô%×0Ò0°Ñ8Ô8ˆDà�(˜5 %¨¨t°VÑ<Ô<ˆCØŒM×(Ò(¨°ªÑ2Ô2Ð2à”×(Ò(¨Ñ.Ô.ˆAØ”×(Ò(¨Ñ.Ô.ˆAð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/õ Ô,¨q°A¸T¼[ÐIÑIÔIÐIs   ÂB D9Ä9D=Å D=r7   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        k    ¦  «         | j        j                             | j	        ¦  «        }| j         
                    || j        j        j        k    ¦  «         | j                             ¦   «         5 }| j        j                             |||| j        j        j        d|¦  «        }| j         
                    |dk    ¦  «         | j        j                             d|¦  «        }| j        j                             ||||||¦  «        }| j         
                    ||k    ¦  «         d d d ¦  «         n# 1 swxY w Y   | j        j                             |¦  «        d d …         S )Nr   zchar[])r   ÚPublicFormatÚCompressedPointrU   r   ÚPOINT_CONVERSION_COMPRESSEDÚUncompressedPointÚPOINT_CONVERSION_UNCOMPRESSEDr   r@   r   r   r   r0   r›   ÚEC_POINT_point2octrA   rD   )	rY   r7   Ú
conversionr%   r2   rŸ   ÚbuflenÚbufrH   s	            r   Ú_encode_pointz%_EllipticCurvePublicKey._encode_pointÿ   sò  € Ø•]Ô/Ô?Ð?Ð?ØœÔ+ÔGˆJˆJà�]Ô7ÔIÐIÐIÐIÐIØœÔ+ÔIˆJà”Ô"×4Ò4°T´\ÑBÔBˆØŒ×$Ò$ U¨d¬mÔ.@Ô.EÒ%EÑFÔFÐFØ”Ô"×9Ò9¸$¼,ÑGÔGˆØŒ×$Ò$ U¨d¬mÔ.@Ô.EÒ%EÑFÔFÐFØŒ]×&Ò&Ñ(Ô(ð 		8¨FØ”]Ô'×:Ò:Ø�u˜j¨$¬-Ô*<Ô*AÀ1Àfñô ˆFð ŒM×(Ò(¨°!ªÑ4Ô4Ð4Ø”-Ô$×(Ò(¨°6Ñ:Ô:ˆCØ”-Ô$×7Ò7Ø�u˜j¨#¨v°vñô ˆCð ŒM×(Ò(¨°3ªÑ7Ô7Ð7ð		8ð 		8ð 		8ñ 		8ô 		8ð 		8ð 		8ð 		8ð 		8ð 		8ð 		8øøøð 		8ð 		8ð 		8ð 		8ð Œ}Ô!×(Ò(¨Ñ-Ô-¨a¨a¨aÔ0Ð0s   ÄB4GÇGÇGr|   c                 óp  — |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   rŽ   ÚX962r£   r¤   r¦   r   r¬   rU   Ú_public_key_bytesrV   )rY   r|   r7   s      r   Úpublic_bytesz$_EllipticCurvePublicKey.public_bytes  sÂ   € ð �Ô.Ô3Ð3Ð3Ø�Ô3ÔCÐCÐCØ�Ô3ÔEÐEÐEà�}Ô5Ô:Ð:Ð:¸fÝÔ*Ô:ÝÔ*Ô<ðMð ?ð ?õ !ð/ñô ð ð
 ×%Ò% fÑ-Ô-Ð-à”=×2Ò2Ø˜& $¨¬¸ñô ð r   rL   r<   r   Nc                 ó‚   — t          |¦  «         t          ||j        ¦  «        \  }}t          | j        | ||¦  «         d S rS   )r   r   rg   rP   rU   )rY   rL   r<   r   r‚   s        r   Úverifyz_EllipticCurvePublicKey.verify0  sM   € õ 	#Ð#6Ñ7Ô7Ð7Ý1ØØÔ)ñ
ô 
‰ˆˆaõ 	˜$œ-¨¨y¸$Ñ?Ô?Ð?Ð?Ð?r   r„   )r…   r†   r‡   r\   rˆ   r	   r‰   ra   rŠ   re   r�   rv   r   r£   r�   r¬   rŽ   r°   r‘   r²   r’   r   r   rK   rK   Ù   s>  € € € € € ð3ð 3ð 3ð 3ð ð�rÔ'ð ð ð ñ „Xðð ð#˜#ð #ð #ð #ñ „Xð#ðJ Ô =ð Jð Jð Jð Jð&1 MÔ$>ð 1À5ð 1ð 1ð 1ð 1ð0àÔ(ðð Ô*ðð 
ð	ð ð ð ð2@àð@ð ð@ð  Ô?ð	@ð
 
ð@ð @ð @ð @ð @ð @r   r„   )r   r
   r   N)Ú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   Ústrr)   r.   r3   r‰   r9   r�   rI   rP   ÚEllipticCurvePrivateKeyr;   rŒ   rK   r’   r   r   ú<module>r¼      sB  ðð
 €€€ðð ð ð ð ð ð ð ð ð ð
ð ð ð ð ð ð ð ð 9Ð 8Ð 8Ð 8Ð 8Ð 8Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8à	Ôð EØDÐDÐDÐDÐDÐDð
ØÔ;ð
à	ð
ð 
ð 
ð 
ð˜ið °Cð ð ð ð ð<	ð 	ð 	ð 	ð
ð 
ð 
ð 
ð
 9ð 
°#ð 
¸"Ô:Jð 
ð 
ð 
ð 
ð8Øð8Ø%?ð8ØGLð8à
ð8ð 8ð 8ð 8ðØðà)ðð ðð ð	ð
 
ðð ð ð ðY:ð Y:ð Y:ð Y:ð Y:˜rÔ9ñ Y:ô Y:ð Y:ðxb@ð b@ð b@ð b@ð b@˜bÔ7ñ b@ô b@ð b@ð b@ð b@r   