
    7gN%                     l   d Z ddlZddlZddlZddlZddlZddlmZmZm	Z	m
Z
mZmZ ddlmZ d!dZd"dZd#d
Zd Zd Zd Zd Zd Zd Zd Zd Zd Z ej                    ada ej                    ad Z efdZ! G d d          Z" e"            Z#d Z$d Z% G d d          Z&d Z'd Z(d$dZ)d$d Z*dS )%z0
Useful functions used by the rest of paramiko.
    N)DEBUG	zero_byte	xffffffffmax_bytebyte_ordbyte_chr)	SSHConfigFc           	         d}d}|s.t          |           dk    rt          | d                   dk    rd}t          |           dz  r+t          }|rt          }|dt          |           dz  z
  z  | z   } t	          dt          |           d          D ].}|dz  t          j        d| ||dz                      d         z   }/|r|ddt          |           z  z  z  }|S )zTturns a normalized byte string into a long-int
    (adapted from Crypto.Util.number)r                >I   )lenr   r   r   rangestructunpack)salways_positiveoutnegativefilleris         G/var/www/html/syslog/venv/lib/python3.11/site-packages/paramiko/util.pyinflate_longr   )   s     CH A

!A$41G1G
1vvz * 	F a#a&&1*n%)1c!ffa   A AbyFM$!a!e)==a@@ !qQQZ  J    Tc                 $   t                      }t          |           } | dk    r7| dk    r1t          j        d| t          z            |z   }| dz  } | dk    r| dk    1t          |          D ]*}| dk    r|d         dk    r n,| dk    r|d         dk    r n+d}| dk    rt          }nt          }||d         d         }|rR| dk    r#t          |d                   d	k    r
t          |z   }| dk    r#t          |d                   d	k     r
t          |z   }|S )
zTturns a long-int into a normalized byte string
    (adapted from Crypto.Util.number)r   r   r   r      )r   Nr   )	bytesintr   packr   	enumerater   r   r   )nadd_sign_paddingr   r   s       r   deflate_longr'   >   s1    	AAA66RKa)m,,q0	b 66R q\\  FF1EGG!A$$,,E 66AAA	!A$&&	A FF!A$4//AAGG(1Q4..4//1AHr    c                 ^   d}g }t          |           |dz   k    rH|                    t          | ||dz                                 |dz  }t          |           |dz   k    H|t          |           k     r*|                    t          | |d                               fd|D             S )Nr      c                     g | ]}|z   S  r,   ).0lineprefixs     r   
<listcomp>z!format_binary.<locals>.<listcomp>e   s    ***dFTM***r   )r   appendformat_binary_line)datar/   xr   s    `  r   format_binaryr5   ]   s    	A
C
d))a"f



%d1q2v:&677888	R d))a"f

 	3t99}}

%d122h//000****c****r   c                     d                     d | D                       }d                     d | D                       }d                    ||          S )N c                 R    g | ]$}d                      t          |                    %S )z{:02X}formatr   r-   cs     r   r0   z&format_binary_line.<locals>.<listcomp>i   s*    @@@aX__Xa[[11@@@r   r(   c                     g | ]=}d                      t          |                    t          |          dz   dz           >S )z.{:c}..?   _   r9   r;   s     r   r0   z&format_binary_line.<locals>.<listcomp>k   sA    OOOQ		(1++	&	&b(8R'?	@OOOr   z	{:50s} {})joinr:   )r3   leftrights      r   r2   r2   h   s^    88@@4@@@AADGGOO$OOO E dE***r   c                     d}| D ]Y}t          |          }d|cxk    rdk    rn n|t          |          z  }4|t          d                    |                    z  }Z|S )Nr   r      z%{:02X})r   r   br:   )r   r   r<   r   s       r   safe_stringrF   p   ss    
C * *QKK>>>>c>>>>>8A;;CC1Y%%a(()))CCJr   c                     	 |                                  S # t          $ rY t          | d          }t          |d                   }|dk    rY dS t	          |          dz  }|dz  s|dz  }|dz  }|dz  |cY S w xY w)NFr   r   r   r   )
bit_lengthAttributeErrorr'   r   r   )r%   normhbytebitlens       r   rH   rH   {   s    ||~~ 	 	 	Au%%a!!A::11TQ4< 	aKEaKF 4< 	 	s    5A9(A98A9c                      d                     t          j        t          j                                                   d          S )Nr(   
)r@   	tracebackformat_exceptionsysexc_infosplitr,   r   r   
tb_stringsrT      s0    779-s|~~>??EEdKKKr   c                    t                      }t                      }t          |          dk    r
|dd         }|dk    r |             }t          |          dk    r|                    |           |                    t          |                     |                    |           |                                }t          |t          |                    }||d|         z  }||z  }|dk    |S )a)  
    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 bytes salt: Hash salt bytes.
    :param str key: human-entered password or passphrase.
    :param int nbytes: number of bytes to generate.
    :return: Key data, as `bytes`.
    r   Nr   )r!   r   updaterE   digestmin)hash_algsaltkeynbyteskeydatarW   hash_objsizes           r   generate_key_bytesr`      s     ggGWWF
