diff options
author | Niels Möller <nisse@lysator.liu.se> | 2011-02-06 21:53:03 +0100 |
---|---|---|
committer | Niels Möller <nisse@lysator.liu.se> | 2011-02-06 21:53:03 +0100 |
commit | cca7d2b2358ee5cc24bbf700ab4c91bfb41ca9ea (patch) | |
tree | 0bacba35e80416fa171b0da28e3d8f4f069eae78 /gcmdata.c | |
parent | dbe7d8bea741e7e1535feddf2cfee1fb75669805 (diff) | |
download | nettle-cca7d2b2358ee5cc24bbf700ab4c91bfb41ca9ea.tar.gz |
(main): New file.
Rev: nettle/gcmdata.c:1.1
Diffstat (limited to 'gcmdata.c')
-rw-r--r-- | gcmdata.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/gcmdata.c b/gcmdata.c new file mode 100644 index 00000000..06584431 --- /dev/null +++ b/gcmdata.c @@ -0,0 +1,80 @@ +/* gcmdata.c + * + * Galois counter mode, specified by NIST, + * http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf + * + */ + +/* Generation of fixed multiplication tables. */ + +/* nettle, low-level cryptographics library + * + * Copyright (C) 2011 Niels Möller + * + * The nettle library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at your + * option) any later version. + * + * The nettle library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the nettle library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + */ +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include <stdio.h> +#include <stdlib.h> + +#define GHASH_POLYNOMIAL 0xE1 + + +/* When x is shifted out over the block edge, add multiples of the + defining polynomial to eliminate each bit. */ +static unsigned +reduce(unsigned x) +{ + unsigned p = GHASH_POLYNOMIAL << 1; + unsigned y = 0; + for (; x; x >>= 1, p <<= 1) + if (x & 1) + y ^= p; + return y; +} + +int +main(int argc UNUSED, char **argv UNUSED) +{ + unsigned i; + printf("4-bit table:\n"); + + for (i = 0; i<16; i++) + { + unsigned x; + if (i && !(i%8)) + printf("\n"); + + x = reduce(i << 4); + printf("W(%02x,%02x),", x >> 8, x & 0xff); + } + printf("\n\n"); + printf("8-bit table:\n"); + for (i = 0; i<256; i++) + { + unsigned x; + if (i && !(i%8)) + printf("\n"); + + x = reduce(i); + printf("W(%02x,%02x),", x >> 8, x & 0xff); + } + printf("\n"); + return EXIT_SUCCESS; +} |