aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--OpenPGP-Keychain-API-Demo/res/layout/crypto_provider_demo.xml4
-rw-r--r--OpenPGP-Keychain-API-Demo/src/org/openintents/crypto/CryptoSignatureResult.java10
-rw-r--r--OpenPGP-Keychain-API-Demo/src/org/sufficientlysecure/keychain/demo/CryptoProviderDemoActivity.java6
-rw-r--r--OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.java10
-rw-r--r--OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java114
5 files changed, 101 insertions, 43 deletions
diff --git a/OpenPGP-Keychain-API-Demo/res/layout/crypto_provider_demo.xml b/OpenPGP-Keychain-API-Demo/res/layout/crypto_provider_demo.xml
index 0579aa643..1c0717d98 100644
--- a/OpenPGP-Keychain-API-Demo/res/layout/crypto_provider_demo.xml
+++ b/OpenPGP-Keychain-API-Demo/res/layout/crypto_provider_demo.xml
@@ -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> \ No newline at end of file
diff --git a/OpenPGP-Keychain-API-Demo/src/org/openintents/crypto/CryptoSignatureResult.java b/OpenPGP-Keychain-API-Demo/src/org/openintents/crypto/CryptoSignatureResult.java
index e193b73b3..d3aaa52d9 100644
--- a/OpenPGP-Keychain-API-Demo/src/org/openintents/crypto/CryptoSignatureResult.java
+++ b/OpenPGP-Keychain-API-Demo/src/org/openintents/crypto/CryptoSignatureResult.java
@@ -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;
+ }
+
}
diff --git a/OpenPGP-Keychain-API-Demo/src/org/sufficientlysecure/keychain/demo/CryptoProviderDemoActivity.java b/OpenPGP-Keychain-API-Demo/src/org/sufficientlysecure/keychain/demo/CryptoProviderDemoActivity.java
index 1189d2cf4..ab5795c1c 100644
--- a/OpenPGP-Keychain-API-Demo/src/org/sufficientlysecure/keychain/demo/CryptoProviderDemoActivity.java
+++ b/OpenPGP-Keychain-API-Demo/src/org/sufficientlysecure/keychain/demo/CryptoProviderDemoActivity.java
@@ -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();
}
});
diff --git a/OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.java b/OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.java
index e193b73b3..d3aaa52d9 100644
--- a/OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.java
+++ b/OpenPGP-Keychain/src/org/openintents/crypto/CryptoSignatureResult.java
@@ -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;
+ }
+
}
diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java
index 8092cb86a..7f36fc2de 100644
--- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java
+++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java
@@ -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.
- }
- secretKeyId = PgpMain.getDecryptionKeyId(this, inputStream);
- if (secretKeyId == Id.key.none) {
- throw new PgpMain.PgpGeneralException(
- getString(R.string.error_noSecretKeyFound));
- }
- assumeSymmetricEncryption = false;
- } catch (PgpMain.NoAsymmetricEncryptionException e) {
- if (inputStream.markSupported()) {
- inputStream.reset();
+ 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 = Id.key.symmetric;
- if (!PgpMain.hasSymmetricEncryption(this, inputStream)) {
- throw new PgpMain.PgpGeneralException(
- getString(R.string.error_noKnownEncryptionFound));
+
+ 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 = 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();