a b @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"ddZddZddZed d Zd d Z d dZ ddZ d#ddZ ddZ d$ddZd%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|_|dur<|||dS|durT|||dS|durl|durlt|}|dur|\|_|_|_|_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-98j97qn4/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__cCs||j|j|j|jfSr))get_namerrrrr*r"r"r#_fields_szDSSKey._fieldscCsdSr%r"r*r"r"r#r,cszDSSKey.get_namecCs|jSr))rr*r"r"r#get_bitsfszDSSKey.get_bitscCs |jduSr))rr*r"r"r#can_signiszDSSKey.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 ) rr algorithmkeysigrsr(ZrstrZsstrr"r"r# sign_ssh_datals.        zDSSKey.sign_ssh_datac Cst|dkr|}n|}|dkr.dS|}t|ddd}t|ddd}t||}tj|j tj |j |j |j ddjtd}z|||tWntyYd S0d SdS) N(rrr7r0r1r5FT)r>r'Zget_textZ get_binaryr Z inflate_longrrr9rr:rrrZ public_keyrverifyrr=r) rrrrAkindZsigRZsigS signaturer@r"r"r#verify_ssh_sigs,    zDSSKey.verify_ssh_sigc CsRtj|jtj|jtj|j|j|jdddj t d}|j ||t j j|ddSNr0r1r3r5)r)rr8rr9rr: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)rr8rr9rr: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 r5)r ) rZgenerate_private_keyrZprivate_numbersrr4r2rrrrr)bitsZ progress_funcnumbersr@r"r"r#generates  zDSSKey.generatecCs|d||}||dSNZDSA)Z_read_private_key_file _decode_key)rrrrr"r"r#rszDSSKey._from_private_key_filecCs|d||}||dSrT)Z_read_private_keyrU)rr!rrr"r"r#rszDSSKey._from_private_keyc Cs|\}}||jkrXzt|}WqtyT}ztd|WYd}~qd}~00n0||jkr~||d}dgt|}n | |t |tust |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#rUs( &   $     zDSSKey._decode_key)NNNNNN)N)N)N)rPN)__name__ __module__ __qualname____doc__r$r'r+propertyr-r,r.r/rDrJrNrO staticmethodrSrrrUr"r"r"r#r(s0 %      rN)rcZcryptography.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