summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tests/unit/webcrypto_test.ts16
-rw-r--r--ext/crypto/shared.rs31
-rw-r--r--tools/wpt/expectation.json68
3 files changed, 83 insertions, 32 deletions
diff --git a/cli/tests/unit/webcrypto_test.ts b/cli/tests/unit/webcrypto_test.ts
index ba6aaa327..0e7e2829a 100644
--- a/cli/tests/unit/webcrypto_test.ts
+++ b/cli/tests/unit/webcrypto_test.ts
@@ -1668,3 +1668,19 @@ Deno.test(async function testAesGcmTagLength() {
);
});
});
+
+Deno.test(async function ecPrivateKeyMaterialExportSpki() {
+ // `generateKey` generates a key pair internally stored as "private" key.
+ const keys = await crypto.subtle.generateKey(
+ { name: "ECDSA", namedCurve: "P-256" },
+ true,
+ ["sign", "verify"],
+ );
+
+ assert(keys.privateKey instanceof CryptoKey);
+ assert(keys.publicKey instanceof CryptoKey);
+
+ // `exportKey` should be able to perform necessary conversion to export spki.
+ const spki = await crypto.subtle.exportKey("spki", keys.publicKey);
+ assert(spki instanceof ArrayBuffer);
+});
diff --git a/ext/crypto/shared.rs b/ext/crypto/shared.rs
index de287efb0..052744248 100644
--- a/ext/crypto/shared.rs
+++ b/ext/crypto/shared.rs
@@ -4,12 +4,16 @@ use deno_core::error::custom_error;
use deno_core::error::type_error;
use deno_core::error::AnyError;
use deno_core::ZeroCopyBuf;
+use elliptic_curve::sec1::ToEncodedPoint;
+use p256::pkcs8::FromPrivateKey;
use rsa::pkcs1::FromRsaPrivateKey;
use rsa::pkcs1::ToRsaPublicKey;
use rsa::RsaPrivateKey;
use serde::Deserialize;
use serde::Serialize;
+use crate::ec_key::ECPrivateKey;
+
pub const RSA_ENCRYPTION_OID: rsa::pkcs8::ObjectIdentifier =
rsa::pkcs8::ObjectIdentifier::new("1.2.840.113549.1.1.1");
pub const SHA1_RSA_ENCRYPTION_OID: rsa::pkcs8::ObjectIdentifier =
@@ -112,9 +116,15 @@ impl RawKeyData {
RawKeyData::Public(data) => {
// public_key is a serialized EncodedPoint
p256::EncodedPoint::from_bytes(&data)
- .map_err(|_| type_error("expected valid private EC key"))
+ .map_err(|_| type_error("expected valid public EC key"))
}
- _ => Err(type_error("expected private key")),
+ RawKeyData::Private(data) => {
+ let signing_key = p256::SecretKey::from_pkcs8_der(data)
+ .map_err(|_| type_error("expected valid private EC key"))?;
+ Ok(signing_key.public_key().to_encoded_point(false))
+ }
+ // Should never reach here.
+ RawKeyData::Secret(_) => unreachable!(),
}
}
@@ -123,9 +133,22 @@ impl RawKeyData {
RawKeyData::Public(data) => {
// public_key is a serialized EncodedPoint
p384::EncodedPoint::from_bytes(&data)
- .map_err(|_| type_error("expected valid private EC key"))
+ .map_err(|_| type_error("expected valid public EC key"))
}
- _ => Err(type_error("expected private key")),
+ RawKeyData::Private(data) => {
+ let ec_key = ECPrivateKey::<p384::NistP384>::try_from(&**data)
+ .map_err(|_| {
+ custom_error(
+ "DOMExceptionOperationError",
+ "failed to decode private key",
+ )
+ })?;
+ let point = p384::EncodedPoint::from_bytes(&ec_key.encoded_point)
+ .map_err(|_| data_error("expected valid public EC key"))?;
+ Ok(point)
+ }
+ // Should never reach here.
+ RawKeyData::Secret(_) => unreachable!(),
}
}
diff --git a/tools/wpt/expectation.json b/tools/wpt/expectation.json
index f5cb0171d..56e95fb82 100644
--- a/tools/wpt/expectation.json
+++ b/tools/wpt/expectation.json
@@ -852,28 +852,28 @@
},
"wrapKey_unwrapKey": {
"wrapKey_unwrapKey.https.any.html": [
- "setup",
+ "Can wrap and unwrap ECDH public key keys using spki and AES-CTR",
"Can wrap and unwrap AES-GCM keys as non-extractable using raw and AES-CTR",
"Can wrap and unwrap AES-GCM keys as non-extractable using jwk and AES-CTR",
"Can unwrap AES-GCM non-extractable keys using jwk and AES-CTR",
+ "Can wrap and unwrap ECDH public key keys using spki and AES-CBC",
"Can wrap and unwrap AES-GCM keys as non-extractable using raw and AES-CBC",
"Can wrap and unwrap AES-GCM keys as non-extractable using jwk and AES-CBC",
"Can unwrap AES-GCM non-extractable keys using jwk and AES-CBC",
+ "Can wrap and unwrap ECDSA public key keys using spki and AES-GCM",
+ "Can wrap and unwrap ECDSA public key keys using jwk and AES-GCM",
"Can wrap and unwrap ECDSA private key keys using pkcs8 and AES-GCM",
"Can wrap and unwrap ECDSA private key keys as non-extractable using pkcs8 and AES-GCM",
"Can wrap and unwrap ECDSA private key keys using jwk and AES-GCM",
"Can wrap and unwrap ECDSA private key keys as non-extractable using jwk and AES-GCM",
"Can unwrap ECDSA private key non-extractable keys using jwk and AES-GCM",
+ "Can wrap and unwrap ECDH public key keys using spki and AES-GCM",
+ "Can wrap and unwrap ECDH public key keys using jwk and AES-GCM",
"Can wrap and unwrap ECDH private key keys using pkcs8 and AES-GCM",
"Can wrap and unwrap ECDH private key keys as non-extractable using pkcs8 and AES-GCM",
"Can wrap and unwrap ECDH private key keys using jwk and AES-GCM",
"Can wrap and unwrap ECDH private key keys as non-extractable using jwk and AES-GCM",
"Can unwrap ECDH private key non-extractable keys using jwk and AES-GCM",
- "Can wrap and unwrap HMAC keys using raw and AES-GCM",
- "Can wrap and unwrap HMAC keys as non-extractable using raw and AES-GCM",
- "Can wrap and unwrap HMAC keys using jwk and AES-GCM",
- "Can wrap and unwrap HMAC keys as non-extractable using jwk and AES-GCM",
- "Can unwrap HMAC non-extractable keys using jwk and AES-GCM",
"Can wrap and unwrap AES-CTR keys using raw and AES-GCM",
"Can wrap and unwrap AES-CTR keys as non-extractable using raw and AES-GCM",
"Can wrap and unwrap AES-CTR keys using jwk and AES-GCM",
@@ -894,13 +894,11 @@
"Can wrap and unwrap AES-KW keys using jwk and AES-GCM",
"Can wrap and unwrap AES-KW keys as non-extractable using jwk and AES-GCM",
"Can unwrap AES-KW non-extractable keys using jwk and AES-GCM",
- "Can wrap and unwrap RSASSA-PKCS1-v1_5 public key keys using spki and AES-GCM",
- "Can wrap and unwrap RSASSA-PKCS1-v1_5 public key keys using jwk and AES-GCM",
- "Can wrap and unwrap RSASSA-PKCS1-v1_5 private key keys using pkcs8 and AES-GCM",
- "Can wrap and unwrap RSASSA-PKCS1-v1_5 private key keys as non-extractable using pkcs8 and AES-GCM",
- "Can wrap and unwrap RSASSA-PKCS1-v1_5 private key keys using jwk and AES-GCM",
- "Can wrap and unwrap RSASSA-PKCS1-v1_5 private key keys as non-extractable using jwk and AES-GCM",
- "Can unwrap RSASSA-PKCS1-v1_5 private key non-extractable keys using jwk and AES-GCM",
+ "Can wrap and unwrap HMAC keys using raw and AES-GCM",
+ "Can wrap and unwrap HMAC keys as non-extractable using raw and AES-GCM",
+ "Can wrap and unwrap HMAC keys using jwk and AES-GCM",
+ "Can wrap and unwrap HMAC keys as non-extractable using jwk and AES-GCM",
+ "Can unwrap HMAC non-extractable keys using jwk and AES-GCM",
"Can wrap and unwrap RSA-PSS public key keys using spki and AES-GCM",
"Can wrap and unwrap RSA-PSS public key keys using jwk and AES-GCM",
"Can wrap and unwrap RSA-PSS private key keys using pkcs8 and AES-GCM",
@@ -915,24 +913,37 @@
"Can wrap and unwrap RSA-OAEP private key keys using jwk and AES-GCM",
"Can wrap and unwrap RSA-OAEP private key keys as non-extractable using jwk and AES-GCM",
"Can unwrap RSA-OAEP private key non-extractable keys using jwk and AES-GCM",
+ "Can wrap and unwrap RSASSA-PKCS1-v1_5 public key keys using spki and AES-GCM",
+ "Can wrap and unwrap RSASSA-PKCS1-v1_5 public key keys using jwk and AES-GCM",
+ "Can wrap and unwrap RSASSA-PKCS1-v1_5 private key keys using pkcs8 and AES-GCM",
+ "Can wrap and unwrap RSASSA-PKCS1-v1_5 private key keys as non-extractable using pkcs8 and AES-GCM",
+ "Can wrap and unwrap RSASSA-PKCS1-v1_5 private key keys using jwk and AES-GCM",
+ "Can wrap and unwrap RSASSA-PKCS1-v1_5 private key keys as non-extractable using jwk and AES-GCM",
+ "Can unwrap RSASSA-PKCS1-v1_5 private key non-extractable keys using jwk and AES-GCM",
"Can wrap and unwrap AES-GCM keys as non-extractable using raw and AES-KW",
+ "Can wrap and unwrap ECDH public key keys using spki and RSA-OAEP",
"Can wrap and unwrap AES-GCM keys as non-extractable using raw and RSA-OAEP",
"Can wrap and unwrap AES-GCM keys as non-extractable using jwk and RSA-OAEP",
"Can unwrap AES-GCM non-extractable keys using jwk and RSA-OAEP"
],
"wrapKey_unwrapKey.https.any.worker.html": [
- "setup",
+ "Can wrap and unwrap ECDH public key keys using spki and AES-CTR",
"Can wrap and unwrap AES-GCM keys as non-extractable using raw and AES-CTR",
"Can wrap and unwrap AES-GCM keys as non-extractable using jwk and AES-CTR",
"Can unwrap AES-GCM non-extractable keys using jwk and AES-CTR",
+ "Can wrap and unwrap ECDH public key keys using spki and AES-CBC",
"Can wrap and unwrap AES-GCM keys as non-extractable using raw and AES-CBC",
"Can wrap and unwrap AES-GCM keys as non-extractable using jwk and AES-CBC",
"Can unwrap AES-GCM non-extractable keys using jwk and AES-CBC",
+ "Can wrap and unwrap ECDSA public key keys using spki and AES-GCM",
+ "Can wrap and unwrap ECDSA public key keys using jwk and AES-GCM",
"Can wrap and unwrap ECDSA private key keys using pkcs8 and AES-GCM",
"Can wrap and unwrap ECDSA private key keys as non-extractable using pkcs8 and AES-GCM",
"Can wrap and unwrap ECDSA private key keys using jwk and AES-GCM",
"Can wrap and unwrap ECDSA private key keys as non-extractable using jwk and AES-GCM",
"Can unwrap ECDSA private key non-extractable keys using jwk and AES-GCM",
+ "Can wrap and unwrap ECDH public key keys using spki and AES-GCM",
+ "Can wrap and unwrap ECDH public key keys using jwk and AES-GCM",
"Can wrap and unwrap ECDH private key keys using pkcs8 and AES-GCM",
"Can wrap and unwrap ECDH private key keys as non-extractable using pkcs8 and AES-GCM",
"Can wrap and unwrap ECDH private key keys using jwk and AES-GCM",
@@ -963,20 +974,6 @@
"Can wrap and unwrap AES-KW keys using jwk and AES-GCM",
"Can wrap and unwrap AES-KW keys as non-extractable using jwk and AES-GCM",
"Can unwrap AES-KW non-extractable keys using jwk and AES-GCM",
- "Can wrap and unwrap RSA-PSS public key keys using spki and AES-GCM",
- "Can wrap and unwrap RSA-PSS public key keys using jwk and AES-GCM",
- "Can wrap and unwrap RSA-PSS private key keys using pkcs8 and AES-GCM",
- "Can wrap and unwrap RSA-PSS private key keys as non-extractable using pkcs8 and AES-GCM",
- "Can wrap and unwrap RSA-PSS private key keys using jwk and AES-GCM",
- "Can wrap and unwrap RSA-PSS private key keys as non-extractable using jwk and AES-GCM",
- "Can unwrap RSA-PSS private key non-extractable keys using jwk and AES-GCM",
- "Can wrap and unwrap RSA-OAEP public key keys using spki and AES-GCM",
- "Can wrap and unwrap RSA-OAEP public key keys using jwk and AES-GCM",
- "Can wrap and unwrap RSA-OAEP private key keys using pkcs8 and AES-GCM",
- "Can wrap and unwrap RSA-OAEP private key keys as non-extractable using pkcs8 and AES-GCM",
- "Can wrap and unwrap RSA-OAEP private key keys using jwk and AES-GCM",
- "Can wrap and unwrap RSA-OAEP private key keys as non-extractable using jwk and AES-GCM",
- "Can unwrap RSA-OAEP private key non-extractable keys using jwk and AES-GCM",
"Can wrap and unwrap RSASSA-PKCS1-v1_5 public key keys using spki and AES-GCM",
"Can wrap and unwrap RSASSA-PKCS1-v1_5 public key keys using jwk and AES-GCM",
"Can wrap and unwrap RSASSA-PKCS1-v1_5 private key keys using pkcs8 and AES-GCM",
@@ -984,7 +981,22 @@
"Can wrap and unwrap RSASSA-PKCS1-v1_5 private key keys using jwk and AES-GCM",
"Can wrap and unwrap RSASSA-PKCS1-v1_5 private key keys as non-extractable using jwk and AES-GCM",
"Can unwrap RSASSA-PKCS1-v1_5 private key non-extractable keys using jwk and AES-GCM",
+ "Can wrap and unwrap RSA-OAEP public key keys using spki and AES-GCM",
+ "Can wrap and unwrap RSA-OAEP public key keys using jwk and AES-GCM",
+ "Can wrap and unwrap RSA-OAEP private key keys using pkcs8 and AES-GCM",
+ "Can wrap and unwrap RSA-OAEP private key keys as non-extractable using pkcs8 and AES-GCM",
+ "Can wrap and unwrap RSA-OAEP private key keys using jwk and AES-GCM",
+ "Can wrap and unwrap RSA-OAEP private key keys as non-extractable using jwk and AES-GCM",
+ "Can unwrap RSA-OAEP private key non-extractable keys using jwk and AES-GCM",
+ "Can wrap and unwrap RSA-PSS public key keys using spki and AES-GCM",
+ "Can wrap and unwrap RSA-PSS public key keys using jwk and AES-GCM",
+ "Can wrap and unwrap RSA-PSS private key keys using pkcs8 and AES-GCM",
+ "Can wrap and unwrap RSA-PSS private key keys as non-extractable using pkcs8 and AES-GCM",
+ "Can wrap and unwrap RSA-PSS private key keys using jwk and AES-GCM",
+ "Can wrap and unwrap RSA-PSS private key keys as non-extractable using jwk and AES-GCM",
+ "Can unwrap RSA-PSS private key non-extractable keys using jwk and AES-GCM",
"Can wrap and unwrap AES-GCM keys as non-extractable using raw and AES-KW",
+ "Can wrap and unwrap ECDH public key keys using spki and RSA-OAEP",
"Can wrap and unwrap AES-GCM keys as non-extractable using raw and RSA-OAEP",
"Can wrap and unwrap AES-GCM keys as non-extractable using jwk and RSA-OAEP",
"Can unwrap AES-GCM non-extractable keys using jwk and RSA-OAEP"