a °…bœã@s„dZddlmZmZddlmZddlmZmZddl m Z m Z ddl m Z ddlmZddlmZdd lmZGd d „d eƒZd S) z RSA keys. é)ÚInvalidSignatureÚUnsupportedAlgorithm)Údefault_backend)ÚhashesÚ serialization)ÚrsaÚpadding)ÚMessage)ÚPKey)ÚPY2)Ú SSHExceptionc@sÐeZdZdZejejejejejejdœZd'dd„Z e dd„ƒZ e dd „ƒZ d d „Z d d „Ze dd„ƒZdd„Zdd„Zdd„Zd(dd„Zdd„Zd)dd„Zd*dd„Zed+dd „ƒZd!d"„Zd#d$„Zd%d&„ZdS),ÚRSAKeyzZ Representation of an RSA key which can be used to sign and verify SSH2 data. )ússh-rsaú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.comNcCs˜d|_d|_|dur$| ||¡dS|dur<| ||¡dS|durT|durTt|ƒ}|durd||_n0|j|dddtj| ¡| ¡d  t ƒ¡|_dS)Nrr)ÚmsgZkey_typeZ cert_type©ÚeÚn) ÚkeyZ public_blobÚ_from_private_keyÚ_from_private_key_filer Z_check_type_and_load_certrÚRSAPublicNumbersZ get_mpintÚ public_keyr)ÚselfrÚdataÚfilenameÚpasswordrÚfile_obj©rú6/tmp/pip-target-98j97qn4/lib/python/paramiko/rsakey.pyÚ__init__1s,   û ÿþzRSAKey.__init__cCs|jjS©N)rÚkey_size©rrrrÚsizeRsz RSAKey.sizecCs(t|jtjƒr|j ¡jS|j ¡SdSr!)Ú isinstancerrÚ RSAPrivateKeyZprivate_numbersÚpublic_numbersr#rrrr'Vs zRSAKey.public_numberscCs4tƒ}| d¡| |jj¡| |jj¡| ¡S©Nr)r Ú add_stringZ add_mpintr'rrÚasbytes)rÚmrrrr*]s  zRSAKey.asbytescCs"tr | ¡S| ¡jdddSdS)NÚutf8Úignore)Úerrors)r r*Údecoder#rrrÚ__str__dszRSAKey.__str__cCs| ¡|jj|jjfSr!)Úget_namer'rrr#rrrÚ_fieldspszRSAKey._fieldscCsdSr(rr#rrrr1tszRSAKey.get_namecCs|jSr!)r$r#rrrÚget_bitswszRSAKey.get_bitscCst|jtjƒSr!)r%rrr&r#rrrÚcan_signzszRSAKey.can_signrcCsD|jj|t ¡|j|ƒd}tƒ}| | dd¡¡| |¡|S)N)rÚ algorithmz-cert-v01@openssh.comÚ)rÚsignrÚPKCS1v15ÚHASHESr r)Úreplace)rrr5Úsigr+rrrÚ sign_ssh_data}s ý zRSAKey.sign_ssh_datacCs¤| ¡}||jvrdS|j}t|tjƒr0| ¡}| ¡}|jt |ƒd}|dkrfd|dd|}z |  ||t   ¡|j|ƒ¡Wnt yšYdS0dSdS)NFéróéT)Zget_textr9rr%rr&rZ get_binaryr"ÚlenÚverifyrr8r)rrrZ sig_algorithmrr7ÚdiffrrrÚverify_ssh_sigˆs"  ÿ zRSAKey.verify_ssh_sigcCs|j||jtjj|ddS©N)r)Z_write_private_key_filerrÚ PrivateFormatÚTraditionalOpenSSL)rrrrrrÚwrite_private_key_file s üzRSAKey.write_private_key_filecCs|j||jtjj|ddSrD)Z_write_private_keyrrrErF)rrrrrrÚwrite_private_key¨s üzRSAKey.write_private_keycCstjd|tƒd}t|dS)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)Zpublic_exponentr"Úbackend)r)rZgenerate_private_keyrr )ÚbitsZ progress_funcrrrrÚgenerate°s ÿzRSAKey.generatecCs| d||¡}| |¡dS©NZRSA)Z_read_private_key_fileÚ _decode_key)rrrrrrrrÁszRSAKey._from_private_key_filecCs| d||¡}| |¡dSrL)Z_read_private_keyrM)rrrrrrrrÅszRSAKey._from_private_keyc Csè|\}}||jkrbztj|dtƒd}WqÎtttfy^}ztt|ƒƒ‚WYd}~qÎd}~00nl||j krÄ|  |d¡\}}}}}} t j ||d} t j || |||d|| d|| d tƒ¡}n | |¡t|t jƒsÞJ‚||_dS)N)rrIZiiiiiiré)ÚpÚqÚdZdmp1Zdmq1Úiqmpr')Z_PRIVATE_KEY_FORMAT_ORIGINALrZload_der_private_keyrÚ ValueErrorÚ TypeErrorrr ÚstrZ_PRIVATE_KEY_FORMAT_OPENSSHZ_uint32_cstruct_unpackrrZRSAPrivateNumbersZ private_keyZ_got_bad_key_format_idr%r&r) rrZpkformatrrrrQrRrOrPr'rrrrMÉs2 ÿ $   ùø zRSAKey._decode_key)NNNNNN)r)N)N)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rÚSHA1ÚSHA256ÚSHA512r9r Úpropertyr$r'r*r0r2r1r3r4r<rCrGrHÚ staticmethodrKrrrMrrrrr "sFú ù !        r N)rYZcryptography.exceptionsrrZcryptography.hazmat.backendsrZcryptography.hazmat.primitivesrrZ)cryptography.hazmat.primitives.asymmetricrrZparamiko.messager Z paramiko.pkeyr Zparamiko.py3compatr Zparamiko.ssh_exceptionr r rrrrÚs