mirror of
https://codeberg.org/PGPainless/cert-d-pgpainless.git
synced 2024-12-22 05:17:56 +01:00
Adopt latest changes from pgp-cert-d and add armor headers for get command
This commit is contained in:
parent
7b6162682e
commit
33d93cc39a
5 changed files with 25 additions and 86 deletions
|
@ -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 {
|
||||
|
|
|
@ -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<Long> subkeyIds = new ArrayList<>();
|
||||
Iterator<PGPPublicKey> 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<Long> getSubkeyIds() throws IOException {
|
||||
List<Long> keyIds = new ArrayList<>();
|
||||
Iterator<PGPPublicKey> keys = publicKeyRing.getPublicKeys();
|
||||
while (keys.hasNext()) {
|
||||
keyIds.add(keys.next().getKeyID());
|
||||
}
|
||||
return keyIds;
|
||||
}
|
||||
};
|
||||
return new Certificate(bytes, fingerprint, subkeyIds, tag);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<Long> 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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue