Hi,
here are some comments on -02 QSKE draft to stimulate further discussion.
1. Nonces.
The draft specifies that each additional key exchange performed
over IKE_AUX includes new nonces. My question - why nonces exchanged
during IKE_SA_INIT cannot be used instead? Is it critical for security?
I have no problem with exchanging new nonces in each IKE_AUX,
my concern is that while performing authentication only the nonces
exchanged in IKE_SA_INIT are covered by the signature. For example
for initiator:
InitiatorSignedOctets = RealMessage1 | NonceRData | MACedIDForI
where NonceRData is the content of the responder's nonce from IKE_SA_INIT.
Currently IKE_AUX draft doesn't redefine this, except that it adds
initiator's
IKE_AUX content into the calculation. Is it OK, or should we modify AUTH
payload
calculation in case QSKE is used? In particular - include all the peer's
nonces from IKE_AUX exchanges in NonceRData?
2. QSKE negotiation.
I still think that we can use the existing negotiation mechanism instead of
defining an additional one. I don't think we should consider the argument
that now there are buggy implementations out there, since we're
developing a long term solution.
How it can be done with existing mechanism.
First approach, classical: we define new transform types as follows:
Transform Type 6: QSKE of type 1 (say lattice based)
Transform Type 7: QSKE of type 2 (say isogeny based)
Transform Type 8: QSKE of type 3 (say code based)
etc.
In this case list of Transform IDs for each new Transform Type will be
different - only relevant
algorithms must be included. In addition some QSKE Transform IDs with a
small public key
(regardless of type) will also be added to the list of possible Transform
IDs for Transform Type 4.
With this approach there's no strict mapping from QSKE to IKE_AUX, actually
all the
selected QSKE can be put together into single IKE_AUX exchange or can be
performed
one after one in a series of IKE_AUX exchanges. The latter seems more
natural
and is in line with current QSKE draft. Note, that KE from Transform Type 4
will
always be performed in IKE_SA_INIT. If QSKEs are performed in a series of
IKE_AUX,
the order of them is not defined explicitly. Either we decide that the order
is not imported
(if it is OK from security PoV), or the order will be implicitly defined by
the order
of new Transform Types (6 and up) in initiator's proposal (there is no
requirement in RFC 7296 that
responder keep the order of Transform Types in a response).
This approach has a potential problem: if more types of QSKE appear this
will require to add
new Transform Types. Since old implementations are unaware of these types
(even if they are
aware of Types 6, 7, 8 etc), policy need to be written in such a way,
that proposals are doubled - one with new types and one without them.
This will increase the size of SA payload. This problem can be dealt with
if we define spare Transform Types beforehand - so as the same time
as Transform Types 6-8 are defined for known types of QSKE,
we can define also Transform Types 9, 10, 11 and so on (how many is enough?)
for yet unknown types of QSKE (populated only with NONE Transform ID for
now).
With this "hack" all new implementations will know what these transforms are
and won't reject proposals with them.
Another problem with this approach is that if we want to express policy
"perform single QSKE of any type" then the number of proposals would
grow, since initiator has to include all the new Transform Types
in each proposal including NONE Transform ID in all but one Transform Type,
different in each proposal.
For these reasons I think a different approach is more convenient: we define
new transform types as follows:
Transform Type 6: Additional QSKE performed in 1st IKE_AUX
Transform Type 7: Additional QSKE performed in 2nd IKE_AUX
Transform Type 8: Additional QSKE performed in 3rd IKE_AUX
etc. (How many do we want to combine?)
The same list of possible Transform IDs representing QSKE methods will be
defined
for each of these new Transform Types. In addition these QSKE Transform IDs
(or some of them with a small enough public key) will also be added to the
list
of possible Transform IDs for Transform Type 4.
This approach is flexible enough to define various policies:
- don't use QSKE
- use a single QSKE (in addition to classical KE)
- use combination of no less than two (three, etc) QSKEs
The SA payload may still grow if you want to restrict which QSKE methods
can be combined with which ones.
Comparing to the separate negotiation mechanism proposed in the draft:
- it seems that using SA Proposals is clearer than separate mechanism
- in case of complex policies the size of SA payload may grow, so the size
of IKE_SA_INIT request may be larger than with the draft's negotiation
mechanism. I still hope that we can avoid the necessity of complex
policies, but if this is a concern, we may consider the draft
draft-smyslov-ipsecme-ikev2-compact-04 "Compact Format of IKEv2 Payloads",
which allows to substantially reduce the size of SA payload.
Any thoughts?
3. CREATE_CHILD_SA
The draft currently is silent about using QSKE in CREATE_CHILD_SA exchange.
However it seems that QSKE methods must also be supported in this
exchange (at least for IKE SA rekeying). IKE_AUX is specifically designed
to be used between IKE_SA_INIT and IKE_AUTH, so either we must
modify CREATE_CHILD_SA to allow multiple KE payloads or define
some new exchange. My concern is that sending all QSKE payloads
in one message may result in a very large number of fragments, that would
potentially decrease protocol reliability on a lossy networks (if any
single
fragment is lost all fragments must be resent). With IKE_AUX QSKE
are performed one by one, so the number of fragments will be less.
If this is a concern, then some mechanisms need to be defined
that allow to perform QSKE one by one even in CREATE_CHILD_SA.
For example, perform a series of INFORMATIONAL exchanges
linked to CREATE_CHILD_SA to complete QS key exchange:
Initiator Responder
-------------------------------------------------------------------
HDR, SK {SA, Ni, KEi} -->
<-- HDR, SK {SA, Nr, KEr, N(ExchangeID1)}
since initiator proposed and responder agreed upon that
one or more QSKE need to be performed, the new SA is not
created at this point, instead the responder returns some
Exchange ID in a new notification (this Exchange ID allows
to link INFORMATIONAL exchanges with the CREATE_CHILD_SA
and with subsequent INFORMATIONAL). Then initiator starts
series of INFORMATIONAL exchanges (one by one) to complete
key exchange with QS methods:
Initiator Responder
-------------------------------------------------------------------
HDR, SK { N(ExchangeID1), N1i, QSKe1i,} -->
<-- HDR, SK { N1r, QSKe1r, N(ExchangeID2)}
HDR, SK { N(ExchangeID2), N2i, QSKe2i,} -->
<-- HDR, SK { N2r, QSKe2r, N(ExchangeID3)}
HDR, SK { N(ExchangeID3), N3i, QSKe3i,} -->
<-- HDR, SK { N3r, QSKe3r}
At this point all key are exchanged, so the SA is created.
Any ideas?
Regards,
Valery.
_______________________________________________
IPsec mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/ipsec