diff --git a/pgp-cert-d-java/src/main/java/pgp/cert_d/BackendProvider.java b/pgp-cert-d-java/src/main/java/pgp/cert_d/BackendProvider.java new file mode 100644 index 00000000..70bc93cf --- /dev/null +++ b/pgp-cert-d-java/src/main/java/pgp/cert_d/BackendProvider.java @@ -0,0 +1,16 @@ +// SPDX-FileCopyrightText: 2022 Paul Schaub +// +// SPDX-License-Identifier: Apache-2.0 + +package pgp.cert_d; + +import pgp.certificate_store.CertificateReaderBackend; +import pgp.certificate_store.MergeCallback; + +public abstract class BackendProvider { + + public abstract CertificateReaderBackend provideCertificateReaderBackend(); + + public abstract MergeCallback provideDefaultMergeCallback(); + +} diff --git a/pgp-cert-d-java/src/main/java/pgp/cert_d/SharedPGPCertificateDirectoryImpl.java b/pgp-cert-d-java/src/main/java/pgp/cert_d/SharedPGPCertificateDirectoryImpl.java index 147f7436..601a3c8d 100644 --- a/pgp-cert-d-java/src/main/java/pgp/cert_d/SharedPGPCertificateDirectoryImpl.java +++ b/pgp-cert-d-java/src/main/java/pgp/cert_d/SharedPGPCertificateDirectoryImpl.java @@ -28,6 +28,11 @@ public class SharedPGPCertificateDirectoryImpl implements SharedPGPCertificateDi private final LockingMechanism writeLock; private final CertificateReaderBackend certificateReaderBackend; + public SharedPGPCertificateDirectoryImpl(BackendProvider backendProvider) + throws NotAStoreException { + this(backendProvider.provideCertificateReaderBackend()); + } + public SharedPGPCertificateDirectoryImpl(CertificateReaderBackend certificateReaderBackend) throws NotAStoreException { this( diff --git a/pgp-cert-d-cli/build.gradle b/pgpainless-cert-d-cli/build.gradle similarity index 100% rename from pgp-cert-d-cli/build.gradle rename to pgpainless-cert-d-cli/build.gradle diff --git a/pgp-cert-d-cli/src/main/java/pgp/cert_d/cli/PGPCertDCli.java b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/PGPCertDCli.java similarity index 100% rename from pgp-cert-d-cli/src/main/java/pgp/cert_d/cli/PGPCertDCli.java rename to pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/PGPCertDCli.java diff --git a/pgp-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 similarity index 100% rename from pgp-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java rename to pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java diff --git a/pgp-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Import.java b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Import.java similarity index 100% rename from pgp-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Import.java rename to pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Import.java diff --git a/pgp-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/package-info.java b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/package-info.java similarity index 100% rename from pgp-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/package-info.java rename to pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/package-info.java diff --git a/pgp-cert-d-cli/src/main/java/pgp/cert_d/cli/package-info.java b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/package-info.java similarity index 100% rename from pgp-cert-d-cli/src/main/java/pgp/cert_d/cli/package-info.java rename to pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/package-info.java diff --git a/pgpainless-core/src/main/java/org/pgpainless/certificate_store/CertificateFactory.java b/pgpainless-core/src/main/java/org/pgpainless/certificate_store/CertificateFactory.java new file mode 100644 index 00000000..0ef57930 --- /dev/null +++ b/pgpainless-core/src/main/java/org/pgpainless/certificate_store/CertificateFactory.java @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: 2022 Paul Schaub +// +// SPDX-License-Identifier: Apache-2.0 + +package org.pgpainless.certificate_store; + +import org.bouncycastle.openpgp.PGPPublicKeyRing; +import org.bouncycastle.util.encoders.Base64; +import org.pgpainless.key.OpenPgpFingerprint; +import pgp.certificate_store.Certificate; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class CertificateFactory { + + public static Certificate certificateFromPublicKeyRing(PGPPublicKeyRing publicKeyRing) { + return new Certificate() { + @Override + public String getFingerprint() { + return OpenPgpFingerprint.of(publicKeyRing).toString().toLowerCase(); + } + + @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()); + } + }; + } +} diff --git a/pgpainless-core/src/main/java/org/pgpainless/certificate_store/CertificateReader.java b/pgpainless-core/src/main/java/org/pgpainless/certificate_store/CertificateReader.java index e3c4ed45..5e3068ae 100644 --- a/pgpainless-core/src/main/java/org/pgpainless/certificate_store/CertificateReader.java +++ b/pgpainless-core/src/main/java/org/pgpainless/certificate_store/CertificateReader.java @@ -4,16 +4,11 @@ package org.pgpainless.certificate_store; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import org.bouncycastle.openpgp.PGPPublicKeyRing; -import org.bouncycastle.util.encoders.Base64; import org.pgpainless.PGPainless; -import org.pgpainless.key.OpenPgpFingerprint; import pgp.certificate_store.Certificate; import pgp.certificate_store.CertificateReaderBackend; @@ -22,28 +17,6 @@ public class CertificateReader implements CertificateReaderBackend { @Override public Certificate readCertificate(InputStream inputStream) throws IOException { final PGPPublicKeyRing certificate = PGPainless.readKeyRing().publicKeyRing(inputStream); - return new Certificate() { - @Override - public String getFingerprint() { - return OpenPgpFingerprint.of(certificate).toString().toLowerCase(); - } - - @Override - public InputStream getInputStream() throws IOException { - return new ByteArrayInputStream(certificate.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(certificate.getEncoded()); - return Base64.toBase64String(digest.digest()); - } - }; + return CertificateFactory.certificateFromPublicKeyRing(certificate); } } diff --git a/settings.gradle b/settings.gradle index 6d1f5e29..7ccfc273 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,7 +8,7 @@ include 'pgpainless-core', 'pgpainless-sop', 'pgpainless-cli', 'pgpainless-cert-d', + 'pgpainless-cert-d-cli', 'pgp-certificate-store', - 'pgp-cert-d-java', - 'pgp-cert-d-cli' + 'pgp-cert-d-java'