Fix decrypt by searching for secret key based on keyId not masterKeyId, new ApgService for RPC

This commit is contained in:
Dominik 2012-11-14 16:02:11 +01:00
parent 8aac7ea7be
commit d61e00ae6c
40 changed files with 2201 additions and 1309 deletions

View File

@ -336,7 +336,21 @@
android:label="@string/title_help" />
<service android:name=".service.PassphraseCacheService" />
<service android:name=".service.ApgService" />
<service android:name=".service.ApgIntentService" />
<service
android:name=".service.ApgService"
android:enabled="true"
android:exported="true"
android:permission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS"
android:process=":remote" >
<intent-filter>
<action android:name="org.thialfihar.android.apg.service.IApgService" />
</intent-filter>
<meta-data
android:name="api_version"
android:value="3" />
</service>
<provider
android:name=".provider.ApgProvider"
@ -344,31 +358,34 @@
android:readPermission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS" />
<!-- DEPRECATED: -->
<!-- <provider -->
<!-- android:name=".deprecated.DataProvider" -->
<!-- android:authorities="org.thialfihar.android.apg.provider" -->
<!-- android:readPermission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS" /> -->
<!-- <provider -->
<!-- android:name=".deprecated.DataProvider" -->
<!-- android:authorities="org.thialfihar.android.apg.provider" -->
<!-- android:readPermission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS" /> -->
<!-- TODO: need to be moved into new service model -->
<!-- <service -->
<!-- android:name=".deprecated.ApgService2" -->
<!-- android:enabled="true" -->
<!-- android:exported="true" -->
<!-- android:permission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS" -->
<!-- android:process=":remote" > -->
<!-- <intent-filter> -->
<!-- <action android:name="org.thialfihar.android.apg.service.IApgService2" /> -->
<!-- </intent-filter> -->
<!-- <service -->
<!-- android:name=".deprecated.ApgService2" -->
<!-- android:enabled="true" -->
<!-- android:exported="true" -->
<!-- android:permission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS" -->
<!-- android:process=":remote" > -->
<!-- <intent-filter> -->
<!-- <action android:name="org.thialfihar.android.apg.service.IApgService2" /> -->
<!-- </intent-filter> -->
<!-- <meta-data -->
<!-- android:name="api_version" -->
<!-- android:value="2" /> -->
<!-- </service> -->
<!-- <provider -->
<!-- android:name=".deprecated.ApgServiceBlobProvider" -->
<!-- android:authorities="org.thialfihar.android.apg.provider.apgserviceblobprovider" -->
<!-- android:permission="org.thialfihar.android.apg.permission.STORE_BLOBS" /> -->
<!-- <meta-data -->
<!-- android:name="api_version" -->
<!-- android:value="2" /> -->
<!-- </service> -->
<!-- <provider -->
<!-- android:name=".deprecated.ApgServiceBlobProvider" -->
<!-- android:authorities="org.thialfihar.android.apg.provider.apgserviceblobprovider" -->
<!-- android:permission="org.thialfihar.android.apg.permission.STORE_BLOBS" /> -->
</application>
</manifest>

View File

@ -59,12 +59,4 @@ public final class Constants {
public static final String KEY_SERVERS = "pool.sks-keyservers.net, subkeys.pgp.net, pgp.mit.edu";
}
// TODO: rework!
public static final class extras {
public static final String PROGRESS = "progress";
public static final String PROGRESS_MAX = "max";
public static final String STATUS = "status";
public static final String MESSAGE = "message";
public static final String KEY_ID = "keyId";
}
}

View File

