1import com.nimbusds.jose.jwk.Curve;
2import com.nimbusds.jose.jwk.ECKey;
3import com.nimbusds.jose.jwk.JWK;
4import java.nio.file.Files;
5import java.nio.file.Path;
6import java.security.KeyFactory;
7import java.security.interfaces.ECPublicKey;
8import java.security.spec.X509EncodedKeySpec;
9import java.util.Base64;
10
11public class Convert {
12 public static void main(String[] args) throws Exception {
13 // PEM -> JWK: the JDK reads the SPKI, Nimbus builds the JWK
14 String pem = Files.readString(Path.of("pub.pem"));
15 byte[] spki = Base64.getMimeDecoder().decode(pem.replaceAll("-----[^-]+-----", ""));
16 ECPublicKey key = (ECPublicKey) KeyFactory.getInstance("EC").generatePublic(new X509EncodedKeySpec(spki));
17 ECKey jwk = new ECKey.Builder(Curve.forECParameterSpec(key.getParams()), key).build();
18 Files.writeString(Path.of("out.jwk.json"), jwk.toJSONString());
19 System.out.println(jwk.toJSONString());
20
21 // JWK -> PEM: toECPublicKey() gives a JCA key; getEncoded() is its SPKI DER
22 ECKey parsed = JWK.parse(Files.readString(Path.of("pub.jwk.json"))).toECKey();
23 String body = Base64.getMimeEncoder(64, "\n".getBytes()).encodeToString(parsed.toECPublicKey().getEncoded());
24 String out = "-----BEGIN PUBLIC KEY-----\n" + body + "\n-----END PUBLIC KEY-----\n";
25 Files.writeString(Path.of("out.pem"), out);
26 System.out.print(out);
27 }
28}
29