[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[KEYPROV] DSKPP stateful 4-pass support and a variant to make it stateless
One of the
properties of DSKPP 4-pass is that the protocol is stateful. Ideally a stateless
protocol is the best for a web service. The 2-pass version of DSKPP is
stateless, which I consider perfect. In order to support the 4-pass state,
namely R_S sent in the 2nd pass KeyProvServerHello in the use of the 4-th pass
KeyProvServerFinished, I have the following suggestions.
1. Suggest that we
add some context in the DSKPP.
With HTTP
binding, it is recommended that a client keeps use of the same HTTP
connection for the 4-pass. When a service side provides provisioning server in
multiple sites, the client should help the server to reduce state replication
across servers or sites.
Note that there are
cases where a client has no control on the same connection, for example, a
request message is sent over the air where a proxy in carrier or web may forward
it to a different server other than the one for the first round
trip.
2. There is a way to
make 4-pass DSKPP stateless for a popular use case:
Use case: DSKPP
server has a RSA certificate but the client device and the server have no
preloaded encryption key. This is a typical use case for mobile device and TPM
chips in order to acquire a credential from a server and ensure end-to-end
security where a credential is only known to the device and the
server.
Stateless 4-pass
protocol variation:
Instead of using
mutual key generation, the KeyProvServerFinished returns the server generated
key as that in the 2-pass DSKPP variant. The key encryption key is the R_C that
is currently produced and used for key derivation.
By doing this, the
2nd pass is independent of the first pass where R_S is
removed.
The variation of
this profile is the following minor changes in schema and
specification:
*
KeyProvClientHello and the KeyProvServerHello remains the same. In the
KeyProvServerHello message, the server's public is sent as the encryption key to
transport client generated encryption key R_C.
* The
client is going to generate R_C as an encryption key instead of half-key for the
final key derivation.
*
KeyProvClientNonce remains the same. Optionally device information can be sent
in this request instead of KeyProvClientHello. The R_C is encrypted with the
server's public key as the current draft does.
*
KeyProvServerFinished schema remains the same. Only the KeyContainer will
include the secret key value as in the 2-pass case. The secret will be encrypted
with R_C. Currently the secret is derived from R_C, R_S, and the server's public
key.
The pros of this
extension is that it makes the protocol stateless. Moreover, it makes the
protocol simpler and consistent with 2-pass provisioning. The cons is that it is
subject to man-in-the-middle attack. A MITM may send its own certificate for a
client to encrypt and therefore gets a copy of secret sent between the client
and the server. Note that existing protocol is subject to MITM too; only MITM
cannot fool a server to generate a desired secret. With SSL transport layer and
additional authentication data we have placed in the protocol, this can be
mitigated. There is use case where additional device authentication data may be
available to mitigate MITM.
Thoughts? Thank
you,
-
Ming