David Wierbowski writes:
> I see no reason why Host A MUST NOT immediately delete the old IKE SA.

Deleting the IKE SA immediately makes it impossible to know what
happened to other exchanges going on the same IKE SA. Waiting for 30
seconds or so after rekey would allow those other exchanges to finish
before the old IKE SA is deleted.

The current IKEv2 document does not specify what happens to the
ongoing exchanges when IKE SA is deleted. In normal case that does not
matter, as all the IKE SA state goes away when SA is deleted, thus it
is simply the case that all exchanges are immediately discarded and
all CHILD_SAs on the IKE SA are deleted.

This is not the case on the rekey case, as here there might be
CREATE_CHILD_SAs and other exchanges ongoing on the IKE SA when it is
rekeyed. Now if the IKE SA is deleted immediately without waiting
those to finish when rekey finishes the other end does not know what
the node deleting the IKE SA did for those exchanges. It might have
silently discarded them, or it might have already processed them but
their responses were lost because of network error etc. 

This causes the peers state to get out of sync, which will lead
problems and will cause IKE SAs to be deleted completely later.

> In fact I think is SHOULD immediately delete the old IKE SA.  By this
> I mean it should mark the SA as being deleted, it should send a delete
> payload, and it should refuse to create any additional SAs.

I agree it should mark the SA so that it is no longer used for the new
SAs initiated from this end, but the other end might have its own
exchanges ongoing when the rekey started, and waiting those to finish
makes protocol work better. When both end mark the old SA as being
"old", meaning no new exchanges are started on it, but old exchanges
are allowed to finished then when those old exchanges are finished,
then the old IKE SA should be deleted (and all operations done on the
old IKE SA should be moved to the winning SA).

> >    recv req1 <--
> >    send resp2: ... Nr2 ... -->
> Host A should respond with NO_ADDITIONAL SAS in this case because
> Host A did not detect a simultaneous rekey and should have immediately
> deleted the original IKE_SA.

NO_ADDITIONAL_SAS is not correct error for this case, as we are
talking about IKE SAs not about CHILD_SAs. The NO_ADDITIONAL_SAS
description clearly says it is used when no more CHILD_SAs are to be
used.

Sending some more suitable error could most likely also work, but
still the IKE SA cannot be deleted immediately. It can only be deleted
when ongoing exchanges have been finished.

I have not checked out if your suggested version works with all
possible combinations of simulatenous rekeys, but from the first look
it seems it might also work.

On the other hand there is no text indicating such behavior in the
IKEv2 document, so it is protocol change compared to the old text
which said that simulatenous rekey is processed by checking out the
nonces. The rekeys in this case are simulatenous even when Host A
didn't initially detect that.

> >  After sending that reply that also creates the second IKE SA B in
> >  Host A and then Host A can check all the four nonces and see which
> >  of them is lowest, and it will then move all the CHILD_SAs to that
> >  new IKE SA having lowest nonce unless they were already there (i.e.
> >  if the IKE SA A had lowest nonce, Host A has already moved the
> >  CHILD_SAs there, if IKE SA B had lowest nonce, host A needs to move
> >  CHILD_SAs from the IKE SA A to this IKE SA B, and start timer to
> >  delete IKE SA A).
> Why do you want to mandate all this complication for a case that will
> occur infrequently?  You are impacting every IKE_SA rekey, not just
> the simultaneous case.  I doubt that anybody delays the delete of an
> IKE_SA on a rekey based on RFC 4306.  At the very least I'm sure there
> are implementations that do not delay the delete.  Requiring this
> delay is a protocol change and one that I do not see the need for.

We do delay the delete, as we do want to wait for the ongoing
exchanges to finish. On the other hand we are almost only one of the
implementations who also implement the window size > 1, which means we
have cases where might have several CREATE_CHILD_SA exchanges
initiated by the host B ongoing when host A decides to do rekey on the
IKE SA.

That delay does not have anything to do with simultaneous rekey, it is
needed to allow the ongoing exchanges to finish before old IKE SA is
deleted.

On the other hand RFC4306 specifies exactly ONE way to handle
simulatenous rekey and that is by checking the nonces. The rekey is
simulatenous even when one host didn't immediately detect it as
simulatenous because some packet was lost.

I agree now that "MUST NOT immediately delete" was too strong, so
"SHOULD NOT immediately delete" is better. If implementation does not
implement larger window sizes, and is used in environments where there
is very limited number of CHILD SAs per IKE SA, so the probability of
getting CREATE_CHILD_SA just when other ends decides to rekey is so
small, that it does not matter even if the whole IKE SA gets deleted
in that case then it can ignore that SHOULD. 

> If Host A deletes the IKE_SA immediately then either Host B will see
> the delete and be able to infer that there is no simultaneous rekey or
> Host B may also get a NO_ADDITIONAL SAS notification and be able to
> infer that there is no simultaneous rekey.

Regardless what host A thinks there was still simultaneous rekey
ongoing, and RFC4306 gives only one way to solve that so sending error
in that case is against RFC4306. That is also protocol change.

If we do protocol change, I would rather make it so we always for
example make the original initiator to win in case of simulatenous IKE
SA rekey case, and not care about nonces at all...
-- 
kivi...@iki.fi
_______________________________________________
IPsec mailing list
IPsec@ietf.org
https://www.ietf.org/mailman/listinfo/ipsec

Reply via email to