aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2014-05-23 16:48:41 +0200
committerVincent Breitmoser <valodim@mugenguild.com>2014-05-23 16:48:41 +0200
commitc107fc668fb6ef1be2e2775fd2143fb2235942b2 (patch)
tree66d340c661bd275f970a5e4652130c800a7c4c71 /OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java
parent91a8a6c2d1f243f0a3f13b11fd1f920b34717116 (diff)
downloadopen-keychain-c107fc668fb6ef1be2e2775fd2143fb2235942b2.tar.gz
open-keychain-c107fc668fb6ef1be2e2775fd2143fb2235942b2.tar.bz2
open-keychain-c107fc668fb6ef1be2e2775fd2143fb2235942b2.zip
introduce WrappedSignature for the ViewCert* ui code
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java124
1 files changed, 124 insertions, 0 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java
new file mode 100644
index 000000000..cdadbca7f
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java
@@ -0,0 +1,124 @@
+package org.sufficientlysecure.keychain.pgp;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+import org.spongycastle.bcpg.sig.RevocationReason;
+import org.spongycastle.openpgp.PGPException;
+import org.spongycastle.openpgp.PGPObjectFactory;
+import org.spongycastle.openpgp.PGPSignature;
+import org.spongycastle.openpgp.PGPSignatureList;
+import org.spongycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider;
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.io.IOException;
+import java.security.SignatureException;
+
+public class WrappedSignature {
+
+ public static final int DEFAULT_CERTIFICATION = PGPSignature.DEFAULT_CERTIFICATION;
+ public static final int NO_CERTIFICATION = PGPSignature.NO_CERTIFICATION;
+ public static final int CASUAL_CERTIFICATION = PGPSignature.CASUAL_CERTIFICATION;
+ public static final int POSITIVE_CERTIFICATION = PGPSignature.POSITIVE_CERTIFICATION;
+ public static final int CERTIFICATION_REVOCATION = PGPSignature.CERTIFICATION_REVOCATION;
+
+ final PGPSignature mSig;
+
+ protected WrappedSignature(PGPSignature sig) {
+ mSig = sig;
+ }
+
+ public long getKeyId() {
+ return mSig.getKeyID();
+ }
+
+ public int getKeyAlgorithm() {
+ return mSig.getKeyAlgorithm();
+ }
+
+ public void init(WrappedPublicKey key) throws PgpGeneralException {
+ try {
+ JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider =
+ new JcaPGPContentVerifierBuilderProvider()
+ .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
+ mSig.init(contentVerifierBuilderProvider, key.getPublicKey());
+ } catch(PGPException e) {
+ throw new PgpGeneralException(e);
+ }
+ }
+
+ public void update(byte[] data, int offset, int length) throws PgpGeneralException {
+ try {
+ mSig.update(data, offset, length);
+ } catch(SignatureException e) {
+ throw new PgpGeneralException(e);
+ }
+ }
+
+ public void update(byte data) throws PgpGeneralException {
+ try {
+ mSig.update(data);
+ } catch(SignatureException e) {
+ throw new PgpGeneralException(e);
+ }
+ }
+
+ public boolean verify() throws PgpGeneralException {
+ try {
+ return mSig.verify();
+ } catch(SignatureException e) {
+ throw new PgpGeneralException(e);
+ } catch(PGPException e) {
+ throw new PgpGeneralException(e);
+ }
+ }
+
+ public boolean isRevocation() {
+ return mSig.getHashedSubPackets().hasSubpacket(SignatureSubpacketTags.REVOCATION_REASON);
+ }
+
+ public String getRevocationReason() throws PgpGeneralException {
+ if(!isRevocation()) {
+ throw new PgpGeneralException("Not a revocation signature.");
+ }
+ SignatureSubpacket p = mSig.getHashedSubPackets().getSubpacket(
+ SignatureSubpacketTags.REVOCATION_REASON);
+ // For some reason, this is missing in SignatureSubpacketInputStream:146
+ if (!(p instanceof RevocationReason)) {
+ p = new RevocationReason(false, p.getData());
+ }
+ return ((RevocationReason) p).getRevocationDescription();
+ }
+
+ /** Verify a signature for this pubkey, after it has been initialized by the signer using
+ * initSignature(). This method should probably move into a wrapped PGPSignature class
+ * at some point.
+ */
+ public boolean verifySignature(WrappedPublicKey key, String uid) throws PgpGeneralException {
+ try {
+ return mSig.verifyCertification(uid, key.getPublicKey());
+ } catch (SignatureException e) {
+ throw new PgpGeneralException("Error!", e);
+ } catch (PGPException e) {
+ throw new PgpGeneralException("Error!", e);
+ }
+ }
+
+ public static WrappedSignature fromBytes(byte[] data) {
+ PGPObjectFactory factory = new PGPObjectFactory(data);
+ PGPSignatureList signatures = null;
+ try {
+ if ((signatures = (PGPSignatureList) factory.nextObject()) == null || signatures.isEmpty()) {
+ Log.e(Constants.TAG, "No signatures given!");
+ return null;
+ }
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "Error while converting to PGPSignature!", e);
+ return null;
+ }
+
+ return new WrappedSignature(signatures.get(0));
+ }
+
+}