







Crypto Forum Research Group                              David A. McGrew
Internet Draft                                       Cisco Systems, Inc.
Expires April, 2003                                        October, 2002



                          Integer Counter Mode
                       <draft-irtf-cfrg-icm-00.txt>


Status of this Memo

   This document is an Internet Draft and is in full conformance with
   all provisions of Section 10 of RFC-2026. Internet Drafts are working
   documents of the Internet Engineering Task Force (IETF), its areas,
   and working groups.  Note that other groups may also distribute
   working documents as Internet Drafts.

   Internet Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet Drafts as reference
   material or to cite them other than as "work in progress."

     The list of current Internet-Drafts can be accessed at
     http://www.ietf.org/ietf/1id-abstracts.txt

     The list of Internet-Draft Shadow Directories can be accessed at
     http://www.ietf.org/shadow.html.


1. Abstract


  This document specifies Integer Counter Mode (ICM), a mode of
  operation of a block cipher which defines an indexed keystream
  generator (which generates a keystream segment given an index).
  This mode is efficient, parallelizable, and has been proven secure
  given realistic assumptions about the block cipher.  Test vectors
  are provided for AES.

  Counter Mode admits many variations.  The variant specified in
  this document is secure and flexible, yet it enables a single
  implementation of a keystream generator to suffice in different
  application domains.






McGrew                                                          [Page 1]


Internet Draft            Integer Counter Mode             October, 2002


2. Notational Conventions

  The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
  "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in
  this document are to be interpreted as described in RFC-2119 [B97].


3. Introduction

  Counter Mode is a way to define a pseudorandom keystream generator
  using a block cipher [CTR].  The keystream can be used for additive
  encryption, key derivation, or any other application requiring
  pseudorandom data.

  In ICM, the keystream is logically broken into segments.  Each
  segment is identified with a segment index, and the segments have
  equal lengths.  This segmentation makes ICM especially appropriate
  for securing packet-based protocols.


4. ICM

  In this section, ICM keystream generation and encryption are
  defined.


4.1. ICM Parameters

  The following parameters are used in ICM.  These parameters MUST
  remain fixed for any given use of a key.

  Parameter              Meaning
  -----------------------------------------------------------------
  BLOCK_LENGTH           the number of octets in the cipher block
  KEY_LENGTH             the number of octets in the cipher key
  OFFSET_LENGTH          the number of octets in the offset
  SEGMENT_INDEX_LENGTH   the number of octets in the segment index
  BLOCK_INDEX_LENGTH     the number of octets in the block index


4.2. Keystream Segments

  Conceptually, ICM is a keystream generator that takes a secret key
  and a segment index as an input and then outputs a keystream
  segment.  The segmentation lends itself to packet encryption, as
  each keystream segment can be used to encrypt a distinct packet.

  A counter is a value containing BLOCK_LENGTH octets which is



McGrew                                                          [Page 2]


