@@ -44,14 +44,12 @@ import * as workersUtils from './workers/utils';
4444import TaskManager from './tasks/TaskManager' ;
4545import { serverManifest as clientServerManifest } from './client/handlers' ;
4646import { serverManifest as agentServerManifest } from './agent/handlers' ;
47+ import { webcrypto } from "crypto" ;
48+ import * as quicEvents from "@matrixai/quic/dist/events" ;
4749
4850// TODO: clean this up
4951type NetworkConfig = {
50- forwardHost ?: Host ;
51- forwardPort ?: Port ;
52- proxyHost ?: Host ;
53- proxyPort ?: Port ;
54- // GRPCServer for agent service
52+ // RPCServer for agent service
5553 agentHost ?: Host ;
5654 agentPort ?: Port ;
5755 // RPCServer for client service
@@ -167,7 +165,7 @@ class PolykeyAgent {
167165 initialClosestNodes ?: number ;
168166 } ;
169167 networkConfig ?: NetworkConfig ;
170- quicServerConfig : QUICServerConfig ;
168+ quicServerConfig ? : QUICServerConfig ;
171169 seedNodes ?: SeedNodes ;
172170 workers ?: number ;
173171 status ?: Status ;
@@ -191,7 +189,7 @@ class PolykeyAgent {
191189 webSocketServerClient ?: WebSocketServer ;
192190 rpcServerAgent ?: RPCServer ;
193191 quicSocket ?: QUICSocket ;
194- quicServerAgent : QUICServer ;
192+ quicServerAgent ? : QUICServer ;
195193 fs ?: FileSystem ;
196194 logger ?: Logger ;
197195 fresh ?: boolean ;
@@ -362,24 +360,43 @@ class PolykeyAgent {
362360 keyRing,
363361 logger : logger . getChild ( NodeGraph . name ) ,
364362 } ) ) ;
365- // TODO:
363+ // TODO: This needs to be changed and moved to a utils file
366364 const quicOpts : QUICCrypto = {
367- randomBytes ( _data : ArrayBuffer ) : Promise < void > {
368- return Promise . resolve ( undefined ) ;
365+ randomBytes : async ( data : ArrayBuffer ) => {
366+ const randomBytes = keysUtils . getRandomBytes ( data . byteLength ) ;
367+ const dataBuf = Buffer . from ( data ) ;
368+ // FIXME: is there a better way?
369+ dataBuf . write ( randomBytes . toString ( 'binary' ) , 'binary' ) ;
369370 } ,
370- sign ( _key : ArrayBuffer , _data : ArrayBuffer ) : Promise < ArrayBuffer > {
371- return Promise . resolve ( new ArrayBuffer ( 0 ) ) ;
371+ async sign ( key : ArrayBuffer , data : ArrayBuffer ) {
372+ const cryptoKey = await webcrypto . subtle . importKey (
373+ 'raw' ,
374+ key ,
375+ {
376+ name : 'HMAC' ,
377+ hash : 'SHA-256' ,
378+ } ,
379+ true ,
380+ [ 'sign' , 'verify' ] ,
381+ ) ;
382+ return webcrypto . subtle . sign ( 'HMAC' , cryptoKey , data ) ;
372383 } ,
373- verify (
374- _key : ArrayBuffer ,
375- _data : ArrayBuffer ,
376- _sig : ArrayBuffer ,
377- ) : Promise < boolean > {
378- return Promise . resolve ( false ) ;
384+ async verify ( key : ArrayBuffer , data : ArrayBuffer , sig : ArrayBuffer ) {
385+ const cryptoKey = await webcrypto . subtle . importKey (
386+ 'raw' ,
387+ key ,
388+ {
389+ name : 'HMAC' ,
390+ hash : 'SHA-256' ,
391+ } ,
392+ true ,
393+ [ 'sign' , 'verify' ] ,
394+ ) ;
395+ return webcrypto . subtle . verify ( 'HMAC' , cryptoKey , sig , data ) ;
379396 } ,
380397 } ;
381398 const quicCrypto = {
382- key : new ArrayBuffer ( 0 ) ,
399+ key : keysUtils . generateKey ( ) ,
383400 ops : quicOpts ,
384401 } ;
385402 const resolveHostname = ( host ) => {
@@ -545,14 +562,15 @@ class PolykeyAgent {
545562 privKeyPem : tlsConfig . keyPrivatePem ,
546563 certChainPem : tlsConfig . certChainPem ,
547564 } ,
548- verifyPeer : true ,
565+ verifyPeer : false , // FIXME: false until custom verification logic
549566 ...quicServerConfig ,
567+ logKeys : 'tmp/key.log' ,
550568 } ,
551569 crypto : quicCrypto ,
552570 logger : logger . getChild ( QUICServer . name + 'Agent' ) ,
553- keepaliveIntervalTime : 0 ,
554- maxReadableStreamBytes : 0 ,
555- maxWritableStreamBytes : 0 ,
571+ // keepaliveIntervalTime: 0, TODO
572+ // maxReadableStreamBytes: 0,
573+ // maxWritableStreamBytes: 0,
556574 socket : quicSocket ,
557575 resolveHostname,
558576 reasonToCode : utils . reasonToCode ,
@@ -871,7 +889,38 @@ class PolykeyAgent {
871889 port : _networkConfig . agentPort ,
872890 ipv6Only : false , // TODO: hardcode this?
873891 } ) ;
874- // TODO: set up stream event handling here
892+ // Setting up stream handling
893+ const handleStream = async ( event : quicEvents . QUICConnectionStreamEvent ) => {
894+ // Streams are handled via the RPCServer.
895+ const stream = event . detail ;
896+ this . logger . info ( '!!!!Handling new stream!!!!!' ) ;
897+ this . rpcServerAgent . handleStream ( stream ) ;
898+ } ;
899+
900+ const handleConnection = async (
901+ event : quicEvents . QUICServerConnectionEvent ,
902+ ) => {
903+ // Needs to setup stream handler
904+ const conn = event . detail ;
905+ this . logger . info ( '!!!!Handling new Connection!!!!!' ) ;
906+ conn . addEventListener ( 'stream' , handleStream ) ;
907+ conn . addEventListener (
908+ 'destroy' ,
909+ ( ) => {
910+ conn . removeEventListener ( 'stream' , handleStream ) ;
911+ } ,
912+ { once : true } ,
913+ ) ;
914+ } ;
915+ this . quicServerAgent . addEventListener ( 'connection' , handleConnection ) ;
916+ this . quicServerAgent . addEventListener (
917+ 'stop' ,
918+ ( ) => {
919+ this . quicServerAgent . removeEventListener ( 'connection' , handleConnection ) ;
920+ } ,
921+ { once : true } ,
922+ ) ;
923+ // Finished setting up handling
875924 await this . quicServerAgent . start ( {
876925 host : _networkConfig . agentHost ,
877926 port : _networkConfig . agentPort ,
0 commit comments