X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/28e192c519c59d97d70aea6fabe18927e1aff42a..1781984221365b75d859e9feb81dcf79e7475e7d:/src/main/java/cli/JsonIdentityKeyStore.java diff --git a/src/main/java/cli/JsonIdentityKeyStore.java b/src/main/java/cli/JsonIdentityKeyStore.java index 75e6ba06..e4d18b8f 100644 --- a/src/main/java/cli/JsonIdentityKeyStore.java +++ b/src/main/java/cli/JsonIdentityKeyStore.java @@ -1,7 +1,9 @@ package cli; -import org.json.JSONArray; -import org.json.JSONObject; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.*; import org.whispersystems.libaxolotl.IdentityKey; import org.whispersystems.libaxolotl.IdentityKeyPair; import org.whispersystems.libaxolotl.InvalidKeyException; @@ -11,44 +13,21 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; -public class JsonIdentityKeyStore implements IdentityKeyStore { +class JsonIdentityKeyStore implements IdentityKeyStore { private final Map trustedKeys = new HashMap<>(); private final IdentityKeyPair identityKeyPair; private final int localRegistrationId; - public JsonIdentityKeyStore(JSONObject jsonAxolotl) throws IOException, InvalidKeyException { - localRegistrationId = jsonAxolotl.getInt("registrationId"); - identityKeyPair = new IdentityKeyPair(Base64.decode(jsonAxolotl.getString("identityKey"))); - - JSONArray list = jsonAxolotl.getJSONArray("trustedKeys"); - for (int i = 0; i < list.length(); i++) { - JSONObject k = list.getJSONObject(i); - try { - trustedKeys.put(k.getString("name"), new IdentityKey(Base64.decode(k.getString("identityKey")), 0)); - } catch (InvalidKeyException | IOException e) { - System.out.println("Error while decoding key for: " + k.getString("name")); - } - } - } public JsonIdentityKeyStore(IdentityKeyPair identityKeyPair, int localRegistrationId) { this.identityKeyPair = identityKeyPair; this.localRegistrationId = localRegistrationId; } - public JSONObject getJson() { - JSONArray list = new JSONArray(); - for (String name : trustedKeys.keySet()) { - list.put(new JSONObject().put("name", name).put("identityKey", Base64.encodeBytes(trustedKeys.get(name).serialize()))); - } - - JSONObject result = new JSONObject(); - result.put("registrationId", localRegistrationId); - result.put("identityKey", Base64.encodeBytes(identityKeyPair.serialize())); - result.put("trustedKeys", list); - return result; + public void addTrustedKeys(Map keyMap) { + trustedKeys.putAll(keyMap); } @Override @@ -71,4 +50,58 @@ public class JsonIdentityKeyStore implements IdentityKeyStore { IdentityKey trusted = trustedKeys.get(name); return (trusted == null || trusted.equals(identityKey)); } + + public static class JsonIdentityKeyStoreDeserializer extends JsonDeserializer { + + @Override + public JsonIdentityKeyStore deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + JsonNode node = jsonParser.getCodec().readTree(jsonParser); + + try { + int localRegistrationId = node.get("registrationId").asInt(); + IdentityKeyPair identityKeyPair = new IdentityKeyPair(Base64.decode(node.get("identityKey").asText())); + + + Map trustedKeyMap = new HashMap<>(); + JsonNode trustedKeysNode = node.get("trustedKeys"); + if (trustedKeysNode.isArray()) { + for (JsonNode trustedKey : trustedKeysNode) { + String trustedKeyName = trustedKey.get("name").asText(); + try { + trustedKeyMap.put(trustedKeyName, new IdentityKey(Base64.decode(trustedKey.get("identityKey").asText()), 0)); + } catch (InvalidKeyException | IOException e) { + System.out.println(String.format("Error while decoding key for: %s", trustedKeyName)); + } + } + } + + JsonIdentityKeyStore keyStore = new JsonIdentityKeyStore(identityKeyPair, localRegistrationId); + keyStore.addTrustedKeys(trustedKeyMap); + + return keyStore; + + } catch (InvalidKeyException e) { + throw new IOException(e); + } + } + } + + public static class JsonIdentityKeyStoreSerializer extends JsonSerializer { + + @Override + public void serialize(JsonIdentityKeyStore jsonIdentityKeyStore, JsonGenerator json, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { + json.writeStartObject(); + json.writeNumberField("registrationId", jsonIdentityKeyStore.getLocalRegistrationId()); + json.writeStringField("identityKey", Base64.encodeBytes(jsonIdentityKeyStore.getIdentityKeyPair().serialize())); + json.writeArrayFieldStart("trustedKeys"); + for (Map.Entry trustedKey : jsonIdentityKeyStore.trustedKeys.entrySet()) { + json.writeStartObject(); + json.writeStringField("name", trustedKey.getKey()); + json.writeStringField("identityKey", Base64.encodeBytes(trustedKey.getValue().serialize())); + json.writeEndObject(); + } + json.writeEndArray(); + json.writeEndObject(); + } + } }