PeculiarVentures/webcrypto

enable import/export raw ec-keys

armfazh opened this issue · 3 comments

currently importKey and exportKey methods work only on public keys, but not on privateKeys.

Chrome doesn't support raw format for EC private key.
image

Script

var keys = await crypto.subtle.generateKey({name: "ECDSA", namedCurve: "P-256"}, true, ["sign", "verify"]);
var raw = await crypto.subtle.exportKey("raw", keys.privateKey); // Error

var raw = await crypto.subtle.exportKey("raw", keys.publicKey);
console.log(raw);

@peculiar/webcrypto throws AsnSchemaValidationError. Maybe it should be better to use a custom error for that.

AsnSchemaValidationError: Data does not match to PublicKeyInfo ASN1 schema. 
    at Function.fromASN (/Users/microshine/github/pv/webcrypto/node_modules/@peculiar/asn1-schema/build/cjs/parser.js:56:23)
    at Function.parse (/Users/microshine/github/pv/webcrypto/node_modules/@peculiar/asn1-schema/build/cjs/parser.js:29:26)
    at Function.exportKey (/Users/microshine/github/pv/webcrypto/build/webcrypto.js:1449:60)
    at EcdsaProvider.onExportKey (/Users/microshine/github/pv/webcrypto/build/webcrypto.js:1578:25)
    at EcdsaProvider.exportKey (/Users/microshine/github/pv/webcrypto/node_modules/webcrypto-core/build/webcrypto-core.js:203:33)
    at SubtleCrypto.exportKey (/Users/microshine/github/pv/webcrypto/node_modules/webcrypto-core/build/webcrypto-core.js:838:39)
    at main (/Users/microshine/github/pv/webcrypto/test.ts:7:35) {
  schemas: [ 'PublicKeyInfo' ]
}

@armfazh Do you have any ideas how EC private key raw must look like?

Do you have any ideas how EC private key raw must look like?

For P-256, it's an arraybuffer of 32 bytes.

after RTFM specification: https://www.w3.org/TR/WebCryptoAPI/#ecdsa-operations
Private keys cannot be exported in raw format, but they can be exported as jwk or pkcs8.
closing.