§
    Ètºf,%  ã                   ó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    úV/var/www/surfInsights/venv3-11/lib/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ÑˆŒð	#Ý�4”8‰}Œ} Ò!Ð!Ø�Ý”m D¨$¬(°2°A°2¬,Ñ7Ô7¸Ô:ˆGÝ�4”8‰}Œ}˜q 7™{Ò*Ð*Ø�Ø#œx¨¨A°©K¨Ô8¸$¼(À1ÀwÁ;À=À=Ô:QÐˆF�D”HÝ˜&  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Ô9¸DÑ@ˆØŒ×Ò˜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Á   € õ
 ˆt�A�a�CŒy‰>Œ>Õ4Ò4Ð4ÝÐ6½¸TÀ!ÀAÀ#¼Y¹¼ÑGÑHÔHÐHÝ”-  d¨1¨Q¨3¤iÑ0Ô0°Ô3ˆØˆØ�A�B�BŒxˆÝ�w‘”ð 	+ð 	+ˆAÝ˜t™œ‰JˆD�$Ý! $™KœK‰MˆG�TØ�MŠM˜4 ˜/Ñ*Ô*Ð*Ð*Øˆ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�'‰{Œ{ÑˆØ×ÒÕ 3°SÑ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   € õ �‰hŒhˆØ�r�$‰xŒx‰ˆØÐ"Ñ"ˆØ×ÒÕ 3°SÑ9Ô9×EÒEÀdÔFVÑ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\   € Ýˆt�A�a�CŒy‰>Œ>Õ0Ò0Ð0ÝÐ2µS¸¸aÀ¸c¼±^´^ÑCÑDÔDÐDÝ˜$˜q˜r˜rœ(‘O”O AÔ&ˆ	ØÐ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&   € õ
 �‰hŒhˆØ×ÒÕ 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ÑˆŒð	Ý�4”8‰}Œ} Ò!Ð!Ø�Ý”m D¨$¬(°2°A°2¬,Ñ7Ô7¸Ô:ˆGÝ�4”8‰}Œ}˜q 7™{Ò*Ð*Ø�Ø#œx¨¨A°©K¨Ô8¸$¼(À1ÀwÁ;À=À=Ô:QÐˆF�D”HÝ˜&  1 œ+Ñ&Ô&ˆGÝ—l’l 7¨DÑ1Ô1ˆGØð Ø×!Ò!¥-°Ñ5Ô5Ð5Ð5å˜D +°Ñ"7Ñ8Ô8�Ý˜4œ<¨°Ñ6Ô6Ð>Ø×%Ò%¥m°SÑ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Ô9¸DÑ@ˆØŒ×Ò˜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Š{ˆ{ˆ{ˆ{Ý�d”lÔ'Ñ(Ô(ˆØˆà�Š•F”K  gÑ.Ô.Ñ/Ô/Ð/Ø œLÔ-×4Ò4Ñ6Ô6ð 	%ð 	%‰LˆC�Ø�KŠK�˜3Ÿ8š8™:œ:™œÑ'Ô'Ð'Ø�KŠK�˜7™œÑ$Ô$Ð$Ð$Ø×ÒÕ1°3·8²8¸D±>´>Ñ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™œ‰ˆ�$ØÐ*Ò*Ð*Ð*Ð*Ø×ÒÝ¥ D¤LÔ$5°dÔ$;¸AÔ$>×$CÒ$CÀHÑ$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Ò Ð ØˆCˆCØ˜
Ò"Ð"ØˆCˆCåÔ"Ð#:¸WÑ#DÑEÔEÐEå�T˜3ÑÔØô
ˆõ ˜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Ô˜aŸfšf™hœhÐ'Ø×Ò�-¨Ñ-Ô-Ð-Ð-Ð-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-   € ð
 	×ÒÕ5µv´{À4ÈÑ7KÔ7KÑ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 !"Ð ØÐ Ø€Ø€àÐ Ø#$Ð  àÐ ØÐ ØÐ ØÐ ØÐ ØÐ Ø!Ð à€Ø�6‘8”8—=’=‘?”?×(Ò(Ñ*Ô*ð #ð #�K€Dˆ%ØˆBˆQˆB„x�9ÒÐØ˜q˜r˜rœ(ˆ�‰øð#ð #r   