1#:package Microsoft.IdentityModel.Tokens@8.23.0
2using System.Security.Cryptography;
3using System.Text.Json.Nodes;
4using Microsoft.IdentityModel.Tokens;
5
6// PEM -> JWK
7using var ecdsa = ECDsa.Create();
8ecdsa.ImportFromPem(File.ReadAllText("pub.pem"));
9JsonWebKey jwk = JsonWebKeyConverter.ConvertFromECDsaSecurityKey(new ECDsaSecurityKey(ecdsa));
10// Only the public members, as a JsonObject (no reflection-based serialization needed)
11string json = new JsonObject { ["kty"] = jwk.Kty, ["crv"] = jwk.Crv, ["x"] = jwk.X, ["y"] = jwk.Y }.ToJsonString();
12File.WriteAllText("out.jwk.json", json);
13Console.WriteLine(json);
14
15// JWK -> PEM: rebuild the key from its parameters, export SPKI as PEM
16var input = new JsonWebKey(File.ReadAllText("pub.jwk.json"));
17using var key = ECDsa.Create(new ECParameters
18{
19 Curve = input.Crv switch
20 {
21 "P-256" => ECCurve.NamedCurves.nistP256,
22 "P-384" => ECCurve.NamedCurves.nistP384,
23 "P-521" => ECCurve.NamedCurves.nistP521,
24 _ => throw new NotSupportedException(input.Crv),
25 },
26 Q = new ECPoint { X = Base64UrlEncoder.DecodeBytes(input.X), Y = Base64UrlEncoder.DecodeBytes(input.Y) },
27});
28string pem = key.ExportSubjectPublicKeyInfoPem() + "\n";
29File.WriteAllText("out.pem", pem);
30Console.Write(pem);