in modules/raw-aes-keyring-browser/src/raw_aes_keyring_browser.ts [193:231]
async function aesGcmWrapKey(
keyNamespace: string,
keyName: string,
material: WebCryptoEncryptionMaterial,
aad: Uint8Array,
wrappingMaterial: WebCryptoRawAesMaterial
): Promise<WebCryptoEncryptionMaterial> {
const backend = await backendForRawAesMasterKey()
const iv = await backend.randomValues(material.suite.ivLength)
const getSubtleInfo = currySubtleFunction(
wrappingMaterial,
backend,
'encrypt'
)
const info = new Uint8Array()
const { getSubtleEncrypt } = await getSubtleInfo(info)
const dataKey = unwrapDataKey(material.getUnencryptedDataKey())
const buffer = await getSubtleEncrypt(iv, aad)(dataKey)
const ciphertext = new Uint8Array(
buffer,
0,
buffer.byteLength - material.suite.tagLength / 8
)
const authTag = new Uint8Array(
buffer,
buffer.byteLength - material.suite.tagLength / 8
)
const edk = rawAesEncryptedDataKey(
keyNamespace,
keyName,
iv,
ciphertext,
authTag
)
return material.addEncryptedDataKey(edk, encryptFlags)
}