ó =OXc@sÛdZddlmZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z ddlmZmZmZmZmZddlmZed„ZerÐe ndZerâe nd Zed „Zd d „Zd „Zd„Zd„Zd„Z d„Z!d„Z"d„Z#d„Z$d„Z%ia&da'ej(ƒa)d„Z*e d„Z+de,fd„ƒYZ-e-ƒZ.d„Z/d„Z0d„Z1de,fd„ƒYZ2d„Z3dS( s0 Useful functions used by the rest of paramiko. iÿÿÿÿ(t generatorsN(tDEBUGt zero_bytet xfffffffftmax_byte(tPY2tlongtbyte_chrtbyte_ordtb(t SSHConfigc Cstdƒ}d}| rJt|ƒdkrJt|dƒdkrJd}nt|ƒdrŽt}|rot}n|dt|ƒd|}nxItdt|ƒdƒD]/}|d>tjd|||d!ƒd}q§W|r|tdƒdt|ƒ>8}n|S(sPturns a normalized byte string into a long-int (adapted from Crypto.Util.number)ii€iii s>Ii(RtlenRRRtrangetstructtunpack(tstalways_positivetouttnegativetfillerti((s1/usr/lib/python2.7/site-packages/paramiko/util.pyt inflate_long%s /  -!iiÿcCsItƒ}t|ƒ}x@|dkrW|dkrWtjd|t@ƒ|}|dL}qWxut|ƒD]F}|dkr‹|dtkr‹Pn|dkre|dtkrePqeqeWd}|dkrÊt}nt }||d}|rE|dkrt |dƒdkrt|}n|dkrEt |dƒdkrEt |}qEn|S(sPturns a long-int into a normalized byte string (adapted from Crypto.Util.number)iiÿÿÿÿs>Ii ii€(i( tbytesRR tpackRt enumeratet deflate_zerot deflate_ffRRR(tntadd_sign_paddingRR((s1/usr/lib/python2.7/site-packages/paramiko/util.pyt deflate_long<s*    " "tcCs˜d}g}xBt|ƒ|dkrP|jt|||d!ƒƒ|d7}qW|t|ƒkr}|jt||ƒƒng|D]}||^q„S(Nii(R tappendtformat_binary_line(tdatatprefixtxR((s1/usr/lib/python2.7/site-packages/paramiko/util.pyt format_binaryZscCsrdjg|D]}dt|ƒ^q ƒ}djg|D]"}d|t|ƒdd^q9ƒ}d||fS(Nt s%02XRs.%c..i?i_s%-50s %s(tjoinR(R!tctlefttright((s1/usr/lib/python2.7/site-packages/paramiko/util.pyR es,8cCsptdƒ}x]|D]U}t|ƒ}d|ko<dknrT|t|ƒ7}q|td|ƒ7}qW|S(NRi is%%%02X(R RR(RRR'R((s1/usr/lib/python2.7/site-packages/paramiko/util.pyt safe_stringks   cCs‹y|jƒSWnvtk r†t|tƒ}t|dƒ}|dkrMdSt|ƒd}x"|d@s|dK}|d8}q`W|SXdS(Niiii€(t bit_lengthtAttributeErrorRtFalseRR (Rtnormthbytetbitlen((s1/usr/lib/python2.7/site-packages/paramiko/util.pyR+vs    cCs%djtjtjƒŒƒjdƒS(NRs (R&t tracebacktformat_exceptiontsystexc_infotsplit(((s1/usr/lib/python2.7/site-packages/paramiko/util.pyt tb_strings…scCsÌtƒ}tƒ}t|ƒdkr1|d }nx”|dkrÇ|ƒ}t|ƒdkrk|j|ƒn|jt|ƒƒ|j|ƒ|jƒ}t|t|ƒƒ}||| 7}||8}q4W|S(s Given a password, passphrase, or other human-source key, scramble it through a secure hash into some keyworthy bytes. This specific algorithm is used for encrypting/decrypting private key files. :param function hash_alg: A function which creates a new hash object, such as ``hashlib.sha256``. :param salt: data to salt the hash with. :type salt: byte string :param str key: human-entered password or passphrase. :param int nbytes: number of bytes to generate. :return: Key data `str` ii(RR tupdateR tdigesttmin(thash_algtsalttkeytnbytestkeydataR8thash_objtsize((s1/usr/lib/python2.7/site-packages/paramiko/util.pytgenerate_key_bytes‰s      cCsddlm}||ƒS(sŽ Read a file of known SSH host keys, in the format used by openssh, and return a compound dict of ``hostname -> keytype ->`` `PKey `. The hostname may be an IP address or DNS name. The keytype will be either ``"ssh-rsa"`` or ``"ssh-dss"``. This type of file unfortunately doesn't exist on Windows, but on posix, it will usually be stored in ``os.path.expanduser("~/.ssh/known_hosts")``. Since 1.5.3, this is just a wrapper around `.HostKeys`. :param str filename: name of the file to read host keys from :return: nested dict of `.PKey` objects, indexed by hostname and then keytype iÿÿÿÿ(tHostKeys(tparamiko.hostkeysRB(tfilenameRB((s1/usr/lib/python2.7/site-packages/paramiko/util.pytload_host_keys¨scCstƒ}|j|ƒ|S(sM Provided only as a backward-compatible wrapper around `.SSHConfig`. (R tparse(tfile_objtconfig((s1/usr/lib/python2.7/site-packages/paramiko/util.pytparse_ssh_config¼s  cCs |j|ƒS(sM Provided only as a backward-compatible wrapper around `.SSHConfig`. (tlookup(thostnameRH((s1/usr/lib/python2.7/site-packages/paramiko/util.pytlookup_ssh_host_configÅsc Cs¡dd|}}}dd|}}}xY|dkrƒ||}||||}}||||}}||||}}q+W|dkr||7}n|S(Nii(( R#tmtu1tu2tu3tv1tv2tv3tq((s1/usr/lib/python2.7/site-packages/paramiko/util.pyt mod_inverseÌs   cCskttjƒƒ}y t|SWnFtk rftjƒztd7at}t|sH      "(