Inject version bytes if missing from existing EC pre-keys

This commit is contained in:
Jon Chambers 2023-06-09 11:41:51 -04:00 committed by GitHub
parent 7f1ee015d1
commit e8f01be8ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 3 deletions

View File

@ -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<ECPublicKey> {
@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);
}
}
}

View File

@ -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)
);
}
}

View File

@ -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)
);
}
}