aboutsummaryrefslogtreecommitdiffstats
path: root/openpgp-api
diff options
context:
space:
mode:
authorDominik Schürmann <dominik@dominikschuermann.de>2016-05-07 12:20:03 +0300
committerDominik Schürmann <dominik@dominikschuermann.de>2016-05-07 12:20:03 +0300
commite908a2122c717463ebed21e850f5ef8770dfb9de (patch)
treedb66c395f3c9cb1b5b4e2452b5802b0ab8953aa3 /openpgp-api
parentab5fec23d751a017ab0fdac93950c00ce7b8c1dc (diff)
parentdeb09151190336097078a5b8738b9aa235cc1aa7 (diff)
downloadopenpgp-api-e908a2122c717463ebed21e850f5ef8770dfb9de.tar.gz
openpgp-api-e908a2122c717463ebed21e850f5ef8770dfb9de.tar.bz2
openpgp-api-e908a2122c717463ebed21e850f5ef8770dfb9de.zip
Merge branch 'master' of github.com:open-keychain/openpgp-api
Diffstat (limited to 'openpgp-api')
-rw-r--r--openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpDecryptionResult.java39
-rw-r--r--openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpError.java2
-rw-r--r--openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpSignatureResult.java11
-rw-r--r--openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpApi.java77
4 files changed, 77 insertions, 52 deletions
diff --git a/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpDecryptionResult.java b/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpDecryptionResult.java
index 2090b55..513b502 100644
--- a/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpDecryptionResult.java
+++ b/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpDecryptionResult.java
@@ -25,7 +25,7 @@ public class OpenPgpDecryptionResult implements Parcelable {
* old versions of the protocol (and thus old versions of this class), we need a versioning
* system for the parcels sent between the clients and the providers.
*/
- public static final int PARCELABLE_VERSION = 1;
+ public static final int PARCELABLE_VERSION = 2;
// content not encrypted
public static final int RESULT_NOT_ENCRYPTED = -1;
@@ -34,26 +34,37 @@ public class OpenPgpDecryptionResult implements Parcelable {
// encrypted
public static final int RESULT_ENCRYPTED = 1;
- int result;
+ public final int result;
+ public final byte[] sessionKey;
+ public final byte[] decryptedSessionKey;
public int getResult() {
return result;
}
- public void setResult(int result) {
+ public OpenPgpDecryptionResult(int result) {
this.result = result;
+ this.sessionKey = null;
+ this.decryptedSessionKey = null;
}
- public OpenPgpDecryptionResult() {
-
- }
-
- public OpenPgpDecryptionResult(int result) {
+ public OpenPgpDecryptionResult(int result, byte[] sessionKey, byte[] decryptedSessionKey) {
this.result = result;
+ if ((sessionKey == null) != (decryptedSessionKey == null)) {
+ throw new AssertionError("sessionkey must be null iff decryptedSessionKey is null");
+ }
+ this.sessionKey = sessionKey;
+ this.decryptedSessionKey = decryptedSessionKey;
}
public OpenPgpDecryptionResult(OpenPgpDecryptionResult b) {
this.result = b.result;
+ this.sessionKey = b.sessionKey;
+ this.decryptedSessionKey = b.decryptedSessionKey;
+ }
+
+ public boolean hasDecryptedSessionKey() {
+ return sessionKey != null;
}
public int describeContents() {
@@ -73,6 +84,9 @@ public class OpenPgpDecryptionResult implements Parcelable {
int startPosition = dest.dataPosition();
// version 1
dest.writeInt(result);
+ // version 2
+ dest.writeByteArray(sessionKey);
+ dest.writeByteArray(decryptedSessionKey);
// Go back and write the size
int parcelableSize = dest.dataPosition() - startPosition;
dest.setDataPosition(sizePosition);
@@ -82,12 +96,15 @@ public class OpenPgpDecryptionResult implements Parcelable {
public static final Creator<OpenPgpDecryptionResult> CREATOR = new Creator<OpenPgpDecryptionResult>() {
public OpenPgpDecryptionResult createFromParcel(final Parcel source) {
- source.readInt(); // parcelableVersion
+ int version = source.readInt(); // parcelableVersion
int parcelableSize = source.readInt();
int startPosition = source.dataPosition();
- OpenPgpDecryptionResult vr = new OpenPgpDecryptionResult();
- vr.result = source.readInt();
+ int result = source.readInt();
+ byte[] sessionKey = version > 1 ? source.createByteArray() : null;
+ byte[] decryptedSessionKey = version > 1 ? source.createByteArray() : null;
+
+ OpenPgpDecryptionResult vr = new OpenPgpDecryptionResult(result, sessionKey, decryptedSessionKey);
// skip over all fields added in future versions of this parcel
source.setDataPosition(startPosition + parcelableSize);
diff --git a/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpError.java b/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpError.java
index 69c39fd..67b10aa 100644
--- a/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpError.java
+++ b/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpError.java
@@ -33,6 +33,8 @@ public class OpenPgpError implements Parcelable {
public static final int INCOMPATIBLE_API_VERSIONS = 1;
public static final int NO_OR_WRONG_PASSPHRASE = 2;
public static final int NO_USER_IDS = 3;
+ public static final int OPPORTUNISTIC_MISSING_KEYS = 4;
+
int errorId;
String message;
diff --git a/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpSignatureResult.java b/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpSignatureResult.java
index f188968..ad3bb29 100644
--- a/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpSignatureResult.java
+++ b/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpSignatureResult.java
@@ -49,10 +49,11 @@ public class OpenPgpSignatureResult implements Parcelable {
public static final int RESULT_INVALID_INSECURE = 6;
int result;
- boolean signatureOnly;
String primaryUserId;
ArrayList<String> userIds;
long keyId;
+ @Deprecated
+ boolean signatureOnly;
public int getResult() {
return result;
@@ -62,16 +63,12 @@ public class OpenPgpSignatureResult implements Parcelable {
this.result = result;
}
- /**
- * @deprecated
- */
+ @Deprecated
public boolean isSignatureOnly() {
return signatureOnly;
}
- /**
- * @deprecated
- */
+ @Deprecated
public void setSignatureOnly(boolean signatureOnly) {
this.signatureOnly = signatureOnly;
}
diff --git a/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpApi.java b/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpApi.java
index 658823a..87a1605 100644
--- a/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpApi.java
+++ b/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpApi.java
@@ -60,19 +60,12 @@ public class OpenPgpApi {
* This action performs no operation, but can be used to check if the App has permission
* to access the API in general, returning a user interaction PendingIntent otherwise.
* This can be used to trigger the permission dialog explicitly.
- *
+ *
* This action uses no extras.
*/
public static final String ACTION_CHECK_PERMISSION = "org.openintents.openpgp.action.CHECK_PERMISSION";
- /**
- * DEPRECATED
- * Same as ACTION_CLEARTEXT_SIGN
- * <p/>
- * optional extras:
- * boolean EXTRA_REQUEST_ASCII_ARMOR (DEPRECATED: this makes no sense here)
- * char[] EXTRA_PASSPHRASE (key passphrase)
- */
+ @Deprecated
public static final String ACTION_SIGN = "org.openintents.openpgp.action.SIGN";
/**
@@ -81,10 +74,10 @@ public class OpenPgpApi {
* cleartext signatures per RFC 4880 before the text is actually signed:
* - end cleartext with newline
* - remove whitespaces on line endings
- * <p/>
+ *
* required extras:
* long EXTRA_SIGN_KEY_ID (key id of signing key)
- * <p/>
+ *
* optional extras:
* char[] EXTRA_PASSPHRASE (key passphrase)
*/
@@ -94,14 +87,14 @@ public class OpenPgpApi {
* Sign text or binary data resulting in a detached signature.
* No OutputStream necessary for ACTION_DETACHED_SIGN (No magic pre-processing like in ACTION_CLEARTEXT_SIGN)!
* The detached signature is returned separately in RESULT_DETACHED_SIGNATURE.
- * <p/>
+ *
* required extras:
* long EXTRA_SIGN_KEY_ID (key id of signing key)
- * <p/>
+ *
* optional extras:
* boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for detached signature)
* char[] EXTRA_PASSPHRASE (key passphrase)
- * <p/>
+ *
* returned extras:
* byte[] RESULT_DETACHED_SIGNATURE
* String RESULT_SIGNATURE_MICALG (contains the name of the used signature algorithm as a string)
@@ -110,12 +103,12 @@ public class OpenPgpApi {
/**
* Encrypt
- * <p/>
+ *
* required extras:
* String[] EXTRA_USER_IDS (=emails of recipients, if more than one key has a user_id, a PendingIntent is returned via RESULT_INTENT)
* or
* long[] EXTRA_KEY_IDS
- * <p/>
+ *
* optional extras:
* boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for output)
* char[] EXTRA_PASSPHRASE (key passphrase)
@@ -126,12 +119,12 @@ public class OpenPgpApi {
/**
* Sign and encrypt
- * <p/>
+ *
* required extras:
* String[] EXTRA_USER_IDS (=emails of recipients, if more than one key has a user_id, a PendingIntent is returned via RESULT_INTENT)
* or
* long[] EXTRA_KEY_IDS
- * <p/>
+ *
* optional extras:
* long EXTRA_SIGN_KEY_ID (key id of signing key)
* boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for output)
@@ -145,15 +138,15 @@ public class OpenPgpApi {
* Decrypts and verifies given input stream. This methods handles encrypted-only, signed-and-encrypted,
* and also signed-only input.
* OutputStream is optional, e.g., for verifying detached signatures!
- * <p/>
+ *
* If OpenPgpSignatureResult.getResult() == OpenPgpSignatureResult.RESULT_KEY_MISSING
* in addition a PendingIntent is returned via RESULT_INTENT to download missing keys.
* On all other status, in addition a PendingIntent is returned via RESULT_INTENT to open
* the key view in OpenKeychain.
- * <p/>
+ *
* optional extras:
* byte[] EXTRA_DETACHED_SIGNATURE (detached signature)
- * <p/>
+ *
* returned extras:
* OpenPgpSignatureResult RESULT_SIGNATURE
* OpenPgpDecryptionResult RESULT_DECRYPTION
@@ -164,9 +157,9 @@ public class OpenPgpApi {
/**
* Decrypts the header of an encrypted file to retrieve metadata such as original filename.
- * <p/>
+ *
* This does not decrypt the actual content of the file.
- * <p/>
+ *
* returned extras:
* OpenPgpDecryptMetadata RESULT_METADATA
* String RESULT_CHARSET (charset which was specified in the headers of ascii armored input, if any)
@@ -175,10 +168,10 @@ public class OpenPgpApi {
/**
* Select key id for signing
- * <p/>
+ *
* optional extras:
* String EXTRA_USER_ID
- * <p/>
+ *
* returned extras:
* long EXTRA_SIGN_KEY_ID
*/
@@ -186,10 +179,10 @@ public class OpenPgpApi {
/**
* Get key ids based on given user ids (=emails)
- * <p/>
+ *
* required extras:
* String[] EXTRA_USER_IDS
- * <p/>
+ *
* returned extras:
* long[] RESULT_KEY_IDS
*/
@@ -198,25 +191,35 @@ public class OpenPgpApi {
/**
* This action returns RESULT_CODE_SUCCESS if the OpenPGP Provider already has the key
* corresponding to the given key id in its database.
- * <p/>
+ *
* It returns RESULT_CODE_USER_INTERACTION_REQUIRED if the Provider does not have the key.
* The PendingIntent from RESULT_INTENT can be used to retrieve those from a keyserver.
- * <p/>
+ *
* If an Output stream has been defined the whole public key is returned.
* required extras:
* long EXTRA_KEY_ID
- * <p/>
+ *
* optional extras:
* String EXTRA_REQUEST_ASCII_ARMOR (request that the returned key is encoded in ASCII Armor)
- *
*/
public static final String ACTION_GET_KEY = "org.openintents.openpgp.action.GET_KEY";
+ /**
+ * Backup all keys given by EXTRA_KEY_IDS and if requested their secret parts.
+ * The encrypted backup will be written to the OutputStream.
+ * The client app has no access to the backup code used to encrypt the backup!
+ * This operation always requires user interaction with RESULT_CODE_USER_INTERACTION_REQUIRED!
+ *
+ * required extras:
+ * long[] EXTRA_KEY_IDS (keys that should be included in the backup)
+ * boolean EXTRA_BACKUP_SECRET (also backup secret keys)
+ */
+ public static final String ACTION_BACKUP = "org.openintents.openpgp.action.BACKUP";
/* Intent extras */
public static final String EXTRA_API_VERSION = "api_version";
- // DEPRECATED!!!
+ @Deprecated
public static final String EXTRA_ACCOUNT_NAME = "account_name";
// ACTION_DETACHED_SIGN, ENCRYPT, SIGN_AND_ENCRYPT, DECRYPT_VERIFY
@@ -236,6 +239,7 @@ public class OpenPgpApi {
public static final String EXTRA_PASSPHRASE = "passphrase";
public static final String EXTRA_ORIGINAL_FILENAME = "original_filename";
public static final String EXTRA_ENABLE_COMPRESSION = "enable_compression";
+ public static final String EXTRA_OPPORTUNISTIC_ENCRYPTION = "opportunistic";
// GET_SIGN_KEY_ID
public static final String EXTRA_USER_ID = "user_id";
@@ -244,6 +248,9 @@ public class OpenPgpApi {
public static final String EXTRA_KEY_ID = "key_id";
public static final String RESULT_KEY_IDS = "key_ids";
+ // BACKUP
+ public static final String EXTRA_BACKUP_SECRET = "backup_secret";
+
/* Service Intent returns */
public static final String RESULT_CODE = "result_code";
@@ -260,13 +267,15 @@ public class OpenPgpApi {
// DECRYPT_VERIFY
public static final String EXTRA_DETACHED_SIGNATURE = "detached_signature";
+ public static final String EXTRA_DECRYPTION_RESULT_WRAPPER = "decryption_result_wrapper";
+ public static final String EXTRA_DECRYPTION_RESULT = "decryption_result";
public static final String RESULT_SIGNATURE = "signature";
public static final String RESULT_DECRYPTION = "decryption";
public static final String RESULT_METADATA = "metadata";
// This will be the charset which was specified in the headers of ascii armored input, if any
public static final String RESULT_CHARSET = "charset";
- // INTERNAL, should not be used
+ // INTERNAL, must not be used
public static final String EXTRA_CALL_UUID1 = "call_uuid1";
public static final String EXTRA_CALL_UUID2 = "call_uuid2";
@@ -357,7 +366,7 @@ public class OpenPgpApi {
Intent result;
- Thread pumpThread =null;
+ Thread pumpThread = null;
int outputPipeId = 0;
if (os != null) {