Ë
    oj,%  ã                   ó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    ú9/usr/lib/python3/dist-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Ñ�ØÜ�4—8‘8‹} Ò!ØÜ—m‘m D¨$¯(©(°2°A¨,Ó7¸Ñ:ˆGÜ�4—8‘8‹}˜q 7™{Ò*ØØ#Ÿx™x¨¨A°©KÐ8¸$¿(¹(À1ÀwÁ;À=Ð:QÐˆF�D”HÜ˜&  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¡-°Ó9¸DÑ@ˆØ�‰×Ñ˜TÔ"Ü�N‰NÓˆØ�‰×Ñ˜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¡   € ô
 ˆt�A�aˆy‹>Ô4Ò4ÜÐ6¼¸TÀ!ÀA¸Y»ÑGÓHÐHÜ—-‘-  d¨1¨Q iÓ0°Ñ3ˆØˆØ�A�BˆxˆÜ�w“ò 	+ˆAÜ˜t›‰JˆD�$Ü! $›K‰MˆG�TØ�M‰M˜4 ˜/Õ*ð	+ð ˆ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�'‹{ÑˆØ×ÑÔ 3°SÓ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‰ˆØÐ"Ñ"ˆØ×ÑÔ 3°SÓ9×EÑEÀd×FVÑFVÓ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   € Üˆt�A�aˆy‹>Ô0Ò0ÜÐ2´S¸¸aÀ¸³^ÑCÓDÐDÜ˜$˜q˜r˜(“O AÑ&ˆ	ØÐ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Ñ�ØÜ�4—8‘8‹} Ò!ØÜ—m‘m D¨$¯(©(°2°A¨,Ó7¸Ñ:ˆGÜ�4—8‘8‹}˜q 7™{Ò*ØØ#Ÿx™x¨¨A°©KÐ8¸$¿(¹(À1ÀwÁ;À=Ð:QÐˆF�D”HÜ˜&  1˜+Ó&ˆGÜ—l‘l 7¨DÓ1ˆGÙØ×!Ñ!¤-°Õ5ä˜D +°Ñ"7Ó8�Ü˜4Ÿ<™<¨°Ó6Ð>Ø×%Ñ%¤m°SÔ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¡-°Ó9¸DÑ@ˆØ�‰×Ñ˜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Š{Ðˆ{Ü�d—l‘l×'Ñ'Ó(ˆØˆà�‰”F—K‘K  gÓ.Ô/Ø ŸL™L×-Ñ-×4Ñ4Ó6ò 	%‰LˆC�Ø�K‰Kœ˜3Ÿ8™8›:›Ô'Ø�K‰Kœ˜7›Õ$ð	%ð 	×ÑÔ1°3·8±8¸D³>Õ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›‰ˆ�$ØÐ*Ò*Ð*Ð*Ø×ÑÜ¤ D§L¡L×$5Ñ$5°dÑ$;¸AÑ$>×$CÑ$CÀHÓ$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ä�T˜3ÓØñ
ˆô ˜d›‰ˆ�ä�H‰H×Ñ ¨>ÐÓ:ˆØ'(¨' 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Ü�H‰H×Ñ ¨6ÐÓ2ˆØ�L‰L×Ñ˜aŸf™f›hÐ'Ø×Ñœ-¨Õ-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    € ð
 	×ÑÔ5´v·{±{À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—=‘=“?×(Ñ(Ó*ò #�K€Dˆ%ØˆBˆQ€x�9ÓØ˜q˜r˜(ˆ�Šñ#r   