U
    ÓZj   ã                   @   s¨   d Z ddl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mZ ddlmZ G dd„ deƒZdS )z
DSS keys.
é    )ÚInvalidSignature)Údefault_backend)ÚhashesÚserialization)Údsa)Údecode_dss_signatureÚencode_dss_signature)Úutil)Ú	zero_byte)ÚSSHException)ÚMessage)ÚBERÚBERException)ÚPKeyc                   @   sš   e Zd ZdZd"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d&dd„ƒZdd„ Zdd„ Zd d!„ ZdS )'ÚDSSKeyzX
    Representation of a DSS key which can be used to sign an verify SSH2
    data.
    Nc                 C   sÔ   d | _ d | _d | _d | _d | _d | _|d k	r<|  ||¡ d S |d k	rT|  ||¡ d S |d krl|d k	rlt|ƒ}|d k	rŠ|\| _ | _| _| _n8| j	|ddd� | 
¡ | _ | 
¡ | _| 
¡ | _| 
¡ | _t | j ¡| _d S )Nússh-dsszssh-dss-cert-v01@openssh.com)ÚmsgZkey_typeZ	cert_type)ÚpÚqÚgÚyÚxZpublic_blobÚ_from_private_keyÚ_from_private_key_filer   Z_check_type_and_load_certZ	get_mpintr	   Ú
bit_lengthÚsize)Úselfr   ÚdataÚfilenameÚpasswordÚvalsÚfile_obj© r"   úR/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/paramiko/dsskey.pyÚ__init__.   s4    	ý



zDSSKey.__init__c                 C   sH   t ƒ }| d¡ | | j¡ | | j¡ | | j¡ | | j¡ | ¡ S ©Nr   )r   Ú
add_stringZ	add_mpintr   r   r   r   Úasbytes)r   Úmr"   r"   r#   r'   S   s    
zDSSKey.asbytesc                 C   s   |   ¡ S ©N)r'   ©r   r"   r"   r#   Ú__str__\   s    zDSSKey.__str__c                 C   s   |   ¡ | j| j| j| jfS r)   )Úget_namer   r   r   r   r*   r"   r"   r#   Ú_fields_   s    zDSSKey._fieldsc                 C   s   dS r%   r"   r*   r"   r"   r#   r,   c   s    zDSSKey.get_namec                 C   s   | j S r)   )r   r*   r"   r"   r#   Úget_bitsf   s    zDSSKey.get_bitsc                 C   s
   | j d k	S r)   )r   r*   r"   r"   r#   Úcan_signi   s    zDSSKey.can_signc           
   	   C   sÎ   t j| jt j| jt j| j| j| jd�d�d�j	t
ƒ d�}| |t ¡ ¡}t|ƒ\}}tƒ }| d¡ t |d¡}t |d¡}	t|ƒdk rœtdt|ƒ  | }t|	ƒdk r¼tdt|	ƒ  |	 }	| ||	 ¡ |S )N©r   r   r   ©r   Úparameter_numbers©r   Úpublic_numbers©Úbackendr   r   é   )r   ÚDSAPrivateNumbersr   ÚDSAPublicNumbersr   ÚDSAParameterNumbersr   r   r   Úprivate_keyr   Úsignr   ÚSHA1r   r   r&   r	   Zdeflate_longÚlenr
   )
r   r   Ú	algorithmÚkeyÚsigÚrÚsr(   ZrstrZsstrr"   r"   r#   Úsign_ssh_datal   s2      ÿþþø	
zDSSKey.sign_ssh_datac           	      C   sÊ   t | ¡ ƒdkr| ¡ }n| ¡ }|dkr.dS | ¡ }t |d d… d¡}t |dd … d¡}t||ƒ}tj| j	tj
| j| j| jd�d�jtƒ d�}z| ||t ¡ ¡ W n tk
rÀ   Y d	S X d
S d S )Né(   r   r   r7   é   r0   r1   r5   FT)r>   r'   Zget_textZ
get_binaryr	   Zinflate_longr   r   r9   r   r:   r   r   r   Z
public_keyr   Úverifyr   r=   r   )	r   r   r   rA   ÚkindZsigRZsigSÚ	signaturer@   r"   r"   r#   Úverify_ssh_sig…   s0    

  ÿþûzDSSKey.verify_ssh_sigc              	   C   sR   t j| jt j| jt j| j| j| jd�d�d�j	t
