
    Vh,%                     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       jA                         jC                         D ]  \  Z"Z#e"dd dk(  se"dd ee#<    y)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                   N    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y)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 | _        y N    )buf	deferredsselfs    G/home/dcms/DCMS/lib/python3.12/site-packages/twisted/conch/ssh/agent.py__init__zSSHAgentClient.__init__   s    r   c                 ,   | xj                   |z  c_         	 t        | j                         dk  ry t        j                  d| j                   d d       d   }t        | j                         d|z   k  ry | j                   dd|z    | j                   d|z   d  c}| _         t	        |dd       }| j
                  j                  d      }|t        k(  r|j                  t        d             n,|t        k(  r|j                  d       n|j                  |       )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488}!mmD$((2A,7:G488}q7{*#xxAK8$((1w;=:QFDH&1+&G""1%A-'		*_56M)

3

6" r   c                     t        j                  dt        |      dz   |      |z   }| j                  j	                  |       t        j                         }| j                  j                  |       |S Nz!LBr   )	r   packr   	transportwriter	   Deferredr   append)r   r&   r#   r+   r'   s        r   sendRequestzSSHAgentClient.sendRequest2   sV    {{5#d)a-9D@T"NNa r   c                 h    | j                  t        d      }|j                  | 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   s.     6<	d//0r   c                 (   t        |dd       t        k7  rt        dt        |dd       z        t        j                  d|dd       d   }g }|dd }t        |      D ]1  }t        |      \  }}t        |      \  }}|j                  ||f       3 |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    
 tAay>446T!AYGHH--d1Qi03ABxw 	+AtJD$!$KMGTMM4/*	+ r   c                 N    |}|t        |      z  }| j                  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   s+     r'{ 3S99r   c                     t        |      }|t        |      z  }|dz  }| j                  t        |      j                  | 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[   sJ     hr$x"" 3S9EEdFVFVWWr   c                     t        |dd       t        k7  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   sJ    tAay>002Sa^CDD$qr(OA&	r   c                 D    t        |      }| j                  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!    
 h 6<<r   c                 .    | j                  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Br   N)r   )__name__
__module____qualname____doc__r   r(   r0   r5   r4   rB   rG   rF   rM   rP    r   r   r   r      s;    #$ :X =Cr   r   c                   R    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y)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| _         y r   )r   r   s    r   r   zSSHAgentServer.__init__   s	    r   c                 X   | xj                   |z  c_         	 t        | j                         dk  ry t        j                  d| j                   d d       d   }t        | j                         d|z   k  ry | j                   dd|z    | j                   d|z   d  c}| _         t	        |dd       }t
        j                  |d       }|s| j                  t        d       nQt        | d|z        }t        | j                  dd        | j                  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   s
   D488}!mmD$((2A,7:G488}q7{*#xxAK8$((1w;=:QFDH&1+&Gll7D1G!!-5D+"784<<6>%%mS9.00&*! r   c                     t        j                  dt        |      dz   |      |z   }| j                  j	                  |       y r*   )r   r+   r   r,   r-   )r   r&   r#   r+   s       r   r\   zSSHAgentServer.sendResponse   s3    {{5#d)a-9D@T"r   c                    |dk(  sJ t        | j                  j                        }g }|j                  t	        j
                  d|             | j                  j                  j                         D ]G  \  }}|j                  t        |j                                      |j                  t        |             I | j                  t        dj                  |             y)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{{dll''(FKKg./ LL--446 	%LCKK388:'KK7$	% 	1388D>Br   c                 6   t        |      \  }}|| j                  j                  vr| j                  t        d      S t        |      \  }}|dk(  sJ | j                  t
        t        | j                  j                  |   d   j                  |                   y)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t$****DLL$5$5d$;A$>$C$CH$M!N	
r   c                 j   t        |      \  }}|dk(  rd}n |dk(  rd}nt        j                  d|z        t        ||      d   }t        |      \  }}t        j                  j                  |d      }||f| j                  j                  |j                         <   | j                  t        d	       y
)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 C
"C""#:W#DEET3
 dHH>:'('l!&&(#--r   c                     t        |      \  }}t        j                  j                  |d      }| j                  j                  |j                         = | j                  t        d       y)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   sR     +aHH62LLaffh'--r   c                 `    |dk(  sJ i | j                   _        | j                  t        d       y)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   s,     s{{--r   c                 X    | j                  t        t        j                  dd             y)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7KLr   c                 0    | j                  t        d       y)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                 0    | j                  t        d       y)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
.2..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 ,hCX&& hCV@.X&& @.F !"   #$        ! 8==?((* #KD%BQx9qr(#r   