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