§
    3xÅjL,  ã                   óê   — d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ  G d„ d¦  «        Z G d„ d¦  «        Z G d„ de¦  «        ZdS )z
ECDSA keys
é    )ÚOptional)ÚInvalidSignatureÚUnsupportedAlgorithm)Údefault_backend)ÚhashesÚserialization)Úec)Údecode_dss_signatureÚencode_dss_signature)Ú	four_byte)ÚMessage)ÚPKey)ÚSSHException)Údeflate_longc                   ó   — e Zd ZdZd„ ZdS )Ú_ECDSACurvezì
    Represents a specific ECDSA Curve (nistp256, nistp384, etc).

    Handles the generation of the key format identifier and the selection of
    the proper hash function. Also grabs the proper curve from the 'ecdsa'
    package.
    c                 óî   — || _         |j        | _        d| j         z   | _        | j        dk    rt          j        | _        n.| j        dk    rt          j        | _        nt          j        | _        || _	        d S )Núecdsa-sha2-é   i€  )
Ú	nist_nameÚkey_sizeÚ
key_lengthÚkey_format_identifierr   ÚSHA256Úhash_objectÚSHA384ÚSHA512Úcurve_class)Úselfr   r   s      úBC:\Projects\Historical\venv\Lib\site-packages\paramiko/ecdsakey.pyÚ__init__z_ECDSACurve.__init__2   sr   € Ø"ˆŒØ%Ô.ˆŒð &3°T´^Ñ%CˆÔ"ð Œ?˜cÒ!Ð!Ý%œ}ˆDÔÐØŒ_ Ò#Ð#Ý%œ}ˆDÔÐå%œ}ˆDÔà&ˆÔÐÐó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   © r"   r    r   r   )   s-   € € € € € ðð ð'ð 'ð 'ð 'ð 'r"   r   c                   ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )Ú_ECDSACurveSetz°
    A collection to hold the ECDSA curves. Allows querying by oid and by key
    format identifier. The two ways in which ECDSAKey needs to be able to look
    up curves.
    c                 ó   — || _         d S ©N©Úecdsa_curves)r   r-   s     r    r!   z_ECDSACurveSet.__init__K   s   € Ø(ˆÔÐÐr"   c                 ó$   — d„ | j         D ¦   «         S )Nc                 ó   — g | ]	}|j         ‘Œ
S r'   )r   )Ú.0Úcurves     r    ú
<listcomp>zA_ECDSACurveSet.get_key_format_identifier_list.<locals>.<listcomp>O   s   € ÐKÐKÐK°�Ô+ÐKÐKÐKr"   r,   ©r   s    r    Úget_key_format_identifier_listz-_ECDSACurveSet.get_key_format_identifier_listN   s   € ØKÐK¸Ô9JÐKÑKÔKÐKr"   c                 ó8   — | j         D ]}|j        |k    r|c S Œd S r+   )r-   r   )r   r   r1   s      r    Úget_by_curve_classz!_ECDSACurveSet.get_by_curve_classQ   s:   € ØÔ&ð 	ð 	ˆEØÔ  KÒ/Ð/Ø���ð 0ð	ð 	r"   c                 ó8   — | j         D ]}|j        |k    r|c S Œd S r+   )r-   r   )r   r   r1   s      r    Úget_by_key_format_identifierz+_ECDSACurveSet.get_by_key_format_identifierV   s<   € ØÔ&ð 	ð 	ˆEØÔ*Ð.CÒCÐCØ���ð Dð	ð 	r"   c                 ó8   — | j         D ]}|j        |k    r|c S Œd S r+   )r-   r   )r   r   r1   s      r    Úget_by_key_lengthz _ECDSACurveSet.get_by_key_length[   s:   € ØÔ&ð 	ð 	ˆEØÔ :Ò-Ð-Ø���ð .ð	ð 	r"   N)	r#   r$   r%   r&   r!   r4   r6   r8   r:   r'   r"   r    r)   r)   D   sl   € € € € € ðð ð)ð )ð )ðLð Lð Lðð ð ð
ð ð ð
ð ð ð ð r"   r)   c                   ó”  — e Zd ZdZ e eej        d¦  «         eej        d¦  «         eej	        d¦  «        g¦  «        Z
	 	 	 	 	 	 	 dd„Zed„ ¦   «         Zed	„ ¦   «         Zd
