sign and encrypt basically working

This commit is contained in:
Dominik Schürmann 2013-09-06 18:54:55 +02:00
parent d6dd81d444
commit 227b277931
5 changed files with 89 additions and 62 deletions

View file

@ -41,12 +41,10 @@ interface ICryptoService {
* *
* @param inputBytes * @param inputBytes
* Byte array you want to encrypt * Byte array you want to encrypt
* @param signatureUserId
* User Ids (email) of sender
* @param callback * @param callback
* Callback where to return results * 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 * Encrypt and sign
@ -60,7 +58,7 @@ interface ICryptoService {
* @param callback * @param callback
* Callback where to return results * 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 * Decrypts and verifies given input bytes. If no signature is present this method

View file

@ -49,7 +49,6 @@ public class CryptoProviderDemoActivity extends Activity {
EditText mMessage; EditText mMessage;
EditText mCiphertext; EditText mCiphertext;
EditText mEncryptUserId; EditText mEncryptUserId;
EditText mSignUserId;
private CryptoServiceConnection mCryptoServiceConnection; private CryptoServiceConnection mCryptoServiceConnection;
@ -136,8 +135,7 @@ public class CryptoProviderDemoActivity extends Activity {
byte[] inputBytes = mMessage.getText().toString().getBytes(); byte[] inputBytes = mMessage.getText().toString().getBytes();
try { try {
mCryptoServiceConnection.getService().sign(inputBytes, mCryptoServiceConnection.getService().sign(inputBytes, encryptCallback);
mSignUserId.getText().toString(), encryptCallback);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(Constants.TAG, "CryptoProviderDemo", e); Log.e(Constants.TAG, "CryptoProviderDemo", e);
} }
@ -148,8 +146,7 @@ public class CryptoProviderDemoActivity extends Activity {
try { try {
mCryptoServiceConnection.getService().encryptAndSign(inputBytes, mCryptoServiceConnection.getService().encryptAndSign(inputBytes,
new String[] { mEncryptUserId.getText().toString() }, new String[] { mEncryptUserId.getText().toString() }, encryptCallback);
mSignUserId.getText().toString(), encryptCallback);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(Constants.TAG, "CryptoProviderDemo", e); Log.e(Constants.TAG, "CryptoProviderDemo", e);
} }

View file

@ -41,12 +41,10 @@ interface ICryptoService {
* *
* @param inputBytes * @param inputBytes
* Byte array you want to encrypt * Byte array you want to encrypt
* @param signatureUserId
* User Ids (email) of sender
* @param callback * @param callback
* Callback where to return results * 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 * Encrypt and sign
@ -60,7 +58,7 @@ interface ICryptoService {
* @param callback * @param callback
* Callback where to return results * 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 * Decrypts and verifies given input bytes. If no signature is present this method

View file

@ -23,9 +23,9 @@ public class AppSettings {
private String packageName; private String packageName;
private long keyId = Id.key.none; private long keyId = Id.key.none;
private boolean asciiArmor; private boolean asciiArmor;
private int encryptionAlgorithm = 7; // AES-128 private int encryptionAlgorithm;
private int hashAlgorithm = 10; // SHA-512 private int hashAlgorithm;
private int compression = 2; // zlib private int compression;
public AppSettings() { public AppSettings() {
@ -34,6 +34,11 @@ public class AppSettings {
public AppSettings(String packageName) { public AppSettings(String packageName) {
super(); super();
this.packageName = packageName; this.packageName = packageName;
// defaults:
this.asciiArmor = true;
this.encryptionAlgorithm = 7; // AES-128
this.hashAlgorithm = 10; // SHA-512
this.compression = 2; // zlib
} }
public String getPackageName() { public String getPackageName() {

View file

@ -109,9 +109,47 @@ public class CryptoService extends Service {
return passphrase; 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 { try {
String passphrase = null;
if (sign) {
passphrase = getCachedPassphrase(appSettings.getKeyId());
}
// build InputData and write into OutputStream // build InputData and write into OutputStream
InputStream inputStream = new ByteArrayInputStream(inputBytes); InputStream inputStream = new ByteArrayInputStream(inputBytes);
long inputLength = inputBytes.length; long inputLength = inputBytes.length;
@ -119,34 +157,22 @@ public class CryptoService extends Service {
OutputStream outputStream = new ByteArrayOutputStream(); OutputStream outputStream = new ByteArrayOutputStream();
// find key ids to given emails in database ArrayList<Long> keyIds = getKeyIdsFromEmails(encryptionUserIds);
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");
}
}
// also encrypt to our self (so that we can decrypt it later!) // also encrypt to our self (so that we can decrypt it later!)
keyIds.add(appSettings.getKeyId()); keyIds.add(appSettings.getKeyId());
PgpMain.encryptAndSign(mContext, null, inputData, outputStream, if (sign) {
appSettings.isAsciiArmor(), appSettings.getCompression(), keyIds, null, PgpMain.encryptAndSign(mContext, null, inputData, outputStream,
appSettings.getEncryptionAlgorithm(), Id.key.none, appSettings.isAsciiArmor(), appSettings.getCompression(), keyIds, null,
appSettings.getHashAlgorithm(), true, 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(); outputStream.close();
@ -163,20 +189,12 @@ public class CryptoService extends Service {
Log.e(Constants.TAG, "Error returning exception to client", t); Log.e(Constants.TAG, "Error returning exception to client", t);
} }
} }
} }
private synchronized void encryptAndSignSafe(byte[] inputBytes, String[] encryptionUserIds, private void signSafe(byte[] inputBytes, ICryptoCallback callback, AppSettings appSettings)
String signatureUserId, ICryptoCallback callback, AppSettings appSettings)
throws RemoteException { throws RemoteException {
// TODO!
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);
} }
private synchronized void decryptAndVerifySafe(byte[] inputBytes, ICryptoCallback callback, private synchronized void decryptAndVerifySafe(byte[] inputBytes, ICryptoCallback callback,
@ -258,7 +276,7 @@ public class CryptoService extends Service {
@Override @Override
public void run() { public void run() {
try { try {
encryptSafe(inputBytes, encryptionUserIds, callback, settings); encryptAndSignSafe(inputBytes, encryptionUserIds, callback, settings, false);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(Constants.TAG, "CryptoService", e); Log.e(Constants.TAG, "CryptoService", e);
} }
@ -270,8 +288,7 @@ public class CryptoService extends Service {
@Override @Override
public void encryptAndSign(final byte[] inputBytes, final String[] encryptionUserIds, public void encryptAndSign(final byte[] inputBytes, final String[] encryptionUserIds,
final String signatureUserId, final ICryptoCallback callback) final ICryptoCallback callback) throws RemoteException {
throws RemoteException {
final AppSettings settings = getAppSettings(); final AppSettings settings = getAppSettings();
@ -280,8 +297,7 @@ public class CryptoService extends Service {
@Override @Override
public void run() { public void run() {
try { try {
encryptAndSignSafe(inputBytes, encryptionUserIds, signatureUserId, encryptAndSignSafe(inputBytes, encryptionUserIds, callback, settings, true);
callback, settings);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(Constants.TAG, "CryptoService", e); Log.e(Constants.TAG, "CryptoService", e);
} }
@ -289,13 +305,26 @@ public class CryptoService extends Service {
}; };
checkAndEnqueue(r); checkAndEnqueue(r);
} }
@Override @Override
public void sign(byte[] inputBytes, String signatureUserId, ICryptoCallback callback) public void sign(final byte[] inputBytes, final ICryptoCallback callback)
throws RemoteException { 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);
} }