Key usages should be an unique set
> const k = await crypto.subtle.exportKey('jwk', await crypto.subtle.generateKey({name: "ChaCha20-Poly1305" }, true, ['encrypt'])) > await crypto.subtle.importKey('jwk', k, "ChaCha20-Poly1305", true, ['encrypt', 'encrypt']) CryptoKey { type: 'secret', extractable: true, algorithm: { name: 'ChaCha20-Poly1305' }, usages: [ 'encrypt', 'encrypt' ] // duplicated } > await crypto.subtle.exportKey('jwk', _) { key_ops: [ 'encrypt', 'encrypt' ], // duplicated ext: true, alg: 'C20P', kty: 'oct', k: '...' }
> const k = await crypto.subtle.exportKey('jwk', await crypto.subtle.generateKey({name: "AES-GCM", length: 256 }, true, ['encrypt'])) undefined > await crypto.subtle.importKey('jwk', k, {name: "AES-GCM", length: 256 }, true, ['encrypt', 'encrypt']) CryptoKey { type: 'secret', extractable: true, algorithm: { name: 'AES-GCM', length: 256 }, usages: [ 'encrypt', 'encrypt' ] // duplicated } > await crypto.subtle.exportKey('jwk', _) { key_ops: [ 'encrypt', 'encrypt' ], // duplicated ext: true, alg: 'A256GCM', kty: 'oct', k: '...' }
> k = await crypto.subtle.generateKey({ name: "RSA-OAEP", hash: "SHA-256", modulusLength: 2048, publicExponent: Uint8Array.of(1, 0, 1) }, true, [ 'encrypt', 'decrypt']) > p = await crypto.subtle.exportKey('jwk', k.publicKey) > await crypto.subtle.importKey('jwk', p, { name: "RSA-OAEP", hash: "SHA-256" }, true, ['encrypt', 'encrypt']) CryptoKey { type: 'public', extractable: true, algorithm: { name: 'RSA-OAEP', modulusLength: 2048, publicExponent: [Uint8Array], hash: [Object] }, usages: [ 'encrypt', 'encrypt' ] // duplicate } > await crypto.subtle.exportKey('jwk', _) { key_ops: [ 'encrypt', 'encrypt' ], // duplicate ext: true, alg: 'RSA-OAEP-256', kty: 'RSA', n: '...', e: 'AQAB' }
Chrome deduplicates:
Source:
chacha20_poly1305
https://github.com/nodejs/node/blob/HEAD/lib/internal/crypto/chacha20_poly1305.js#L143
aes
https://github.com/nodejs/node/blob/HEAD/lib/internal/crypto/aes.js#L288
rsa
https://github.com/nodejs/node/blob/HEAD/lib/internal/crypto/rsa.js#L284



