cyberphone / json-canonicalization

JSON Canonicalization Scheme (JCS)
Other
94 stars 23 forks source link

[Java] Difference in canonical output #13

Closed vdzhuvinov closed 3 years ago

vdzhuvinov commented 3 years ago

Hi Anders,

I'd like to report an issue that we also observed with Samuel's implementation. https://github.com/erdtman/java-json-canonicalization/issues/3

This is the test that fails:

public void testCanonicalizationScenarioThatFailsInApplication() throws IOException {

String jsonVariantOne = "{\"sub\":\"alice\",\"cid\":\"1\",\"scp\":[\"openid\",\"email\"],\"irt\":false,\"rtl\":-1,\"atl\":300,\"ate\":\"S\",\"atc\":false,\"iat\":1613669294,\"clm\":[\"email_verified\",\"email\"],\"rts\":\"_bM0U_knzP20VzbVAuzmvA\",\"k\":\"[\\\"alice\\\",\\\"\\\",\\\"1\\\"]\",\"tid\":\"t2\"}";
String jsonVariantTwo = "{\"sub\":\"alice\",\"scp\":[\"openid\",\"email\"],\"clm\":[\"email\",\"email_verified\"],\"irt\":false,\"rtl\":-1,\"k\":\"[\\\"alice\\\",\\\"\\\",\\\"1\\\"]\",\"tid\":\"t2\",\"rts\":\"_bM0U_knzP20VzbVAuzmvA\",\"atc\":false,\"ate\":\"S\",\"atl\":300,\"iat\":1613669294,\"cid\":\"1\"}";

assertEquals(new JsonCanonicalizer(jsonVariantOne).getEncodedString(), new JsonCanonicalizer(jsonVariantTwo).getEncodedString());
}
Expected :{"atc":false,"ate":"S","atl":300,"cid":"1","clm":["email_verified","email"],"iat":1613669294,"irt":false,"k":"[\"alice\",\"\",\"1\"]","rtl":-1,"rts":"_bM0U_knzP20VzbVAuzmvA","scp":["openid","email"],"sub":"alice","tid":"t2"}
Actual   :{"atc":false,"ate":"S","atl":300,"cid":"1","clm":["email","email_verified"],"iat":1613669294,"irt":false,"k":"[\"alice\",\"\",\"1\"]","rtl":-1,"rts":"_bM0U_knzP20VzbVAuzmvA","scp":["openid","email"],"sub":"alice","tid":"t2"}

Cheers, Vladimir

cyberphone commented 3 years ago

Hi Vladimir,

I cannot verify the bug 😕

The difference in output seems to be around two array elements but that is as it should be because the inputs are different as well and arrays are not sorted because array element order (unlike property order) is significant in JSON. Cheers, Anders

vdzhuvinov commented 3 years ago

Cheers, this makes sense.

This now begs the question why the DB (AWS DynamoDB) we use rearranges the arrays on the way out.