@signalapp/mock-server
Version:
Mock Signal Server for writing tests
51 lines (50 loc) • 1.9 kB
JavaScript
;
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStrpKeyMaterial = getStrpKeyMaterial;
exports.deriveStrpClientAndServer = deriveStrpClientAndServer;
const libsignal_client_1 = require("@signalapp/libsignal-client");
const KEY_LABEL = Buffer.from('Signal_Group_Call_20211105_SignallingDH_SRTPKey_KDF');
const KEY_LENGTH = 16;
const SALT_LENGTH = 12;
// In the order [client_key, client_salt, server_key, server_salt]
const KEY_MATERIAL_LENGTH = KEY_LENGTH + SALT_LENGTH + KEY_LENGTH + SALT_LENGTH;
function getStrpKeyMaterial(params) {
const clientHkdfExtraInfo = params.clientHkdfExtraInfo ?? Buffer.alloc(0);
const keyMaterial = (0, libsignal_client_1.hkdf)(KEY_MATERIAL_LENGTH, params.sharedSecret, Buffer.concat([KEY_LABEL, clientHkdfExtraInfo]), null);
return keyMaterial;
}
function deriveStrpClientAndServer(keyMaterial) {
const mid = KEY_LENGTH + SALT_LENGTH;
return {
client: deriveKeyPairs({
key: keyMaterial.subarray(0, KEY_LENGTH),
salt: keyMaterial.subarray(KEY_LENGTH, mid),
}),
server: deriveKeyPairs({
key: keyMaterial.subarray(mid, mid + KEY_LENGTH),
salt: keyMaterial.subarray(mid + KEY_LENGTH),
}),
};
}
function deriveKeyPairs(master) {
return {
rtp: {
key: deriveKey(master, 0),
salt: deriveSalt(master, 2),
},
rtcp: {
key: deriveKey(master, 3),
salt: deriveSalt(master, 5),
},
};
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function deriveKey(keyPair, label) {
throw new Error('unimplemented');
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function deriveSalt(keyPair, label) {
throw new Error('unimplemented');
}