87 lines
2.6 KiB
Java
87 lines
2.6 KiB
Java
package org.bouncycastle.openpgp;
|
|
|
|
import org.bouncycastle.bcpg.PublicKeyAlgorithmTags;
|
|
import org.bouncycastle.openpgp.operator.PGPContentSigner;
|
|
import org.bouncycastle.openpgp.operator.PGPContentSignerBuilder;
|
|
|
|
import java.io.IOException;
|
|
import java.io.OutputStream;
|
|
|
|
/**
|
|
* Generator for authentication signatures.
|
|
*/
|
|
public class AuthenticationSignatureGenerator {
|
|
private OutputStream sigOut;
|
|
private PGPContentSignerBuilder contentSignerBuilder;
|
|
private PGPContentSigner contentSigner;
|
|
private int sigType;
|
|
|
|
/**
|
|
* Create a signature generator built on the passed in contentSignerBuilder.
|
|
*
|
|
* @param contentSignerBuilder builder to produce PGPContentSigner objects for generating signatures.
|
|
*/
|
|
public AuthenticationSignatureGenerator(PGPContentSignerBuilder contentSignerBuilder) {
|
|
this.contentSignerBuilder = contentSignerBuilder;
|
|
}
|
|
|
|
/**
|
|
* Initialise the generator for signing.
|
|
*
|
|
* @param signatureType
|
|
* @param key
|
|
* @throws PGPException
|
|
*/
|
|
public void init(int signatureType, PGPPrivateKey key) throws PGPException {
|
|
contentSigner = contentSignerBuilder.build(signatureType, key);
|
|
sigOut = contentSigner.getOutputStream();
|
|
sigType = contentSigner.getType();
|
|
}
|
|
|
|
public void update(byte b) {
|
|
byteUpdate(b);
|
|
}
|
|
|
|
public void update(byte[] b) {
|
|
update(b, 0, b.length);
|
|
}
|
|
|
|
public void update(byte[] b, int off, int len) {
|
|
blockUpdate(b, off, len);
|
|
}
|
|
|
|
private void byteUpdate(byte b) {
|
|
try {
|
|
sigOut.write(b);
|
|
} catch (IOException e) {
|
|
throw new PGPRuntimeOperationException(e.getMessage(), e);
|
|
}
|
|
}
|
|
|
|
private void blockUpdate(byte[] block, int off, int len) {
|
|
try {
|
|
sigOut.write(block, off, len);
|
|
} catch (IOException e) {
|
|
throw new PGPRuntimeOperationException(e.getMessage(), e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return the signature.
|
|
*
|
|
* @return byte[]
|
|
* @throws PGPException
|
|
*/
|
|
public byte[] getSignature() throws PGPException {
|
|
if (contentSigner.getKeyAlgorithm() == PublicKeyAlgorithmTags.RSA_SIGN
|
|
|| contentSigner.getKeyAlgorithm() == PublicKeyAlgorithmTags.RSA_GENERAL
|
|
|| contentSigner.getKeyAlgorithm() == PublicKeyAlgorithmTags.EDDSA
|
|
|| contentSigner.getKeyAlgorithm() == PublicKeyAlgorithmTags.ECDSA
|
|
|| contentSigner.getKeyAlgorithm() == PublicKeyAlgorithmTags.DSA) {
|
|
return contentSigner.getSignature();
|
|
} else {
|
|
throw new UnsupportedOperationException("Unsupported algorithm");
|
|
}
|
|
}
|
|
}
|