Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
const { id, ivLength } = material.suite
const messageHeader: MessageHeader = Object.freeze({
version: SerializationVersion.V1,
type: ObjectType.CUSTOMER_AE_DATA,
suiteId: id,
messageId,
encryptionContext,
encryptedDataKeys: Object.freeze(material.encryptedDataKeys), // freeze me please
contentType: ContentType.FRAMED_DATA,
headerIvLength: ivLength,
frameLength
})
const { buffer, byteOffset, byteLength } = serializeMessageHeader(messageHeader)
const headerBuffer = Buffer.from(buffer, byteOffset, byteLength)
const info = kdfInfo(messageHeader.suiteId, messageHeader.messageId)
const getCipher = kdfGetCipher(info)
const headerIv = headerAuthIv(ivLength)
const validateHeader = getCipher(headerIv)
validateHeader.setAAD(headerBuffer)
validateHeader.update(Buffer.alloc(0))
validateHeader.final()
const headerAuth = validateHeader.getAuthTag()
return {
getCipher,
messageHeader,
rawHeader: [headerBuffer, headerIv, headerAuth]
}
}
const { id, ivLength } = material.suite
const messageHeader: MessageHeader = {
version: SerializationVersion.V1,
type: ObjectType.CUSTOMER_AE_DATA,
suiteId: id,
messageId,
encryptionContext: material.encryptionContext,
encryptedDataKeys: material.encryptedDataKeys,
contentType: ContentType.FRAMED_DATA,
headerIvLength: ivLength,
frameLength
}
const header = serialize.serializeMessageHeader(messageHeader)
const info = kdfInfo(id, messageId)
const getSubtleEncrypt = kdfGetSubtleEncrypt(info)
const headerAuthIv = serialize.headerAuthIv(ivLength)
const headerAuthTag = await getSubtleEncrypt(headerAuthIv, header)(new Uint8Array(0))
const numberOfFrames = Math.ceil(plaintextLength / frameLength)
/* The final frame has a variable length.
* The value needs to be known, but should only be calculated once.
* So I calculate how much of a frame I should have at the end.
*/
const finalFrameLength = frameLength - ((numberOfFrames * frameLength) - plaintextLength)
const bodyContent = []
for (let sequenceNumber = 1; numberOfFrames >= sequenceNumber; sequenceNumber += 1) {
const frameIv = serialize.frameIv(ivLength, sequenceNumber)
const isFinalFrame = sequenceNumber === numberOfFrames
): Promise {
/* If the cmm is a Keyring, wrap it with WebCryptoDefaultCryptographicMaterialsManager. */
cmm = cmm instanceof KeyringWebCrypto
? new WebCryptoDefaultCryptographicMaterialsManager(cmm)
: cmm
const headerInfo = deserialize.deserializeMessageHeader(ciphertext)
if (headerInfo === false) throw new Error('Unable to parse Header')
const { messageHeader } = headerInfo
const { rawHeader, headerIv, headerAuthTag } = headerInfo
const { encryptionContext, encryptedDataKeys, suiteId, messageId } = messageHeader
const suite = new WebCryptoAlgorithmSuite(suiteId)
const material = await cmm.decryptMaterials({ suite, encryptionContext, encryptedDataKeys })
const { kdfGetSubtleDecrypt, subtleVerify, dispose } = await getDecryptionHelper(material)
const info = kdfInfo(suiteId, messageId)
const getSubtleDecrypt = kdfGetSubtleDecrypt(info)
// The tag is appended to the Data
await getSubtleDecrypt(headerIv, rawHeader)(headerAuthTag) // will throw if invalid
const { plaintext, readPos } = await bodyDecrypt({ buffer: ciphertext, getSubtleDecrypt, headerInfo })
dispose()
if (subtleVerify) {
const data = ciphertext.slice(0, readPos)
const signatureInfo = ciphertext.slice(readPos)
const derSignature = deserializeSignature(signatureInfo)
const rawSignature = der2raw(derSignature, material.suite)