Skip to content

Instantly share code, notes, and snippets.

@moriyoshi
Created August 25, 2014 05:53
Show Gist options
  • Save moriyoshi/cf15376b75d3854064be to your computer and use it in GitHub Desktop.
Save moriyoshi/cf15376b75d3854064be to your computer and use it in GitHub Desktop.
import os
from struct import pack, unpack
from socket import AF_UNIX, IPPROTO_TCP, SOCK_STREAM, socket
from base64 import b64encode
SSH_AGENT_FAILURE = 5
SSH_AGENT_SUCCESS = 6
SSH2_AGENTC_REQUEST_IDENTITIES = 11
SSH2_AGENTC_SIGN_REQUEST = 13
SSH2_AGENT_IDENTITIES_ANSWER = 12
SSH2_AGENT_SIGN_RESPONSE = 14
def peek_str(b, o):
i, = unpack('>L', b[o:o + 4])
o += 4
no = o + i
return b[o:no], no
def main():
s = socket(AF_UNIX, SOCK_STREAM, 0)
s.connect(os.environ['SSH_AUTH_SOCK'])
payload = pack('>B', SSH2_AGENTC_REQUEST_IDENTITIES)
packet = pack('>L', len(payload)) + payload
s.send(packet)
l, = unpack('>L', s.recv(4))
recv_payload = s.recv(l)
c, num_keys = unpack('>BL', recv_payload[0:5])
assert c == SSH2_AGENT_IDENTITIES_ANSWER
o = 5
keys = []
for _ in range(0, num_keys):
key_blob, o = peek_str(recv_payload, o)
key_comment, o = peek_str(recv_payload, o)
keys.append((key_blob, key_comment))
key_blob, _ = keys[0]
payload = pack('>B', SSH2_AGENTC_SIGN_REQUEST)
payload += pack('>L', len(key_blob)) + key_blob
data = b'a'
payload += pack('>L', len(data)) + data
payload += pack('>L', 0)
packet = pack('>L', len(payload)) + payload
s.send(packet)
l, = unpack('>L', s.recv(4))
recv_payload = s.recv(l)
c, = unpack('>B', recv_payload[0:1])
assert c == SSH2_AGENT_SIGN_RESPONSE
signature_blob, _ = peek_str(recv_payload[1:], 0)
print(['%02x' % x for x in signature_blob])
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment