UNPKG

ts-mls

Version:

[![CI](https://github.com/LukaJCB/ts-mls/actions/workflows/ci.yml/badge.svg)](https://github.com/LukaJCB/ts-mls/actions/workflows/ci.yml) [![npm version](https://badge.fury.io/js/ts-mls.svg)](https://badge.fury.io/js/ts-mls) [![Coverage Status](https://co

47 lines 2.69 kB
import { decodeUint32, encodeUint32 } from "./codec/number.js"; import { mapDecoders } from "./codec/tlsDecoder.js"; import { contramapEncoders } from "./codec/tlsEncoder.js"; import { decodeVarLenData, decodeVarLenType, encodeVarLenData, encodeVarLenType } from "./codec/variableLength.js"; import { deriveSecret } from "./crypto/kdf.js"; import { signWithLabel, verifyWithLabel } from "./crypto/signature.js"; import { decodeExtension, encodeExtension } from "./extension.js"; import { decodeGroupContext, encodeGroupContext, extractEpochSecret } from "./groupContext.js"; import { CodecError } from "./mlsError.js"; import { decodeRatchetTree } from "./ratchetTree.js"; export const encodeGroupInfoTBS = contramapEncoders([encodeGroupContext, encodeVarLenType(encodeExtension), encodeVarLenData, encodeUint32], (g) => [g.groupContext, g.extensions, g.confirmationTag, g.signer]); export const decodeGroupInfoTBS = mapDecoders([decodeGroupContext, decodeVarLenType(decodeExtension), decodeVarLenData, decodeUint32], (groupContext, extensions, confirmationTag, signer) => ({ groupContext, extensions, confirmationTag, signer, })); export const encodeGroupInfo = contramapEncoders([encodeGroupInfoTBS, encodeVarLenData], (g) => [g, g.signature]); export const decodeGroupInfo = mapDecoders([decodeGroupInfoTBS, decodeVarLenData], (tbs, signature) => ({ ...tbs, signature, })); export function ratchetTreeFromExtension(info) { const treeExtension = info.extensions.find((ex) => ex.extensionType === "ratchet_tree"); if (treeExtension !== undefined) { const tree = decodeRatchetTree(treeExtension.extensionData, 0); if (tree === undefined) throw new CodecError("Could not decode RatchetTree"); return tree[0]; } } export async function signGroupInfo(tbs, privateKey, s) { const signature = await signWithLabel(privateKey, "GroupInfoTBS", encodeGroupInfoTBS(tbs), s); return { ...tbs, signature }; } export function verifyGroupInfoSignature(gi, publicKey, s) { return verifyWithLabel(publicKey, "GroupInfoTBS", encodeGroupInfoTBS(gi), gi.signature, s); } export async function verifyGroupInfoConfirmationTag(gi, joinerSecret, pskSecret, cs) { const epochSecret = await extractEpochSecret(gi.groupContext, joinerSecret, cs.kdf, pskSecret); const key = await deriveSecret(epochSecret, "confirm", cs.kdf); return cs.hash.verifyMac(key, gi.confirmationTag, gi.groupContext.confirmedTranscriptHash); } export async function extractWelcomeSecret(joinerSecret, pskSecret, kdf) { return deriveSecret(await kdf.extract(joinerSecret, pskSecret), "welcome", kdf); } //# sourceMappingURL=groupInfo.js.map