U
    7Ód8   ã                   @   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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.
    zssh-dssNc                 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Š|\| _ | _| _| _nB| j	|| j
| j
› dd | ¡ | _ | ¡ | _| ¡ | _| ¡ | _t | j ¡| _d S )Nz-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_certÚnameZ	get_mpintr	   Ú
bit_lengthÚsize)Úselfr   ÚdataÚfilenameÚpasswordÚvalsÚfile_obj© r"   úQ/var/www/html/alexa-login-pro/venv/lib/python3.8/site-packages/paramiko/dsskey.pyÚ__init__0   s4    	
ý



zDSSKey.__init__c                 C   sJ   t ƒ }| | j¡ | | j¡ | | j¡ | | j¡ | | j¡ | ¡ S ©N)	r   Ú
add_stringr   Z	add_mpintr   r   r   r   Úasbytes)r   Úmr"   r"   r#   r'   U   s    zDSSKey.asbytesc                 C   s   |   ¡ S r%   )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#   Ú_fieldsa   s    zDSSKey._fieldsc                 C   s   | j S r%   )r   r)   r"   r"   r#   r+   f   s    zDSSKey.get_namec                 C   s   | j S r%   )r   r)   r"   r"   r#   Úget_bitsi   s    zDSSKey.get_bitsc                 C   s
   | j d k	S r%   )r   r)   r"   r"   r#   Úcan_signl   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ƒ }| | j¡ 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   ÚDSAPrivateNumbersr   ÚDSAPublicNumbersr   ÚDSAParameterNumbersr   r   r   Úprivate_keyr   Úsignr   ÚSHA1r   r   r&   r   r	   Zdeflate_longÚlenr
   )
r   r   Ú	algorithmÚkeyÚsigÚrÚsr(   ZrstrZsstrr"   r"   r#   Úsign_ssh_datao   s2      ÿþþø	zDSSKey.sign_ssh_datac           	      C   sÌ   t | ¡ ƒdkr| ¡ }n| ¡ }|| jkr0d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   r6   é   r/   r0   r4   FT)r=   r'   Zget_textr   Z
get_binaryr	   Zinflate_longr   r   r8   r   r9   r   r   r   Z
public_keyr   Úverifyr   r<   r   )	r   r   r   r@   Ú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 ©Nr/   r0   r2   r4   )r   )r   r7   r   r8   r   r9   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 rJ   )r   r7   r   r8   r   r9   r   r   r   r:   r   Z_write_private_keyr   rK   rL   )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
        r4   )r    )r   Zgenerate_private_keyr   Zprivate_numbersr   r3   r1   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 rS   )Z_read_private_keyrT   )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)rE   é   é   é   é   )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#   rT   ë   s(    
"

$ÿ




zDSSKey._decode_key)NNNNNN)N)N)N)rO   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r$   r'   r*   Úpropertyr,   r+   r-   r.   rC   rI   rM   rN   ÚstaticmethodrR   r   r   rT   r"   r"   r"   r#   r   (   s2         ù
%	



r   N)rb   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   