support pc development with JS http bridge
This commit is contained in:
128
tools/http2udb.py
Normal file
128
tools/http2udb.py
Normal file
@@ -0,0 +1,128 @@
|
||||
#!/usr/bin/python
|
||||
from __future__ import print_function, absolute_import, unicode_literals
|
||||
from http.server import BaseHTTPRequestHandler,HTTPServer
|
||||
|
||||
from fido2.hid import CtapHidDevice, CTAPHID
|
||||
from fido2.client import Fido2Client, ClientError
|
||||
from fido2.ctap import CtapError
|
||||
from fido2.ctap1 import CTAP1
|
||||
from fido2.ctap2 import *
|
||||
from fido2.cose import *
|
||||
from fido2.utils import Timeout
|
||||
|
||||
import socket,json,base64,ssl
|
||||
|
||||
httpport = 8080
|
||||
udpport = 8111
|
||||
|
||||
|
||||
|
||||
def ForceU2F(client,device):
|
||||
client.ctap = CTAP1(device)
|
||||
client.pin_protocol = None
|
||||
client._do_make_credential = client._ctap1_make_credential
|
||||
client._do_get_assertion = client._ctap1_get_assertion
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
dev = next(CtapHidDevice.list_devices(), None)
|
||||
print(dev)
|
||||
if not dev:
|
||||
raise RuntimeError('No FIDO device found')
|
||||
client = Fido2Client(dev, 'https://example.com')
|
||||
ForceU2F(client, dev)
|
||||
ctap = client.ctap
|
||||
|
||||
|
||||
def to_websafe(data):
|
||||
data = data.replace('+','-')
|
||||
data = data.replace('/','_')
|
||||
data = data.replace('=','')
|
||||
return data
|
||||
|
||||
def from_websafe(data):
|
||||
data = data.replace('-','+')
|
||||
data = data.replace('_','/')
|
||||
return data + '=='[:(3*len(data)) % 4]
|
||||
|
||||
def write(data):
|
||||
msg = from_websafe(data)
|
||||
msg = base64.b64decode(msg)
|
||||
chal = b'A'*32
|
||||
appid = b'A'*32
|
||||
#print (msg)
|
||||
#print (msg.decode())
|
||||
#print (str(msg))
|
||||
#msg = msg.decode('ascii')
|
||||
#print('ascii:',repr(msg))
|
||||
#print('ascii:',(type(msg)))
|
||||
#print(msg + chal)
|
||||
|
||||
#data = client_param + app_param + struct.pack('>B', len(key_handle)) + key_handle
|
||||
#msg = str(msg.decode())
|
||||
#print(msg.decode())
|
||||
s = ctap.authenticate(chal,appid,msg,)
|
||||
print(s)
|
||||
#sock.sendto(msg, ('127.0.0.1', udpport))
|
||||
|
||||
def read():
|
||||
#msg = [0]*64
|
||||
pkt, _ = sock.recvfrom(1000)
|
||||
#for i,v in enumerate(pkt):
|
||||
#msg[i] = ord(v)
|
||||
msg = base64.b64encode(pkt)
|
||||
msg = to_websafe(pkt)
|
||||
return msg
|
||||
|
||||
class UDPBridge(BaseHTTPRequestHandler):
|
||||
def end_headers (self):
|
||||
self.send_header('Access-Control-Allow-Origin', '*')
|
||||
BaseHTTPRequestHandler.end_headers(self)
|
||||
|
||||
def do_POST(self):
|
||||
content_len = int(self.headers.get('Content-Length', 0))
|
||||
post_body = self.rfile.read(content_len)
|
||||
data = json.loads(post_body)['data']
|
||||
|
||||
print(data)
|
||||
msg = from_websafe(data)
|
||||
msg = base64.b64decode(msg)
|
||||
chal = b'A'*32
|
||||
appid = b'A'*32
|
||||
|
||||
s = ctap.authenticate(chal,appid,msg,)
|
||||
|
||||
data = struct.pack('B',s.user_presence) + struct.pack('>L',s.counter) + s.signature
|
||||
data = base64.b64encode(data).decode('ascii')
|
||||
data = to_websafe(data)
|
||||
data = json.dumps({'data':data})
|
||||
data = data.encode('ascii')
|
||||
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type','text/json')
|
||||
self.end_headers()
|
||||
self.wfile.write(data)
|
||||
|
||||
|
||||
def do_GET(self):
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type','text/json')
|
||||
self.end_headers()
|
||||
|
||||
#msg = {'data': read()}
|
||||
msg = {'data': 'rest'}
|
||||
|
||||
self.wfile.write(json.dumps(msg).encode())
|
||||
|
||||
try:
|
||||
server = HTTPServer(('', httpport), UDPBridge)
|
||||
print('Started httpserver on port ' , httpport)
|
||||
|
||||
server.socket = ssl.wrap_socket (server.socket,
|
||||
keyfile="../web/localhost.key",
|
||||
certfile='../web/localhost.crt', server_side=True)
|
||||
|
||||
server.serve_forever()
|
||||
except KeyboardInterrupt:
|
||||
server.socket.close()
|
||||
|
Reference in New Issue
Block a user