U
    ÓZjÚ,  ã                   @   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eƒZG dd„ deƒ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rBt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   úT/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-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   s    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   s"   | j D ]}|j|kr|  S qd S r$   )r&   r   )r   r   r(   r   r   r   Úget_by_curve_classO   s    

z!_ECDSACurveSet.get_by_curve_classc                 C   s"   | j D ]}|j|kr|  S qd S r$   )r&   r   )r   r   r(   r   r   r   Úget_by_key_format_identifierT   s    

z+_ECDSACurveSet.get_by_key_format_identifierc                 C   s"   | j D ]}|j|kr|  S qd S r$   )r&   r   )r   r   r(   r   r   r   Úget_by_key_lengthY   s    

z _ECDSACurveSet.get_by_key_lengthN)	r   r    r!   r"   r   r+   r,   r-   r.   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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.
    Znistp256Znistp384Znistp521NTc                 C   sT  d | _ d | _d | _|d k	r*|  ||¡ d S |d k	rB|  ||¡ d S |d krZ|d k	rZt|ƒ}|d k	rˆ|\| _| _ | jjj}| j 	|¡| _
nÈ| ¡ }	d}
|	 |
¡r°|	d t|
ƒ … }	| j |	¡| _
| j ¡ }dd„ |D ƒ}| j|||d� | ¡ }|| j
jk�r
td |¡ƒ‚| ¡ }ztj | j
 ¡ |¡}|| _ W n tk
�rN   tdƒ‚Y nX d S )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_typeZ	cert_typezCan't handle curve of type {}zInvalid public key)Úverifying_keyÚsigning_keyZpublic_blobÚ_from_private_keyÚ_from_private_key_filer   r(   Ú	__class__Ú_ECDSA_CURVESr,   Úecdsa_curveÚget_textÚendswithÚlenr-   r+   Z_check_type_and_load_certr   r   r0   Ú
get_binaryr   ZEllipticCurvePublicKeyZfrom_encoded_pointr   Ú
ValueError)r   r2   ÚdataÚfilenameÚpasswordÚvalsÚfile_objZvalidate_pointZc_classr3   ÚsuffixZ	key_typesZ
cert_typesZ	curvenameZ	pointinfoÚkeyr   r   r   r   m   sZ    


ÿ
ÿ  ÿÿ ÿ
zECDSAKey.__init__c                 C   s
   | j  ¡ S r$   )r9   r+   )Úclsr   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)Zadd_sign_paddingó    )r4   r   Ú
add_stringr:   r   r   Úpublic_numbersr(   r   r   r1   r=   Úyr
   Úasbytes)r   rF   ÚmÚnumbersZkey_size_bytesZx_bytesZy_bytesZ	point_strr   r   r   rO   ®   s    
zECDSAKey.asbytesc                 C   s   |   ¡ S r$   )rO   r*   r   r   r   Ú__str__Â   s    zECDSAKey.__str__c                 C   s   |   ¡ | j ¡ j| j ¡ jfS r$   )Úget_namer4   rM   r1   rN   r*   r   r   r   Ú_fieldsÅ   s    

ýzECDSAKey._fieldsc                 C   s   | j jS r$   )r:   r   r*   r   r   r   rS   Í   s    zECDSAKey.get_namec                 C   s   | j jS r$   )r:   r   r*   r   r   r   Úget_bitsÐ   s    zECDSAKey.get_bitsc                 C   s
   | j d k	S r$   )r5   r*   r   r   r   Úcan_signÓ   s    zECDSAKey.can_signc                 C   sT   t  | j ¡ ¡}| j ||¡}t|ƒ\}}tƒ }| | jj	¡ | |  