„ Zd„ Zed„ ¦   «         Zd„ Zd„ Zd„ Zdd„Zd„ Zedeej                 fd„¦   «         Ze ej        ¦   «         ddfd„¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Z dS )ÚECDSAKeyz\
    Representation of an ECDSA key which can be used to sign and verify SSH2
    data.
    Únistp256Únistp384Únistp521NTc                 óî  — d | _         d | _        d | _        |�|                      ||¦  «         d S |�|                      ||¦  «         d S |€|�t          |¦  «        }|�A|\  | _        | _         | j        j        j        }| j         	                    |¦  «        | _
        d S |                     ¦   «         }	d}
|	                     |
¦  «        r|	d t          |
¦  «         …         }	| j                             |	¦  «        | _
        | j                             ¦   «         }d„ |D ¦   «         }|                      |||¬¦  «         |                     ¦   «         }|| j
        j        k    r"t%          d                     |¦  «        ¦  «        ‚|                     ¦   «         }	 t*          j                             | j
                             ¦   «         |¦  «        }|| _         d S # t2          $ r t%          d¦  «        ‚w xY w)Nz-cert-v01@openssh.comc                 ó8   — g | ]}d                       |¦  «        ‘ŒS )z{}-cert-v01@openssh.com)Úformat)r0   Úxs     r    r2   z%ECDSAKey.__init__.<locals>.<listcomp>™   s4   € ð ð ð Ø89Ð)×0Ò0°Ñ3Ô3ðð ð r"   )ÚmsgÚkey_typeÚ	cert_typezCan't handle curve of type {}zInvalid public key)Úverifying_keyÚsigning_keyÚpublic_blobÚ_from_private_keyÚ_from_private_key_filer   r1   Ú	__class__Ú_ECDSA_CURVESr6   Úecdsa_curveÚget_textÚendswithÚlenr8   r4   Ú_check_type_and_load_certr   r   rB   Ú
get_binaryr	   ÚEllipticCurvePublicKeyÚfrom_encoded_pointr   Ú
ValueError)r   rD   ÚdataÚfilenameÚpasswordÚvalsÚfile_objÚvalidate_pointÚc_classrE   ÚsuffixÚ	key_typesÚ
cert_typesÚ	curvenameÚ	pointinfoÚkeys                   r    r!   zECDSAKey.__init__o   s/  € ð "ˆÔØˆÔØˆÔØÐØ×"Ò" 8¨XÑ6Ô6Ð6ØˆFØÐØ×'Ò'¨°(Ñ;Ô;Ð;ØˆFØˆK˜dÐ.Ý˜$‘-”-ˆCØÐØ37Ñ0ˆDÔ˜dÔ0ØÔ&Ô,Ô6ˆGØ#Ô1×DÒDÀWÑMÔMˆDÔÐÐð —|’|‘~”~ˆHð
 -ˆFØ× Ò  Ñ(Ô(ð 4Ø# N¥s¨6¡{¤{ l NÔ3�Ø#Ô1×NÒNØñ ô  ˆDÔð Ô*×IÒIÑKÔKˆIðð Ø=Fðñ ô ˆJð ×*Ò*Ø )°zð +ñ ô ð ð Ÿš™œˆIØ˜DÔ,Ô6Ò6Ð6Ý"Ø3×:Ò:¸9ÑEÔEñô ð ð ŸšÑ(Ô(ˆIð9ÝÔ/×BÒBØÔ$×0Ò0Ñ2Ô2°Iñô �ð &)�Ô"Ð"Ð"øÝð 9ð 9ð 9Ý"Ð#7Ñ8Ô8Ð8ð9øøøs   Æ>G ÇG4c                 ó4   — | j                              ¦   «         S r+   )rM   r4   ©Úclss    r    ÚidentifierszECDSAKey.identifiers®   s   € àÔ ×?Ò?ÑAÔAÐAr"   c                 ó*   — |                       ¦   «         S r+   )rg   re   s    r    Ú supported_key_format_identifiersz)ECDSAKey.supported_key_format_identifiers³   s   € à�ŠÑ Ô Ð r"   c                 ó  — | j         }t          ¦   «         }|                     | j        j        ¦  «         |                     | j        j        ¦  «         |                     ¦   «         }|j        j        dz   dz  }t          |j
        d¬¦  «        }d|t          |¦  «        z
  z  |z   }t          |j        d¬¦  «        }d|t          |¦  «        z
  z  |z   }t          |z   |z   }|                     |¦  «         |                     ¦   «         S )Né   é   F)Úadd_sign_paddingó    )rG   r   Ú
