{"record":{"id":"fca678fbbd91ca0a","repo":"signalapp/Signal-Server","slug":"could-not-parse-public-key-as-a-base64-encoded-val","errorCode":null,"errorMessage":"Could not parse public key as a base64-encoded value","messagePattern":"Could not parse public key as a base64-encoded value","errorType":"validation","errorClass":"JsonParseException","httpStatus":400,"severity":"error","filePath":"service/src/main/java/org/whispersystems/textsecuregcm/util/AbstractPublicKeyDeserializer.java","lineNumber":27,"sourceCode":"import io.micrometer.core.instrument.Metrics;\nimport org.signal.libsignal.protocol.InvalidKeyException;\nimport org.whispersystems.textsecuregcm.metrics.MetricsUtil;\n\nabstract class AbstractPublicKeyDeserializer<K> extends JsonDeserializer<K> {\n\n  private final String invalidKeyCounterName = MetricsUtil.name(getClass(), \"invalidKey\");\n\n  private static final String REASON_TAG_NAME = \"reason\";\n\n  @Override\n  public K deserialize(final JsonParser parser, final DeserializationContext context) throws IOException {\n    final byte[] publicKeyBytes;\n\n    try {\n      publicKeyBytes = Base64.getDecoder().decode(parser.getValueAsString());\n    } catch (final IllegalArgumentException e) {\n      Metrics.counter(invalidKeyCounterName, REASON_TAG_NAME, \"illegal-base64\").increment();\n      throw new JsonParseException(parser, \"Could not parse public key as a base64-encoded value\", e);\n    }\n\n    if (publicKeyBytes.length == 0) {\n      return null;\n    }\n\n    try {\n      return deserializePublicKey(publicKeyBytes);\n    } catch (final InvalidKeyException e) {\n      Metrics.counter(invalidKeyCounterName, REASON_TAG_NAME, \"invalid-key\").increment();\n      throw new JsonParseException(parser, \"Could not interpret key bytes as a public key\", e);\n    }\n  }\n\n  protected abstract K deserializePublicKey(final byte[] publicKeyBytes) throws InvalidKeyException;\n}\n","sourceCodeStart":9,"sourceCodeEnd":44,"githubUrl":"https://github.com/signalapp/Signal-Server/blob/100ab61c82627582c867d19e1c0561ba2781e927/service/src/main/java/org/whispersystems/textsecuregcm/util/AbstractPublicKeyDeserializer.java#L9-L44","documentation":"Thrown inside a Jackson JsonDeserializer when the JSON string value of a public-key field is not valid Base64: Base64.getDecoder().decode raises IllegalArgumentException, which is caught, counted via an 'illegal-base64' metrics counter, and rethrown as a JsonParseException. The faulting input is the JSON property being deserialized, so the whole deserialization (and hence the request consuming the config payload) fails.","triggerScenarios":"Thrown at service/src/main/java/org/whispersystems/textsecuregcm/util/AbstractPublicKeyDeserializer.java:27 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure the JSON field containing the public key is a valid Base64 string (standard Base64, not URL-safe or hex)","Verify the client serializes the key with Base64.getEncoder().encodeToString(key.serialize()) before sending","Check that the value is not null, empty, or wrapped in quotes incorrectly in the request payload"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"100ab61c82627582c867d19e1c0561ba2781e927","analyzedAt":"2026-09-09T13:29:47.883Z","contentChangedAt":"2026-09-09T13:29:47.883Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}