From 365a4d20d0a9d93580678a739e83f764a9ee093e Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Thu, 24 May 2018 16:01:33 +0200 Subject: [PATCH] Fix decrypting messages --- .../BouncyCastleOpenPgpProvider.java | 33 ++++++++++++++----- .../BouncyCastleOpenPgpProviderTest.java | 3 ++ .../smackx/ox/OpenPgpProvider.java | 3 ++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/smack-openpgp-bouncycastle/src/main/java/org/jivesoftware/smackx/ox/bouncycastle/BouncyCastleOpenPgpProvider.java b/smack-openpgp-bouncycastle/src/main/java/org/jivesoftware/smackx/ox/bouncycastle/BouncyCastleOpenPgpProvider.java index c551dd63b..72141f9a5 100644 --- a/smack-openpgp-bouncycastle/src/main/java/org/jivesoftware/smackx/ox/bouncycastle/BouncyCastleOpenPgpProvider.java +++ b/smack-openpgp-bouncycastle/src/main/java/org/jivesoftware/smackx/ox/bouncycastle/BouncyCastleOpenPgpProvider.java @@ -77,11 +77,6 @@ public class BouncyCastleOpenPgpProvider implements OpenPgpProvider { public BouncyCastleOpenPgpProvider(BareJid ourJid) throws IOException, PGPException, NoSuchAlgorithmException { this.ourJid = ourJid; - PGPSecretKeyRing ourKey = generateKey(ourJid).generateSecretKeyRing(); - ourKeyId = ourKey.getPublicKey().getKeyID(); - ourKeys = KeyringConfigs.forGpgExportedKeys(KeyringConfigCallbacks.withUnprotectedKeys()); - ourKeys.addSecretKey(ourKey.getSecretKey().getEncoded()); - ourKeys.addPublicKey(ourKey.getPublicKey().getEncoded()); } @Override @@ -177,14 +172,20 @@ public class BouncyCastleOpenPgpProvider implements OpenPgpProvider { InMemoryKeyring newKeyring = KeyringConfigs.forGpgExportedKeys( KeyringConfigCallbacks.withUnprotectedKeys()); - newKeyring.addSecretKey(secretKey.getEncoded()); newKeyring.addPublicKey(secretKey.getPublicKey().getEncoded()); + newKeyring.addSecretKey(secretKey.getEncoded()); ourKeys = newKeyring; ourKeyId = secretKey.getKeyID(); + + InMemoryKeyring theirKeyRing = KeyringConfigs.forGpgExportedKeys( + KeyringConfigCallbacks.withUnprotectedKeys()); + theirKeyRing.addPublicKey(secretKey.getPublicKey().getEncoded()); + + theirKeys.put(ourJid, theirKeyRing); } } catch (PGPException | IOException e) { - e.printStackTrace(); + throw new CorruptedOpenPgpKeyException(e); } } @@ -358,8 +359,9 @@ public class BouncyCastleOpenPgpProvider implements OpenPgpProvider { decryptionConfig.addPublicKey(p.getPublicKey().getEncoded()); } - ByteArrayInputStream encryptedIn = new ByteArrayInputStream( - element.getEncryptedBase64MessageContent().getBytes(Charset.forName("UTF-8"))); + byte[] b64decoded = Base64.decode(element.getEncryptedBase64MessageContent()); + + ByteArrayInputStream encryptedIn = new ByteArrayInputStream(b64decoded); InputStream decrypted = BouncyGPG.decryptAndVerifyStream() .withConfig(decryptionConfig) @@ -385,6 +387,19 @@ public class BouncyCastleOpenPgpProvider implements OpenPgpProvider { } } + @Override + public void createAndUseKey() throws CorruptedOpenPgpKeyException, NoSuchAlgorithmException { + try { + PGPSecretKeyRing ourKey = generateKey(ourJid).generateSecretKeyRing(); + ourKeyId = ourKey.getPublicKey().getKeyID(); + ourKeys = KeyringConfigs.forGpgExportedKeys(KeyringConfigCallbacks.withUnprotectedKeys()); + ourKeys.addSecretKey(ourKey.getSecretKey().getEncoded()); + ourKeys.addPublicKey(ourKey.getPublicKey().getEncoded()); + } catch (PGPException | IOException e) { + throw new CorruptedOpenPgpKeyException(e); + } + } + public static PGPKeyRingGenerator generateKey(BareJid owner) throws NoSuchAlgorithmException, PGPException { PGPKeyRingGenerator generator = BouncyGPG.createKeyPair() .withRSAKeys() diff --git a/smack-openpgp-bouncycastle/src/test/java/org/jivesoftware/smackx/ox/bouncycastle/BouncyCastleOpenPgpProviderTest.java b/smack-openpgp-bouncycastle/src/test/java/org/jivesoftware/smackx/ox/bouncycastle/BouncyCastleOpenPgpProviderTest.java index ecb4fe52e..433588e9d 100644 --- a/smack-openpgp-bouncycastle/src/test/java/org/jivesoftware/smackx/ox/bouncycastle/BouncyCastleOpenPgpProviderTest.java +++ b/smack-openpgp-bouncycastle/src/test/java/org/jivesoftware/smackx/ox/bouncycastle/BouncyCastleOpenPgpProviderTest.java @@ -49,6 +49,9 @@ public class BouncyCastleOpenPgpProviderTest extends SmackTestSuite { BouncyCastleOpenPgpProvider aliceProvider = new BouncyCastleOpenPgpProvider(alice); BouncyCastleOpenPgpProvider cheshireProvider = new BouncyCastleOpenPgpProvider(cheshire); + aliceProvider.createAndUseKey(); + cheshireProvider.createAndUseKey(); + // dry exchange keys PubkeyElement aliceKeys = aliceProvider.createPubkeyElement(); PubkeyElement cheshireKeys = cheshireProvider.createPubkeyElement(); diff --git a/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/OpenPgpProvider.java b/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/OpenPgpProvider.java index 4a8b18281..ab7dfffba 100644 --- a/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/OpenPgpProvider.java +++ b/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/OpenPgpProvider.java @@ -16,6 +16,7 @@ */ package org.jivesoftware.smackx.ox; +import java.security.NoSuchAlgorithmException; import java.util.Set; import org.jivesoftware.smackx.ox.element.CryptElement; @@ -156,4 +157,6 @@ public interface OpenPgpProvider { SecretkeyElement createSecretkeyElement(String password) throws CorruptedOpenPgpKeyException; void restoreSecretKeyElement(SecretkeyElement secretkeyElement, String password) throws CorruptedOpenPgpKeyException; + + void createAndUseKey() throws CorruptedOpenPgpKeyException, NoSuchAlgorithmException; }