
    \d,%                     t   d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZmZ  G d dej                  Z G d	 d
ej                  ZdZdZdZdZdZdZdZdZdZdZdZdZdZi Z e                                             !                                D ] \  Z"Z#e"dd         dk    re"dd         ee#<   !dS )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                   P    e Zd ZdZd Zd Zd Zd Zd ZddZ	d	 Z
d
 Zd Zd ZdS )SSHAgentClientz
    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                 "    d| _         g | _        d S N    )buf	deferredsselfs    7lib/python3.11/site-packages/twisted/conch/ssh/agent.py__init__zSSHAgentClient.__init__   s    r   c                 d   | xj         |z  c_         	 t          | j                   dk    rd S t          j        d| j         d d                   d         }t          | j                   d|z   k     rd S | j         dd|z            | j         d|z   d          c}| _         t	          |dd                   }| j                            d          }|t          k    r#|                    t          d                     n6|t          k    r|                    d           n|                    |            )N      !Lr   zagent failurer   )r   lenstructunpackordr   popAGENT_FAILUREerrbackr   AGENT_SUCCESScallback)r   datapackLenpacketreqTypeds         r   dataReceivedzSSHAgentClient.dataReceived    s   D	#48}}!!mD$(2A2,77:G48}}q7{**#xAK8$(1w;==:QFDH&1+&&G""1%%A-''		*_556666M))

3

6"""	#r   c                     t          j        dt          |          dz   |          |z   }| j                            |           t          j                    }| j                            |           |S Nz!LBr   )	r   packr   	transportwriter	   Deferredr   append)r   r&   r#   r+   r'   s        r   sendRequestzSSHAgentClient.sendRequest2   sb    {5#d))a-99D@T"""Na   r   c                 p    |                      t          d          }|                    | j                   |S )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   )r0   AGENTC_REQUEST_IDENTITIESaddCallback_cbRequestIdentities)r   r'   s     r   requestIdentitiesz SSHAgentClient.requestIdentities9   s4     6<<	d/000r   c                    t          |dd                   t          k    r't          dt          |dd                   z            t          j        d|dd                   d         }g }|dd         }t          |          D ]=}t          |          \  }}t          |          \  }}|                    ||f           >|S )z}
        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   r/   )r   r#   numKeysresultiblobcomments          r   r4   z#SSHAgentClient._cbRequestIdentitiesC   s    
 tAaCy>>4446T!A#YGHHH-d1Q3i003ABBxw 	+ 	+AtJD$!$KKMGTMM4/****r   r   c                 `    |}|t          |          z  }|                     t          |          S )zK
        Add a private key blob to the agent's collection of keys.
        )r   r0   AGENTC_ADD_IDENTITY)r   r=   r>   reqs       r   addIdentityzSSHAgentClient.addIdentityS   s0     r'{{ 3S999r   c                     t          |          }|t          |          z  }|dz  }|                     t          |                              | j                  S )a  
        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   r0   AGENTC_SIGN_REQUESTr3   _cbSignData)r   r=   r#   rA   s       r   signDatazSSHAgentClient.signData[   sQ     hhr$xx"" 3S99EEdFVWWWr   c                     t          |dd                   t          k    r't          dt          |dd                   z            t          |dd                    d         }|S )Nr   r   zunexpected data: %i)r   AGENT_SIGN_RESPONSEr   r   )r   r#   	signatures      r   rF   zSSHAgentClient._cbSignDatak   s\    tAaCy>>0002Sac^^CDDD$qrr(OOA&	r   c                 V    t          |          }|                     t          |          S )zp
        Remove the private key corresponding to the public key in blob from the
        running agent.
        )r   r0   AGENTC_REMOVE_IDENTITY)r   r=   rA   s      r   removeIdentityzSSHAgentClient.removeIdentityq   s&    
 hh 6<<<r   c                 8    |                      t          d          S )z9
        Remove all keys from the running agent.
        r   )r0   AGENTC_REMOVE_ALL_IDENTITIESr   s    r   removeAllIdentitiesz"SSHAgentClient.removeAllIdentitiesy   s      <cBBBr   N)r   )__name__
