From e8f01be8ef41106e52ba4dad2a5ad5e6617565bd Mon Sep 17 00:00:00 2001 From: Jon Chambers <63609320+jon-signal@users.noreply.github.com> Date: Fri, 9 Jun 2023 11:41:51 -0400 Subject: [PATCH] Inject version bytes if missing from existing EC pre-keys --- .../textsecuregcm/util/ECPublicKeyAdapter.java | 13 ++++++++++++- .../textsecuregcm/util/ECPublicKeyAdapterTest.java | 3 ++- .../textsecuregcm/util/IdentityKeyAdapterTest.java | 3 ++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/util/ECPublicKeyAdapter.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/ECPublicKeyAdapter.java index 6f656fe75..c89e0b77d 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/util/ECPublicKeyAdapter.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/util/ECPublicKeyAdapter.java @@ -14,11 +14,17 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; import java.util.Base64; +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.Metrics; import org.signal.libsignal.protocol.InvalidKeyException; import org.signal.libsignal.protocol.ecc.ECPublicKey; +import org.whispersystems.textsecuregcm.metrics.MetricsUtil; public class ECPublicKeyAdapter { + private static final Counter EC_PUBLIC_KEY_WITHOUT_VERSION_BYTE_COUNTER = + Metrics.counter(MetricsUtil.name(ECPublicKeyAdapter.class, "keyWithoutVersionByte")); + public static class Serializer extends JsonSerializer { @Override @@ -49,7 +55,12 @@ public class ECPublicKeyAdapter { try { return new ECPublicKey(ecPublicKeyBytes); } catch (final InvalidKeyException e) { - throw new JsonParseException(parser, "Could not interpret key bytes as an EC public key", e); + if (ecPublicKeyBytes.length == ECPublicKey.KEY_SIZE - 1) { + EC_PUBLIC_KEY_WITHOUT_VERSION_BYTE_COUNTER.increment(); + return ECPublicKey.fromPublicKeyBytes(ecPublicKeyBytes); + } + + throw new JsonParseException(parser, "Could not interpret identity key bytes as an EC public key", e); } } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/util/ECPublicKeyAdapterTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/util/ECPublicKeyAdapterTest.java index 868971f65..ce17dd633 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/util/ECPublicKeyAdapterTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/util/ECPublicKeyAdapterTest.java @@ -47,7 +47,8 @@ class ECPublicKeyAdapterTest { return Stream.of( Arguments.of(String.format(template, "null"), null), Arguments.of(String.format(template, "\"\""), null), - Arguments.of(String.format(template, "\"" + Base64.getEncoder().encodeToString(EC_PUBLIC_KEY.serialize()) + "\""), EC_PUBLIC_KEY) + Arguments.of(String.format(template, "\"" + Base64.getEncoder().encodeToString(EC_PUBLIC_KEY.serialize()) + "\""), EC_PUBLIC_KEY), + Arguments.of(String.format(template, "\"" + Base64.getEncoder().encodeToString(EC_PUBLIC_KEY.getPublicKeyBytes()) + "\""), EC_PUBLIC_KEY) ); } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/util/IdentityKeyAdapterTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/util/IdentityKeyAdapterTest.java index 16e09628d..9aabddd85 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/util/IdentityKeyAdapterTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/util/IdentityKeyAdapterTest.java @@ -49,7 +49,8 @@ class IdentityKeyAdapterTest { return Stream.of( Arguments.of(String.format(template, "null"), null), Arguments.of(String.format(template, "\"\""), null), - Arguments.of(String.format(template, "\"" + Base64.getEncoder().encodeToString(IDENTITY_KEY.serialize()) + "\""), IDENTITY_KEY) + Arguments.of(String.format(template, "\"" + Base64.getEncoder().encodeToString(IDENTITY_KEY.serialize()) + "\""), IDENTITY_KEY), + Arguments.of(String.format(template, "\"" + Base64.getEncoder().encodeToString(IDENTITY_KEY.getPublicKey().getPublicKeyBytes()) + "\""), IDENTITY_KEY) ); } }