
    a!                         d 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
mZ ddlmZ ddlmZ ddlmZ dd	lmZ  G d
 de      Zy)z
RSA keys.
    )InvalidSignatureUnsupportedAlgorithm)default_backend)hashesserialization)rsapadding)Message)PKey)PY2)SSHExceptionc                       e Zd ZdZ	 	 	 	 	 	 ddZed        Zed        Zd Zd Z	ed        Z
d	 Zd
 Zd Zd Zd ZddZddZedd       Zd Zd Zd Zy)RSAKeyzZ
    Representation of an RSA key which can be used to sign and verify SSH2
    data.
    Nc                 l   d | _         d | _        || j                  ||       y || j                  ||       y ||t	        |      }||| _         y | j                  |dd       t        j                  |j                         |j                               j                  t                     | _         y )Nssh-rsazssh-rsa-cert-v01@openssh.com)msgkey_type	cert_typeen)keypublic_blob_from_private_key_from_private_key_filer
   _check_type_and_load_certr   RSAPublicNumbers	get_mpint
public_keyr   )selfr   datafilenamepasswordr   file_objs          /lib/python3.12/site-packages/paramiko/rsakey.py__init__zRSAKey.__init__(   s     ""8X6''(;Kd.$-C?DH**"8 + 
 ++--/S]]_j*+ H    c                 .    | j                   j                  S N)r   key_sizer    s    r%   sizezRSAKey.sizeG   s    xx   r'   c                     t        | j                  t        j                        r$| j                  j	                         j
                  S | j                  j                         S r)   )
isinstancer   r   RSAPrivateKeyprivate_numberspublic_numbersr+   s    r%   r1   zRSAKey.public_numbersK   sB    dhh 1 1288++-<<<88**,,r'   c                     t               }|j                  d       |j                  | j                  j                         |j                  | j                  j
                         |j                         S Nr   )r
   
add_string	add_mpintr1   r   r   asbytes)r    ms     r%   r6   zRSAKey.asbytesR   sQ    I	Y	D''))*	D''))*yy{r'   c                 p    t         r| j                         S | j                         j                  dd      S )Nutf8ignore)errors)r   r6   decoder+   s    r%   __str__zRSAKey.__str__Y   s1    
  <<>!<<>(((AAr'   c                 x    | j                         | j                  j                  | j                  j                  fS r)   )get_namer1   r   r   r+   s    r%   _fieldszRSAKey._fieldse   s-    !4!4!6!68K8K8M8MNNr'   c                      yr3    r+   s    r%   r?   zRSAKey.get_namei   s    r'   c                     | j                   S r)   )r,   r+   s    r%   get_bitszRSAKey.get_bitsl   s    yyr'   c                 J    t        | j                  t        j                        S r)   )r.   r   r   r/   r+   s    r%   can_signzRSAKey.can_signo   s    $((C$5$566r'   c                     | j                   j                  |t        j                         t	        j
                               }t               }|j                  d       |j                  |       |S )N)r	   	algorithmr   )r   signr	   PKCS1v15r   SHA1r
   r4   )r    r!   sigr7   s       r%   sign_ssh_datazRSAKey.sign_ssh_datar   sU    hhmm'**,  
 I	Y	Sr'   c                 D   |j                         dk7  ry| j                  }t        |t        j                        r|j                         }	 |j                  |j                         |t        j                         t        j                                y# t        $ r Y yw xY w)Nr   FT)get_textr   r.   r   r/   r   verify
get_binaryr	   rJ   r   rK   r   )r    r!   r   r   s       r%   verify_ssh_sigzRSAKey.verify_ssh_sig|   s    <<>Y&hhc3,,-.."C	JJ $(8(8(:FKKM    		s   AB 	BBc                 r    | j                  || j                  t        j                  j                  |       y N)r#   )_write_private_key_filer   r   PrivateFormatTraditionalOpenSSL)r    r"   r#   s      r%   write_private_key_filezRSAKey.write_private_key_file   s1    $$HH''::	 	% 	
r'   c                 r    | j                  || j                  t        j                  j                  |       y rT   )_write_private_keyr   r   rV   rW   )r    r$   r#   s      r%   write_private_keyzRSAKey.write_private_key   s1    HH''::	 	  	
r'   c                 Z    t        j                  d| t                     }t        |      S )a$  
        Generate a new private RSA 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 `.RSAKey` private key
        i  )public_exponentr*   backend)r   )r   generate_private_keyr   r   )bitsprogress_funcr   s      r%   generatezRSAKey.generate   s*     &&!D/:K
 #r'   c                 L    | j                  d||      }| j                  |       y NRSA)_read_private_key_file_decode_key)r    r"   r#   r!   s       r%   r   zRSAKey._from_private_key_file   s$    **5(HEr'   c                 L    | j                  d||      }| j                  |       y rd   )_read_private_keyrg   )r    r$   r#   r!   s       r%   r   zRSAKey._from_private_key   s$    %%eXx@r'   c           	      6   |\  }}|| j                   k(  r"	 t        j                  |d t                     }n|| j                  k(  rp| j                  |d      \  }}}}}}	t        j                  ||      }
t        j                  ||	|||dz
  z  ||	dz
  z  ||
      j                  t                     }n| j                  |       t!        t        j"                        sJ || _        y # t        t
        t        f$ r}t        t        |            d }~ww xY w)N)r#   r^   iiiiiir      )pqddmp1dmq1iqmpr1   )_PRIVATE_KEY_FORMAT_ORIGINALr   load_der_private_keyr   
ValueError	TypeErrorr   r   str_PRIVATE_KEY_FORMAT_OPENSSH_uint32_cstruct_unpackr   r   RSAPrivateNumbersprivate_key_got_bad_key_format_idr.   r/   r   )r    r!   pkformatr   r   r   ro   rr   rm   rn   r1   s              r%   rg   zRSAKey._decode_key   s   $t888+#8841B
 999"&"="=dH"MAq!T1a 11A;N''!a%[!a%[- k/+,  ''1#s0011# 	+?@ +"3q6**+s    C+ +D?DD)NNNNNNr)   )__name__
__module____qualname____doc__r&   propertyr,   r1   r6   r=   r@   r?   rD   rF   rM   rR   rX   r[   staticmethodrb   r   r   rg   rB   r'   r%   r   r   "   s     ,> ! ! - -
B O O7 

   r'   r   N)r   cryptography.exceptionsr   r   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r	   paramiko.messager
   paramiko.pkeyr   paramiko.py3compatr   paramiko.ssh_exceptionr   r   rB   r'   r%   <module>r      s3   & K 8 @ B $  " /kT kr'   