Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Can't decrypt data when compressed #58

Open
sweipert96 opened this issue Jul 11, 2024 · 0 comments
Open

Can't decrypt data when compressed #58

sweipert96 opened this issue Jul 11, 2024 · 0 comments

Comments

@sweipert96
Copy link

Hi,
a colleague of mine and I are working on a flutter project. The application is supposed to retrieve JWE encrypted Data and decrypt it to display the data. We successfully got the encrypted data and now want to use this library to decrypt it.
To do this, we followed this example:

main() async {
  var encoded = "eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0."
      "UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm"
      "1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7Pc"
      "HALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIF"
      "NPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8"
      "rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv"
      "-B3oWh2TbqmScqXMR4gp_A."
      "AxY8DCtDaGlsbGljb3RoZQ."
      "KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY."
      "9hH0vgRfYgPnAHOd8stkvw";

  // create a JsonWebEncryption from the encoded string
  var jwe = JsonWebEncryption.fromCompactSerialization(encoded);

  // create a JsonWebKey for decrypting the signature
  var jwk = new JsonWebKey.fromJson(
    {
      "kty": "RSA",
      "n": "sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1Wl"
          "UzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDpre"
          "cbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_"
          "7svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBI"
          "Y2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU"
          "7-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw",
      "e": "AQAB",
      "d": "VFCWOqXr8nvZNyaaJLXdnNPXZKRaWCjkU5Q2egQQpTBMwhprMzWzpR8Sxq"
          "1OPThh_J6MUD8Z35wky9b8eEO0pwNS8xlh1lOFRRBoNqDIKVOku0aZb-ry"
          "nq8cxjDTLZQ6Fz7jSjR1Klop-YKaUHc9GsEofQqYruPhzSA-QgajZGPbE_"
          "0ZaVDJHfyd7UUBUKunFMScbflYAAOYJqVIVwaYR5zWEEceUjNnTNo_CVSj"
          "-VvXLO5VZfCUAVLgW4dpf1SrtZjSt34YLsRarSb127reG_DUwg9Ch-Kyvj"
          "T1SkHgUWRVGcyly7uvVGRSDwsXypdrNinPA4jlhoNdizK2zF2CWQ",
      "p": "9gY2w6I6S6L0juEKsbeDAwpd9WMfgqFoeA9vEyEUuk4kLwBKcoe1x4HG68"
          "ik918hdDSE9vDQSccA3xXHOAFOPJ8R9EeIAbTi1VwBYnbTp87X-xcPWlEP"
          "krdoUKW60tgs1aNd_Nnc9LEVVPMS390zbFxt8TN_biaBgelNgbC95sM",
      "q": "uKlCKvKv_ZJMVcdIs5vVSU_6cPtYI1ljWytExV_skstvRSNi9r66jdd9-y"
          "BhVfuG4shsp2j7rGnIio901RBeHo6TPKWVVykPu1iYhQXw1jIABfw-MVsN"
          "-3bQ76WLdt2SDxsHs7q7zPyUyHXmps7ycZ5c72wGkUwNOjYelmkiNS0",
      "dp": "w0kZbV63cVRvVX6yk3C8cMxo2qCM4Y8nsq1lmMSYhG4EcL6FWbX5h9yuv"
          "ngs4iLEFk6eALoUS4vIWEwcL4txw9LsWH_zKI-hwoReoP77cOdSL4AVcra"
          "Hawlkpyd2TWjE5evgbhWtOxnZee3cXJBkAi64Ik6jZxbvk-RR3pEhnCs",
      "dq": "o_8V14SezckO6CNLKs_btPdFiO9_kC1DsuUTd2LAfIIVeMZ7jn1Gus_Ff"
          "7B7IVx3p5KuBGOVF8L-qifLb6nQnLysgHDh132NDioZkhH7mI7hPG-PYE_"
          "odApKdnqECHWw0J-F0JWnUd6D2B_1TvF9mXA2Qx-iGYn8OVV1Bsmp6qU",
      "qi": "eNho5yRBEBxhGBtQRww9QirZsB66TrfFReG_CcteI1aCneT0ELGhYlRlC"
          "tUkTRclIfuEPmNsNDPbLoLqqCVznFbvdB7x-Tl-m0l_eFTj2KiqwGqE9PZ"
          "B9nNTwMVvH3VRRSLWACvPnSiwP8N5Usy-WRXS-V7TbpxIhvepTfE0NNo"
    },
  );
  var keyStore = new JsonWebKeyStore()..addKey(jwk);

  // decrypt the payload
  var payload = await jwe.getPayload(keyStore);
  print("decrypted content: ${payload.stringContent}");
}

We tried this with our key and this encrypted data:

