
    3~h8                          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e      Zy)z
DSS keys.
    )InvalidSignature)default_backend)hashesserialization)dsa)decode_dss_signatureencode_dss_signature)util)	zero_byte)SSHException)Message)BERBERException)PKeyc                       e Zd ZdZdZ	 	 	 	 	 	 ddZd Zd Zed        Z	d Z
d	 Zd
 ZddZd ZddZddZedd       Zd Zd Zd Zy)DSSKeyzX
    Representation of a DSS key which can be used to sign an verify SSH2
    data.
    zssh-dssNc                 L   d | _         d | _        d | _        d | _        d | _        d | _        || j                  ||       y || j                  ||       y ||t        |      }||\  | _         | _        | _        | _        n| j                  || j                  | j                   d       |j                         | _         |j                         | _        |j                         | _        |j                         | _        t        j                  | j                         | _        y )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_objs          X/var/www/peopleoo.sandbox-dev.co.uk/venv/lib/python3.12/site-packages/paramiko/dsskey.py__init__zDSSKey.__init__0   s    ""8X6''(;Kd.$-C-1*DFDFDFDF**!YYK'<= + 
 ]]_DF]]_DF]]_DF]]_DFOODFF+	    c                 D   t               }|j                  | j                         |j                  | j                         |j                  | j
                         |j                  | j                         |j                  | j                         |j                         S N)	r   
add_stringr    	add_mpintr   r   r   r   asbytes)r$   ms     r*   r1   zDSSKey.asbytesU   se    I	TYY	DFF	DFF	DFF	DFFyy{r,   c                 "    | j                         S r.   )r1   r$   s    r*   __str__zDSSKey.__str__^   s    ||~r,   c                 |    | j                         | j                  | j                  | j                  | j                  fS r.   )get_namer   r   r   r   r4   s    r*   _fieldszDSSKey._fieldsa   s)    @@r,   c                     | j                   S r.   )r    r4   s    r*   r7   zDSSKey.get_namef       yyr,   c                     | j                   S r.   )r#   r4   s    r*   get_bitszDSSKey.get_bitsi   r:   r,   c                     | j                   d uS r.   )r   r4   s    r*   can_signzDSSKey.can_signl   s    vvT!!r,   c                    t        j                  | j                  t        j                  | j                  t        j
                  | j                  | j                  | j                                    j                  t                     }|j                  |t        j                               }t        |      \  }}t               }|j!                  | j"                         t%        j&                  |d      }t%        j&                  |d      }	t)        |      dk  rt*        dt)        |      z
  z  |z   }t)        |	      dk  rt*        dt)        |	      z
  z  |	z   }	|j!                  ||	z          |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sr2   rstrsstrs
             r*   sign_ssh_datazDSSKey.sign_ssh_datao   s   ##ff//&&"%"9"9ff$&&#
 +o/+
0 	 hhtV[[]+#C(1I	TYY  A&  A&t9r>SY/$6Dt9r>SY/$6D	TD[!r,   c                 ~   t        |j                               dk(  r|j                         }n0|j                         }|| j                  k7  ry|j	                         }t        j                  |d d d      }t        j                  |dd  d      }t        ||      }t        j                  | j                  t        j                  | j                  | j                  | j                              j                  t!                     }	 |j#                  ||t%        j&                                y# t(        $ r Y y	w xY w)
N(   r   rG      r@   rA   rE   TF)rO   r1   get_textr    
get_binaryr
   inflate_longr	   r   rI   r   rJ   r   r   r   
public_keyr   verifyr   rM   r   )	r$   r%   r   rR   kindsigRsigS	signaturerQ   s	            r*   verify_ssh_sigzDSSKey.verify_ssh_sig   s   s{{}#++-C<<>Dtyy .."C   Sb1-  RS1-(t4	""ff!55&&DFFdff

 *_.*
/ 		JJy$6    		s   
%D0 0	D<;D<c                 v   t        j                  | j                  t        j                  | j                  t        j
                  | j                  | j                  | j                                    j                  t                     }| j                  ||t        j                  j                  |       y Nr@   rA   rC   rE   )r'   )r   rH   r   rI   r   rJ   r   r   r   rK   r   _write_private_key_filer   PrivateFormatTraditionalOpenSSL)r$   r&   r'   rQ   s       r*   write_private_key_filezDSSKey.write_private_key_file   s    ##ff//&&"%"9"9ff$&&#
 +o/+
0 	 	$$''::	 	% 	
r,   c                 v   t        j                  | j                  t        j                  | j                  t        j
                  | j                  | j                  | j                                    j                  t                     }| j                  ||t        j                  j                  |       y rf   )r   rH   r   rI   r   rJ   r   r   r   rK   r   _write_private_keyr   rh   ri   )r$   r)   r'   rQ   s       r*   write_private_keyzDSSKey.write_private_key   s    ##ff//&&"%"9"9ff$&&#
 +o/+
0 	 	''::	 	  	
r,   c                 ~   t        j                  | t                     j                         }t	        |j
                  j                  j                  |j
                  j                  j                  |j
                  j                  j                  |j
                  j                  f      }|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
        rE   )r(   )r   generate_private_keyr   private_numbersr   rD   rB   r   r   r   r   r   )bitsprogress_funcnumbersrQ   s       r*   generatezDSSKey.generate   s     **/+

/
 	 &&88::&&88::&&88::&&((	
 		
r,   c                 L    | j                  d||      }| j                  |       y NDSA)_read_private_key_file_decode_key)r$   r&   r'   r%   s       r*   r   zDSSKey._from_private_key_file   s$    **5(HEr,   c                 L    | j                  d||      }| j                  |       y rv   )_read_private_keyry   )r$   r)   r'   r%   s       r*   r   zDSSKey._from_private_key   s$    %%eXx@r,   c                 L   |\  }}|| j                   k(  r	 t        |      j                         }nB|| j                  k(  r"| j                  |d      }dgt        |      z   }n| j                  |       t              t        ust        |      dk  s|d   dk7  rt	        d      |d   | _        |d   | _        |d   | _        |d	   | _        |d
   | _        t#        j$                  | j                        | _        y # t        $ r}t	        dj                  |            d }~ww xY w)NzUnable to parse key file: {}iiiiir      z3not a valid DSA private key file (bad ber encoding)rZ               )_PRIVATE_KEY_FORMAT_ORIGINALr   decoder   r   format_PRIVATE_KEY_FORMAT_OPENSSH_uint32_cstruct_unpacklist_got_bad_key_format_idtyperO   r   r   r   r   r   r
   r"   r#   )r$   r%   pkformatkeylistes        r*   ry   zDSSKey._decode_key   s   $ t888Md)**, 99911$@GcDM)G''1=$Gq(8GAJ!OE  OODFF+	!   M"#A#H#H#KLLMs   C; ;	D#DD#)NNNNNNr.   )i   N)__name__
__module____qualname____doc__r    r+   r1   r5   propertyr8   r7   r<   r>   rW   rd   rj   rm   staticmethodrt   r   r   ry    r,   r*   r   r   (   s    
 D #,J A A"2:
$
$  2,r,   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*   <module>r      s?   & 5 8 @ 9
  % / $ * Z,T Z,r,   