From fa2ec9bea17e6ba8d91a6468be8c8cfa27e1d34d Mon Sep 17 00:00:00 2001 From: Paul Howard Date: Tue, 16 Dec 2025 19:54:48 +0000 Subject: [PATCH] fix(cca): Support attestation keys as PEM-encoded SubjectPublicKeyInfo Adds PEM->JWK conversion utility and associated tests Adds match clause for PkixBase64Key when receiving trust anchor as CryptoKeyTypeChoice Signed-off-by: Paul Howard --- Cargo.lock | 282 +++++++++++++++++++++++++++++++++++++++- Cargo.toml | 7 + src/lib/cca/mod.rs | 5 + src/lib/util.rs | 144 ++++++++++++++++++++ test/keys/pkey_256.json | 6 + test/keys/pkey_256.pem | 4 + test/keys/pkey_384.json | 6 + test/keys/pkey_384.pem | 5 + test/keys/pkey_521.json | 6 + test/keys/pkey_521.pem | 6 + 10 files changed, 468 insertions(+), 3 deletions(-) create mode 100644 test/keys/pkey_256.json create mode 100644 test/keys/pkey_256.pem create mode 100644 test/keys/pkey_384.json create mode 100644 test/keys/pkey_384.pem create mode 100644 test/keys/pkey_521.json create mode 100644 test/keys/pkey_521.pem diff --git a/Cargo.lock b/Cargo.lock index efdf4b2..acf1666 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -102,6 +102,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.21.7" @@ -114,6 +120,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" + [[package]] name = "bit-set" version = "0.8.0" @@ -340,6 +352,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "const_format" version = "0.2.34" @@ -423,9 +441,16 @@ dependencies = [ "corim-rs", "cose-rust", "ear 0.4.0 (git+https://github.com/veraison/rust-ear?rev=15184e9a)", + "elliptic-curve", "env_logger", "jsonwebtoken", "log", + "p256", + "p384", + "p521", + "pem", + "picky-asn1-der", + "picky-asn1-x509", "regorus", "serde", "serde_json", @@ -447,6 +472,18 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -498,6 +535,17 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.4.1" @@ -535,6 +583,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -593,12 +642,47 @@ dependencies = [ "thiserror 2.0.16", ] +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "email_address" version = "0.2.9" @@ -654,6 +738,16 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "fluent-uri" version = "0.3.2" @@ -713,6 +807,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -740,6 +835,17 @@ dependencies = [ "wasi 0.14.2+wasi-0.2.4", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "half" version = "2.5.0" @@ -783,6 +889,15 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + [[package]] name = "hmac" version = "0.12.1" @@ -1306,6 +1421,44 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p521" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" +dependencies = [ + "base16ct", + "ecdsa", + "elliptic-curve", + "primeorder", + "rand_core 0.6.4", + "sha2", +] + [[package]] name = "parking_lot" version = "0.12.3" @@ -1340,12 +1493,21 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.5" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" dependencies = [ "base64 0.22.1", - "serde", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", ] [[package]] @@ -1450,6 +1612,51 @@ dependencies = [ "siphasher", ] +[[package]] +name = "picky-asn1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ff038f9360b934342fb3c0a1d6e82c438a2624b51c3c6e3e6d7cf252b6f3ee3" +dependencies = [ + "oid", + "serde", + "serde_bytes", +] + +[[package]] +name = "picky-asn1-der" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b491eb61603cba1ad5c6be0269883538f8d74136c35e3641a840fb0fbcd41efc" +dependencies = [ + "picky-asn1", + "serde", + "serde_bytes", +] + +[[package]] +name = "picky-asn1-x509" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c97cd14d567a17755910fa8718277baf39d08682a980b1b1a4b4da7d0bc61a04" +dependencies = [ + "base64 0.22.1", + "oid", + "picky-asn1", + "picky-asn1-der", + "serde", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -1495,6 +1702,15 @@ dependencies = [ "zerocopy 0.8.24", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro2" version = "1.0.101" @@ -1680,6 +1896,16 @@ dependencies = [ "wax", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + [[package]] name = "ring" version = "0.17.14" @@ -1756,6 +1982,20 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "semver" version = "1.0.26" @@ -1772,6 +2012,16 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -1866,6 +2116,16 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + [[package]] name = "simple_asn1" version = "0.6.3" @@ -1890,6 +2150,16 @@ version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -2476,6 +2746,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + [[package]] name = "zerovec" version = "0.10.4" diff --git a/Cargo.toml b/Cargo.toml index b3fefb6..d3c1982 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,13 @@ log = { version = "0.4.27", features = ["kv", "std"] } regorus = "0.4.0" serde = { version = "1.0.219", features = ["derive"] } serde_json = { version = "1.0.140", features = ["raw_value"] } +pem = "3.0.6" +picky-asn1-der = "0.5.4" +picky-asn1-x509 = "0.15.2" +elliptic-curve = { version = "0.13.8", features = ["arithmetic"] } +p256 = "0.13.2" +p384 = "0.13.1" +p521 = "0.13.3" [dev-dependencies] ciborium = "0.2.2" diff --git a/src/lib/cca/mod.rs b/src/lib/cca/mod.rs index 0a8342e..3cc9f7a 100644 --- a/src/lib/cca/mod.rs +++ b/src/lib/cca/mod.rs @@ -98,6 +98,11 @@ impl Scheme for CcaScheme { ) -> Result>, Error> { let key_bytes: Vec = match trust_anchor { CryptoKeyTypeChoice::Bytes(bytes) => Ok(bytes.into()), + CryptoKeyTypeChoice::PkixBase64Key(b64key) => { + let pem_bytes = b64key.as_bytes(); + let jwk_string = crate::util::pem_spki_to_jwk_string(pem_bytes)?; + Ok(jwk_string.into()) + } _ => Err(Error::custom(format!( "invalid trust anchor type: {:?}", trust_anchor diff --git a/src/lib/util.rs b/src/lib/util.rs index 07723e1..5d3d627 100644 --- a/src/lib/util.rs +++ b/src/lib/util.rs @@ -8,3 +8,147 @@ pub fn b64decode(v: &str) -> Result, Error> { .decode(v) .map_err(|e| Error::invalid_value(e.to_string(), "a base64-encoded string")) } + +// Helper function to convert PEM-encoded SubjectPublicKeyInfo into JWK +pub fn pem_spki_to_jwk_string(pem_bytes: &[u8]) -> Result { + use elliptic_curve::sec1::{FromEncodedPoint, ModulusSize, ToEncodedPoint}; + use elliptic_curve::{AffinePoint, CurveArithmetic, FieldBytesSize}; + use elliptic_curve::{PublicKey as EcPublicKey, pkcs8::DecodePublicKey}; + use p256::NistP256; + use p384::NistP384; + use p521::NistP521; + use pem; + use picky_asn1_x509::{ + AlgorithmIdentifierParameters, EcParameters, PublicKey, SubjectPublicKeyInfo, + }; + use serde::Serialize; + + #[derive(Serialize, Debug)] + struct EcJwk { + pub kty: String, + pub crv: String, + pub x: String, + pub y: String, + } + + // Returns a pair (X, Y) of Base64Url-encoded strings representing the curve points of the + // given public key. + fn extract_ec_point_x_y(ec_pub: EcPublicKey) -> Result<(String, String), Error> + where + C: CurveArithmetic, + AffinePoint: FromEncodedPoint + ToEncodedPoint, + FieldBytesSize: ModulusSize, + { + let point = ec_pub.to_encoded_point(false); + if let Some(x) = point.x() + && let Some(y) = point.y() + { + let xb64 = URL_SAFE_NO_PAD.encode(x); + let yb64 = URL_SAFE_NO_PAD.encode(y); + Ok((xb64, yb64)) + } else { + Err(Error::Custom(format!( + "points x and y not populated in encoded point {:?}", + point + ))) + } + } + + let pem = pem::parse(pem_bytes).map_err(Error::custom)?; + match pem.tag() { + "PUBLIC KEY" => { + let contents = pem.contents(); + let spki: SubjectPublicKeyInfo = + picky_asn1_der::from_bytes(contents).map_err(Error::custom)?; + match spki.subject_public_key { + PublicKey::Ec(_) => { + if let AlgorithmIdentifierParameters::Ec(EcParameters::NamedCurve(oid)) = + spki.algorithm.parameters() + { + let oid_str: String = oid.0.clone().into(); + let (crv, x, y) = match oid_str.as_str() { + "1.2.840.10045.3.1.7" => { + let ec_pub: EcPublicKey = + EcPublicKey::from_public_key_der(contents).unwrap(); + let (x, y) = extract_ec_point_x_y(ec_pub)?; + ("P-256", x, y) + } + "1.3.132.0.34" => { + let ec_pub: EcPublicKey = + EcPublicKey::from_public_key_der(contents).unwrap(); + let (x, y) = extract_ec_point_x_y(ec_pub)?; + ("P-384", x, y) + } + "1.3.132.0.35" => { + let ec_pub: EcPublicKey = + EcPublicKey::from_public_key_der(contents).unwrap(); + let (x, y) = extract_ec_point_x_y(ec_pub)?; + ("P-521", x, y) + } + c => { + return Err(Error::Custom(format!( + "EC curve oid {} is not supported", + c + ))); + } + }; + + let jwk = EcJwk { + kty: "EC".into(), + crv: crv.into(), + x, + y, + }; + + Ok(serde_json::to_string(&jwk).unwrap()) + } else { + Err(Error::Custom( + "the EC public key does not contain EC parameters".to_string(), + )) + } + } + _ => Err(Error::Custom("only EC keys supported".to_string())), + } + } + t => Err(Error::Custom(format!( + "PEM tag {} is not supported - must be PUBLIC KEY (SubjectPublicKeyInfo)", + t + ))), + } +} + +#[cfg(test)] +mod test { + use super::*; + use jsonwebtoken::jwk::Jwk; + + fn pem_to_jwk(pem_bytes: &[u8], expected_jwk: &str) { + let jwk_converted = pem_spki_to_jwk_string(pem_bytes).unwrap(); + let expected: Jwk = + serde_json::from_str(expected_jwk).expect("failed to deserialize expected JWK"); + let actual: Jwk = + serde_json::from_str(&jwk_converted).expect("failed to deserialize actual JWK"); + assert_eq!(actual, expected); + } + + #[test] + fn pem_to_jwk_256() { + let pem_bytes = include_bytes!("../../test/keys/pkey_256.pem"); + let expected_jwk = include_str!("../../test/keys/pkey_256.json"); + pem_to_jwk(pem_bytes, expected_jwk); + } + + #[test] + fn pem_to_jwk_384() { + let pem_bytes = include_bytes!("../../test/keys/pkey_384.pem"); + let expected_jwk = include_str!("../../test/keys/pkey_384.json"); + pem_to_jwk(pem_bytes, expected_jwk); + } + + #[test] + fn pem_to_jwk_521() { + let pem_bytes = include_bytes!("../../test/keys/pkey_521.pem"); + let expected_jwk = include_str!("../../test/keys/pkey_521.json"); + pem_to_jwk(pem_bytes, expected_jwk); + } +} diff --git a/test/keys/pkey_256.json b/test/keys/pkey_256.json new file mode 100644 index 0000000..007c271 --- /dev/null +++ b/test/keys/pkey_256.json @@ -0,0 +1,6 @@ +{ + "crv": "P-256", + "kty": "EC", + "x": "tgbU5ewCDfgHLy1nxeMsgVvx9bnSic7qN74vRJ_Uwto", + "y": "BUhhTCrq8kJ87rghGBlvrZVi_CVtbWxmKTTNs5-bv9c" +} \ No newline at end of file diff --git a/test/keys/pkey_256.pem b/test/keys/pkey_256.pem new file mode 100644 index 0000000..1d7190a --- /dev/null +++ b/test/keys/pkey_256.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtgbU5ewCDfgHLy1nxeMsgVvx9bnS +ic7qN74vRJ/UwtoFSGFMKuryQnzuuCEYGW+tlWL8JW1tbGYpNM2zn5u/1w== +-----END PUBLIC KEY----- \ No newline at end of file diff --git a/test/keys/pkey_384.json b/test/keys/pkey_384.json new file mode 100644 index 0000000..b7584d8 --- /dev/null +++ b/test/keys/pkey_384.json @@ -0,0 +1,6 @@ +{ + "crv": "P-384", + "kty": "EC", + "x": "mxOLLqA9CwehvuiSwmTXrPpsLv0b02UhUktcFrNSVGX4xw1SduiC485rga8dhszE", + "y": "LwNj95ahl1DM59pn-gm4iLc8km1J-CzLY4zEvVB13lYLC5KweOM17AasKfBtIV6y" +} \ No newline at end of file diff --git a/test/keys/pkey_384.pem b/test/keys/pkey_384.pem new file mode 100644 index 0000000..b43ef53 --- /dev/null +++ b/test/keys/pkey_384.pem @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEmxOLLqA9CwehvuiSwmTXrPpsLv0b02Uh +UktcFrNSVGX4xw1SduiC485rga8dhszELwNj95ahl1DM59pn+gm4iLc8km1J+CzL +Y4zEvVB13lYLC5KweOM17AasKfBtIV6y +-----END PUBLIC KEY----- \ No newline at end of file diff --git a/test/keys/pkey_521.json b/test/keys/pkey_521.json new file mode 100644 index 0000000..2d5d396 --- /dev/null +++ b/test/keys/pkey_521.json @@ -0,0 +1,6 @@ +{ + "crv": "P-521", + "kty": "EC", + "x": "Abc8mbQKS796c-64-nisJ_uy0iVt8uoMsZICrmk8XvCZ1jt4kijzzYIHyTfxpfSIPg-LiADyyzaf7V2fPUpqDWv0", + "y": "ABqW6xEwm_JJqRF5ZnieolL6nBC18BfB-3k1raBt9INw6mHuCW9-hKoMmsC-LAv9eMiv-rbmuC3I-phVddwayiA7" +} \ No newline at end of file diff --git a/test/keys/pkey_521.pem b/test/keys/pkey_521.pem new file mode 100644 index 0000000..e40b901 --- /dev/null +++ b/test/keys/pkey_521.pem @@ -0,0 +1,6 @@ +-----BEGIN PUBLIC KEY----- +MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBtzyZtApLv3pz7rj6eKwn+7LSJW3y +6gyxkgKuaTxe8JnWO3iSKPPNggfJN/Gl9Ig+D4uIAPLLNp/tXZ89SmoNa/QAGpbr +ETCb8kmpEXlmeJ6iUvqcELXwF8H7eTWtoG30g3DqYe4Jb36EqgyawL4sC/14yK/6 +tua4Lcj6mFV13BrKIDs= +-----END PUBLIC KEY----- \ No newline at end of file