Performing encryption verification
Verify the login request and create a JSON Web Encryption (JWE) response.
Overview
Use the code snippets in this article to complete the process of encryption verification that works with Platform SSO:
Create device signing and encryption keys
Sign the login request and encrypt the response
Perform key exchange
Derive a shared key and encrypt the plain text
Verify the login response and decrypt the JWE
Use this device signing key:
{
"y" : "PAIz7YrH4Rxz1rlfn6JcnwSmFDVGY1ISlGnmK1NX5vs",
"d" : "vXZoCHYVxEJVcCcQN50ZKEBwhlQYO6g3KaUIufh3vXw",
"kid" : "Ws9mKynZxyUSNXYtMGAjjLO+Jg16HCa\/5pJO0udNWJ4=",
"x" : "gK60EgxT-EipyAgSlrHG0LgFVrgnd8UXAvLOgykJtms",
"kty" : "EC",
"crv" : "P-256"
}Use this device encryption key:
{
"y" : "4MlSuUf_7J6Ljv0FBT1jK0_sKGB4WYwdKCOtnTEAwz4",
"d" : "1bqqmpoFEtzSnQMqp9N9ZRybnP8vjFUiZyGaSgKVGMw",
"kid" : "pScnuzx3x85Eyp6CtK9UQADxOsAGTP72y02Tg3m1sk8=",
"x" : "TvkPOH4yscrSC1rFYvnBVPYMqzR1vKck9ht4D7K_gAQ",
"kty" : "EC",
"crv" : "P-256"
}Sign the login request
Note how the system signs the following login JSON Web Token (JWT) using the device-signing key:
{
"kid" : "Ws9mKynZxyUSNXYtMGAjjLO+Jg16HCa/5pJO0udNWJ4=",
"x5c" : "MIIBhDCCASmgAwIBAgIBATAKBggqhkjOPQQDAjA3MRQwEgYDVQQDEwtkZXZpY2UgdGVzdDELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUFwcGxlIEluYzAeFw0yMjA2MjMxNzI1MzFaFw0yMzA2MjMxNzI1MzFaMDcxFDASBgNVBAMTC2RldmljZSB0ZXN0MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQXBwbGUgSW5jMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEgK60EgxT+EipyAgSlrHG0LgFVrgnd8UXAvLOgykJtms8AjPtisfhHHPWuV+folyfBKYUNUZjUhKUaeYrU1fm+6MmMCQwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCB4AwCgYIKoZIzj0EAwIDSQAwRgIhAMwGOYwgf5xGxNcZLL/Y4phA66w/PSVLeQYhec2JTQF1AiEAlNSUDycvv0DwDQYU4wUpco/GBuhc4mPmli3+DT+p1Is=",
"typ" : "JWT",
"alg" : "ES256"
}.{
"iat" : "1656005132",
"jwe_crypto" : {
"alg" : "ECDH-ES",
"enc" : "A256GCM",
"apv" : "AAAABUFwcGxlAAAAQQRO-Q84fjKxytILWsVi-cFU9gyrNHW8pyT2G3gPsr-ABODJUrlH_-yei479BQU9YytP7ChgeFmMHSgjrZ0xAMM-AAAAJERERjY4MTcxLTQwOUQtNEUyQy05MUYwLTlFNDJENzc0NTM2NQ"
},
"password" : "bar",
"request_nonce" : "AwABAAAAAAADAOz_BADv_xtgu_SM1Mvoq02PYz_YfXxx5FAgcLHLNikH6gjrBWwcqnRW_haxqO9JCiPat5KfkTily04S8EH3AQwVsWCxHYQgAA",
"scope" : "openid offline_access urn:apple:platformsso",
"grant_type" : "password",
"username" : "foo",
"aud" : "https://localhost.apple.com:8888/auth/token",
"client_id" : "aaff1524-fa35-40c5-94e3-2b233c5f2965",
"nonce" : "DDF68171-409D-4E2C-91F0-9E42D7745365"
}The signed and encoded login JWT output is:
ewogICJraWQiIDogIldzOW1LeW5aeHlVU05YWXRNR0FqakxPK0pnMTZIQ2EvNXBKTzB1ZE5XSjQ9IiwKICAieDVjIiA6ICJNSUlCaERDQ0FTbWdBd0lCQWdJQkFUQUtCZ2dxaGtqT1BRUURBakEzTVJRd0VnWURWUVFERXd0a1pYWnBZMlVnZEdWemRERUxNQWtHQTFVRUJoTUNWVk14RWpBUUJnTlZCQW9UQ1VGd2NHeGxJRWx1WXpBZUZ3MHlNakEyTWpNeE56STFNekZhRncweU16QTJNak14TnpJMU16RmFNRGN4RkRBU0JnTlZCQU1UQzJSbGRtbGpaU0IwWlhOME1Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KUVhCd2JHVWdTVzVqTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFZ0s2MEVneFQrRWlweUFnU2xySEcwTGdGVnJnbmQ4VVhBdkxPZ3lrSnRtczhBalB0aXNmaEhIUFd1Vitmb2x5ZkJLWVVOVVpqVWhLVWFlWXJVMWZtKzZNbU1DUXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBREFPQmdOVkhROEJBZjhFQkFNQ0I0QXdDZ1lJS29aSXpqMEVBd0lEU1FBd1JnSWhBTXdHT1l3Z2Y1eEd4TmNaTEwvWTRwaEE2NncvUFNWTGVRWWhlYzJKVFFGMUFpRUFsTlNVRHljdnYwRHdEUVlVNHdVcGNvL0dCdWhjNG1QbWxpMytEVCtwMUlzPSIsCiAgInR5cCIgOiAiSldUIiwKICAiYWxnIiA6ICJFUzI1NiIKfQ.ewogICJpYXQiIDogIjE2NTYwMDUxMzIiLAogICJqd2VfY3J5cHRvIiA6IHsKICAgICJhbGciIDogIkVDREgtRVMiLAogICAgImVuYyIgOiAiQTI1NkdDTSIsCiAgICAiYXB2IiA6ICJBQUFBQlVGd2NHeGxBQUFBUVFSTy1RODRmakt4eXRJTFdzVmktY0ZVOWd5ck5IVzhweVQyRzNnUHNyLUFCT0RKVXJsSF8teWVpNDc5QlFVOVl5dFA3Q2hnZUZtTUhTZ2pyWjB4QU1NLUFBQUFKRVJFUmpZNE1UY3hMVFF3T1VRdE5FVXlReTA1TVVZd0xUbEZOREpFTnpjME5UTTJOUSIKICB9LAogICJwYXNzd29yZCIgOiAiYmFyIiwKICAicmVxdWVzdF9ub25jZSIgOiAiQXdBQkFBQUFBQUFEQU96X0JBRHZfeHRndV9TTTFNdm9xMDJQWXpfWWZYeHg1RkFnY0xITE5pa0g2Z2pyQld3Y3FuUldfaGF4cU85SkNpUGF0NUtma1RpbHkwNFM4RUgzQVF3VnNXQ3hIWVFnQUEiLAogICJzY29wZSIgOiAib3BlbmlkIG9mZmxpbmVfYWNjZXNzIHVybjphcHBsZTpwbGF0Zm9ybXNzbyIsCiAgImdyYW50X3R5cGUiIDogInBhc3N3b3JkIiwKICAidXNlcm5hbWUiIDogImZvbyIsCiAgImF1ZCIgOiAiaHR0cHM6Ly9sb2NhbGhvc3QuYXBwbGUuY29tOjg4ODgvYXV0aC90b2tlbiIsCiAgImNsaWVudF9pZCIgOiAiYWFmZjE1MjQtZmEzNS00MGM1LTk0ZTMtMmIyMzNjNWYyOTY1IiwKICAibm9uY2UiIDogIkRERjY4MTcxLTQwOUQtNEUyQy05MUYwLTlFNDJENzc0NTM2NSIKfQ.JMD4NkC0bwrQ0GZI66EMo50Rwgfj3fewTc_6836zWbyvNwcCSNmL9hKIgJx-oFoiwZ0dtYYN5KPI3MHLg3-GBwEncrypt the response
Use the following ephemeral key, response header, and plain text to generate a sample encrypted response. The plain text is encrypted and all data values are base-64 URL encoded.
- Ephemeral key
{“y” : “erf9nEkEC8SiuwP-7f7udD7CnX5KEauVIfBPoqnmlYo”,“d” : “okDfU7IYlFXoEKgqu-79iy-AR55omCKzVKlFCXy8z5c”,“kid” : “lssbzDeX5i7SjBnCsHVKrzAMnEvEmVwZeyJQqoGdS4E=”,“x” : “VIXdgu3x0eLgEVtROZ5YQ4GUS8WZQT-3HPqX2FPoY4I”,“kty” : “EC”,“crv” : “P-256”
}
- Response header
ewogICJlbmMiIDogIkEyNTZHQ00iLAogICJraWQiIDogInBTY251engzeDg1RXlwNkN0SzlVUUFEeE9zQUdUUDcyeTAyVGczbTFzazg9IiwKICAiZXBrIiA6IHsKICAgICJ5IiA6ICJlcmY5bkVrRUM4U2l1d1AtN2Y3dWREN0NuWDVLRWF1VklmQlBvcW5tbFlvIiwKICAgICJ4IiA6ICJWSVhkZ3UzeDBlTGdFVnRST1o1WVE0R1VTOFdaUVQtM0hQcVgyRlBvWTRJIiwKICAgICJrdHkiIDogIkVDIiwKICAgICJjcnYiIDogIlAtMjU2IgogIH0sCiAgImFwdSIgOiAiQUFBQUJVRlFVRXhGQUFBQVFRUlVoZDJDN2ZIUjR1QVJXMUU1bmxoRGdaUkx4WmxCUDdjYy1wZllVLWhqZ25xM19aeEpCQXZFb3JzRF91My03blEtd3AxLVNoR3JsU0h3VDZLcDVwV0siLAogICJ0eXAiIDogIkpXVCIsCiAgImFsZyIgOiAiRUNESC1FUyIKfQ- Plain text
ewogICJyZWZyZXNoX3Rva2VuIiA6ICJBd0FCQUFBQXZQTTFLYVBsckVxZEZTQnpqcWZUR0FNeFpHVVRkTTB0NEI0IiwKICAiaWRfdG9rZW4iIDogImV3b2dJQ0owZVhBaUlEb2dJa3BYVkNJc0NpQWdJbUZzWnlJZ09pQWlVbE15TlRZaUxBb2dJQ0pyYVdRaUlEb2dJblYwYzB0aGVsWklVSFk0VFhoRFIwOXhORmcxWW14VFp6RjFRVFpCYkhWV2NYaE5SVWxTTjB0bGVUZzlJZ3A5LmV3b2dJQ0p1YjI1alpTSWdPaUFpUkVSR05qZ3hOekV0TkRBNVJDMDBSVEpETFRreFJqQXRPVVUwTWtRM056UTFNelkxSWl3S0lDQWlhV0YwSWlBNklDSXhOalUyTURBMU1UTXlJaXdLSUNBaWJtSm1JaUE2SUNJeE5qVTJNREExTVRNeUlpd0tJQ0FpZFhCdUlpQTZJQ0ptYjI4aUxBb2dJQ0psZUhBaUlEb2dJakUyTlRZd01EVTBNeklpTEFvZ0lDSmhkV1FpSURvZ0ltRmhabVl4TlRJMExXWmhNelV0TkRCak5TMDVOR1V6TFRKaU1qTXpZelZtTWprMk5TSXNDaUFnSW1semN5SWdPaUFpYUhSMGNITTZMeTltYjI4dWFYTnpkV1Z5TG1OdmJTSUtmUS5HMi1EcWhBaUoxaTZPS3JYdjh2ZzVWcjhWWXFxcW1ZdnZ1U2FQSmZ3c0xEb3QyaXZIdzJhbGp5WG5na05WaDYtTmtrZXZHWnRJUnFTcE9yMGY5czB6XzlmazJmajJzb3lHOWlOMFJoSmNJLV9xSG9hTGxrZWFDNFF2WTZ4alZRMnVqOG5iUnBIRVN4VGRoSi1LSjZfMm1BVGk3NVZxUmlfV3NBMElLZnhCaGc4Y01aS25lMF9pTTRoRERqQVFQR2N2SWtMcG5nT1BTbWRHbUxNUkZVU0twVVBQYmt0QzRHa0Y0T1VBZXJFS0VORFdlZHhpU2pCa2VwOW1ZVV9MdDNFM2o0RU1ZVFVyTDNZeU1XTGotdnRUY2ttVTJCZHNvMHlfbnlfMDhpWWdPVXJ2OGJwdlkxQTdoc1NwZWM5ZTYwMWRKSHAxekx3NVppbzhjVVl0MnFKalEiLAogICJleHBpcmVzX29uIiA6ICIxNjU2MDMzOTMyIiwKICAidG9rZW5fdHlwZSIgOiAiQmVhcmVyIiwKICAiZXhwaXJlc19pbiIgOiAyODgwMCwKICAicmVmcmVzaF90b2tlbl9leHBpcmVzX2luIiA6IDI4ODAwCn0
Perform Diffie-Hellman key exchange
Diffie–Hellman key exchange is a method to securely exchange cryptographic keys over a public channel.
Use the device encryption public key and the ephemeral private key to perform Diffie-Hellman key exchange (ecdhKeyExchangeStandard).
- Exchanged key (output)
L87ywmD3aLpVlXsqAvq7udyr4s6M0y9MjQCytE71epA
Perform ConcatKDF
ConcatKDF is a concatenation Key Derivation Function (KDF) to derive a shared key from the result of performing Diffie-Hellman key exchange.
Perform ConcatKDF using the key exchange result, algorithm, PartyUInfo, and PartyVInfo: Here are the values that these code snippets use, including the data before the hash and the computed key (output):
Z(The result of the Diffie-Hellman key exchange)L87ywmD3aLpVlXsqAvq7udyr4s6M0y9MjQCytE71epA- Algorithm
QTI1NkdDTQPartyUInfoAAAABUFQUExFAAAAQQRUhd2C7fHR4uARW1E5nlhDgZRLxZlBP7cc-pfYU-hjgnq3_ZxJBAvEorsD_u3-7nQ-wp1-ShGrlSHwT6Kp5pWKPartyVInfoAAAABUFwcGxlAAAAQQRO-Q84fjKxytILWsVi-cFU9gyrNHW8pyT2G3gPsr-ABODJUrlH_-yei479BQU9YytP7ChgeFmMHSgjrZ0xAMM-AAAAJERERjY4MTcxLTQwOUQtNEUyQy05MUYwLTlFNDJENzc0NTM2NQ- ConcatKDF data before SHA-256 hash
AAAAAS_O8sJg92i6VZV7KgL6u7ncq-LOjNMvTI0AsrRO9XqQAAAAB0EyNTZHQ00AAABOAAAABUFQUExFAAAAQQRUhd2C7fHR4uARW1E5nlhDgZRLxZlBP7cc-pfYU-hjgnq3_ZxJBAvEorsD_u3-7nQ-wp1-ShGrlSHwT6Kp5pWKAAAAdgAAAAVBcHBsZQAAAEEETvkPOH4yscrSC1rFYvnBVPYMqzR1vKck9ht4D7K_gATgyVK5R__snouO_QUFPWMrT-woYHhZjB0oI62dMQDDPgAAACREREY2ODE3MS00MDlELTRFMkMtOTFGMC05RTQyRDc3NDUzNjUAAAEA- Computed key (output)
kh36uWSGH25r09lLf3m5l3TLS5xKAs-h3UCdbTKheCY
Encrypt the plain text
The system uses the key from ConcatKDF with the Initialization Vector (IV) and the Additional Authentication Data (AAD) to encrypt the plain text using AESGCM. The AAD is the ASCII-encoded response header per RFC 7516 Section 5.1, Step 14. The response header was already base-64 URL encoded. Here are the values that these code snippets use, and the output:
- Key (from ConcatKDF)
kh36uWSGH25r09lLf3m5l3TLS5xKAs-h3UCdbTKheCY- IV
cFAKroCUiODyXmdK- AAD
ZXdvZ0lDSmxibU1pSURvZ0lrRXlOVFpIUTAwaUxBb2dJQ0pyYVdRaUlEb2dJbkJUWTI1MWVuZ3plRGcxUlhsd05rTjBTemxWVVVGRWVFOXpRVWRVVURjeWVUQXlWR2N6YlRGemF6ZzlJaXdLSUNBaVpYQnJJaUE2SUhzS0lDQWdJQ0o1SWlBNklDSmxjbVk1YmtWclJVTTRVMmwxZDFBdE4yWTNkV1JFTjBOdVdEVkxSV0YxVmtsbVFsQnZjVzV0YkZsdklpd0tJQ0FnSUNKNElpQTZJQ0pXU1Zoa1ozVXplREJsVEdkRlZuUlNUMW8xV1ZFMFIxVlRPRmRhVVZRdE0waFFjVmd5UmxCdldUUkpJaXdLSUNBZ0lDSnJkSGtpSURvZ0lrVkRJaXdLSUNBZ0lDSmpjbllpSURvZ0lsQXRNalUySWdvZ0lIMHNDaUFnSW1Gd2RTSWdPaUFpUVVGQlFVSlZSbEZWUlhoR1FVRkJRVkZSVWxWb1pESkROMlpJVWpSMVFWSlhNVVUxYm14b1JHZGFVa3g0V214Q1VEZGpZeTF3WmxsVkxXaHFaMjV4TTE5YWVFcENRWFpGYjNKelJGOTFNeTAzYmxFdGQzQXhMVk5vUjNKc1UwaDNWRFpMY0RWd1Ywc2lMQW9nSUNKMGVYQWlJRG9nSWtwWFZDSXNDaUFnSW1Gc1p5SWdPaUFpUlVORVNDMUZVeUlLZlE- Cipher text (output)
MHlVmPIlP5Tz9pKKMLJfHTKkWtHpP1Y8YKAdT7iuRN09bTNRgArfPLIlo7WkUolOGoU3oV07p3m3cOmTzmVqOmVs0dXlEVZlF21TX_hjN2sj5RpC4tWBdKVdoCej4u0Brkgypw0jXtKUzjIM2HcE-8Yy4fC-ixTnescR1M3eM_6IWRR1MtEYTy1C7JrBcw9gZVSmvC1DpeH49gYw9FkIQUpdnfvyreVU0DfvqhABvp29fpVmQqoaENoLuqDt0Ajfko5LWRz3sLcZipoZ0gdRgwQpcNLnBUYAZs5D7t8Yuay2CZjAoTZcbFv4F8Mrg2BgEncVwhC9jTEVGe3GinlsziPdSVIt-7lXbV99yk2qX0eYb4ItScWgUfl3y_p623Xtr3AOxlslahF7fm8PN3sAJnwb_aQQxeeQZQyRZKD9uMHHUTMZeoJbXxV1KdGgQMYdW0Z40_WYFtqT8UwboptazbZX02GOmz2gO7JSe0OHgLCPAfvp9Ah2apYrEDqp01tYwhCG8SNuBB_sXPuJx-euUuxu70s1809k44A_hAc_iYDPwTBpAXBLOiuJIxVZgy54WNNiP_WqBImjsA1ioE7Mrvqkn-DnkM0NP2rt1GvaZ-IpUNgAXKudjiT51guQLnRcr9r3pNmmIaUrqKepMJdAYqUbc9PjYUus7RX-20r5pudVi8Ef0Tg5y9Hk3f7sfiX9peBea_L5yQP-tjXJN8lITRBFCtvvsTb0ALVbKTTHiItmYFxl7XzAljiOMiXEKDKwb0VqOtkU4Ljdz2_M7mW0sT1M6_8XZ6dn3W9RMAeqmLnKlxU5gxj0rK5C8Dnok-I2jOlDzr7uS01WBmaln4E2MTRLyGsdUhXk6JLewtomMTrM7dfq1x6iZubbV8fOk4ayKlEh6xQONPfUXAnr-OB45gllZ2GWNaipd9nwJyGnktSQYpjHiMgl-eKQ3nwwD6Tnj9yYZgvq-D5_DUknvk1XMGTF1CAKaGWDWvf4t2LTyxLld6qgDKyrQWYVKRbHY5LtUqlQjTUP9WGVCNnojVfEIVJIxGXspgL_QwViuBBkmHa_IEd18UE68_yhtBh1dxi_K3td6AG01_Fm1UgYNhi4SPHJqA22zJQ397HdAAGk1bYk5IacY9qyqpVXPBRhEE92DG5oDZcCUB9li87NWRJIaF46Q1z5S2ROSBimBi-nyOX5G4DpgrPjst3lK7NacpssjdPk2fDh3XXKu2r4RXBr7l7hweuwKNgyzPBoTZ37dadYKz1MpxO5Ag43xLzTougLDkVrS5w- Tag (output)
4dpX5cVdPodXep2NyC2Vyg
Verify the login JWE response
Check the response to confirm that it matches the following output when formatted as a JWE with compact serialization. The system formats the response per RFC 7516 Section 5.1, Step 19. The JWE encrypted key is empty because the system uses direct key agreement:
ewogICJlbmMiIDogIkEyNTZHQ00iLAogICJraWQiIDogInBTY251engzeDg1RXlwNkN0SzlVUUFEeE9zQUdUUDcyeTAyVGczbTFzazg9IiwKICAiZXBrIiA6IHsKICAgICJ5IiA6ICJlcmY5bkVrRUM4U2l1d1AtN2Y3dWREN0NuWDVLRWF1VklmQlBvcW5tbFlvIiwKICAgICJ4IiA6ICJWSVhkZ3UzeDBlTGdFVnRST1o1WVE0R1VTOFdaUVQtM0hQcVgyRlBvWTRJIiwKICAgICJrdHkiIDogIkVDIiwKICAgICJjcnYiIDogIlAtMjU2IgogIH0sCiAgImFwdSIgOiAiQUFBQUJVRlFVRXhGQUFBQVFRUlVoZDJDN2ZIUjR1QVJXMUU1bmxoRGdaUkx4WmxCUDdjYy1wZllVLWhqZ25xM19aeEpCQXZFb3JzRF91My03blEtd3AxLVNoR3JsU0h3VDZLcDVwV0siLAogICJ0eXAiIDogIkpXVCIsCiAgImFsZyIgOiAiRUNESC1FUyIKfQ..cFAKroCUiODyXmdK.Clpc69y98u7GwODBB9u4ZIcxyOY-MHlVmPIlP5Tz9pKKMLJfHTKkWtHpP1Y8YKAdT7iuRN09bTNRgArfPLIlo7WkUolOGoU3oV07p3m3cOmTzmVqOmVs0dXlEVZlF21TX_hjN2sj5RpC4tWBdKVdoCej4u0Brkgypw0jXtKUzjIM2HcE-8Yy4fC-ixTnescR1M3eM_6IWRR1MtEYTy1C7JrBcw9gZVSmvC1DpeH49gYw9FkIQUpdnfvyreVU0DfvqhABvp29fpVmQqoaENoLuqDt0Ajfko5LWRz3sLcZipoZ0gdRgwQpcNLnBUYAZs5D7t8Yuay2CZjAoTZcbFv4F8Mrg2BgEncVwhC9jTEVGe3GinlsziPdSVIt-7lXbV99yk2qX0eYb4ItScWgUfl3y_p623Xtr3AOxlslahF7fm8PN3sAJnwb_aQQxeeQZQyRZKD9uMHHUTMZeoJbXxV1KdGgQMYdW0Z40_WYFtqT8UwboptazbZX02GOmz2gO7JSe0OHgLCPAfvp9Ah2apYrEDqp01tYwhCG8SNuBB_sXPuJx-euUuxu70s1809k44A_hAc_iYDPwTBpAXBLOiuJIxVZgy54WNNiP_WqBImjsA1ioE7Mrvqkn-DnkM0NP2rt1GvaZ-IpUNgAXKudjiT51guQLnRcr9r3pNmmIaUrqKepMJdAYqUbc9PjYUus7RX-20r5pudVi8Ef0Tg5y9Hk3f7sfiX9peBea_L5yQP-tjXJN8lITRBFCtvvsTb0ALVbKTTHiItmYFxl7XzAljiOMiXEKDKwb0VqOtkU4Ljdz2_M7mW0sT1M6_8XZ6dn3W9RMAeqmLnKlxU5gxj0rK5C8Dnok-I2jOlDzr7uS01WBmaln4E2MTRLyGsdUhXk6JLewtomMTrM7dfq1x6iZubbV8fOk4ayKlEh6xQONPfUXAnr-OB45gllZ2GWNaipd9nwJyGnktSQYpjHiMgl-eKQ3nwwD6Tnj9yYZgvq-D5_DUknvk1XMGTF1CAKaGWDWvf4t2LTyxLld6qgDKyrQWYVKRbHY5LtUqlQjTUP9WGVCNnojVfEIVJIxGXspgL_QwViuBBkmHa_IEd18UE68_yhtBh1dxi_K3td6AG01_Fm1UgYNhi4SPHJqA22zJQ397HdAAGk1bYk5IacY9qyqpVXPBRhEE92DG5oDZcCUB9li87NWRJIaF46Q1z5S2ROSBimBi-nyOX5G4DpgrPjst3lK7NacpssjdPk2fDh3XXKu2r4RXBr7l7hweuwKNgyzPBoTZ37dadYKz1MpxO5Ag43xLzTougLDkVrS5w.4dpX5cVdPodXep2NyC2VygDecrypt the JWE
The system calculates the key differently when decrypting the JWE. For decryption, the system performs Diffie-Hellman key exchange (ecdhKeyExchangeStandard) using the device encryption private key and the ephemeral public key from the JWE header. The other inputs for ConcatKDF are the same and the system uses the calculated key for AESGCM decryption using the fields from the encrypted JWE.