diff --git a/src/main/java/org/cryptomator/windows/keychain/ByteArrayJsonAdapter.java b/src/main/java/org/cryptomator/windows/keychain/ByteArrayJsonAdapter.java deleted file mode 100644 index 6444373..0000000 --- a/src/main/java/org/cryptomator/windows/keychain/ByteArrayJsonAdapter.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.cryptomator.windows.keychain; - -import com.fasterxml.jackson.core.JacksonException; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; - -import java.io.IOException; -import java.util.Base64; - -class ByteArrayJsonAdapter { - static class Serializer extends StdSerializer { - - public Serializer() { - super((Class) null); - } - - @Override - public void serialize(byte[] value, JsonGenerator gen, SerializerProvider provider) throws IOException { - gen.writeString(Base64.getEncoder().encodeToString(value)); - } - } - - static class Deserializer extends StdDeserializer { - - public Deserializer() { - super(byte[].class); - } - - @Override - public byte[] deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { - String base64 = p.getValueAsString(); - return Base64.getDecoder().decode(base64); - } - } - -} diff --git a/src/main/java/org/cryptomator/windows/keychain/KeychainEntry.java b/src/main/java/org/cryptomator/windows/keychain/KeychainEntry.java index 0e00f49..fd295f1 100644 --- a/src/main/java/org/cryptomator/windows/keychain/KeychainEntry.java +++ b/src/main/java/org/cryptomator/windows/keychain/KeychainEntry.java @@ -2,15 +2,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -record KeychainEntry(@JsonProperty("ciphertext") // - @JsonSerialize(using = ByteArrayJsonAdapter.Serializer.class) // - @JsonDeserialize(using = ByteArrayJsonAdapter.Deserializer.class) // - byte[] ciphertext, - @JsonProperty("salt") // - @JsonSerialize(using = ByteArrayJsonAdapter.Serializer.class) // - @JsonDeserialize(using = ByteArrayJsonAdapter.Deserializer.class) // - byte[] salt) { +record KeychainEntry(@JsonProperty("ciphertext") byte[] ciphertext, @JsonProperty("salt") byte[] salt) { } diff --git a/src/test/java/org/cryptomator/windows/keychain/WindowsProtectedKeychainAccessIntegrationTest.java b/src/test/java/org/cryptomator/windows/keychain/WindowsProtectedKeychainAccessIntegrationTest.java index 69d1eb9..c948440 100644 --- a/src/test/java/org/cryptomator/windows/keychain/WindowsProtectedKeychainAccessIntegrationTest.java +++ b/src/test/java/org/cryptomator/windows/keychain/WindowsProtectedKeychainAccessIntegrationTest.java @@ -11,6 +11,7 @@ import org.junit.jupiter.api.io.TempDir; import java.io.IOException; +import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; @@ -58,6 +59,15 @@ public void testEmptyFileReturnsEmpty() throws KeychainAccessException, IOExcept Assertions.assertTrue(result.isEmpty()); } + + @Test + public void testLegacyKeychainFiles() throws URISyntaxException, KeychainAccessException { + var keychainPath = Path.of(this.getClass().getResource("keychain.v1.2.2.json").toURI()); + var result = keychainAccess.loadKeychainEntries(keychainPath); + + Assertions.assertTrue(result.isPresent()); + Assertions.assertEquals(3, result.get().size()); + } } } diff --git a/src/test/resources/org/cryptomator/windows/keychain/keychain.v1.2.2.json b/src/test/resources/org/cryptomator/windows/keychain/keychain.v1.2.2.json new file mode 100644 index 0000000..4f12b0a --- /dev/null +++ b/src/test/resources/org/cryptomator/windows/keychain/keychain.v1.2.2.json @@ -0,0 +1,14 @@ +{ + "cryptomator-device-p12": { + "ciphertext": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAMKzd7acJg0ScvBUOCjUb3wAAAAACAAAAAAAQZgAAAAEAACAAAABS6cSKuWqEOp+1HHcsSF0bSzQRRbotDIZPQIuMvbSdowAAAAAOgAAAAAIAACAAAABatZ2hp39vFTysmXRSO1rkk9vLx2S6rnRq6RIGkXlCnzAAAAAgTeOMtOKhnMzIjSwJEFE22UaB3sPGH6UxQ+EWMuZ9WPGHmOp8/WzTzFLCwbiIh9ZAAAAAf7DQSu40eCLUDKQzwFNJrBJsEWX2pK2GS2wOYFTlcMhSij7WkSHh9nAeZtRf14PyBpuLxCiBIayLJMpeK4HIXg==", + "salt": "Rwzfb0IHSqOXJw5MGRmCTw==" + }, + "-JgknuFBfItX": { + "ciphertext": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAMKzd7acJg0ScvBUOCjUb3wAAAAACAAAAAAAQZgAAAAEAACAAAABnYHm42qCU6kq50NV16IqJbrwrRwagpiYgopjK8xpyVAAAAAAOgAAAAAIAACAAAAC6XB/vmPRR7tK5sTOyY6DFgTXv4/ptTzGsKwJEsn1I8xAAAADUlPA6Qet/WSCbdK4WShMsQAAAAOVsW/9E/YNwHLl/qyzffkp2YR7UKeTcM3EkLoyI9Q2RJjmdidJc4wAet9zlp4qUPST+ukTxXAvMW/+RNxEAeZM=", + "salt": "CqEUWMVSQtqsDNhKeNCZHg==" + }, + "vkEAWUv_NmbN": { + "ciphertext": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAcLFOdGbRSEiT1nQ2ILvP/gAAAAACAAAAAAAQZgAAAAEAACAAAABYjK3wVUE/is3SHpdzLRaijVbLw6UYMSBizyiDDWNrqAAAAAAOgAAAAAIAACAAAAALkAoBV3/RwpSXwkTyDgOKiR7+wMnXq099WW4tt873NRAAAACH2Ki+R4fSi+569Y0RpoS0QAAAAEXbbfM0mUuIgajCfO7yfH1ysWdRUWfZYnfqDjeR5Up/FKqLbPkgZr+0fgb/sZEw+HyQ781A7+fXHFqB3hQoDV0=", + "salt": "evllr3H5SHyJN/1SciqlVQ==" + } +} \ No newline at end of file