test: add Web Cryptography wrap/unwrap vectors · nodejs/node@16afd10
@@ -5,6 +5,8 @@ const common = require('../common');
55if (!common.hasCrypto)
66common.skip('missing crypto');
778+const { hasOpenSSL } = require('../common/crypto');
9+810const assert = require('assert');
911const { subtle } = globalThis.crypto;
1012@@ -187,6 +189,17 @@ async function generateKeysToWrap() {
187189},
188190];
189191192+if (hasOpenSSL(3, 5)) {
193+for (const name of ['ML-DSA-44', 'ML-DSA-65', 'ML-DSA-87']) {
194+parameters.push({
195+algorithm: { name },
196+privateUsages: ['sign'],
197+publicUsages: ['verify'],
198+pair: true,
199+});
200+}
201+}
202+190203const allkeys = await Promise.all(parameters.map(async (params) => {
191204const usages = 'usages' in params ?
192205params.usages :
@@ -220,10 +233,28 @@ async function generateKeysToWrap() {
220233}
221234222235function getFormats(key) {
223-switch (key.key.type) {
224-case 'secret': return ['raw', 'jwk'];
225-case 'public': return ['spki', 'jwk'];
226-case 'private': return ['pkcs8', 'jwk'];
236+switch (key.type) {
237+case 'secret': {
238+return ['raw-secret', 'raw', 'jwk'];
239+};
240+case 'public': {
241+switch (key.algorithm.name.slice(0, 2)) {
242+case 'EC': // ECDSA, ECDH
243+return ['spki', 'jwk', 'raw', 'raw-public'];
244+case 'ML': // ML-DSA
245+return ['jwk', 'raw-public'];
246+default:
247+return ['spki', 'jwk'];
248+}
249+}
250+case 'private': {
251+switch (key.algorithm.name.slice(0, 2)) {
252+case 'ML': // ML-DSA
253+return ['jwk', 'raw-seed'];
254+default:
255+return ['pkcs8', 'jwk'];
256+}
257+}
227258}
228259}
229260@@ -285,7 +316,7 @@ function testWrapping(name, keys) {
285316} = kWrappingData[name];
286317287318keys.forEach((key) => {
288-getFormats(key).forEach((format) => {
319+getFormats(key.key).forEach((format) => {
289320variations.push(testWrap(wrappingKey, unwrappingKey, key, wrap, format));
290321});
291322});