U vù¾fzã@sxdZddlmZmZddlmZddlmZmZddl m Z m Z ddl m Z ddlmZddlmZGd d „d eƒZd S) z RSA keys. é)ÚInvalidSignatureÚUnsupportedAlgorithm)Údefault_backend)ÚhashesÚ serialization)ÚrsaÚpadding)ÚMessage)ÚPKey)Ú SSHExceptionc@sàeZdZdZdZejejejejejejdœZ d)dd„Z e dd„ƒZ e d d „ƒZe d d „ƒZd d„Zdd„Ze dd„ƒZdd„Zdd„Zdd„Zd*dd„Zdd„Zd+dd„Zd,dd „Zed-d!d"„ƒ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)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.comNcCsšd|_d|_|dk r$| ||¡dS|dk r<| ||¡dS|dkrT|dk rTt|ƒ}|dk rd||_n2|j||jddtj|  ¡|  ¡d  t ƒ¡|_dS)Nr)ÚmsgZkey_typeZ cert_type©ÚeÚn) ÚkeyZ public_blobÚ_from_private_keyÚ_from_private_key_filer Z_check_type_and_load_certÚnamerÚRSAPublicNumbersZ get_mpintÚ public_keyr)ÚselfrÚdataÚfilenameÚpasswordrÚfile_obj©rú@/opt/alt/python38/lib/python3.8/site-packages/paramiko/rsakey.pyÚ__init__1s.   ûÿþzRSAKey.__init__cCst|j ¡ƒS©N)ÚlistÚHASHESÚkeys)ÚclsrrrÚ identifiersRszRSAKey.identifierscCs|jjSr!)rÚkey_size©rrrrÚsizeVsz RSAKey.sizecCs(t|jtjƒr|j ¡jS|j ¡SdSr!)Ú isinstancerrÚ RSAPrivateKeyZprivate_numbersÚpublic_numbersr(rrrr,Zs zRSAKey.public_numberscCs6tƒ}| |j¡| |jj¡| |jj¡| ¡Sr!)r Ú add_stringrZ add_mpintr,rrÚasbytes)rÚmrrrr.as  zRSAKey.asbytescCs| ¡jdddS)NÚutf8Úignore)Úerrors)r.Údecoder(rrrÚ__str__hszRSAKey.__str__cCs| ¡|jj|jjfSr!)Úget_namer,rrr(rrrÚ_fieldsmszRSAKey._fieldscCs|jSr!)rr(rrrr5qszRSAKey.get_namecCs|jSr!)r)r(rrrÚget_bitstszRSAKey.get_bitscCst|jtjƒSr!)r*rrr+r(rrrÚcan_signwszRSAKey.can_signcCsR|dkr|j}|jj|t ¡|j|ƒd}tƒ}| | dd¡¡| |¡|S)N)rÚ algorithmz-cert-v01@openssh.comÚ) rrÚsignrÚPKCS1v15r#r r-Úreplace)rrr9Úsigr/rrrÚ sign_ssh_datazs û zRSAKey.sign_ssh_datacCs¦| ¡}||jkrdS|j}t|tjƒr0| ¡}| ¡}|jt |ƒd}|dkrfd|dd|}z |  ||t   ¡|j|ƒ¡Wnt k rœYdSXdSdS)NFéróéT)Zget_textr#rr*rr+rZ get_binaryr'ÚlenÚverifyrr<r)rrrZ sig_algorithmrr;Ú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|ddSrG)Z_write_private_keyrrrHrI)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||¡}| |¡dSrO)Z_read_private_keyrP)rrrrrrrrÇszRSAKey._from_private_keyc Csæ|\}}||jkr`ztj|dtƒd}WqÌtttfk r\}ztt|ƒƒ‚W5d}~XYqÌXnl||j krÂ|  |d¡\}}}}}} t j ||d} t j || |||d|| d|| d tƒ¡}n | |¡t|t jƒsÜt‚||_dS)N)rrLZiiiiiiré)Ú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+ÚAssertionErrorr) rrZpkformatrrrrTrUrRrSr,rrrrPËs6 ÿ     ùø zRSAKey._decode_key)NNNNNN)N)N)N)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rrÚSHA1ÚSHA256ÚSHA512r#r Ú classmethodr&Úpropertyr)r,r.r4r6r5r7r8r?rFrJrKÚ staticmethodrNrrrPrrrrr !sLú ù !        r N)r]Zcryptography.exceptionsrrZcryptography.hazmat.backendsrZcryptography.hazmat.primitivesrrZ)cryptography.hazmat.primitives.asymmetricrrZparamiko.messager Z paramiko.pkeyr Zparamiko.ssh_exceptionr r rrrrÚs