From 710a0d8fe8d89cb9a1f247007000a7f49a29c527 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Thu, 10 Mar 2016 18:31:30 +0100 Subject: add extra for opportunistic encryption and according return status --- openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpError.java | 2 ++ openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpApi.java | 1 + 2 files changed, 3 insertions(+) (limited to 'openpgp-api') 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/util/OpenPgpApi.java b/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpApi.java index 658823a..fe019ab 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 @@ -236,6 +236,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"; -- cgit v1.2.3 From f027645214ff41a54e15cc46058ce9f1867cad5f Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Fri, 29 Apr 2016 15:46:03 +0200 Subject: add optional cached sessionKey to OpenPgpDecryptionResult --- .../openpgp/OpenPgpDecryptionResult.java | 39 ++++++++++++++++------ .../org/openintents/openpgp/util/OpenPgpApi.java | 2 ++ 2 files changed, 30 insertions(+), 11 deletions(-) (limited to 'openpgp-api') 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 CREATOR = new Creator() { 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/util/OpenPgpApi.java b/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpApi.java index fe019ab..5fb2382 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 @@ -261,6 +261,8 @@ 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"; -- cgit v1.2.3 From e0bf61df93c07bdc52d83c2f9f192d738b695ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Mon, 15 Feb 2016 23:49:22 +0100 Subject: Add BACKUP, RESTORE, IMPORT_KEY actions Conflicts: openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpApi.java --- .../org/openintents/openpgp/util/OpenPgpApi.java | 39 ++++++++++++++++------ 1 file changed, 29 insertions(+), 10 deletions(-) (limited to 'openpgp-api') 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 5fb2382..c88732c 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 @@ -65,14 +65,7 @@ public class OpenPgpApi { */ public static final String ACTION_CHECK_PERMISSION = "org.openintents.openpgp.action.CHECK_PERMISSION"; - /** - * DEPRECATED - * Same as ACTION_CLEARTEXT_SIGN - *

- * 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"; /** @@ -212,11 +205,34 @@ public class OpenPgpApi { */ public static final String ACTION_GET_KEY = "org.openintents.openpgp.action.GET_KEY"; + /** + * Backup keys + *

+ * required extras: + * long[] EXTRA_KEY_IDS + * boolean EXTRA_BACKUP_SECRET + * + */ + public static final String ACTION_BACKUP = "org.openintents.openpgp.action.BACKUP"; + + /** + * Restore keys + * + */ + public static final String ACTION_RESTORE = "org.openintents.openpgp.action.RESTORE"; + + /** + * Import keys from input stream. Will return RESULT_CODE_USER_INTERACTION_REQUIRED to let the + * user acknowledge the import. + * + */ + public static final String ACTION_IMPORT_KEY = "org.openintents.openpgp.action.IMPORT_KEYS"; + /* 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 @@ -245,6 +261,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"; @@ -269,7 +288,7 @@ public class OpenPgpApi { // 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"; -- cgit v1.2.3 From e7d72da343c6a42da6d1beb98ac8014da7cbce30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Mon, 22 Feb 2016 20:41:04 +0100 Subject: Improve documentation Conflicts: openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpApi.java --- .../openpgp/OpenPgpSignatureResult.java | 11 ++++------- .../org/openintents/openpgp/util/OpenPgpApi.java | 23 ++++++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) (limited to 'openpgp-api') 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 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 c88732c..5417f6b 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 @@ -201,32 +201,35 @@ public class OpenPgpApi { *

* 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 keys + * 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 - * boolean EXTRA_BACKUP_SECRET - * + * 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"; /** - * Restore keys + * Restore keys given a backup as InputStream. + * This operation always requires user interaction with RESULT_CODE_USER_INTERACTION_REQUIRED! * + * NOT IMPLEMENTED RIGHT NOW! */ - public static final String ACTION_RESTORE = "org.openintents.openpgp.action.RESTORE"; + private static final String ACTION_RESTORE = "org.openintents.openpgp.action.RESTORE"; /** - * Import keys from input stream. Will return RESULT_CODE_USER_INTERACTION_REQUIRED to let the - * user acknowledge the import. + * Import keys from InputStream. Only public keys will be imported! * + * NOT IMPLEMENTED RIGHT NOW! */ - public static final String ACTION_IMPORT_KEY = "org.openintents.openpgp.action.IMPORT_KEYS"; + private static final String ACTION_IMPORT_KEY = "org.openintents.openpgp.action.IMPORT_KEYS"; /* Intent extras */ -- cgit v1.2.3 From 0c224191a159162ffde232770848ff5805d4d522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 1 Mar 2016 00:21:28 +0100 Subject: Add EXTRA_REQUEST_ASCII_ARMOR to ACTION_BACKUP --- .../src/main/java/org/openintents/openpgp/util/OpenPgpApi.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'openpgp-api') 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 5417f6b..da594b6 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 @@ -211,8 +211,11 @@ public class OpenPgpApi { * 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) + * long[] EXTRA_KEY_IDS (keys that should be included in the backup) + * boolean EXTRA_BACKUP_SECRET (also backup secret keys) + *