__module____qualname____doc__r   r(   r0   r5   r4   rB   rG   rF   rM   rP    r   r   r   r      s           # # #$       : : : :X X X   = = =C C C C Cr   r   c                   T    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZdS )SSHAgentServerz
    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                     d| _         d S r   )r   r   s    r   r   zSSHAgentServer.__init__   s    r   c                    | xj         |z  c_         	 t          | j                   dk    rd S t          j        d| j         d d                   d         }t          | j                   d|z   k     rd S | j         dd|z            | j         d|z   d          c}| _         t	          |dd                   }t
                              |d           }|s|                     t          d           net          | d|z            }t          | j
        dd           )|                     t          d           t                       ||dd                     @)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(   zSSHAgentServer.dataReceived   sD   D	48}}!!mD$(2A2,77:G48}}q7{**#xAK8$(1w;==:QFDH&1+&&Gll7D11G !!-5555D+"7884<66>%%mS999.000&*!	r   c                     t          j        dt          |          dz   |          |z   }| j                            |           d S r*   )r   r+   r   r,   r-   )r   r&   r#   r+   s       r   r\   zSSHAgentServer.sendResponse   s@    {5#d))a-99D@T"""""r   c                    |dk    sJ t          | j        j                  }g }|                    t	          j        d|                     | j        j                                        D ][\  }}|                    t          |                                                     |                    t          |                     \| 	                    t          d                    |                     dS )zQ
        Return all of the identities that have been added to the server
        r   r   N)r   r^   r   r/   r   r+   valuesr   r=   r\   r8   join)r   r#   r:   respkeyr>   s         r   agentc_REQUEST_IDENTITIESz(SSHAgentServer.agentc_REQUEST_IDENTITIES   s     s{{{{dl'((FKg../// L-4466 	% 	%LCKK388::'''KK7$$$$1388D>>BBBBBr   c                 R   t          |          \  }}|| j        j        vr|                     t          d          S t          |          \  }}|dk    sJ |                     t
          t          | j        j        |         d                             |                               dS )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   rD   r   N)r   r^   r   r\   r   rI   r   sign)r   r#   r=   rG   s       r   agentc_SIGN_REQUESTz"SSHAgentServer.agentc_SIGN_REQUEST   s     4[[
dt|((($$]C888t$*****DL$5d$;A$>$C$CH$M$M!N!N	
 	
 	
 	
 	
r   c                    t          |          \  }}|dk    rd}n |dk    rd}nt          j        d|z            t          ||          d         }t          |          \  }}t          j                            |d          }||f| j        j        |                                <   |                     t          d	           d
S )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-dssr7   zunknown blob type: %sprivate_blobtyper   N)
r   r   BadKeyErrorr   Key
fromStringr^   r=   r\   r!   )r   r#   keyTyperestnmpr>   ks          r   agentc_ADD_IDENTITYz"SSHAgentServer.agentc_ADD_IDENTITY   s     dj  CC
""CC"#:W#DEEET3
 dH>::'('l!&&((#------r   c                     t          |          \  }}t          j                            |d          }| j        j        |                                = |                     t          d           dS )zR
        Remove a specific key from the agent's collection of identities.
        r=   ro   r   N)r   r   rr   rs   r^   r=   r\   r!   )r   r#   r=   _rw   s        r   agentc_REMOVE_IDENTITYz%SSHAgentServer.agentc_REMOVE_IDENTITY   s^     ++aH622Laffhh'------r   c                 d    |dk    sJ i | j         _        |                     t          d           dS )zL
        Remove all keys from the agent's collection of identities.
        r   N)r^   r   r\   r!   r   r#   s     r   agentc_REMOVE_ALL_IDENTITIESz+SSHAgentServer.agentc_REMOVE_ALL_IDENTITIES   s7     s{{{{------r   c                 b    |                      t          t          j        dd                     dS )z
        v1 message for listing RSA1 keys; superseded by
        agentc_REQUEST_IDENTITIES, which handles different key types.
        r   r   N)r\   AGENT_RSA_IDENTITIES_ANSWERr   r+   r}   s     r   agentc_REQUEST_RSA_IDENTITIESz,SSHAgentServer.agentc_REQUEST_RSA_IDENTITIES   s-    
 	5v{47K7KLLLLLr   c                 <    |                      t          d           dS )z
        v1 message for removing RSA1 keys; superseded by
        agentc_REMOVE_IDENTITY, which handles different key types.
        r   Nr\   r!   r}   s     r   agentc_REMOVE_RSA_IDENTITYz)SSHAgentServer.agentc_REMOVE_RSA_IDENTITY        
 	------r   c                 <    |                      t          d           dS )z
        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_IDENTITIESz/SSHAgentServer.agentc_REMOVE_ALL_RSA_IDENTITIES   r   r   N)rQ   rR   rS   rT   r   r(   r\   rg   rj   rx   r{   r~   r   r   r   rU   r   r   rW   rW      s             (# # #C C C
 
 
. . .2. . .. . .M M M. . .. . . . .r   rW   r      r7   rl      	                           AGENTC_)$rT   r   twisted.conch.errorr   r   twisted.conch.sshr   twisted.conch.ssh.commonr   r   r   twisted.internetr	   r
   Protocolr   rW   AGENTC_REQUEST_RSA_IDENTITIESr   r   r!   AGENTC_REMOVE_RSA_IDENTITY AGENTC_REMOVE_ALL_RSA_IDENTITIESr2   r8   rE   rI   r@   rL   rO   rZ   localscopyitemsnamevaluerU   r   r   <module>r      s     @ @ @ @ @ @ @ @ " " " " " " 5 5 5 5 5 5 5 5 5 5 , , , , , , , ,hC hC hC hC hCX& hC hC hCV@. @. @. @. @.X& @. @. @.F !"   #$        ! 688==??((** # #KD%BQBx9qrr(# #r   