eyJ6aXAiOiJERUYiLCJraWQiOiIxWVdtMmV1YzJ6NDF4MlJHZ0xJaTcxNXRCYVpnZnpxUHdWWlRIVTl2X2tzIiwiY3R5IjoiYXBwbGljYXRpb24vanNvbiIsImVuYyI6IkEyNTZHQ00iLCJhbGciOiJSU0EtT0FFUC0yNTYifQ.WpORIc8dFa_Gc0v7Xlawfvutnsdx1c1mrsujw5vnX1A_6AXHTtYpprW3VtBxgmf5RwMSceYmuANbQgafYNE34HlmgugjqnmsifusYpP4PgvSBa3gLjZIvYfgRGQPYjWQ33-Jzbf_ghZM5i9tWx2n2HiQs4DWMv8-yvGFklsJkW8O6-gl6YN1gIjLFw0F_FphaLRvFMcOOVClLAIbZNYwSVttsIlCeS_sczPWEv0LzvpiV0sZM4S5jaMaq9geZKVcUzRCzfQ1exhJFCe2EGwdWRbLALRUiYJarTkN_hB7d6VELm5N6HY5FTtws0I3zXOoWS84MJclcQlCpBp4eb2NTZ4oeOAjI3vlLr5wFovcADJn023jT-A4GDSUwOh50fxWckpSATSUmIsQvrrBpvIIwjY1DBiEIlplr0PyAwtRZKQRnJOog1h1CLE4nw-3T36B2kPJrvDRdHSmQYvD8KE_SEN8ZVxVRTiQYRC_KDJXVcon2wMtaI8PXBmH_LCyDUbCjYNa5fuS5qGjTFiOPqe69Wbi5gfeIQh4HRzUsRWXAEl-1p19kB8QHHAP_1ogUNgHXAWhu1row9JOSJ4UdCTl_Sa1l1SHFJ6ImAKgSs82arzHzCyCfQ3dwv1cR-pV4WMJKAcM2sndk6r-uSS1C2HC1zGzEpTgwjKhZGjQgX--kWk.oCC6IdT0fBNOIvyv.wrHND4DWuvuGsE-Gcow9EgAqTIc70jbJPtLo25kYExBABzQu2msLbLIkFCSseXFDi2meRFqSryuN9f5LC0Bu4jnt8vtb2DX1-IykoZrN3rGs3gsUYNXq3PInTBGz-0MOZXz42nWvCh9_Fh3v46pWyTnP3BsffC8dbwUK1PCGJsI5tCdCXzTceHRI9Lh9TKk6_tYjKKkw7Xxkohk_LJ-fHV3JfOmgWD1wituQo_-7gb3ohSgPZ2ziyg1_7EO-4vMhxbLEVpxPUhXiVQD7TGWMWenkmACKwL8ZFlUOsCC1YqK7ri5_yLrGfb7kmsgY2dL_OAFL_Cs8Z6BoYXRutY-wrbNkmfewbypDJz2OLsG1VAHOjjs_E5wXC2xmmnShU-OlomdSozqrpSI-ljPqmR8ZXzX_s2l2wXgxPSEk9YM6g7EPOG-HWFYhfPw7Ib-MLmWcRyo8FVdjxWjI2Y4hz0xxTY53uxXq1EsnNiOhkxy1iT4ut9OIb2rJwwxDto1Cqq1XOR4npwPYSGDofue90IeYKNL0BYoyJUGh51H4NBbTWBqyFE8l7gjyV4c39ZktOC4G_GqKsdk_Dy3Khei6BMq0ArtCwr3WFzdtgMinbSSERWqWB1o-ZQhHnxA988qYdsYbi6ClRgE7o_bif6yPLgqmciM6ZmU.u22RaFEEie3ny2zo60eQaA

We expected that the result would be this String:

{"contentStructure":{"data":{"hash":{"type":"sha512","content":"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"},"submissionSchema":{"schemaUri":"REDACTED","mimeType":"application/xml"}},"attachments":[{"hash":{"type":"sha512","content":"f3b3ab3e6351e25b5c1882bea8d37efaddc0ea72bf153bb067688f775a26810d32b54f014bf1cebc7fe93042d85b18b5b453e322d154bc55d5cc2754b0dfb4b2"},"purpose":"attachment","filename":"dummy.pdf","mimeType":"application/pdf","attachmentId":"1bfc337c-99c8-4ccd-b492-d867aa17c4bb"}]},"publicServiceType":{"name":"","description":"","identifier":"urn:de:fim:leika:leistung:99108002006000"},"additionalReferenceInfo":{"senderReference":"5STeH1shdkHV2Gvtn0BXwA"}}

But we got this error:

Syncing files to device Linux...
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: FormatException: Unexpected extension byte (at offset 0)
#0      _Utf8Decoder.convertSingle (dart:convert-patch/convert_patch.dart:1747:7)
#1      Utf8Decoder.convert (dart:convert/utf.dart:351:42)
#2      Utf8Codec.decode (dart:convert/utf.dart:63:20)
#3      JosePayload.stringContent (package:jose/src/jose.dart:312:44)
#4      FitConnectApiConnection.decryptJwe (package:fit_connect_dev_client/fit_connect_api.dart:157:29)
<asynchronous suspension>
#5      FitConnectApiConnection.getSubmissionDetails (package:fit_connect_dev_client/fit_connect_api.dart:110:32)
<asynchronous suspension>
#6      FitConnectApiConnection.getSubmissions (package:fit_connect_dev_client/fit_connect_api.dart:82:41)
<asynchronous suspension>
#7      InboxPage.build.<anonymous closure> (package:fit_connect_dev_client/main.dart:120:58)
<asynchronous suspension>

Application finished.

We tried to decrypt the data with the same key in Java and it got us the right result, so we don't think the key or payload is invalid.

But we looked at the encrypted data anyway. We decoded the encrypted data and successfully got the header:

{
  "zip": "DEF",
  "kid": "1YWm2euc2z41x2RGgLIi715tBaZgfzqPwVZTHU9v_ks",
  "cty": "application/json",
  "enc": "A256GCM",
  "alg": "RSA-OAEP-256"
}

And that showed us, that the data was compressed. With your example, no compression algorithm was applied and it worked. So now our theory is, that the compression leads to this error.

Do you know how we should handle the compressed data with this library? Or is it not possible to encrypt compressed data with it?

Thanks for your response and help!

Best regards,
S.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant