
    h,%                     \   S r SSKrSSKJrJr  SSKJr  SSKJrJ	r	J
r
  SSKJrJr   " S S\R                  5      r " S	 S
\R                  5      rSrSrSrSrSrSrSrSrSrSrSrSrSr0 r\" 5       RA                  5       RC                  5        H  u  r"r#\"SS S:X  d  M  \"SS \\#'   M     g)z
Implements the SSH v2 key agent protocol.  This protocol is documented in the
SSH source code, in the file
U{PROTOCOL.agent<http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.agent>}.

Maintainer: Paul Swartz
    N)
ConchErrorMissingKeyStoreError)keys)NSgetMPgetNS)deferprotocolc                   X    \ rS rSrSrS rS rS rS rS r	SS jr
S	 rS
 rS rS rSrg)SSHAgentClient   z
The client side of the SSH agent protocol.  This is equivalent to
ssh-add(1) and can be used with either ssh-agent(1) or the SSHAgentServer
protocol, also in this package.
c                      SU l         / U l        g N    buf	deferredsselfs    ^/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/conch/ssh/agent.py__init__SSHAgentClient.__init__   s    r   c                 8   U =R                   U-  sl          [        U R                   5      S::  a  g [        R                  " SU R                   S S 5      S   n[        U R                   5      SU-   :  a  g U R                   SSU-    U R                   SU-   S  so0l         [	        USS 5      nU R
                  R                  S5      nU[        :X  a  UR                  [        S5      5        O-U[        :X  a  UR                  S5        OUR                  U5        GM  )N      !Lr   zagent failurer   )r   lenstructunpackordr   popAGENT_FAILUREerrbackr   AGENT_SUCCESScallback)r   datapackLenpacketreqTypeds         r   dataReceivedSSHAgentClient.dataReceived    s    D488}!mmD$((2A,7:G488}q7{*#xxAK8$((1w;=:QFH&1+&G""1%A-'		*_56M)

3

6" r   c                     [         R                  " S[        U5      S-   U5      U-   nU R                  R	                  U5        [
        R                  " 5       nU R                  R                  U5        U$ Nz!LBr   )	r   packr   	transportwriter	   Deferredr   append)r   r)   r&   r/   r*   s        r   sendRequestSSHAgentClient.sendRequest2   sV    {{5#d)a-9D@T"NNa r   c                 h    U R                  [        S5      nUR                  U R                  5        U$ )z
@return: A L{Deferred} which will fire with a list of all keys found in
    the SSH agent. The list of keys is comprised of (public key blob,
    comment) tuples.
r   )r4   AGENTC_REQUEST_IDENTITIESaddCallback_cbRequestIdentities)r   r*   s     r   requestIdentities SSHAgentClient.requestIdentities9   s.     6<	d//0r   c                 *   [        USS 5      [        :w  a  [        S[        USS 5      -  5      e[        R                  " SUSS 5      S   n/ nUSS n[        U5       H/  n[        U5      u  pQ[        U5      u  paUR                  XV45        M1     U$ )ze
Unpack a collection of identities into a list of tuples comprised of
public key blobs and comments.
r   r   zunexpected response: %ir      N)r    AGENT_IDENTITIES_ANSWERr   r   r   ranger   r3   )r   r&   numKeysresultiblobcomments          r   r9   #SSHAgentClient._cbRequestIdentitiesC   s    
 tAay>446T!AYGHH--d1Qi03ABxwAtJD!$KMGMM4/*   r   c                 N    UnU[        U5      -  nU R                  [        U5      $ )z;
Add a private key blob to the agent's collection of keys.
)r   r4   AGENTC_ADD_IDENTITY)r   rC   rD   reqs       r   addIdentitySSHAgentClient.addIdentityS   s+     r'{ 3S99r   c                     [        U5      nU[        U5      -  nUS-  nU R                  [        U5      R                  U R                  5      $ )aF  
Request that the agent sign the given C{data} with the private key
which corresponds to the public key given by C{blob}.  The private
key should have been added to the agent already.

@type blob: L{bytes}
@type data: L{bytes}
@return: A L{Deferred} which fires with a signature for given data
    created with the given key.
       )r   r4   AGENTC_SIGN_REQUESTr8   _cbSignData)r   rC   r&   rH   s       r   signDataSSHAgentClient.signData[   sJ     hr$x"" 3S9EEdFVFVWWr   c                     [        USS 5      [        :w  a  [        S[        USS 5      -  5      e[        USS  5      S   nU$ )Nr   r   zunexpected data: %i)r    AGENT_SIGN_RESPONSEr   r   )r   r&   	signatures      r   rN   SSHAgentClient._cbSignDatak   sJ    tAay>002Sa^CDD$qr(OA&	r   c                 D    [        U5      nU R                  [        U5      $ )zX
Remove the private key corresponding to the public key in blob from the
running agent.
)r   r4   AGENTC_REMOVE_IDENTITY)r   rC   rH   s      r   removeIdentitySSHAgentClient.removeIdentityq   s!    
 h 6<<r   c                 .    U R                  [        S5      $ )z)
Remove all keys from the running agent.
r   )r4   AGENTC_REMOVE_ALL_IDENTITIESr   s    r   removeAllIdentities"SSHAgentClient.removeAllIdentitiesy   s      <cBBr   r   N)r   )__name__
__module____qualname____firstlineno____doc__r   r+   r4   r:   r9   rI   rO   rN   rW   r[   __static_attributes__ r   r   r   r      s;    #$ :X =Cr   r   c                   Z    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rSrg)SSHAgentServer   z
The server side of the SSH agent protocol.  This is equivalent to
ssh-agent(1) and can be used with either ssh-add(1) or the SSHAgentClient
protocol, also in this package.
c                     SU l         g r   r   r   s    r   r   SSHAgentServer.__init__   s	    r   c                 j   U =R                   U-  sl          [        U R                   5      S::  a  g [        R                  " SU R                   S S 5      S   n[        U R                   5      SU-   :  a  g U R                   SSU-    U R                   SU-   S  so0l         [	        USS 5      n[
        R                  US 5      nU(       d  U R                  [        S5        OR[        U SU-  5      n[        U R                  SS 5      c   U R                  [        S5        [        5       eU" USS  5        GM  )Nr   r   r   r   r   z	agentc_%sr   )r   r   r   r   r    messagesgetsendResponser"   getattrfactoryr   )r   r&   r'   r(   r)   reqNamefs          r   r+   SSHAgentServer.dataReceived   s   D488}!mmD$((2A,7:G488}q7{*#xxAK8$((1w;=:QFH&1+&Gll7D1G!!-5D+"784<<6>%%mS9.00&*! r   c                     [         R                  " S[        U5      S-   U5      U-   nU R                  R	                  U5        g r.   )r   r/   r   r0   r1   )r   r)   r&   r/   s       r   rm   SSHAgentServer.sendResponse   s3    {{5#d)a-9D@T"r   c                    US:X  d   e[        U R                  R                  5      n/ nUR                  [        R
                  " SU5      5        U R                  R                  R                  5        HG  u  pEUR                  [        UR                  5       5      5        UR                  [        U5      5        MI     U R                  [        SR                  U5      5        g)zA
Return all of the identities that have been added to the server
r   r   N)r   ro   r   r3   r   r/   valuesr   rC   rm   r>   join)r   r&   r@   respkeyrD   s         r   agentc_REQUEST_IDENTITIES(SSHAgentServer.agentc_REQUEST_IDENTITIES   s     s{{dll''(FKKg./ LL--446LCKK388:'KK7$ 7 	1388D>Br   c                 6   [        U5      u  p!X R                  R                  ;  a  U R                  [        S5      $ [        U5      u  p1US:X  d   eU R                  [
        [        U R                  R                  U   S   R                  U5      5      5        g)z
Data is a structure with a reference to an already added key object and
some data that the clients wants signed with that key.  If the key
object wasn't loaded, return AGENT_FAILURE, else return the signature.
r   rL   r   N)r   ro   r   rm   r"   rR   r   sign)r   r&   rC   rO   s       r   agentc_SIGN_REQUEST"SSHAgentServer.agentc_SIGN_REQUEST   s     4[
||((($$]C88t****DLL$5$5d$;A$>$C$CH$M!N	
r   c                 b   [        U5      u  p#US:X  a  SnO"US:X  a  SnO[        R                  " SU-  5      e[        X45      S   n[        U5      u  pS[        R                  R                  USS9nXe4U R                  R                  UR                  5       '   U R                  [        S	5        g
)z
Adds a private key to the agent's collection of identities.  On
subsequent interactions, the private key can be accessed using only the
corresponding public key.
s   ssh-rsa   s   ssh-dssr=   zunknown blob type: %sprivate_blobtyper   N)
r   r   BadKeyErrorr   Key
fromStringro   rC   rm   r$   )r   r&   keyTyperestnmprD   ks          r   agentc_ADD_IDENTITY"SSHAgentServer.agentc_ADD_IDENTITY   s     dj C
"C""#:W#DEET
 dHH>:'(l!&&(#--r   c                     [        U5      u  p#[        R                  R                  USS9nU R                  R                  UR                  5       	 U R                  [        S5        g)zB
Remove a specific key from the agent's collection of identities.
rC   r   r   N)r   r   r   r   ro   rC   rm   r$   )r   r&   rC   _r   s        r   agentc_REMOVE_IDENTITY%SSHAgentServer.agentc_REMOVE_IDENTITY   sP     +HH62LLaffh'--r   c                 b    US:X  d   e0 U R                   l        U R                  [        S5        g)z<
Remove all keys from the agent's collection of identities.
r   N)ro   r   rm   r$   r   r&   s     r   agentc_REMOVE_ALL_IDENTITIES+SSHAgentServer.agentc_REMOVE_ALL_IDENTITIES   s,     s{{--r   c                 Z    U R                  [        [        R                  " SS5      5        g)zo
v1 message for listing RSA1 keys; superseded by
agentc_REQUEST_IDENTITIES, which handles different key types.
r   r   N)rm   AGENT_RSA_IDENTITIES_ANSWERr   r/   r   s     r   agentc_REQUEST_RSA_IDENTITIES,SSHAgentServer.agentc_REQUEST_RSA_IDENTITIES   s     
 	5v{{47KLr   c                 0    U R                  [        S5        g)zm
v1 message for removing RSA1 keys; superseded by
agentc_REMOVE_IDENTITY, which handles different key types.
r   Nrm   r$   r   s     r   agentc_REMOVE_RSA_IDENTITY)SSHAgentServer.agentc_REMOVE_RSA_IDENTITY       
 	--r   c                 0    U R                  [        S5        g)zw
v1 message for removing all RSA1 keys; superseded by
agentc_REMOVE_ALL_IDENTITIES, which handles different key types.
r   Nr   r   s     r    agentc_REMOVE_ALL_RSA_IDENTITIES/SSHAgentServer.agentc_REMOVE_ALL_RSA_IDENTITIES   r   r   rh   N)r]   r^   r_   r`   ra   r   r+   rm   rz   r~   r   r   r   r   r   r   rb   rc   r   r   re   re      s@    (#C
.2..M..r   re   r      r=   r      	                           AGENTC_)$ra   r   twisted.conch.errorr   r   twisted.conch.sshr   twisted.conch.ssh.commonr   r   r   twisted.internetr	   r
   Protocolr   re   AGENTC_REQUEST_RSA_IDENTITIESr   r"   r$   AGENTC_REMOVE_RSA_IDENTITY AGENTC_REMOVE_ALL_RSA_IDENTITIESr7   r>   rM   rR   rG   rV   rZ   rk   localscopyitemsnamevaluerc   r   r   <module>r      s     @ " 5 5 ,hCX&& hCV@.X&& @.F !"   #$        ! 8==?((*KD%BQx9qr( +r   