aboutsummaryrefslogtreecommitdiffstats
path: root/OpenPGP-Keychain/src/org
diff options
context:
space:
mode:
authorDominik Schürmann <dominik@dominikschuermann.de>2013-09-06 18:54:55 +0200
committerDominik Schürmann <dominik@dominikschuermann.de>2013-09-06 18:54:55 +0200
commit227b277931b3bfbc1d72483e79525f22cde8b242 (patch)
treeaa3052f64c1caab838750ff7182c971af12e6588 /OpenPGP-Keychain/src/org
parentd6dd81d4449f437de672395b8f9ba2664c945d4c (diff)
downloadopen-keychain-227b277931b3bfbc1d72483e79525f22cde8b242.tar.gz
open-keychain-227b277931b3bfbc1d72483e79525f22cde8b242.tar.bz2
open-keychain-227b277931b3bfbc1d72483e79525f22cde8b242.zip
sign and encrypt basically working
Diffstat (limited to 'OpenPGP-Keychain/src/org')
-rw-r--r--OpenPGP-Keychain/src/org/openintents/crypto/ICryptoService.aidl6
-rw-r--r--OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettings.java11
-rw-r--r--OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java121
3 files changed, 85 insertions, 53 deletions
diff --git a/OpenPGP-Keychain/src/org/openintents/crypto/ICryptoService.aidl b/OpenPGP-Keychain/src/org/openintents/crypto/ICryptoService.aidl
index c84ca28fb..b74ab642c 100644
--- a/OpenPGP-Keychain/src/org/openintents/crypto/ICryptoService.aidl
+++ b/OpenPGP-Keychain/src/org/openintents/crypto/ICryptoService.aidl
@@ -41,12 +41,10 @@ interface ICryptoService {
*
* @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);
+ oneway void sign(in byte[] inputBytes, in ICryptoCallback callback);
/**
* Encrypt and sign
@@ -60,7 +58,7 @@ interface ICryptoService {
* @param callback
* Callback where to return results
*/
- oneway void encryptAndSign(in byte[] inputBytes, in String[] encryptionUserIds, String signatureUserId, in ICryptoCallback callback);
+ oneway void encryptAndSign(in byte[] inputBytes, in String[] encryptionUserIds, in ICryptoCallback callback);
/**
* Decrypts and verifies given input bytes. If no signature is present this method
diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettings.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettings.java
index cd84e4ee2..e0d63d461 100644
--- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettings.java
+++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettings.java
@@ -23,9 +23,9 @@ public class AppSettings {
private String packageName;
private long keyId = Id.key.none;
private boolean asciiArmor;
- private int encryptionAlgorithm = 7; // AES-128
- private int hashAlgorithm = 10; // SHA-512
- private int compression = 2; // zlib
+ private int encryptionAlgorithm;
+ private int hashAlgorithm;
+ private int compression;
public AppSettings() {
@@ -34,6 +34,11 @@ public class AppSettings {
public AppSettings(String packageName) {
super();
this.packageName = packageName;
+ // defaults:
+ this.asciiArmor = true;
+ this.encryptionAlgorithm = 7; // AES-128
+ this.hashAlgorithm = 10; // SHA-512
+ this.compression = 2; // zlib
}
public String getPackageName() {
diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java
index a86e6a1d6..74d4a7306 100644
--- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java
+++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java
@@ -109,9 +109,47 @@ public class CryptoService extends Service {
return passphrase;
}
- private synchronized void encryptSafe(byte[] inputBytes, String[] encryptionUserIds,
- ICryptoCallback callback, AppSettings appSettings) throws RemoteException {
+ /**
+ * Search database for key ids based on emails.
+ *
+ * @param encryptionUserIds
+ * @return
+ */
+ private ArrayList<Long> getKeyIdsFromEmails(String[] encryptionUserIds) {
+ // find key ids to given emails in database
+ boolean manySameUserIds = false;
+ boolean missingUserIds = false;
+ ArrayList<Long> keyIds = new ArrayList<Long>();
+ for (String email : encryptionUserIds) {
+ Uri uri = KeychainContract.KeyRings.buildPublicKeyRingsByEmailsUri(email);
+ Cursor cur = getContentResolver().query(uri, null, null, null, null);
+ if (cur.moveToFirst()) {
+ long id = cur.getLong(cur.getColumnIndex(KeychainContract.KeyRings.MASTER_KEY_ID));
+ keyIds.add(id);
+ } else {
+ missingUserIds = true;
+ Log.d(Constants.TAG, "user id missing");
+ }
+ if (cur.moveToNext()) {
+ manySameUserIds = true;
+ Log.d(Constants.TAG, "more than one user id with the same email");
+ }
+ }
+
+ // TODO: show selection activity on missingUserIds or manySameUserIds
+
+ return keyIds;
+ }
+
+ private synchronized void encryptAndSignSafe(byte[] inputBytes, String[] encryptionUserIds,
+ ICryptoCallback callback, AppSettings appSettings, boolean sign) throws RemoteException {
+
try {
+ String passphrase = null;
+ if (sign) {
+ passphrase = getCachedPassphrase(appSettings.getKeyId());
+ }
+
// build InputData and write into OutputStream
InputStream inputStream = new ByteArrayInputStream(inputBytes);
long inputLength = inputBytes.length;
@@ -119,34 +157,22 @@ public class CryptoService extends Service {
OutputStream outputStream = new ByteArrayOutputStream();
- // find key ids to given emails in database
- boolean manySameUserIds = false;
- boolean missingUserIds = false;
- ArrayList<Long> keyIds = new ArrayList<Long>();
- for (String email : encryptionUserIds) {
- Uri uri = KeychainContract.KeyRings.buildPublicKeyRingsByEmailsUri(email);
- Cursor cur = getContentResolver().query(uri, null, null, null, null);
- if (cur.moveToFirst()) {
- long id = cur.getLong(cur
- .getColumnIndex(KeychainContract.KeyRings.MASTER_KEY_ID));
- keyIds.add(id);
- } else {
- missingUserIds = true;
- Log.d(Constants.TAG, "user id missing");
- }
- if (cur.moveToNext()) {
- manySameUserIds = true;
- Log.d(Constants.TAG, "more than one user id with the same email");
- }
- }
-
+ ArrayList<Long> keyIds = getKeyIdsFromEmails(encryptionUserIds);
+
// also encrypt to our self (so that we can decrypt it later!)
keyIds.add(appSettings.getKeyId());
- PgpMain.encryptAndSign(mContext, null, inputData, outputStream,
- appSettings.isAsciiArmor(), appSettings.getCompression(), keyIds, null,
- appSettings.getEncryptionAlgorithm(), Id.key.none,
- appSettings.getHashAlgorithm(), true, null);
+ if (sign) {
+ PgpMain.encryptAndSign(mContext, null, inputData, outputStream,
+ appSettings.isAsciiArmor(), appSettings.getCompression(), keyIds, null,
+ appSettings.getEncryptionAlgorithm(), appSettings.getKeyId(),
+ appSettings.getHashAlgorithm(), true, passphrase);
+ } else {
+ PgpMain.encryptAndSign(mContext, null, inputData, outputStream,
+ appSettings.isAsciiArmor(), appSettings.getCompression(), keyIds, null,
+ appSettings.getEncryptionAlgorithm(), Id.key.none,
+ appSettings.getHashAlgorithm(), true, null);
+ }
outputStream.close();
@@ -163,20 +189,12 @@ public class CryptoService extends Service {
Log.e(Constants.TAG, "Error returning exception to client", t);
}
}
+
}
- private synchronized void encryptAndSignSafe(byte[] inputBytes, String[] encryptionUserIds,
- String signatureUserId, ICryptoCallback callback, AppSettings appSettings)
+ private void signSafe(byte[] inputBytes, ICryptoCallback callback, AppSettings appSettings)
throws RemoteException {
-
- String passphrase = getCachedPassphrase(appSettings.getKeyId());
-
- // PgpMain.encryptAndSign(this, this, inputData, outputStream,
- // appSettings.isAsciiArmor(),
- // appSettings.getCompression(), encryptionKeyIds, encryptionPassphrase,
- // appSettings.getEncryptionAlgorithm(), appSettings.getKeyId(),
- // appSettings.getHashAlgorithm(), true, passphrase);
-
+ // TODO!
}
private synchronized void decryptAndVerifySafe(byte[] inputBytes, ICryptoCallback callback,
@@ -258,7 +276,7 @@ public class CryptoService extends Service {
@Override
public void run() {
try {
- encryptSafe(inputBytes, encryptionUserIds, callback, settings);
+ encryptAndSignSafe(inputBytes, encryptionUserIds, callback, settings, false);
} catch (RemoteException e) {
Log.e(Constants.TAG, "CryptoService", e);
}
@@ -270,8 +288,7 @@ public class CryptoService extends Service {
@Override
public void encryptAndSign(final byte[] inputBytes, final String[] encryptionUserIds,
- final String signatureUserId, final ICryptoCallback callback)
- throws RemoteException {
+ final ICryptoCallback callback) throws RemoteException {
final AppSettings settings = getAppSettings();
@@ -280,8 +297,7 @@ public class CryptoService extends Service {
@Override
public void run() {
try {
- encryptAndSignSafe(inputBytes, encryptionUserIds, signatureUserId,
- callback, settings);
+ encryptAndSignSafe(inputBytes, encryptionUserIds, callback, settings, true);
} catch (RemoteException e) {
Log.e(Constants.TAG, "CryptoService", e);
}
@@ -289,13 +305,26 @@ public class CryptoService extends Service {
};
checkAndEnqueue(r);
-
}
@Override
- public void sign(byte[] inputBytes, String signatureUserId, ICryptoCallback callback)
+ public void sign(final byte[] inputBytes, final ICryptoCallback callback)
throws RemoteException {
- // TODO Auto-generated method stub
+ final AppSettings settings = getAppSettings();
+
+ Runnable r = new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ signSafe(inputBytes, callback, settings);
+ } catch (RemoteException e) {
+ Log.e(Constants.TAG, "CryptoService", e);
+ }
+ }
+ };
+
+ checkAndEnqueue(r);
}