In the NIST 800-56A rev3 "Recommendation for Pair-Wise Key-Establishment Schemes Using Discrete Logarithm Cryptography" in section 6.1.1.2 "(Cofactor) Full Unified Model, C(2e, 2s, ECC CDH) Scheme" the shared secret is calculated as follows:
Party U Calculates:
- $Z_s = d_{s,U} Q_{s,V}$
- $Z_e = d_{e,U} Q_{e,V}$
- $Z = Z_s || Z_e$
Party V Calculates:
- $Z_s = d_{s,V} Q_{s,U}$
- $Z_e = d_{e,V} Q_{e,U}$
- $Z = Z_s || Z_e$
where $d_{s,X}, Q_{s,X}$ are the static private and public keys of party $X$ respectively and $d_{e,X}, Q_{e,X}$ are the ephemeral private and public keys of party $X$ respectively.
However, this scheme is vulnerable to "Key Compromise Impersonation" (KCI) attacks. This means if someone obtains $d_{s,U}$, they can impersonate any other party to $U$. The same is true for $V$. This is also acknowledged in the NIST publication and also see here for more details.
As far as I can see, if we cross calculate the shared secrets as follows:
Party U Calculates:
- $Z_1 = d_{s,U} Q_{e,V}$
- $Z_2 = d_{e,U} Q_{s,V}$
- $Z = Z_1 || Z_2$
Party V Calculates:
- $Z_2 = d_{s,V} Q_{e,U}$
- $Z_1 = d_{e,V} Q_{s,U}$
- $Z = Z_1 || Z_2$
we can prevent KCI attacks without compromising any other assurance given by the scheme.
I understand that this breaks the symmetry between parties, i.e. now both parties must know which role they are in. But in my mind this would be a much simpler scheme if parties already know their roles, which is implicitly assumed for some other schemes by the way.
So, my question is, am I missing something here? Has this scheme got all the assurances given in "Table 23: Summary of assurances"?