U
    we8                      @   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)msgkey_typeZ	cert_type)pqgyxpublic_blob_from_private_key_from_private_key_filer   Z_check_type_and_load_certname	get_mpintr	   
bit_lengthsize)selfr   datafilenamepasswordvalsfile_obj r%   n/mounts/lovelace/software/anaconda3/envs/qiime2-amplicon-2024.2/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   	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	   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   r:      r3   r4   r8   FT)rB   r+   get_textr   
get_binaryr	   inflate_longr   r   r<   r   r=   r   r   r   Z
public_keyr   verifyr   r@   r   )	r   r    r   rE   kindZsigRZsigS	signaturerD   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 Nr3   r4   r6   r8   )r"   )r   r;   r   r<   r   r=   r   r   r   r>   r   Z_write_private_key_filer   PrivateFormatTraditionalOpenSSL)r   r!   r"   rD   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 rR   )r   r;   r   r<   r   r=   r   r   r   r>   r   Z_write_private_keyr   rS   rT   )r   r$   r"   rD   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
        r8   )r#   )r   Zgenerate_private_keyr   Zprivate_numbersr   r7   r5   r   r   r   r   r   )bitsZprogress_funcnumbersrD   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 r[   )Z_read_private_keyr\   )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)rJ               )Z_PRIVATE_KEY_FORMAT_ORIGINALr   decoder   r   formatZ_PRIVATE_KEY_FORMAT_OPENSSHZ_uint32_cstruct_unpacklistZ_got_bad_key_format_idtyperB   r   r   r   r   r   r	   r   r   )r   r    ZpkformatZkeylister%   r%   r&   r\      s(    
"

$




zDSSKey._decode_key)NNNNNN)N)N)N)rW   N)__name__
__module____qualname____doc__r   r'   r+   r.   propertyr0   r/   r1   r2   rH   rQ   rU   rV   staticmethodrZ   r   r   r\   r%   r%   r%   r&   r   (   s2         
%	



r   N)rj   cryptography.exceptionsr   cryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   Z/cryptography.hazmat.primitives.asymmetric.utilsr   r   paramikor	   paramiko.commonr
   paramiko.ssh_exceptionr   paramiko.messager   Zparamiko.berr   r   paramiko.pkeyr   r   r%   r%   r%   r&   <module>   s   