1import java.security.MessageDigest
2import java.security.PublicKey
3import java.security.cert.CertificateFactory
4import java.security.cert.X509Certificate
5import java.util.Base64
6import kotlin.io.path.Path
7import kotlin.io.path.inputStream
8
9/** SubjectPublicKeyInfo as PEM: base64 of the DER in 64-character lines. */
10fun PublicKey.toSpkiPem(): String =
11 "-----BEGIN PUBLIC KEY-----\n" +
12 Base64.getEncoder().encodeToString(encoded).chunked(64).joinToString("\n") +
13 "\n-----END PUBLIC KEY-----\n"
14
15fun main() {
16 val cert = Path("cert.pem").inputStream().use {
17 CertificateFactory.getInstance("X.509").generateCertificate(it) as X509Certificate
18 }
19 val publicKey = cert.publicKey
20 print(publicKey.toSpkiPem())
21
22 val digest = MessageDigest.getInstance("SHA-256").digest(publicKey.encoded) // encoded = SPKI DER
23 println("SPKI SHA-256: ${digest.toHexString(HexFormat { bytes.byteSeparator = ":" })}")
24 println("SPKI pin (base64): ${Base64.getEncoder().encodeToString(digest)}")
25 println("algorithm ${publicKey.algorithm}, format ${publicKey.format}") // "X.509" means SPKI here
26}
27