o
    ç÷¡g…-  ã                   @   s¸   d 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„ dƒZG dd„ dƒZG dd„ deƒZdS )z
ECDSA keys
é    )ÚInvalidSignatureÚUnsupportedAlgorithm)Údefault_backend)ÚhashesÚserialization)Úec)Údecode_dss_signatureÚencode_dss_signature)Ú	four_byte)ÚMessage)ÚPKey)ÚSSHException)Údeflate_longc                   @   s   e Zd ZdZd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                 C   sT   || _ |j| _d| j  | _| 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   © r   ú</usr/local/lib/python3.10/dist-packages/paramiko/ecdsakey.pyÚ__init__0   s   




z_ECDSACurve.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   '   s    r   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
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                 C   s
   || _ d S ©N©Úecdsa_curves)r   r&   r   r   r   r   I   ó   
z_ECDSACurveSet.__init__c                 C   s   dd„ | j D ƒS )Nc                 S   s   g | ]}|j ‘qS r   )r   )Ú.0Úcurver   r   r   Ú
<listcomp>M   s    zA_ECDSACurveSet.get_key_format_identifier_list.<locals>.<listcomp>r%   ©r   r   r   r   Úget_key_format_identifier_listL   s   z-_ECDSACurveSet.get_key_format_identifier_listc                 C   ó"   | j D ]}|j|kr|  S qd S r$   )r&   r   )r   r   r)   r   r   r   Úget_by_curve_classO   ó
   

ÿÿz!_ECDSACurveSet.get_by_curve_classc                 C   r-   r$   )r&   r   )r   r   r)   r   r   r   Úget_by_key_format_identifierT   r/   z+_ECDSACurveSet.get_by_key_format_identifierc                 C   r-   r$   )r&   r   )r   r   r)   r   r   r   Úget_by_key_lengthY   r/   z _ECDSACurveSet.get_by_key_lengthN)	r   r    r!   r"   r   r,   r.   r0   r1   r   r   r   r   r#   B   s    r#   c                   @   s   e Zd ZdZeeejdƒeejdƒeej	dƒgƒZ
							d-dd„Zed	d
„ ƒZedd„ ƒZdd„ Zdd„ Zedd„ ƒZdd„ Zdd„ Zdd„ Zd.dd„Zdd„ Zd.dd„Zd.dd „Zee ¡ ddfd!d"„ƒZd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ ZdS )/ÚECDSAKeyz\
    Representation of an ECDSA key which can be used to sign and verify SSH2
    data.
    Únistp256Únistp384Únistp521NTc                 C   sJ  d | _ d | _d | _|d ur|  ||¡ d S |d ur!|  ||¡ d S |d u r-|d ur-t|ƒ}|d urE|\| _| _ | jjj}| j 	|¡| _
d S | ¡ }	d}
|	 |
¡rY|	d t|
ƒ … }	| j |	¡| _
| j ¡ }dd„ |D ƒ}| j|||d� | ¡ }|| j
jkr…td |¡ƒ‚| ¡ }ztj | j
 ¡ |¡}|| _ W d S  ty¤   tdƒ‚w )Nz-cert-v01@openssh.comc                 S   s   g | ]}d   |¡‘qS )z{}-cert-v01@openssh.com)Úformat)r(   Úxr   r   r   r*   –   s    
ÿz%ECDSAKey.__init__.<locals>.<listcomp>)Ú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   r)   Ú	__class__Ú_ECDSA_CURVESr.   Úecdsa_curveÚget_textÚendswithÚlenr0   r,   Ú_check_type_and_load_certr   r   r6   Ú
get_binaryr   ÚEllipticCurvePublicKeyÚfrom_encoded_pointr   Ú
ValueError)r   r8   ÚdataÚfilenameÚpasswordÚvalsÚfile_objÚvalidate_pointÚc_classr9   ÚsuffixÚ	key_typesÚ
cert_typesÚ	curvenameÚ	pointinfoÚkeyr   r   r   r   m   sV   

ÿ
ÿÿÿ
ÿÿzECDSAKey.__init__c                 C   s
   | j  ¡ S r$   )rA   r,   ©Úclsr   r   r   Úidentifiers«   s   
zECDSAKey.identifiersc                 C   ó   |   ¡ S r$   )rZ   rX   r   r   r   Ú supported_key_format_identifiers°   s   z)ECDSAKey.supported_key_format_identifiersc                 C   s¢   | j }tƒ }| | jj¡ | | jj¡ | ¡ }|jjd d }t	|j
dd�}d|t|ƒ  | }t	|jdd�}d|t|ƒ  | }t| | }| |¡ | ¡ S )Né   é   F)Úadd_sign_paddingó    )r;   r   Ú
add_stringrB   r   r   Úpublic_numbersr)   r   r   r7   rE   Úyr
   Úasbytes)r   rW   ÚmÚnumbersÚkey_size_bytesÚx_bytesÚy_bytesÚ	point_strr   r   r   rd   ´   s   
