/* * This file is part of cert-encoder * Copyright (c) 2024 Paolo Lulli. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package net.lulli.encrypt; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; public class Pems { private Pems(){} public static X509Certificate readX509Certificate(String certificate) throws Exception { InputStream targetStream = new ByteArrayInputStream(certificate.getBytes()); return (X509Certificate) CertificateFactory .getInstance("X509") .generateCertificate(targetStream); } public static X509Certificate certificateFromFile(String fileName) { try { var keyContent = Files.readString(Paths.get(fileName)); return readX509Certificate(keyContent); } catch (Exception e) { throw new IllegalStateException(e.getMessage()); } } public static PublicKey publicKeyFromFile(String fileName) { try { var keyContent = Files.readString(Paths.get(fileName)); return readX509PublicKey(keyContent); } catch (Exception e) { throw new IllegalStateException(e.getMessage()); } } public static PrivateKey privateKeyFromFile(String fileName) { try { var keyContent = Files.readString(Paths.get(fileName)); return readPKCS8PrivateKey(keyContent); } catch (Exception e) { throw new IllegalStateException(e.getMessage()); } } public static PublicKey readX509PublicKey(String key) throws Exception { String publicKeyPEM = key .replace("-----BEGIN PUBLIC KEY-----", "") .replaceAll(System.lineSeparator(), "") .replace("-----END PUBLIC KEY-----", ""); byte[] encoded = Base64.getDecoder().decode(publicKeyPEM); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded); return (PublicKey) keyFactory.generatePublic(keySpec); } public static PrivateKey readPKCS8PrivateKey(String key) throws Exception { String privateKeyPEM = key .replace("-----BEGIN PRIVATE KEY-----", "") .replaceAll(System.lineSeparator(), "") .replace("-----END PRIVATE KEY-----", ""); byte[] encoded = Base64.getDecoder().decode(privateKeyPEM); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded); return (PrivateKey) keyFactory.generatePrivate(keySpec); } }