I am trying to implement Diffie-Hellman key exchange in Java, but I'm having a hard time understanding the specification:
Complete the Diffie-Hellman key exchange process as a local mechanism according to JWA (RFC 7518) in Direct Key Agreement mode using curve P-256, dT and QC to produce a pair of CEKs (one for each direction) which are identified by Transaction ID. The parameter values supported in this version of the specification are:
- “alg”: ECDH-ES
- “apv”: SDK Reference Number
- “epk”: QC, in JSON Web Key (JWK) format
- {“kty”:”EC” “crv”:“P-256”}
- All other parameters: not present
- CEK: “kty”:oct - 256 bits
Create a JSON object of the following data as the JWS payload to be signed:
{“MyPublicKey”: “QT”, “SDKPublicKey”:” QC”}
Generate a digital signature of the full JSON object according to JWS (RFC 7515) using JWS Compact Serialization. The parameter values supported in this version of the specification are:
- “alg”: PS256 or ES256
- “x5c”: X.5C v3: Cert(MyPb) plus optionally chaining certificates
From my understanding, ECDH will produce a secret key. After sharing my ephemeral public key (QT), the SDK produces the same secret key, so we can later exchange JWE messages encrypted with the same secret key.
The JSON {“MyPublicKey”: “QT”, “SDKPublicKey”:” QC”} will be signed and sent, but I do not understand how I will use apv and epk since these header params are used in JWE and not in the first JWS to be shared.
On the same specification, they talk about these JWE messages, but they do not have these apv and epk parameters.
Encrypt the JSON object according to JWE (RFC 7516) using the same “enc” algorithm used by the SDK, the CEK obtained identified by “kid” and JWE Compact Serialization. The parameter values supported in this version of the specification are:
- “alg”: dir
- “enc”: either A128CBC-HS256 or A128GCM
- “kid”: Transaction ID
- All other parameters: not present
I also read the example in RFC 7518 where I can see the header params apv and epk being used but I'm not sure which header params, JWE's or JWS's ?
Any thought on how this could be implemented using nimbus-jose-jwt or any other java library would be really helpful. Thanks
Both
apv(Agreement PartyVInfo) andepk(Ephemeral Public Key) are optional, so they can be used in multiple ways. You can useapvto reflect SDK version for example. They are added to the JWE header.You can read more about JWE in Nimbus here
An example using Nimbus JOSE would be:
Instead of
EncryptionMethod.A128GCMyou can useEncryptionMethod.A128CBC-HS256as in your specification.apvandepkare added to JWEHeader inside builder. Other parameters can be chosen in constructors of JWEHeader.Builder and ECKey. I used ECDH-ES algorithm, A128GCM encryption method, P-256 curve (elliptic curve is default in ECKey generation), transaction ID is a string. I chose other parameters without any clear pattern. Initialization of KeyStore would be too broad for the example. Encryption is only one thing you can do with JWE, among signature and others.