Fixes for decrypt and sign

This commit is contained in:
Dominik Schürmann 2013-09-09 22:38:09 +02:00
parent 1421046c6d
commit 94a81dd8ae
5 changed files with 101 additions and 43 deletions

View file

@ -74,12 +74,12 @@
android:text="Encrypt and Sign" />
<Button
android:id="@+id/crypto_provider_demo_decrypt"
android:id="@+id/crypto_provider_demo_decrypt_and_verify"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="decryptAndVerifyOnClick"
android:text="Decrypt" />
android:text="Decrypt and Verify" />
</LinearLayout>
</LinearLayout>

View file

@ -73,4 +73,14 @@ public class CryptoSignatureResult implements Parcelable {
return new CryptoSignatureResult[size];
}
};
@Override
public String toString() {
String out = new String();
out += "signature: " + signature;
out += "\nsignatureSuccess: " + signatureSuccess;
out += "\nsignatureUnknown: " + signatureUnknown;
return out;
}
}

View file

@ -102,8 +102,10 @@ public class CryptoProviderDemoActivity extends Activity {
@Override
public void run() {
mMessage.setText(new String(outputBytes) + "\n\n" + signatureResult.toString());
mMessage.setText(new String(outputBytes));
Toast.makeText(CryptoProviderDemoActivity.this,
"signature result:\n" + signatureResult.toString(), Toast.LENGTH_LONG)
.show();
}
});

View file

@ -73,4 +73,14 @@ public class CryptoSignatureResult implements Parcelable {
return new CryptoSignatureResult[size];
}
};
@Override
public String toString() {
String out = new String();
out += "signature: " + signature;
out += "\nsignatureSuccess: " + signatureSuccess;
out += "\nsignatureUnknown: " + signatureUnknown;
return out;
}
}

View file

@ -351,21 +351,38 @@ public class CryptoService extends Service {
private synchronized void decryptAndVerifySafe(byte[] inputBytes, ICryptoCallback callback,
AppSettings appSettings) throws RemoteException {
try {
// build InputData and write into OutputStream
InputStream inputStream = new ByteArrayInputStream(inputBytes);
long inputLength = inputBytes.length;
InputData inputData = new InputData(inputStream, inputLength);
OutputStream outputStream = new ByteArrayOutputStream();
// TODO: this is not really needed
// checked if it is text with BEGIN and END tags
String message = new String(inputBytes);
Log.d(Constants.TAG, "in: " + message);
// checked if signed only
boolean signedOnly = false;
Matcher matcher = PgpMain.PGP_SIGNED_MESSAGE.matcher(message);
Matcher matcher = PgpMain.PGP_MESSAGE.matcher(message);
if (matcher.matches()) {
signedOnly = true;
Log.d(Constants.TAG, "PGP_MESSAGE matched");
message = matcher.group(1);
// replace non breakable spaces
message = message.replaceAll("\\xa0", " ");
// overwrite inputBytes
inputBytes = message.getBytes();
} else {
matcher = PgpMain.PGP_SIGNED_MESSAGE.matcher(message);
if (matcher.matches()) {
signedOnly = true;
Log.d(Constants.TAG, "PGP_SIGNED_MESSAGE matched");
message = matcher.group(1);
// replace non breakable spaces
message = message.replaceAll("\\xa0", " ");
// overwrite inputBytes
inputBytes = message.getBytes();
} else {
Log.d(Constants.TAG, "Nothing matched! Binary?");
}
}
// END TODO
Log.d(Constants.TAG, "in: " + new String(inputBytes));
// TODO: This allows to decrypt messages with ALL secret keys, not only the one for the
// app, Fix this?
@ -374,40 +391,59 @@ public class CryptoService extends Service {
// throw new PgpMain.PgpGeneralException(getString(R.string.error_noSecretKeyFound));
// }
// TODO: duplicates functions from DecryptActivity!
String passphrase = null;
boolean assumeSymmetricEncryption = false;
long secretKeyId;
try {
if (inputStream.markSupported()) {
inputStream.mark(200); // should probably set this to the max size of two pgpF
// objects, if it even needs to be anything other than 0.
if (!signedOnly) {
// BEGIN Get key
// TODO: this input stream is consumed after PgpMain.getDecryptionKeyId()... do it
// better!
InputStream inputStream2 = new ByteArrayInputStream(inputBytes);
// TODO: duplicates functions from DecryptActivity!
// TODO: we need activity to input symmetric passphrase
long secretKeyId;
try {
if (inputStream2.markSupported()) {
inputStream2.mark(200); // should probably set this to the max size of two
// pgpF
// objects, if it even needs to be anything other
// than
// 0.
}
secretKeyId = PgpMain.getDecryptionKeyId(this, inputStream2);
if (secretKeyId == Id.key.none) {
throw new PgpMain.PgpGeneralException(
getString(R.string.error_noSecretKeyFound));
}
assumeSymmetricEncryption = false;
} catch (PgpMain.NoAsymmetricEncryptionException e) {
if (inputStream2.markSupported()) {
inputStream2.reset();
}
secretKeyId = Id.key.symmetric;
if (!PgpMain.hasSymmetricEncryption(this, inputStream2)) {
throw new PgpMain.PgpGeneralException(
getString(R.string.error_noKnownEncryptionFound));
}
assumeSymmetricEncryption = true;
}
secretKeyId = PgpMain.getDecryptionKeyId(this, inputStream);
if (secretKeyId == Id.key.none) {
throw new PgpMain.PgpGeneralException(
getString(R.string.error_noSecretKeyFound));
Log.d(Constants.TAG, "secretKeyId " + secretKeyId);
passphrase = getCachedPassphrase(secretKeyId);
if (passphrase == null) {
callback.onError(new CryptoError(CryptoError.ID_NO_OR_WRONG_PASSPHRASE,
"No or wrong passphrase!"));
return;
}
assumeSymmetricEncryption = false;
} catch (PgpMain.NoAsymmetricEncryptionException e) {
if (inputStream.markSupported()) {
inputStream.reset();
}
secretKeyId = Id.key.symmetric;
if (!PgpMain.hasSymmetricEncryption(this, inputStream)) {
throw new PgpMain.PgpGeneralException(
getString(R.string.error_noKnownEncryptionFound));
}
assumeSymmetricEncryption = true;
}
Log.d(Constants.TAG, "secretKeyId " + secretKeyId);
// build InputData and write into OutputStream
InputStream inputStream = new ByteArrayInputStream(inputBytes);
long inputLength = inputBytes.length;
InputData inputData = new InputData(inputStream, inputLength);
String passphrase = getCachedPassphrase(secretKeyId);
if (passphrase == null) {
callback.onError(new CryptoError(CryptoError.ID_NO_OR_WRONG_PASSPHRASE,
"No or wrong passphrase!"));
return;
}
OutputStream outputStream = new ByteArrayOutputStream();
Bundle outputBundle;
if (signedOnly) {
@ -416,7 +452,7 @@ public class CryptoService extends Service {
} else {
// TODO: assume symmetric: callback to enter symmetric pass
outputBundle = PgpMain.decryptAndVerify(this, null, inputData, outputStream,
passphrase, false);
passphrase, assumeSymmetricEncryption);
}
outputStream.close();