U
    cc                      @   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"   3/tmp/pip-unpacked-wheel-rglolp_m/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 rtdt|  | }t|	dk rt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_funcZ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)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#   rT      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   staticmethodrR   r   r   rT   r"   r"   r"   r#   r   (   s0         
%	



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   