ó Ú_e[c@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 SSHConfigcCstdƒ}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(sTturns a normalized byte string into a long-int (adapted from Crypto.Util.number)ii€iii s>Ii(RtlenRRRtrangetstructtunpack(tstalways_positivetouttnegativetfillerti((s1/tmp/pip-install-KP2Jbq/paramiko/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(sTturns 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/tmp/pip-install-KP2Jbq/paramiko/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(tdatatprefixtxRtline((s1/tmp/pip-install-KP2Jbq/paramiko/paramiko/util.pyt format_binary]scCs„djg|D]}djt|ƒƒ^q ƒ}djg|D]-}djt|ƒƒt|ƒdd^q>ƒ}dj||ƒS(Nt s{:02X}Rs.{:c}..i?i_s {:50s} {}(tjointformatR(R!tctlefttright((s1/tmp/pip-install-KP2Jbq/paramiko/paramiko/util.pyR hs 1:cCsod}xb|D]Z}t|ƒ}d|ko6dknrN|t|ƒ7}q |tdj|ƒƒ7}q W|S(NRi is%{:02X}(RRR R((RRR)R((s1/tmp/pip-install-KP2Jbq/paramiko/paramiko/util.pyt safe_stringqs  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/tmp/pip-install-KP2Jbq/paramiko/paramiko/util.pyR-|s    cCs%djtjtjƒŒƒjdƒS(NRs (R't tracebacktformat_exceptiontsystexc_infotsplit(((s1/tmp/pip-install-KP2Jbq/paramiko/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_algtsalttkeytnbytestkeydataR:thash_objtsize((s1/tmp/pip-install-KP2Jbq/paramiko/paramiko/util.pytgenerate_key_bytess      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.hostkeysRD(tfilenameRD((s1/tmp/pip-install-KP2Jbq/paramiko/paramiko/util.pytload_host_keys®scCstƒ}|j|ƒ|S(sM Provided only as a backward-compatible wrapper around `.SSHConfig`. (R tparse(tfile_objtconfig((s1/tmp/pip-install-KP2Jbq/paramiko/paramiko/util.pytparse_ssh_configÂs  cCs |j|ƒS(sM Provided only as a backward-compatible wrapper around `.SSHConfig`. (tlookup(thostnameRJ((s1/tmp/pip-install-KP2Jbq/paramiko/paramiko/util.pytlookup_ssh_host_configËsc Cs¡dd|}}}dd|}}}xY|dkrƒ||}||||}}||||}}||||}}q+W|dkr||7}n|S(Nii(( R#tmtu1tu2tu3tv1tv2tv3tq((s1/tmp/pip-install-KP2Jbq/paramiko/paramiko/util.pyt mod_inverseÒs   cCskttjƒƒ}y t|SWnFtk rftjƒztd7at}t|sH      "(