Skip to content

Commit aa56c7b

Browse files
author
nullagent
committed
support ephemeral match maker sessions
1 parent 00dee41 commit aa56c7b

3 files changed

Lines changed: 87 additions & 38 deletions

File tree

src/party/iparty.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ class IParty {
170170
if (!this.hasIdentity()){ return null }
171171

172172

173-
return dataparty_crypto.Identity.fromBSON(this._identity.toBSON())
173+
return dataparty_crypto.Identity.fromBSON(this._identity.toBSON(false))
174174
}
175175

176176
async setIdentity(newIdentity){

src/party/peer/match-maker-client.js

Lines changed: 65 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ class MatchMakerClient extends EventEmitter {
1616

1717
super()
1818

19+
1920
this.contacts = contacts
21+
this.sessionKey = null
2022
this.identity = identity
2123
this.wsParty = null
2224
this.restParty = null
@@ -47,9 +49,7 @@ class MatchMakerClient extends EventEmitter {
4749

4850

4951
async start(){
50-
/*
51-
*
52-
*/
52+
this.sessionKey = await dataparty_crypto.Identity.fromRandomSeed({id:'ephemeral-session-key'})
5353

5454
if(!this.restParty){
5555
let config = new MemoryConfig({
@@ -65,7 +65,7 @@ class MatchMakerClient extends EventEmitter {
6565
config
6666
})
6767

68-
if(this.identity){ await this.restParty.setIdentity(this.identity) }
68+
await this.restParty.setIdentity(this.sessionKey)
6969

7070
debug('starting restParty')
7171
await this.restParty.start()
@@ -102,7 +102,7 @@ class MatchMakerClient extends EventEmitter {
102102

103103
this.invitesRx = new this.wsParty.ROSLIB.Topic({
104104
ros : this.wsParty.comms.ros,
105-
name : '/invites/' + encodeURIComponent(this.restParty.identity.key.hash) + '/rx',
105+
name : '/invites/' + encodeURIComponent(this.identity.key.hash) + '/rx',
106106
messageType: 'Object'
107107
})
108108

@@ -111,7 +111,7 @@ class MatchMakerClient extends EventEmitter {
111111

112112
this.invitesTx = new this.wsParty.ROSLIB.Topic({
113113
ros : this.wsParty.comms.ros,
114-
name : '/invites/' + encodeURIComponent(this.restParty.identity.key.hash) + '/tx',
114+
name : '/invites/' + encodeURIComponent(this.identity.key.hash) + '/tx',
115115
messageType: 'Object'
116116
})
117117

@@ -161,13 +161,59 @@ class MatchMakerClient extends EventEmitter {
161161
}
162162
}
163163

164+
165+
/*
166+
167+
annoucement: {
168+
created: {
169+
type: Number,
170+
required: true
171+
},
172+
expiry: {
173+
type: Number,
174+
index: true,
175+
required: true
176+
},
177+
sessionKey: PublicKeySchema(true),
178+
actorKey: PublicKeySchema(false)
179+
},
180+
trust: {
181+
actorSig: {required: true, type: String}, //! base64 of BSON signature
182+
sessionSig: {required: true, type: String} //! base64 of BSON signature
183+
}
184+
}
185+
186+
*/
187+
188+
164189
async announcePublicKeys(){
165190
const announceData = {
166-
type: this.restParty.identity.key.type,
167-
hash: this.restParty.identity.key.hash,
168-
public: this.restParty.identity.key.public
191+
annoucement: {
192+
created: Date.now(),
193+
expiry: Date.now() + 24*60*60*1000, //! Set session expiry to 24hr from now
194+
sessionKey: {
195+
type: this.sessionKey.key.type,
196+
hash: this.sessionKey.key.hash,
197+
public: this.sessionKey.key.public
198+
},
199+
actorKey: {
200+
type: this.identity.key.type,
201+
hash: this.identity.key.hash,
202+
public: this.identity.key.public
203+
}
204+
},
205+
trust: {
206+
actorSig: null,
207+
sessionSig: null
208+
}
169209
}
170210

211+
const actorSigMsg = await this.identity.sign(announceData.annoucement, true)
212+
const sessionSigMsg = await this.sessionKey.sign(announceData.annoucement, true)
213+
214+
announceData.trust.actorSig = dataparty_crypto.Routines.Utils.base64.encode( actorSigMsg.sig )
215+
announceData.trust.sessionSig = dataparty_crypto.Routines.Utils.base64.encode( sessionSigMsg.sig )
216+
171217
debug('announcePublicKeys', announceData)
172218

173219
const announceResult = await this.restParty.comms.call('key/announce', announceData, {
@@ -181,8 +227,8 @@ class MatchMakerClient extends EventEmitter {
181227
async lookupPublicKey(hash){
182228
debug('lookupPublicKey - hash:', hash)
183229

184-
if(hash == this.restParty.identity.key.hash){
185-
return this.restParty.identity
230+
if(hash == this.identity.key.hash){
231+
return this.identity
186232
}
187233

188234
if(this.contacts){
@@ -229,7 +275,7 @@ class MatchMakerClient extends EventEmitter {
229275
service: service ? service : '@dataparty/video-chat',
230276
role: role ? role : 'client',
231277
timestamp: (new Date()).getTime(),
232-
from: this.wsParty.identity.key.hash,
278+
from: this.identity.key.hash,
233279
to: toIdentity.key.hash,
234280
session: session ? session : Math.random().toString(36).slice(2),
235281
info: info ? info : {
@@ -238,13 +284,13 @@ class MatchMakerClient extends EventEmitter {
238284
}
239285
}
240286

241-
const secureInvite = await this.wsParty.privateIdentity.encrypt(invitePayload, toIdentity)
287+
const secureInvite = await this.identity.encrypt(invitePayload, toIdentity)
242288

243289
debug('secure-invite', secureInvite)
244290

245291
const invitePostData = {
246292
to: toIdentity.key.hash,
247-
from: this.wsParty.identity.key.hash,
293+
from: this.identity.key.hash,
248294
payload: JSON.stringify(secureInvite.toJSON())
249295
}
250296

@@ -258,7 +304,7 @@ class MatchMakerClient extends EventEmitter {
258304

259305
if(!inviteDoc){ return }
260306

261-
let invite = new PeerInvite(inviteResult.invite, toIdentity, this, this.restParty.identity)
307+
let invite = new PeerInvite(inviteResult.invite, toIdentity, this, this.identity)
262308

263309
invite.payload = invitePayload
264310

@@ -270,10 +316,11 @@ class MatchMakerClient extends EventEmitter {
270316
}
271317

272318
async lookupInvites({createdAfter, type='to', id, actorHash }){
273-
let actor = this.wsParty.identity.key.hash
319+
let actor = this.identity.key.hash
274320

275321
const lookup = {
276-
invite:id, actor:actorHash ? actorHash : this.restParty.identity.key.hash,
322+
invite: id,
323+
actor: actorHash ? actorHash : this.identity.key.hash,
277324
createdAfter,
278325
type: !type ? 'to' : type
279326
}
@@ -336,7 +383,7 @@ class MatchMakerClient extends EventEmitter {
336383
async setInviteState(invite, newState){
337384

338385
debug('setInviteState')
339-
let actor = this.restParty.identity.key.hash
386+
let actor = this.identity.key.hash
340387

341388
const inviteState = {
342389
invite: invite.inviteDoc.$meta.id,

src/party/peer/peer-invite.js

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@ const END_STATES = [
1515
const TURN_PASSWORD='somethingsimple'
1616
const TURN_USERNAME='srs_demo'
1717

18+
const DEFAULT_ICE_SERVERS={
19+
iceServers: [
20+
{ urls: 'stun:st1.dataparty.xyz:3478'},
21+
{
22+
urls:'turns:st1.dataparty.xyz:5349',
23+
credential: TURN_PASSWORD,
24+
username: TURN_USERNAME
25+
}
26+
]
27+
}
28+
1829
async function delay(ms){
1930
return new Promise((resolve,reject)=>{
2031
setTimeout(resolve, ms)
@@ -58,11 +69,11 @@ class PeerInvite extends EventEmitter {
5869
isSender(doc){
5970

6071
if(doc){
61-
if(doc.toHash == matchMaker.wsParty.identity.key.hash){return false }
72+
if(doc.toHash == matchMaker.identity.key.hash){return false }
6273
else { return true }
6374
}
6475

65-
if(this.inviteDoc.toHash == matchMaker.wsParty.identity.key.hash){return false }
76+
if(this.inviteDoc.toHash == matchMaker.identity.key.hash){return false }
6677
else { return true }
6778
}
6879

@@ -91,7 +102,7 @@ class PeerInvite extends EventEmitter {
91102
let msgWorkAround = new dataparty_crypto.Message({})
92103
msgWorkAround.fromJSON(JSON.parse(changedInvite.payload))
93104

94-
let payload = await this.matchMaker.wsParty.privateIdentity.decrypt(
105+
let payload = await this.matchMaker.identity.decrypt(
95106
msgWorkAround
96107
)
97108

@@ -179,7 +190,7 @@ class PeerInvite extends EventEmitter {
179190
let msgWorkAround = new dataparty_crypto.Message({})
180191
msgWorkAround.fromJSON(msg.offers[i])
181192

182-
let offer = await party.privateIdentity.decrypt(msgWorkAround)
193+
let offer = await this.matchMaker.identity.decrypt(msgWorkAround)
183194

184195
if(offer.from.hash != otherIdentity.key.hash){
185196
debug('BAD IDENTITY')
@@ -200,9 +211,9 @@ class PeerInvite extends EventEmitter {
200211

201212
debug('subscribed to - ', this.topicSub.name)
202213

203-
if(this.isSender()){
204-
//await delay(500)
205-
}
214+
/*if(this.isSender()){
215+
await delay(500)
216+
}*/
206217

207218
this.peerParty = new PeerParty({
208219
comms: new RTCSocketComms({
@@ -215,17 +226,8 @@ class PeerInvite extends EventEmitter {
215226
trickle: rtcSettings.trickle? rtcSettings.trickle : true,
216227
iceTransportPolicy : rtcSettings.iceTransportPolicy ? rtcSettings.iceTransportPolicy : 'all',
217228
allowHalfTrickle: rtcSettings.allowHalfTrickle? rtcSettings.allowHalfTrickle : true,
218-
iceCompleteTimeout: 30*1000,
219-
config: {
220-
iceServers: [
221-
{ urls: 'stun:st1.dataparty.xyz:3478'},
222-
{
223-
urls:'turns:st1.dataparty.xyz:5349',
224-
credential: TURN_PASSWORD,
225-
username: TURN_USERNAME
226-
}
227-
]
228-
}
229+
iceCompleteTimeout: rtcSettings.iceCompleteTimeout ? rtcSettings.iceCompleteTimeout : 30*1000,
230+
config: DEFAULT_ICE_SERVERS
229231
},
230232
trickle: rtcSettings.trickle? rtcSettings.trickle : true,
231233
discoverRemoteIdentity: false,
@@ -266,7 +268,7 @@ class PeerInvite extends EventEmitter {
266268
debug(' >> offer signal trickle', data)
267269

268270

269-
const secureOffer = await party.privateIdentity.encrypt(data, otherIdentity)
271+
const secureOffer = await this.matchMaker.identity.encrypt(data, otherIdentity)
270272

271273
if(host && !sendFreely){
272274
//console.log('am host')

0 commit comments

Comments
 (0)