zECDSAKey.asbytesc                 C   r[   r$   )rd   r+   r   r   r   Ú__str__È   ó   zECDSAKey.__str__c                 C   s   |   ¡ | j ¡ j| j ¡ jfS r$   )Úget_namer;   rb   r7   rc   r+   r   r   r   Ú_fieldsË   s   

ýzECDSAKey._fieldsc                 C   ó   | j jS r$   )rB   r   r+   r   r   r   rm   Ó   rl   zECDSAKey.get_namec                 C   ro   r$   )rB   r   r+   r   r   r   Úget_bitsÖ   rl   zECDSAKey.get_bitsc                 C   s
   | j d uS r$   )r<   r+   r   r   r   Úcan_signÙ   r'   zECDSAKey.can_signc                 C   sT   t  | j ¡ ¡}| j ||¡}t|ƒ\}}tƒ }| | jj	¡ | |  
||¡¡ |S r$   )r   ÚECDSArB   r   r<   Úsignr   r   ra   r   Ú
_sigencode)r   rK   Ú	algorithmÚecdsaÚsigÚrÚsre   r   r   r   Úsign_ssh_dataÜ   s   zECDSAKey.sign_ssh_datac                 C   sl   |  ¡ | jjkr
dS | ¡ }|  |¡\}}t||ƒ}z| j ||t 	| j 
¡ ¡¡ W dS  ty5   Y dS w )NFT)rC   rB   r   rG   Ú
_sigdecoder	   r;   Úverifyr   rr   r   r   )r   rK   r8   rw   ÚsigRÚsigSÚ	signaturer   r   r   Úverify_ssh_sigæ   s   
ÿýÿzECDSAKey.verify_ssh_sigc                 C   ó   | j || jtjj|d� d S ©N)rM   )Ú_write_private_key_filer<   r   ÚPrivateFormatÚTraditionalOpenSSL)r   rL   rM   r   r   r   Úwrite_private_key_fileö   ó   
üzECDSAKey.write_private_key_filec                 C   r�   r‚   )Ú_write_private_keyr<   r   r„   r…   )r   rO   rM   r   r   r   Úwrite_private_keyþ   r‡   zECDSAKey.write_private_keyc                 C   sT   |dur| j  |¡}|du rtd |¡ƒ‚| ¡ }tj|tƒ d�}t|| 	¡ fd�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)rN   )
rA   r1   rJ   r6   r   r   Úgenerate_private_keyr   r2   Ú
public_key)rY   r)   Úprogress_funcÚbitsÚprivate_keyr   r   r   Úgenerate  s   	zECDSAKey.generatec                 C   ó   |   d||¡}|  |¡ d S ©NÚEC)Ú_read_private_key_fileÚ_decode_key)r   rL   rM   rK   r   r   r   r?     ó   zECDSAKey._from_private_key_filec                 C   r‘   r’   )Ú_read_private_keyr•   )r   rO   rM   rK   r   r   r   r>     r–   zECDSAKey._from_private_keyc                 C   s  |\}}|| j kr+ztj|d tƒ d�}W n_ ttttfy* } ztt	|ƒƒ‚d }~ww || j
kroz,t|ƒ}| ¡ }| ¡ }| ¡ }d| }	| j |	¡}
|
sQtdƒ‚t ||
 ¡ tƒ ¡}W n tyn } ztt	|ƒƒ‚d }~ww |  |¡ || _| ¡ | _|jj}| j |¡| _d S )N)rM   rŠ   r   zInvalid key curve identifier)Ú_PRIVATE_KEY_FORMAT_ORIGINALr   Úload_der_private_keyr   rJ   ÚAssertionErrorÚ	TypeErrorr   r   ÚstrÚ_PRIVATE_KEY_FORMAT_OPENSSHr   rC   rG   Ú	get_mpintrA   r0   r   Úderive_private_keyr   Ú	ExceptionÚ_got_bad_key_format_idr<   rŒ   r;   r)   r@   r.   rB   )r   rK   ÚpkformatrW   Úer8   Ú
curve_nameÚverkeyÚsigkeyÚnamer)   r   r   r   r   r•   "  sJ   

ÿü€ú
ÿ€ý

zECDSAKey._decode_keyc                 C   s"   t ƒ }| |¡ | |¡ | ¡ S r$   )r   Ú	add_mpintrd   )r   rx   ry   r8   r   r   r   rt   I  s   

zECDSAKey._sigencodec                 C   s    t |ƒ}| ¡ }| ¡ }||fS r$   )r   rž   )r   rw   r8   rx   ry   r   r   r   r{   O  s   zECDSAKey._sigdecode)NNNNNNTr$   ) r   r    r!   r"   r#   r   r   Ú	SECP256R1Ú	SECP384R1Ú	SECP521R1rA   r   ÚclassmethodrZ   r\   rd   rk   Úpropertyrn   rm   rp   rq   rz   r€   r†   r‰   r�   r?   r>   r•   rt   r{   r   r   r   r   r2   _   sL    


ýÿ

÷>






'r2   N)r"   Ú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#   r2   r   r   r   r   Ú<module>   s   