add_stringrN   r   r   Úpublic_numbersr1   r   r   rC   rQ   Úyr   Úasbytes)r   rc   ÚmÚnumbersÚkey_size_bytesÚx_bytesÚy_bytesÚ	point_strs           r    rr   zECDSAKey.asbytes·   só   € ØÔ ˆÝ‰IŒIˆØ	�Š�TÔ%Ô;Ñ<Ô<Ð<Ø	�Š�TÔ%Ô/Ñ0Ô0Ð0à×$Ò$Ñ&Ô&ˆàœ)Ô,¨qÑ0°QÑ6ˆå˜wœy¸5ÐAÑAÔAˆØ˜^­c°'©l¬lÑ:Ñ;¸gÑEˆå˜wœy¸5ÐAÑAÔAˆØ˜^­c°'©l¬lÑ:Ñ;¸gÑEˆå Ñ'¨'Ñ1ˆ	Ø	�Š�YÑÔÐØ�yŠy‰{Œ{Ðr"   c                 ó*   — |                       ¦   «         S r+   )rr   r3   s    r    Ú__str__zECDSAKey.__str__Ë   s   € Ø�|Š|‰~Œ~Ðr"   c                 ó    — |                       ¦   «         | j                             ¦   «         j        | j                             ¦   «         j        fS r+   )Úget_namerG   rp   rC   rq   r3   s    r    Ú_fieldszECDSAKey._fieldsÎ   sC   € ð �MŠM‰OŒOØÔ×-Ò-Ñ/Ô/Ô1ØÔ×-Ò-Ñ/Ô/Ô1ð
ð 	
r"   c                 ó   — | j         j        S r+   )rN   r   r3   s    r    r|   zECDSAKey.get_nameÖ   s   € ØÔÔ5Ð5r"   c                 ó   — | j         j        S r+   )rN   r   r3   s    r    Úget_bitszECDSAKey.get_bitsÙ   s   € ØÔÔ*Ð*r"   c                 ó   — | j         d uS r+   ©rH   r3   s    r    Úcan_signzECDSAKey.can_signÜ   s   € ØÔ tÐ+Ð+r"   c                 ób  — t          j        | j                             ¦   «         ¦  «        }| j                             ||¦  «        }t          |¦  «        \  }}t          ¦   «         }|                     | j        j	        ¦  «         |                     |  
                    ||¦  «        ¦  «         |S r+   )r	   ÚECDSArN   r   rH   Úsignr
   r   ro   r   Ú
_sigencode)r   rW   Ú	algorithmÚecdsaÚsigÚrÚsrs   s           r    Úsign_ssh_datazECDSAKey.sign_ssh_dataß   s�   € Ý”˜Ô)×5Ò5Ñ7Ô7Ñ8Ô8ˆØÔ×#Ò# D¨%Ñ0Ô0ˆÝ# CÑ(Ô(‰ˆˆ1å‰IŒIˆØ	�Š�TÔ%Ô;Ñ<Ô<Ð<Ø	�Š�T—_’_ Q¨Ñ*Ô*Ñ+Ô+Ð+Øˆr"   c                 ót  — |                      ¦   «         | j        j        k    rdS |                     ¦   «         }|                      |¦  «        \  }}t          ||¦  «        }	 | j                             ||t          j	        | j         
                    ¦   «         ¦  «        ¦  «         dS # t          $ r Y dS w xY w)NFT)rO   rN   r   rS   Ú
