U vù¾f8 ã@s¨dZddlmZddlmZddlmZmZddlm Z ddl m Z m Z ddl mZddlmZdd lmZdd lmZdd lmZmZdd lmZGd d„deƒZdS)z DSS keys. é)ÚInvalidSignature)Údefault_backend)ÚhashesÚ serialization)Údsa)Údecode_dss_signatureÚencode_dss_signature)Úutil)Ú zero_byte)Ú SSHException)ÚMessage)ÚBERÚ BERException)ÚPKeyc@sžeZdZdZdZd#dd„Zdd„Zdd „Zed d „ƒZ d d „Z dd„Z dd„Z d$dd„Z dd„Zd%dd„Zd&dd„Zed'dd„ƒZdd„Zdd „Zd!d"„ZdS)(ÚDSSKeyzX Representation of a DSS key which can be used to sign an verify SSH2 data. zssh-dssNcCsÞd|_d|_d|_d|_d|_d|_|dk r<| ||¡dS|dk rT| ||¡dS|dkrl|dk rlt|ƒ}|dk rŠ|\|_|_|_|_nB|j ||j |j ›dd|  ¡|_|  ¡|_|  ¡|_|  ¡|_t   |j¡|_dS)Nz-cert-v01@openssh.com)ÚmsgZkey_typeZ cert_type)ÚpÚqÚgÚyÚxZ public_blobÚ_from_private_keyÚ_from_private_key_filer Z_check_type_and_load_certÚnameZ get_mpintr Ú bit_lengthÚsize)ÚselfrÚdataÚfilenameÚpasswordÚvalsÚfile_obj©r"ú@/opt/alt/python38/lib/python3.8/site-packages/paramiko/dsskey.pyÚ__init__0s4    ý    zDSSKey.__init__cCsJtƒ}| |j¡| |j¡| |j¡| |j¡| |j¡| ¡S©N) r Ú add_stringrZ add_mpintrrrrÚasbytes)rÚmr"r"r#r'Us     zDSSKey.asbytescCs| ¡Sr%)r'©rr"r"r#Ú__str__^szDSSKey.__str__cCs| ¡|j|j|j|jfSr%)Úget_namerrrrr)r"r"r#Ú_fieldsaszDSSKey._fieldscCs|jSr%)rr)r"r"r#r+fszDSSKey.get_namecCs|jSr%)rr)r"r"r#Úget_bitsiszDSSKey.get_bitscCs |jdk Sr%)rr)r"r"r#Úcan_signlszDSSKey.can_signc CsÐtj|jtj|jtj|j|j|jdddj t ƒd}|  |t   ¡¡}t|ƒ\}}tƒ}| |j¡t |d¡}t |d¡} t|ƒdkržtdt|ƒ|}t| ƒdkr¾tdt| ƒ| } | || ¡|S)N©rrr©rÚparameter_numbers©rÚpublic_numbers©Úbackendré)rÚDSAPrivateNumbersrÚDSAPublicNumbersrÚDSAParameterNumbersrrrÚ private_keyrÚsignrÚSHA1rr r&rr Z deflate_longÚlenr ) rrÚ algorithmÚkeyÚsigÚrÚsr(ZrstrZsstrr"r"r#Ú sign_ssh_dataos2ÿþþø       zDSSKey.sign_ssh_datac CsÌt| ¡ƒdkr| ¡}n| ¡}||jkr0dS| ¡}t |dd…d¡}t |dd…d¡}t||ƒ}tj |j tj |j |j |jddjtƒd}z| ||t ¡¡Wntk rÂYdSXd SdS) Né(rr6ér/r0r4FT)r=r'Zget_textrZ get_binaryr Z inflate_longrrr8rr9rrrZ public_keyrÚverifyrr<r) rrrr@ÚkindZsigRZsigSÚ signaturer?r"r"r#Úverify_ssh_sigˆs0   ÿþûzDSSKey.verify_ssh_sigc CsRtj|jtj|jtj|j|j|jdddj t ƒd}|j ||t j j|ddS©Nr/r0r2r4)r)rr7rr8rr9rrrr:rZ_write_private_key_filerÚ PrivateFormatÚTraditionalOpenSSL)rrrr?r"r"r#Úwrite_private_key_file¥s&ÿþþø üzDSSKey.write_private_key_filec CsRtj|jtj|jtj|j|j|jdddj t ƒd}|j ||t j j|ddSrJ)rr7rr8rr9rrrr:rZ_write_private_keyrrKrL)rr!rr?r"r"r#Úwrite_private_key·s&ÿþþø üzDSSKey.write_private_keyécCsHtj|tƒd ¡}t|jjj|jjj|jjj |jj fd}|j |_ |S)a$ Generate a new private DSS 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 `.DSSKey` private key r4)r ) rZgenerate_private_keyrZprivate_numbersrr3r1rrrrr)ÚbitsZ progress_funcÚnumbersr?r"r"r#ÚgenerateÉs ÿ üÿzDSSKey.generatecCs| d||¡}| |¡dS©NZDSA)Z_read_private_key_fileÚ _decode_key)rrrrr"r"r#rãszDSSKey._from_private_key_filecCs| d||¡}| |¡dSrS)Z_read_private_keyrT)rr!rrr"r"r#rçszDSSKey._from_private_keyc Csö|\}}||jkrVzt|ƒ ¡}Wq†tk rR}ztd |¡ƒ‚W5d}~XYq†Xn0||jkr|| |d¡}dgt|ƒ}n |  |¡t |ƒtk sªt |ƒdksª|ddkr²tdƒ‚|d|_ |d|_ |d|_|d |_|d |_t |j ¡|_dS) NzUnable to parse key file: {}Ziiiiiréz3not a valid DSA private key file (bad ber encoding)rEéééé)Z_PRIVATE_KEY_FORMAT_ORIGINALr Údecoderr ÚformatZ_PRIVATE_KEY_FORMAT_OPENSSHZ_uint32_cstruct_unpackÚlistZ_got_bad_key_format_idÚtyper=rrrrrr rr)rrZpkformatZkeylistÚer"r"r#rTës( "   $ÿ     zDSSKey._decode_key)NNNNNN)N)N)N)rON)Ú__name__Ú __module__Ú __qualname__Ú__doc__rr$r'r*Úpropertyr,r+r-r.rCrIrMrNÚ staticmethodrRrrrTr"r"r"r#r(s2ù %      rN)rbZcryptography.exceptionsrZcryptography.hazmat.backendsrZcryptography.hazmat.primitivesrrZ)cryptography.hazmat.primitives.asymmetricrZ/cryptography.hazmat.primitives.asymmetric.utilsrrZparamikor Zparamiko.commonr Zparamiko.ssh_exceptionr Zparamiko.messager Z paramiko.berr rZ paramiko.pkeyrrr"r"r"r#Ús