3 L]X@sddlZddlmZddlmZddlZddlZddlm Z ddl m Z ddl m Z ddlmZmZdZd d ZGd d d e ZdS) N)default_backend)Cipher)Message)PKey)b) SSHExceptionPasswordRequiredExceptionsopenssh-key-v1cCsxtj|d}d|kodknr(|S|dkr8tdx0t|D]$}tj||||dkrBtdqBW|d| S)N z Invalid key)six indexbytesrrange)dataZpadding_lengthir9/tmp/pip-install-wfra5znf/paramiko/paramiko/ed25519key.pyunpad#s  rc@sZeZdZdZdddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ dS) Ed25519Keya Representation of an `Ed25519 `_ 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 Csd|_d}}|dkr&|dk r&t|}|dk rP|j|dddtjj|j}n@|dk r|t|d}|jd|}WdQRXn|dk r|jd|}|s|r|j ||}|dkr|dkrt d||_ ||_ dS)Nz ssh-ed25519z ssh-ed25519-cert-v01@openssh.com)msgZkey_typeZ cert_typerZOPENSSHz need a key) Z public_blobrZ_check_type_and_load_certnaclsigningZ VerifyKey get_binaryopenZ_read_private_key_parse_signing_key_data ValueError _signing_key_verifying_key) selfrrfilenamepasswordZfile_objZ verifying_key signing_keyfrrr__init__>s*   zEd25519Key.__init__cCszddlm}t|}|jtttkr.td|j}|j}|j}|j }|dkrl|sb|dkrtdn6|dkr|st dt|} | j} | j } ntd|dkr||j krtdg} x>t |D]2} t|j}|jdkrtd| j |jqW|j}|dkr|}n||j |}tjt|| |d|d | d d }t|d |d|d|d ||ddtdj}|j||j}tt|}|j |j krtdg}xt |D]}|jdkrtd|j}|j}tjj|dd}|jj|ko8| |ko8|ddknsDt|j ||jqWt|dkrrtd|dS)Nr) Transportz Invalid keynonebcryptzPrivate key file is encryptedz ssh-ed25519zkey-sizez block-sizeT)r#ZsaltZdesired_key_bytesroundsZignore_few_roundsclassmode)backendr r )Zparamiko.transportr'r get_byteslenOPENSSH_AUTH_MAGICrget_textrZget_intrZ _cipher_inforappendr)kdfrrr decryptorupdatefinalizerrrZ SigningKey verify_keyencodeAssertionError)r!rr#r'messageZ ciphernameZkdfnameZ kdfoptionsZnum_keysr3Z bcrypt_saltZ bcrypt_roundsZ public_keys_ZpubkeyZprivate_ciphertextZ private_datacipherkeyr4Z signing_keysrpublicZkey_datar$rrrr[sz           z"Ed25519Key._parse_signing_key_datacCs>|jr|jj}n|j}t}|jd|j|j|jS)Nz ssh-ed25519)can_signrr7r r add_stringr8asbytes)r!vmrrrrAs  zEd25519Key.asbytescCs(|jr|jj}n|j}t|j|fS)N)r?rr7r hashget_name)r!rBrrr__hash__s zEd25519Key.__hash__cCsdS)Nz ssh-ed25519r)r!rrrrEszEd25519Key.get_namecCsdS)Nr)r!rrrget_bitsszEd25519Key.get_bitscCs |jdk S)N)r)r!rrrr?szEd25519Key.can_signcCs(t}|jd|j|jj|j|S)Nz ssh-ed25519)rr@rsign signature)r!rrCrrr sign_ssh_datas zEd25519Key.sign_ssh_datac CsH|jdkrdSy|jj||jWntjjk r>dSXdSdS)Nz ssh-ed25519FT)r1r verifyrr exceptionsZBadSignatureError)r!rrrrrverify_ssh_sigs zEd25519Key.verify_ssh_sig)NNNNN) __name__ __module__ __qualname____doc__r&rrArFrErHr?rKrNrrrrr2s  ` r)r)Zcryptography.hazmat.backendsrZ&cryptography.hazmat.primitives.ciphersrZ nacl.signingrrZparamiko.messagerZ paramiko.pkeyrZparamiko.py3compatrZparamiko.ssh_exceptionrrr0rrrrrrs