o
    ç÷¡g8   ã                   @   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 ur|  ||¡ d S |d ur*|  ||¡ d S |d u r6|d ur6t|ƒ}|d urE|\| _ | _| _| _n!| j	|| j
| j
› d�d� | ¡ | _ | ¡ | _| ¡ | _| ¡ | _t | j ¡| _d S )Nz-cert-v01@openssh.com)ÚmsgÚkey_typeÚ	cert_type)ÚpÚqÚgÚyÚxÚpublic_blobÚ_from_private_keyÚ_from_private_key_filer   Ú_check_type_and_load_certÚnameÚ	get_mpintr	   Ú
bit_lengthÚsize)Úselfr   ÚdataÚfilenameÚpasswordÚvalsÚfile_obj© r'   ú:/usr/local/lib/python3.10/dist-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   ó   | j S r*   )r   r/   r'   r'   r(   r1   f   ó   zDSSKey.get_namec                 C   r3   r*   )r    r/   r'   r'   r(   Úget_bitsi   r4   zDSSKey.get_bitsc                 C   s
   | j d u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 rOt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	   Údeflate_longÚlenr
   )
r!   r"   Ú	algorithmÚkeyÚsigÚrÚsr.   ÚrstrÚsstrr'   r'   r(   Úsign_ssh_datao   s.   ÿþþø	zDSSKey.sign_ssh_datac           	      C   sÄ   t | ¡ ƒdkr| ¡ }n| ¡ }|| j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 d	S  tya   Y dS w )
Né(   r   r>   é   r7   r8   r<   FT)rF   r-   Úget_textr   Ú
get_binaryr	   Úinflate_longr   r   r@   r   rA   r   r   r   Ú
public_keyr   Úverifyr   rD   r   )	r!   r"   r   rI   ÚkindÚsigRÚsigSÚ	signaturerH   r'   r'   r(   Úverify_ssh_sigˆ   s.   


ÿþûýÿzDSSKey.verify_ssh_sigc              	   C   óR   t j| jt j| jt j| j| j| jd�d�d�j	t
ƒ d�}| j||tjj|d� d S ©Nr7   r8   r:   r<   )r$   )r   r?   r   r@   r   rA   r   r   r   rB   r   Ú_write_private_key_filer   ÚPrivateFormatÚTraditionalOpenSSL)r!   r#   r$   rH   r'   r'   r(   Úwrite_private_key_file¥   ó"   ÿþþø

üzDSSKey.write_private_key_filec              	   C   r[   r\   )r   r?   r   r@   r   rA   r   r   r   rB   r   Ú_write_private_keyr   r^   r_   )r!   r&   r$   rH   r'   r'   r(   Úwrite_private_key·   ra   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
        r<   )r%   )r   Úgenerate_private_keyr   Úprivate_numbersr   r;   r9   r   r   r   r   r   )ÚbitsÚprogress_funcÚnumbersrH   r'   r'   r(   ÚgenerateÉ   s   
ÿþüÿzDSSKey.generatec                 C   ó   |   d||¡}|  |¡ d S ©NÚDSA)Ú_read_private_key_fileÚ_decode_key)r!   r#   r$   r"   r'   r'   r(   r   ã   ó   zDSSKey._from_private_key_filec                 C   rk   rl   )Ú_read_private_keyro   )r!   r&   r$   r"   r'   r'   r(   r   ç   rp   zDSSKey._from_private_keyc              
   C   sê   |\}}|| j kr%zt|ƒ ¡ }W n+ ty$ } ztd |¡ƒ‚d }~ww || jkr8|  |d¡}dgt|ƒ }n|  	|¡ t
|ƒtusOt|ƒdk sO|d dkrStdƒ‚|d | _|d | _|d | _|d	 | _|d
 | _t | j¡| _d S )NzUnable to parse key file: {}Úiiiiir   é   z3not a valid DSA private key file (bad ber encoding)rP   é   é   é   é   )Ú_PRIVATE_KEY_FORMAT_ORIGINALr   Údecoder   r   ÚformatÚ_PRIVATE_KEY_FORMAT_OPENSSHÚ_uint32_cstruct_unpackÚlistÚ_got_bad_key_format_idÚtyperF   r   r   r   r   r   r	   r   r    )r!   r"   ÚpkformatÚkeylistÚer'   r'   r(   ro   ë   s,   
€ÿ

$ÿ




zDSSKey._decode_key)NNNNNNr*   )rd   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r)   r-   r0   Úpropertyr2   r1   r5   r6   rN   rZ   r`   rc   Ústaticmethodrj   r   r   ro   r'   r'   r'   r(   r   (   s4    
ù%	



r   N)r†   Úcryptography.exceptionsr   Úcryptography.hazmat.backendsr   Úcryptography.hazmat.primitivesr   r   Ú)cryptography.hazmat.primitives.asymmetricr   Ú/cryptography.hazmat.primitives.asymmetric.utilsr   r   Úparamikor	   Úparamiko.commonr
   Úparamiko.ssh_exceptionr   Úparamiko.messager   Úparamiko.berr   r   Úparamiko.pkeyr   r   r'   r'   r'   r(   Ú<module>   s   