
    a                     ~    d dl Z d dlmZ d dlmZ d dlZd dlmZ d dl	m
Z
mZmZ d dlmZ d dlmZmZ  G d d	e
      Zy)
    N)default_backend)Cipher)Message)PKeyOPENSSH_AUTH_MAGIC_unpad_openssh)b)SSHExceptionPasswordRequiredExceptionc                   T    e Zd ZdZ	 ddZd Zd Zed        Zd Z	d Z
d	 Zd
 Zd Zy)
Ed25519Keya  
    Representation of an `Ed25519 <https://ed25519.cr.yp.to/>`_ key.

    .. note::
        Ed25519 key support was added to OpenSSH in version 6.5.

    .. versionadded:: 2.2
    .. versionchanged:: 2.3
        Added a ``file_obj`` parameter to match other key classes.
    Nc                    d | _         d x}}||t        |      }|B| j                  |dd       t        j                  j                  |j                               }nD|+t        |d      5 }| j                  d|      \  }	}d d d        n|| j                  d|      \  }	}|s|r| j                  ||      }||t        d      || _        || _        y # 1 sw Y   =xY w)Nssh-ed25519z ssh-ed25519-cert-v01@openssh.com)msgkey_type	cert_typerOPENSSHz
need a key)public_blobr   _check_type_and_load_certnaclsigning	VerifyKey
get_binaryopen_read_private_key_parse_signing_key_data
ValueError_signing_key_verifying_key)
selfr   datafilenamepasswordfile_objverifying_keysigning_keyfpkformats
             3lib/python3.12/site-packages/paramiko/ed25519key.py__init__zEd25519Key.__init__*   s     &**;4+$-C?**&< + 
 !LL223>>3CDM!h$ F!%!7!7	1!E$F F!!33IxHNHdx66tXFK=#8\**'+F Fs   -CC c                    ddl m} t        |      }|j                  t	        t
                    t
        k7  rt        d      |j                         }|j                         }|j                         }|j                         }|dk(  r|s|dk7  rTt        d      |dk(  r9|st        d      t        |      }	|	j                         }
|	j                         }nt        d      |dk7  r||j                  vrt        d      g }t        |      D ]X  }t        |j                               }|j                         dk7  rt        d      |j                  |j                                Z |j                         }|dk(  r|}n|j                  |   }t        j                  t!        |      
|d   |d	   z   d
      }t#         |d   |d |d           |d   ||d   d        t%                     j'                         }|j)                  |      |j+                         z   }t        t-        |            }|j                         |j                         k7  rt        d      g }t        |      D ]  }|j                         dk7  rt        d      |j                         }|j                         }t.        j0                  j3                  |d d       }|j4                  j7                         |cxk(  r||   cxk(  r	|dd  k(  sJ  J |j                  |       |j                           t	        |      dk7  rt        d      |d   S )Nr   )	TransportzInvalid keynonebcryptzPrivate key file is encryptedr   zkey-sizez
block-sizeT)r$   saltdesired_key_bytesroundsignore_few_roundsclassmode)backend       )paramiko.transportr-   r   	get_byteslenr   r
   get_textr   get_intr   _cipher_inforangeappendr/   kdfr	   r   r   	decryptorupdatefinalizer   r   r   
SigningKey
verify_keyencode)r!   r"   r$   r-   message
ciphernamekdfname
kdfoptionsnum_keysrA   bcrypt_saltbcrypt_roundspublic_keys_pubkeyprivate_ciphertextprivate_datacipherkeyrB   signing_keysipublickey_datar'   s                            r*   r   z"Ed25519Key._parse_signing_key_dataG   sL   0 $-S!3459KK}--%%'
""$'')
??$f Z61"=11 /3  *%C..*KKKMM}--Ji6L6L$L}--x 	4AW//12F M1"=11v0023		4 %//1-L++J7F**8 "("4vl7K"K$ #'C w$8fZ&8 9:vs6*#5#789') ik	    !34y7I7I7KK  .67?? 11}--x 	!A!]2"=11'')F))+H ,,11(3B-@K &&--/!q>! BC=!! , %	!( |!}--A    c                     | j                         r| j                  j                  }n| j                  }t	               }|j                  d       |j                  |j                                |j                         S Nr   )can_signr   rF   r    r   
add_stringrG   asbytes)r!   vms      r*   r_   zEd25519Key.asbytes   sX    ==?!!,,A##AI	]#	QXXZ yy{rZ   c                     | j                         r| j                  j                  }n| j                  }| j	                         |fS N)r]   r   rF   r    get_name)r!   r`   s     r*   _fieldszEd25519Key._fields   s8    ==?!!,,A##A##rZ   c                      yr\    r!   s    r*   rd   zEd25519Key.get_name   s    rZ   c                      y)N   rg   rh   s    r*   get_bitszEd25519Key.get_bits   s    rZ   c                     | j                   d uS rc   )r   rh   s    r*   r]   zEd25519Key.can_sign   s      ,,rZ   c                     t               }|j                  d       |j                  | j                  j                  |      j                         |S r\   )r   r^   r   sign	signature)r!   r"   ra   s      r*   sign_ssh_datazEd25519Key.sign_ssh_data   s=    I	]#	T&&++D1;;<rZ   c                     |j                         dk7  ry	 | j                  j                  ||j                                y# t        j
                  j                  $ r Y yw xY w)Nr   FT)r<   r    verifyr   r   
exceptionsBadSignatureError)r!   r"   r   s      r*   verify_ssh_sigzEd25519Key.verify_ssh_sig   sX    <<>]*	&&tS^^-=>  00 		s   *A A! A!)NNNNN)__name__
__module____qualname____doc__r+   r   r_   propertyre   rd   rk   r]   rp   ru   rg   rZ   r*   r   r      sL    	 KO,:^@ $ $-	rZ   r   )r/   cryptography.hazmat.backendsr   &cryptography.hazmat.primitives.ciphersr   nacl.signingr   paramiko.messager   paramiko.pkeyr   r   r   paramiko.py3compatr	   paramiko.ssh_exceptionr
   r   r   rg   rZ   r*   <module>r      s0   "  8 9  $ B B   Js srZ   