blob: 7df1ba0402399d418278c99ea227fe85f26bbd3b [file] [edit]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test.js"></script>
<script src="../resources/common.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description("Test importing a PKCS8 ECDSA key with invalid length byte causing buffer overread");
// This test verifies that importing a malformed PKCS8 key where the final
// length byte has a large value (0xFF) is rejected gracefully.
// Without proper bounds checking, subvector(index) would access memory
// far beyond the buffer.
//
// Key structure (71 bytes):
// - Offset 0: 0x30 (SequenceMark - outer)
// - Offset 1: 0x00 (length byte)
// - Offset 2-4: 02 01 00 (Version)
// - Offset 5: 0x30 (SequenceMark - AlgorithmIdentifier)
// - Offset 6: 0x00 (length byte)
// - Offset 7-15: IdEcPublicKey OID (06 07 2a 86 48 ce 3d 02 01)
// - Offset 16-25: Secp256r1 OID (06 08 2a 86 48 ce 3d 03 01 07)
// - Offset 26: 0x04 (OCTET STRING)
// - Offset 27: 0x00 (length byte)
// - Offset 28: 0x30 (SEQUENCE - ECPrivateKey)
// - Offset 29: 0x00 (length byte)
// - Offset 30-32: 02 01 01 (PrivateKeyVersion)
// - Offset 33: 0x04 (OCTET STRING)
// - Offset 34: 0x00 (length byte)
// - Offset 35-66: 32 zero bytes (private key data)
// - Offset 67: 0xa1 (TaggedType1)
// - Offset 68: 0x00 (length byte)
// - Offset 69: 0x03 (BIT STRING)
// - Offset 70: 0xFF (length byte, bytesUsedToEncodedLength returns 128)
//
// At offset 70: bytesUsedToEncodedLength(0xFF) = 128
// index = 70 + 128 + 1 = 199
// keyData.subvector(199) on 71-byte buffer -> OOB access without bounds check
var extractable = true;
// 71 bytes: valid PKCS8 EC structure with IdEcPublicKey + Secp256r1 OIDs, then 0xFF length byte
var invalidLengthPkcs8Key = hexStringToUint8Array("3000020100300006072a8648ce3d020106082a8648ce3d0301070400300002010104000000000000000000000000000000000000000000000000000000000000000000a10003ff");
// Should reject with DataError, not crash or read beyond buffer
shouldReject('crypto.subtle.importKey("pkcs8", invalidLengthPkcs8Key, {name: "ECDSA", namedCurve: "P-256"}, extractable, ["sign"])');
</script>
</body>
</html>