@ -384,10 +384,10 @@ public class PGPHelper {
}
public static String getPubkeyAsArmoredString(Context context, long keyId) {
PGPPublicKey key = ProviderHelper.getPGPPublicKey(context, keyId);
PGPPublicKey key = ProviderHelper.getPGPPublicKeyByKeyId(context, keyId);
// if it is no public key get it from your own keys...
if (key == null) {
PGPSecretKey secretKey = ProviderHelper.getPGPSecretKey(context, keyId);
PGPSecretKey secretKey = ProviderHelper.getPGPSecretKeyByKeyId(context, keyId);
if (secretKey == null) {
Log.e(Constants.TAG, "Key could not be found!");
return null;
@ -415,10 +415,10 @@ public class PGPHelper {
}
public static String getFingerPrint(Context context, long keyId) {
PGPPublicKey key = ProviderHelper.getPGPPublicKey(context, keyId);
PGPPublicKey key = ProviderHelper.getPGPPublicKeyByKeyId(context, keyId);
// if it is no public key get it from your own keys...
if (key == null) {
PGPSecretKey secretKey = ProviderHelper.getPGPSecretKey(context, keyId);
PGPSecretKey secretKey = ProviderHelper.getPGPSecretKeyByKeyId(context, keyId);
if (secretKey == null) {
Log.e(Constants.TAG, "Key could not be found!");
return null;

View File

@ -73,7 +73,7 @@ import org.spongycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder;
import org.spongycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder;
import org.spongycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator;
import org.thialfihar.android.apg.provider.ProviderHelper;
import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.service.ApgIntentService;
import org.thialfihar.android.apg.util.HkpKeyServer;
import org.thialfihar.android.apg.util.InputData;
import org.thialfihar.android.apg.util.PositionAwareInputStream;
@ -599,9 +599,9 @@ public class PGPMain {
// nothing to do, we are done
}
returnData.putInt(ApgService.RESULT_IMPORT_ADDED, newKeys);
returnData.putInt(ApgService.RESULT_IMPORT_UPDATED, oldKeys);
returnData.putInt(ApgService.RESULT_IMPORT_BAD, badKeys);
returnData.putInt(ApgIntentService.RESULT_IMPORT_ADDED, newKeys);
returnData.putInt(ApgIntentService.RESULT_IMPORT_UPDATED, oldKeys);
returnData.putInt(ApgIntentService.RESULT_IMPORT_BAD, badKeys);
updateProgress(progress, R.string.progress_done, 100, 100);
@ -646,83 +646,42 @@ public class PGPMain {
++numKeys;
}
out.close();
returnData.putInt(ApgService.RESULT_EXPORT, numKeys);
returnData.putInt(ApgIntentService.RESULT_EXPORT, numKeys);
updateProgress(progress, R.string.progress_done, 100, 100);
return returnData;
}
// public static PGPKeyRing getKeyRing(int keyRingId) {
// return (PGPKeyRing) mDatabase.getKeyRing(keyRingId);
// }
// public static PGPSecretKeyRing getSecretKeyRing(long keyId) {
// byte[] data = mDatabase.getKeyRingDataFromKeyId(Id.database.type_secret, keyId);
// if (data == null) {
// return null;
// }
// return PGPConversionHelper.BytesToPGPSecretKeyRing(data);
// }
//
// public static PGPPublicKeyRing getPublicKeyRing(long keyId) {
// byte[] data = mDatabase.getKeyRingDataFromKeyId(Id.database.type_public, keyId);
// if (data == null) {
// return null;
// }
// return PGPConversionHelper.BytesToPGPPublicKeyRing(data);
// }
// public static Vector<Integer> getKeyRingIds(int type) {
// SQLiteDatabase db = mDatabase.db();
// Vector<Integer> keyIds = new Vector<Integer>();
// Cursor c = db.query(KeyRings.TABLE_NAME, new String[] { KeyRings._ID }, KeyRings.TYPE
// + " = ?", new String[] { "" + type }, null, null, null);
// if (c != null && c.moveToFirst()) {
// do {
// keyIds.add(c.getInt(0));
// } while (c.moveToNext());
// }
//
// if (c != null) {
// c.close();
// }
//
// return keyIds;
// }
// public static String getMainUserId(long keyId, int type) {
// SQLiteDatabase db = mDatabase.db();
// Cursor c = db.query(Keys.TABLE_NAME + " INNER JOIN " + KeyRings.TABLE_NAME + " ON ("
// + KeyRings.TABLE_NAME + "." + KeyRings._ID + " = " + Keys.TABLE_NAME + "."
// + Keys.KEY_RING_ID + ") " + " INNER JOIN " + Keys.TABLE_NAME + " AS masterKey ON ("
// + KeyRings.TABLE_NAME + "." + KeyRings._ID + " = " + "masterKey."
// + Keys.KEY_RING_ID + " AND " + "masterKey." + Keys.IS_MASTER_KEY + " = '1') "
// + " INNER JOIN " + UserIds.TABLE_NAME + " ON (" + UserIds.TABLE_NAME + "."
// + UserIds.KEY_ID + " = " + "masterKey." + Keys._ID + " AND " + UserIds.TABLE_NAME
// + "." + UserIds.RANK + " = '0')", new String[] { UserIds.USER_ID }, Keys.TABLE_NAME
// + "." + Keys.KEY_ID + " = ? AND " + KeyRings.TABLE_NAME + "." + KeyRings.TYPE
// + " = ?", new String[] { "" + keyId, "" + type, }, null, null, null);
// String userId = "";
// if (c != null && c.moveToFirst()) {
// do {
// userId = c.getString(0);
// } while (c.moveToNext());
// }
//
// if (c != null) {
// c.close();
// }
//
// return userId;
// }
public static void encrypt(Context context, InputData data, OutputStream outStream,
boolean armored, long encryptionKeyIds[], long signatureKeyId,
String signaturePassPhrase, ProgressDialogUpdater progress, int symmetricAlgorithm,
int hashAlgorithm, int compression, boolean forceV3Signature, String passPhrase)
throws IOException, ApgGeneralException, PGPException, NoSuchProviderException,
NoSuchAlgorithmException, SignatureException {
/**
* Encrypt and Sign data
*
* @param context
* @param progress
* @param data
* @param outStream
* @param useAsciiArmor
* @param compression
* @param encryptionKeyIds
* @param symmetricEncryptionAlgorithm
* @param encryptionPassphrase
* @param signatureKeyId
* @param signatureHashAlgorithm
* @param signatureForceV3
* @param signaturePassphrase
* @throws IOException
* @throws ApgGeneralException
* @throws PGPException
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
* @throws SignatureException
*/
public static void encryptAndSign(Context context, ProgressDialogUpdater progress,
InputData data, OutputStream outStream, boolean useAsciiArmor, int compression,
long encryptionKeyIds[], String encryptionPassphrase, int symmetricEncryptionAlgorithm,
long signatureKeyId, int signatureHashAlgorithm, boolean signatureForceV3,
String signaturePassphrase) throws IOException, ApgGeneralException, PGPException,
NoSuchProviderException, NoSuchAlgorithmException, SignatureException {
if (encryptionKeyIds == null) {
encryptionKeyIds = new long[0];
@ -731,7 +690,7 @@ public class PGPMain {
ArmoredOutputStream armorOut = null;
OutputStream out = null;
OutputStream encryptOut = null;
if (armored) {
if (useAsciiArmor) {
armorOut = new ArmoredOutputStream(outStream);
armorOut.setHeader("Version", getFullVersion(context));
out = armorOut;
@ -742,27 +701,27 @@ public class PGPMain {
PGPSecretKeyRing signingKeyRing = null;
PGPPrivateKey signaturePrivateKey = null;
if (encryptionKeyIds.length == 0 && passPhrase == null) {
if (encryptionKeyIds.length == 0 && encryptionPassphrase == null) {
throw new ApgGeneralException(
context.getString(R.string.error_noEncryptionKeysOrPassPhrase));
}
if (signatureKeyId != Id.key.none) {
signingKeyRing = ProviderHelper.getPGPSecretKeyRingByMasterKeyId(context,
signingKeyRing = ProviderHelper.getPGPSecretKeyRingByKeyId(context,
signatureKeyId);
signingKey = PGPHelper.getSigningKey(context, signatureKeyId);
if (signingKey == null) {
throw new ApgGeneralException(context.getString(R.string.error_signatureFailed));
}
if (signaturePassPhrase == null) {
if (signaturePassphrase == null) {
throw new ApgGeneralException(
context.getString(R.string.error_noSignaturePassPhrase));
}
if (progress != null)
progress.setProgress(R.string.progress_extractingSignatureKey, 0, 100);
PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider(
BOUNCY_CASTLE_PROVIDER_NAME).build(signaturePassPhrase.toCharArray());
BOUNCY_CASTLE_PROVIDER_NAME).build(signaturePassphrase.toCharArray());
signaturePrivateKey = signingKey.extractPrivateKey(keyDecryptor);
if (signaturePrivateKey == null) {
throw new ApgGeneralException(
@ -773,26 +732,28 @@ public class PGPMain {
// encrypt and compress input file content
JcePGPDataEncryptorBuilder encryptorBuilder = new JcePGPDataEncryptorBuilder(
symmetricAlgorithm).setProvider(BOUNCY_CASTLE_PROVIDER_NAME)
symmetricEncryptionAlgorithm).setProvider(BOUNCY_CASTLE_PROVIDER_NAME)
.setWithIntegrityPacket(true);
PGPEncryptedDataGenerator cPk = new PGPEncryptedDataGenerator(encryptorBuilder);
if (encryptionKeyIds.length == 0) {
// symmetric encryption
// Symmetric encryption
Log.d(Constants.TAG, "encryptionKeyIds length is 0 -> symmetric encryption");
JcePBEKeyEncryptionMethodGenerator symmetricEncryptionGenerator = new JcePBEKeyEncryptionMethodGenerator(
passPhrase.toCharArray());
encryptionPassphrase.toCharArray());
cPk.addMethod(symmetricEncryptionGenerator);
}
for (int i = 0; i < encryptionKeyIds.length; ++i) {
PGPPublicKey key = PGPHelper.getEncryptPublicKey(context, encryptionKeyIds[i]);
if (key != null) {
} else {
// Asymmetric encryption
for (int i = 0; i < encryptionKeyIds.length; ++i) {
PGPPublicKey key = PGPHelper.getEncryptPublicKey(context, encryptionKeyIds[i]);
if (key != null) {
JcePublicKeyKeyEncryptionMethodGenerator pubKeyEncryptionGenerator = new JcePublicKeyKeyEncryptionMethodGenerator(
key);
cPk.addMethod(pubKeyEncryptionGenerator);
JcePublicKeyKeyEncryptionMethodGenerator pubKeyEncryptionGenerator = new JcePublicKeyKeyEncryptionMethodGenerator(
key);
cPk.addMethod(pubKeyEncryptionGenerator);
}
}
}
encryptOut = cPk.open(out, new byte[1 << 16]);
@ -806,10 +767,10 @@ public class PGPMain {
// content signer based on signing key algorithm and choosen hash algorithm
JcaPGPContentSignerBuilder contentSignerBuilder = new JcaPGPContentSignerBuilder(
signingKey.getPublicKey().getAlgorithm(), hashAlgorithm)
signingKey.getPublicKey().getAlgorithm(), signatureHashAlgorithm)
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME);
if (forceV3Signature) {
if (signatureForceV3) {
signatureV3Generator = new PGPV3SignatureGenerator(contentSignerBuilder);
signatureV3Generator.init(PGPSignature.BINARY_DOCUMENT, signaturePrivateKey);
} else {
@ -832,7 +793,7 @@ public class PGPMain {
bcpgOut = new BCPGOutputStream(compressGen.open(encryptOut));
}
if (signatureKeyId != Id.key.none) {
if (forceV3Signature) {
if (signatureForceV3) {
signatureV3Generator.generateOnePassVersion(false).encode(bcpgOut);
} else {
signatureGenerator.generateOnePassVersion(false).encode(bcpgOut);
@ -852,7 +813,7 @@ public class PGPMain {
while ((n = in.read(buffer)) > 0) {
pOut.write(buffer, 0, n);
if (signatureKeyId != Id.key.none) {
if (forceV3Signature) {
if (signatureForceV3) {
signatureV3Generator.update(buffer, 0, n);
} else {
signatureGenerator.update(buffer, 0, n);
@ -868,7 +829,7 @@ public class PGPMain {
if (signatureKeyId != Id.key.none) {
updateProgress(progress, R.string.progress_generatingSignature, 95, 100);
if (forceV3Signature) {
if (signatureForceV3) {
signatureV3Generator.generate().encode(pOut);
} else {
signatureGenerator.generate().encode(pOut);
@ -878,16 +839,16 @@ public class PGPMain {
compressGen.close();
}
encryptOut.close();
if (armored) {
if (useAsciiArmor) {
armorOut.close();
}
updateProgress(progress, R.string.progress_done, 100, 100);
}
public static void signText(Context context, InputData data, OutputStream outStream,
long signatureKeyId, String signaturePassPhrase, int hashAlgorithm,
boolean forceV3Signature, ProgressDialogUpdater progress) throws ApgGeneralException,
public static void signText(Context context, ProgressDialogUpdater progress, InputData data,
OutputStream outStream, long signatureKeyId, String signaturePassphrase,
int signatureHashAlgorithm, boolean forceV3Signature) throws ApgGeneralException,
PGPException, IOException, NoSuchAlgorithmException, SignatureException {
ArmoredOutputStream armorOut = new ArmoredOutputStream(outStream);
@ -902,19 +863,19 @@ public class PGPMain {
throw new ApgGeneralException(context.getString(R.string.error_noSignatureKey));
}
signingKeyRing = ProviderHelper.getPGPSecretKeyRingByMasterKeyId(context, signatureKeyId);
signingKeyRing = ProviderHelper.getPGPSecretKeyRingByKeyId(context, signatureKeyId);
signingKey = PGPHelper.getSigningKey(context, signatureKeyId);
if (signingKey == null) {
armorOut.close();
throw new ApgGeneralException(context.getString(R.string.error_signatureFailed));
}
if (signaturePassPhrase == null) {
if (signaturePassphrase == null) {
armorOut.close();
throw new ApgGeneralException(context.getString(R.string.error_noSignaturePassPhrase));
}
PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider(
BOUNCY_CASTLE_PROVIDER_NAME).build(signaturePassPhrase.toCharArray());
BOUNCY_CASTLE_PROVIDER_NAME).build(signaturePassphrase.toCharArray());
signaturePrivateKey = signingKey.extractPrivateKey(keyDecryptor);
if (signaturePrivateKey == null) {
armorOut.close();
@ -930,7 +891,7 @@ public class PGPMain {
// content signer based on signing key algorithm and choosen hash algorithm
JcaPGPContentSignerBuilder contentSignerBuilder = new JcaPGPContentSignerBuilder(signingKey
.getPublicKey().getAlgorithm(), hashAlgorithm)
.getPublicKey().getAlgorithm(), signatureHashAlgorithm)
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME);
if (forceV3Signature) {
@ -948,7 +909,7 @@ public class PGPMain {
updateProgress(progress, R.string.progress_signing, 40, 100);
armorOut.beginClearText(hashAlgorithm);
armorOut.beginClearText(signatureHashAlgorithm);
InputStream inStream = data.getInputStream();
final BufferedReader reader = new BufferedReader(new InputStreamReader(inStream));
@ -992,11 +953,11 @@ public class PGPMain {
updateProgress(progress, R.string.progress_done, 100, 100);
}
public static void generateSignature(Context context, InputData data, OutputStream outStream,
boolean armored, boolean binary, long signatureKeyId, String signaturePassPhrase,
int hashAlgorithm, boolean forceV3Signature, ProgressDialogUpdater progress)
throws ApgGeneralException, PGPException, IOException, NoSuchAlgorithmException,
SignatureException {
public static void generateSignature(Context context, ProgressDialogUpdater progress,
InputData data, OutputStream outStream, boolean armored, boolean binary,
long signatureKeyId, String signaturePassPhrase, int hashAlgorithm,
boolean forceV3Signature) throws ApgGeneralException, PGPException, IOException,
NoSuchAlgorithmException, SignatureException {
OutputStream out = null;
@ -1018,7 +979,7 @@ public class PGPMain {
throw new ApgGeneralException(context.getString(R.string.error_noSignatureKey));
}
signingKeyRing = ProviderHelper.getPGPSecretKeyRingByMasterKeyId(context, signatureKeyId);
signingKeyRing = ProviderHelper.getPGPSecretKeyRingByKeyId(context, signatureKeyId);
signingKey = PGPHelper.getSigningKey(context, signatureKeyId);
if (signingKey == null) {
throw new ApgGeneralException(context.getString(R.string.error_signatureFailed));
@ -1118,7 +1079,7 @@ public class PGPMain {
if (passphrase == null || passphrase.length() <= 0) {
throw new ApgGeneralException("Unable to obtain passphrase");
} else {
PGPPublicKeyRing pubring = ProviderHelper.getPGPPublicKeyRingByMasterKeyId(context,
PGPPublicKeyRing pubring = ProviderHelper.getPGPPublicKeyRingByKeyId(context,
pubKeyId);
PGPSecretKey signingKey = PGPHelper.getSigningKey(context, masterKeyId);
@ -1185,7 +1146,7 @@ public class PGPMain {
if (obj instanceof PGPPublicKeyEncryptedData) {
gotAsymmetricEncryption = true;
PGPPublicKeyEncryptedData pbe = (PGPPublicKeyEncryptedData) obj;
secretKey = ProviderHelper.getPGPSecretKey(context, pbe.getKeyID());
secretKey = ProviderHelper.getPGPSecretKeyByKeyId(context, pbe.getKeyID());
if (secretKey != null) {
break;
}
@ -1232,12 +1193,13 @@ public class PGPMain {
return false;
}
public static Bundle decrypt(Context context, InputData data, OutputStream outStream,
String passPhrase, ProgressDialogUpdater progress, boolean assumeSymmetric)
public static Bundle decryptAndVerify(Context context, ProgressDialogUpdater progress,
InputData data, OutputStream outStream, String passphrase, boolean assumeSymmetric)
throws IOException, ApgGeneralException, PGPException, SignatureException {
if (passPhrase == null) {
passPhrase = "";
if (passphrase == null) {
passphrase = "";
}
Bundle returnData = new Bundle();
InputStream in = PGPUtil.getDecoderStream(data.getInputStream());
PGPObjectFactory pgpF = new PGPObjectFactory(in);
@ -1289,7 +1251,7 @@ public class PGPMain {
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME).build();
PBEDataDecryptorFactory decryptorFactory = new JcePBEDataDecryptorFactoryBuilder(
digestCalcProvider).setProvider(BOUNCY_CASTLE_PROVIDER_NAME).build(
passPhrase.toCharArray());
passphrase.toCharArray());
clear = pbe.getDataStream(decryptorFactory);
@ -1306,7 +1268,7 @@ public class PGPMain {
Object obj = it.next();
if (obj instanceof PGPPublicKeyEncryptedData) {
PGPPublicKeyEncryptedData encData = (PGPPublicKeyEncryptedData) obj;
secretKey = ProviderHelper.getPGPSecretKey(context, encData.getKeyID());
secretKey = ProviderHelper.getPGPSecretKeyByKeyId(context, encData.getKeyID());
if (secretKey != null) {
pbe = encData;
break;
@ -1323,7 +1285,7 @@ public class PGPMain {
PGPPrivateKey privateKey = null;
try {
PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder()
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME).build(passPhrase.toCharArray());
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME).build(passphrase.toCharArray());
privateKey = secretKey.extractPrivateKey(keyDecryptor);
} catch (PGPException e) {
throw new PGPException(context.getString(R.string.error_wrongPassPhrase));
@ -1363,11 +1325,11 @@ public class PGPMain {
if (dataChunk instanceof PGPOnePassSignatureList) {
if (progress != null)
progress.setProgress(R.string.progress_processingSignature, currentProgress, 100);
returnData.putBoolean(ApgService.RESULT_SIGNATURE, true);
returnData.putBoolean(ApgIntentService.RESULT_SIGNATURE, true);
PGPOnePassSignatureList sigList = (PGPOnePassSignatureList) dataChunk;
for (int i = 0; i < sigList.size(); ++i) {
signature = sigList.get(i);
signatureKey = ProviderHelper.getPGPPublicKey(context, signature.getKeyID());
signatureKey = ProviderHelper.getPGPPublicKeyByKeyId(context, signature.getKeyID());
if (signatureKeyId == 0) {
signatureKeyId = signature.getKeyID();
}
@ -1377,17 +1339,17 @@ public class PGPMain {
signatureIndex = i;
signatureKeyId = signature.getKeyID();
String userId = null;
PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingByMasterKeyId(
PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingByKeyId(
context, signatureKeyId);
if (signKeyRing != null) {
userId = PGPHelper.getMainUserId(PGPHelper.getMasterKey(signKeyRing));
}
returnData.putString(ApgService.RESULT_SIGNATURE_USER_ID, userId);
returnData.putString(ApgIntentService.RESULT_SIGNATURE_USER_ID, userId);
break;
}
}
returnData.putLong(ApgService.RESULT_SIGNATURE_KEY_ID, signatureKeyId);
returnData.putLong(ApgIntentService.RESULT_SIGNATURE_KEY_ID, signatureKeyId);
if (signature != null) {
JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider = new JcaPGPContentVerifierBuilderProvider()
@ -1395,7 +1357,7 @@ public class PGPMain {
signature.init(contentVerifierBuilderProvider, signatureKey);
} else {
returnData.putBoolean(ApgService.RESULT_SIGNATURE_UNKNOWN, true);
returnData.putBoolean(ApgIntentService.RESULT_SIGNATURE_UNKNOWN, true);
}
dataChunk = plainFact.nextObject();
@ -1432,7 +1394,7 @@ public class PGPMain {
try {
signature.update(buffer, 0, n);
} catch (SignatureException e) {
returnData.putBoolean(ApgService.RESULT_SIGNATURE_SUCCESS, false);
returnData.putBoolean(ApgIntentService.RESULT_SIGNATURE_SUCCESS, false);
signature = null;
}
}
@ -1454,9 +1416,9 @@ public class PGPMain {
PGPSignatureList signatureList = (PGPSignatureList) plainFact.nextObject();
PGPSignature messageSignature = signatureList.get(signatureIndex);
if (signature.verify(messageSignature)) {
returnData.putBoolean(ApgService.RESULT_SIGNATURE_SUCCESS, true);
returnData.putBoolean(ApgIntentService.RESULT_SIGNATURE_SUCCESS, true);
} else {
returnData.putBoolean(ApgService.RESULT_SIGNATURE_SUCCESS, false);
returnData.putBoolean(ApgIntentService.RESULT_SIGNATURE_SUCCESS, false);
}
}
}
@ -1478,8 +1440,8 @@ public class PGPMain {
return returnData;
}
public static Bundle verifyText(Context context, InputData data, OutputStream outStream,
boolean lookupUnknownKey, ProgressDialogUpdater progress) throws IOException,
public static Bundle verifyText(Context context, ProgressDialogUpdater progress,
InputData data, OutputStream outStream, boolean lookupUnknownKey) throws IOException,
ApgGeneralException, PGPException, SignatureException {
Bundle returnData = new Bundle();
@ -1509,7 +1471,7 @@ public class PGPMain {
byte[] clearText = out.toByteArray();
outStream.write(clearText);
returnData.putBoolean(ApgService.RESULT_SIGNATURE, true);
returnData.putBoolean(ApgIntentService.RESULT_SIGNATURE, true);
updateProgress(progress, R.string.progress_processingSignature, 60, 100);
PGPObjectFactory pgpFact = new PGPObjectFactory(aIn);
@ -1523,7 +1485,7 @@ public class PGPMain {
PGPPublicKey signatureKey = null;
for (int i = 0; i < sigList.size(); ++i) {
signature = sigList.get(i);
signatureKey = ProviderHelper.getPGPPublicKey(context, signature.getKeyID());
signatureKey = ProviderHelper.getPGPPublicKeyByKeyId(context, signature.getKeyID());
if (signatureKeyId == 0) {
signatureKeyId = signature.getKeyID();
}
@ -1531,8 +1493,8 @@ public class PGPMain {
if (signatureKey == null && lookupUnknownKey) {
returnData = new Bundle();
returnData.putLong(ApgService.RESULT_SIGNATURE_KEY_ID, signatureKeyId);
returnData.putBoolean(ApgService.RESULT_SIGNATURE_LOOKUP_KEY, true);
returnData.putLong(ApgIntentService.RESULT_SIGNATURE_KEY_ID, signatureKeyId);
returnData.putBoolean(ApgIntentService.RESULT_SIGNATURE_LOOKUP_KEY, true);
// return directly now, decrypt will be done again after importing unknown key
return returnData;
@ -1543,20 +1505,20 @@ public class PGPMain {
} else {
signatureKeyId = signature.getKeyID();
String userId = null;
PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingByMasterKeyId(
PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingByKeyId(
context, signatureKeyId);
if (signKeyRing != null) {
userId = PGPHelper.getMainUserId(PGPHelper.getMasterKey(signKeyRing));
}
returnData.putString(ApgService.RESULT_SIGNATURE_USER_ID, userId);
returnData.putString(ApgIntentService.RESULT_SIGNATURE_USER_ID, userId);
break;
}
}
returnData.putLong(ApgService.RESULT_SIGNATURE_KEY_ID, signatureKeyId);
returnData.putLong(ApgIntentService.RESULT_SIGNATURE_KEY_ID, signatureKeyId);
if (signature == null) {
returnData.putBoolean(ApgService.RESULT_SIGNATURE_UNKNOWN, true);
returnData.putBoolean(ApgIntentService.RESULT_SIGNATURE_UNKNOWN, true);
if (progress != null)
progress.setProgress(R.string.progress_done, 100, 100);
return returnData;
@ -1584,7 +1546,7 @@ public class PGPMain {
} while (lookAhead != -1);
}
returnData.putBoolean(ApgService.RESULT_SIGNATURE_SUCCESS, signature.verify());
returnData.putBoolean(ApgIntentService.RESULT_SIGNATURE_SUCCESS, signature.verify());
updateProgress(progress, R.string.progress_done, 100, 100);
return returnData;
@ -1822,7 +1784,7 @@ public class PGPMain {
return size;
}
public static void deleteFileSecurely(Context context, File file, ProgressDialogUpdater progress)
public static void deleteFileSecurely(Context context, ProgressDialogUpdater progress, File file)
throws FileNotFoundException, IOException {
long length = file.length();
SecureRandom random = new SecureRandom();

View File

@ -286,17 +286,21 @@ public class ApgProvider extends ContentProvider {
}
private SQLiteQueryBuilder buildKeyRingQuery(SQLiteQueryBuilder qb,
HashMap<String, String> projectionMap, int match, String sortOrder) {
HashMap<String, String> projectionMap, int match, boolean isMasterKey, String sortOrder) {
qb.appendWhere(Tables.KEY_RINGS + "." + KeyRingsColumns.TYPE + " = ");
qb.appendWhereEscapeString(Integer.toString(getKeyType(match)));
String isMasterKeyQuery = "";
if (isMasterKey) {
isMasterKeyQuery = " AND " + Tables.KEYS + "." + KeysColumns.IS_MASTER_KEY + " = '1'";
}
qb.setTables(Tables.KEY_RINGS + " INNER JOIN " + Tables.KEYS + " ON " + "("
+ Tables.KEY_RINGS + "." + BaseColumns._ID + " = " + Tables.KEYS + "."
+ KeysColumns.KEY_RING_ROW_ID + " AND " + Tables.KEYS + "."
+ KeysColumns.IS_MASTER_KEY + " = '1'" + ") " + " INNER JOIN " + Tables.USER_IDS
+ " ON " + "(" + Tables.KEY_RINGS + "." + BaseColumns._ID + " = " + Tables.USER_IDS
+ "." + UserIdsColumns.KEY_RING_ROW_ID + " AND " + Tables.USER_IDS + "."
+ UserIdsColumns.RANK + " = '0')");
+ KeysColumns.KEY_RING_ROW_ID + isMasterKeyQuery + ") " + " INNER JOIN "
+ Tables.USER_IDS + " ON " + "(" + Tables.KEY_RINGS + "." + BaseColumns._ID + " = "
+ Tables.USER_IDS + "." + UserIdsColumns.KEY_RING_ROW_ID + " AND "
+ Tables.USER_IDS + "." + UserIdsColumns.RANK + " = '0')");
projectionMap.put(BaseColumns._ID, Tables.KEY_RINGS + "." + BaseColumns._ID);
projectionMap.put(KeyRingsColumns.MASTER_KEY_ID, Tables.KEY_RINGS + "."
@ -326,7 +330,7 @@ public class ApgProvider extends ContentProvider {
switch (match) {
case PUBLIC_KEY_RING:
case SECRET_KEY_RING:
qb = buildKeyRingQuery(qb, projectionMap, match, sortOrder);
qb = buildKeyRingQuery(qb, projectionMap, match, true, sortOrder);
if (TextUtils.isEmpty(sortOrder)) {
sortOrder = Tables.USER_IDS + "." + UserIdsColumns.USER_ID + " ASC";
@ -336,7 +340,7 @@ public class ApgProvider extends ContentProvider {
case PUBLIC_KEY_RING_BY_ROW_ID:
case SECRET_KEY_RING_BY_ROW_ID:
qb = buildKeyRingQuery(qb, projectionMap, match, sortOrder);
qb = buildKeyRingQuery(qb, projectionMap, match, true, sortOrder);
qb.appendWhere(" AND " + Tables.KEY_RINGS + "." + BaseColumns._ID + " = ");
qb.appendWhereEscapeString(uri.getLastPathSegment());
@ -349,7 +353,7 @@ public class ApgProvider extends ContentProvider {
case PUBLIC_KEY_RING_BY_MASTER_KEY_ID:
case SECRET_KEY_RING_BY_MASTER_KEY_ID:
qb = buildKeyRingQuery(qb, projectionMap, match, sortOrder);
qb = buildKeyRingQuery(qb, projectionMap, match, true, sortOrder);
qb.appendWhere(" AND " + Tables.KEY_RINGS + "." + KeyRingsColumns.MASTER_KEY_ID + " = ");
qb.appendWhereEscapeString(uri.getLastPathSegment());
@ -362,9 +366,9 @@ public class ApgProvider extends ContentProvider {
case SECRET_KEY_RING_BY_KEY_ID:
case PUBLIC_KEY_RING_BY_KEY_ID:
qb = buildKeyRingQuery(qb, projectionMap, match, sortOrder);
qb = buildKeyRingQuery(qb, projectionMap, match, false, sortOrder);
qb.appendWhere(" AND " + Tables.KEYS + KeysColumns.KEY_ID + " = ");
qb.appendWhere(" AND " + Tables.KEYS + "." + KeysColumns.KEY_ID + " = ");
qb.appendWhereEscapeString(uri.getLastPathSegment());
if (TextUtils.isEmpty(sortOrder)) {

View File

@ -59,8 +59,19 @@ public class ProviderHelper {
}
/**
* Retrieves the actual PGPPublicKeyRing object from the database blob associated with the
* maserKeyId
* Retrieves the actual PGPPublicKeyRing object from the database blob based on the rowId
*
* @param context
* @param rowId
* @return
*/
public static PGPPublicKeyRing getPGPPublicKeyRingByRowId(Context context, long rowId) {
Uri queryUri = KeyRings.buildPublicKeyRingsUri(Long.toString(rowId));
return (PGPPublicKeyRing) getPGPKeyRing(context, queryUri);
}
/**
* Retrieves the actual PGPPublicKeyRing object from the database blob based on the maserKeyId
*
* @param context
* @param masterKeyId
@ -72,14 +83,50 @@ public class ProviderHelper {
return (PGPPublicKeyRing) getPGPKeyRing(context, queryUri);
}
public static PGPPublicKeyRing getPGPPublicKeyRing(Context context, long rowId) {
Uri queryUri = KeyRings.buildPublicKeyRingsUri(Long.toString(rowId));
/**
* Retrieves the actual PGPPublicKeyRing object from the database blob associated with a key
* with this keyId
*
* @param context
* @param keyId
* @return
*/
public static PGPPublicKeyRing getPGPPublicKeyRingByKeyId(Context context, long keyId) {
Uri queryUri = KeyRings.buildPublicKeyRingsByKeyIdUri(Long.toString(keyId));
return (PGPPublicKeyRing) getPGPKeyRing(context, queryUri);
}
/**
* Retrieves the actual PGPSecretKeyRing object from the database blob associated with the
* maserKeyId
* Retrieves the actual PGPPublicKey object from the database blob associated with a key with
* this keyId
*
* @param context
* @param keyId
* @return
*/
public static PGPPublicKey getPGPPublicKeyByKeyId(Context context, long keyId) {
PGPPublicKeyRing keyRing = getPGPPublicKeyRingByKeyId(context, keyId);
if (keyRing == null) {
return null;
}
return keyRing.getPublicKey(keyId);
}
/**
* Retrieves the actual PGPSecretKeyRing object from the database blob based on the rowId
*
* @param context
* @param rowId
* @return
*/
public static PGPSecretKeyRing getPGPSecretKeyRingByRowId(Context context, long rowId) {
Uri queryUri = KeyRings.buildSecretKeyRingsUri(Long.toString(rowId));
return (PGPSecretKeyRing) getPGPKeyRing(context, queryUri);
}
/**
* Retrieves the actual PGPSecretKeyRing object from the database blob based on the maserKeyId
*
* @param context
* @param masterKeyId
@ -91,28 +138,36 @@ public class ProviderHelper {
return (PGPSecretKeyRing) getPGPKeyRing(context, queryUri);
}
public static PGPSecretKeyRing getPGPSecretKeyRing(Context context, long rowId) {
Uri queryUri = KeyRings.buildSecretKeyRingsUri(Long.toString(rowId));
/**
* Retrieves the actual PGPSecretKeyRing object from the database blob associated with a key
* with this keyId
*
* @param context
* @param keyId
* @return
*/
public static PGPSecretKeyRing getPGPSecretKeyRingByKeyId(Context context, long keyId) {
Uri queryUri = KeyRings.buildSecretKeyRingsByKeyIdUri(Long.toString(keyId));
return (PGPSecretKeyRing) getPGPKeyRing(context, queryUri);
}
public static PGPSecretKey getPGPSecretKey(Context context, long keyId) {
PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRingByMasterKeyId(context, keyId);
/**
* Retrieves the actual PGPSecretKey object from the database blob associated with a key with
* this keyId
*
* @param context
* @param keyId
* @return
*/
public static PGPSecretKey getPGPSecretKeyByKeyId(Context context, long keyId) {
PGPSecretKeyRing keyRing = getPGPSecretKeyRingByKeyId(context, keyId);
if (keyRing == null) {
return null;
}
return keyRing.getSecretKey(keyId);
}
public static PGPPublicKey getPGPPublicKey(Context context, long keyId) {
PGPPublicKeyRing keyRing = ProviderHelper.getPGPPublicKeyRingByMasterKeyId(context, keyId);
if (keyRing == null) {
return null;
}
return keyRing.getPublicKey(keyId);
}
/**
* Saves PGPPublicKeyRing with its keys and userIds in DB
*

View File

@ -0,0 +1,881 @@
/*
* Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de>
*
* 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.thialfihar.android.apg.service;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Vector;
import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.helper.FileHelper;
import org.thialfihar.android.apg.helper.OtherHelper;
import org.thialfihar.android.apg.helper.PGPMain;
import org.thialfihar.android.apg.helper.Preferences;
import org.thialfihar.android.apg.helper.PGPMain.ApgGeneralException;
import org.thialfihar.android.apg.helper.PGPConversionHelper;
import org.thialfihar.android.apg.provider.ApgContract.DataStream;
import org.thialfihar.android.apg.provider.ProviderHelper;
import org.thialfihar.android.apg.util.HkpKeyServer;
import org.thialfihar.android.apg.util.InputData;
import org.thialfihar.android.apg.util.KeyServer.KeyInfo;
import org.thialfihar.android.apg.util.ProgressDialogUpdater;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import org.thialfihar.android.apg.util.Log;
/**
* This Service contains all important long lasting operations for APG. It receives Intents with
* data from the activities or other apps, queues these intents, executes them, and stops itself
* after doing them.
*/
public class ApgIntentService extends IntentService implements ProgressDialogUpdater {
/* extras that can be given by intent */
public static final String EXTRA_MESSENGER = "messenger";
public static final String EXTRA_ACTION = "action";
public static final String EXTRA_DATA = "data";
/* possible EXTRA_ACTIONs */
public static final int ACTION_ENCRYPT_SIGN = 10;
public static final int ACTION_DECRYPT_VERIFY = 20;
public static final int ACTION_SAVE_KEYRING = 30;
public static final int ACTION_GENERATE_KEY = 31;
public static final int ACTION_GENERATE_DEFAULT_RSA_KEYS = 32;
public static final int ACTION_DELETE_FILE_SECURELY = 40;
public static final int ACTION_IMPORT_KEY = 50;
public static final int ACTION_EXPORT_KEY = 51;
public static final int ACTION_UPLOAD_KEY = 60;
public static final int ACTION_QUERY_KEY = 61;
public static final int ACTION_SIGN_KEY = 70;
/* keys for data bundle */
// encrypt, decrypt, import export
public static final String TARGET = "target";
// possible targets:
public static final int TARGET_BYTES = 1;
public static final int TARGET_FILE = 2;
public static final int TARGET_STREAM = 3;
// encrypt
public static final String SECRET_KEY_ID = "secretKeyId";
public static final String USE_ASCII_AMOR = "useAsciiAmor";
public static final String ENCRYPTION_KEYS_IDS = "encryptionKeysIds";
public static final String COMPRESSION_ID = "compressionId";
public static final String GENERATE_SIGNATURE = "generateSignature";
public static final String SIGN_ONLY = "signOnly";
public static final String MESSAGE_BYTES = "messageBytes";
public static final String INPUT_FILE = "inputFile";
public static final String OUTPUT_FILE = "outputFile";
public static final String PROVIDER_URI = "providerUri";
// decrypt/verify
public static final String SIGNED_ONLY = "signedOnly";
public static final String RETURN_BYTES = "returnBinary";
public static final String CIPHERTEXT_BYTES = "ciphertextBytes";
public static final String ASSUME_SYMMETRIC = "assumeSymmetric";
public static final String LOOKUP_UNKNOWN_KEY = "lookupUnknownKey";
// edit keys
public static final String NEW_PASSPHRASE = "newPassphrase";
public static final String CURRENT_PASSPHRASE = "currentPassphrase";
public static final String USER_IDS = "userIds";
public static final String KEYS = "keys";
public static final String KEYS_USAGES = "keysUsages";
public static final String MASTER_KEY_ID = "masterKeyId";
// generate key
public static final String ALGORITHM = "algorithm";
public static final String KEY_SIZE = "keySize";
public static final String SYMMETRIC_PASSPHRASE = "passphrase";
public static final String MASTER_KEY = "masterKey";
// delete file securely
public static final String DELETE_FILE = "deleteFile";
// import key
public static final String IMPORT_INPUT_STREAM = "importInputStream";
public static final String IMPORT_FILENAME = "importFilename";
public static final String IMPORT_BYTES = "importBytes";
public static final String IMPORT_KEY_TYPE = "importKeyType";
// export key
public static final String EXPORT_OUTPUT_STREAM = "exportOutputStream";
public static final String EXPORT_FILENAME = "exportFilename";
public static final String EXPORT_KEY_TYPE = "exportKeyType";
public static final String EXPORT_ALL = "exportAll";
public static final String EXPORT_KEY_RING_ID = "exportKeyRingId";
// upload key
public static final String UPLOAD_KEY_SERVER = "uploadKeyServer";
public static final String UPLOAD_KEY_KEYRING_ROW_ID = "uploadKeyRingId";
// query key
public static final String QUERY_KEY_SERVER = "queryKeyServer";
public static final String QUERY_KEY_TYPE = "queryKeyType";
public static final String QUERY_KEY_STRING = "queryKeyString";
public static final String QUERY_KEY_ID = "queryKeyId";
// sign key
public static final String SIGN_KEY_MASTER_KEY_ID = "signKeyMasterKeyId";
public static final String SIGN_KEY_PUB_KEY_ID = "signKeyPubKeyId";
/*
* possible data keys as result send over messenger
*/
// keys
public static final String RESULT_NEW_KEY = "newKey";
public static final String RESULT_NEW_KEY2 = "newKey2";
// encrypt
public static final String RESULT_SIGNATURE_BYTES = "signatureData";
public static final String RESULT_SIGNATURE_STRING = "signatureText";
public static final String RESULT_ENCRYPTED_STRING = "encryptedMessage";
public static final String RESULT_ENCRYPTED_BYTES = "encryptedData";
public static final String RESULT_URI = "resultUri";
// decrypt/verify
public static final String RESULT_DECRYPTED_STRING = "decryptedMessage";
public static final String RESULT_DECRYPTED_BYTES = "decryptedData";
public static final String RESULT_SIGNATURE = "signature";
public static final String RESULT_SIGNATURE_KEY_ID = "signatureKeyId";
public static final String RESULT_SIGNATURE_USER_ID = "signatureUserId";
public static final String RESULT_SIGNATURE_SUCCESS = "signatureSuccess";
public static final String RESULT_SIGNATURE_UNKNOWN = "signatureUnknown";
public static final String RESULT_SIGNATURE_LOOKUP_KEY = "lookupKey";
// import
public static final String RESULT_IMPORT_ADDED = "added";
public static final String RESULT_IMPORT_UPDATED = "updated";
public static final String RESULT_IMPORT_BAD = "bad";
// export
public static final String RESULT_EXPORT = "exported";
// query
public static final String RESULT_QUERY_KEY_KEY_DATA = "queryKeyKeyData";
public static final String RESULT_QUERY_KEY_SEARCH_RESULT = "queryKeySearchResult";
Messenger mMessenger;
public ApgIntentService() {
super("ApgService");
}
/**
* The IntentService calls this method from the default worker thread with the intent that
* started the service. When this method returns, IntentService stops the service, as
* appropriate.
*/
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
if (extras == null) {
Log.e(Constants.TAG, "Extras bundle is null!");
return;
}
if (!(extras.containsKey(EXTRA_MESSENGER) || extras.containsKey(EXTRA_DATA) || extras
.containsKey(EXTRA_ACTION))) {
Log.e(Constants.TAG,
"Extra bundle must contain a messenger, a data bundle, and an action!");
return;
}
mMessenger = (Messenger) extras.get(EXTRA_MESSENGER);
Bundle data = extras.getBundle(EXTRA_DATA);
OtherHelper.logDebugBundle(data, "EXTRA_DATA");
int action = extras.getInt(EXTRA_ACTION);
// execute action from extra bundle
switch (action) {
case ACTION_ENCRYPT_SIGN:
try {
/* Input */
int target = data.getInt(TARGET);
long secretKeyId = data.getLong(SECRET_KEY_ID);
String encryptionPassphrase = data.getString(SYMMETRIC_PASSPHRASE);
boolean useAsciiArmor = data.getBoolean(USE_ASCII_AMOR);
long encryptionKeyIds[] = data.getLongArray(ENCRYPTION_KEYS_IDS);
int compressionId = data.getInt(COMPRESSION_ID);
boolean generateSignature = data.getBoolean(GENERATE_SIGNATURE);
boolean signOnly = data.getBoolean(SIGN_ONLY);
InputStream inStream = null;
long inLength = -1;
InputData inputData = null;
OutputStream outStream = null;
String streamFilename = null;
switch (target) {
case TARGET_BYTES: /* encrypting bytes directly */
byte[] bytes = data.getByteArray(MESSAGE_BYTES);
inStream = new ByteArrayInputStream(bytes);
inLength = bytes.length;
inputData = new InputData(inStream, inLength);
outStream = new ByteArrayOutputStream();
break;
case TARGET_FILE: /* encrypting file */
String inputFile = data.getString(INPUT_FILE);
String outputFile = data.getString(OUTPUT_FILE);
// check if storage is ready
if (!FileHelper.isStorageMounted(inputFile)
|| !FileHelper.isStorageMounted(outputFile)) {
throw new ApgGeneralException(
getString(R.string.error_externalStorageNotReady));
}
inStream = new FileInputStream(inputFile);
File file = new File(inputFile);
inLength = file.length();
inputData = new InputData(inStream, inLength);
outStream = new FileOutputStream(outputFile);
break;
case TARGET_STREAM: /* Encrypting stream from content uri */
Uri providerUri = (Uri) data.getParcelable(PROVIDER_URI);
// InputStream
InputStream in = getContentResolver().openInputStream(providerUri);
inLength = PGPMain.getLengthOfStream(in);
inputData = new InputData(in, inLength);
// OutputStream
try {
while (true) {
streamFilename = PGPMain.generateRandomString(32);
if (streamFilename == null) {
throw new PGPMain.ApgGeneralException(
"couldn't generate random file name");
}
openFileInput(streamFilename).close();
}
} catch (FileNotFoundException e) {
// found a name that isn't used yet
}
outStream = openFileOutput(streamFilename, Context.MODE_PRIVATE);
break;
default:
throw new PGPMain.ApgGeneralException("No target choosen!");
}
/* Operation */
if (generateSignature) {
Log.d(Constants.TAG, "generating signature...");
PGPMain.generateSignature(this, this, inputData, outStream, useAsciiArmor,
false, secretKeyId, PassphraseCacheService.getCachedPassphrase(this,
secretKeyId), Preferences.getPreferences(this)
.getDefaultHashAlgorithm(), Preferences.getPreferences(this)
.getForceV3Signatures());
} else if (signOnly) {
Log.d(Constants.TAG, "sign only...");
PGPMain.signText(this, this, inputData, outStream, secretKeyId,
PassphraseCacheService.getCachedPassphrase(this, secretKeyId),
Preferences.getPreferences(this).getDefaultHashAlgorithm(), Preferences
.getPreferences(this).getForceV3Signatures());
} else {
Log.d(Constants.TAG, "encrypt...");
PGPMain.encryptAndSign(this, this, inputData, outStream, useAsciiArmor,
compressionId, encryptionKeyIds, encryptionPassphrase, Preferences
.getPreferences(this).getDefaultEncryptionAlgorithm(),
secretKeyId,
Preferences.getPreferences(this).getDefaultHashAlgorithm(), Preferences
.getPreferences(this).getForceV3Signatures(),
PassphraseCacheService.getCachedPassphrase(this, secretKeyId));
}
outStream.close();
/* Output */
Bundle resultData = new Bundle();
switch (target) {
case TARGET_BYTES:
if (useAsciiArmor) {
String output = new String(
((ByteArrayOutputStream) outStream).toByteArray());
if (generateSignature) {
resultData.putString(RESULT_SIGNATURE_STRING, output);
} else {
resultData.putString(RESULT_ENCRYPTED_STRING, output);
}
} else {
byte output[] = ((ByteArrayOutputStream) outStream).toByteArray();
if (generateSignature) {
resultData.putByteArray(RESULT_SIGNATURE_BYTES, output);
} else {
resultData.putByteArray(RESULT_ENCRYPTED_BYTES, output);
}
}
break;
case TARGET_FILE:
// nothing, file was written, just send okay
break;
case TARGET_STREAM:
String uri = DataStream.buildDataStreamUri(streamFilename).toString();
resultData.putString(RESULT_URI, uri);
break;
}
OtherHelper.logDebugBundle(resultData, "resultData");
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_OKAY, resultData);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
case ACTION_DECRYPT_VERIFY:
try {
/* Input */
int target = data.getInt(TARGET);
long secretKeyId = data.getLong(SECRET_KEY_ID);
byte[] bytes = data.getByteArray(CIPHERTEXT_BYTES);
boolean signedOnly = data.getBoolean(SIGNED_ONLY);
boolean returnBytes = data.getBoolean(RETURN_BYTES);
boolean assumeSymmetricEncryption = data.getBoolean(ASSUME_SYMMETRIC);
boolean lookupUnknownKey = data.getBoolean(LOOKUP_UNKNOWN_KEY);
InputStream inStream = null;
long inLength = -1;
InputData inputData = null;
OutputStream outStream = null;
String streamFilename = null;
switch (target) {
case TARGET_BYTES: /* decrypting bytes directly */
inStream = new ByteArrayInputStream(bytes);
inLength = bytes.length;
inputData = new InputData(inStream, inLength);
outStream = new ByteArrayOutputStream();
break;
case TARGET_FILE: /* decrypting file */
String inputFile = data.getString(INPUT_FILE);
String outputFile = data.getString(OUTPUT_FILE);
// check if storage is ready
if (!FileHelper.isStorageMounted(inputFile)
|| !FileHelper.isStorageMounted(outputFile)) {
throw new ApgGeneralException(
getString(R.string.error_externalStorageNotReady));
}
// InputStream
inLength = -1;
inStream = new FileInputStream(inputFile);
File file = new File(inputFile);
inLength = file.length();
inputData = new InputData(inStream, inLength);
// OutputStream
outStream = new FileOutputStream(outputFile);
break;
case TARGET_STREAM: /* decrypting stream from content uri */
Uri providerUri = (Uri) data.getParcelable(PROVIDER_URI);
// InputStream
InputStream in = getContentResolver().openInputStream(providerUri);
inLength = PGPMain.getLengthOfStream(in);
inputData = new InputData(in, inLength);
// OutputStream
try {
while (true) {
streamFilename = PGPMain.generateRandomString(32);
if (streamFilename == null) {
throw new PGPMain.ApgGeneralException(
"couldn't generate random file name");
}
openFileInput(streamFilename).close();
}
} catch (FileNotFoundException e) {
// found a name that isn't used yet
}
outStream = openFileOutput(streamFilename, Context.MODE_PRIVATE);
break;
default:
throw new PGPMain.ApgGeneralException("No target choosen!");
}
/* Operation */
Bundle resultData = new Bundle();
// verifyText and decrypt returning additional resultData values for the
// verification of signatures
if (signedOnly) {
resultData = PGPMain.verifyText(this, this, inputData, outStream,
lookupUnknownKey);
} else {
resultData = PGPMain.decryptAndVerify(this, this, inputData, outStream,
PassphraseCacheService.getCachedPassphrase(this, secretKeyId),
assumeSymmetricEncryption);
}
outStream.close();
/* Output */
switch (target) {
case TARGET_BYTES:
if (returnBytes) {
byte output[] = ((ByteArrayOutputStream) outStream).toByteArray();
resultData.putByteArray(RESULT_DECRYPTED_BYTES, output);
} else {
String output = new String(
((ByteArrayOutputStream) outStream).toByteArray());
resultData.putString(RESULT_DECRYPTED_STRING, output);
}
break;
case TARGET_FILE:
// nothing, file was written, just send okay and verification bundle
break;
case TARGET_STREAM:
String uri = DataStream.buildDataStreamUri(streamFilename).toString();
resultData.putString(RESULT_URI, uri);
break;
}
OtherHelper.logDebugBundle(resultData, "resultData");
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_OKAY, resultData);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
case ACTION_SAVE_KEYRING:
try {
/* Input */
String oldPassPhrase = data.getString(CURRENT_PASSPHRASE);
String newPassPhrase = data.getString(NEW_PASSPHRASE);
if (newPassPhrase == null) {
newPassPhrase = oldPassPhrase;
}
ArrayList<String> userIds = data.getStringArrayList(USER_IDS);
ArrayList<PGPSecretKey> keys = PGPConversionHelper.BytesToPGPSecretKeyList(data
.getByteArray(KEYS));
ArrayList<Integer> keysUsages = data.getIntegerArrayList(KEYS_USAGES);
long masterKeyId = data.getLong(MASTER_KEY_ID);
/* Operation */
PGPMain.buildSecretKey(this, userIds, keys, keysUsages, masterKeyId, oldPassPhrase,
newPassPhrase, this);
PassphraseCacheService.addCachedPassphrase(this, masterKeyId, newPassPhrase);
/* Output */
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_OKAY);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
case ACTION_GENERATE_KEY:
try {
/* Input */
int algorithm = data.getInt(ALGORITHM);
String passphrase = data.getString(SYMMETRIC_PASSPHRASE);
int keysize = data.getInt(KEY_SIZE);
PGPSecretKey masterKey = null;
if (data.containsKey(MASTER_KEY)) {
masterKey = PGPConversionHelper.BytesToPGPSecretKey(data
.getByteArray(MASTER_KEY));
}
/* Operation */
PGPSecretKeyRing newKeyRing = PGPMain.createKey(this, algorithm, keysize,
passphrase, masterKey);
/* Output */
Bundle resultData = new Bundle();
resultData.putByteArray(RESULT_NEW_KEY,
PGPConversionHelper.PGPSecretKeyRingToBytes(newKeyRing));
OtherHelper.logDebugBundle(resultData, "resultData");
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_OKAY, resultData);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
case ACTION_GENERATE_DEFAULT_RSA_KEYS:
// generate one RSA 2048 key for signing and one subkey for encrypting!
try {
/* Input */
String passphrase = data.getString(SYMMETRIC_PASSPHRASE);
/* Operation */
PGPSecretKeyRing masterKeyRing = PGPMain.createKey(this, Id.choice.algorithm.rsa,
2048, passphrase, null);
PGPSecretKeyRing subKeyRing = PGPMain.createKey(this, Id.choice.algorithm.rsa,
2048, passphrase, masterKeyRing.getSecretKey());
/* Output */
Bundle resultData = new Bundle();
resultData.putByteArray(RESULT_NEW_KEY,
PGPConversionHelper.PGPSecretKeyRingToBytes(masterKeyRing));
resultData.putByteArray(RESULT_NEW_KEY2,
PGPConversionHelper.PGPSecretKeyRingToBytes(subKeyRing));
OtherHelper.logDebugBundle(resultData, "resultData");
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_OKAY, resultData);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
case ACTION_DELETE_FILE_SECURELY:
try {
/* Input */
String deleteFile = data.getString(DELETE_FILE);
/* Operation */
try {
PGPMain.deleteFileSecurely(this, this, new File(deleteFile));
} catch (FileNotFoundException e) {
throw new PGPMain.ApgGeneralException(getString(R.string.error_fileNotFound,
deleteFile));
} catch (IOException e) {
throw new PGPMain.ApgGeneralException(getString(
R.string.error_fileDeleteFailed, deleteFile));
}
/* Output */
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_OKAY);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
case ACTION_IMPORT_KEY:
try {
/* Input */
int target = data.getInt(TARGET);
int keyType = Id.type.public_key;
if (data.containsKey(IMPORT_KEY_TYPE)) {
keyType = data.getInt(IMPORT_KEY_TYPE);
}
/* Operation */
InputStream inStream = null;
long inLength = -1;
InputData inputData = null;
switch (target) {
case TARGET_BYTES: /* import key from bytes directly */
byte[] bytes = data.getByteArray(IMPORT_BYTES);
inStream = new ByteArrayInputStream(bytes);
inLength = bytes.length;
inputData = new InputData(inStream, inLength);
break;
case TARGET_FILE: /* import key from file */
String inputFile = data.getString(IMPORT_FILENAME);
inStream = new FileInputStream(inputFile);
File file = new File(inputFile);
inLength = file.length();
inputData = new InputData(inStream, inLength);
break;
case TARGET_STREAM:
// TODO: not implemented
break;
}
Bundle resultData = new Bundle();
resultData = PGPMain.importKeyRings(this, keyType, inputData, this);
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_OKAY, resultData);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
case ACTION_EXPORT_KEY:
try {
/* Input */
int keyType = Id.type.public_key;
if (data.containsKey(EXPORT_KEY_TYPE)) {
keyType = data.getInt(EXPORT_KEY_TYPE);
}
String outputFile = data.getString(EXPORT_FILENAME);
boolean exportAll = data.getBoolean(EXPORT_ALL);
int keyRingId = -1;
if (!exportAll) {
keyRingId = data.getInt(EXPORT_KEY_RING_ID);
}
/* Operation */
// check if storage is ready
if (!FileHelper.isStorageMounted(outputFile)) {
throw new ApgGeneralException(getString(R.string.error_externalStorageNotReady));
}
// OutputStream
FileOutputStream outStream = new FileOutputStream(outputFile);
Vector<Integer> keyRingIds = new Vector<Integer>();
if (exportAll) {
if (keyType == Id.type.public_key) {
keyRingIds = ProviderHelper.getPublicKeyRingsRowIds(this);
} else {
keyRingIds = ProviderHelper.getSecretKeyRingsRowIds(this);
}
} else {
keyRingIds.add(keyRingId);
}
Bundle resultData = new Bundle();
resultData = PGPMain.exportKeyRings(this, keyRingIds, outStream, this);
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_OKAY, resultData);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
case ACTION_UPLOAD_KEY:
try {
/* Input */
int keyRingRowId = data.getInt(UPLOAD_KEY_KEYRING_ROW_ID);
String keyServer = data.getString(UPLOAD_KEY_SERVER);
/* Operation */
HkpKeyServer server = new HkpKeyServer(keyServer);
PGPPublicKeyRing keyring = ProviderHelper.getPGPPublicKeyRingByRowId(this, keyRingRowId);
if (keyring != null) {
boolean uploaded = PGPMain.uploadKeyRingToServer(server,
(PGPPublicKeyRing) keyring);
if (!uploaded) {
throw new ApgGeneralException("Unable to export key to selected server");
}
}
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_OKAY);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
case ACTION_QUERY_KEY:
try {
/* Input */
int queryType = data.getInt(QUERY_KEY_TYPE);
String keyServer = data.getString(QUERY_KEY_SERVER);
String queryString = data.getString(QUERY_KEY_STRING);
long keyId = data.getLong(QUERY_KEY_ID);
/* Operation */
Bundle resultData = new Bundle();
HkpKeyServer server = new HkpKeyServer(keyServer);
if (queryType == Id.keyserver.search) {
ArrayList<KeyInfo> searchResult = server.search(queryString);
resultData.putParcelableArrayList(RESULT_QUERY_KEY_SEARCH_RESULT, searchResult);
} else if (queryType == Id.keyserver.get) {
String keyData = server.get(keyId);
resultData.putString(RESULT_QUERY_KEY_KEY_DATA, keyData);
}
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_OKAY, resultData);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
case ACTION_SIGN_KEY:
try {
/* Input */
long masterKeyId = data.getLong(SIGN_KEY_MASTER_KEY_ID);
long pubKeyId = data.getLong(SIGN_KEY_PUB_KEY_ID);
/* Operation */
String signaturePassPhrase = PassphraseCacheService.getCachedPassphrase(this,
masterKeyId);
PGPPublicKeyRing signedPubKeyRing = PGPMain.signKey(this, masterKeyId, pubKeyId,
signaturePassPhrase);
// store the signed key in our local cache
int retval = PGPMain.storeKeyRingInCache(this, signedPubKeyRing);
if (retval != Id.return_value.ok && retval != Id.return_value.updated) {
throw new ApgGeneralException("Failed to store signed key in local cache");
}
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_OKAY);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
default:
break;
}
}
private void sendErrorToHandler(Exception e) {
Log.e(Constants.TAG, "ApgService Exception: ", e);
e.printStackTrace();
Bundle data = new Bundle();
data.putString(ApgIntentServiceHandler.DATA_ERROR, e.getMessage());
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_EXCEPTION, null, data);
}
private void sendMessageToHandler(Integer arg1, Integer arg2, Bundle data) {
Message msg = Message.obtain();
msg.arg1 = arg1;
if (arg2 != null) {
msg.arg2 = arg2;
}
if (data != null) {
msg.setData(data);
}
try {
mMessenger.send(msg);
} catch (RemoteException e) {
Log.w(Constants.TAG, "Exception sending message, Is handler present?", e);
} catch (NullPointerException e) {
Log.w(Constants.TAG, "Messenger is null!", e);
}
}
private void sendMessageToHandler(Integer arg1, Bundle data) {
sendMessageToHandler(arg1, null, data);
}
private void sendMessageToHandler(Integer arg1) {
sendMessageToHandler(arg1, null, null);
}
/**
* Set progress of ProgressDialog by sending message to handler on UI thread
*/
public void setProgress(String message, int progress, int max) {
Log.d(Constants.TAG, "Send message by setProgress with progress=" + progress + ", max="
+ max);
Bundle data = new Bundle();
if (message != null) {
data.putString(ApgIntentServiceHandler.DATA_MESSAGE, message);
}
data.putInt(ApgIntentServiceHandler.DATA_PROGRESS, progress);
data.putInt(ApgIntentServiceHandler.DATA_PROGRESS_MAX, max);
sendMessageToHandler(ApgIntentServiceHandler.MESSAGE_UPDATE_PROGRESS, null, data);
}
public void setProgress(int resourceId, int progress, int max) {
setProgress(getString(resourceId), progress, max);
}
public void setProgress(int progress, int max) {
setProgress(null, progress, max);
}
}

View File

@ -26,7 +26,7 @@ import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;
public class ApgServiceHandler extends Handler {
public class ApgIntentServiceHandler extends Handler {
// possible messages send from this service to handler on ui
public static final int MESSAGE_OKAY = 1;
@ -43,16 +43,16 @@ public class ApgServiceHandler extends Handler {
Activity mActivity;
ProgressDialogFragment mProgressDialogFragment;
public ApgServiceHandler(Activity activity) {
public ApgIntentServiceHandler(Activity activity) {
this.mActivity = activity;
}
public ApgServiceHandler(Activity activity, ProgressDialogFragment progressDialogFragment) {
public ApgIntentServiceHandler(Activity activity, ProgressDialogFragment progressDialogFragment) {
this.mActivity = activity;
this.mProgressDialogFragment = progressDialogFragment;
}
public ApgServiceHandler(Activity activity, int progressDialogMessageId, int progressDialogStyle) {
public ApgIntentServiceHandler(Activity activity, int progressDialogMessageId, int progressDialogStyle) {
this.mActivity = activity;
this.mProgressDialogFragment = ProgressDialogFragment.newInstance(progressDialogMessageId,
progressDialogStyle);

View File

@ -1,5 +0,0 @@
package org.thialfihar.android.apg.service;
public class ApgRemoteService {
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,16 @@
package org.thialfihar.android.apg.service;
interface IApgEncryptDecryptHandler {
/**
* Either output or streamUri is given. One of them is null
*
*/
oneway void onSuccessEncrypt(in byte[] outputBytes, in String outputUri);
oneway void onSuccessDecrypt(in byte[] outputBytes, in String outputUri, in boolean signature,
in long signatureKeyId, in String signatureUserId, in boolean signatureSuccess,
in boolean signatureUnknown);
oneway void onException(in int exceptionNumber, in String message);
}

View File

@ -0,0 +1,9 @@
package org.thialfihar.android.apg.service;
interface IApgHelperHandler {
oneway void onSuccessGetDecryptionKey(in long secretKeyId, in boolean symmetric);
oneway void onException(in int exceptionNumber, in String message);
}

View File

@ -0,0 +1,130 @@
package org.thialfihar.android.apg.service;
import org.thialfihar.android.apg.service.IApgEncryptDecryptHandler;
import org.thialfihar.android.apg.service.IApgSignVerifyHandler;
import org.thialfihar.android.apg.service.IApgHelperHandler;
/**
* All methods are oneway, which means they are asynchronous and non-blocking.
* Results are returned into given Handler, which has to be implemented on client side.
*/
interface IApgService {
/**
* Encrypt
*
* Either inputBytes or inputUri is given, the other should be null.
*
* @param inputBytes
* Byte array you want to encrypt
* @param inputUri
* Blob in ContentProvider you want to encrypt
* @param useAsciiArmor
* Convert bytes to ascii armored text to guard against encoding problems
* @param compression
* Compression: 0x21070001: none, 1: Zip, 2: Zlib, 3: BZip2
* @param encryptionKeyIds
* Ids of public keys used for encryption
* @param symmetricEncryptionAlgorithm
* 7: AES-128, 8: AES-192, 9: AES-256, 4: Blowfish, 10: Twofish, 3: CAST5,
* 6: DES, 2: Triple DES, 1: IDEA
* @param handler
* Results are returned to this IApgEncryptDecryptHandler Handler
* to onSuccessEncrypt(in byte[] output), after successful encryption
*/
oneway void encryptAsymmetric(in byte[] inputBytes, in String inputUri, in boolean useAsciiArmor,
in int compression, in long[] encryptionKeyIds, in int symmetricEncryptionAlgorithm,
in IApgEncryptDecryptHandler handler);
/**
* Same as encryptAsymmetric but using a passphrase for symmetric encryption
*
* @param encryptionPassphrase
* Passphrase for direct symmetric encryption using symmetricEncryptionAlgorithm
*/
oneway void encryptSymmetric(in byte[] inputBytes, in String inputUri, in boolean useAsciiArmor,
in int compression, in String encryptionPassphrase, in int symmetricEncryptionAlgorithm,
in IApgEncryptDecryptHandler handler);
/**
* Encrypt and sign
*
* Either inputBytes or inputUri is given, the other should be null.
*
* @param inputBytes
* Byte array you want to encrypt
* @param inputUri
* Blob in ContentProvider you want to encrypt
* @param useAsciiArmor
* Convert bytes to ascii armored text to guard against encoding problems
* @param compression
* Compression: 0x21070001: none, 1: Zip, 2: Zlib, 3: BZip2
* @param encryptionKeyIds
* Ids of public keys used for encryption
* @param symmetricEncryptionAlgorithm
* 7: AES-128, 8: AES-192, 9: AES-256, 4: Blowfish, 10: Twofish, 3: CAST5,
* 6: DES, 2: Triple DES, 1: IDEA
* @param signatureKeyId
* Key id of key to sign with
* @param signatureHashAlgorithm
* 1: MD5, 3: RIPEMD-160, 2: SHA-1, 11: SHA-224, 8: SHA-256, 9: SHA-384,
* 10: SHA-512
* @param signatureForceV3
* Force V3 signatures
* @param signaturePassphrase
* Passphrase to unlock signature key
* @param handler
* Results are returned to this IApgEncryptDecryptHandler Handler
* to onSuccessEncrypt(in byte[] output), after successful encryption and signing
*/
oneway void encryptAndSignAsymmetric(in byte[] inputBytes, in String inputUri,
in boolean useAsciiArmor, in int compression, in long[] encryptionKeyIds,
in int symmetricEncryptionAlgorithm, in long signatureKeyId, in int signatureHashAlgorithm,
in boolean signatureForceV3, in String signaturePassphrase,
in IApgEncryptDecryptHandler handler);
/**
* Same as encryptAndSignAsymmetric but using a passphrase for symmetric encryption
*
* @param encryptionPassphrase
* Passphrase for direct symmetric encryption using symmetricEncryptionAlgorithm
*/
oneway void encryptAndSignSymmetric(in byte[] inputBytes, in String inputUri,
in boolean useAsciiArmor, in int compression, in String encryptionPassphrase,
in int symmetricEncryptionAlgorithm, in long signatureKeyId, in int signatureHashAlgorithm,
in boolean signatureForceV3, in String signaturePassphrase,
in IApgEncryptDecryptHandler handler);
/**
* 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 inputUri
* Blob in ContentProvider you want to decrypt and verify
* @param keyPassphrase
* Passphrase to unlock secret key for decryption.
* @param handler
* Handler where to return results to after successful encryption
*/
oneway void decryptAndVerifyAsymmetric(in byte[] inputBytes, in String inputUri,
in String keyPassphrase, in IApgEncryptDecryptHandler handler);
/**
* Same as decryptAndVerifyAsymmetric but for symmetric decryption.
*
* @param encryptionPassphrase
* Passphrase to decrypt
*/
oneway void decryptAndVerifySymmetric(in byte[] inputBytes, in String inputUri,
in String encryptionPassphrase, in IApgEncryptDecryptHandler handler);
/**
*
*/
oneway void getDecryptionKey(in byte[] inputBytes, in String inputUri,
in IApgHelperHandler handler);
}

View File

@ -0,0 +1,11 @@
package org.thialfihar.android.apg.service;
interface IApgSignVerifyHandler {
oneway void onSuccessSign(in byte[] outputBytes, in String outputUri);
oneway void onSuccessVerify(in boolean signature, in long signatureKeyId,
in String signatureUserId, in boolean signatureSuccess, in boolean signatureUnknown);
oneway void onException(in int exceptionNumber, in String message);
}

View File

@ -85,10 +85,10 @@ public class PassphraseCacheService extends Service {
* @return
*/
public static String getCachedPassphrase(Context context, long keyId) {
// try to get real key id
long realId = keyId;
if (realId != Id.key.symmetric) {
PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRingByMasterKeyId(context, keyId);
// try to get master key id which is used as an identifier for cached passphrases
long masterKeyId = keyId;
if (masterKeyId != Id.key.symmetric) {
PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRingByKeyId(context, keyId);
if (keyRing == null) {
return null;
}
@ -96,17 +96,17 @@ public class PassphraseCacheService extends Service {
if (masterKey == null) {
return null;
}
realId = masterKey.getKeyID();
masterKeyId = masterKey.getKeyID();
}
// get cached passphrase
String cachedPassphrase = mPassphraseCache.get(realId);
String cachedPassphrase = mPassphraseCache.get(masterKeyId);
if (cachedPassphrase == null) {
return null;
}
// set it again to reset the cache life cycle
Log.d(TAG, "Cache passphrase again when getting it!");
addCachedPassphrase(context, realId, cachedPassphrase);
addCachedPassphrase(context, masterKeyId, cachedPassphrase);
return cachedPassphrase;
}

View File

@ -25,8 +25,8 @@ import org.thialfihar.android.apg.helper.OtherHelper;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.helper.PGPMain;
import org.thialfihar.android.apg.provider.ProviderHelper;
import org.thialfihar.android.apg.service.ApgServiceHandler;
import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.service.ApgIntentServiceHandler;
import org.thialfihar.android.apg.service.ApgIntentService;
import org.thialfihar.android.apg.service.PassphraseCacheService;
import org.thialfihar.android.apg.ui.dialog.DeleteFileDialogFragment;
import org.thialfihar.android.apg.ui.dialog.FileDialogFragment;
@ -115,7 +115,7 @@ public class DecryptActivity extends SherlockFragmentActivity {
private String mOutputFilename = null;
private Uri mContentUri = null;
private byte[] mData = null;
private byte[] mDataBytes = null;
private boolean mReturnBinary = false;
private long mUnknownSignatureKeyId = 0;
@ -126,14 +126,6 @@ public class DecryptActivity extends SherlockFragmentActivity {
private boolean mLookupUnknownKey = true;
public void setSecretKeyId(long id) {
mSecretKeyId = id;
}
public long getSecretKeyId() {
return mSecretKeyId;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
@ -334,8 +326,8 @@ public class DecryptActivity extends SherlockFragmentActivity {
if (mSignatureKeyId == 0) {
return;
}
PGPPublicKeyRing key = ProviderHelper.getPGPPublicKeyRingByMasterKeyId(DecryptActivity.this,
mSignatureKeyId);
PGPPublicKeyRing key = ProviderHelper.getPGPPublicKeyRingByKeyId(
DecryptActivity.this, mSignatureKeyId);
if (key != null) {
Intent intent = new Intent(DecryptActivity.this, KeyServerQueryActivity.class);
intent.setAction(KeyServerQueryActivity.ACTION_LOOK_UP_KEY_ID);
@ -367,7 +359,7 @@ public class DecryptActivity extends SherlockFragmentActivity {
if (decryptImmediately
|| (mSource.getCurrentView().getId() == R.id.sourceMessage && (mMessage.getText()
.length() > 0 || mData != null || mContentUri != null))) {
.length() > 0 || mDataBytes != null || mContentUri != null))) {
decryptClicked();
}
}
@ -388,9 +380,9 @@ public class DecryptActivity extends SherlockFragmentActivity {
Log.d(Constants.TAG, "got extras");
}
mData = extras.getByteArray(EXTRA_DATA);
mDataBytes = extras.getByteArray(EXTRA_DATA);
String textData = null;
if (mData == null) {
if (mDataBytes == null) {
Log.d(Constants.TAG, "EXTRA_DATA was null");
textData = extras.getString(EXTRA_TEXT);
} else {
@ -456,7 +448,7 @@ public class DecryptActivity extends SherlockFragmentActivity {
mReturnBinary = extras.getBoolean(EXTRA_BINARY, false);
if (mContentUri == null) {
mData = extras.getByteArray(EXTRA_DATA);
mDataBytes = extras.getByteArray(EXTRA_DATA);
String data = extras.getString(EXTRA_TEXT);
if (data != null) {
Matcher matcher = PGPMain.PGP_MESSAGE.matcher(data);
@ -567,11 +559,9 @@ public class DecryptActivity extends SherlockFragmentActivity {
getDecryptionKeyFromInputStream();
Log.d(Constants.TAG, "secretKeyId: " + getSecretKeyId());
// if we need a symmetric passphrase or a passphrase to use a secret key ask for it
if (getSecretKeyId() == Id.key.symmetric
|| PassphraseCacheService.getCachedPassphrase(this, getSecretKeyId()) == null) {
if (mSecretKeyId == Id.key.symmetric
|| PassphraseCacheService.getCachedPassphrase(this, mSecretKeyId) == null) {
showPassphraseDialog();
} else {
if (mDecryptTarget == Id.target.file) {
@ -618,7 +608,7 @@ public class DecryptActivity extends SherlockFragmentActivity {
}
/**
* TODO: externalize this into ApgService???
* TODO: Rework function, remove global variables
*/
private void getDecryptionKeyFromInputStream() {
InputStream inStream = null;
@ -646,23 +636,24 @@ public class DecryptActivity extends SherlockFragmentActivity {
Toast.LENGTH_SHORT).show();
}
} else {
if (mData != null) {
inStream = new ByteArrayInputStream(mData);
if (mDataBytes != null) {
inStream = new ByteArrayInputStream(mDataBytes);
} else {
inStream = new ByteArrayInputStream(mMessage.getText().toString().getBytes());
}
}
// get decryption key for this inStream
try {
try {
setSecretKeyId(PGPMain.getDecryptionKeyId(this, inStream));
if (getSecretKeyId() == Id.key.none) {
mSecretKeyId = PGPMain.getDecryptionKeyId(this, inStream);
if (mSecretKeyId == Id.key.none) {
throw new PGPMain.ApgGeneralException(
getString(R.string.error_noSecretKeyFound));
}
mAssumeSymmetricEncryption = false;
} catch (PGPMain.NoAsymmetricEncryptionException e) {
setSecretKeyId(Id.key.symmetric);
mSecretKeyId = Id.key.symmetric;
if (!PGPMain.hasSymmetricEncryption(this, inStream)) {
throw new PGPMain.ApgGeneralException(
getString(R.string.error_noKnownEncryptionFound));
@ -684,7 +675,7 @@ public class DecryptActivity extends SherlockFragmentActivity {
intent.putExtra(EncryptActivity.EXTRA_TEXT, data);
intent.putExtra(EncryptActivity.EXTRA_SUBJECT, "Re: " + mSubject);
intent.putExtra(EncryptActivity.EXTRA_SEND_TO, mReplyTo);
intent.putExtra(EncryptActivity.EXTRA_SIGNATURE_KEY_ID, getSecretKeyId());
intent.putExtra(EncryptActivity.EXTRA_SIGNATURE_KEY_ID, mSecretKeyId);
intent.putExtra(EncryptActivity.EXTRA_ENCRYPTION_KEY_IDS, new long[] { mSignatureKeyId });
startActivity(intent);
}
@ -742,62 +733,62 @@ public class DecryptActivity extends SherlockFragmentActivity {
Log.d(Constants.TAG, "decryptStart");
// Send all information needed to service to decrypt in other thread
Intent intent = new Intent(this, ApgService.class);
Intent intent = new Intent(this, ApgIntentService.class);
// fill values for this action
Bundle data = new Bundle();
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_DECRYPT_VERIFY);
intent.putExtra(ApgIntentService.EXTRA_ACTION, ApgIntentService.ACTION_DECRYPT_VERIFY);
// choose action based on input: decrypt stream, file or bytes
if (mContentUri != null) {
data.putInt(ApgService.TARGET, ApgService.TARGET_STREAM);
data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_STREAM);
data.putParcelable(ApgService.PROVIDER_URI, mContentUri);
data.putParcelable(ApgIntentService.PROVIDER_URI, mContentUri);
} else if (mDecryptTarget == Id.target.file) {
data.putInt(ApgService.TARGET, ApgService.TARGET_FILE);
data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_FILE);
Log.d(Constants.TAG, "mInputFilename=" + mInputFilename + ", mOutputFilename="
+ mOutputFilename);
data.putString(ApgService.INPUT_FILE, mInputFilename);
data.putString(ApgService.OUTPUT_FILE, mOutputFilename);
data.putString(ApgIntentService.INPUT_FILE, mInputFilename);
data.putString(ApgIntentService.OUTPUT_FILE, mOutputFilename);
} else {
data.putInt(ApgService.TARGET, ApgService.TARGET_BYTES);
data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_BYTES);
if (mData != null) {
data.putByteArray(ApgService.CIPHERTEXT_BYTES, mData);
if (mDataBytes != null) {
data.putByteArray(ApgIntentService.CIPHERTEXT_BYTES, mDataBytes);
} else {
String message = mMessage.getText().toString();
data.putByteArray(ApgService.CIPHERTEXT_BYTES, message.getBytes());
data.putByteArray(ApgIntentService.CIPHERTEXT_BYTES, message.getBytes());
}
}
data.putLong(ApgService.SECRET_KEY_ID, getSecretKeyId());
data.putLong(ApgIntentService.SECRET_KEY_ID, mSecretKeyId);
data.putBoolean(ApgService.SIGNED_ONLY, mSignedOnly);
data.putBoolean(ApgService.LOOKUP_UNKNOWN_KEY, mLookupUnknownKey);
data.putBoolean(ApgService.RETURN_BYTES, mReturnBinary);
data.putBoolean(ApgService.ASSUME_SYMMETRIC, mAssumeSymmetricEncryption);
data.putBoolean(ApgIntentService.SIGNED_ONLY, mSignedOnly);
data.putBoolean(ApgIntentService.LOOKUP_UNKNOWN_KEY, mLookupUnknownKey);
data.putBoolean(ApgIntentService.RETURN_BYTES, mReturnBinary);
data.putBoolean(ApgIntentService.ASSUME_SYMMETRIC, mAssumeSymmetricEncryption);
intent.putExtra(ApgService.EXTRA_DATA, data);
intent.putExtra(ApgIntentService.EXTRA_DATA, data);
// Message is received after encrypting is done in ApgService
ApgServiceHandler saveHandler = new ApgServiceHandler(this, R.string.progress_decrypting,
ProgressDialog.STYLE_HORIZONTAL) {
ApgIntentServiceHandler saveHandler = new ApgIntentServiceHandler(this,
R.string.progress_decrypting, ProgressDialog.STYLE_HORIZONTAL) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
// get returned data bundle
Bundle returnData = message.getData();
// if key is unknown show lookup dialog
if (returnData.getBoolean(ApgService.RESULT_SIGNATURE_LOOKUP_KEY)
if (returnData.getBoolean(ApgIntentService.RESULT_SIGNATURE_LOOKUP_KEY)
&& mLookupUnknownKey) {
mUnknownSignatureKeyId = returnData
.getLong(ApgService.RESULT_SIGNATURE_KEY_ID);
.getLong(ApgIntentService.RESULT_SIGNATURE_KEY_ID);
lookupUnknownKey(mUnknownSignatureKeyId);
return;
}
@ -822,7 +813,7 @@ public class DecryptActivity extends SherlockFragmentActivity {
switch (mDecryptTarget) {
case Id.target.message:
String decryptedMessage = returnData
.getString(ApgService.RESULT_DECRYPTED_MESSAGE);
.getString(ApgIntentService.RESULT_DECRYPTED_STRING);
mMessage.setText(decryptedMessage);
mMessage.setHorizontallyScrolling(false);
mReplyEnabled = false;
@ -846,9 +837,11 @@ public class DecryptActivity extends SherlockFragmentActivity {
}
if (returnData.getBoolean(ApgService.RESULT_SIGNATURE)) {
String userId = returnData.getString(ApgService.RESULT_SIGNATURE_USER_ID);
mSignatureKeyId = returnData.getLong(ApgService.RESULT_SIGNATURE_KEY_ID);
if (returnData.getBoolean(ApgIntentService.RESULT_SIGNATURE)) {
String userId = returnData
.getString(ApgIntentService.RESULT_SIGNATURE_USER_ID);
mSignatureKeyId = returnData
.getLong(ApgIntentService.RESULT_SIGNATURE_KEY_ID);
mUserIdRest
.setText("id: " + PGPHelper.getSmallFingerPrint(mSignatureKeyId));
if (userId == null) {
@ -861,9 +854,9 @@ public class DecryptActivity extends SherlockFragmentActivity {
}
mUserId.setText(userId);
if (returnData.getBoolean(ApgService.RESULT_SIGNATURE_SUCCESS)) {
if (returnData.getBoolean(ApgIntentService.RESULT_SIGNATURE_SUCCESS)) {
mSignatureStatusImage.setImageResource(R.drawable.overlay_ok);
} else if (returnData.getBoolean(ApgService.RESULT_SIGNATURE_UNKNOWN)) {
} else if (returnData.getBoolean(ApgIntentService.RESULT_SIGNATURE_UNKNOWN)) {
mSignatureStatusImage.setImageResource(R.drawable.overlay_error);
Toast.makeText(DecryptActivity.this,
R.string.unknownSignatureKeyTouchToLookUp, Toast.LENGTH_LONG)
@ -879,7 +872,7 @@ public class DecryptActivity extends SherlockFragmentActivity {
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
intent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog
saveHandler.showProgressDialog(this);

View File

@ -26,8 +26,8 @@ import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.helper.PGPMain;
import org.thialfihar.android.apg.helper.PGPConversionHelper;
import org.thialfihar.android.apg.provider.ProviderHelper;
import org.thialfihar.android.apg.service.ApgServiceHandler;
import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.service.ApgIntentServiceHandler;
import org.thialfihar.android.apg.service.ApgIntentService;
import org.thialfihar.android.apg.ui.dialog.SetPassphraseDialogFragment;
import org.thialfihar.android.apg.ui.widget.KeyEditor;
import org.thialfihar.android.apg.ui.widget.SectionView;
@ -224,32 +224,32 @@ public class EditKeyActivity extends SherlockFragmentActivity {
mBuildLayout = false;
// Send all information needed to service generate keys in other thread
Intent serviceIntent = new Intent(this, ApgService.class);
serviceIntent.putExtra(ApgService.EXTRA_ACTION,
ApgService.ACTION_GENERATE_DEFAULT_RSA_KEYS);
Intent serviceIntent = new Intent(this, ApgIntentService.class);
serviceIntent.putExtra(ApgIntentService.EXTRA_ACTION,
ApgIntentService.ACTION_GENERATE_DEFAULT_RSA_KEYS);
// fill values for this action
Bundle data = new Bundle();
data.putString(ApgService.SYMMETRIC_PASSPHRASE, mCurrentPassPhrase);
data.putString(ApgIntentService.SYMMETRIC_PASSPHRASE, mCurrentPassPhrase);
serviceIntent.putExtra(ApgService.EXTRA_DATA, data);
serviceIntent.putExtra(ApgIntentService.EXTRA_DATA, data);
// Message is received after generating is done in ApgService
ApgServiceHandler saveHandler = new ApgServiceHandler(this,
ApgIntentServiceHandler saveHandler = new ApgIntentServiceHandler(this,
R.string.progress_generating, ProgressDialog.STYLE_SPINNER) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
// get new key from data bundle returned from service
Bundle data = message.getData();
PGPSecretKeyRing masterKeyRing = (PGPSecretKeyRing) PGPConversionHelper
.BytesToPGPKeyRing(data
.getByteArray(ApgService.RESULT_NEW_KEY));
.getByteArray(ApgIntentService.RESULT_NEW_KEY));
PGPSecretKeyRing subKeyRing = (PGPSecretKeyRing) PGPConversionHelper
.BytesToPGPKeyRing(data
.getByteArray(ApgService.RESULT_NEW_KEY2));
.getByteArray(ApgIntentService.RESULT_NEW_KEY2));
// add master key
@SuppressWarnings("unchecked")
@ -271,7 +271,7 @@ public class EditKeyActivity extends SherlockFragmentActivity {
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
serviceIntent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
serviceIntent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
saveHandler.showProgressDialog(this);
@ -412,30 +412,30 @@ public class EditKeyActivity extends SherlockFragmentActivity {
}
// Send all information needed to service to edit key in other thread
Intent intent = new Intent(this, ApgService.class);
Intent intent = new Intent(this, ApgIntentService.class);
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_SAVE_KEYRING);
intent.putExtra(ApgIntentService.EXTRA_ACTION, ApgIntentService.ACTION_SAVE_KEYRING);
// fill values for this action
Bundle data = new Bundle();
data.putString(ApgService.CURRENT_PASSPHRASE, mCurrentPassPhrase);
data.putString(ApgService.NEW_PASSPHRASE, mNewPassPhrase);
data.putStringArrayList(ApgService.USER_IDS, getUserIds(mUserIdsView));
data.putString(ApgIntentService.CURRENT_PASSPHRASE, mCurrentPassPhrase);
data.putString(ApgIntentService.NEW_PASSPHRASE, mNewPassPhrase);
data.putStringArrayList(ApgIntentService.USER_IDS, getUserIds(mUserIdsView));
ArrayList<PGPSecretKey> keys = getKeys(mKeysView);
data.putByteArray(ApgService.KEYS, PGPConversionHelper.PGPSecretKeyListToBytes(keys));
data.putIntegerArrayList(ApgService.KEYS_USAGES, getKeysUsages(mKeysView));
data.putLong(ApgService.MASTER_KEY_ID, getMasterKeyId());
data.putByteArray(ApgIntentService.KEYS, PGPConversionHelper.PGPSecretKeyListToBytes(keys));
data.putIntegerArrayList(ApgIntentService.KEYS_USAGES, getKeysUsages(mKeysView));
data.putLong(ApgIntentService.MASTER_KEY_ID, getMasterKeyId());
intent.putExtra(ApgService.EXTRA_DATA, data);
intent.putExtra(ApgIntentService.EXTRA_DATA, data);
// Message is received after saving is done in ApgService
ApgServiceHandler saveHandler = new ApgServiceHandler(this, R.string.progress_saving,
ApgIntentServiceHandler saveHandler = new ApgIntentServiceHandler(this, R.string.progress_saving,
ProgressDialog.STYLE_HORIZONTAL) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
finish();
}
};
@ -443,7 +443,7 @@ public class EditKeyActivity extends SherlockFragmentActivity {
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
intent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
saveHandler.showProgressDialog(this);

View File

@ -29,8 +29,8 @@ import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.helper.PGPMain;
import org.thialfihar.android.apg.helper.Preferences;
import org.thialfihar.android.apg.provider.ProviderHelper;
import org.thialfihar.android.apg.service.ApgServiceHandler;
import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.service.ApgIntentServiceHandler;
import org.thialfihar.android.apg.service.ApgIntentService;
import org.thialfihar.android.apg.service.PassphraseCacheService;
import org.thialfihar.android.apg.ui.dialog.DeleteFileDialogFragment;
import org.thialfihar.android.apg.ui.dialog.FileDialogFragment;
@ -768,14 +768,13 @@ public class EncryptActivity extends SherlockFragmentActivity {
private void encryptStart() {
// Send all information needed to service to edit key in other thread
Intent intent = new Intent(this, ApgService.class);
Intent intent = new Intent(this, ApgIntentService.class);
// fill values for this action
Bundle data = new Bundle();
boolean useAsciiArmour = true;
boolean useAsciiArmor = true;
long encryptionKeyIds[] = null;
long signatureKeyId = Id.key.none;
int compressionId = 0;
boolean signOnly = false;
@ -786,78 +785,76 @@ public class EncryptActivity extends SherlockFragmentActivity {
passPhrase = null;
}
data.putString(ApgService.SYMMETRIC_PASSPHRASE, passPhrase);
data.putString(ApgIntentService.SYMMETRIC_PASSPHRASE, passPhrase);
} else {
encryptionKeyIds = mEncryptionKeyIds;
signatureKeyId = getSecretKeyId();
signOnly = (mEncryptionKeyIds == null || mEncryptionKeyIds.length == 0);
}
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_ENCRYPT_SIGN);
intent.putExtra(ApgIntentService.EXTRA_ACTION, ApgIntentService.ACTION_ENCRYPT_SIGN);
// choose default settings, target and data bundle by target
if (mContentUri != null) {
data.putInt(ApgService.TARGET, ApgService.TARGET_STREAM);
data.putParcelable(ApgService.PROVIDER_URI, mContentUri);
data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_STREAM);
data.putParcelable(ApgIntentService.PROVIDER_URI, mContentUri);
} else if (mEncryptTarget == Id.target.file) {
useAsciiArmour = mAsciiArmour.isChecked();
useAsciiArmor = mAsciiArmour.isChecked();
compressionId = ((Choice) mFileCompression.getSelectedItem()).getId();
data.putInt(ApgService.TARGET, ApgService.TARGET_FILE);
data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_FILE);
Log.d(Constants.TAG, "mInputFilename=" + mInputFilename + ", mOutputFilename="
+ mOutputFilename);
data.putString(ApgService.INPUT_FILE, mInputFilename);
data.putString(ApgService.OUTPUT_FILE, mOutputFilename);
data.putString(ApgIntentService.INPUT_FILE, mInputFilename);
data.putString(ApgIntentService.OUTPUT_FILE, mOutputFilename);
} else {
useAsciiArmour = true;
useAsciiArmor = true;
compressionId = Preferences.getPreferences(this).getDefaultMessageCompression();
data.putInt(ApgService.TARGET, ApgService.TARGET_BYTES);
data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_BYTES);
if (mData != null) {
data.putByteArray(ApgService.MESSAGE_BYTES, mData);
data.putByteArray(ApgIntentService.MESSAGE_BYTES, mData);
} else {
String message = mMessage.getText().toString();
if (signOnly && !mReturnResult) {
fixBadCharactersForGmail(message);
}
data.putByteArray(ApgService.MESSAGE_BYTES, message.getBytes());
data.putByteArray(ApgIntentService.MESSAGE_BYTES, message.getBytes());
}
}
if (mOverrideAsciiArmour) {
useAsciiArmour = mAsciiArmourDemand;
useAsciiArmor = mAsciiArmourDemand;
}
data.putLong(ApgService.SECRET_KEY_ID, getSecretKeyId());
data.putBoolean(ApgService.USE_ASCII_AMOR, useAsciiArmour);
data.putLongArray(ApgService.ENCRYPTION_KEYS_IDS, encryptionKeyIds);
data.putLong(ApgService.SIGNATURE_KEY_ID, signatureKeyId);
data.putInt(ApgService.COMPRESSION_ID, compressionId);
data.putBoolean(ApgService.GENERATE_SIGNATURE, mGenerateSignature);
data.putBoolean(ApgService.SIGN_ONLY, signOnly);
data.putLong(ApgIntentService.SECRET_KEY_ID, getSecretKeyId());
data.putBoolean(ApgIntentService.USE_ASCII_AMOR, useAsciiArmor);
data.putLongArray(ApgIntentService.ENCRYPTION_KEYS_IDS, encryptionKeyIds);
data.putInt(ApgIntentService.COMPRESSION_ID, compressionId);
data.putBoolean(ApgIntentService.GENERATE_SIGNATURE, mGenerateSignature);
data.putBoolean(ApgIntentService.SIGN_ONLY, signOnly);
intent.putExtra(ApgService.EXTRA_DATA, data);
intent.putExtra(ApgIntentService.EXTRA_DATA, data);
// Message is received after encrypting is done in ApgService
ApgServiceHandler saveHandler = new ApgServiceHandler(this, R.string.progress_encrypting,
ApgIntentServiceHandler saveHandler = new ApgIntentServiceHandler(this, R.string.progress_encrypting,
ProgressDialog.STYLE_HORIZONTAL) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
// get returned data bundle
Bundle data = message.getData();
String output;
switch (mEncryptTarget) {
case Id.target.clipboard:
output = data.getString(ApgService.RESULT_ENCRYPTED_MESSAGE);
output = data.getString(ApgIntentService.RESULT_ENCRYPTED_STRING);
Log.d(Constants.TAG, "output: " + output);
Compatibility.copyToClipboard(EncryptActivity.this, output);
Toast.makeText(EncryptActivity.this,
@ -874,7 +871,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
return;
}
output = data.getString(ApgService.RESULT_ENCRYPTED_MESSAGE);
output = data.getString(ApgIntentService.RESULT_ENCRYPTED_STRING);
Log.d(Constants.TAG, "output: " + output);
Intent emailIntent = new Intent(Intent.ACTION_SEND);
@ -913,7 +910,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
intent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog
saveHandler.showProgressDialog(this);

View File

@ -20,8 +20,8 @@ package org.thialfihar.android.apg.ui;
import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.OtherHelper;
import org.thialfihar.android.apg.service.ApgServiceHandler;
import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.service.ApgIntentServiceHandler;
import org.thialfihar.android.apg.service.ApgIntentService;
import org.thialfihar.android.apg.R;
import android.app.AlertDialog;
@ -157,34 +157,34 @@ public class ImportFromQRCodeActivity extends SherlockFragmentActivity {
if (mScannedContent != null) {
// Send all information needed to service to import key in other thread
Intent intent = new Intent(this, ApgService.class);
Intent intent = new Intent(this, ApgIntentService.class);
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_IMPORT_KEY);
intent.putExtra(ApgIntentService.EXTRA_ACTION, ApgIntentService.ACTION_IMPORT_KEY);
// fill values for this action
Bundle data = new Bundle();
data.putInt(ApgService.IMPORT_KEY_TYPE, Id.type.public_key);
data.putInt(ApgIntentService.IMPORT_KEY_TYPE, Id.type.public_key);
data.putInt(ApgService.TARGET, ApgService.TARGET_BYTES);
data.putByteArray(ApgService.IMPORT_BYTES, mScannedContent.getBytes());
data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_BYTES);
data.putByteArray(ApgIntentService.IMPORT_BYTES, mScannedContent.getBytes());
intent.putExtra(ApgService.EXTRA_DATA, data);
intent.putExtra(ApgIntentService.EXTRA_DATA, data);
// Message is received after importing is done in ApgService
ApgServiceHandler saveHandler = new ApgServiceHandler(this,
ApgIntentServiceHandler saveHandler = new ApgIntentServiceHandler(this,
R.string.progress_importing, ProgressDialog.STYLE_HORIZONTAL) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
// get returned data bundle
Bundle returnData = message.getData();
int added = returnData.getInt(ApgService.RESULT_IMPORT_ADDED);
int updated = returnData.getInt(ApgService.RESULT_IMPORT_UPDATED);
int bad = returnData.getInt(ApgService.RESULT_IMPORT_BAD);
int added = returnData.getInt(ApgIntentService.RESULT_IMPORT_ADDED);
int updated = returnData.getInt(ApgIntentService.RESULT_IMPORT_UPDATED);
int bad = returnData.getInt(ApgIntentService.RESULT_IMPORT_BAD);
String toastMessage;
if (added > 0 && updated > 0) {
toastMessage = getString(R.string.keysAddedAndUpdated, added, updated);
@ -221,7 +221,7 @@ public class ImportFromQRCodeActivity extends SherlockFragmentActivity {
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
intent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog
saveHandler.showProgressDialog(this);

View File

@ -20,8 +20,8 @@ package org.thialfihar.android.apg.ui;
import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.service.ApgServiceHandler;
import org.thialfihar.android.apg.service.ApgIntentService;
import org.thialfihar.android.apg.service.ApgIntentServiceHandler;
import org.thialfihar.android.apg.ui.dialog.DeleteFileDialogFragment;
import org.thialfihar.android.apg.ui.dialog.DeleteKeyDialogFragment;
import org.thialfihar.android.apg.ui.dialog.FileDialogFragment;
@ -302,39 +302,39 @@ public class KeyListActivity extends SherlockFragmentActivity {
Log.d(Constants.TAG, "importKeys started");
// Send all information needed to service to import key in other thread
Intent intent = new Intent(this, ApgService.class);
Intent intent = new Intent(this, ApgIntentService.class);
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_IMPORT_KEY);
intent.putExtra(ApgIntentService.EXTRA_ACTION, ApgIntentService.ACTION_IMPORT_KEY);
// fill values for this action
Bundle data = new Bundle();
data.putInt(ApgService.IMPORT_KEY_TYPE, mKeyType);
data.putInt(ApgIntentService.IMPORT_KEY_TYPE, mKeyType);
if (mImportData != null) {
data.putInt(ApgService.TARGET, ApgService.TARGET_BYTES);
data.putByteArray(ApgService.IMPORT_BYTES, mImportData.getBytes());
data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_BYTES);
data.putByteArray(ApgIntentService.IMPORT_BYTES, mImportData.getBytes());
} else {
data.putInt(ApgService.TARGET, ApgService.TARGET_FILE);
data.putString(ApgService.IMPORT_FILENAME, mImportFilename);
data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_FILE);
data.putString(ApgIntentService.IMPORT_FILENAME, mImportFilename);
}
intent.putExtra(ApgService.EXTRA_DATA, data);
intent.putExtra(ApgIntentService.EXTRA_DATA, data);
// Message is received after importing is done in ApgService
ApgServiceHandler saveHandler = new ApgServiceHandler(this, R.string.progress_importing,
ApgIntentServiceHandler saveHandler = new ApgIntentServiceHandler(this, R.string.progress_importing,
ProgressDialog.STYLE_HORIZONTAL) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
// get returned data bundle
Bundle returnData = message.getData();
int added = returnData.getInt(ApgService.RESULT_IMPORT_ADDED);
int updated = returnData.getInt(ApgService.RESULT_IMPORT_UPDATED);
int bad = returnData.getInt(ApgService.RESULT_IMPORT_BAD);
int added = returnData.getInt(ApgIntentService.RESULT_IMPORT_ADDED);
int updated = returnData.getInt(ApgIntentService.RESULT_IMPORT_UPDATED);
int bad = returnData.getInt(ApgIntentService.RESULT_IMPORT_BAD);
String toastMessage;
if (added > 0 && updated > 0) {
toastMessage = getString(R.string.keysAddedAndUpdated, added, updated);
@ -376,7 +376,7 @@ public class KeyListActivity extends SherlockFragmentActivity {
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
intent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog
saveHandler.showProgressDialog(this);
@ -395,36 +395,36 @@ public class KeyListActivity extends SherlockFragmentActivity {
Log.d(Constants.TAG, "exportKeys started");
// Send all information needed to service to export key in other thread
Intent intent = new Intent(this, ApgService.class);
Intent intent = new Intent(this, ApgIntentService.class);
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_EXPORT_KEY);
intent.putExtra(ApgIntentService.EXTRA_ACTION, ApgIntentService.ACTION_EXPORT_KEY);
// fill values for this action
Bundle data = new Bundle();
data.putString(ApgService.EXPORT_FILENAME, mExportFilename);
data.putInt(ApgService.EXPORT_KEY_TYPE, mKeyType);
data.putString(ApgIntentService.EXPORT_FILENAME, mExportFilename);
data.putInt(ApgIntentService.EXPORT_KEY_TYPE, mKeyType);
if (keyRingId == -1) {
data.putBoolean(ApgService.EXPORT_ALL, true);
data.putBoolean(ApgIntentService.EXPORT_ALL, true);
} else {
data.putLong(ApgService.EXPORT_KEY_RING_ID, keyRingId);
data.putLong(ApgIntentService.EXPORT_KEY_RING_ID, keyRingId);
}
intent.putExtra(ApgService.EXTRA_DATA, data);
intent.putExtra(ApgIntentService.EXTRA_DATA, data);
// Message is received after exporting is done in ApgService
ApgServiceHandler exportHandler = new ApgServiceHandler(this, R.string.progress_exporting,
ApgIntentServiceHandler exportHandler = new ApgIntentServiceHandler(this, R.string.progress_exporting,
ProgressDialog.STYLE_HORIZONTAL) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
// get returned data bundle
Bundle returnData = message.getData();
int exported = returnData.getInt(ApgService.RESULT_EXPORT);
int exported = returnData.getInt(ApgIntentService.RESULT_EXPORT);
String toastMessage;
if (exported == 1) {
toastMessage = getString(R.string.keyExported);
@ -441,7 +441,7 @@ public class KeyListActivity extends SherlockFragmentActivity {
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(exportHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
intent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog
exportHandler.showProgressDialog(this);

View File

@ -90,7 +90,7 @@ public class KeyListPublicFragment extends KeyListFragment implements
switch (item.getItemId()) {
case Id.menu.update:
long updateKeyId = 0;
PGPPublicKeyRing updateKeyRing = ProviderHelper.getPGPPublicKeyRing(mKeyListActivity,
PGPPublicKeyRing updateKeyRing = ProviderHelper.getPGPPublicKeyRingByRowId(mKeyListActivity,
keyRingRowId);
if (updateKeyRing != null) {
updateKeyId = PGPHelper.getMasterKey(updateKeyRing).getKeyID();
@ -119,7 +119,7 @@ public class KeyListPublicFragment extends KeyListFragment implements
case Id.menu.signKey:
long keyId = 0;
PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRing(mKeyListActivity,
PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingByRowId(mKeyListActivity,
keyRingRowId);
if (signKeyRing != null) {
keyId = PGPHelper.getMasterKey(signKeyRing).getKeyID();

View File

@ -25,8 +25,8 @@ import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.helper.Preferences;
import org.thialfihar.android.apg.service.ApgServiceHandler;
import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.service.ApgIntentServiceHandler;
import org.thialfihar.android.apg.service.ApgIntentService;
import org.thialfihar.android.apg.util.Log;
import org.thialfihar.android.apg.util.KeyServer.KeyInfo;
@ -166,42 +166,42 @@ public class KeyServerQueryActivity extends SherlockFragmentActivity {
Log.d(Constants.TAG, "start search with service");
// Send all information needed to service to query keys in other thread
Intent intent = new Intent(this, ApgService.class);
Intent intent = new Intent(this, ApgIntentService.class);
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_QUERY_KEY);
intent.putExtra(ApgIntentService.EXTRA_ACTION, ApgIntentService.ACTION_QUERY_KEY);
// fill values for this action
Bundle data = new Bundle();
String server = (String) mKeyServer.getSelectedItem();
data.putString(ApgService.QUERY_KEY_SERVER, server);
data.putString(ApgIntentService.QUERY_KEY_SERVER, server);
data.putInt(ApgService.QUERY_KEY_TYPE, mQueryType);
data.putInt(ApgIntentService.QUERY_KEY_TYPE, mQueryType);
if (mQueryType == Id.keyserver.search) {
data.putString(ApgService.QUERY_KEY_STRING, mQueryString);
data.putString(ApgIntentService.QUERY_KEY_STRING, mQueryString);
} else if (mQueryType == Id.keyserver.get) {
data.putLong(ApgService.QUERY_KEY_ID, mQueryId);
data.putLong(ApgIntentService.QUERY_KEY_ID, mQueryId);
}
intent.putExtra(ApgService.EXTRA_DATA, data);
intent.putExtra(ApgIntentService.EXTRA_DATA, data);
// Message is received after querying is done in ApgService
ApgServiceHandler saveHandler = new ApgServiceHandler(this, R.string.progress_querying,
ApgIntentServiceHandler saveHandler = new ApgIntentServiceHandler(this, R.string.progress_querying,
ProgressDialog.STYLE_SPINNER) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
// get returned data bundle
Bundle returnData = message.getData();
if (mQueryType == Id.keyserver.search) {
mSearchResult = returnData
.getParcelableArrayList(ApgService.RESULT_QUERY_KEY_SEARCH_RESULT);
.getParcelableArrayList(ApgIntentService.RESULT_QUERY_KEY_SEARCH_RESULT);
} else if (mQueryType == Id.keyserver.get) {
mKeyData = returnData.getString(ApgService.RESULT_QUERY_KEY_KEY_DATA);
mKeyData = returnData.getString(ApgIntentService.RESULT_QUERY_KEY_KEY_DATA);
}
// TODO: IMPROVE CODE!!! some global variables can be avoided!!!
@ -240,7 +240,7 @@ public class KeyServerQueryActivity extends SherlockFragmentActivity {
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
intent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog
saveHandler.showProgressDialog(this);

View File

@ -20,8 +20,8 @@ package org.thialfihar.android.apg.ui;
import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.helper.Preferences;
import org.thialfihar.android.apg.service.ApgServiceHandler;
import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.service.ApgIntentServiceHandler;
import org.thialfihar.android.apg.service.ApgIntentService;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.MenuItem;
@ -102,29 +102,29 @@ public class KeyServerUploadActivity extends SherlockFragmentActivity {
private void uploadKey() {
// Send all information needed to service to upload key in other thread
Intent intent = new Intent(this, ApgService.class);
Intent intent = new Intent(this, ApgIntentService.class);
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_UPLOAD_KEY);
intent.putExtra(ApgIntentService.EXTRA_ACTION, ApgIntentService.ACTION_UPLOAD_KEY);
// fill values for this action
Bundle data = new Bundle();
int keyRingId = getIntent().getIntExtra(EXTRA_KEYRING_ROW_ID, -1);
data.putInt(ApgService.UPLOAD_KEY_KEYRING_ROW_ID, keyRingId);
data.putInt(ApgIntentService.UPLOAD_KEY_KEYRING_ROW_ID, keyRingId);
String server = (String) keyServer.getSelectedItem();
data.putString(ApgService.UPLOAD_KEY_SERVER, server);
data.putString(ApgIntentService.UPLOAD_KEY_SERVER, server);
intent.putExtra(ApgService.EXTRA_DATA, data);
intent.putExtra(ApgIntentService.EXTRA_DATA, data);
// Message is received after uploading is done in ApgService
ApgServiceHandler saveHandler = new ApgServiceHandler(this, R.string.progress_exporting,
ApgIntentServiceHandler saveHandler = new ApgIntentServiceHandler(this, R.string.progress_exporting,
ProgressDialog.STYLE_HORIZONTAL) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
Toast.makeText(KeyServerUploadActivity.this, R.string.keySendSuccess,
Toast.LENGTH_SHORT).show();
@ -135,7 +135,7 @@ public class KeyServerUploadActivity extends SherlockFragmentActivity {
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
intent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog
saveHandler.showProgressDialog(this);

View File

@ -26,8 +26,8 @@ import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.helper.PGPMain;
import org.thialfihar.android.apg.helper.Preferences;
import org.thialfihar.android.apg.provider.ProviderHelper;
import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.service.ApgServiceHandler;
import org.thialfihar.android.apg.service.ApgIntentService;
import org.thialfihar.android.apg.service.ApgIntentServiceHandler;
import org.thialfihar.android.apg.service.PassphraseCacheService;
import org.thialfihar.android.apg.ui.dialog.PassphraseDialogFragment;
@ -196,26 +196,26 @@ public class SignKeyActivity extends SherlockFragmentActivity {
*/
private void startSigning() {
// Send all information needed to service to sign key in other thread
Intent intent = new Intent(this, ApgService.class);
Intent intent = new Intent(this, ApgIntentService.class);
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_SIGN_KEY);
intent.putExtra(ApgIntentService.EXTRA_ACTION, ApgIntentService.ACTION_SIGN_KEY);
// fill values for this action
Bundle data = new Bundle();
data.putLong(ApgService.SIGN_KEY_MASTER_KEY_ID, mMasterKeyId);
data.putLong(ApgService.SIGN_KEY_PUB_KEY_ID, mPubKeyId);
data.putLong(ApgIntentService.SIGN_KEY_MASTER_KEY_ID, mMasterKeyId);
data.putLong(ApgIntentService.SIGN_KEY_PUB_KEY_ID, mPubKeyId);
intent.putExtra(ApgService.EXTRA_DATA, data);
intent.putExtra(ApgIntentService.EXTRA_DATA, data);
// Message is received after signing is done in ApgService
ApgServiceHandler saveHandler = new ApgServiceHandler(this, R.string.progress_signing,
ApgIntentServiceHandler saveHandler = new ApgIntentServiceHandler(this, R.string.progress_signing,
ProgressDialog.STYLE_SPINNER) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
Toast.makeText(SignKeyActivity.this, R.string.keySignSuccess,
Toast.LENGTH_SHORT).show();
@ -236,7 +236,7 @@ public class SignKeyActivity extends SherlockFragmentActivity {
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
intent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog
saveHandler.showProgressDialog(this);
@ -247,29 +247,29 @@ public class SignKeyActivity extends SherlockFragmentActivity {
private void uploadKey() {
// Send all information needed to service to upload key in other thread
Intent intent = new Intent(this, ApgService.class);
Intent intent = new Intent(this, ApgIntentService.class);
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_UPLOAD_KEY);
intent.putExtra(ApgIntentService.EXTRA_ACTION, ApgIntentService.ACTION_UPLOAD_KEY);
// fill values for this action
Bundle data = new Bundle();
data.putLong(ApgService.UPLOAD_KEY_KEYRING_ROW_ID, mPubKeyId);
data.putLong(ApgIntentService.UPLOAD_KEY_KEYRING_ROW_ID, mPubKeyId);
Spinner keyServer = (Spinner) findViewById(R.id.keyServer);
String server = (String) keyServer.getSelectedItem();
data.putString(ApgService.UPLOAD_KEY_SERVER, server);
data.putString(ApgIntentService.UPLOAD_KEY_SERVER, server);
intent.putExtra(ApgService.EXTRA_DATA, data);
intent.putExtra(ApgIntentService.EXTRA_DATA, data);
// Message is received after uploading is done in ApgService
ApgServiceHandler saveHandler = new ApgServiceHandler(this, R.string.progress_exporting,
ApgIntentServiceHandler saveHandler = new ApgIntentServiceHandler(this, R.string.progress_exporting,
ProgressDialog.STYLE_HORIZONTAL) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
Toast.makeText(SignKeyActivity.this, R.string.keySendSuccess,
Toast.LENGTH_SHORT).show();
@ -281,7 +281,7 @@ public class SignKeyActivity extends SherlockFragmentActivity {
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
intent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog
saveHandler.showProgressDialog(this);

View File

@ -17,8 +17,8 @@
package org.thialfihar.android.apg.ui.dialog;
import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.service.ApgServiceHandler;
import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.service.ApgIntentServiceHandler;
import org.thialfihar.android.apg.service.ApgIntentService;
import android.app.AlertDialog;
import android.app.Dialog;
@ -70,25 +70,25 @@ public class DeleteFileDialogFragment extends DialogFragment {
dismiss();
// Send all information needed to service to edit key in other thread
Intent intent = new Intent(activity, ApgService.class);
Intent intent = new Intent(activity, ApgIntentService.class);
// fill values for this action
Bundle data = new Bundle();
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_DELETE_FILE_SECURELY);
data.putString(ApgService.DELETE_FILE, deleteFile);
intent.putExtra(ApgService.EXTRA_DATA, data);
intent.putExtra(ApgIntentService.EXTRA_ACTION, ApgIntentService.ACTION_DELETE_FILE_SECURELY);
data.putString(ApgIntentService.DELETE_FILE, deleteFile);
intent.putExtra(ApgIntentService.EXTRA_DATA, data);
ProgressDialogFragment deletingDialog = ProgressDialogFragment.newInstance(
R.string.progress_deletingSecurely, ProgressDialog.STYLE_HORIZONTAL);
// Message is received after deleting is done in ApgService
ApgServiceHandler saveHandler = new ApgServiceHandler(activity, deletingDialog) {
ApgIntentServiceHandler saveHandler = new ApgIntentServiceHandler(activity, deletingDialog) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
Toast.makeText(activity, R.string.fileDeleteSuccessful,
Toast.LENGTH_SHORT).show();
}
@ -97,7 +97,7 @@ public class DeleteFileDialogFragment extends DialogFragment {
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
intent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog
deletingDialog.show(activity.getSupportFragmentManager(), "deletingDialog");

View File

@ -76,11 +76,11 @@ public class DeleteKeyDialogFragment extends DialogFragment {
String userId = activity.getString(R.string.unknownUserId);
if (keyType == Id.type.public_key) {
PGPPublicKeyRing keyRing = ProviderHelper.getPGPPublicKeyRing(activity,
PGPPublicKeyRing keyRing = ProviderHelper.getPGPPublicKeyRingByRowId(activity,
deleteKeyRingRowId);
userId = PGPHelper.getMainUserIdSafe(activity, PGPHelper.getMasterKey(keyRing));
} else {
PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRing(activity,
PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRingByRowId(activity,
deleteKeyRingRowId);
userId = PGPHelper.getMainUserIdSafe(activity, PGPHelper.getMasterKey(keyRing));
}

View File

@ -104,9 +104,8 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor
private static boolean hasPassphrase(Context context, long secretKeyId) {
// check if the key has no passphrase
try {
// TODO: by master key id???
PGPSecretKey secretKey = PGPHelper.getMasterKey(ProviderHelper
.getPGPSecretKeyRingByMasterKeyId(context, secretKeyId));
.getPGPSecretKeyRingByKeyId(context, secretKeyId));
// PGPSecretKey secretKey =
// PGPHelper.getMasterKey(PGPMain.getSecretKeyRing(secretKeyId));

View File

@ -20,8 +20,8 @@ import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.PGPConversionHelper;
import org.thialfihar.android.apg.service.ApgServiceHandler;
import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.service.ApgIntentServiceHandler;
import org.thialfihar.android.apg.service.ApgIntentService;
import org.thialfihar.android.apg.service.PassphraseCacheService;
import org.thialfihar.android.apg.ui.dialog.ProgressDialogFragment;
import org.thialfihar.android.apg.ui.widget.Editor.EditorListener;
@ -249,9 +249,9 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor
private void createKey() {
// Send all information needed to service to edit key in other thread
Intent intent = new Intent(mActivity, ApgService.class);
Intent intent = new Intent(mActivity, ApgIntentService.class);
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_GENERATE_KEY);
intent.putExtra(ApgIntentService.EXTRA_ACTION, ApgIntentService.ACTION_GENERATE_KEY);
// fill values for this action
Bundle data = new Bundle();
@ -262,32 +262,32 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor
passPhrase = PassphraseCacheService
.getCachedPassphrase(mActivity, masterKey.getKeyID());
data.putByteArray(ApgService.MASTER_KEY,
data.putByteArray(ApgIntentService.MASTER_KEY,
PGPConversionHelper.PGPSecretKeyToBytes(masterKey));
} else {
passPhrase = "";
}
data.putString(ApgService.SYMMETRIC_PASSPHRASE, passPhrase);
data.putInt(ApgService.ALGORITHM, mNewKeyAlgorithmChoice.getId());
data.putInt(ApgService.KEY_SIZE, mNewKeySize);
data.putString(ApgIntentService.SYMMETRIC_PASSPHRASE, passPhrase);
data.putInt(ApgIntentService.ALGORITHM, mNewKeyAlgorithmChoice.getId());
data.putInt(ApgIntentService.KEY_SIZE, mNewKeySize);
intent.putExtra(ApgService.EXTRA_DATA, data);
intent.putExtra(ApgIntentService.EXTRA_DATA, data);
// show progress dialog
mGeneratingDialog = ProgressDialogFragment.newInstance(R.string.progress_generating,
ProgressDialog.STYLE_SPINNER);
// Message is received after generating is done in ApgService
ApgServiceHandler saveHandler = new ApgServiceHandler(mActivity, mGeneratingDialog) {
ApgIntentServiceHandler saveHandler = new ApgIntentServiceHandler(mActivity, mGeneratingDialog) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) {
// get new key from data bundle returned from service
Bundle data = message.getData();
PGPSecretKeyRing newKeyRing = (PGPSecretKeyRing) PGPConversionHelper
.BytesToPGPKeyRing(data.getByteArray(ApgService.RESULT_NEW_KEY));
.BytesToPGPKeyRing(data.getByteArray(ApgIntentService.RESULT_NEW_KEY));
boolean isMasterKey = (mEditors.getChildCount() == 0);
@ -317,7 +317,7 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
intent.putExtra(ApgIntentService.EXTRA_MESSENGER, messenger);
mGeneratingDialog.show(mActivity.getSupportFragmentManager(), "dialog");

View File

@ -27,6 +27,10 @@
android:name=".IntentDemoActivity"
android:label="Intent Demo 1"
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".AidlDemoActivity"
android:label="Aidl Demo"
android:windowSoftInputMode="stateHidden" />
</application>
</manifest>

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/aidl_demo_create_new_key"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="createNewKeyOnClick"
android:text="Create new key" />
<Button
android:id="@+id/aidl_demo_select_secret_key"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="selectSecretKeyOnClick"
android:text="Select secret key" />
<Button
android:id="@+id/aidl_demo_select_encryption_key"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="selectEncryptionKeysOnClick"
android:text="Select encryption key(s)" />
<EditText
android:id="@+id/aidl_demo_message"
android:layout_width="match_parent"
android:layout_height="150dip"
android:text="message"
android:textAppearance="@android:style/TextAppearance.Small" />
<EditText
android:id="@+id/aidl_demo_ciphertext"
android:layout_width="match_parent"
android:layout_height="150dip"
android:text="ciphertext"
android:textAppearance="@android:style/TextAppearance.Small" />
<Button
android:id="@+id/aidl_demo_encrypt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="encryptOnClick"
android:text="Encrypt" />
<Button
android:id="@+id/aidl_demo_decrypt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="decryptOnClick"
android:text="Decrypt" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="APG Data:" />
<TextView
android:id="@+id/aidl_demo_data"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minLines="10" />
</LinearLayout>
</ScrollView>

View File

@ -12,21 +12,21 @@
android:id="@+id/intent_demo_create_new_key"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="intentDemoCreateNewKeyOnClick"
android:onClick="createNewKeyOnClick"
android:text="Create new key" />
<Button
android:id="@+id/intent_demo_select_secret_key"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="intentDemoSelectSecretKeyOnClick"
android:onClick="selectSecretKeyOnClick"
android:text="Select secret key" />
<Button
android:id="@+id/intent_demo_select_encryption_key"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="intentDemoSelectEncryptionKeysOnClick"
android:onClick="selectEncryptionKeysOnClick"
android:text="Select encryption key(s)" />
<EditText
@ -47,14 +47,14 @@
android:id="@+id/intent_demo_encrypt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="intentDemoEncryptOnClick"
android:onClick="encryptOnClick"
android:text="Encrypt" />
<Button
android:id="@+id/intent_demo_decrypt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="intentDemoDecryptOnClick"
android:onClick="decryptOnClick"
android:text="Decrypt" />
<TextView

View File

@ -0,0 +1,185 @@
package org.thialfihar.android.apg.demo;
import org.thialfihar.android.apg.integration.ApgData;
import org.thialfihar.android.apg.integration.ApgIntentHelper;
import org.thialfihar.android.apg.service.IApgEncryptDecryptHandler;
import org.thialfihar.android.apg.service.IApgHelperHandler;
import org.thialfihar.android.apg.service.IApgService;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class AidlDemoActivity extends Activity {
Activity mActivity;
TextView mMessageTextView;
TextView mCiphertextTextView;
TextView mDataTextView;
ApgIntentHelper mApgIntentHelper;
ApgData mApgData;
private IApgService service = null;
private ServiceConnection svcConn = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
service = IApgService.Stub.asInterface(binder);
}
public void onServiceDisconnected(ComponentName className) {
service = null;
}
};
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.aidl_demo);
mActivity = this;
mMessageTextView = (TextView) findViewById(R.id.aidl_demo_message);
mCiphertextTextView = (TextView) findViewById(R.id.aidl_demo_ciphertext);
mDataTextView = (TextView) findViewById(R.id.aidl_demo_data);
mApgIntentHelper = new ApgIntentHelper(mActivity);
mApgData = new ApgData();
bindService(new Intent("org.thialfihar.android.apg.service.IApgService"), svcConn,
Context.BIND_AUTO_CREATE);
}
public void encryptOnClick(View view) {
byte[] inputBytes = mMessageTextView.getText().toString().getBytes();
try {
service.encryptAsymmetric(inputBytes, null, true, 0, mApgData.getEncryptionKeys(), 7,
encryptDecryptHandler);
} catch (RemoteException e) {
exceptionImplementation(-1, e.toString());
}
}
public void decryptOnClick(View view) {
byte[] inputBytes = mCiphertextTextView.getText().toString().getBytes();
try {
service.decryptAndVerifyAsymmetric(inputBytes, null, null, encryptDecryptHandler);
} catch (RemoteException e) {
exceptionImplementation(-1, e.toString());
}
}
private void updateView() {
if (mApgData.getDecryptedData() != null) {
mMessageTextView.setText(mApgData.getDecryptedData());
}
if (mApgData.getEncryptedData() != null) {
mCiphertextTextView.setText(mApgData.getEncryptedData());
}
mDataTextView.setText(mApgData.toString());
}
@Override
public void onDestroy() {
super.onDestroy();
unbindService(svcConn);
}
private void exceptionImplementation(int exceptionId, String error) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Exception!").setMessage(error).setPositiveButton("OK", null).show();
}
private final IApgEncryptDecryptHandler.Stub encryptDecryptHandler = new IApgEncryptDecryptHandler.Stub() {
@Override
public void onException(final int exceptionId, final String message) throws RemoteException {
runOnUiThread(new Runnable() {
public void run() {
exceptionImplementation(exceptionId, message);
}
});
}
@Override
public void onSuccessEncrypt(final byte[] outputBytes, String outputUri)
throws RemoteException {
runOnUiThread(new Runnable() {
public void run() {
mApgData.setEncryptedData(new String(outputBytes));
updateView();
}
});
}
@Override
public void onSuccessDecrypt(final byte[] outputBytes, String outputUri, boolean signature,
long signatureKeyId, String signatureUserId, boolean signatureSuccess,
boolean signatureUnknown) throws RemoteException {
runOnUiThread(new Runnable() {
public void run() {
mApgData.setDecryptedData(new String(outputBytes));
updateView();
}
});
}
};
private final IApgHelperHandler.Stub helperHandler = new IApgHelperHandler.Stub() {
@Override
public void onException(final int exceptionId, final String message) throws RemoteException {
runOnUiThread(new Runnable() {
public void run() {
exceptionImplementation(exceptionId, message);
}
});
}
@Override
public void onSuccessGetDecryptionKey(long arg0, boolean arg1) throws RemoteException {
// TODO Auto-generated method stub
}
};
/**
* Selection is done with Intents, not AIDL!
*
* @param view
*/
public void selectSecretKeyOnClick(View view) {
mApgIntentHelper.selectSecretKey();
}
public void selectEncryptionKeysOnClick(View view) {
mApgIntentHelper.selectEncryptionKeys("user@example.com");
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// this updates the mApgData object to the result of the methods
boolean result = mApgIntentHelper.onActivityResult(requestCode, resultCode, data, mApgData);
if (result) {
updateView();
}
// continue with other activity results
super.onActivityResult(requestCode, resultCode, data);
}
}

View File

@ -24,7 +24,6 @@ import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.widget.Toast;
public class BaseActivity extends PreferenceActivity {
private Activity mActivity;
@ -60,7 +59,7 @@ public class BaseActivity extends PreferenceActivity {
mAidlDemo.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(mActivity, "Currently not implemented!", Toast.LENGTH_LONG).show();
startActivity(new Intent(mActivity, AidlDemoActivity.class));
return false;
}

View File

@ -28,11 +28,12 @@ import android.widget.TextView;
public class IntentDemoActivity extends Activity {
Activity mActivity;
ApgIntentHelper mApgIntentHelper;
TextView mMessageTextView;
TextView mCiphertextTextView;
TextView mDataTextView;
ApgIntentHelper mApgIntentHelper;
ApgData mApgData;
/**
@ -45,34 +46,34 @@ public class IntentDemoActivity extends Activity {
setContentView(R.layout.intent_demo);
mActivity = this;
mApgIntentHelper = new ApgIntentHelper(mActivity);
mMessageTextView = (TextView) findViewById(R.id.intent_demo_message);
mCiphertextTextView = (TextView) findViewById(R.id.intent_demo_ciphertext);
mDataTextView = (TextView) findViewById(R.id.intent_demo_data);
mApgIntentHelper = new ApgIntentHelper(mActivity);
mApgData = new ApgData();
}
public void intentDemoCreateNewKeyOnClick(View view) {
public void createNewKeyOnClick(View view) {
// mApgIntentHelper.createNewKey();
mApgIntentHelper.createNewKey("test <+491711111111@cryptocall.org>", true, true);
mApgIntentHelper.createNewKey("test <user@example.com>", true, true);
}
public void intentDemoSelectSecretKeyOnClick(View view) {
public void selectSecretKeyOnClick(View view) {
mApgIntentHelper.selectSecretKey();
}
public void intentDemoSelectEncryptionKeysOnClick(View view) {
mApgIntentHelper.selectEncryptionKeys("usera@example.com");
public void selectEncryptionKeysOnClick(View view) {
mApgIntentHelper.selectEncryptionKeys("user@example.com");
}
public void intentDemoEncryptOnClick(View view) {
public void encryptOnClick(View view) {
mApgIntentHelper.encrypt(mMessageTextView.getText().toString(),
mApgData.getEncryptionKeys(), mApgData.getSignatureKeyId());
}
public void intentDemoDecryptOnClick(View view) {
public void decryptOnClick(View view) {
mApgIntentHelper.decrypt(mCiphertextTextView.getText().toString());
}

View File

@ -184,7 +184,7 @@ public class ApgIntentHelper {
apgData.setEncryptionKeys(null);
break;
}
apgData.setEncryptionKeys(data.getLongArrayExtra(Constants.EXTRA_SELECTION));
apgData.setEncryptionKeys(data.getLongArrayExtra(Constants.RESULT_EXTRA_MASTER_KEY_IDS));
break;
case Constants.ENCRYPT_MESSAGE:

View File

@ -70,6 +70,10 @@ public class Constants {
public static final String EXTRA_NO_PASSPHRASE = "noPassphrase";
public static final String EXTRA_GENERATE_DEFAULT_KEYS = "generateDefaultKeys";
public static final String EXTRA_INTENT_VERSION = "intentVersion";
public static final String RESULT_EXTRA_MASTER_KEY_IDS = "masterKeyIds";
public static final String RESULT_EXTRA_USER_IDS = "userIds";
public static final String INTENT_VERSION = "1";
@ -79,13 +83,4 @@ public class Constants {
public static final int SELECT_SECRET_KEY = 0x21070004;
public static final int CREATE_KEY = 0x21070005;
public static final int EDIT_KEY = 0x21070006;
// public static Pattern PGP_MESSAGE = Pattern.compile(
// ".*?(-----BEGIN PGP MESSAGE-----.*?-----END PGP MESSAGE-----).*", Pattern.DOTALL);
// public static Pattern PGP_SIGNED_MESSAGE = Pattern
// .compile(
// ".*?(-----BEGIN PGP SIGNED MESSAGE-----.*?-----BEGIN PGP SIGNATURE-----.*?-----END PGP SIGNATURE-----).*",
// Pattern.DOTALL);
}

View File

@ -0,0 +1,16 @@
package org.thialfihar.android.apg.service;
interface IApgEncryptDecryptHandler {
/**
* Either output or streamUri is given. One of them is null
*
*/
oneway void onSuccessEncrypt(in byte[] outputBytes, in String outputUri);
oneway void onSuccessDecrypt(in byte[] outputBytes, in String outputUri, in boolean signature,
in long signatureKeyId, in String signatureUserId, in boolean signatureSuccess,
in boolean signatureUnknown);
oneway void onException(in int exceptionNumber, in String message);
}

View File

@ -0,0 +1,9 @@
package org.thialfihar.android.apg.service;
interface IApgHelperHandler {
oneway void onSuccessGetDecryptionKey(in long secretKeyId, in boolean symmetric);
oneway void onException(in int exceptionNumber, in String message);
}

View File

@ -0,0 +1,130 @@
package org.thialfihar.android.apg.service;
import org.thialfihar.android.apg.service.IApgEncryptDecryptHandler;
import org.thialfihar.android.apg.service.IApgSignVerifyHandler;
import org.thialfihar.android.apg.service.IApgHelperHandler;
/**
* All methods are oneway, which means they are asynchronous and non-blocking.
* Results are returned into given Handler, which has to be implemented on client side.
*/
interface IApgService {
/**
* Encrypt
*
* Either inputBytes or inputUri is given, the other should be null.
*
* @param inputBytes
* Byte array you want to encrypt
* @param inputUri
* Blob in ContentProvider you want to encrypt
* @param useAsciiArmor
* Convert bytes to ascii armored text to guard against encoding problems
* @param compression
* Compression: 0x21070001: none, 1: Zip, 2: Zlib, 3: BZip2
* @param encryptionKeyIds
* Ids of public keys used for encryption
* @param symmetricEncryptionAlgorithm
* 7: AES-128, 8: AES-192, 9: AES-256, 4: Blowfish, 10: Twofish, 3: CAST5,
* 6: DES, 2: Triple DES, 1: IDEA
* @param handler
* Results are returned to this IApgEncryptDecryptHandler Handler
* to onSuccessEncrypt(in byte[] output), after successful encryption
*/
oneway void encryptAsymmetric(in byte[] inputBytes, in String inputUri, in boolean useAsciiArmor,
in int compression, in long[] encryptionKeyIds, in int symmetricEncryptionAlgorithm,
in IApgEncryptDecryptHandler handler);
/**
* Same as encryptAsymmetric but using a passphrase for symmetric encryption
*
* @param encryptionPassphrase
* Passphrase for direct symmetric encryption using symmetricEncryptionAlgorithm
*/
oneway void encryptSymmetric(in byte[] inputBytes, in String inputUri, in boolean useAsciiArmor,
in int compression, in String encryptionPassphrase, in int symmetricEncryptionAlgorithm,
in IApgEncryptDecryptHandler handler);
/**
* Encrypt and sign
*
* Either inputBytes or inputUri is given, the other should be null.
*
* @param inputBytes
* Byte array you want to encrypt
* @param inputUri
* Blob in ContentProvider you want to encrypt
* @param useAsciiArmor
* Convert bytes to ascii armored text to guard against encoding problems
* @param compression
* Compression: 0x21070001: none, 1: Zip, 2: Zlib, 3: BZip2
* @param encryptionKeyIds
* Ids of public keys used for encryption
* @param symmetricEncryptionAlgorithm
* 7: AES-128, 8: AES-192, 9: AES-256, 4: Blowfish, 10: Twofish, 3: CAST5,
* 6: DES, 2: Triple DES, 1: IDEA
* @param signatureKeyId
* Key id of key to sign with
* @param signatureHashAlgorithm
* 1: MD5, 3: RIPEMD-160, 2: SHA-1, 11: SHA-224, 8: SHA-256, 9: SHA-384,
* 10: SHA-512
* @param signatureForceV3
* Force V3 signatures
* @param signaturePassphrase
* Passphrase to unlock signature key
* @param handler
* Results are returned to this IApgEncryptDecryptHandler Handler
* to onSuccessEncrypt(in byte[] output), after successful encryption and signing
*/
oneway void encryptAndSignAsymmetric(in byte[] inputBytes, in String inputUri,
in boolean useAsciiArmor, in int compression, in long[] encryptionKeyIds,
in int symmetricEncryptionAlgorithm, in long signatureKeyId, in int signatureHashAlgorithm,
in boolean signatureForceV3, in String signaturePassphrase,
in IApgEncryptDecryptHandler handler);
/**
* Same as encryptAndSignAsymmetric but using a passphrase for symmetric encryption
*
* @param encryptionPassphrase
* Passphrase for direct symmetric encryption using symmetricEncryptionAlgorithm
*/
oneway void encryptAndSignSymmetric(in byte[] inputBytes, in String inputUri,
in boolean useAsciiArmor, in int compression, in String encryptionPassphrase,
in int symmetricEncryptionAlgorithm, in long signatureKeyId, in int signatureHashAlgorithm,
in boolean signatureForceV3, in String signaturePassphrase,
in IApgEncryptDecryptHandler handler);
/**
* 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 inputUri
* Blob in ContentProvider you want to decrypt and verify
* @param keyPassphrase
* Passphrase to unlock secret key for decryption.
* @param handler
* Handler where to return results to after successful encryption
*/
oneway void decryptAndVerifyAsymmetric(in byte[] inputBytes, in String inputUri,
in String keyPassphrase, in IApgEncryptDecryptHandler handler);
/**
* Same as decryptAndVerifyAsymmetric but for symmetric decryption.
*
* @param encryptionPassphrase
* Passphrase to decrypt
*/
oneway void decryptAndVerifySymmetric(in byte[] inputBytes, in String inputUri,
in String encryptionPassphrase, in IApgEncryptDecryptHandler handler);
/**
*
*/
oneway void getDecryptionKey(in byte[] inputBytes, in String inputUri,
in IApgHelperHandler handler);
}

View File

@ -0,0 +1,11 @@
package org.thialfihar.android.apg.service;
interface IApgSignVerifyHandler {
oneway void onSuccessSign(in byte[] outputBytes, in String outputUri);
oneway void onSuccessVerify(in boolean signature, in long signatureKeyId,
in String signatureUserId, in boolean signatureSuccess, in boolean signatureUnknown);
oneway void onException(in int exceptionNumber, in String message);
}