浏览代码

stream/chacha - improved counter increment

Karel Miko 8 年之前
父节点
当前提交
90b482aa1e
共有 1 个文件被更改,包括 8 次插入2 次删除
  1. 8 2
      src/stream/chacha/chacha_crypt.c

+ 8 - 2
src/stream/chacha/chacha_crypt.c

@@ -71,8 +71,14 @@ int chacha_crypt(chacha_state *st, const unsigned char *in, unsigned long inlen,
    }
    }
    for (;;) {
    for (;;) {
      _chacha_block(buf, st->input, st->rounds);
      _chacha_block(buf, st->input, st->rounds);
-     /* increment the counter */
-     if (!++st->input[12] && !++st->input[13] && !++st->input[14]) { ++st->input[15]; }
+     if (st->ivlen == 8) {
+       /* IV-64bit, increment 64bit counter */
+       if (0 == ++st->input[12] && 0 == ++st->input[13]) return CRYPT_OVERFLOW;
+     }
+     else {
+       /* IV-96bit, increment 32bit counter */
+       if (0 == ++st->input[12]) return CRYPT_OVERFLOW;
+     }
      if (inlen <= 64) {
      if (inlen <= 64) {
        for (i = 0; i < inlen; ++i) out[i] = in[i] ^ buf[i];
        for (i = 0; i < inlen; ++i) out[i] = in[i] ^ buf[i];
        st->ksleft = 64 - inlen;
        st->ksleft = 64 - inlen;