mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-27 11:12:15 -05:00
sign and encrypt basically working
This commit is contained in:
parent
d6dd81d444
commit
227b277931
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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() {
|
||||||
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user