o
    ç÷¡g!  ã                   @   sx   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	„ d	e
ƒZdS )
é    N)Údefault_backend)ÚCipher)ÚMessage)ÚPKeyÚOPENSSH_AUTH_MAGICÚ_unpad_openssh)Úb)ÚSSHExceptionÚPasswordRequiredExceptionc                   @   sf   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S )Ú
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.
    zssh-ed25519Nc           
      C   sê   d | _ d  }}|d u r|d urt|ƒ}|d ur)| j|| jdd� tj | ¡ ¡}n.|d urKt|dƒ�}|  	d|¡\}	}W d   ƒ n1 sEw   Y  n|d urW|  	d|¡\}	}|s[|ra|  
||¡}|d u rm|d u rmtdƒ‚|| _|| _d S )Nz ssh-ed25519-cert-v01@openssh.com)ÚmsgÚkey_typeÚ	cert_typeÚrÚOPENSSHz
need a key)Úpublic_blobr   Ú_check_type_and_load_certÚnameÚ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Úpkformat© r'   ú>/usr/local/lib/python3.10/dist-packages/paramiko/ed25519key.pyÚ__init__,   s0   ýÿ€
zEd25519Key.__init__c                 C   sn  ddl m} t|ƒ}| ttƒ¡tkrtdƒ‚| ¡ }| ¡ }| ¡ }| 	¡ }|dkr6|s1|dkr5tdƒ‚n|dkrM|s@t
dƒ‚t|ƒ}	|	 ¡ }
|	 	¡ }ntdƒ‚|dkr^||jvr^tdƒ‚g }t|ƒD ]}t| ¡ ƒ}| ¡ | jkrwtdƒ‚| | ¡ ¡ qd| ¡ }|dkrŠ|}n>|j| }tjt|ƒ|
|d |d  |d	d
�}t|d |d |d … ƒ|d ||d d … ƒtƒ d� ¡ }| |¡| ¡  }tt|ƒƒ}| 	¡ | 	¡ krÚtdƒ‚g }t|ƒD ]G}| ¡ | jkrítdƒ‚| ¡ }| ¡ }tj |d d… ¡}|j ¡ |  k�r||   k�r|dd … k�sJ ‚ J ‚| |¡ | ¡  qàt|ƒdk�r3tdƒ‚|d S )Nr   )Ú	TransportzInvalid keyÚnoneÚbcryptzPrivate key file is encryptedz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Úranger   Úappendr,   Úkdfr   r   r   Ú	decryptorÚupdateÚfinalizer   r   r   Ú
SigningKeyÚ
verify_keyÚencode)r   r   r!   r*   ÚmessageÚ
ciphernameÚkdfnameÚ
kdfoptionsÚnum_keysr>   Úbcrypt_saltÚbcrypt_roundsÚpublic_keysÚ_ÚpubkeyÚprivate_ciphertextÚprivate_dataÚcipherÚkeyr?   Úsigning_keysÚiÚpublicÚkey_datar$   r'   r'   r(   r   I   sŽ   ÿÿ

ù	ýüÿ
ÿ
þ
ý

z"Ed25519Key._parse_signing_key_datac                 C   s@   |   ¡ r	| jj}n| j}tƒ }| | j¡ | | ¡ ¡ | ¡ S ©N)	Úcan_signr   rC   r   r   Ú
add_stringr   rD   Úasbytes)r   ÚvÚmr'   r'   r(   rZ   ©   s   
zEd25519Key.asbytesc                 C   s$   |   ¡ r	| jj}n| j}|  ¡ |fS rW   )rX   r   rC   r   Úget_name)r   r[   r'   r'   r(   Ú_fields³   s   
zEd25519Key._fieldsc                 C   s   | j S rW   )r   ©r   r'   r'   r(   r]   ¼   s   zEd25519Key.get_namec                 C   s   dS )Né   r'   r_   r'   r'   r(   Úget_bits¿   s   zEd25519Key.get_bitsc                 C   s
   | j d uS rW   )r   r_   r'   r'   r(   rX   Â   s   
zEd25519Key.can_signc                 C   s*   t ƒ }| | j¡ | | j |¡j¡ |S rW   )r   rY   r   r   ÚsignÚ	signature)r   r   Ú	algorithmr\   r'   r'   r(   Úsign_ssh_dataÅ   s   zEd25519Key.sign_ssh_datac                 C   sD   |  ¡ | jkr	dS z| j || ¡ ¡ W dS  tjjy!   Y dS w )NFT)r9   r   r   Úverifyr   r   Ú
exceptionsÚBadSignatureError)r   r   r   r'   r'   r(   Úverify_ssh_sigË   s   ýÿzEd25519Key.verify_ssh_sig)NNNNNrW   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r)   r   rZ   Úpropertyr^   r]   ra   rX   re   ri   r'   r'   r'   r(   r      s    
ÿ`


r   )r,   Úcryptography.hazmat.backendsr   Ú&cryptography.hazmat.primitives.ciphersr   Únacl.signingr   Úparamiko.messager   Úparamiko.pkeyr   r   r   Úparamiko.utilr   Úparamiko.ssh_exceptionr	   r
   r   r'   r'   r'   r(   Ú<module>   s   