From 33d93cc39ae4320c5889da03afff68de7bae9ed8 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 24 Aug 2022 13:24:05 +0200 Subject: [PATCH] Adopt latest changes from pgp-cert-d and add armor headers for get command --- .../java/pgp/cert_d/cli/commands/Get.java | 6 ++- .../certificate_store/CertificateFactory.java | 48 ++++--------------- .../certificate_store/KeyFactory.java | 47 ++---------------- .../certificate_store/KeyMaterialReader.java | 6 +-- .../certificate_store/MergeCallbacks.java | 4 +- 5 files changed, 25 insertions(+), 86 deletions(-) diff --git a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java index 96c2b76..9422d2e 100644 --- a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java +++ b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java @@ -5,7 +5,10 @@ package pgp.cert_d.cli.commands; import org.bouncycastle.bcpg.ArmoredOutputStream; +import org.bouncycastle.openpgp.PGPKeyRing; import org.bouncycastle.util.io.Streams; +import org.pgpainless.PGPainless; +import org.pgpainless.util.ArmorUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pgp.cert_d.SpecialNames; @@ -46,7 +49,8 @@ public class Get implements Runnable { } if (armor) { - ArmoredOutputStream armorOut = new ArmoredOutputStream(System.out); + PGPKeyRing keyRing = PGPainless.readKeyRing().keyRing(record.getInputStream()); + ArmoredOutputStream armorOut = ArmorUtils.toAsciiArmoredStream(keyRing, System.out); Streams.pipeAll(record.getInputStream(), armorOut); armorOut.close(); } else { diff --git a/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/CertificateFactory.java b/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/CertificateFactory.java index 8fe8919..ceb1719 100644 --- a/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/CertificateFactory.java +++ b/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/CertificateFactory.java @@ -6,54 +6,26 @@ package org.pgpainless.certificate_store; import org.bouncycastle.openpgp.PGPPublicKey; import org.bouncycastle.openpgp.PGPPublicKeyRing; -import org.bouncycastle.util.encoders.Base64; import org.pgpainless.key.OpenPgpFingerprint; import pgp.certificate_store.certificate.Certificate; -import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.InputStream; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class CertificateFactory { - public static Certificate certificateFromPublicKeyRing(PGPPublicKeyRing publicKeyRing) { - return new Certificate() { - @Override - public String getFingerprint() { - return OpenPgpFingerprint.of(publicKeyRing).toString().toLowerCase(); - } + public static Certificate certificateFromPublicKeyRing(PGPPublicKeyRing publicKeyRing, Long tag) + throws IOException { + byte[] bytes = publicKeyRing.getEncoded(); + String fingerprint = OpenPgpFingerprint.of(publicKeyRing).toString().toLowerCase(); + List subkeyIds = new ArrayList<>(); + Iterator keys = publicKeyRing.getPublicKeys(); + while (keys.hasNext()) { + subkeyIds.add(keys.next().getKeyID()); + } - @Override - public InputStream getInputStream() throws IOException { - return new ByteArrayInputStream(publicKeyRing.getEncoded()); - } - - @Override - public String getTag() throws IOException { - MessageDigest digest; - try { - digest = MessageDigest.getInstance("SHA-256"); - } catch (NoSuchAlgorithmException e) { - throw new AssertionError("No MessageDigest for SHA-256 instantiated, although BC is on the classpath: " + e.getMessage()); - } - digest.update(publicKeyRing.getEncoded()); - return Base64.toBase64String(digest.digest()); - } - - @Override - public List getSubkeyIds() throws IOException { - List keyIds = new ArrayList<>(); - Iterator keys = publicKeyRing.getPublicKeys(); - while (keys.hasNext()) { - keyIds.add(keys.next().getKeyID()); - } - return keyIds; - } - }; + return new Certificate(bytes, fingerprint, subkeyIds, tag); } } diff --git a/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/KeyFactory.java b/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/KeyFactory.java index 18cc66e..a43f76f 100644 --- a/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/KeyFactory.java +++ b/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/KeyFactory.java @@ -6,55 +6,18 @@ package org.pgpainless.certificate_store; import org.bouncycastle.openpgp.PGPPublicKeyRing; import org.bouncycastle.openpgp.PGPSecretKeyRing; -import org.bouncycastle.util.encoders.Base64; import org.pgpainless.PGPainless; import pgp.certificate_store.certificate.Certificate; import pgp.certificate_store.certificate.Key; -import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.InputStream; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.List; public class KeyFactory { - public static Key keyFromSecretKeyRing(PGPSecretKeyRing secretKeyRing) { - - return new Key() { - @Override - public String getFingerprint() { - return getCertificate().getFingerprint(); - } - - @Override - public Certificate getCertificate() { - PGPPublicKeyRing publicKeys = PGPainless.extractCertificate(secretKeyRing); - return CertificateFactory.certificateFromPublicKeyRing(publicKeys); - } - - @Override - public InputStream getInputStream() throws IOException { - return new ByteArrayInputStream(secretKeyRing.getEncoded()); - } - - @Override - public String getTag() throws IOException { - MessageDigest digest; - try { - digest = MessageDigest.getInstance("SHA-256"); - } catch (NoSuchAlgorithmException e) { - throw new AssertionError("No MessageDigest for SHA-256 instantiated, although BC is on the classpath: " + e.getMessage()); - } - digest.update(secretKeyRing.getEncoded()); - return Base64.toBase64String(digest.digest()); - } - - @Override - public List getSubkeyIds() throws IOException { - return getCertificate().getSubkeyIds(); - } - }; + public static Key keyFromSecretKeyRing(PGPSecretKeyRing secretKeyRing, Long tag) throws IOException { + byte[] bytes = secretKeyRing.getEncoded(); + PGPPublicKeyRing publicKeyRing = PGPainless.extractCertificate(secretKeyRing); + Certificate certificate = CertificateFactory.certificateFromPublicKeyRing(publicKeyRing, tag); + return new Key(bytes, certificate, tag); } } diff --git a/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/KeyMaterialReader.java b/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/KeyMaterialReader.java index 34ef5a5..409a9fe 100644 --- a/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/KeyMaterialReader.java +++ b/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/KeyMaterialReader.java @@ -18,12 +18,12 @@ import java.io.InputStream; public class KeyMaterialReader implements KeyMaterialReaderBackend { @Override - public KeyMaterial read(InputStream data) throws IOException, BadDataException { + public KeyMaterial read(InputStream data, Long tag) throws IOException, BadDataException { PGPKeyRing keyMaterial = PGPainless.readKeyRing().keyRing(data); if (keyMaterial instanceof PGPSecretKeyRing) { - return KeyFactory.keyFromSecretKeyRing((PGPSecretKeyRing) keyMaterial); + return KeyFactory.keyFromSecretKeyRing((PGPSecretKeyRing) keyMaterial, tag); } else if (keyMaterial instanceof PGPPublicKeyRing) { - return CertificateFactory.certificateFromPublicKeyRing((PGPPublicKeyRing) keyMaterial); + return CertificateFactory.certificateFromPublicKeyRing((PGPPublicKeyRing) keyMaterial, tag); } else { throw new BadDataException(); } diff --git a/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/MergeCallbacks.java b/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/MergeCallbacks.java index 242ed49..6e84f26 100644 --- a/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/MergeCallbacks.java +++ b/pgpainless-cert-d/src/main/java/org/pgpainless/certificate_store/MergeCallbacks.java @@ -81,9 +81,9 @@ public class MergeCallbacks { printOutDifferences(existingKeyRing, mergedKeyRing); if (mergedKeyRing instanceof PGPPublicKeyRing) { - return CertificateFactory.certificateFromPublicKeyRing((PGPPublicKeyRing) mergedKeyRing); + return CertificateFactory.certificateFromPublicKeyRing((PGPPublicKeyRing) mergedKeyRing, null); } else { - return KeyFactory.keyFromSecretKeyRing((PGPSecretKeyRing) mergedKeyRing); + return KeyFactory.keyFromSecretKeyRing((PGPSecretKeyRing) mergedKeyRing, null); } } catch (PGPException e) {