U
    ς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"   L/var/www/html/myproject/myenv/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 rtdt|  | }t|	dk rt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 qX n0|| jkr|| |d}dgt| }n
| 	| t
|tk	st|dk s|d dkrt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   