_sigdecoder   rG   Úverifyr	   r…   r   r   )r   rW   rD   rŠ   ÚsigRÚsigSÚ	signatures          r    Úverify_ssh_sigzECDSAKey.verify_ssh_sigé   s¾   € Ø�<Š<‰>Œ>˜TÔ-ÔCÒCÐCØ�5Ø�nŠnÑÔˆØ—_’_ SÑ)Ô)‰
ˆˆdÝ(¨¨tÑ4Ô4ˆ	ð	ØÔ×%Ò%Ø˜4¥¤¨$Ô*:×*FÒ*FÑ*HÔ*HÑ!IÔ!Iñô ð ð �4øõ  ð 	ð 	ð 	Ø�5�5ð	øøøs   Á"AB) Â)
B7Â6B7Úreturnc                 ó   — | j         S r+   r‚   r3   s    r    Úprivate_keyzECDSAKey.private_keyù   s   € àÔÐr"   c                 ó6  — |�R| j                              |¦  «        }|€"t          d                     |¦  «        ¦  «        ‚|                     ¦   «         }t          j        |t          ¦   «         ¬¦  «        }t          || 	                    ¦   «         f¬¦  «        S )a  
        Generate a new private ECDSA key.  This factory function can be used to
        generate a new host key or authentication key.

        :param progress_func: Not used for this type of key.
        :returns: A new private key (`.ECDSAKey`) object
        NzUnsupported key length: {:d})Úbackend)rZ   )
rM   r:   rV   rB   r   r	   Úgenerate_private_keyr   r<   Ú
public_key)rf   r1   Úprogress_funcÚbitsr—   s        r    ÚgeneratezECDSAKey.generateý   s�   € ð ÐØÔ%×7Ò7¸Ñ=Ô=ˆEØˆ}Ý Ð!?×!FÒ!FÀtÑ!LÔ!LÑMÔMÐMØ×%Ò%Ñ'Ô'ˆEåÔ-¨e½_Ñ=NÔ=NÐOÑOÔOˆÝ˜k¨;×+AÒ+AÑ+CÔ+CÐDÐEÑEÔEÐEr"   c                 ó^   — |                       d||¦  «        }|                      |¦  «         d S ©NÚEC)Ú_read_private_key_fileÚ_decode_key)r   rX   rY   rW   s       r    rK   zECDSAKey._from_private_key_file  s3   € Ø×*Ò*¨4°¸8ÑDÔDˆØ×Ò˜ÑÔÐÐÐr"   c                 ó^   — |                       d||¦  «        }|                      |¦  «         d S r    )Ú_read_private_keyr£   )r   r[   rY   rW   s       r    rJ   zECDSAKey._from_private_key  s3   € Ø×%Ò% d¨H°hÑ?Ô?ˆØ×Ò˜ÑÔÐÐÐr"   c                 óˆ  — |\  }}|| j         k    rg	 t          j        |d t          ¦   «         ¬¦  «        }�n@# t          t
          t          t          f$ r!}t          t          |¦  «        ¦  «        ‚d }~ww xY w|| j
        k    rß	 t          |¦  «        }|                     ¦   «         }|                     ¦   «         }|                     ¦   «         }d|z   }	| j                             |	¦  «        }
|
st          d¦  «        ‚t#          j        ||
                     ¦   «         t          ¦   «         ¦  «        }nC# t(          $ r!}t          t          |¦  «        ¦  «        ‚d }~ww xY w|                      |¦  «         || _        |                     ¦   «         | _        |j        j        }| j                             |¦  «        | _        d S )N)rY   r™   r   zInvalid key curve identifier)Ú_PRIVATE_KEY_FORMAT_ORIGINALr   Úload_der_private_keyr   rV   ÚAssertionErrorÚ	TypeErrorr   r   ÚstrÚ_PRIVATE_KEY_FORMAT_OPENSSHr   rO   rS   Ú	get_mpintrM   r8   r	   Úderive_private_keyr   Ú	ExceptionÚ_got_bad_key_format_idrH   r›   rG   r1   rL   r6   rN   )r   rW   Úpkformatrc   ÚerD   Ú
