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" /> android:text="Encrypt and Sign" />
<Button <Button
android:id="@+id/crypto_provider_demo_decrypt" android:id="@+id/crypto_provider_demo_decrypt_and_verify"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:onClick="decryptAndVerifyOnClick" android:onClick="decryptAndVerifyOnClick"
android:text="Decrypt" /> android:text="Decrypt and Verify" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -73,4 +73,14 @@ public class CryptoSignatureResult implements Parcelable {
return new CryptoSignatureResult[size]; 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 @Override
public void run() { 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]; 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, private synchronized void decryptAndVerifySafe(byte[] inputBytes, ICryptoCallback callback,
AppSettings appSettings) throws RemoteException { AppSettings appSettings) throws RemoteException {
try { try {
// build InputData and write into OutputStream // TODO: this is not really needed
InputStream inputStream = new ByteArrayInputStream(inputBytes); // checked if it is text with BEGIN and END tags
long inputLength = inputBytes.length;
InputData inputData = new InputData(inputStream, inputLength);
OutputStream outputStream = new ByteArrayOutputStream();
String message = new String(inputBytes); String message = new String(inputBytes);
Log.d(Constants.TAG, "in: " + message); Log.d(Constants.TAG, "in: " + message);
// checked if signed only
boolean signedOnly = false; boolean signedOnly = false;
Matcher matcher = PgpMain.PGP_SIGNED_MESSAGE.matcher(message); Matcher matcher = PgpMain.PGP_MESSAGE.matcher(message);
if (matcher.matches()) { 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 // TODO: This allows to decrypt messages with ALL secret keys, not only the one for the
// app, Fix this? // app, Fix this?
@ -374,40 +391,59 @@ public class CryptoService extends Service {
// throw new PgpMain.PgpGeneralException(getString(R.string.error_noSecretKeyFound)); // throw new PgpMain.PgpGeneralException(getString(R.string.error_noSecretKeyFound));
// } // }
// TODO: duplicates functions from DecryptActivity! String passphrase = null;
boolean assumeSymmetricEncryption = false; boolean assumeSymmetricEncryption = false;
long secretKeyId; if (!signedOnly) {
try { // BEGIN Get key
if (inputStream.markSupported()) { // TODO: this input stream is consumed after PgpMain.getDecryptionKeyId()... do it
inputStream.mark(200); // should probably set this to the max size of two pgpF // better!
// objects, if it even needs to be anything other than 0. 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) { Log.d(Constants.TAG, "secretKeyId " + secretKeyId);
throw new PgpMain.PgpGeneralException(
getString(R.string.error_noSecretKeyFound)); 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); OutputStream outputStream = new ByteArrayOutputStream();
if (passphrase == null) {
callback.onError(new CryptoError(CryptoError.ID_NO_OR_WRONG_PASSPHRASE,
"No or wrong passphrase!"));
return;
}
Bundle outputBundle; Bundle outputBundle;
if (signedOnly) { if (signedOnly) {
@ -416,7 +452,7 @@ public class CryptoService extends Service {
} else { } else {
// TODO: assume symmetric: callback to enter symmetric pass // TODO: assume symmetric: callback to enter symmetric pass
outputBundle = PgpMain.decryptAndVerify(this, null, inputData, outputStream, outputBundle = PgpMain.decryptAndVerify(this, null, inputData, outputStream,
passphrase, false); passphrase, assumeSymmetricEncryption);
} }
outputStream.close(); outputStream.close();