in modules/raw-aes-keyring-browser/src/raw_aes_keyring_browser.ts [65:140]
constructor(input: RawAesKeyringWebCryptoInput) {
super()
const { keyName, keyNamespace, masterKey, wrappingSuite, utf8Sorting } =
input
/* Precondition: AesKeyringWebCrypto needs identifying information for encrypt and decrypt. */
needs(keyName && keyNamespace, 'Identifying information must be defined.')
/* Precondition: RawAesKeyringWebCrypto requires a wrappingSuite to be a valid RawAesWrappingSuite. */
const wrappingMaterial = new WebCryptoRawAesMaterial(wrappingSuite)
/* Precondition: unencryptedMasterKey must correspond to the WebCryptoAlgorithmSuite specification.
* Note: the KeyringTrace and flag are _only_ set because I am reusing an existing implementation.
* See: raw_aes_material.ts in @aws-crypto/raw-keyring for details
*/
.setCryptoKey(masterKey, {
keyNamespace,
keyName,
flags: KeyringTraceFlag.WRAPPING_KEY_GENERATED_DATA_KEY,
})
if (utf8Sorting === undefined) {
readOnlyProperty(this, '_utf8Sorting', false)
} else {
readOnlyProperty(this, '_utf8Sorting', utf8Sorting)
}
// default will be false
const { serializeEncryptionContext } = serializeFactory(fromUtf8, {
utf8Sorting: this._utf8Sorting,
})
const _wrapKey = async (material: WebCryptoEncryptionMaterial) => {
/* The AAD section is uInt16BE(length) + AAD
* see: https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/message-format.html#header-aad
* However, the RAW Keyring wants _only_ the ADD.
* So, I just slice off the length.
*/
const aad = serializeEncryptionContext(material.encryptionContext).slice(
2
)
const { keyNamespace, keyName } = this
return aesGcmWrapKey(
keyNamespace,
keyName,
material,
aad,
wrappingMaterial
)
}
const _unwrapKey = async (
material: WebCryptoDecryptionMaterial,
edk: EncryptedDataKey
) => {
/* The AAD section is uInt16BE(length) + AAD
* see: https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/message-format.html#header-aad
* However, the RAW Keyring wants _only_ the ADD.
* So, I just slice off the length.
*/
const aad = serializeEncryptionContext(material.encryptionContext).slice(
2
)
const { keyNamespace, keyName } = this
return aesGcmUnwrapKey(
keyNamespace,
keyName,
material,
wrappingMaterial,
edk,
aad
)
}
readOnlyProperty(this, 'keyName', keyName)
readOnlyProperty(this, 'keyNamespace', keyNamespace)
readOnlyProperty(this, '_wrapKey', _wrapKey)
readOnlyProperty(this, '_unwrapKey', _unwrapKey)
}