6 /* nettle, low-level cryptographics library
8 * Copyright (C) 2005 Niels Möller
10 * The nettle library is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU Lesser General Public License as published by
12 * the Free Software Foundation; either version 2.1 of the License, or (at your
13 * option) any later version.
15 * The nettle library is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
18 * License for more details.
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with the nettle library; see the file COPYING.LIB. If not, write to
22 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
37 #include "nettle-internal.h"
39 #define INCREMENT(size, counter, i) \
41 if (++(ctr)[(size) - 1] == 0) \
43 unsigned i = size - 1; \
44 while (i > 0 && ++(ctr)[--i] == 0) \
50 ctr_crypt(void *ctx, nettle_crypt_func f,
51 unsigned block_size, uint8_t *ctr,
52 unsigned length, uint8_t *dst,
55 TMP_DECL(buffer, uint8_t, NETTLE_MAX_CIPHER_BLOCK_SIZE);
56 TMP_ALLOC(buffer, block_size);
60 for (; length >= block_size; length -= block_size, src += block_size, dst += block_size)
62 f(ctx, block_size, dst, ctr);
63 memxor(dst, src, block_size);
64 INCREMENT(block_size, ctr, i);
69 for (; length >= block_size; length -= block_size, src += block_size, dst += block_size)
71 f(ctx, block_size, buffer, ctr);
72 memxor3(dst, src, buffer, block_size);
73 INCREMENT(block_size, ctr, i);
78 /* A final partial block */
80 f(ctx, block_size, buffer, ctr);
81 memxor3(dst, src, buffer, length);
82 INCREMENT(block_size, ctr, i);