1import io.jsonwebtoken.security.Jwks
2import java.io.File
3import java.security.KeyFactory
4import java.security.PrivateKey
5import java.security.PublicKey
6import java.security.spec.X509EncodedKeySpec
7import java.util.Base64
8
9fun readPublicKey(file: String, algorithm: String): PublicKey {
10 val der = Base64.getMimeDecoder().decode(File(file).readText().replace(Regex("-----[^-]+-----"), ""))
11 return KeyFactory.getInstance(algorithm).generatePublic(X509EncodedKeySpec(der))
12}
13
14fun main() {
15 // From a JWK: thumbprint() is RFC 7638 with SHA-256; toString() gives the base64url form
16 for (file in listOf("ec.jwk.json", "rsa.jwk.json", "okp.jwk.json")) {
17 val jwk = Jwks.parser().build().parse(File(file).readText())
18 println("$file: ${jwk.thumbprint()}")
19 }
20
21 // From a JCA public key, e.g. one read from PEM
22 for ((file, algorithm) in listOf("ec.pub.pem" to "EC", "rsa.pub.pem" to "RSA", "okp.pub.pem" to "Ed25519")) {
23 val jwk = Jwks.builder().key<PublicKey, PrivateKey>(readPublicKey(file, algorithm)).build()
24 println("$file: ${jwk.thumbprint()}")
25 }
26 println(Jwks.builder().key<PublicKey, PrivateKey>(readPublicKey("ec.pub.pem", "EC")).build().thumbprint().toURI()) // RFC 9278
27}