Skip to content

Commit b556717

Browse files
committed
LibWeb: Fix Ed448 raw key length check in importKey
Ed448 public keys are 57 bytes (456 bits), not 56 bytes (448 bits). The curve is named "Ed448" after its 448-bit prime field, but per RFC 8032 Section 5.2.5, the parameter b=456 and both private and public keys are 57 bytes. This caused importKey to reject valid raw Ed448 public keys with a DataError. Note: The spec incorrectly says "not 448" for this check. See w3c/webcrypto#425 (comment)
1 parent 3e18136 commit b556717

4 files changed

Lines changed: 106 additions & 2 deletions

File tree

‎Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6664,8 +6664,8 @@ WebIDL::ExceptionOr<GC::Ref<CryptoKey>> ED448::import_key(
66646664
// 2. Let data be keyData.
66656665
auto data = move(key_data.get<ByteBuffer>());
66666666

6667-
// 3. If the length in bits of data is not 448 then throw a DataError.
6668-
if (data.size() * 8 != 448)
6667+
// 3. If the length in bits of data is not 456 then throw a DataError.
6668+
if (data.size() * 8 != 456)
66696669
return WebIDL::DataError::create(m_realm, "Invalid key length"_utf16);
66706670

66716671
// 4. Let algorithm be a new KeyAlgorithm object.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
Harness status: OK
2+
3+
Found 72 tests
4+
5+
72 Pass
6+
Pass Good parameters: Ed448 bits (spki, buffer(69), {name: Ed448}, true, [verify])
7+
Pass Good parameters: Ed448 bits (spki, buffer(69), Ed448, true, [verify])
8+
Pass Good parameters: Ed448 bits (jwk, object(kty, crv, x), {name: Ed448}, true, [verify])
9+
Pass Good parameters: Ed448 bits (jwk, object(kty, crv, x), Ed448, true, [verify])
10+
Pass Good parameters with JWK alg Ed448: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [verify])
11+
Pass Good parameters with JWK alg EdDSA: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [verify])
12+
Pass Good parameters with JWK alg Ed448: Ed448 (jwk, object(kty, crv, x), Ed448, true, [verify])
13+
Pass Good parameters with JWK alg EdDSA: Ed448 (jwk, object(kty, crv, x), Ed448, true, [verify])
14+
Pass Good parameters: Ed448 bits (raw, buffer(57), {name: Ed448}, true, [verify])
15+
Pass Good parameters: Ed448 bits (raw, buffer(57), Ed448, true, [verify])
16+
Pass Good parameters: Ed448 bits (spki, buffer(69), {name: Ed448}, true, [])
17+
Pass Good parameters: Ed448 bits (spki, buffer(69), Ed448, true, [])
18+
Pass Good parameters: Ed448 bits (jwk, object(kty, crv, x), {name: Ed448}, true, [])
19+
Pass Good parameters: Ed448 bits (jwk, object(kty, crv, x), Ed448, true, [])
20+
Pass Good parameters with JWK alg Ed448: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [])
21+
Pass Good parameters with JWK alg EdDSA: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [])
22+
Pass Good parameters with JWK alg Ed448: Ed448 (jwk, object(kty, crv, x), Ed448, true, [])
23+
Pass Good parameters with JWK alg EdDSA: Ed448 (jwk, object(kty, crv, x), Ed448, true, [])
24+
Pass Good parameters: Ed448 bits (raw, buffer(57), {name: Ed448}, true, [])
25+
Pass Good parameters: Ed448 bits (raw, buffer(57), Ed448, true, [])
26+
Pass Good parameters: Ed448 bits (spki, buffer(69), {name: Ed448}, true, [verify, verify])
27+
Pass Good parameters: Ed448 bits (spki, buffer(69), Ed448, true, [verify, verify])
28+
Pass Good parameters: Ed448 bits (jwk, object(kty, crv, x), {name: Ed448}, true, [verify, verify])
29+
Pass Good parameters: Ed448 bits (jwk, object(kty, crv, x), Ed448, true, [verify, verify])
30+
Pass Good parameters with JWK alg Ed448: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [verify, verify])
31+
Pass Good parameters with JWK alg EdDSA: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [verify, verify])
32+
Pass Good parameters with JWK alg Ed448: Ed448 (jwk, object(kty, crv, x), Ed448, true, [verify, verify])
33+
Pass Good parameters with JWK alg EdDSA: Ed448 (jwk, object(kty, crv, x), Ed448, true, [verify, verify])
34+
Pass Good parameters: Ed448 bits (raw, buffer(57), {name: Ed448}, true, [verify, verify])
35+
Pass Good parameters: Ed448 bits (raw, buffer(57), Ed448, true, [verify, verify])
36+
Pass Good parameters: Ed448 bits (pkcs8, buffer(73), {name: Ed448}, true, [sign])
37+
Pass Good parameters: Ed448 bits (pkcs8, buffer(73), Ed448, true, [sign])
38+
Pass Good parameters: Ed448 bits (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign])
39+
Pass Good parameters: Ed448 bits (jwk, object(crv, d, x, kty), Ed448, true, [sign])
40+
Pass Good parameters with JWK alg Ed448: Ed448 (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign])
41+
Pass Good parameters with JWK alg EdDSA: Ed448 (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign])
42+
Pass Good parameters with JWK alg Ed448: Ed448 (jwk, object(crv, d, x, kty), Ed448, true, [sign])
43+
Pass Good parameters with JWK alg EdDSA: Ed448 (jwk, object(crv, d, x, kty), Ed448, true, [sign])
44+
Pass Good parameters: Ed448 bits (pkcs8, buffer(73), {name: Ed448}, true, [sign, sign])
45+
Pass Good parameters: Ed448 bits (pkcs8, buffer(73), Ed448, true, [sign, sign])
46+
Pass Good parameters: Ed448 bits (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign, sign])
47+
Pass Good parameters: Ed448 bits (jwk, object(crv, d, x, kty), Ed448, true, [sign, sign])
48+
Pass Good parameters with JWK alg Ed448: Ed448 (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign, sign])
49+
Pass Good parameters with JWK alg EdDSA: Ed448 (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign, sign])
50+
Pass Good parameters with JWK alg Ed448: Ed448 (jwk, object(crv, d, x, kty), Ed448, true, [sign, sign])
51+
Pass Good parameters with JWK alg EdDSA: Ed448 (jwk, object(crv, d, x, kty), Ed448, true, [sign, sign])
52+
Pass Good parameters: Ed448 bits (spki, buffer(69), {name: Ed448}, false, [verify])
53+
Pass Good parameters: Ed448 bits (spki, buffer(69), Ed448, false, [verify])
54+
Pass Good parameters: Ed448 bits (jwk, object(kty, crv, x), {name: Ed448}, false, [verify])
55+
Pass Good parameters: Ed448 bits (jwk, object(kty, crv, x), Ed448, false, [verify])
56+
Pass Good parameters: Ed448 bits (raw, buffer(57), {name: Ed448}, false, [verify])
57+
Pass Good parameters: Ed448 bits (raw, buffer(57), Ed448, false, [verify])
58+
Pass Good parameters: Ed448 bits (spki, buffer(69), {name: Ed448}, false, [])
59+
Pass Good parameters: Ed448 bits (spki, buffer(69), Ed448, false, [])
60+
Pass Good parameters: Ed448 bits (jwk, object(kty, crv, x), {name: Ed448}, false, [])
61+
Pass Good parameters: Ed448 bits (jwk, object(kty, crv, x), Ed448, false, [])
62+
Pass Good parameters: Ed448 bits (raw, buffer(57), {name: Ed448}, false, [])
63+
Pass Good parameters: Ed448 bits (raw, buffer(57), Ed448, false, [])
64+
Pass Good parameters: Ed448 bits (spki, buffer(69), {name: Ed448}, false, [verify, verify])
65+
Pass Good parameters: Ed448 bits (spki, buffer(69), Ed448, false, [verify, verify])
66+
Pass Good parameters: Ed448 bits (jwk, object(kty, crv, x), {name: Ed448}, false, [verify, verify])
67+
Pass Good parameters: Ed448 bits (jwk, object(kty, crv, x), Ed448, false, [verify, verify])
68+
Pass Good parameters: Ed448 bits (raw, buffer(57), {name: Ed448}, false, [verify, verify])
69+
Pass Good parameters: Ed448 bits (raw, buffer(57), Ed448, false, [verify, verify])
70+
Pass Good parameters: Ed448 bits (pkcs8, buffer(73), {name: Ed448}, false, [sign])
71+
Pass Good parameters: Ed448 bits (pkcs8, buffer(73), Ed448, false, [sign])
72+
Pass Good parameters: Ed448 bits (jwk, object(crv, d, x, kty), {name: Ed448}, false, [sign])
73+
Pass Good parameters: Ed448 bits (jwk, object(crv, d, x, kty), Ed448, false, [sign])
74+
Pass Good parameters: Ed448 bits (pkcs8, buffer(73), {name: Ed448}, false, [sign, sign])
75+
Pass Good parameters: Ed448 bits (pkcs8, buffer(73), Ed448, false, [sign, sign])
76+
Pass Good parameters: Ed448 bits (jwk, object(crv, d, x, kty), {name: Ed448}, false, [sign, sign])
77+
Pass Good parameters: Ed448 bits (jwk, object(crv, d, x, kty), Ed448, false, [sign, sign])
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<!doctype html>
2+
<meta charset=utf-8>
3+
<title>WebCryptoAPI: importKey() for OKP keys</title>
4+
<meta name="timeout" content="long">
5+
<script>
6+
self.GLOBAL = {
7+
isWindow: function() { return true; },
8+
isWorker: function() { return false; },
9+
isShadowRealm: function() { return false; },
10+
};
11+
</script>
12+
<script src="../../resources/testharness.js"></script>
13+
<script src="../../resources/testharnessreport.js"></script>
14+
<script src="../util/helpers.js"></script>
15+
<script src="okp_importKey_fixtures.js"></script>
16+
<script src="okp_importKey.js"></script>
17+
<div id=log></div>
18+
<script src="../../WebCryptoAPI/import_export/okp_importKey_Ed448.tentative.https.any.js"></script>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// META: title=WebCryptoAPI: importKey() for OKP keys
2+
// META: timeout=long
3+
// META: script=../util/helpers.js
4+
// META: script=okp_importKey_fixtures.js
5+
// META: script=okp_importKey.js
6+
7+
8+
// Test importKey and exportKey for OKP algorithms.
9+
runTests("Ed448");

0 commit comments

Comments
 (0)