
    Iiz                     ~    S r SSKJrJr  SSKJr  SSKJrJr  SSK	J
r
Jr  SSKJr  SSKJr  SSKJr   " S	 S
\5      rg)z
RSA keys.
    )InvalidSignatureUnsupportedAlgorithm)default_backend)hashesserialization)rsapadding)Message)PKey)SSHExceptionc                   d   \ rS rSrSrSr\R                  \R                  \R                  \R                  \R                  \R                  S.r
      SS jr\S 5       r\S 5       r\S	 5       rS
 rS r\S 5       rS rS rS rSS jrS rSS jrSS jr\SS j5       rS rS rS rSr g)RSAKey!   zN
Representation of an RSA key which can be used to sign and verify SSH2
data.
ssh-rsa)r   ssh-rsa-cert-v01@openssh.comzrsa-sha2-256z!rsa-sha2-256-cert-v01@openssh.comzrsa-sha2-512z!rsa-sha2-512-cert-v01@openssh.comNc                 z   S U l         S U l        Ub  U R                  Xd5        g Ub  U R                  X45        g Uc  Ub  [	        U5      nUb  XPl         g U R                  UU R                  SS9  [        R                  " UR                  5       UR                  5       S9R                  [        5       5      U l         g )Nr   )msgkey_type	cert_typeen)keypublic_blob_from_private_key_from_private_key_filer
   _check_type_and_load_certnamer   RSAPublicNumbers	get_mpint
public_keyr   )selfr   datafilenamepasswordr   file_objs          5/venv/lib/python3.13/site-packages/paramiko/rsakey.py__init__RSAKey.__init__1   s     ""86'';Kd.$-C?H** 8 +  ++--/S]]_j*+ H    c                 H    [        U R                  R                  5       5      $ N)listHASHESkeys)clss    r'   identifiersRSAKey.identifiersR   s    CJJOO%&&r*   c                 .    U R                   R                  $ r,   )r   key_sizer"   s    r'   sizeRSAKey.sizeV   s    xx   r*   c                     [        U R                  [        R                  5      (       a$  U R                  R	                  5       R
                  $ U R                  R                  5       $ r,   )
isinstancer   r   RSAPrivateKeyprivate_numberspublic_numbersr5   s    r'   r<   RSAKey.public_numbersZ   sE    dhh 1 12288++-<<<88**,,r*   c                     [        5       nUR                  U R                  5        UR                  U R                  R
                  5        UR                  U R                  R                  5        UR                  5       $ r,   )r
   
add_stringr   	add_mpintr<   r   r   asbytes)r"   ms     r'   rA   RSAKey.asbytesa   sU    I	TYY	D''))*	D''))*yy{r*   c                 >    U R                  5       R                  SSS9$ )Nutf8ignore)errors)rA   decoder5   s    r'   __str__RSAKey.__str__h   s      ||~$$VH$==r*   c                 x    U R                  5       U R                  R                  U R                  R                  4$ r,   )get_namer<   r   r   r5   s    r'   _fieldsRSAKey._fieldsm   s-    !4!4!6!68K8K8M8MNNr*   c                     U R                   $ r,   )r   r5   s    r'   rL   RSAKey.get_nameq       yyr*   c                     U R                   $ r,   )r6   r5   s    r'   get_bitsRSAKey.get_bitst   rQ   r*   c                 J    [        U R                  [        R                  5      $ r,   )r9   r   r   r:   r5   s    r'   can_signRSAKey.can_signw   s    $((C$5$566r*   c                    Uc  U R                   nU R                  R                  U[        R                  " 5       U R
                  U   " 5       S9n[        5       nUR                  UR                  SS5      5        UR                  U5        U$ )N)r	   	algorithmz-cert-v01@openssh.com )	r   r   signr	   PKCS1v15r.   r
   r?   replace)r"   r#   rY   sigrB   s        r'   sign_ssh_dataRSAKey.sign_ssh_dataz   s|    		Ihhmm$$& kk),.  
 I	Y&&'>CD	Sr*   c                    UR                  5       nX0R                  ;  a  gU R                  n[        U[        R
                  5      (       a  UR                  5       nUR                  5       nUR                  [        U5      S-  -
  nUS:  a  SUS-   S-  -  U-   n UR                  XQ[        R                  " 5       U R                  U   " 5       5        g! [         a     gf = f)NF   r          T)get_textr.   r   r9   r   r:   r!   
get_binaryr4   lenverifyr	   r\   r   )r"   r#   r   sig_algorithmr   r[   diffs          r'   verify_ssh_sigRSAKey.verify_ssh_sig   s    +hhc3,,--.."C ~~||c$i!m+!8taxAo.5D	JJG,,.M0J0L    		s   8C 
C"!C"c                 l    U R                  UU R                  [        R                  R                  US9  g N)r%   )_write_private_key_filer   r   PrivateFormatTraditionalOpenSSL)r"   r$   r%   s      r'   write_private_key_fileRSAKey.write_private_key_file   s1    $$HH''::	 	% 	
r*   c                 l    U R                  UU R                  [        R                  R                  US9  g rn   )_write_private_keyr   r   rp   rq   )r"   r&   r%   s      r'   write_private_keyRSAKey.write_private_key   s1    HH''::	 	  	
r*   c                 P    [         R                  " SU [        5       S9n[        US9$ )z
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_exponentr4   backend)r   )r   generate_private_keyr   r   )bitsprogress_funcr   s      r'   generateRSAKey.generate   s*     &&!D/:K
 #r*   c                 J    U R                  SX5      nU R                  U5        g NRSA)_read_private_key_file_decode_key)r"   r$   r%   r#   s       r'   r   RSAKey._from_private_key_file   s"    **5(Er*   c                 J    U R                  SX5      nU R                  U5        g r   )_read_private_keyr   )r"   r&   r%   r#   s       r'   r   RSAKey._from_private_key   s"    %%eX@r*   c           
      &   Uu  p!X R                   :X  a    [        R                  " US [        5       S9nOX R                  :X  af  U R                  US5      u  pTpgp[        R                  " XES9n
[        R                  " UU	UXhS-
  -  XiS-
  -  UU
S9R                  [        5       5      nOU R                  U5        [!        W[        R"                  5      (       d   eX0l        g ! [        [
        [        4 a  n[        [        U5      5      eS nAff = f)N)r%   rz   iiiiiir      )pqddmp1dmq1iqmpr<   )_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_idr9   r:   r   )r"   r#   pkformatr   r   r   r   r   r   r   r<   s              r'   r   RSAKey._decode_key   s   888+#8841B
 999"&"="=dH"MA!1 11A;N''a%[a%[- k/+,  ''1#s001111# 	+?@ +"3q6**+s   C" "D7DD)r   r   )NNNNNNr,   )!__name__
__module____qualname____firstlineno____doc__r   r   SHA1SHA256SHA512r.   r(   classmethodr1   propertyr6   r<   rA   rI   rM   rL   rS   rV   r_   rk   rr   rv   staticmethodr~   r   r   r   __static_attributes__ r*   r'   r   r   !   s    
 D;;(.-3]]-3]]F ,B ' ' ! ! - ->
 O O7 0

   r*   r   N)r   cryptography.exceptionsr   r   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r	   paramiko.messager
   paramiko.pkeyr   paramiko.ssh_exceptionr   r   r   r*   r'   <module>r      s0   & K 8 @ B $  /BT Br*   