ƒ d�}| j||tjj|d� d S ©Nr0   r1   r3   r5   )r   )r   r8   r   r9   r   r:   r   r   r   r;   r   Z_write_private_key_filer   ÚPrivateFormatÚTraditionalOpenSSL)r   r   r   r@   r"   r"   r#   Úwrite_private_key_file¢   s&      ÿþþø
üzDSSKey.write_private_key_filec              	   C   sR   t j| jt j| jt j| j| j| jd�d�d�j	t
ƒ d�}| j||tjj|d� d S rK   )r   r8   r   r9   r   r:   r   r   r   r;   r   Z_write_private_keyr   rL   rM   )r   r!   r   r@   r"   r"   r#   Úwrite_private_key´   s&      ÿþþø
üzDSSKey.write_private_keyé   c                 C   sH   t j| tƒ d� ¡ }t|jjj|jjj|jjj	|jj
fd�}|j|_|S )a$  
        Generate a new private DSS key.  This factory function can be used to
        generate a new host key or authentication key.

        :param int bits: number of bits the generated key should be.
        :param progress_func: Unused
        :return: new `.DSSKey` private key
        r5   )r    )r   Zgenerate_private_keyr   Zprivate_numbersr   r4   r2   r   r   r   r   r   )ÚbitsZprogress_funcÚnumbersr@   r"   r"   r#   ÚgenerateÆ   s    
 ÿ
üÿzDSSKey.generatec                 C   s   |   d||¡}|  |¡ d S ©NZDSA)Z_read_private_key_fileÚ_decode_key)r   r   r   r   r"   r"   r#   r   à   s    zDSSKey._from_private_key_filec                 C   s   |   d||¡}|  |¡ d S rT   )Z_read_private_keyrU   )r   r!   r   r   r"   r"   r#   r   ä   s    zDSSKey._from_private_keyc              
   C   sö   |\}}|| j krVzt|ƒ ¡ }W q† tk
rR } ztd |¡ƒ‚W 5 d }~X Y q†X n0|| jkr||  |d¡}dgt|ƒ }n
|  	|¡ t
|ƒtk	sªt|ƒdk sª|d dkr²tdƒ‚|d | _|d | _|d | _|d	 | _|d
 | _t | j¡| _d S )NzUnable to parse key file: {}Ziiiiir   é   z3not a valid DSA private key file (bad ber encoding)rF   é   é   é   é   )Z_PRIVATE_KEY_FORMAT_ORIGINALr   Údecoder   r   ÚformatZ_PRIVATE_KEY_FORMAT_OPENSSHZ_uint32_cstruct_unpackÚlistZ_got_bad_key_format_idÚtyper>   r   r   r   r   r   r	   r   r   )r   r   ZpkformatZkeylistÚer"   r"   r#   rU   è   s(    
"

$ÿ




zDSSKey._decode_key)NNNNNN)N)N)N)rP   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r'   r+   Úpropertyr-   r,   r.   r/   rD   rJ   rN   rO   ÚstaticmethodrS   r   r   rU   r"   r"   r"   r#   r   (   s0         ù
%	



r   N)rc   Zcryptography.exceptionsr   Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   Z/cryptography.hazmat.primitives.asymmetric.utilsr   r   Zparamikor	   Zparamiko.commonr
   Zparamiko.ssh_exceptionr   Zparamiko.messager   Zparamiko.berr   r   Zparamiko.pkeyr   r   r"   r"   r"   r#   Ú<module>   s   