66 lines
2.5 KiB
TypeScript
Raw Normal View History

2020-06-19 12:49:40 +02:00
import { Buffer } from 'buffer'
import { IK } from '../../src/handshakes/ik'
import { KeyPair } from '../../src/@types/libp2p'
import { createHandshakePayload, generateKeypair, getHandshakePayload } from '../../src/utils'
import { assert, expect } from 'chai'
import { generateEd25519Keys } from '../utils'
2019-12-25 22:02:07 +01:00
2020-06-19 12:49:40 +02:00
describe('IK handshake', () => {
const prologue = Buffer.alloc(0)
2019-12-25 22:02:07 +01:00
2020-06-19 12:49:40 +02:00
it('Test complete IK handshake', async () => {
2019-12-25 22:02:07 +01:00
try {
2020-06-19 12:49:40 +02:00
const ikI = new IK()
const ikR = new IK()
2019-12-25 22:02:07 +01:00
// Generate static noise keys
2020-06-19 12:49:40 +02:00
const kpInitiator: KeyPair = await generateKeypair()
const kpResponder: KeyPair = await generateKeypair()
2019-12-25 22:02:07 +01:00
// Generate libp2p keys
2020-06-19 12:49:40 +02:00
const libp2pInitKeys = await generateEd25519Keys()
const libp2pRespKeys = await generateEd25519Keys()
2019-12-25 22:02:07 +01:00
// Create sessions
2020-06-19 12:49:40 +02:00
const initiatorSession = await ikI.initSession(true, prologue, kpInitiator, kpResponder.publicKey)
const responderSession = await ikR.initSession(false, prologue, kpResponder, Buffer.alloc(32))
2019-12-25 22:02:07 +01:00
/* Stage 0 */
// initiator creates payload
2020-06-19 12:49:40 +02:00
const initSignedPayload = await libp2pInitKeys.sign(getHandshakePayload(kpInitiator.publicKey))
2020-06-19 13:06:31 +02:00
libp2pInitKeys.marshal().slice(0, 32)
2020-06-19 12:49:40 +02:00
const libp2pInitPubKey = libp2pInitKeys.marshal().slice(32, 64)
const payloadInitEnc = await createHandshakePayload(libp2pInitPubKey, initSignedPayload)
2019-12-25 22:02:07 +01:00
// initiator sends message
2020-06-19 12:49:40 +02:00
const message = Buffer.concat([Buffer.alloc(0), payloadInitEnc])
const messageBuffer = ikI.sendMessage(initiatorSession, message)
2019-12-25 22:02:07 +01:00
2020-06-19 12:49:40 +02:00
expect(messageBuffer.ne.length).not.equal(0)
2019-12-25 22:02:07 +01:00
// responder receives message
2020-06-19 13:06:31 +02:00
ikR.recvMessage(responderSession, messageBuffer)
2019-12-25 22:02:07 +01:00
/* Stage 1 */
// responder creates payload
2020-06-19 13:06:31 +02:00
libp2pRespKeys.marshal().slice(0, 32)
2020-06-19 12:49:40 +02:00
const libp2pRespPubKey = libp2pRespKeys.marshal().slice(32, 64)
const respSignedPayload = await libp2pRespKeys.sign(getHandshakePayload(kpResponder.publicKey))
const payloadRespEnc = await createHandshakePayload(libp2pRespPubKey, respSignedPayload)
2019-12-25 22:02:07 +01:00
2020-06-19 12:49:40 +02:00
const message1 = Buffer.concat([message, payloadRespEnc])
const messageBuffer2 = ikR.sendMessage(responderSession, message1)
2019-12-25 22:02:07 +01:00
2019-12-25 22:08:18 +01:00
// initiator receives message
2020-06-19 13:06:31 +02:00
ikI.recvMessage(initiatorSession, messageBuffer2)
2019-12-25 22:02:07 +01:00
2021-01-26 21:39:37 +00:00
assert(initiatorSession?.cs1?.k.equals(responderSession?.cs1?.k ?? new Uint8Array()))
assert(initiatorSession?.cs2?.k.equals(responderSession?.cs2?.k ?? new Uint8Array()))
2019-12-25 22:02:07 +01:00
} catch (e) {
2020-06-19 12:49:40 +02:00
return assert(false, e.message)
2019-12-25 22:02:07 +01:00
}
2020-06-19 12:49:40 +02:00
})
})