]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
New function chacha_set_nonce96.
authorNiels Möller <nisse@lysator.liu.se>
Fri, 30 Jan 2015 13:37:59 +0000 (14:37 +0100)
committerNiels Möller <nisse@lysator.liu.se>
Fri, 30 Jan 2015 13:37:59 +0000 (14:37 +0100)
ChangeLog
chacha-set-nonce.c
chacha.h
testsuite/chacha-test.c

index 00007fe09662484fd194300d7facea7dd44cb96f..01ee15591d3882d3af32cf7ffcfafa95a1623875 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-01-30  Niels Möller  <nisse@lysator.liu.se>
+
+       * chacha-set-nonce.c (chacha_set_nonce96): New function.
+       * chacha.h (CHACHA_NONCE96_SIZE): New constant.
+       * testsuite/chacha-test.c: Add test for chacha with 96-bit nonce.
+
 2015-01-27  Niels Möller  <nisse@lysator.liu.se>
 
        * ecc.h: Deleted declarations of unused itch functions. Moved
index e73babcef23f735806e701812b72dc8a042a2635..607f176b2fd851af348af89e0a93e97724f670a0 100644 (file)
@@ -59,3 +59,12 @@ chacha_set_nonce(struct chacha_ctx *ctx, const uint8_t *nonce)
   ctx->state[14] = LE_READ_UINT32(nonce + 0);
   ctx->state[15] = LE_READ_UINT32(nonce + 4);
 }
+
+void
+chacha_set_nonce96(struct chacha_ctx *ctx, const uint8_t *nonce)
+{
+  ctx->state[12] = 0;
+  ctx->state[13] = LE_READ_UINT32(nonce + 0);
+  ctx->state[14] = LE_READ_UINT32(nonce + 4);
+  ctx->state[15] = LE_READ_UINT32(nonce + 8);
+}
index 41df707676e28a17d64b5cc5b5419dc654576c5a..3f08283473976b2c7ec5033d53cc87735b5208fc 100644 (file)
--- a/chacha.h
+++ b/chacha.h
@@ -45,6 +45,7 @@ extern "C" {
 /* Name mangling */
 #define chacha_set_key nettle_chacha_set_key
 #define chacha_set_nonce nettle_chacha_set_nonce
+#define chacha_set_nonce96 nettle_chacha_set_nonce96
 #define chacha_crypt nettle_chacha_crypt
 #define _chacha_core _nettle_chacha_core
 
@@ -52,6 +53,7 @@ extern "C" {
 #define CHACHA_KEY_SIZE 32
 #define CHACHA_BLOCK_SIZE 64
 #define CHACHA_NONCE_SIZE 8
+#define CHACHA_NONCE96_SIZE 12
 
 #define _CHACHA_STATE_LENGTH 16
 
@@ -77,6 +79,9 @@ chacha_set_key(struct chacha_ctx *ctx, const uint8_t *key);
 void
 chacha_set_nonce(struct chacha_ctx *ctx, const uint8_t *nonce);
 
+void
+chacha_set_nonce96(struct chacha_ctx *ctx, const uint8_t *nonce);
+
 void
 chacha_crypt(struct chacha_ctx *ctx, size_t length, 
              uint8_t *dst, const uint8_t *src);
index 8c5630da320991e1b8509dee0988c4b5684f96c2..9edb9410ee514bf17035ea7c3756a73d02749395 100644 (file)
@@ -44,20 +44,30 @@ test_chacha(const struct tstring *key, const struct tstring *nonce,
 
   ASSERT (key->length == CHACHA_KEY_SIZE);
   chacha_set_key (&ctx, key->data);
-  ASSERT (nonce->length == CHACHA_NONCE_SIZE);
 
   if (rounds == 20)
     {
       uint8_t *data = xalloc (expected->length + 2);
-      data++;
       size_t length;
+      data++;
 
       for (length = 1; length <= expected->length; length++)
        {
          data[-1] = 17;
          memset (data, 0, length);
          data[length] = 17;
-         chacha_set_nonce(&ctx, nonce->data);
+         if (nonce->length == CHACHA_NONCE_SIZE)
+           chacha_set_nonce(&ctx, nonce->data);
+         else if (nonce->length == CHACHA_NONCE96_SIZE)
+           {
+             chacha_set_nonce96(&ctx, nonce->data);
+             /* Use initial counter 1, for
+                draft-irtf-cfrg-chacha20-poly1305-08 test cases. */
+             ctx.state[12]++;
+           }
+         else
+           die ("Bad nonce size %u.\n", (unsigned) nonce->length);
+
          chacha_crypt (&ctx, length, data, data);
 
          ASSERT (data[-1] == 17);
@@ -84,6 +94,7 @@ test_chacha(const struct tstring *key, const struct tstring *nonce,
         numbers of rounds. */
       uint32_t out[_CHACHA_STATE_LENGTH];
       ASSERT (expected->length == CHACHA_BLOCK_SIZE);
+      ASSERT (nonce->length == CHACHA_NONCE_SIZE);
 
       chacha_set_nonce(&ctx, nonce->data);
       _chacha_core (out, ctx.state, rounds);
@@ -622,4 +633,14 @@ test_main(void)
                   "ae2c4c90225ba9ea 14d518f55929dea0"
                   "98ca7a6ccfe61227 053c84e49a4a3332"),
              20);
+
+  /* From draft-irtf-cfrg-chacha20-poly1305-08, with 96-bit nonce */
+  test_chacha(SHEX("0001020304050607 08090a0b0c0d0e0f"
+                  "1011121314151617 18191a1b1c1d1e1f"),
+             SHEX("000000090000004a 00000000"),
+             SHEX("10f1e7e4d13b5915 500fdd1fa32071c4"
+                  "c7d1f4c733c06803 0422aa9ac3d46c4e"
+                  "d2826446079faa09 14c2d705d98b02a2"
+                  "b5129cd1de164eb9 cbd083e8a2503c4e"),
+             20);
 }