Internet Draft            Integer Counter Mode             October, 2002


  incremented using an increment function based on integer addition,
  to produce a sequence of distinct values which are used as inputs to
  the block cipher.  (In the context of this specification, an integer
  is an octet string, the most significant of which is the first.)
  The output blocks of the cipher are concatenated to form the
  keystream segment.  The first octet of the segment is the first
  octet of the first output block, and so on.  A schematic of this
  process is shown in Figure 1.


  Figure 1.  The generation of a keystream segment given a segment
  index and a block cipher key K.  Here C[i] and S[i] denote the ith
  counter and keystream block, respectively.

        segment
         index
           |
           v
         C[0] -----> C[1] -----> C[2] -----> ...
           |           |           |
           v           v           v
         +---+       +---+       +---+
      K->| E |    K->| E |    K->| E |       ...
         +---+       +---+       +---+
           |           |           |
           v           v           v
         S[0]        S[1]        S[2]        ...

  The ith counter C[i] of the keystream segment with segment index s
  is defined as

   C[i] = (i + s * (256^BLOCK_INDEX_LENGTH)) (+) r

  where r denotes the shifted Offset, which is defined as the Offset
  times 256^(BLOCK_LENGTH - OFFSET_LENGTH).  (This multiplication
  left-shifts the Offset so that it is aligned with the leftmost
  edge of the block.)  Here ^ denotes exponentiation and (+) denotes
  the bitwise exclusive-or operation.

  The number of blocks in any segment MUST NOT exceed
  256^BLOCK_INDEX_LENGTH.  The number of segments MUST NOT exceed
  256^SEGMENT_INDEX_LENGTH.  These restrictions ensure the uniqueness
  of each block cipher input.  They also imply that each segment
  contains no more than (256^BLOCK_INDEX_LENGTH)*BLOCK_LENGTH octets.

  The sum of SEGMENT_INDEX_LENGTH and BLOCK_INDEX_LENGTH MUST NOT
  exceed BLOCK_LENGTH / 2.  This requirement protects the ICM
  keystream generator from potentially failing to be pseudorandom (see



McGrew                                                          [Page 3]


Internet Draft            Integer Counter Mode             October, 2002


  the rationale).

  Figure 2.  An illustration of the structure of a counter with
  BLOCK_LENGTH = 8, SEGMENT_INDEX_LENGTH = 2, and BLOCK_INDEX_LENGTH
  = 2.  The field marked `null' is not part of either the block
  or segment indices.

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                              null                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          segment index        |          block index          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


4.3. ICM Encryption

  Unless otherwise specified, ICM encryption consists of bitwise
  exclusive-oring the keystream into the plaintext to produce
  the ciphertext.


4.4 ICM KEY

  An ICM key consists of the block cipher key and an Offset.  The
  Offset is an integer with OFFSET_LENGTH octets, which is used to
  `randomize' the logical starting point of keystream.  The Offset is
  crucial to providing security; see the rationale.  The value of
  OFFSET_LENGTH SHOULD be at least half that of BLOCK_LENGTH.

  For the purposes of transporting an ICM key, e.g. in a signaling
  protocol, that key SHOULD be considered a sequence of octets in
  which the block cipher key precedes the Offset.


