diff options
Diffstat (limited to 'OpenPGP-Keychain-API/libraries/keychain-api-library/src/org/openintents/openpgp/util/OpenPgpApi.java')
-rw-r--r-- | OpenPGP-Keychain-API/libraries/keychain-api-library/src/org/openintents/openpgp/util/OpenPgpApi.java | 222 |
1 files changed, 123 insertions, 99 deletions
diff --git a/OpenPGP-Keychain-API/libraries/keychain-api-library/src/org/openintents/openpgp/util/OpenPgpApi.java b/OpenPGP-Keychain-API/libraries/keychain-api-library/src/org/openintents/openpgp/util/OpenPgpApi.java index 41cbfec59..ed1a7540a 100644 --- a/OpenPGP-Keychain-API/libraries/keychain-api-library/src/org/openintents/openpgp/util/OpenPgpApi.java +++ b/OpenPGP-Keychain-API/libraries/keychain-api-library/src/org/openintents/openpgp/util/OpenPgpApi.java @@ -17,9 +17,9 @@ package org.openintents.openpgp.util; import android.content.Context; +import android.content.Intent; import android.os.AsyncTask; import android.os.Build; -import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.util.Log; @@ -31,104 +31,143 @@ import java.io.OutputStream; public class OpenPgpApi { + //TODO: fix this documentation + /** + * General extras + * -------------- + * + * Intent extras: + * int api_version (required) + * boolean ascii_armor (request ascii armor for ouput) + * + * returned Bundle: + * int result_code (0, 1, or 2 (see OpenPgpApi)) + * OpenPgpError error (if result_code == 0) + * Intent intent (if result_code == 2) + */ + + /** + * Sign only + * + * optional params: + * String passphrase (for key passphrase) + */ + + /** + * Encrypt + * + * Intent extras: + * long[] key_ids + * or + * String[] user_ids (= emails of recipients) (if more than one key has this user_id, a PendingIntent is returned) + * + * optional extras: + * String passphrase (for key passphrase) + */ + + /** + * Sign and encrypt + * + * Intent extras: + * same as in encrypt() + */ + + /** + * Decrypts and verifies given input bytes. This methods handles encrypted-only, signed-and-encrypted, + * and also signed-only input. + * + * returned Bundle: + * OpenPgpSignatureResult signature_result + */ + + /** + * Retrieves key ids based on given user ids (=emails) + * + * Intent extras: + * String[] user_ids + * + * returned Bundle: + * long[] key_ids + */ + + public static final String TAG = "OpenPgp API"; + + public static final int API_VERSION = 2; + public static final String SERVICE_INTENT = "org.openintents.openpgp.IOpenPgpService"; + + public static final String ACTION_SIGN = "org.openintents.openpgp.action.SIGN"; + public static final String ACTION_ENCRYPT = "org.openintents.openpgp.action.ENCRYPT"; + public static final String ACTION_SIGN_AND_ENCTYPT = "org.openintents.openpgp.action.SIGN_AND_ENCRYPT"; + public static final String ACTION_DECRYPT_VERIFY = "org.openintents.openpgp.action.DECRYPT_VERIFY"; + public static final String ACTION_DOWNLOAD_KEYS = "org.openintents.openpgp.action.DOWNLOAD_KEYS"; + public static final String ACTION_GET_KEY_IDS = "org.openintents.openpgp.action.GET_KEY_IDS"; + + /* Bundle params */ + public static final String EXTRA_API_VERSION = "api_version"; + + // SIGN, ENCRYPT, SIGN_ENCRYPT, DECRYPT_VERIFY + // request ASCII Armor for output + // OpenPGP Radix-64, 33 percent overhead compared to binary, see http://tools.ietf.org/html/rfc4880#page-53) + public static final String EXTRA_REQUEST_ASCII_ARMOR = "ascii_armor"; + + // ENCRYPT, SIGN_ENCRYPT + public static final String EXTRA_USER_IDS = "user_ids"; + public static final String EXTRA_KEY_IDS = "key_ids"; + // optional parameter: + public static final String EXTRA_PASSPHRASE = "passphrase"; + + /* Service Bundle returns */ + public static final String RESULT_CODE = "result_code"; + public static final String RESULT_SIGNATURE = "signature"; + public static final String RESULT_ERRORS = "error"; + public static final String RESULT_INTENT = "intent"; + + // get actual error object from RESULT_ERRORS + public static final int RESULT_CODE_ERROR = 0; + // success! + public static final int RESULT_CODE_SUCCESS = 1; + // executeServiceMethod intent and do it again with intent + public static final int RESULT_CODE_USER_INTERACTION_REQUIRED = 2; + + IOpenPgpService mService; Context mContext; - private static final int OPERATION_SIGN = 0; - private static final int OPERATION_ENCRYPT = 1; - private static final int OPERATION_SIGN_ENCRYPT = 2; - private static final int OPERATION_DECRYPT_VERIFY = 3; - private static final int OPERATION_GET_KEY_IDS = 4; - public OpenPgpApi(Context context, IOpenPgpService service) { this.mContext = context; this.mService = service; } - public Bundle sign(InputStream is, final OutputStream os) { - return executeApi(OPERATION_SIGN, new Bundle(), is, os); - } - - public Bundle sign(Bundle params, InputStream is, final OutputStream os) { - return executeApi(OPERATION_SIGN, params, is, os); - } - - public void sign(Bundle params, InputStream is, final OutputStream os, IOpenPgpCallback callback) { - executeApiAsync(OPERATION_SIGN, params, is, os, callback); - } - - public Bundle encrypt(InputStream is, final OutputStream os) { - return executeApi(OPERATION_ENCRYPT, new Bundle(), is, os); - } - - public Bundle encrypt(Bundle params, InputStream is, final OutputStream os) { - return executeApi(OPERATION_ENCRYPT, params, is, os); - } - - public void encrypt(Bundle params, InputStream is, final OutputStream os, IOpenPgpCallback callback) { - executeApiAsync(OPERATION_ENCRYPT, params, is, os, callback); - } - - public Bundle signAndEncrypt(InputStream is, final OutputStream os) { - return executeApi(OPERATION_SIGN_ENCRYPT, new Bundle(), is, os); - } - - public Bundle signAndEncrypt(Bundle params, InputStream is, final OutputStream os) { - return executeApi(OPERATION_SIGN_ENCRYPT, params, is, os); - } - - public void signAndEncrypt(Bundle params, InputStream is, final OutputStream os, IOpenPgpCallback callback) { - executeApiAsync(OPERATION_SIGN_ENCRYPT, params, is, os, callback); - } - - public Bundle decryptAndVerify(InputStream is, final OutputStream os) { - return executeApi(OPERATION_DECRYPT_VERIFY, new Bundle(), is, os); - } - - public Bundle decryptAndVerify(Bundle params, InputStream is, final OutputStream os) { - return executeApi(OPERATION_DECRYPT_VERIFY, params, is, os); - } - - public void decryptAndVerify(Bundle params, InputStream is, final OutputStream os, IOpenPgpCallback callback) { - executeApiAsync(OPERATION_DECRYPT_VERIFY, params, is, os, callback); - } - - public Bundle getKeyIds(Bundle params) { - return executeApi(OPERATION_GET_KEY_IDS, params, null, null); - } - public interface IOpenPgpCallback { - void onReturn(final Bundle result); + void onReturn(final Intent result); } - private class OpenPgpAsyncTask extends AsyncTask<Void, Integer, Bundle> { - int operationId; - Bundle params; + private class OpenPgpAsyncTask extends AsyncTask<Void, Integer, Intent> { + Intent data; InputStream is; OutputStream os; IOpenPgpCallback callback; - private OpenPgpAsyncTask(int operationId, Bundle params, InputStream is, OutputStream os, IOpenPgpCallback callback) { - this.operationId = operationId; - this.params = params; + private OpenPgpAsyncTask(Intent data, InputStream is, OutputStream os, IOpenPgpCallback callback) { + this.data = data; this.is = is; this.os = os; this.callback = callback; } @Override - protected Bundle doInBackground(Void... unused) { - return executeApi(operationId, params, is, os); + protected Intent doInBackground(Void... unused) { + return executeApi(data, is, os); } - protected void onPostExecute(Bundle result) { + protected void onPostExecute(Intent result) { callback.onReturn(result); } } - private void executeApiAsync(int operationId, Bundle params, InputStream is, OutputStream os, IOpenPgpCallback callback) { - OpenPgpAsyncTask task = new OpenPgpAsyncTask(operationId, params, is, os, callback); + public void executeApiAsync(Intent data, InputStream is, OutputStream os, IOpenPgpCallback callback) { + OpenPgpAsyncTask task = new OpenPgpAsyncTask(data, is, os, callback); // don't serialize async tasks! // http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html @@ -139,14 +178,14 @@ public class OpenPgpApi { } } - private Bundle executeApi(int operationId, Bundle params, InputStream is, OutputStream os) { + public Intent executeApi(Intent data, InputStream is, OutputStream os) { try { - params.putInt(OpenPgpConstants.PARAMS_API_VERSION, OpenPgpConstants.API_VERSION); + data.putExtra(EXTRA_API_VERSION, OpenPgpApi.API_VERSION); - Bundle result = null; + Intent result = null; - if (operationId == OPERATION_GET_KEY_IDS) { - result = mService.getKeyIds(params); + if (ACTION_GET_KEY_IDS.equals(data.getAction())) { + result = mService.execute(data, null, null); return result; } else { // send the input and output pfds @@ -155,7 +194,7 @@ public class OpenPgpApi { @Override public void onThreadFinished(Thread thread) { - Log.d(OpenPgpConstants.TAG, "Copy to service finished"); + Log.d(OpenPgpApi.TAG, "Copy to service finished"); } }); ParcelFileDescriptor output = ParcelFileDescriptorUtil.pipeTo(os, @@ -163,45 +202,30 @@ public class OpenPgpApi { @Override public void onThreadFinished(Thread thread) { - Log.d(OpenPgpConstants.TAG, "Service finished writing!"); + Log.d(OpenPgpApi.TAG, "Service finished writing!"); } }); - // blocks until result is ready - switch (operationId) { - case OPERATION_SIGN: - result = mService.sign(params, input, output); - break; - case OPERATION_ENCRYPT: - result = mService.encrypt(params, input, output); - break; - case OPERATION_SIGN_ENCRYPT: - result = mService.signAndEncrypt(params, input, output); - break; - case OPERATION_DECRYPT_VERIFY: - result = mService.decryptAndVerify(params, input, output); - break; - } + result = mService.execute(data, input, output); // close() is required to halt the TransferThread output.close(); // set class loader to current context to allow unparcelling // of OpenPgpError and OpenPgpSignatureResult // http://stackoverflow.com/a/3806769 - result.setClassLoader(mContext.getClassLoader()); + result.setExtrasClassLoader(mContext.getClassLoader()); return result; } } catch (Exception e) { - Log.e(OpenPgpConstants.TAG, "Exception", e); - Bundle result = new Bundle(); - result.putInt(OpenPgpConstants.RESULT_CODE, OpenPgpConstants.RESULT_CODE_ERROR); - result.putParcelable(OpenPgpConstants.RESULT_ERRORS, + Log.e(OpenPgpApi.TAG, "Exception", e); + Intent result = new Intent(); + result.putExtra(RESULT_CODE, RESULT_CODE_ERROR); + result.putExtra(RESULT_ERRORS, new OpenPgpError(OpenPgpError.CLIENT_SIDE_ERROR, e.getMessage())); return result; } } - } |