||¡¡ |S r$   )r   ÚECDSAr:   r   r5   Úsignr   r   rL   r   Ú
_sigencode)r   r@   Ú	algorithmZecdsaÚsigÚrÚsrP   r   r   r   Úsign_ssh_dataÖ   s    zECDSAKey.sign_ssh_datac                 C   st   |  ¡ | jjkrdS | ¡ }|  |¡\}}t||ƒ}z | j ||t 	| j 
¡ ¡¡ W n tk
rj   Y dS X dS d S )NFT)r;   r:   r   r>   Ú
_sigdecoder	   r4   Úverifyr   rW   r   r   )r   r@   r2   r[   ZsigRZsigSÚ	signaturer   r   r   Úverify_ssh_sigà   s    
  ÿzECDSAKey.verify_ssh_sigc                 C   s   | j || jtjj|d� d S ©N)rB   )Z_write_private_key_filer5   r   ÚPrivateFormatÚTraditionalOpenSSL)r   rA   rB   r   r   r   Úwrite_private_key_fileð   s    üzECDSAKey.write_private_key_filec                 C   s   | j || jtjj|d� d S rc   )Z_write_private_keyr5   r   rd   re   )r   rD   rB   r   r   r   Úwrite_private_keyø   s    üzECDSAKey.write_private_keyc                 C   sT   |dk	r2| j  |¡}|dk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)rC   )
r9   r.   r?   r0   r   r   Zgenerate_private_keyr   r/   Ú
public_key)rG   r(   Zprogress_funcÚbitsZprivate_keyr   r   r   Úgenerate   s    	zECDSAKey.generatec                 C   s   |   d||¡}|  |¡ d S ©NZEC)Z_read_private_key_fileÚ_decode_key)r   rA   rB   r@   r   r   r   r7     s    zECDSAKey._from_private_key_filec                 C   s   |   d||¡}|  |¡ d S rl   )Z_read_private_keyrm   )r   rD   rB   r@   r   r   r   r6     s    zECDSAKey._from_private_keyc                 C   s*  |\}}|| j krbztj|d tƒ d�}W n6 ttttfk
r^ } ztt	|ƒƒ‚W 5 d }~X Y nX nž|| j
krözXt|ƒ}| ¡ }| ¡ }| ¡ }d| }	| j |	¡}
|
s®tdƒ‚t ||
 ¡ tƒ ¡}W n. tk
rò } ztt	|ƒƒ‚W 5 d }~X Y nX n
|  |¡ || _| ¡ | _|jj}| j |¡| _d S )N)rB   rh   r   zInvalid key curve identifier)Z_PRIVATE_KEY_FORMAT_ORIGINALr   Zload_der_private_keyr   r?   ÚAssertionErrorÚ	TypeErrorr   r   ÚstrZ_PRIVATE_KEY_FORMAT_OPENSSHr   r;   r>   Ú	get_mpintr9   r-   r   Zderive_private_keyr   Ú	ExceptionZ_got_bad_key_format_idr5   ri   r4   r(   r8   r,   r:   )r   r@   ZpkformatrF   Úer2   Z
curve_nameZverkeyZsigkeyÚnamer(   r   r   r   r   rm     sJ    
  ÿ
ü 
  ÿ 

zECDSAKey._decode_keyc                 C   s"   t ƒ }| |¡ | |¡ | ¡ S r$   )r   Z	add_mpintrO   )r   r\   r]   r2   r   r   r   rY   C  s    

zECDSAKey._sigencodec                 C   s    t |ƒ}| ¡ }| ¡ }||fS r$   )r   rq   )r   r[   r2   r\   r]   r   r   r   r_   I  s    zECDSAKey._sigdecode)NNNNNNT)N)N)N)r   r    r!   r"   r#   r   r   Z	SECP256R1Z	SECP384R1Z	SECP521R1r9   r   ÚclassmethodrH   rO   rR   ÚpropertyrT   rS   rU   rV   r^   rb   rf   rg   rk   r7   r6   rm   rY   r_   r   r   r   r   r/   _   sF   


ýÿ
       ø
=





'r/   N)r"   Zcryptography.exceptionsr   r   Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   Z/cryptography.hazmat.primitives.asymmetric.utilsr   r	   Zparamiko.commonr
   Zparamiko.messager   Zparamiko.pkeyr   Zparamiko.ssh_exceptionr   Zparamiko.utilr   Úobjectr   r#   r/   r   r   r   r   Ú<module>   s   