5. Implementation Considerations

  Implementation of the `add one modulo 2^m' operation is simple.  For
  example, with BLOCK_LENGTH = 8 (m=64), it can be implemented in C as

  if (!++x) ++y;

  where x and y are 32-bit unsigned integers in network byte order.
  The implementation of general purpose addition modulo 2^m is
  slightly more complicated.

  The fact that the Offset is left-aligned enables an implementation



McGrew                                                          [Page 4]


Internet Draft            Integer Counter Mode             October, 2002


  to avoid propagating carry values outside of the block index and/or
  the segment index.  Choosing an OFFSET_LENGTH value equal to half
  that of BLOCK_LENGTH avoids all of these carries, since the Offset
  is then shifted so that it occupies the most significant octets of
  the block, while the block and segment indices occupy the least
  significant ones.


6. Parameters and Test Vectors for AES

  This section provides ICM parameters and test vectors for AES
  with a 128 bit block size and 128 bit key (that is, with a
  BLOCK_LENGTH and KEY_LENGTH of 16).

  All integers are expressed in hexadecimal.  Each consecutive pair of
  hex digits corresponds to an octet, so that the integer
  000102030405060708090A0B0C0D0E0F corresponds to the octet sequence
  { 00, 01, 02, 02 ... }.

    BLOCK_LENGTH           16
    KEY_LENGTH             16
    OFFSET_LENGTH          14
    SEGMENT_INDEX_LENGTH   6
    BLOCK_INDEX_LENGTH     2

    Block Cipher Key:      2b7e151628aed2a6abf7158809cf4f3c
    Offset:                f0f1f2f3f4f5f6f7f8f9fafbfcfd
    Segment Index:         000000000000
    Keystream:             e03ead0935c95e80e166b16dd92b4eb4
                           d23513162b02d0f72a43a2fe4a5f97ab
                           ...

  The counter values that correspond to the keystream blocks are
  outlined below.

  Counter                            Keystream

  f0f1f2f3f4f5f6f7f8f9fafbfcfd0000   e03ead0935c95e80e166b16dd92b4eb4
  f0f1f2f3f4f5f6f7f8f9fafbfcfd0001   d23513162b02d0f72a43a2fe4a5f97ab
  f0f1f2f3f4f5f6f7f8f9fafbfcfd0002   41e95b3bb0a2e8dd477901e4fca894c0
  ...                                ...


7. Security Considerations

  Each block cipher input is distinct for any segment and any block
  index.  To see this fact, subtract any two counter values with
  distinct segment or block indices; the result is non-zero.



McGrew                                                          [Page 5]


Internet Draft            Integer Counter Mode             October, 2002


  The limitation on the number of segments which can be generated
  ensures that the probability with which an adversary can distinguish
  the keystream generator from random is negligible.  For a
  theoretical justification of this fact, see Bellare et. al. [BR98].
  Their analysis shows that if the block cipher cannot be
  distinguished from a random permutation, then the keystream
  generated by ICM cannot be distinguished from keystream generated by
  a truly random process, as long as the length of keystream which is
  generated is kept below some threshold.  The threshold defined in
  Section 4.2 is sufficient for most uses of ICM for encryption.  This
  specification refrains from dictating a lower threshold in order to
  refrain from dictating a particular policy, and to avoid a
  complicated digression.

  The use of the Offset, a key-dependent value which randomizes the
  starting position of the keystream, is essential for security.  The
  omission of this mechanism leaves the door open for practical
  attacks, such as the key collision attack and Hellman's time-memory
  tradeoff attack; see McGrew and Fluhrer [MF00] for a description of
  these attacks which is applicable to ICM.  Several counter mode
  proposals do not include an offset, and are thus vulnerable to these
  attacks.


8. Rationale

  This speficiation includes input from implementation experience with
  several counter mode variants.  The goals of ICM are to provide:

    o a secure keystream generator and cipher, and

    o a definition flexible enough that a single implementation can be
      used for a variety of applications (e.g., Secure RTP [SRTP],
      IPsec ESP [KA96]).

  The Offset slightly increases the key management overhead, but this
  minor disadvantage is well outweighed by other savings.  The Offset
  is no larger than a CBC mode IV, and ICM enables the use of an
  explicit IV (as is commonly used with CBC [MD98]) to be avoided.


9. History

  This draft is based on draft-mcgrew-saag-icm-00.txt, which was
  submitted to SAAG on November, 2001 and which expired in May, 2002.

  The current definition of ICM has changed from the earlier one; the
  counter formation is different and the specifications are



McGrew                                                          [Page 6]


Internet Draft            Integer Counter Mode             October, 2002


  unfortunately not interoperable.  This change was motivated by a
  considerable amount of feedback on the desirability of admitting
  optimizations of the sort described in Section 5, in which the carry
  operations of counter addition need not be propagated across a large
  register.

  The current definition of ICM is interoperable with that defined in
  Secure RTP [SRTP].


10. Acknowledgements

  Thanks are due to Helger Lipmaa, Jerome Etienne, Scott Fluhrer and
  Mats Naslund for their helpful discussion and comments.


11. Contact Information

  Questions and comments on this draft SHOULD be sent to:

  David A. McGrew
  Cisco Systems, Inc.
  mcgrew@cisco.com

  and copied to the Crypto Forum Research Group at:

  cfrg@ietf.org.


12. References


  [BR98]  M. Bellare, A. Desai, E. Lokipii and P. Rogaway, A
          Concrete Security Treatment of Symmetric Encryption:
          Analysis of DES Modes of Operation, Proceedings of
          the 38th Symposium on Foundations of Computer
          Science, IEEE, 1997.

  [B97]   S. Bradner, Key words for use in RFCs to Indicate
          Requirement Levels, RFC 2119, March 1997.

  [AES]   The Advanced Encryption Standard, United States
          National Institute for Standards and Technology (NIST),
          http://www.nist.gov/aes/.

  [CTR]   M. Dworkin, NIST Special Publication 800-38A,
          "Recommendation for Block Cipher Modes of Operation: Methods
          and Techniques",  2001.  Online at



McGrew                                                          [Page 7]


Internet Draft            Integer Counter Mode             October, 2002


          http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-
          38a.pdf.

  [MD98]  Madson, C., and Doraswamy, N., "The ESP DES-CBC Cipher
          Algorithm With Explicit IV", RFC 2405, November 1998.

  [MF00]  D. McGrew and S. Fluhrer, Attacks on Additive Encryption and
          Implications on Internet Security, Selected Areas in
          Cryptography 2000.

  [SRTP]  The Secure Real-time Transport Protocol, Baugher et. al.,
          Internet Draft, draft-ietf-avt-srtp-05.txt.







































McGrew                                                          [Page 8]


