Mercury-IM/domain/src/main/java/org/jivesoftware/smackx/signed/xep0285/signing/OpenPGPSigner.java

75 lines
2.6 KiB
Java

package org.jivesoftware.smackx.signed.xep0285.signing;
import org.bouncycastle.openpgp.PGPException;
import org.bouncycastle.openpgp.PGPSecretKeyRing;
import org.bouncycastle.openpgp.PGPSignature;
import org.bouncycastle.util.io.Streams;
import org.pgpainless.PGPainless;
import org.pgpainless.algorithm.HashAlgorithm;
import org.pgpainless.algorithm.PublicKeyAlgorithm;
import org.pgpainless.decryption_verification.OpenPgpMetadata;
import org.pgpainless.encryption_signing.EncryptionStream;
import org.pgpainless.key.protection.SecretKeyRingProtector;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class OpenPGPSigner implements Signer {
private final SecretKeyRingProtector protector;
private final PGPSecretKeyRing secretKey;
public OpenPGPSigner(PGPSecretKeyRing secretKey, SecretKeyRingProtector protector) {
this.protector = protector;
this.secretKey = secretKey;
}
@Override
public PGPSignature createSignature(byte[] data) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
try {
EncryptionStream signer = PGPainless.createEncryptor().onOutputStream(outputStream)
.doNotEncrypt()
.createDetachedSignature()
.signWith(protector, secretKey)
.noArmor();
Streams.pipeAll(inputStream, signer);
signer.close();
inputStream.close();
outputStream.close();
OpenPgpMetadata metadata = signer.getResult();
return metadata.getSignatures().iterator().next();
} catch (PGPException e) {
throw new IOException(e);
}
}
@Override
public String getAlgorithmName(PGPSignature signature) {
PublicKeyAlgorithm signAlgo = PublicKeyAlgorithm.fromId(signature.getKeyAlgorithm());
String signAlgoName;
switch (signAlgo) {
case RSA_GENERAL:
case RSA_ENCRYPT:
case RSA_SIGN:
signAlgoName = "RSA";
break;
case DSA:
signAlgoName = "DSA";
break;
case ECDSA:
signAlgoName = "ECDSA";
break;
default:
throw new IllegalArgumentException("Signature was signed with unknown signature algorithm: " + signature.getKeyAlgorithm());
}
signAlgoName += HashAlgorithm.fromId(signature.getHashAlgorithm());
return signAlgoName;
}
}