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

59 lines 3.29 kB
import { decodeUint16, decodeUint64, decodeUint8, encodeUint16, encodeUint64, encodeUint8 } from "./codec/number.js"; import { flatMapDecoder, mapDecoder, mapDecoderOption, mapDecoders } from "./codec/tlsDecoder.js"; import { contramapEncoder, contramapEncoders } from "./codec/tlsEncoder.js"; import { decodeVarLenData, encodeVarLenData } from "./codec/variableLength.js"; import { expandWithLabel } from "./crypto/kdf.js"; import { enumNumberToKey } from "./util/enumHelpers.js"; export const pskTypes = { external: 1, resumption: 2, }; export const encodePskType = contramapEncoder(encodeUint8, (t) => pskTypes[t]); export const decodePskType = mapDecoderOption(decodeUint8, enumNumberToKey(pskTypes)); const resumptionPSKUsages = { application: 1, reinit: 2, branch: 3, }; export const encodeResumptionPSKUsage = contramapEncoder(encodeUint8, (u) => resumptionPSKUsages[u]); export const decodeResumptionPSKUsage = mapDecoderOption(decodeUint8, enumNumberToKey(resumptionPSKUsages)); const encodePskInfoExternal = contramapEncoders([encodePskType, encodeVarLenData], (i) => [i.psktype, i.pskId]); const encodePskInfoResumption = contramapEncoders([encodePskType, encodeResumptionPSKUsage, encodeVarLenData, encodeUint64], (info) => [info.psktype, info.usage, info.pskGroupId, info.pskEpoch]); const decodePskInfoResumption = mapDecoders([decodeResumptionPSKUsage, decodeVarLenData, decodeUint64], (usage, pskGroupId, pskEpoch) => { return { usage, pskGroupId, pskEpoch }; }); export const encodePskInfo = (info) => { switch (info.psktype) { case "external": return encodePskInfoExternal(info); case "resumption": return encodePskInfoResumption(info); } }; export const decodePskInfo = flatMapDecoder(decodePskType, (psktype) => { switch (psktype) { case "external": return mapDecoder(decodeVarLenData, (pskId) => ({ psktype, pskId, })); case "resumption": return mapDecoder(decodePskInfoResumption, (resumption) => ({ psktype, ...resumption, })); } }); export const encodePskId = contramapEncoders([encodePskInfo, encodeVarLenData], (pskid) => [pskid, pskid.pskNonce]); export const decodePskId = mapDecoders([decodePskInfo, decodeVarLenData], (info, pskNonce) => ({ ...info, pskNonce })); export const encodePskLabel = contramapEncoders([encodePskId, encodeUint16, encodeUint16], (label) => [label.id, label.index, label.count]); export const decodePskLabel = mapDecoders([decodePskId, decodeUint16, decodeUint16], (id, index, count) => ({ id, index, count })); export async function computePskSecret(psks, impl) { const zeroes = new Uint8Array(impl.kdf.size); return psks.reduce(async (acc, [curId, curPsk], index) => updatePskSecret(await acc, curId, curPsk, index, psks.length, impl), Promise.resolve(zeroes)); } export async function updatePskSecret(secret, pskId, psk, index, count, impl) { const zeroes = new Uint8Array(impl.kdf.size); return impl.kdf.extract(await expandWithLabel(await impl.kdf.extract(zeroes, psk), "derived psk", encodePskLabel({ id: pskId, index, count }), impl.kdf.size, impl.kdf), secret); } //# sourceMappingURL=presharedkey.js.map