4yy1}}BQBx
1**8::v;;??OOF####""63v;;''6%4%= $ 1** Nr   c                 $    ddl m}  ||           S )a  
    Read a file of known SSH host keys, in the format used by openssh, and
    return a compound dict of ``hostname -> keytype ->`` `PKey
    <paramiko.pkey.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
    r   )HostKeys)paramiko.hostkeysrb   )filenamerb   s     r   load_host_keysre      s&      +*****8Hr   c                 L    t                      }|                    |            |S )z
    Provided only as a backward-compatible wrapper around `.SSHConfig`.

    .. deprecated:: 2.7
        Use `SSHConfig.from_file` instead.
    )r	   parse)file_objconfigs     r   parse_ssh_configrj      s$     [[F
LLMr   c                 ,    |                     |           S )zM
    Provided only as a backward-compatible wrapper around `.SSHConfig`.
    )lookup)hostnameri   s     r   lookup_ssh_host_configrn      s     =="""r   c                     dd|}}}dd| }}}|dk    r)||z  }||||z  z
  }}||||z  z
  }}||||z  z
  }}|dk    )|dk     r||z  }|S )Nr   r   r,   )	r4   mu1u2u3v1v2v3qs	            r   mod_inverserx      s    AqBBAqBB
q&&"HR"q&[BR"q&[BR"q&[B	 q&&
 
Avv
aIr   c                      	 t           j        S # t          $ rI t          5  t          dz  at          t           _        d d d            n# 1 swxY w Y   t           j        cY S w xY w)Nr   )_g_thread_dataidrI   _g_thread_lock_g_thread_counterr,   r   r   get_thread_idr~      s    !   ! ! ! 	2 	2" 1N	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2     	!s1    A!AA!A	A!A	A! A!c                 \   t          j        d          }t          |j                  dk    rdS |                    |           t          | d          }t          j        |          }d}|dz  }|                    t          j        |d                     |	                    |           dS )zKsend paramiko logs to a logfile,
    if they're not already going somewhereparamikor   Naz>%(levelname)-.3s [%(asctime)s.%(msecs)03d] thr=%(_threadid)-3dz %(name)s: %(message)sz%Y%m%d-%H:%M:%S)
logging	getLoggerr   handlerssetLevelopenStreamHandlersetFormatter	Formatter
addHandler)rd   levelloggerfhandlerfrms         r   log_to_filer      s     z**F
6?a
OOEXsA#A&&G
JC##C*30ABBCCC
gr   c                       e Zd Zd ZdS )PFilterc                 ,    t                      |_        dS )NT)r~   	_threadid)selfrecords     r   filterzPFilter.filter  s    (??tr   N)__name__
__module____qualname__r   r,   r   r   r   r     s#            r   r   c                 b    t          j        |           }|                    t                     |S N)r   r   	addFilter_pfilter)namer   s     r   
get_loggerr     s+    t$$F
XMr   c                     t          |           t          |          k    rdS d}t          t          |                     D ]0}|t          | |                   t          ||                   z  z  }1|dk    S )NFr   )r   r   r   )r   rE   resr   s       r   constant_time_bytes_eqr     sl    
1vvQu
C3q66]] / /x!~~1..!8Or   c                       e Zd Zd Zd ZdS )ClosingContextManagerc                     | S r   r,   )r   s    r   	__enter__zClosingContextManager.__enter__  s    r   c                 .    |                                   d S r   )close)r   typevaluerO   s       r   __exit__zClosingContextManager.__exit__!  s    

r   N)r   r   r   r   r   r,   r   r   r   r     s2              r   r   c                 >    t          | t          ||                    S r   )maxrX   )minimumvalmaximums      r   clamp_valuer   %  s    wC))***r   c                     	 t          |           S # t          $ r, 	 |                                 cY S # t          $ r | cY cY S w xY ww xY w)z:
    Coerce to bytes if possible or return unchanged.
    )rE   	TypeErrorasbytesrI   )r   s    r   r   r   )  st     tt 	 	 		 99;; 	 	 	 HHHHH			s(    
A2AAAAAutf8c                     t          | t                    r| S t          | t                    r|                     |          S t	          dt          |                      )zcast unicode or bytes to bytesExpected unicode or bytes, got )
isinstancer!   strencoder   r   r   encodings     r   rE   rE   ?  s\    !U E	As		 Exx!!!C$q''CCDDDr   c                     t          | t                    r|                     |          S t          | t                    r| S t	          dt          |                      )z cast bytes or unicode to unicoder   )r   r!   decoder   r   r   r   s     r   ur   J  s\    !U Exx!!!	As		 EC$q''CCDDDr   )F)T)r(   )r   )+__doc__rQ   r   rO   	threadingr   paramiko.commonr   r   r   r   r   r   paramiko.configr	   r   r'   r5   r2   rF   rH   rT   r`   re   rj   rn   rx   localrz   r}   Lockr|   r~   r   r   r   r   r   r   r   r   rE   r   r,   r   r   <module>r      s  & 
 


                          & % % % % %   *   >+ + + ++ + +    L L L  >  *	 	 	# # #   !"" !!! ! ! !&             799           + + +  ,E E E EE E E E E Er   