From 61451fa5b5dd197eede698ff8fe590cb46ced9f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 28 May 2013 23:42:45 +0200 Subject: [PATCH 01/26] update API --- .../crypto/CryptoServiceConnection.java | 16 +++++++++ .../com/android/crypto/ICryptoService.aidl | 34 +++++++++---------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/OpenPGP-Keychain/src/com/android/crypto/CryptoServiceConnection.java b/OpenPGP-Keychain/src/com/android/crypto/CryptoServiceConnection.java index 4d659d344..96a07a067 100644 --- a/OpenPGP-Keychain/src/com/android/crypto/CryptoServiceConnection.java +++ b/OpenPGP-Keychain/src/com/android/crypto/CryptoServiceConnection.java @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2013 Dominik Schürmann + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.android.crypto; import android.content.ComponentName; diff --git a/OpenPGP-Keychain/src/com/android/crypto/ICryptoService.aidl b/OpenPGP-Keychain/src/com/android/crypto/ICryptoService.aidl index 05baa16e0..0f295d183 100644 --- a/OpenPGP-Keychain/src/com/android/crypto/ICryptoService.aidl +++ b/OpenPGP-Keychain/src/com/android/crypto/ICryptoService.aidl @@ -29,38 +29,36 @@ interface ICryptoService { * * @param inputBytes * Byte array you want to encrypt - * @param encryptionKeyIds - * Ids of public keys used for encryption - * @param handler - * Results are returned to this Handler after successful encryption + * @param encryptionUserIds + * User Ids (emails) of recipients + * @param callback + * Callback where to return results */ oneway void encrypt(in byte[] inputBytes, in String[] encryptionUserIds, in ICryptoCallback callback); /** * Encrypt and sign * - * - * * @param inputBytes * Byte array you want to encrypt - * @param signatureKeyId - * Key id of key to sign with - * @param handler - * Results are returned to this Handler after successful encryption and signing + * @param encryptionUserIds + * User Ids (emails) of recipients + * @param signatureUserId + * User Ids (email) of sender + * @param callback + * Callback where to return results */ oneway void encryptAndSign(in byte[] inputBytes, in String[] encryptionUserIds, String signatureUserId, in ICryptoCallback callback); /** * Sign * - * - * * @param inputBytes * Byte array you want to encrypt - * @param signatureId - * - * @param handler - * Results are returned to this Handler after successful encryption and signing + * @param signatureUserId + * User Ids (email) of sender + * @param callback + * Callback where to return results */ oneway void sign(in byte[] inputBytes, String signatureUserId, in ICryptoCallback callback); @@ -70,8 +68,8 @@ interface ICryptoService { * * @param inputBytes * Byte array you want to decrypt and verify - * @param handler - * Handler where to return results to after successful encryption + * @param callback + * Callback where to return results */ oneway void decryptAndVerify(in byte[] inputBytes, in ICryptoCallback callback); From 438ccd480e316582617e834a22d0f4c2815aa26a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 29 May 2013 13:57:28 +0200 Subject: [PATCH 02/26] Check if passphrase is needed in PassphraseCacheService, extend documentation --- .../service/PassphraseCacheService.java | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/PassphraseCacheService.java index d11b8e92a..6a4c8a0af 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/PassphraseCacheService.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/PassphraseCacheService.java @@ -48,6 +48,12 @@ import android.os.Messenger; import android.os.RemoteException; import android.util.Log; +/** + * This service runs in its own process, but is available to all other processes as the main + * passphrase cache. Use the static methods addCachedPassphrase and getCachedPassphrase for + * convenience. + * + */ public class PassphraseCacheService extends Service { public static final String TAG = Constants.TAG + ": PassphraseCacheService"; @@ -74,9 +80,9 @@ public class PassphraseCacheService extends Service { Context mContext; /** - * This caches a new passphrase by sending a new command to the service. An android service is - * only run once. Thus, when the service is already started, new commands just add new events to - * the alarm manager for new passphrases to let them timeout in the future. + * This caches a new passphrase in memory by sending a new command to the service. An android + * service is only run once. Thus, when the service is already started, new commands just add + * new events to the alarm manager for new passphrases to let them timeout in the future. * * @param context * @param keyId @@ -95,21 +101,23 @@ public class PassphraseCacheService extends Service { } /** - * Gets a cached passphrase from memory, blocking method + * Gets a cached passphrase from memory by sending an intent to the service. This method is + * designed to wait until the service returns the passphrase. * * @param context * @param keyId - * @return + * @return passphrase or null (if no passphrase is cached for this keyId) */ public static String getCachedPassphrase(Context context, long keyId) { Log.d(TAG, "getCachedPassphrase() get masterKeyId for " + keyId); + Intent intent = new Intent(context, PassphraseCacheService.class); intent.setAction(ACTION_PASSPHRASE_CACHE_GET); final Object mutex = new Object(); final Bundle returnBundle = new Bundle(); - HandlerThread handlerThread = new HandlerThread("getPassphrase"); + HandlerThread handlerThread = new HandlerThread("getPassphraseThread"); handlerThread.start(); Handler returnHandler = new Handler(handlerThread.getLooper()) { @Override @@ -121,6 +129,7 @@ public class PassphraseCacheService extends Service { synchronized (mutex) { mutex.notify(); } + // quit handlerThread getLooper().quit(); } }; @@ -147,6 +156,12 @@ public class PassphraseCacheService extends Service { } } + /** + * Internal implementation to get cached passphrase. + * + * @param keyId + * @return + */ private String getCachedPassphraseImpl(long keyId) { Log.d(TAG, "getCachedPassphraseImpl() get masterKeyId for " + keyId); @@ -168,15 +183,15 @@ public class PassphraseCacheService extends Service { // get cached passphrase String cachedPassphrase = mPassphraseCache.get(masterKeyId); if (cachedPassphrase == null) { - // TODO: fix! - // check if secret key has a passphrase - // if (!hasPassphrase(context, masterKeyId)) { - // // cache empty passphrase - // addCachedPassphrase(context, masterKeyId, ""); - // return ""; - // } else { - return null; - // } + // if key has no passphrase -> cache and return empty passphrase + if (!hasPassphrase(this, masterKeyId)) { + Log.d(Constants.TAG, "Key has no passphrase! Caches and returns empty passphrase!"); + + addCachedPassphrase(this, masterKeyId, ""); + return ""; + } else { + return null; + } } // set it again to reset the cache life cycle Log.d(TAG, "Cache passphrase again when getting it!"); @@ -196,17 +211,10 @@ public class PassphraseCacheService extends Service { try { PGPSecretKey secretKey = PgpHelper.getMasterKey(ProviderHelper .getPGPSecretKeyRingByKeyId(context, secretKeyId)); - - Log.d(Constants.TAG, "Check if key has no passphrase..."); PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider( "SC").build("".toCharArray()); PGPPrivateKey testKey = secretKey.extractPrivateKey(keyDecryptor); if (testKey != null) { - Log.d(Constants.TAG, "Key has no passphrase! Caches empty passphrase!"); - - // cache empty passphrase - PassphraseCacheService.addCachedPassphrase(context, secretKey.getKeyID(), ""); - return false; } } catch (PGPException e) { From f6fc6caa1c112ae79ec2fc436a7db2f81a12c6bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 29 May 2013 15:58:50 +0200 Subject: [PATCH 03/26] rename to openintents namespace --- OpenPGP-Keychain/AndroidManifest.xml | 4 ++-- .../openintents}/crypto/CryptoError.aidl | 2 +- .../openintents}/crypto/CryptoError.java | 2 +- .../openintents}/crypto/CryptoServiceConnection.java | 6 ++++-- .../openintents}/crypto/CryptoSignatureResult.aidl | 2 +- .../openintents}/crypto/CryptoSignatureResult.java | 2 +- .../openintents}/crypto/ICryptoCallback.aidl | 8 +++----- .../openintents}/crypto/ICryptoService.aidl | 4 ++-- .../keychain/crypto_provider/CryptoService.java | 12 +++++++----- 9 files changed, 22 insertions(+), 20 deletions(-) rename OpenPGP-Keychain/src/{com/android => org/openintents}/crypto/CryptoError.aidl (95%) rename OpenPGP-Keychain/src/{com/android => org/openintents}/crypto/CryptoError.java (98%) rename OpenPGP-Keychain/src/{com/android => org/openintents}/crypto/CryptoServiceConnection.java (94%) rename OpenPGP-Keychain/src/{com/android => org/openintents}/crypto/CryptoSignatureResult.aidl (96%) rename OpenPGP-Keychain/src/{com/android => org/openintents}/crypto/CryptoSignatureResult.java (98%) rename OpenPGP-Keychain/src/{com/android => org/openintents}/crypto/ICryptoCallback.aidl (83%) rename OpenPGP-Keychain/src/{com/android => org/openintents}/crypto/ICryptoService.aidl (96%) diff --git a/OpenPGP-Keychain/AndroidManifest.xml b/OpenPGP-Keychain/AndroidManifest.xml index d75350048..219cf2751 100644 --- a/OpenPGP-Keychain/AndroidManifest.xml +++ b/OpenPGP-Keychain/AndroidManifest.xml @@ -474,7 +474,7 @@ android:label="TODO reg" android:process=":crypto" > - + @@ -486,7 +486,7 @@ android:exported="true" android:process=":crypto" > - + Date: Mon, 17 Jun 2013 15:52:09 +0200 Subject: [PATCH 04/26] Better API demo, open activity from service, discover crypto provider with packagemanager instead of register intent --- .../res/layout/crypto_provider_demo.xml | 49 ++-- .../org/openintents/crypto/CryptoError.aidl | 20 ++ .../org/openintents/crypto/CryptoError.java | 76 +++++ .../crypto/CryptoServiceConnection.java | 91 ++++++ .../crypto/CryptoSignatureResult.aidl | 20 ++ .../crypto/CryptoSignatureResult.java | 76 +++++ .../openintents/crypto/ICryptoCallback.aidl | 30 ++ .../openintents/crypto/ICryptoService.aidl | 76 +++++ .../demo/CryptoProviderDemoActivity.java | 275 ++++++++---------- OpenPGP-Keychain/AndroidManifest.xml | 22 +- .../crypto/CryptoServiceConnection.java | 2 +- .../crypto_provider/CryptoActivity.java | 121 +++++++- .../crypto_provider/CryptoService.java | 180 +++++++++--- .../ICryptoServiceActivity.aidl | 28 ++ .../crypto_provider/RegisterActivity.java | 74 ----- .../util/PausableThreadPoolExecutor.java | 89 ++++++ 16 files changed, 916 insertions(+), 313 deletions(-) create mode 100644 OpenPGP-Keychain-API-Demo/src/org/openintents/crypto/CryptoError.aidl create mode 100644 OpenPGP-Keychain-API-Demo/src/org/openintents/crypto/CryptoError.java create mode 100644 OpenPGP-Keychain-API-Demo/src/org/openintents/crypto/CryptoServiceConnection.java create mode 100644 OpenPGP-Keychain-API-Demo/src/org/openintents/crypto/CryptoSignatureResult.aidl create mode 100644 OpenPGP-Keychain-API-Demo/src/org/openintents/crypto/CryptoSignatureResult.java create mode 100644 OpenPGP-Keychain-API-Demo/src/org/openintents/crypto/ICryptoCallback.aidl create mode 100644 OpenPGP-Keychain-API-Demo/src/org/openintents/crypto/ICryptoService.aidl create mode 100644 OpenPGP-Keychain/src/org/sufficientlysecure/keychain/crypto_provider/ICryptoServiceActivity.aidl delete mode 100644 OpenPGP-Keychain/src/org/sufficientlysecure/keychain/crypto_provider/RegisterActivity.java create mode 100644 OpenPGP-Keychain/src/org/sufficientlysecure/keychain/util/PausableThreadPoolExecutor.java diff --git a/OpenPGP-Keychain-API-Demo/res/layout/crypto_provider_demo.xml b/OpenPGP-Keychain-API-Demo/res/layout/crypto_provider_demo.xml index 447734a52..ecc2b4ac5 100644 --- a/OpenPGP-Keychain-API-Demo/res/layout/crypto_provider_demo.xml +++ b/OpenPGP-Keychain-API-Demo/res/layout/crypto_provider_demo.xml @@ -15,58 +15,47 @@ android:onClick="registerCryptoProvider" android:text="Register crypto provider" /> -