+ * optional extras: + * String EXTRA_REQUEST_ASCII_ARMOR (request that the returned backup is encoded in ASCII Armor) */ public static final String ACTION_BACKUP = "org.openintents.openpgp.action.BACKUP"; -- cgit v1.2.3 From 708667cd78cb6a1070ed1a8214330a1854b063df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Sat, 7 May 2016 12:10:11 +0300 Subject: API docs cleanup --- .../org/openintents/openpgp/util/OpenPgpApi.java | 67 ++++++++-------------- 1 file changed, 24 insertions(+), 43 deletions(-) (limited to 'openpgp-api') 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 da594b6..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,7 +60,7 @@ 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"; @@ -74,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 - *

+ * * required extras: * long EXTRA_SIGN_KEY_ID (key id of signing key) - *

+ * * optional extras: * char[] EXTRA_PASSPHRASE (key passphrase) */ @@ -87,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. - *

+ * * required extras: * long EXTRA_SIGN_KEY_ID (key id of signing key) - *

+ * * optional extras: * boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for detached signature) * char[] EXTRA_PASSPHRASE (key passphrase) - *

+ * * returned extras: * byte[] RESULT_DETACHED_SIGNATURE * String RESULT_SIGNATURE_MICALG (contains the name of the used signature algorithm as a string) @@ -103,12 +103,12 @@ public class OpenPgpApi { /** * Encrypt - *

+ * * 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 - *

+ * * optional extras: * boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for output) * char[] EXTRA_PASSPHRASE (key passphrase) @@ -119,12 +119,12 @@ public class OpenPgpApi { /** * Sign and encrypt - *

+ * * 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 - *

+ * * optional extras: * long EXTRA_SIGN_KEY_ID (key id of signing key) * boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for output) @@ -138,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! - *

+ * * 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. - *

+ * * optional extras: * byte[] EXTRA_DETACHED_SIGNATURE (detached signature) - *

+ * * returned extras: * OpenPgpSignatureResult RESULT_SIGNATURE * OpenPgpDecryptionResult RESULT_DECRYPTION @@ -157,9 +157,9 @@ public class OpenPgpApi { /** * Decrypts the header of an encrypted file to retrieve metadata such as original filename. - *

+ * * This does not decrypt the actual content of the file. - *

+ * * returned extras: * OpenPgpDecryptMetadata RESULT_METADATA * String RESULT_CHARSET (charset which was specified in the headers of ascii armored input, if any) @@ -168,10 +168,10 @@ public class OpenPgpApi { /** * Select key id for signing - *

+ * * optional extras: * String EXTRA_USER_ID - *

+ * * returned extras: * long EXTRA_SIGN_KEY_ID */ @@ -179,10 +179,10 @@ public class OpenPgpApi { /** * Get key ids based on given user ids (=emails) - *

+ * * required extras: * String[] EXTRA_USER_IDS - *

+ * * returned extras: * long[] RESULT_KEY_IDS */ @@ -191,14 +191,14 @@ 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. - *

+ * * 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. - *

+ * * If an Output stream has been defined the whole public key is returned. * required extras: * long EXTRA_KEY_ID - *

+ * * optional extras: * String EXTRA_REQUEST_ASCII_ARMOR (request that the returned key is encoded in ASCII Armor) */ @@ -209,32 +209,13 @@ public class OpenPgpApi { * 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) - *

- * optional extras: - * String EXTRA_REQUEST_ASCII_ARMOR (request that the returned backup is encoded in ASCII Armor) */ public static final String ACTION_BACKUP = "org.openintents.openpgp.action.BACKUP"; - /** - * Restore keys given a backup as InputStream. - * This operation always requires user interaction with RESULT_CODE_USER_INTERACTION_REQUIRED! - * - * NOT IMPLEMENTED RIGHT NOW! - */ - private static final String ACTION_RESTORE = "org.openintents.openpgp.action.RESTORE"; - - /** - * Import keys from InputStream. Only public keys will be imported! - * - * NOT IMPLEMENTED RIGHT NOW! - */ - private static final String ACTION_IMPORT_KEY = "org.openintents.openpgp.action.IMPORT_KEYS"; - - /* Intent extras */ public static final String EXTRA_API_VERSION = "api_version"; @@ -385,7 +366,7 @@ public class OpenPgpApi { Intent result; - Thread pumpThread =null; + Thread pumpThread = null; int outputPipeId = 0; if (os != null) { -- cgit v1.2.3