summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tests/unit/webcrypto_test.ts27
-rw-r--r--ext/crypto/import_key.rs10
2 files changed, 36 insertions, 1 deletions
diff --git a/cli/tests/unit/webcrypto_test.ts b/cli/tests/unit/webcrypto_test.ts
index a6cab93dd..6695b157a 100644
--- a/cli/tests/unit/webcrypto_test.ts
+++ b/cli/tests/unit/webcrypto_test.ts
@@ -1827,3 +1827,30 @@ Deno.test(async function exportKeyNotExtractable() {
await crypto.subtle.exportKey("raw", key);
}, DOMException);
});
+
+// https://github.com/denoland/deno/issues/15126
+Deno.test(async function testImportLeadingZeroesKey() {
+ const alg = { name: "ECDSA", namedCurve: "P-256" };
+
+ const jwk = {
+ kty: "EC",
+ crv: "P-256",
+ alg: "ES256",
+ x: "EvidcdFB1xC6tgfakqZsU9aIURxAJkcX62zHe1Nt6xU",
+ y: "AHsk6BioGM7MZWeXOE_49AGmtuaXFT3Ill3DYtz9uYg",
+ d: "WDeYo4o1heCF9l_2VIaClRyIeO16zsMlN8UG6Le9dU8",
+ "key_ops": ["sign"],
+ ext: true,
+ };
+
+ const key = await crypto.subtle.importKey(
+ "jwk",
+ jwk,
+ alg,
+ true,
+ ["sign"],
+ );
+
+ assert(key instanceof CryptoKey);
+ assertEquals(key.type, "private");
+});
diff --git a/ext/crypto/import_key.rs b/ext/crypto/import_key.rs
index 015ee41d5..225950aa7 100644
--- a/ext/crypto/import_key.rs
+++ b/ext/crypto/import_key.rs
@@ -637,7 +637,15 @@ fn decode_b64url_to_field_bytes<C: elliptic_curve::Curve>(
jwt_b64_int_or_err!(val, b64, "invalid b64 coordinate");
let mut bytes = elliptic_curve::FieldBytes::<C>::default();
- let val = val.as_bytes();
+ let original_bytes = val.as_bytes();
+ let mut new_bytes: Vec<u8> = vec![];
+ if original_bytes.len() < bytes.len() {
+ new_bytes = vec![0; bytes.len() - original_bytes.len()];
+ }
+ new_bytes.extend_from_slice(original_bytes);
+
+ let val = new_bytes.as_slice();
+
if val.len() != bytes.len() {
return Err(data_error("invalid b64 coordinate"));
}