curve_nameÚverkeyÚsigkeyÚnamer1   r   s               r    r£   zECDSAKey._decode_key  sÇ  € Ø‰ˆ�$Ø�tÔ8Ò8Ð8ð
+Ý#Ô8Ø 4µÑ1BÔ1Bðñ ô �‘øõ ÝÝÝ$ð	ð +ð +ð +õ #¥3 q¡6¤6Ñ*Ô*Ð*øøøøð+øøøð ˜Ô9Ò9Ð9ð+Ý˜d‘m”m�Ø Ÿ\š\™^œ^�
ØŸšÑ)Ô)�ØŸš™œ�Ø$ zÑ1�ØÔ*×GÒGÈÑMÔM�Øð GÝ&Ð'EÑFÔFÐFÝÔ+Ø˜E×-Ò-Ñ/Ô/µÑ1BÔ1Bñô ��øõ ð +ð +ð +õ #¥3 q¡6¤6Ñ*Ô*Ð*øøøøð+øøøð
 ×'Ò'¨Ñ1Ô1Ð1àˆÔØ Ÿ^š^Ñ-Ô-ˆÔØ”iÔ)ˆØÔ-×@Ò@ÀÑMÔMˆÔÐÐs.   ’#7 ·A5ÁA0Á0A5ÂB/D4 Ä4
EÄ>EÅEc                 óš   — t          ¦   «         }|                     |¦  «         |                     |¦  «         |                     ¦   «         S r+   )r   Ú	add_mpintrr   )r   r‹   rŒ   rD   s       r    r‡   zECDSAKey._sigencode@  s=   € Ý‰iŒiˆØ�Š�aÑÔÐØ�Š�aÑÔÐØ�{Š{‰}Œ}Ðr"   c                 óx   — t          |¦  «        }|                     ¦   «         }|                     ¦   «         }||fS r+   )r   r­   )r   rŠ   rD   r‹   rŒ   s        r    r�   zECDSAKey._sigdecodeF  s0   € Ý�c‰lŒlˆØ�MŠM‰OŒOˆØ�MŠM‰OŒOˆØ�!ˆtˆr"   )NNNNNNTr+   )!r#   r$   r%   r&   r)   r   r	   Ú	SECP256R1Ú	SECP384R1Ú	SECP521R1rM   r!   Úclassmethodrg   ri   rr   rz   Úpropertyr}   r|   r€   rƒ   r�   r”   r   ÚEllipticCurvePrivateKeyr—   rž   rK   rJ   r£   r‡   r�   r'   r"   r    r<   r<   a   s
  € € € € € ðð ð
 #�NàˆK˜œ jÑ1Ô1ØˆK˜œ jÑ1Ô1ØˆK˜œ jÑ1Ô1ð	
ñô €Mð ØØØØØð ð=9ð =9ð =9ð =9ð~ ðBð Bñ „[ðBð ð!ð !ñ „[ð!ðð ð ð(ð ð ð ð
ð 
ñ „Xð
ð6ð 6ð 6ð+ð +ð +ð,ð ,ð ,ðð ð ð ðð ð ð  ð ˜X bÔ&@ÔAð  ð  ð  ñ „Xð ð Ø(˜BœL™NœN¸$ÀTð Fð Fð Fñ „[ðFð&ð ð ðð ð ð%Nð %Nð %NðNð ð ðð ð ð ð r"   r<   N)r&   Útypingr   Úcryptography.exceptionsr   r   Úcryptography.hazmat.backendsr   Úcryptography.hazmat.primitivesr   r   Ú)cryptography.hazmat.primitives.asymmetricr	   Ú/cryptography.hazmat.primitives.asymmetric.utilsr
   r   Úparamiko.commonr   Úparamiko.messager   Úparamiko.pkeyr   Úparamiko.ssh_exceptionr   Úparamiko.utilr   r   r)   r<   r'   r"   r    ú<module>rË      s‰  ðð&ð ð Ð Ð Ð Ð Ð à JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8ðð ð ð ð ð ð ð ð
 &Ð %Ð %Ð %Ð %Ð %Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ø &Ð &Ð &Ð &Ð &Ð &ð'ð 'ð 'ð 'ð 'ñ 'ô 'ð 'ð6ð ð ð ð ñ ô ð ð:ið ið ið ið iˆtñ iô ið ið ið ir"   