diff --git a/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/OpenPgpManager.java b/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/OpenPgpManager.java index 7c8231a90..85912490b 100644 --- a/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/OpenPgpManager.java +++ b/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/OpenPgpManager.java @@ -636,7 +636,8 @@ public final class OpenPgpManager extends Manager { * @return {@link PubkeyElement} containing the key */ private static PubkeyElement createPubkeyElement(byte[] bytes, Date date) { - return new PubkeyElement(new PubkeyElement.PubkeyDataElement(Base64.encode(bytes)), date); + String base64EncodedOpenPgpPubKey = Base64.encodeToString(bytes); + return new PubkeyElement(new PubkeyElement.PubkeyDataElement(base64EncodedOpenPgpPubKey), date); } /** diff --git a/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/element/PubkeyElement.java b/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/element/PubkeyElement.java index d535d560a..902227024 100644 --- a/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/element/PubkeyElement.java +++ b/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/element/PubkeyElement.java @@ -16,12 +16,12 @@ */ package org.jivesoftware.smackx.ox.element; -import java.nio.charset.Charset; import java.util.Date; import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smack.util.XmlStringBuilder; +import org.jivesoftware.smack.util.stringencoder.Base64; /** * Class representing a pubkey element which is used to transport OpenPGP public keys. @@ -88,21 +88,30 @@ public class PubkeyElement implements ExtensionElement { public static final String ELEMENT = "data"; - private final byte[] b64Data; + private final String b64Data; - public PubkeyDataElement(byte[] b64Data) { + public PubkeyDataElement(String b64Data) { this.b64Data = Objects.requireNonNull(b64Data); } /** * Base64 encoded public key. * - * @return public key bytes. + * @return the base64 encoded version of the public key. */ - public byte[] getB64Data() { + public String getB64Data() { return b64Data; } + private transient byte[] pubKeyBytesCache; + + public byte[] getPubKeyBytes() { + if (pubKeyBytesCache == null) { + pubKeyBytesCache = Base64.decode(b64Data); + } + return pubKeyBytesCache.clone(); + } + @Override public String getElementName() { return ELEMENT; @@ -117,7 +126,7 @@ public class PubkeyElement implements ExtensionElement { public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace) .rightAngleBracket() - .append(new String(b64Data, Charset.forName("UTF-8"))) + .append(b64Data) .closeElement(this); return xml; } diff --git a/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/provider/PubkeyElementProvider.java b/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/provider/PubkeyElementProvider.java index e3c2f9692..7325ca91a 100644 --- a/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/provider/PubkeyElementProvider.java +++ b/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/provider/PubkeyElementProvider.java @@ -17,7 +17,6 @@ package org.jivesoftware.smackx.ox.provider; import java.io.IOException; -import java.nio.charset.Charset; import java.util.Date; import org.jivesoftware.smack.packet.XmlEnvironment; @@ -34,7 +33,7 @@ import org.jivesoftware.smackx.ox.element.PubkeyElement; */ public class PubkeyElementProvider extends ExtensionElementProvider { - public static final PubkeyElementProvider TEST_INSTANCE = new PubkeyElementProvider(); + public static final PubkeyElementProvider INSTANCE = new PubkeyElementProvider(); @Override public PubkeyElement parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackTextParseException { @@ -46,11 +45,9 @@ public class PubkeyElementProvider extends ExtensionElementProvider" + - "BASE64_OPENPGP_PUBLIC_KEY" + + base64EncodedOpenPgpPublicKey + "" + ""; Date date = XmppDateTime.parseXEP0082Date("2018-01-21T10:46:21.000+00:00"); - byte[] key = "BASE64_OPENPGP_PUBLIC_KEY".getBytes(Charset.forName("UTF-8")); - PubkeyElement element = new PubkeyElement(new PubkeyElement.PubkeyDataElement(key), date); + PubkeyElement element = new PubkeyElement(new PubkeyElement.PubkeyDataElement(base64EncodedOpenPgpPublicKey), date); - assertXmlSimilar(expected, element.toXML().toString()); + assertXmlSimilar(pubkeyElement, element.toXML().toString()); - XmlPullParser parser = TestUtils.getParser(expected); - PubkeyElement parsed = PubkeyElementProvider.TEST_INSTANCE.parse(parser); + XmlPullParser parser = SmackTestUtil.getParserFor(pubkeyElement, parserKind); + PubkeyElement parsed = PubkeyElementProvider.INSTANCE.parse(parser); assertEquals(element.getDate(), parsed.getDate()); - assertTrue(Arrays.equals(element.getDataElement().getB64Data(), parsed.getDataElement().getB64Data())); + assertEquals(element.getDataElement().getB64Data(), parsed.getDataElement().getB64Data()); } }