[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Clarification on ISAKMP Commit-Bit



We would like a little authoritative clarification on the use of the Commit
bit.

I understand from the draft that support for receiving Commit is required
in all the Session Establishment exchanges. We see reason to use Commit in
all exchanges, as I discuss below.  Also some quick questions.

Question: I suppose it's correct to set the Commit bit on only the final
message I send.

Question: I suppose I can ignore a Commit bit in all messages received
except the final one.

Presumption: I presume it's wrong for me to set the Commit bit in an
exchange where I am not going to send the final message, and the other end
could give me "invalid flags".

Now, the question that bears discussion:

The ISAKMP draft is vague about exactly why anyone might choose to set the
Commit bit, and permissive about when one could expect it.

As I remember in discussion on this point on this mail list, a couple of
individuals expressed their particular reason for finding Commit useful,
and some seemed to be suggesting that there is no other reasonable use,
implying I suppose that one need not support it in other exchanges?

As best I remember, people put forth a scenario somewhat like this (don't
have the original so can't vouch for accuracy):

  o In Aggressive Mode, the Initiator receives the first response, which
    includes KE; at this point Initiator can complete generating the ISAKMP
    SA session keys.

  o Initiator makes the final message, with Hash; it does not want this
    message encrypted.  It sends the message out the socket to the kernel.

  o Initiator wants to stuff the keys down the PF Keys socket; the result of
    this will be the kernel will start encrypting for the ID pair.

    BUT: the daemon cannot find out whether the enqueued Hash message has
    gotten to IP output yet, so it cannot tell when it's okay to stuff in
    the keys.

  o By setting Commit, the Initiator demands the Notify from the Responder,
    and can wait for it before stuffing the keys.

But I saw another consideration making Commit useful, and it makes sense in
all the session establishment Exchanges:

  o The party who sends the last message of the exchange, would like
    assurance the final message arrives and is accepted.

    This can apply to all the exchanges: to Initiator in Quick or
    Aggressive mode and to Responder in Main Mode.  In all cases it is
    possible that the first traffic to go out after the exchange is
    complete, can originate with the party who sent the final exchange
    message.

    Without this assurance, the sender of the final message can perform
    encryption on the message to follow and wind up throwing it down a hole
    because the other didn't get the final message and cannot complete the
    SA; recovery from this is a dirty business.

  o If the sender of the final exchange message sets Commit, then there
    will be positive assurance the final message arrived and the SA is
    established on both sides.

    The sender now has a basis to time out and retransmit the final
    message.

    If the Notify(Connected) gets lost but the Responder sends encrypted
    data right after it, the Initiator system has these choices:

      o Retransmit the final message, AND/OR:

      o Recognize that the SA is already (provisionally) established; if
        the message can be authenticated, then mark the SA as fully
        established.

- John Burke