Skip to content

Commit 3abe0e4

Browse files
committed
https://bugs.webkit.org/show_bug.cgi?id=246145 rdar://problem/100401588 Reviewed by Chris Dumez. Introduce CryptoKeyOKP to support secure safe curves. Add support for generating, importing and exporting Ed25519 keys. Add a runtime flag to control exposing the support. This patch reuses work done in #5026 by Angela Izquierdo Garcia. * LayoutTests/http/wpt/crypto/serialize-cryptokey-okp-expected.txt: Added. * LayoutTests/http/wpt/crypto/serialize-cryptokey-okp.html: Added. * LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/import_export/okp_importKey.https.any-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/import_export/okp_importKey.https.any.worker-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/import_export/okp_importKey_failures_Ed25519.https.any-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/import_export/okp_importKey_failures_Ed25519.https.any.worker-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/sign_verify/eddsa.https.any-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/sign_verify/eddsa.https.any.worker-expected.txt: * LayoutTests/platform/glib/TestExpectations: * Source/WebCore/PAL/PAL.xcodeproj/project.pbxproj: * Source/WebCore/PAL/pal/spi/cocoa/CoreCryptoSPI.h: Added. (cccurve25519_make_priv): (cccurve25519_make_pub): (cccurve25519_make_key_pair): * Source/WebCore/Sources.txt: * Source/WebCore/SourcesCocoa.txt: * Source/WebCore/WebCore.xcodeproj/project.pbxproj: * Source/WebCore/bindings/js/SerializedScriptValue.cpp: (WebCore::CloneSerializer::write): (WebCore::CloneDeserializer::read): (WebCore::CloneDeserializer::readOKPKey): (WebCore::CloneDeserializer::readCryptoKey): * Source/WebCore/crypto/CryptoAlgorithmIdentifier.h: * Source/WebCore/crypto/CryptoKey.h: * Source/WebCore/crypto/SubtleCrypto.cpp: (WebCore::normalizeCryptoAlgorithmParameters): (WebCore::isSupportedExportKey): * Source/WebCore/crypto/algorithms/CryptoAlgorithmEd25519.cpp: Added. (WebCore::CryptoAlgorithmEd25519::platformSign): (WebCore::CryptoAlgorithmEd25519::platformVerify): (WebCore::CryptoAlgorithmEd25519::create): (WebCore::CryptoAlgorithmEd25519::identifier const): (WebCore::CryptoAlgorithmEd25519::generateKey): (WebCore::CryptoAlgorithmEd25519::sign): (WebCore::CryptoAlgorithmEd25519::verify): (WebCore::CryptoAlgorithmEd25519::importKey): (WebCore::CryptoAlgorithmEd25519::exportKey): * Source/WebCore/crypto/algorithms/CryptoAlgorithmEd25519.h: Added. * Source/WebCore/crypto/keys/CryptoKeyOKP.cpp: Added. (WebCore::keySizeInBytesFromNamedCurve): (WebCore::CryptoKeyOKP::create): (WebCore::CryptoKeyOKP::CryptoKeyOKP): (WebCore::CryptoKeyOKP::generatePair): (WebCore::CryptoKeyOKP::importRaw): (WebCore::CryptoKeyOKP::importJwk): (WebCore::CryptoKeyOKP::exportRaw const): (WebCore::CryptoKeyOKP::exportJwk const): (WebCore::CryptoKeyOKP::namedCurveString const): (WebCore::CryptoKeyOKP::isValidOKPAlgorithm): (WebCore::CryptoKeyOKP::algorithm const): (WebCore::CryptoKeyOKP::platformSupportedCurve): (WebCore::CryptoKeyOKP::platformGeneratePair): (WebCore::CryptoKeyOKP::importSpki): (WebCore::CryptoKeyOKP::exportSpki const): (WebCore::CryptoKeyOKP::importPkcs8): (WebCore::CryptoKeyOKP::exportPkcs8 const): (WebCore::CryptoKeyOKP::computePublicKeyFromPrivateKey const): * Source/WebCore/crypto/keys/CryptoKeyOKP.h: Added. * Source/WebCore/crypto/mac/CryptoAlgorithmEd25519Cocoa.cpp: Added. (WebCore::signEd25519): (WebCore::verifyEd25519): (WebCore::CryptoAlgorithmEd25519::platformSign): (WebCore::CryptoAlgorithmEd25519::platformVerify): * Source/WebCore/crypto/mac/CryptoAlgorithmHKDFMac.cpp: * Source/WebCore/crypto/mac/CryptoAlgorithmRegistryMac.cpp: (WebCore::CryptoAlgorithmRegistry::platformRegisterAlgorithms): * Source/WebCore/crypto/mac/CryptoKeyOKPCocoa.cpp: Added. (WebCore::CryptoKeyOKP::platformSupportedCurve): (WebCore::CryptoKeyOKP::computePublicKeyFromPrivateKey const): (WebCore::CryptoKeyOKP::platformGeneratePair): (WebCore::CryptoKeyOKP::importSpki): (WebCore::CryptoKeyOKP::exportSpki const): (WebCore::CryptoKeyOKP::importPkcs8): (WebCore::CryptoKeyOKP::exportPkcs8 const): * Source/WebCore/platform/Logging.h: Canonical link: https://commits.webkit.org/259277@main
1 parent 48aa7e7 commit 3abe0e4

