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: update API --- .../android/crypto/CryptoServiceConnection.java | 16 ++++++++++ .../src/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); -- cgit v1.2.3 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: Check if passphrase is needed in PassphraseCacheService, extend documentation --- .../keychain/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) { -- cgit v1.2.3 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: rename to openintents namespace --- OpenPGP-Keychain/AndroidManifest.xml | 4 +- .../src/com/android/crypto/CryptoError.aidl | 20 ----- .../src/com/android/crypto/CryptoError.java | 76 ------------------ .../android/crypto/CryptoServiceConnection.java | 89 --------------------- .../com/android/crypto/CryptoSignatureResult.aidl | 20 ----- .../com/android/crypto/CryptoSignatureResult.java | 76 ------------------ .../src/com/android/crypto/ICryptoCallback.aidl | 32 -------- .../src/com/android/crypto/ICryptoService.aidl | 76 ------------------ .../src/org/openintents/crypto/CryptoError.aidl | 20 +++++ .../src/org/openintents/crypto/CryptoError.java | 76 ++++++++++++++++++ .../crypto/CryptoServiceConnection.java | 91 ++++++++++++++++++++++ .../openintents/crypto/CryptoSignatureResult.aidl | 20 +++++ .../openintents/crypto/CryptoSignatureResult.java | 76 ++++++++++++++++++ .../org/openintents/crypto/ICryptoCallback.aidl | 30 +++++++ .../src/org/openintents/crypto/ICryptoService.aidl | 76 ++++++++++++++++++ .../keychain/crypto_provider/CryptoService.java | 12 +-- 16 files changed, 398 insertions(+), 396 deletions(-) delete mode 100644 OpenPGP-Keychain/src/com/android/crypto/CryptoError.aidl delete mode 100644 OpenPGP-Keychain/src/com/android/crypto/CryptoError.java delete mode 100644 OpenPGP-Keychain/src/com/android/crypto/CryptoServiceConnection.java delete mode 100644 OpenPGP-Keychain/src/com/android/crypto/CryptoSignatureResult.aidl delete mode 100644 OpenPGP-Keychain/src/com/android/crypto/CryptoSignatureResult.java delete mode 100644 OpenPGP-Keychain/src/com/android/crypto/ICryptoCallback.aidl delete mode 100644 OpenPGP-Keychain/src/com/android/crypto/ICryptoService.aidl create mode 100644 OpenPGP-Keychain/src/org/openintents/crypto/CryptoError.aidl create mode 100644 OpenPGP-Keychain/src/org/openintents/crypto/CryptoError.java create mode 100644 OpenPGP-Keychain/src/org/openintents/crypto/CryptoServiceConnection.java create mode 100644 OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.aidl create mode 100644 OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.java create mode 100644 OpenPGP-Keychain/src/org/openintents/crypto/ICryptoCallback.aidl create mode 100644 OpenPGP-Keychain/src/org/openintents/crypto/ICryptoService.aidl 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" > - + - * - * 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; - -// Declare CryptoError so AIDL can find it and knows that it implements the parcelable protocol. -parcelable CryptoError; \ No newline at end of file diff --git a/OpenPGP-Keychain/src/com/android/crypto/CryptoError.java b/OpenPGP-Keychain/src/com/android/crypto/CryptoError.java deleted file mode 100644 index 9540f4f68..000000000 --- a/OpenPGP-Keychain/src/com/android/crypto/CryptoError.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.os.Parcel; -import android.os.Parcelable; - -public class CryptoError implements Parcelable { - int errorId; - String message; - - public CryptoError() { - } - - public CryptoError(int errorId, String message) { - this.errorId = errorId; - this.message = message; - } - - public CryptoError(CryptoError b) { - this.errorId = b.errorId; - this.message = b.message; - } - - public int getErrorId() { - return errorId; - } - - public void setErrorId(int errorId) { - this.errorId = errorId; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public int describeContents() { - return 0; - } - - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(errorId); - dest.writeString(message); - } - - public static final Creator CREATOR = new Creator() { - public CryptoError createFromParcel(final Parcel source) { - CryptoError error = new CryptoError(); - error.errorId = source.readInt(); - error.message = source.readString(); - return error; - } - - public CryptoError[] newArray(final int size) { - return new CryptoError[size]; - } - }; -} diff --git a/OpenPGP-Keychain/src/com/android/crypto/CryptoServiceConnection.java b/OpenPGP-Keychain/src/com/android/crypto/CryptoServiceConnection.java deleted file mode 100644 index 96a07a067..000000000 --- a/OpenPGP-Keychain/src/com/android/crypto/CryptoServiceConnection.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * 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; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.os.IBinder; -import android.util.Log; - -public class CryptoServiceConnection { - private Context mApplicationContext; - - private ICryptoService mService; - private boolean bound; - private String cryptoProviderPackageName; - - private static final String TAG = "CryptoConnection"; - - public CryptoServiceConnection(Context context, String cryptoProviderPackageName) { - mApplicationContext = context.getApplicationContext(); - this.cryptoProviderPackageName = cryptoProviderPackageName; - } - - public ICryptoService getService() { - return mService; - } - - private ServiceConnection mCryptoServiceConnection = new ServiceConnection() { - public void onServiceConnected(ComponentName name, IBinder service) { - mService = ICryptoService.Stub.asInterface(service); - Log.d(TAG, "connected to service"); - bound = true; - } - - public void onServiceDisconnected(ComponentName name) { - mService = null; - Log.d(TAG, "disconnected from service"); - bound = false; - } - }; - - /** - * If not already bound, bind! - * - * @return - */ - public boolean bindToService() { - if (mService == null && !bound) { // if not already connected - try { - Log.d(TAG, "not bound yet"); - - Intent serviceIntent = new Intent(); - serviceIntent.setAction("com.android.crypto.ICryptoService"); - serviceIntent.setPackage(cryptoProviderPackageName); // TODO: test - mApplicationContext.bindService(serviceIntent, mCryptoServiceConnection, - Context.BIND_AUTO_CREATE); - - return true; - } catch (Exception e) { - Log.d(TAG, "Exception", e); - return false; - } - } else { // already connected - Log.d(TAG, "already bound... "); - return true; - } - } - - public void unbindFromService() { - mApplicationContext.unbindService(mCryptoServiceConnection); - } - -} diff --git a/OpenPGP-Keychain/src/com/android/crypto/CryptoSignatureResult.aidl b/OpenPGP-Keychain/src/com/android/crypto/CryptoSignatureResult.aidl deleted file mode 100644 index 21862c497..000000000 --- a/OpenPGP-Keychain/src/com/android/crypto/CryptoSignatureResult.aidl +++ /dev/null @@ -1,20 +0,0 @@ -/* - * 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; - -// Declare CryptoSignatureResult so AIDL can find it and knows that it implements the parcelable protocol. -parcelable CryptoSignatureResult; \ No newline at end of file diff --git a/OpenPGP-Keychain/src/com/android/crypto/CryptoSignatureResult.java b/OpenPGP-Keychain/src/com/android/crypto/CryptoSignatureResult.java deleted file mode 100644 index 87f5f43b5..000000000 --- a/OpenPGP-Keychain/src/com/android/crypto/CryptoSignatureResult.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.os.Parcel; -import android.os.Parcelable; - -public class CryptoSignatureResult implements Parcelable { - String signatureUserId; - - boolean signature; - boolean signatureSuccess; - boolean signatureUnknown; - - public CryptoSignatureResult() { - - } - - public CryptoSignatureResult(String signatureUserId, boolean signature, - boolean signatureSuccess, boolean signatureUnknown) { - this.signatureUserId = signatureUserId; - - this.signature = signature; - this.signatureSuccess = signatureSuccess; - this.signatureUnknown = signatureUnknown; - } - - public CryptoSignatureResult(CryptoSignatureResult b) { - this.signatureUserId = b.signatureUserId; - - this.signature = b.signature; - this.signatureSuccess = b.signatureSuccess; - this.signatureUnknown = b.signatureUnknown; - } - - public int describeContents() { - return 0; - } - - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(signatureUserId); - - dest.writeByte((byte) (signature ? 1 : 0)); - dest.writeByte((byte) (signatureSuccess ? 1 : 0)); - dest.writeByte((byte) (signatureUnknown ? 1 : 0)); - } - - public static final Creator CREATOR = new Creator() { - public CryptoSignatureResult createFromParcel(final Parcel source) { - CryptoSignatureResult vr = new CryptoSignatureResult(); - vr.signatureUserId = source.readString(); - vr.signature = source.readByte() == 1; - vr.signatureSuccess = source.readByte() == 1; - vr.signatureUnknown = source.readByte() == 1; - return vr; - } - - public CryptoSignatureResult[] newArray(final int size) { - return new CryptoSignatureResult[size]; - } - }; -} diff --git a/OpenPGP-Keychain/src/com/android/crypto/ICryptoCallback.aidl b/OpenPGP-Keychain/src/com/android/crypto/ICryptoCallback.aidl deleted file mode 100644 index af6587c04..000000000 --- a/OpenPGP-Keychain/src/com/android/crypto/ICryptoCallback.aidl +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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 com.android.crypto.CryptoSignatureResult; -import com.android.crypto.CryptoError; - -interface ICryptoCallback { - - oneway void onEncryptSignSuccess(in byte[] outputBytes); - - oneway void onDecryptVerifySuccess(in byte[] outputBytes, in CryptoSignatureResult signatureResult); - - - oneway void onError(in CryptoError error); - - oneway void onActivityRequired(in Intent intent); -} \ No newline at end of file diff --git a/OpenPGP-Keychain/src/com/android/crypto/ICryptoService.aidl b/OpenPGP-Keychain/src/com/android/crypto/ICryptoService.aidl deleted file mode 100644 index 0f295d183..000000000 --- a/OpenPGP-Keychain/src/com/android/crypto/ICryptoService.aidl +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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 com.android.crypto.ICryptoCallback; - -/** - * All methods are oneway, which means they are asynchronous and non-blocking. - * Results are returned to the callback, which has to be implemented on client side. - */ -interface ICryptoService { - - /** - * Encrypt - * - * @param inputBytes - * Byte array you want to encrypt - * @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 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 signatureUserId - * User Ids (email) of sender - * @param callback - * Callback where to return results - */ - oneway void sign(in byte[] inputBytes, String signatureUserId, in ICryptoCallback callback); - - /** - * Decrypts and verifies given input bytes. If no signature is present this method - * will only decrypt. - * - * @param inputBytes - * Byte array you want to decrypt and verify - * @param callback - * Callback where to return results - */ - oneway void decryptAndVerify(in byte[] inputBytes, in ICryptoCallback callback); - -} \ No newline at end of file diff --git a/OpenPGP-Keychain/src/org/openintents/crypto/CryptoError.aidl b/OpenPGP-Keychain/src/org/openintents/crypto/CryptoError.aidl new file mode 100644 index 000000000..7b67c8995 --- /dev/null +++ b/OpenPGP-Keychain/src/org/openintents/crypto/CryptoError.aidl @@ -0,0 +1,20 @@ +/* + * 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 org.openintents.crypto; + +// Declare CryptoError so AIDL can find it and knows that it implements the parcelable protocol. +parcelable CryptoError; \ No newline at end of file diff --git a/OpenPGP-Keychain/src/org/openintents/crypto/CryptoError.java b/OpenPGP-Keychain/src/org/openintents/crypto/CryptoError.java new file mode 100644 index 000000000..265fe2633 --- /dev/null +++ b/OpenPGP-Keychain/src/org/openintents/crypto/CryptoError.java @@ -0,0 +1,76 @@ +/* + * 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 org.openintents.crypto; + +import android.os.Parcel; +import android.os.Parcelable; + +public class CryptoError implements Parcelable { + int errorId; + String message; + + public CryptoError() { + } + + public CryptoError(int errorId, String message) { + this.errorId = errorId; + this.message = message; + } + + public CryptoError(CryptoError b) { + this.errorId = b.errorId; + this.message = b.message; + } + + public int getErrorId() { + return errorId; + } + + public void setErrorId(int errorId) { + this.errorId = errorId; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public int describeContents() { + return 0; + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(errorId); + dest.writeString(message); + } + + public static final Creator CREATOR = new Creator() { + public CryptoError createFromParcel(final Parcel source) { + CryptoError error = new CryptoError(); + error.errorId = source.readInt(); + error.message = source.readString(); + return error; + } + + public CryptoError[] newArray(final int size) { + return new CryptoError[size]; + } + }; +} diff --git a/OpenPGP-Keychain/src/org/openintents/crypto/CryptoServiceConnection.java b/OpenPGP-Keychain/src/org/openintents/crypto/CryptoServiceConnection.java new file mode 100644 index 000000000..5df32dcf9 --- /dev/null +++ b/OpenPGP-Keychain/src/org/openintents/crypto/CryptoServiceConnection.java @@ -0,0 +1,91 @@ +/* + * 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 org.openintents.crypto; + +import org.openintents.crypto.ICryptoService; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.IBinder; +import android.util.Log; + +public class CryptoServiceConnection { + private Context mApplicationContext; + + private ICryptoService mService; + private boolean bound; + private String cryptoProviderPackageName; + + private static final String TAG = "CryptoConnection"; + + public CryptoServiceConnection(Context context, String cryptoProviderPackageName) { + mApplicationContext = context.getApplicationContext(); + this.cryptoProviderPackageName = cryptoProviderPackageName; + } + + public ICryptoService getService() { + return mService; + } + + private ServiceConnection mCryptoServiceConnection = new ServiceConnection() { + public void onServiceConnected(ComponentName name, IBinder service) { + mService = ICryptoService.Stub.asInterface(service); + Log.d(TAG, "connected to service"); + bound = true; + } + + public void onServiceDisconnected(ComponentName name) { + mService = null; + Log.d(TAG, "disconnected from service"); + bound = false; + } + }; + + /** + * If not already bound, bind! + * + * @return + */ + public boolean bindToService() { + if (mService == null && !bound) { // if not already connected + try { + Log.d(TAG, "not bound yet"); + + Intent serviceIntent = new Intent(); + serviceIntent.setAction("org.openintents.crypto.ICryptoService"); + serviceIntent.setPackage(cryptoProviderPackageName); // TODO: test + mApplicationContext.bindService(serviceIntent, mCryptoServiceConnection, + Context.BIND_AUTO_CREATE); + + return true; + } catch (Exception e) { + Log.d(TAG, "Exception", e); + return false; + } + } else { // already connected + Log.d(TAG, "already bound... "); + return true; + } + } + + public void unbindFromService() { + mApplicationContext.unbindService(mCryptoServiceConnection); + } + +} diff --git a/OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.aidl b/OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.aidl new file mode 100644 index 000000000..1d39bac70 --- /dev/null +++ b/OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.aidl @@ -0,0 +1,20 @@ +/* + * 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 org.openintents.crypto; + +// Declare CryptoSignatureResult so AIDL can find it and knows that it implements the parcelable protocol. +parcelable CryptoSignatureResult; \ No newline at end of file diff --git a/OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.java b/OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.java new file mode 100644 index 000000000..e193b73b3 --- /dev/null +++ b/OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.java @@ -0,0 +1,76 @@ +/* + * 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 org.openintents.crypto; + +import android.os.Parcel; +import android.os.Parcelable; + +public class CryptoSignatureResult implements Parcelable { + String signatureUserId; + + boolean signature; + boolean signatureSuccess; + boolean signatureUnknown; + + public CryptoSignatureResult() { + + } + + public CryptoSignatureResult(String signatureUserId, boolean signature, + boolean signatureSuccess, boolean signatureUnknown) { + this.signatureUserId = signatureUserId; + + this.signature = signature; + this.signatureSuccess = signatureSuccess; + this.signatureUnknown = signatureUnknown; + } + + public CryptoSignatureResult(CryptoSignatureResult b) { + this.signatureUserId = b.signatureUserId; + + this.signature = b.signature; + this.signatureSuccess = b.signatureSuccess; + this.signatureUnknown = b.signatureUnknown; + } + + public int describeContents() { + return 0; + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(signatureUserId); + + dest.writeByte((byte) (signature ? 1 : 0)); + dest.writeByte((byte) (signatureSuccess ? 1 : 0)); + dest.writeByte((byte) (signatureUnknown ? 1 : 0)); + } + + public static final Creator CREATOR = new Creator() { + public CryptoSignatureResult createFromParcel(final Parcel source) { + CryptoSignatureResult vr = new CryptoSignatureResult(); + vr.signatureUserId = source.readString(); + vr.signature = source.readByte() == 1; + vr.signatureSuccess = source.readByte() == 1; + vr.signatureUnknown = source.readByte() == 1; + return vr; + } + + public CryptoSignatureResult[] newArray(final int size) { + return new CryptoSignatureResult[size]; + } + }; +} diff --git a/OpenPGP-Keychain/src/org/openintents/crypto/ICryptoCallback.aidl b/OpenPGP-Keychain/src/org/openintents/crypto/ICryptoCallback.aidl new file mode 100644 index 000000000..80c741a9e --- /dev/null +++ b/OpenPGP-Keychain/src/org/openintents/crypto/ICryptoCallback.aidl @@ -0,0 +1,30 @@ +/* + * 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 org.openintents.crypto; + +import org.openintents.crypto.CryptoSignatureResult; +import org.openintents.crypto.CryptoError; + +interface ICryptoCallback { + + oneway void onEncryptSignSuccess(in byte[] outputBytes); + + oneway void onDecryptVerifySuccess(in byte[] outputBytes, in CryptoSignatureResult signatureResult); + + + oneway void onError(in CryptoError error); +} \ No newline at end of file diff --git a/OpenPGP-Keychain/src/org/openintents/crypto/ICryptoService.aidl b/OpenPGP-Keychain/src/org/openintents/crypto/ICryptoService.aidl new file mode 100644 index 000000000..04c8eb30e --- /dev/null +++ b/OpenPGP-Keychain/src/org/openintents/crypto/ICryptoService.aidl @@ -0,0 +1,76 @@ +/* + * 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 org.openintents.crypto; + +import org.openintents.crypto.ICryptoCallback; + +/** + * All methods are oneway, which means they are asynchronous and non-blocking. + * Results are returned to the callback, which has to be implemented on client side. + */ +interface ICryptoService { + + /** + * Encrypt + * + * @param inputBytes + * Byte array you want to encrypt + * @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 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 signatureUserId + * User Ids (email) of sender + * @param callback + * Callback where to return results + */ + oneway void sign(in byte[] inputBytes, String signatureUserId, in ICryptoCallback callback); + + /** + * Decrypts and verifies given input bytes. If no signature is present this method + * will only decrypt. + * + * @param inputBytes + * Byte array you want to decrypt and verify + * @param callback + * Callback where to return results + */ + oneway void decryptAndVerify(in byte[] inputBytes, in ICryptoCallback callback); + +} \ No newline at end of file diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/crypto_provider/CryptoService.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/crypto_provider/CryptoService.java index 1a57a457d..a367c613f 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/crypto_provider/CryptoService.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/crypto_provider/CryptoService.java @@ -20,6 +20,9 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; + +import org.openintents.crypto.CryptoError; +import org.openintents.crypto.CryptoSignatureResult; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Id; import org.sufficientlysecure.keychain.helper.PgpMain; @@ -29,10 +32,8 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.service.PassphraseCacheService; -import com.android.crypto.CryptoError; -import com.android.crypto.ICryptoCallback; -import com.android.crypto.ICryptoService; -import com.android.crypto.CryptoSignatureResult; +import org.openintents.crypto.ICryptoCallback; +import org.openintents.crypto.ICryptoService; import android.app.Service; import android.content.Context; @@ -89,7 +90,8 @@ public class CryptoService extends Service { // passphrase! Intent intent = new Intent(CryptoActivity.ACTION_CACHE_PASSPHRASE); intent.putExtra(CryptoActivity.EXTRA_SECRET_KEY_ID, secretKeyId); - callback.onActivityRequired(intent); + // TODO: start activity bind to service from activity send back intent on success +// callback.onActivityRequired(intent); return; } -- cgit v1.2.3 From 41338e115cb015c492dc44f224bc4b4cffe15cd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Mon, 17 Jun 2013 15:52:09 +0200 Subject: Better API demo, open activity from service, discover crypto provider with packagemanager instead of register intent --- .../res/layout/crypto_provider_demo.xml | 49 ++-- .../src/org/openintents/crypto/CryptoError.aidl | 20 ++ .../src/org/openintents/crypto/CryptoError.java | 76 ++++++ .../crypto/CryptoServiceConnection.java | 91 ++++++++ .../openintents/crypto/CryptoSignatureResult.aidl | 20 ++ .../openintents/crypto/CryptoSignatureResult.java | 76 ++++++ .../org/openintents/crypto/ICryptoCallback.aidl | 30 +++ .../src/org/openintents/crypto/ICryptoService.aidl | 76 ++++++ .../keychain/demo/CryptoProviderDemoActivity.java | 259 ++++++++++----------- OpenPGP-Keychain/AndroidManifest.xml | 22 +- .../crypto/CryptoServiceConnection.java | 2 +- .../keychain/crypto_provider/CryptoActivity.java | 119 +++++++++- .../keychain/crypto_provider/CryptoService.java | 180 +++++++++++--- .../crypto_provider/ICryptoServiceActivity.aidl | 28 +++ .../keychain/crypto_provider/RegisterActivity.java | 74 ------ .../keychain/util/PausableThreadPoolExecutor.java | 89 +++++++ 16 files changed, 907 insertions(+), 304 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" /> -