Skip to content

Commit dc1f92e

Browse files
authored
fix: frame length can not be 0 (#149)
resolves #129 The other ESDK’s use frameLength === 0 to indicate non-framed content. The JS ESDK does not support encrypting non-framed content. A frameLength of 0 will crash the process. Add condition and test.
1 parent d73d50d commit dc1f92e

File tree

4 files changed

+23
-3
lines changed

4 files changed

+23
-3
lines changed

modules/encrypt-browser/src/encrypt.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
AlgorithmSuiteIdentifier,
2222
getEncryptHelper,
2323
KeyringWebCrypto,
24+
needs,
2425
WebCryptoMaterialsManager // eslint-disable-line no-unused-vars
2526
} from '@aws-crypto/material-management-browser'
2627
import {
@@ -35,7 +36,8 @@ import {
3536
serializeSignatureInfo,
3637
FRAME_LENGTH,
3738
MESSAGE_ID_LENGTH,
38-
raw2der
39+
raw2der,
40+
Maximum
3941
} from '@aws-crypto/serialize'
4042
import { fromUtf8 } from '@aws-sdk/util-utf8-browser'
4143
import { getWebCryptoBackend } from '@aws-crypto/web-crypto-backend'
@@ -60,6 +62,9 @@ export async function encrypt (
6062
plaintext: Uint8Array,
6163
{ suiteId, encryptionContext, frameLength = FRAME_LENGTH }: EncryptInput = {}
6264
): Promise<EncryptResult> {
65+
/* Precondition: The frameLength must be less than the maximum frame size for browser encryption. */
66+
needs(frameLength > 0 && Maximum.FRAME_SIZE >= frameLength, `frameLength out of bounds: 0 > frameLength >= ${Maximum.FRAME_SIZE}`)
67+
6368
const backend = await getWebCryptoBackend()
6469
if (!backend) throw new Error('No supported crypto backend')
6570

modules/encrypt-browser/test/encrypt.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,9 @@ describe('encrypt structural testing', () => {
8585

8686
expect(messageHeader).to.deep.equal(messageInfo.messageHeader)
8787
})
88+
89+
it('Precondition: The frameLength must be less than the maximum frame size for browser encryption.', async () => {
90+
const frameLength = 0
91+
expect(encrypt(keyRing, 'asdf', { frameLength })).to.rejectedWith(Error)
92+
})
8893
})

modules/encrypt-node/src/encrypt_stream.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
import {
1717
NodeDefaultCryptographicMaterialsManager, NodeAlgorithmSuite, AlgorithmSuiteIdentifier, // eslint-disable-line no-unused-vars
1818
KeyringNode, NodeEncryptionMaterial, getEncryptHelper, EncryptionContext, // eslint-disable-line no-unused-vars
19-
NodeMaterialsManager // eslint-disable-line no-unused-vars
19+
NodeMaterialsManager, // eslint-disable-line no-unused-vars
20+
needs
2021
} from '@aws-crypto/material-management-node'
2122
import { getFramedEncryptStream } from './framed_encrypt_stream'
2223
import { SignatureStream } from './signature_stream'
@@ -26,7 +27,8 @@ import {
2627
MessageHeader, // eslint-disable-line no-unused-vars
2728
serializeFactory, kdfInfo, ContentType, SerializationVersion, ObjectType,
2829
FRAME_LENGTH,
29-
MESSAGE_ID_LENGTH
30+
MESSAGE_ID_LENGTH,
31+
Maximum
3032
} from '@aws-crypto/serialize'
3133

3234
// @ts-ignore
@@ -56,6 +58,9 @@ export function encryptStream (
5658
): Duplex {
5759
const { suiteId, context, frameLength = FRAME_LENGTH } = op
5860

61+
/* Precondition: The frameLength must be less than the maximum frame size Node.js stream. */
62+
needs(frameLength > 0 && Maximum.FRAME_SIZE >= frameLength, `frameLength out of bounds: 0 > frameLength >= ${Maximum.FRAME_SIZE}`)
63+
5964
/* If the cmm is a Keyring, wrap it with NodeDefaultCryptographicMaterialsManager. */
6065
cmm = cmm instanceof KeyringNode
6166
? new NodeDefaultCryptographicMaterialsManager(cmm)

modules/encrypt-node/test/encrypt.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,11 @@ describe('encrypt structural testing', () => {
184184

185185
expect(messageHeader).to.deep.equal(messageInfo.messageHeader)
186186
})
187+
188+
it('Precondition: The frameLength must be less than the maximum frame size Node.js stream.', async () => {
189+
const frameLength = 0
190+
expect(encrypt(keyRing, 'asdf', { frameLength })).to.rejectedWith(Error)
191+
})
187192
})
188193

189194
function finishedAsync (stream: any) {

0 commit comments

Comments
 (0)