32 files changed

+1849
-528
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
PASS postMessage a CryptoKeyOKP should work
3+
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<html>
2+
<head>
3+
<title>CryptoKey OKP serializationt</title>
4+
<script src="/resources/testharness.js"></script>
5+
<script src="/resources/testharnessreport.js"></script>
6+
</head>
7+
<body>
8+
<script>
9+
promise_test(async (test) => {
10+
const channel = new MessageChannel();
11+
12+
const keyData1 = {
13+
crv: "Ed25519",
14+
x: "2OGJY9gJ1IfZVJrMrsZ0Ln7rok2KDTsUt-PK6gaJPcw",
15+
kty: "OKP"
16+
};
17+
const keyData2 = {
18+
crv: "Ed25519",
19+
d: "88j0xI34eBRujNO_bfTlDjibpwdOFcI1Lc1dMI1MqB8",
20+
x: "2OGJY9gJ1IfZVJrMrsZ0Ln7rok2KDTsUt-PK6gaJPcw",
21+
kty: "OKP"
22+
};
23+
const key1 = await crypto.subtle.importKey("jwk", keyData1, "Ed25519", true, ["verify"]);
24+
const key2 = await crypto.subtle.importKey("jwk", keyData2, "Ed25519", true, ["sign"]);
25+
26+
channel.port1.postMessage(key1);
27+
const key3 = await new Promise(resolve => channel.port2.onmessage = (event) => resolve(event.data));
28+
29+
assert_equals(key3.extractable, key1.extractable, "key1 extractable");
30+
assert_array_equals(key3.usages, key1.usages, "key1 usages");
31+
32+
const keyData3 = await crypto.subtle.exportKey("jwk", key3);
33+
assert_equals(keyData3.crv, keyData1.crv, "keyData1.crv");
34+
assert_equals(keyData3.x, keyData1.x, "keyData1.x");
35+
assert_equals(keyData3.kty, keyData1.kty, "keyData1.kty");
36+
37+
channel.port1.postMessage(key2);
38+
const key4 = await new Promise(resolve => channel.port2.onmessage = (event) => resolve(event.data));
39+
40+
assert_equals(key4.extractable, key2.extractable, "key2 extractable");
41+
assert_array_equals(key4.usages, key2.usages, "key2 usages");
42+
43+
const keyData4 = await crypto.subtle.exportKey("jwk", key4);
44+
assert_equals(keyData4.crv, keyData4.crv, "keyData1.crv");
45+
assert_equals(keyData4.d, keyData4.d, "keyData4.d");
46+
assert_equals(keyData4.kty, keyData4.kty, "keyData4.kty");
47+
}, "postMessage a CryptoKeyOKP should work");
48+
</script>
49+
</body>
50+
</html>

LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/generateKey/failures_Ed25519.https.any-expected.txt

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -323,30 +323,30 @@ PASS Bad algorithm: generateKey({name: EC, namedCurve: P521}, false, [decrypt, s
323323
PASS Bad algorithm: generateKey({name: EC, namedCurve: P521}, true, [decrypt, sign, deriveBits, decrypt, sign, deriveBits])
324324
PASS Bad algorithm: generateKey({name: EC, namedCurve: P521}, RED, [decrypt, sign, deriveBits, decrypt, sign, deriveBits])
325325
PASS Bad algorithm: generateKey({name: EC, namedCurve: P521}, 7, [decrypt, sign, deriveBits, decrypt, sign, deriveBits])
326-
FAIL Bad usages: generateKey({name: Ed25519}, true, [encrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
327-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, encrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
328-
FAIL Bad usages: generateKey({name: Ed25519}, true, [verify, sign, encrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
329-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, encrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
330-
FAIL Bad usages: generateKey({name: Ed25519}, true, [decrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
331-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, decrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
332-
FAIL Bad usages: generateKey({name: Ed25519}, true, [verify, sign, decrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
333-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, decrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
334-
FAIL Bad usages: generateKey({name: Ed25519}, true, [wrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
335-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, wrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
336-
FAIL Bad usages: generateKey({name: Ed25519}, true, [verify, sign, wrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
337-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, wrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
338-
FAIL Bad usages: generateKey({name: Ed25519}, true, [unwrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
339-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, unwrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
340-
FAIL Bad usages: generateKey({name: Ed25519}, true, [verify, sign, unwrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
341-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, unwrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
342-
FAIL Bad usages: generateKey({name: Ed25519}, true, [deriveKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
343-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, deriveKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
344-
FAIL Bad usages: generateKey({name: Ed25519}, true, [verify, sign, deriveKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
345-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, deriveKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
346-
FAIL Bad usages: generateKey({name: Ed25519}, true, [deriveBits]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
347-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, deriveBits]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
348-
FAIL Bad usages: generateKey({name: Ed25519}, true, [verify, sign, deriveBits]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
349-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, deriveBits]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
350-
FAIL Empty usages: generateKey({name: Ed25519}, false, []) assert_equals: Empty usages not supported expected "SyntaxError" but got "NotSupportedError"
351-
FAIL Empty usages: generateKey({name: Ed25519}, true, []) assert_equals: Empty usages not supported expected "SyntaxError" but got "NotSupportedError"
326+
PASS Bad usages: generateKey({name: Ed25519}, true, [encrypt])
327+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, encrypt])
328+
PASS Bad usages: generateKey({name: Ed25519}, true, [verify, sign, encrypt])
329+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, encrypt])
330+
PASS Bad usages: generateKey({name: Ed25519}, true, [decrypt])
331+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, decrypt])
332+
PASS Bad usages: generateKey({name: Ed25519}, true, [verify, sign, decrypt])
333+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, decrypt])
334+
PASS Bad usages: generateKey({name: Ed25519}, true, [wrapKey])
335+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, wrapKey])
336+
PASS Bad usages: generateKey({name: Ed25519}, true, [verify, sign, wrapKey])
337+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, wrapKey])
338+
PASS Bad usages: generateKey({name: Ed25519}, true, [unwrapKey])
339+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, unwrapKey])
340+
PASS Bad usages: generateKey({name: Ed25519}, true, [verify, sign, unwrapKey])
341+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, unwrapKey])
342+
PASS Bad usages: generateKey({name: Ed25519}, true, [deriveKey])
343+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, deriveKey])
344+
PASS Bad usages: generateKey({name: Ed25519}, true, [verify, sign, deriveKey])
345+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, deriveKey])
346+
PASS Bad usages: generateKey({name: Ed25519}, true, [deriveBits])
347+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, deriveBits])
348+
PASS Bad usages: generateKey({name: Ed25519}, true, [verify, sign, deriveBits])
349+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, deriveBits])
350+
PASS Empty usages: generateKey({name: Ed25519}, false, [])
351+
PASS Empty usages: generateKey({name: Ed25519}, true, [])
352352

LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/generateKey/failures_Ed25519.https.any.worker-expected.txt

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -323,30 +323,30 @@ PASS Bad algorithm: generateKey({name: EC, namedCurve: P521}, false, [decrypt, s
323323
PASS Bad algorithm: generateKey({name: EC, namedCurve: P521}, true, [decrypt, sign, deriveBits, decrypt, sign, deriveBits])
324324
PASS Bad algorithm: generateKey({name: EC, namedCurve: P521}, RED, [decrypt, sign, deriveBits, decrypt, sign, deriveBits])
325325
PASS Bad algorithm: generateKey({name: EC, namedCurve: P521}, 7, [decrypt, sign, deriveBits, decrypt, sign, deriveBits])
326-
FAIL Bad usages: generateKey({name: Ed25519}, true, [encrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
327-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, encrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
328-
FAIL Bad usages: generateKey({name: Ed25519}, true, [verify, sign, encrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
329-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, encrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
330-
FAIL Bad usages: generateKey({name: Ed25519}, true, [decrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
331-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, decrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
332-
FAIL Bad usages: generateKey({name: Ed25519}, true, [verify, sign, decrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
333-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, decrypt]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
334-
FAIL Bad usages: generateKey({name: Ed25519}, true, [wrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
335-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, wrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
336-
FAIL Bad usages: generateKey({name: Ed25519}, true, [verify, sign, wrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
337-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, wrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
338-
FAIL Bad usages: generateKey({name: Ed25519}, true, [unwrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
339-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, unwrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
340-
FAIL Bad usages: generateKey({name: Ed25519}, true, [verify, sign, unwrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
341-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, unwrapKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
342-
FAIL Bad usages: generateKey({name: Ed25519}, true, [deriveKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
343-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, deriveKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
344-
FAIL Bad usages: generateKey({name: Ed25519}, true, [verify, sign, deriveKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
345-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, deriveKey]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
346-
FAIL Bad usages: generateKey({name: Ed25519}, true, [deriveBits]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
347-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, deriveBits]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
348-
FAIL Bad usages: generateKey({name: Ed25519}, true, [verify, sign, deriveBits]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
349-
FAIL Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, deriveBits]) assert_equals: Bad usages not supported expected "SyntaxError" but got "NotSupportedError"
350-
FAIL Empty usages: generateKey({name: Ed25519}, false, []) assert_equals: Empty usages not supported expected "SyntaxError" but got "NotSupportedError"
351-
FAIL Empty usages: generateKey({name: Ed25519}, true, []) assert_equals: Empty usages not supported expected "SyntaxError" but got "NotSupportedError"
326+
PASS Bad usages: generateKey({name: Ed25519}, true, [encrypt])
327+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, encrypt])
328+
PASS Bad usages: generateKey({name: Ed25519}, true, [verify, sign, encrypt])
329+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, encrypt])
330+
PASS Bad usages: generateKey({name: Ed25519}, true, [decrypt])
331+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, decrypt])
332+
PASS Bad usages: generateKey({name: Ed25519}, true, [verify, sign, decrypt])
333+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, decrypt])
334+
PASS Bad usages: generateKey({name: Ed25519}, true, [wrapKey])
335+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, wrapKey])
336+
PASS Bad usages: generateKey({name: Ed25519}, true, [verify, sign, wrapKey])
337+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, wrapKey])
338+
PASS Bad usages: generateKey({name: Ed25519}, true, [unwrapKey])
339+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, unwrapKey])
340+
PASS Bad usages: generateKey({name: Ed25519}, true, [verify, sign, unwrapKey])
341+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, unwrapKey])
342+
PASS Bad usages: generateKey({name: Ed25519}, true, [deriveKey])
343+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, deriveKey])
344+
PASS Bad usages: generateKey({name: Ed25519}, true, [verify, sign, deriveKey])
345+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, deriveKey])
346+
PASS Bad usages: generateKey({name: Ed25519}, true, [deriveBits])
347+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, deriveBits])
348+
PASS Bad usages: generateKey({name: Ed25519}, true, [verify, sign, deriveBits])
349+
PASS Bad usages: generateKey({name: Ed25519}, true, [sign, verify, sign, sign, verify, deriveBits])
350+
PASS Empty usages: generateKey({name: Ed25519}, false, [])
351+
PASS Empty usages: generateKey({name: Ed25519}, true, [])
352352

0 commit comments

Comments
 (0)