U q`@sdZddlmZddlmZddlmZmZddlm Z ddl m Z m Z ddl mZddlmZdd lmZdd lmZdd lmZmZdd lmZGd ddeZdS)z DSS keys. )InvalidSignature)default_backend)hashes serialization)dsa)decode_dss_signatureencode_dss_signature)util) zero_byte) SSHException)Message)BER BERException)PKeyc@seZdZdZd"ddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ d#ddZ d$ddZed%ddZddZddZd d!ZdS)&DSSKeyzX Representation of a DSS key which can be used to sign an verify SSH2 data. NcCsd|_d|_d|_d|_d|_d|_|dk r<|||dS|dk rT|||dS|dkrl|dk rlt|}|dk r|\|_|_|_|_n8|j |ddd| |_| |_| |_| |_t |j|_ dS)Nssh-dsszssh-dss-cert-v01@openssh.com)msgZkey_typeZ cert_type)pqgyxZ public_blob_from_private_key_from_private_key_filer Z_check_type_and_load_certZ get_mpintr bit_lengthsize)selfrdatafilenamepasswordvalsfile_objr"6/tmp/pip-target-nv4zd3e_/lib/python/paramiko/dsskey.py__init__.s4       zDSSKey.__init__cCsHt}|d||j||j||j||j|SNr)r add_stringZ add_mpintrrrrasbytes)rmr"r"r#r'Ss     zDSSKey.asbytescCs|SN)r'rr"r"r#__str__\szDSSKey.__str__cCst||j|j|j|jfSr))hashget_namerrrrr*r"r"r#__hash___szDSSKey.__hash__cCsdSr%r"r*r"r"r#r-bszDSSKey.get_namecCs|jSr))rr*r"r"r#get_bitseszDSSKey.get_bitscCs |jdk Sr))rr*r"r"r#can_signhszDSSKey.can_signc Cstj|jtj|jtj|j|j|jdddj t d}| |t }t|\}}t}|dt|d}t|d}t|dkrtdt||}t|dkrtdt||}||||S)Nrrrrparameter_numbersrpublic_numbersbackendrr)rDSAPrivateNumbersrDSAPublicNumbersrDSAParameterNumbersrrr private_keyrsignrSHA1rr r&r Z deflate_longlenr ) rrkeysigrsr(ZrstrZsstrr"r"r# sign_ssh_dataks2       zDSSKey.sign_ssh_datac Cst|dkr|}n|}|dkr.dS|}t|ddd}t|ddd}t||}tj|j tj |j |j |j ddjtd}z|||tWntk rYd SXd SdS) N(rrr8r1r2r6FT)r?r'Zget_textZ get_binaryr Z inflate_longrrr:rr;rrrZ public_keyrverifyrr>r) rrrrAkindZsigRZsigS signaturer@r"r"r#verify_ssh_sigs0  zDSSKey.verify_ssh_sigc CsRtj|jtj|jtj|j|j|jdddj t d}|j ||t j j|ddSNr1r2r4r6)r)rr9rr:rr;rrrr<rZ_write_private_key_filer PrivateFormatTraditionalOpenSSL)rrrr@r"r"r#write_private_key_files& zDSSKey.write_private_key_filec CsRtj|jtj|jtj|j|j|jdddj t d}|j ||t j j|ddSrK)rr9rr:rr;rrrr<rZ_write_private_keyrrLrM)rr!rr@r"r"r#write_private_keys& zDSSKey.write_private_keycCsHtj|td}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 r6)r ) rZgenerate_private_keyrZprivate_numbersrr5r3rrrrr)bitsZ progress_funcZnumbersr@r"r"r#generates  zDSSKey.generatecCs|d||}||dSNZDSA)Z_read_private_key_file _decode_key)rrrrr"r"r#rszDSSKey._from_private_key_filecCs|d||}||dSrS)Z_read_private_keyrT)rr!rrr"r"r#rszDSSKey._from_private_keyc Cs|\}}||jkrVzt|}Wqtk rR}ztd|W5d}~XYqXn0||jkr|||d}dgt|}n | |t |tk st |dks|ddkrtd|d|_ |d|_ |d|_|d |_|d |_t|j |_dS) NzUnable to parse key file: {}Ziiiiirz3not a valid DSA private key file (bad ber encoding)rF)Z_PRIVATE_KEY_FORMAT_ORIGINALr decoderr formatZ_PRIVATE_KEY_FORMAT_OPENSSHZ_uint32_cstruct_unpacklistZ_got_bad_key_format_idtyper?rrrrrr rr)rrZpkformatZkeylister"r"r#rTs( "   $     zDSSKey._decode_key)NNNNNN)N)N)rPN)__name__ __module__ __qualname____doc__r$r'r+r.r-r/r0rDrJrNrO staticmethodrRrrrTr"r"r"r#r(s. %    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