From caadb7572d9dec4e2ab55ea9e1d31956c24685e4 Mon Sep 17 00:00:00 2001 From: Alexey Dobriyan Date: Mon, 2 Jan 2012 05:51:55 +0300 Subject: [PATCH] crhash: whirlpool: precalculate \theta . \pi . \gamma --- hash-whirlpool.c | 2632 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 2339 insertions(+), 293 deletions(-) rewrite hash-whirlpool.c (85%) diff --git a/hash-whirlpool.c b/hash-whirlpool.c dissimilarity index 85% index 72b7282..23ab3af 100644 --- a/hash-whirlpool.c +++ b/hash-whirlpool.c @@ -1,293 +1,2339 @@ -#include -#include -#include - -#include "hash-whirlpool.h" - -static const uint8_t S[256] = { - 0x18, 0x23, 0xC6, 0xE8, 0x87, 0xB8, 0x01, 0x4F, 0x36, 0xA6, 0xD2, 0xF5, 0x79, 0x6F, 0x91, 0x52, - 0x60, 0xBC, 0x9B, 0x8E, 0xA3, 0x0C, 0x7B, 0x35, 0x1D, 0xE0, 0xD7, 0xC2, 0x2E, 0x4B, 0xFE, 0x57, - 0x15, 0x77, 0x37, 0xE5, 0x9F, 0xF0, 0x4A, 0xDA, 0x58, 0xC9, 0x29, 0x0A, 0xB1, 0xA0, 0x6B, 0x85, - 0xBD, 0x5D, 0x10, 0xF4, 0xCB, 0x3E, 0x05, 0x67, 0xE4, 0x27, 0x41, 0x8B, 0xA7, 0x7D, 0x95, 0xD8, - 0xFB, 0xEE, 0x7C, 0x66, 0xDD, 0x17, 0x47, 0x9E, 0xCA, 0x2D, 0xBF, 0x07, 0xAD, 0x5A, 0x83, 0x33, - 0x63, 0x02, 0xAA, 0x71, 0xC8, 0x19, 0x49, 0xD9, 0xF2, 0xE3, 0x5B, 0x88, 0x9A, 0x26, 0x32, 0xB0, - 0xE9, 0x0F, 0xD5, 0x80, 0xBE, 0xCD, 0x34, 0x48, 0xFF, 0x7A, 0x90, 0x5F, 0x20, 0x68, 0x1A, 0xAE, - 0xB4, 0x54, 0x93, 0x22, 0x64, 0xF1, 0x73, 0x12, 0x40, 0x08, 0xC3, 0xEC, 0xDB, 0xA1, 0x8D, 0x3D, - 0x97, 0x00, 0xCF, 0x2B, 0x76, 0x82, 0xD6, 0x1B, 0xB5, 0xAF, 0x6A, 0x50, 0x45, 0xF3, 0x30, 0xEF, - 0x3F, 0x55, 0xA2, 0xEA, 0x65, 0xBA, 0x2F, 0xC0, 0xDE, 0x1C, 0xFD, 0x4D, 0x92, 0x75, 0x06, 0x8A, - 0xB2, 0xE6, 0x0E, 0x1F, 0x62, 0xD4, 0xA8, 0x96, 0xF9, 0xC5, 0x25, 0x59, 0x84, 0x72, 0x39, 0x4C, - 0x5E, 0x78, 0x38, 0x8C, 0xD1, 0xA5, 0xE2, 0x61, 0xB3, 0x21, 0x9C, 0x1E, 0x43, 0xC7, 0xFC, 0x04, - 0x51, 0x99, 0x6D, 0x0D, 0xFA, 0xDF, 0x7E, 0x24, 0x3B, 0xAB, 0xCE, 0x11, 0x8F, 0x4E, 0xB7, 0xEB, - 0x3C, 0x81, 0x94, 0xF7, 0xB9, 0x13, 0x2C, 0xD3, 0xE7, 0x6E, 0xC4, 0x03, 0x56, 0x44, 0x7F, 0xA9, - 0x2A, 0xBB, 0xC1, 0x53, 0xDC, 0x0B, 0x9D, 0x6C, 0x31, 0x74, 0xF6, 0x46, 0xAC, 0x89, 0x14, 0xE1, - 0x16, 0x3A, 0x69, 0x09, 0x70, 0xB6, 0xD0, 0xED, 0xCC, 0x42, 0x98, 0xA4, 0x28, 0x5C, 0xF8, 0x86, -}; - -static void gamma(uint8_t a[8][8], uint8_t b[8][8]) -{ - unsigned int i, j; - - for (i = 0; i < 8; i++) - for (j = 0; j < 8; j++) - b[i][j] = S[a[i][j]]; -} - -static void pi(uint8_t a[8][8], uint8_t b[8][8]) -{ - unsigned int i, j; - - for (i = 0; i < 8; i++) - for (j = 0; j < 8; j++) - b[i][j] = a[(i - j) % 8][j]; -} - -/* GF(2^8) = GF(2)[x] / x^8 + x^4 + x^3 + x^2 + 1 */ -static const uint8_t _02[256] = { - 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x1E, - 0x20, 0x22, 0x24, 0x26, 0x28, 0x2A, 0x2C, 0x2E, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3A, 0x3C, 0x3E, - 0x40, 0x42, 0x44, 0x46, 0x48, 0x4A, 0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5A, 0x5C, 0x5E, - 0x60, 0x62, 0x64, 0x66, 0x68, 0x6A, 0x6C, 0x6E, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7A, 0x7C, 0x7E, - 0x80, 0x82, 0x84, 0x86, 0x88, 0x8A, 0x8C, 0x8E, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9A, 0x9C, 0x9E, - 0xA0, 0xA2, 0xA4, 0xA6, 0xA8, 0xAA, 0xAC, 0xAE, 0xB0, 0xB2, 0xB4, 0xB6, 0xB8, 0xBA, 0xBC, 0xBE, - 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE, 0xD0, 0xD2, 0xD4, 0xD6, 0xD8, 0xDA, 0xDC, 0xDE, - 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEC, 0xEE, 0xF0, 0xF2, 0xF4, 0xF6, 0xF8, 0xFA, 0xFC, 0xFE, - 0x1D, 0x1F, 0x19, 0x1B, 0x15, 0x17, 0x11, 0x13, 0x0D, 0x0F, 0x09, 0x0B, 0x05, 0x07, 0x01, 0x03, - 0x3D, 0x3F, 0x39, 0x3B, 0x35, 0x37, 0x31, 0x33, 0x2D, 0x2F, 0x29, 0x2B, 0x25, 0x27, 0x21, 0x23, - 0x5D, 0x5F, 0x59, 0x5B, 0x55, 0x57, 0x51, 0x53, 0x4D, 0x4F, 0x49, 0x4B, 0x45, 0x47, 0x41, 0x43, - 0x7D, 0x7F, 0x79, 0x7B, 0x75, 0x77, 0x71, 0x73, 0x6D, 0x6F, 0x69, 0x6B, 0x65, 0x67, 0x61, 0x63, - 0x9D, 0x9F, 0x99, 0x9B, 0x95, 0x97, 0x91, 0x93, 0x8D, 0x8F, 0x89, 0x8B, 0x85, 0x87, 0x81, 0x83, - 0xBD, 0xBF, 0xB9, 0xBB, 0xB5, 0xB7, 0xB1, 0xB3, 0xAD, 0xAF, 0xA9, 0xAB, 0xA5, 0xA7, 0xA1, 0xA3, - 0xDD, 0xDF, 0xD9, 0xDB, 0xD5, 0xD7, 0xD1, 0xD3, 0xCD, 0xCF, 0xC9, 0xCB, 0xC5, 0xC7, 0xC1, 0xC3, - 0xFD, 0xFF, 0xF9, 0xFB, 0xF5, 0xF7, 0xF1, 0xF3, 0xED, 0xEF, 0xE9, 0xEB, 0xE5, 0xE7, 0xE1, 0xE3, -}; - -static const uint8_t _04[256] = { - 0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C, 0x20, 0x24, 0x28, 0x2C, 0x30, 0x34, 0x38, 0x3C, - 0x40, 0x44, 0x48, 0x4C, 0x50, 0x54, 0x58, 0x5C, 0x60, 0x64, 0x68, 0x6C, 0x70, 0x74, 0x78, 0x7C, - 0x80, 0x84, 0x88, 0x8C, 0x90, 0x94, 0x98, 0x9C, 0xA0, 0xA4, 0xA8, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC, - 0xC0, 0xC4, 0xC8, 0xCC, 0xD0, 0xD4, 0xD8, 0xDC, 0xE0, 0xE4, 0xE8, 0xEC, 0xF0, 0xF4, 0xF8, 0xFC, - 0x1D, 0x19, 0x15, 0x11, 0x0D, 0x09, 0x05, 0x01, 0x3D, 0x39, 0x35, 0x31, 0x2D, 0x29, 0x25, 0x21, - 0x5D, 0x59, 0x55, 0x51, 0x4D, 0x49, 0x45, 0x41, 0x7D, 0x79, 0x75, 0x71, 0x6D, 0x69, 0x65, 0x61, - 0x9D, 0x99, 0x95, 0x91, 0x8D, 0x89, 0x85, 0x81, 0xBD, 0xB9, 0xB5, 0xB1, 0xAD, 0xA9, 0xA5, 0xA1, - 0xDD, 0xD9, 0xD5, 0xD1, 0xCD, 0xC9, 0xC5, 0xC1, 0xFD, 0xF9, 0xF5, 0xF1, 0xED, 0xE9, 0xE5, 0xE1, - 0x3A, 0x3E, 0x32, 0x36, 0x2A, 0x2E, 0x22, 0x26, 0x1A, 0x1E, 0x12, 0x16, 0x0A, 0x0E, 0x02, 0x06, - 0x7A, 0x7E, 0x72, 0x76, 0x6A, 0x6E, 0x62, 0x66, 0x5A, 0x5E, 0x52, 0x56, 0x4A, 0x4E, 0x42, 0x46, - 0xBA, 0xBE, 0xB2, 0xB6, 0xAA, 0xAE, 0xA2, 0xA6, 0x9A, 0x9E, 0x92, 0x96, 0x8A, 0x8E, 0x82, 0x86, - 0xFA, 0xFE, 0xF2, 0xF6, 0xEA, 0xEE, 0xE2, 0xE6, 0xDA, 0xDE, 0xD2, 0xD6, 0xCA, 0xCE, 0xC2, 0xC6, - 0x27, 0x23, 0x2F, 0x2B, 0x37, 0x33, 0x3F, 0x3B, 0x07, 0x03, 0x0F, 0x0B, 0x17, 0x13, 0x1F, 0x1B, - 0x67, 0x63, 0x6F, 0x6B, 0x77, 0x73, 0x7F, 0x7B, 0x47, 0x43, 0x4F, 0x4B, 0x57, 0x53, 0x5F, 0x5B, - 0xA7, 0xA3, 0xAF, 0xAB, 0xB7, 0xB3, 0xBF, 0xBB, 0x87, 0x83, 0x8F, 0x8B, 0x97, 0x93, 0x9F, 0x9B, - 0xE7, 0xE3, 0xEF, 0xEB, 0xF7, 0xF3, 0xFF, 0xFB, 0xC7, 0xC3, 0xCF, 0xCB, 0xD7, 0xD3, 0xDF, 0xDB, -}; - -static const uint8_t _05[256] = { - 0x00, 0x05, 0x0A, 0x0F, 0x14, 0x11, 0x1E, 0x1B, 0x28, 0x2D, 0x22, 0x27, 0x3C, 0x39, 0x36, 0x33, - 0x50, 0x55, 0x5A, 0x5F, 0x44, 0x41, 0x4E, 0x4B, 0x78, 0x7D, 0x72, 0x77, 0x6C, 0x69, 0x66, 0x63, - 0xA0, 0xA5, 0xAA, 0xAF, 0xB4, 0xB1, 0xBE, 0xBB, 0x88, 0x8D, 0x82, 0x87, 0x9C, 0x99, 0x96, 0x93, - 0xF0, 0xF5, 0xFA, 0xFF, 0xE4, 0xE1, 0xEE, 0xEB, 0xD8, 0xDD, 0xD2, 0xD7, 0xCC, 0xC9, 0xC6, 0xC3, - 0x5D, 0x58, 0x57, 0x52, 0x49, 0x4C, 0x43, 0x46, 0x75, 0x70, 0x7F, 0x7A, 0x61, 0x64, 0x6B, 0x6E, - 0x0D, 0x08, 0x07, 0x02, 0x19, 0x1C, 0x13, 0x16, 0x25, 0x20, 0x2F, 0x2A, 0x31, 0x34, 0x3B, 0x3E, - 0xFD, 0xF8, 0xF7, 0xF2, 0xE9, 0xEC, 0xE3, 0xE6, 0xD5, 0xD0, 0xDF, 0xDA, 0xC1, 0xC4, 0xCB, 0xCE, - 0xAD, 0xA8, 0xA7, 0xA2, 0xB9, 0xBC, 0xB3, 0xB6, 0x85, 0x80, 0x8F, 0x8A, 0x91, 0x94, 0x9B, 0x9E, - 0xBA, 0xBF, 0xB0, 0xB5, 0xAE, 0xAB, 0xA4, 0xA1, 0x92, 0x97, 0x98, 0x9D, 0x86, 0x83, 0x8C, 0x89, - 0xEA, 0xEF, 0xE0, 0xE5, 0xFE, 0xFB, 0xF4, 0xF1, 0xC2, 0xC7, 0xC8, 0xCD, 0xD6, 0xD3, 0xDC, 0xD9, - 0x1A, 0x1F, 0x10, 0x15, 0x0E, 0x0B, 0x04, 0x01, 0x32, 0x37, 0x38, 0x3D, 0x26, 0x23, 0x2C, 0x29, - 0x4A, 0x4F, 0x40, 0x45, 0x5E, 0x5B, 0x54, 0x51, 0x62, 0x67, 0x68, 0x6D, 0x76, 0x73, 0x7C, 0x79, - 0xE7, 0xE2, 0xED, 0xE8, 0xF3, 0xF6, 0xF9, 0xFC, 0xCF, 0xCA, 0xC5, 0xC0, 0xDB, 0xDE, 0xD1, 0xD4, - 0xB7, 0xB2, 0xBD, 0xB8, 0xA3, 0xA6, 0xA9, 0xAC, 0x9F, 0x9A, 0x95, 0x90, 0x8B, 0x8E, 0x81, 0x84, - 0x47, 0x42, 0x4D, 0x48, 0x53, 0x56, 0x59, 0x5C, 0x6F, 0x6A, 0x65, 0x60, 0x7B, 0x7E, 0x71, 0x74, - 0x17, 0x12, 0x1D, 0x18, 0x03, 0x06, 0x09, 0x0C, 0x3F, 0x3A, 0x35, 0x30, 0x2B, 0x2E, 0x21, 0x24, -}; - -static const uint8_t _08[256] = { - 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38, 0x40, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78, - 0x80, 0x88, 0x90, 0x98, 0xA0, 0xA8, 0xB0, 0xB8, 0xC0, 0xC8, 0xD0, 0xD8, 0xE0, 0xE8, 0xF0, 0xF8, - 0x1D, 0x15, 0x0D, 0x05, 0x3D, 0x35, 0x2D, 0x25, 0x5D, 0x55, 0x4D, 0x45, 0x7D, 0x75, 0x6D, 0x65, - 0x9D, 0x95, 0x8D, 0x85, 0xBD, 0xB5, 0xAD, 0xA5, 0xDD, 0xD5, 0xCD, 0xC5, 0xFD, 0xF5, 0xED, 0xE5, - 0x3A, 0x32, 0x2A, 0x22, 0x1A, 0x12, 0x0A, 0x02, 0x7A, 0x72, 0x6A, 0x62, 0x5A, 0x52, 0x4A, 0x42, - 0xBA, 0xB2, 0xAA, 0xA2, 0x9A, 0x92, 0x8A, 0x82, 0xFA, 0xF2, 0xEA, 0xE2, 0xDA, 0xD2, 0xCA, 0xC2, - 0x27, 0x2F, 0x37, 0x3F, 0x07, 0x0F, 0x17, 0x1F, 0x67, 0x6F, 0x77, 0x7F, 0x47, 0x4F, 0x57, 0x5F, - 0xA7, 0xAF, 0xB7, 0xBF, 0x87, 0x8F, 0x97, 0x9F, 0xE7, 0xEF, 0xF7, 0xFF, 0xC7, 0xCF, 0xD7, 0xDF, - 0x74, 0x7C, 0x64, 0x6C, 0x54, 0x5C, 0x44, 0x4C, 0x34, 0x3C, 0x24, 0x2C, 0x14, 0x1C, 0x04, 0x0C, - 0xF4, 0xFC, 0xE4, 0xEC, 0xD4, 0xDC, 0xC4, 0xCC, 0xB4, 0xBC, 0xA4, 0xAC, 0x94, 0x9C, 0x84, 0x8C, - 0x69, 0x61, 0x79, 0x71, 0x49, 0x41, 0x59, 0x51, 0x29, 0x21, 0x39, 0x31, 0x09, 0x01, 0x19, 0x11, - 0xE9, 0xE1, 0xF9, 0xF1, 0xC9, 0xC1, 0xD9, 0xD1, 0xA9, 0xA1, 0xB9, 0xB1, 0x89, 0x81, 0x99, 0x91, - 0x4E, 0x46, 0x5E, 0x56, 0x6E, 0x66, 0x7E, 0x76, 0x0E, 0x06, 0x1E, 0x16, 0x2E, 0x26, 0x3E, 0x36, - 0xCE, 0xC6, 0xDE, 0xD6, 0xEE, 0xE6, 0xFE, 0xF6, 0x8E, 0x86, 0x9E, 0x96, 0xAE, 0xA6, 0xBE, 0xB6, - 0x53, 0x5B, 0x43, 0x4B, 0x73, 0x7B, 0x63, 0x6B, 0x13, 0x1B, 0x03, 0x0B, 0x33, 0x3B, 0x23, 0x2B, - 0xD3, 0xDB, 0xC3, 0xCB, 0xF3, 0xFB, 0xE3, 0xEB, 0x93, 0x9B, 0x83, 0x8B, 0xB3, 0xBB, 0xA3, 0xAB, -}; - -static const uint8_t _09[256] = { - 0x00, 0x09, 0x12, 0x1B, 0x24, 0x2D, 0x36, 0x3F, 0x48, 0x41, 0x5A, 0x53, 0x6C, 0x65, 0x7E, 0x77, - 0x90, 0x99, 0x82, 0x8B, 0xB4, 0xBD, 0xA6, 0xAF, 0xD8, 0xD1, 0xCA, 0xC3, 0xFC, 0xF5, 0xEE, 0xE7, - 0x3D, 0x34, 0x2F, 0x26, 0x19, 0x10, 0x0B, 0x02, 0x75, 0x7C, 0x67, 0x6E, 0x51, 0x58, 0x43, 0x4A, - 0xAD, 0xA4, 0xBF, 0xB6, 0x89, 0x80, 0x9B, 0x92, 0xE5, 0xEC, 0xF7, 0xFE, 0xC1, 0xC8, 0xD3, 0xDA, - 0x7A, 0x73, 0x68, 0x61, 0x5E, 0x57, 0x4C, 0x45, 0x32, 0x3B, 0x20, 0x29, 0x16, 0x1F, 0x04, 0x0D, - 0xEA, 0xE3, 0xF8, 0xF1, 0xCE, 0xC7, 0xDC, 0xD5, 0xA2, 0xAB, 0xB0, 0xB9, 0x86, 0x8F, 0x94, 0x9D, - 0x47, 0x4E, 0x55, 0x5C, 0x63, 0x6A, 0x71, 0x78, 0x0F, 0x06, 0x1D, 0x14, 0x2B, 0x22, 0x39, 0x30, - 0xD7, 0xDE, 0xC5, 0xCC, 0xF3, 0xFA, 0xE1, 0xE8, 0x9F, 0x96, 0x8D, 0x84, 0xBB, 0xB2, 0xA9, 0xA0, - 0xF4, 0xFD, 0xE6, 0xEF, 0xD0, 0xD9, 0xC2, 0xCB, 0xBC, 0xB5, 0xAE, 0xA7, 0x98, 0x91, 0x8A, 0x83, - 0x64, 0x6D, 0x76, 0x7F, 0x40, 0x49, 0x52, 0x5B, 0x2C, 0x25, 0x3E, 0x37, 0x08, 0x01, 0x1A, 0x13, - 0xC9, 0xC0, 0xDB, 0xD2, 0xED, 0xE4, 0xFF, 0xF6, 0x81, 0x88, 0x93, 0x9A, 0xA5, 0xAC, 0xB7, 0xBE, - 0x59, 0x50, 0x4B, 0x42, 0x7D, 0x74, 0x6F, 0x66, 0x11, 0x18, 0x03, 0x0A, 0x35, 0x3C, 0x27, 0x2E, - 0x8E, 0x87, 0x9C, 0x95, 0xAA, 0xA3, 0xB8, 0xB1, 0xC6, 0xCF, 0xD4, 0xDD, 0xE2, 0xEB, 0xF0, 0xF9, - 0x1E, 0x17, 0x0C, 0x05, 0x3A, 0x33, 0x28, 0x21, 0x56, 0x5F, 0x44, 0x4D, 0x72, 0x7B, 0x60, 0x69, - 0xB3, 0xBA, 0xA1, 0xA8, 0x97, 0x9E, 0x85, 0x8C, 0xFB, 0xF2, 0xE9, 0xE0, 0xDF, 0xD6, 0xCD, 0xC4, - 0x23, 0x2A, 0x31, 0x38, 0x07, 0x0E, 0x15, 0x1C, 0x6B, 0x62, 0x79, 0x70, 0x4F, 0x46, 0x5D, 0x54, -}; - -#define _1(a) a -#define _2(a) _02[a] -#define _4(a) _04[a] -#define _5(a) _05[a] -#define _8(a) _08[a] -#define _9(a) _09[a] - -static void theta(uint8_t a[8][8], uint8_t b[8][8]) -{ - unsigned int i; - - for (i = 0; i < 8; i++) { - b[i][0] = _1(a[i][0]) ^ _9(a[i][1]) ^ _2(a[i][2]) ^ _5(a[i][3]) ^ _8(a[i][4]) ^ _1(a[i][5]) ^ _4(a[i][6]) ^ _1(a[i][7]); - b[i][1] = _1(a[i][0]) ^ _1(a[i][1]) ^ _9(a[i][2]) ^ _2(a[i][3]) ^ _5(a[i][4]) ^ _8(a[i][5]) ^ _1(a[i][6]) ^ _4(a[i][7]); - b[i][2] = _4(a[i][0]) ^ _1(a[i][1]) ^ _1(a[i][2]) ^ _9(a[i][3]) ^ _2(a[i][4]) ^ _5(a[i][5]) ^ _8(a[i][6]) ^ _1(a[i][7]); - b[i][3] = _1(a[i][0]) ^ _4(a[i][1]) ^ _1(a[i][2]) ^ _1(a[i][3]) ^ _9(a[i][4]) ^ _2(a[i][5]) ^ _5(a[i][6]) ^ _8(a[i][7]); - b[i][4] = _8(a[i][0]) ^ _1(a[i][1]) ^ _4(a[i][2]) ^ _1(a[i][3]) ^ _1(a[i][4]) ^ _9(a[i][5]) ^ _2(a[i][6]) ^ _5(a[i][7]); - b[i][5] = _5(a[i][0]) ^ _8(a[i][1]) ^ _1(a[i][2]) ^ _4(a[i][3]) ^ _1(a[i][4]) ^ _1(a[i][5]) ^ _9(a[i][6]) ^ _2(a[i][7]); - b[i][6] = _2(a[i][0]) ^ _5(a[i][1]) ^ _8(a[i][2]) ^ _1(a[i][3]) ^ _4(a[i][4]) ^ _1(a[i][5]) ^ _1(a[i][6]) ^ _9(a[i][7]); - b[i][7] = _9(a[i][0]) ^ _2(a[i][1]) ^ _5(a[i][2]) ^ _8(a[i][3]) ^ _1(a[i][4]) ^ _4(a[i][5]) ^ _1(a[i][6]) ^ _1(a[i][7]); - } -} - -static void sigma(uint8_t a[8][8], uint8_t k[8][8], uint8_t b[8][8]) -{ - unsigned int i, j; - - for (i = 0; i < 8; i++) - for (j = 0; j < 8; j++) - b[i][j] = a[i][j] ^ k[i][j]; -} - -static void rho(uint8_t a[8][8], uint8_t k[8][8], uint8_t b[8][8]) -{ - uint8_t a1[8][8], a2[8][8], a3[8][8]; - - gamma(a, a1); - pi(a1, a2); - theta(a2, a3); - sigma(a3, k, b); -} - -struct whirlpool_context { - uint8_t H[8][8]; - uint64_t len; - uint8_t m[512 / 8]; - unsigned int m_len; -}; - -static void __whirlpool_update(void *_ctx, const uint8_t *m) -{ - struct whirlpool_context *ctx = _ctx; - uint8_t W[8][8], K[8][8]; - unsigned int i, j; - int r; - - memcpy(K, ctx->H, 8 * 8); - memcpy(W, m, 8 * 8); - for (i = 0; i < 8; i++) - for (j = 0; j < 8; j++) - W[i][j] ^= K[i][j]; - -#define R 10 - for (r = 1; r <= R; r++) { - uint8_t K1[8][8], W1[8][8]; - uint8_t c[8][8]; - - memcpy(&c[0][0], &S[8 * (r - 1)], 8); - memset(&c[1][0], 0, (8 - 1) * 8); - rho(K, c, K1); - rho(W, K1, W1); - memcpy(K, K1, 8 * 8); - memcpy(W, W1, 8 * 8); - } - - for (i = 0; i < 8; i++) - for (j = 0; j < 8; j++) - ctx->H[i][j] ^= W[i][j] ^ m[8 * i + j]; -} - -void *whirlpool_init_context(void) -{ - struct whirlpool_context *ctx; - - ctx = malloc(sizeof(struct whirlpool_context)); - if (!ctx) - return NULL; - memset(ctx, 0, sizeof(struct whirlpool_context)); - return ctx; -} - -void whirlpool_fini_context(void *_ctx) -{ - struct whirlpool_context *ctx = _ctx; - - memset(ctx, 0, sizeof(struct whirlpool_context)); - free(ctx); -} - -void whirlpool_update(void *_ctx, const uint8_t *m) -{ - struct whirlpool_context *ctx = _ctx; - - __whirlpool_update(ctx, m); - ctx->len += 512; -} - -void _whirlpool_update(void *_ctx, const uint8_t *m, unsigned int len) -{ - struct whirlpool_context *ctx = _ctx; - - while (len > 0) { - unsigned int inc; - - if (64 - ctx->m_len < len) - inc = 64 - ctx->m_len; - else - inc = len; - memcpy(&ctx->m[ctx->m_len], m, inc); - ctx->m_len += inc; - ctx->len += inc * 8; - len -= inc; - m += inc; - - if (ctx->m_len == 512 / 8) { - __whirlpool_update(ctx, ctx->m); - ctx->m_len = 0; - } - } -} - -void whirlpool_fini(void *_ctx) -{ - struct whirlpool_context *ctx = _ctx; - - ctx->m[ctx->m_len] = 0x80; - ctx->m_len++; - if (ctx->m_len <= 64 - 32) { - memset(&ctx->m[ctx->m_len], 0, 64 - 8 - ctx->m_len); - } else { - memset(&ctx->m[ctx->m_len], 0, 64 - ctx->m_len); - __whirlpool_update(ctx, ctx->m); - memset(ctx->m, 0, 64 - 8); - } - *(uint64_t *)&ctx->m[64 - 8] = htobe64(ctx->len); - __whirlpool_update(ctx, ctx->m); -} - -void whirlpool_digest(void *_ctx, uint8_t *digest) -{ - struct whirlpool_context *ctx = _ctx; - - memcpy(digest, ctx->H, 8 * 8); -} +#include +#include +#include + +#include "hash-whirlpool.h" + +#define R 10 +static const uint64_t c[R] = { + 0x4f01b887e8c62318ULL, + 0x52916f79f5d2a636ULL, + 0x357b0ca38e9bbc60ULL, + 0x57fe4b2ec2d7e01dULL, + 0xda4af09fe5377715ULL, + 0x856ba0b10a29c958ULL, + 0x67053ecbf4105dbdULL, + 0xd8957da78b4127e4ULL, + 0x9e4717dd667ceefbULL, + 0x33835aad07bf2dcaULL, +}; + +static const uint64_t T0[256] = { + 0xd83078c018601818ULL, + 0x2646af05238c2323ULL, + 0xb891f97ec63fc6c6ULL, + 0xfbcd6f13e887e8e8ULL, + 0xcb13a14c87268787ULL, + 0x116d62a9b8dab8b8ULL, + 0x0902050801040101ULL, + 0x0d9e6e424f214f4fULL, + 0x9b6ceead36d83636ULL, + 0xff510459a6a2a6a6ULL, + 0x0cb9bdded26fd2d2ULL, + 0x0ef706fbf5f3f5f5ULL, + 0x96f280ef79f97979ULL, + 0x30dece5f6fa16f6fULL, + 0x6d3feffc917e9191ULL, + 0xf8a407aa52555252ULL, + 0x47c0fd27609d6060ULL, + 0x35657689bccabcbcULL, + 0x372bcdac9b569b9bULL, + 0x8a018c048e028e8eULL, + 0xd25b1571a3b6a3a3ULL, + 0x6c183c600c300c0cULL, + 0x84f68aff7bf17b7bULL, + 0x806ae1b535d43535ULL, + 0xf53a69e81d741d1dULL, + 0xb3dd4753e0a7e0e0ULL, + 0x21b3acf6d77bd7d7ULL, + 0x9c99ed5ec22fc2c2ULL, + 0x435c966d2eb82e2eULL, + 0x29967a624b314b4bULL, + 0x5de121a3fedffefeULL, + 0xd5ae168257415757ULL, + 0xbd2a41a815541515ULL, + 0xe8eeb69f77c17777ULL, + 0x926eeba537dc3737ULL, + 0x9ed7567be5b3e5e5ULL, + 0x1323d98c9f469f9fULL, + 0x23fd17d3f0e7f0f0ULL, + 0x20947f6a4a354a4aULL, + 0x44a9959eda4fdadaULL, + 0xa2b025fa587d5858ULL, + 0xcf8fca06c903c9c9ULL, + 0x7c528d5529a42929ULL, + 0x5a1422500a280a0aULL, + 0x507f4fe1b1feb1b1ULL, + 0xc95d1a69a0baa0a0ULL, + 0x14d6da7f6bb16b6bULL, + 0xd917ab5c852e8585ULL, + 0x3c677381bdcebdbdULL, + 0x8fba34d25d695d5dULL, + 0x9020508010401010ULL, + 0x07f503f3f4f7f4f4ULL, + 0xdd8bc016cb0bcbcbULL, + 0xd37cc6ed3ef83e3eULL, + 0x2d0a112805140505ULL, + 0x78cee61f67816767ULL, + 0x97d55373e4b7e4e4ULL, + 0x024ebb25279c2727ULL, + 0x7382583241194141ULL, + 0xa70b9d2c8b168b8bULL, + 0xf6530151a7a6a7a7ULL, + 0xb2fa94cf7de97d7dULL, + 0x4937fbdc956e9595ULL, + 0x56ad9f8ed847d8d8ULL, + 0x70eb308bfbcbfbfbULL, + 0xcdc17123ee9feeeeULL, + 0xbbf891c77ced7c7cULL, + 0x71cce31766856666ULL, + 0x7ba78ea6dd53ddddULL, + 0xaf2e4bb8175c1717ULL, + 0x458e460247014747ULL, + 0x1a21dc849e429e9eULL, + 0xd489c51eca0fcacaULL, + 0x585a99752db42d2dULL, + 0x2e637991bfc6bfbfULL, + 0x3f0e1b38071c0707ULL, + 0xac472301ad8eadadULL, + 0xb0b42fea5a755a5aULL, + 0xef1bb56c83368383ULL, + 0xb666ff8533cc3333ULL, + 0x5cc6f23f63916363ULL, + 0x12040a1002080202ULL, + 0x93493839aa92aaaaULL, + 0xdee2a8af71d97171ULL, + 0xc68dcf0ec807c8c8ULL, + 0xd1327dc819641919ULL, + 0x3b92707249394949ULL, + 0x5faf9a86d943d9d9ULL, + 0x31f91dc3f2eff2f2ULL, + 0xa8db484be3abe3e3ULL, + 0xb9b62ae25b715b5bULL, + 0xbc0d9234881a8888ULL, + 0x3e29c8a49a529a9aULL, + 0x0b4cbe2d26982626ULL, + 0xbf64fa8d32c83232ULL, + 0x597d4ae9b0fab0b0ULL, + 0xf2cf6a1be983e9e9ULL, + 0x771e33780f3c0f0fULL, + 0x33b7a6e6d573d5d5ULL, + 0xf41dba74803a8080ULL, + 0x27617c99bec2bebeULL, + 0xeb87de26cd13cdcdULL, + 0x8968e4bd34d03434ULL, + 0x3290757a483d4848ULL, + 0x54e324abffdbffffULL, + 0x8df48ff77af57a7aULL, + 0x643deaf4907a9090ULL, + 0x9dbe3ec25f615f5fULL, + 0x3d40a01d20802020ULL, + 0x0fd0d56768bd6868ULL, + 0xca3472d01a681a1aULL, + 0xb7412c19ae82aeaeULL, + 0x7d755ec9b4eab4b4ULL, + 0xcea8199a544d5454ULL, + 0x7f3be5ec93769393ULL, + 0x2f44aa0d22882222ULL, + 0x63c8e907648d6464ULL, + 0x2aff12dbf1e3f1f1ULL, + 0xcce6a2bf73d17373ULL, + 0x82245a9012481212ULL, + 0x7a805d3a401d4040ULL, + 0x4810284008200808ULL, + 0x959be856c32bc3c3ULL, + 0xdfc57b33ec97ececULL, + 0x4dab9096db4bdbdbULL, + 0xc05f1f61a1bea1a1ULL, + 0x9107831c8d0e8d8dULL, + 0xc87ac9f53df43d3dULL, + 0x5b33f1cc97669797ULL, + 0x0000000000000000ULL, + 0xf983d436cf1bcfcfULL, + 0x6e5687452bac2b2bULL, + 0xe1ecb39776c57676ULL, + 0xe619b06482328282ULL, + 0x28b1a9fed67fd6d6ULL, + 0xc33677d81b6c1b1bULL, + 0x74775bc1b5eeb5b5ULL, + 0xbe432911af86afafULL, + 0x1dd4df776ab56a6aULL, + 0xeaa00dba505d5050ULL, + 0x578a4c1245094545ULL, + 0x38fb18cbf3ebf3f3ULL, + 0xad60f09d30c03030ULL, + 0xc4c3742bef9befefULL, + 0xda7ec3e53ffc3f3fULL, + 0xc7aa1c9255495555ULL, + 0xdb591079a2b2a2a2ULL, + 0xe9c96503ea8feaeaULL, + 0x6acaec0f65896565ULL, + 0x036968b9bad2babaULL, + 0x4a5e93652fbc2f2fULL, + 0x8e9de74ec027c0c0ULL, + 0x60a181bede5fdedeULL, + 0xfc386ce01c701c1cULL, + 0x46e72ebbfdd3fdfdULL, + 0x1f9a64524d294d4dULL, + 0x7639e0e492729292ULL, + 0xfaeabc8f75c97575ULL, + 0x360c1e3006180606ULL, + 0xae0998248a128a8aULL, + 0x4b7940f9b2f2b2b2ULL, + 0x85d15963e6bfe6e6ULL, + 0x7e1c36700e380e0eULL, + 0xe73e63f81f7c1f1fULL, + 0x55c4f73762956262ULL, + 0x3ab5a3eed477d4d4ULL, + 0x814d3229a89aa8a8ULL, + 0x5231f4c496629696ULL, + 0x62ef3a9bf9c3f9f9ULL, + 0xa397f666c533c5c5ULL, + 0x104ab13525942525ULL, + 0xabb220f259795959ULL, + 0xd015ae54842a8484ULL, + 0xc5e4a7b772d57272ULL, + 0xec72ddd539e43939ULL, + 0x1698615a4c2d4c4cULL, + 0x94bc3bca5e655e5eULL, + 0x9ff085e778fd7878ULL, + 0xe570d8dd38e03838ULL, + 0x980586148c0a8c8cULL, + 0x17bfb2c6d163d1d1ULL, + 0xe4570b41a5aea5a5ULL, + 0xa1d94d43e2afe2e2ULL, + 0x4ec2f82f61996161ULL, + 0x427b45f1b3f6b3b3ULL, + 0x3442a51521842121ULL, + 0x0825d6949c4a9c9cULL, + 0xee3c66f01e781e1eULL, + 0x6186522243114343ULL, + 0xb193fc76c73bc7c7ULL, + 0x4fe52bb3fcd7fcfcULL, + 0x2408142004100404ULL, + 0xe3a208b251595151ULL, + 0x252fc7bc995e9999ULL, + 0x22dac44f6da96d6dULL, + 0x651a39680d340d0dULL, + 0x79e93583facffafaULL, + 0x69a384b6df5bdfdfULL, + 0xa9fc9bd77ee57e7eULL, + 0x1948b43d24902424ULL, + 0xfe76d7c53bec3b3bULL, + 0x9a4b3d31ab96ababULL, + 0xf081d13ece1fceceULL, + 0x9922558811441111ULL, + 0x8303890c8f068f8fULL, + 0x049c6b4a4e254e4eULL, + 0x667351d1b7e6b7b7ULL, + 0xe0cb600beb8bebebULL, + 0xc178ccfd3cf03c3cULL, + 0xfd1fbf7c813e8181ULL, + 0x4035fed4946a9494ULL, + 0x1cf30cebf7fbf7f7ULL, + 0x186f67a1b9deb9b9ULL, + 0x8b265f98134c1313ULL, + 0x51589c7d2cb02c2cULL, + 0x05bbb8d6d36bd3d3ULL, + 0x8cd35c6be7bbe7e7ULL, + 0x39dccb576ea56e6eULL, + 0xaa95f36ec437c4c4ULL, + 0x1b060f18030c0303ULL, + 0xdcac138a56455656ULL, + 0x5e88491a440d4444ULL, + 0xa0fe9edf7fe17f7fULL, + 0x884f3721a99ea9a9ULL, + 0x6754824d2aa82a2aULL, + 0x0a6b6db1bbd6bbbbULL, + 0x879fe246c123c1c1ULL, + 0xf1a602a253515353ULL, + 0x72a58baedc57dcdcULL, + 0x531627580b2c0b0bULL, + 0x0127d39c9d4e9d9dULL, + 0x2bd8c1476cad6c6cULL, + 0xa462f59531c43131ULL, + 0xf3e8b98774cd7474ULL, + 0x15f109e3f6fff6f6ULL, + 0x4c8c430a46054646ULL, + 0xa5452609ac8aacacULL, + 0xb50f973c891e8989ULL, + 0xb42844a014501414ULL, + 0xbadf425be1a3e1e1ULL, + 0xa62c4eb016581616ULL, + 0xf774d2cd3ae83a3aULL, + 0x06d2d06f69b96969ULL, + 0x41122d4809240909ULL, + 0xd7e0ada770dd7070ULL, + 0x6f7154d9b6e2b6b6ULL, + 0x1ebdb7ced067d0d0ULL, + 0xd6c77e3bed93ededULL, + 0xe285db2ecc17ccccULL, + 0x6884572a42154242ULL, + 0x2c2dc2b4985a9898ULL, + 0xed550e49a4aaa4a4ULL, + 0x7550885d28a02828ULL, + 0x86b831da5c6d5c5cULL, + 0x6bed3f93f8c7f8f8ULL, + 0xc211a44486228686ULL, +}; + +static const uint64_t T1[256] = { + 0x3078c018601818d8ULL, + 0x46af05238c232326ULL, + 0x91f97ec63fc6c6b8ULL, + 0xcd6f13e887e8e8fbULL, + 0x13a14c87268787cbULL, + 0x6d62a9b8dab8b811ULL, + 0x0205080104010109ULL, + 0x9e6e424f214f4f0dULL, + 0x6ceead36d836369bULL, + 0x510459a6a2a6a6ffULL, + 0xb9bdded26fd2d20cULL, + 0xf706fbf5f3f5f50eULL, + 0xf280ef79f9797996ULL, + 0xdece5f6fa16f6f30ULL, + 0x3feffc917e91916dULL, + 0xa407aa52555252f8ULL, + 0xc0fd27609d606047ULL, + 0x657689bccabcbc35ULL, + 0x2bcdac9b569b9b37ULL, + 0x018c048e028e8e8aULL, + 0x5b1571a3b6a3a3d2ULL, + 0x183c600c300c0c6cULL, + 0xf68aff7bf17b7b84ULL, + 0x6ae1b535d4353580ULL, + 0x3a69e81d741d1df5ULL, + 0xdd4753e0a7e0e0b3ULL, + 0xb3acf6d77bd7d721ULL, + 0x99ed5ec22fc2c29cULL, + 0x5c966d2eb82e2e43ULL, + 0x967a624b314b4b29ULL, + 0xe121a3fedffefe5dULL, + 0xae168257415757d5ULL, + 0x2a41a815541515bdULL, + 0xeeb69f77c17777e8ULL, + 0x6eeba537dc373792ULL, + 0xd7567be5b3e5e59eULL, + 0x23d98c9f469f9f13ULL, + 0xfd17d3f0e7f0f023ULL, + 0x947f6a4a354a4a20ULL, + 0xa9959eda4fdada44ULL, + 0xb025fa587d5858a2ULL, + 0x8fca06c903c9c9cfULL, + 0x528d5529a429297cULL, + 0x1422500a280a0a5aULL, + 0x7f4fe1b1feb1b150ULL, + 0x5d1a69a0baa0a0c9ULL, + 0xd6da7f6bb16b6b14ULL, + 0x17ab5c852e8585d9ULL, + 0x677381bdcebdbd3cULL, + 0xba34d25d695d5d8fULL, + 0x2050801040101090ULL, + 0xf503f3f4f7f4f407ULL, + 0x8bc016cb0bcbcbddULL, + 0x7cc6ed3ef83e3ed3ULL, + 0x0a1128051405052dULL, + 0xcee61f6781676778ULL, + 0xd55373e4b7e4e497ULL, + 0x4ebb25279c272702ULL, + 0x8258324119414173ULL, + 0x0b9d2c8b168b8ba7ULL, + 0x530151a7a6a7a7f6ULL, + 0xfa94cf7de97d7db2ULL, + 0x37fbdc956e959549ULL, + 0xad9f8ed847d8d856ULL, + 0xeb308bfbcbfbfb70ULL, + 0xc17123ee9feeeecdULL, + 0xf891c77ced7c7cbbULL, + 0xcce3176685666671ULL, + 0xa78ea6dd53dddd7bULL, + 0x2e4bb8175c1717afULL, + 0x8e46024701474745ULL, + 0x21dc849e429e9e1aULL, + 0x89c51eca0fcacad4ULL, + 0x5a99752db42d2d58ULL, + 0x637991bfc6bfbf2eULL, + 0x0e1b38071c07073fULL, + 0x472301ad8eadadacULL, + 0xb42fea5a755a5ab0ULL, + 0x1bb56c83368383efULL, + 0x66ff8533cc3333b6ULL, + 0xc6f23f639163635cULL, + 0x040a100208020212ULL, + 0x493839aa92aaaa93ULL, + 0xe2a8af71d97171deULL, + 0x8dcf0ec807c8c8c6ULL, + 0x327dc819641919d1ULL, + 0x927072493949493bULL, + 0xaf9a86d943d9d95fULL, + 0xf91dc3f2eff2f231ULL, + 0xdb484be3abe3e3a8ULL, + 0xb62ae25b715b5bb9ULL, + 0x0d9234881a8888bcULL, + 0x29c8a49a529a9a3eULL, + 0x4cbe2d269826260bULL, + 0x64fa8d32c83232bfULL, + 0x7d4ae9b0fab0b059ULL, + 0xcf6a1be983e9e9f2ULL, + 0x1e33780f3c0f0f77ULL, + 0xb7a6e6d573d5d533ULL, + 0x1dba74803a8080f4ULL, + 0x617c99bec2bebe27ULL, + 0x87de26cd13cdcdebULL, + 0x68e4bd34d0343489ULL, + 0x90757a483d484832ULL, + 0xe324abffdbffff54ULL, + 0xf48ff77af57a7a8dULL, + 0x3deaf4907a909064ULL, + 0xbe3ec25f615f5f9dULL, + 0x40a01d208020203dULL, + 0xd0d56768bd68680fULL, + 0x3472d01a681a1acaULL, + 0x412c19ae82aeaeb7ULL, + 0x755ec9b4eab4b47dULL, + 0xa8199a544d5454ceULL, + 0x3be5ec937693937fULL, + 0x44aa0d228822222fULL, + 0xc8e907648d646463ULL, + 0xff12dbf1e3f1f12aULL, + 0xe6a2bf73d17373ccULL, + 0x245a901248121282ULL, + 0x805d3a401d40407aULL, + 0x1028400820080848ULL, + 0x9be856c32bc3c395ULL, + 0xc57b33ec97ececdfULL, + 0xab9096db4bdbdb4dULL, + 0x5f1f61a1bea1a1c0ULL, + 0x07831c8d0e8d8d91ULL, + 0x7ac9f53df43d3dc8ULL, + 0x33f1cc976697975bULL, + 0x0000000000000000ULL, + 0x83d436cf1bcfcff9ULL, + 0x5687452bac2b2b6eULL, + 0xecb39776c57676e1ULL, + 0x19b06482328282e6ULL, + 0xb1a9fed67fd6d628ULL, + 0x3677d81b6c1b1bc3ULL, + 0x775bc1b5eeb5b574ULL, + 0x432911af86afafbeULL, + 0xd4df776ab56a6a1dULL, + 0xa00dba505d5050eaULL, + 0x8a4c124509454557ULL, + 0xfb18cbf3ebf3f338ULL, + 0x60f09d30c03030adULL, + 0xc3742bef9befefc4ULL, + 0x7ec3e53ffc3f3fdaULL, + 0xaa1c9255495555c7ULL, + 0x591079a2b2a2a2dbULL, + 0xc96503ea8feaeae9ULL, + 0xcaec0f658965656aULL, + 0x6968b9bad2baba03ULL, + 0x5e93652fbc2f2f4aULL, + 0x9de74ec027c0c08eULL, + 0xa181bede5fdede60ULL, + 0x386ce01c701c1cfcULL, + 0xe72ebbfdd3fdfd46ULL, + 0x9a64524d294d4d1fULL, + 0x39e0e49272929276ULL, + 0xeabc8f75c97575faULL, + 0x0c1e300618060636ULL, + 0x0998248a128a8aaeULL, + 0x7940f9b2f2b2b24bULL, + 0xd15963e6bfe6e685ULL, + 0x1c36700e380e0e7eULL, + 0x3e63f81f7c1f1fe7ULL, + 0xc4f7376295626255ULL, + 0xb5a3eed477d4d43aULL, + 0x4d3229a89aa8a881ULL, + 0x31f4c49662969652ULL, + 0xef3a9bf9c3f9f962ULL, + 0x97f666c533c5c5a3ULL, + 0x4ab1352594252510ULL, + 0xb220f259795959abULL, + 0x15ae54842a8484d0ULL, + 0xe4a7b772d57272c5ULL, + 0x72ddd539e43939ecULL, + 0x98615a4c2d4c4c16ULL, + 0xbc3bca5e655e5e94ULL, + 0xf085e778fd78789fULL, + 0x70d8dd38e03838e5ULL, + 0x0586148c0a8c8c98ULL, + 0xbfb2c6d163d1d117ULL, + 0x570b41a5aea5a5e4ULL, + 0xd94d43e2afe2e2a1ULL, + 0xc2f82f619961614eULL, + 0x7b45f1b3f6b3b342ULL, + 0x42a5152184212134ULL, + 0x25d6949c4a9c9c08ULL, + 0x3c66f01e781e1eeeULL, + 0x8652224311434361ULL, + 0x93fc76c73bc7c7b1ULL, + 0xe52bb3fcd7fcfc4fULL, + 0x0814200410040424ULL, + 0xa208b251595151e3ULL, + 0x2fc7bc995e999925ULL, + 0xdac44f6da96d6d22ULL, + 0x1a39680d340d0d65ULL, + 0xe93583facffafa79ULL, + 0xa384b6df5bdfdf69ULL, + 0xfc9bd77ee57e7ea9ULL, + 0x48b43d2490242419ULL, + 0x76d7c53bec3b3bfeULL, + 0x4b3d31ab96abab9aULL, + 0x81d13ece1fcecef0ULL, + 0x2255881144111199ULL, + 0x03890c8f068f8f83ULL, + 0x9c6b4a4e254e4e04ULL, + 0x7351d1b7e6b7b766ULL, + 0xcb600beb8bebebe0ULL, + 0x78ccfd3cf03c3cc1ULL, + 0x1fbf7c813e8181fdULL, + 0x35fed4946a949440ULL, + 0xf30cebf7fbf7f71cULL, + 0x6f67a1b9deb9b918ULL, + 0x265f98134c13138bULL, + 0x589c7d2cb02c2c51ULL, + 0xbbb8d6d36bd3d305ULL, + 0xd35c6be7bbe7e78cULL, + 0xdccb576ea56e6e39ULL, + 0x95f36ec437c4c4aaULL, + 0x060f18030c03031bULL, + 0xac138a56455656dcULL, + 0x88491a440d44445eULL, + 0xfe9edf7fe17f7fa0ULL, + 0x4f3721a99ea9a988ULL, + 0x54824d2aa82a2a67ULL, + 0x6b6db1bbd6bbbb0aULL, + 0x9fe246c123c1c187ULL, + 0xa602a253515353f1ULL, + 0xa58baedc57dcdc72ULL, + 0x1627580b2c0b0b53ULL, + 0x27d39c9d4e9d9d01ULL, + 0xd8c1476cad6c6c2bULL, + 0x62f59531c43131a4ULL, + 0xe8b98774cd7474f3ULL, + 0xf109e3f6fff6f615ULL, + 0x8c430a460546464cULL, + 0x452609ac8aacaca5ULL, + 0x0f973c891e8989b5ULL, + 0x2844a014501414b4ULL, + 0xdf425be1a3e1e1baULL, + 0x2c4eb016581616a6ULL, + 0x74d2cd3ae83a3af7ULL, + 0xd2d06f69b9696906ULL, + 0x122d480924090941ULL, + 0xe0ada770dd7070d7ULL, + 0x7154d9b6e2b6b66fULL, + 0xbdb7ced067d0d01eULL, + 0xc77e3bed93ededd6ULL, + 0x85db2ecc17cccce2ULL, + 0x84572a4215424268ULL, + 0x2dc2b4985a98982cULL, + 0x550e49a4aaa4a4edULL, + 0x50885d28a0282875ULL, + 0xb831da5c6d5c5c86ULL, + 0xed3f93f8c7f8f86bULL, + 0x11a44486228686c2ULL, +}; + +static const uint64_t T2[256] = { + 0x78c018601818d830ULL, + 0xaf05238c23232646ULL, + 0xf97ec63fc6c6b891ULL, + 0x6f13e887e8e8fbcdULL, + 0xa14c87268787cb13ULL, + 0x62a9b8dab8b8116dULL, + 0x0508010401010902ULL, + 0x6e424f214f4f0d9eULL, + 0xeead36d836369b6cULL, + 0x0459a6a2a6a6ff51ULL, + 0xbdded26fd2d20cb9ULL, + 0x06fbf5f3f5f50ef7ULL, + 0x80ef79f9797996f2ULL, + 0xce5f6fa16f6f30deULL, + 0xeffc917e91916d3fULL, + 0x07aa52555252f8a4ULL, + 0xfd27609d606047c0ULL, + 0x7689bccabcbc3565ULL, + 0xcdac9b569b9b372bULL, + 0x8c048e028e8e8a01ULL, + 0x1571a3b6a3a3d25bULL, + 0x3c600c300c0c6c18ULL, + 0x8aff7bf17b7b84f6ULL, + 0xe1b535d43535806aULL, + 0x69e81d741d1df53aULL, + 0x4753e0a7e0e0b3ddULL, + 0xacf6d77bd7d721b3ULL, + 0xed5ec22fc2c29c99ULL, + 0x966d2eb82e2e435cULL, + 0x7a624b314b4b2996ULL, + 0x21a3fedffefe5de1ULL, + 0x168257415757d5aeULL, + 0x41a815541515bd2aULL, + 0xb69f77c17777e8eeULL, + 0xeba537dc3737926eULL, + 0x567be5b3e5e59ed7ULL, + 0xd98c9f469f9f1323ULL, + 0x17d3f0e7f0f023fdULL, + 0x7f6a4a354a4a2094ULL, + 0x959eda4fdada44a9ULL, + 0x25fa587d5858a2b0ULL, + 0xca06c903c9c9cf8fULL, + 0x8d5529a429297c52ULL, + 0x22500a280a0a5a14ULL, + 0x4fe1b1feb1b1507fULL, + 0x1a69a0baa0a0c95dULL, + 0xda7f6bb16b6b14d6ULL, + 0xab5c852e8585d917ULL, + 0x7381bdcebdbd3c67ULL, + 0x34d25d695d5d8fbaULL, + 0x5080104010109020ULL, + 0x03f3f4f7f4f407f5ULL, + 0xc016cb0bcbcbdd8bULL, + 0xc6ed3ef83e3ed37cULL, + 0x1128051405052d0aULL, + 0xe61f6781676778ceULL, + 0x5373e4b7e4e497d5ULL, + 0xbb25279c2727024eULL, + 0x5832411941417382ULL, + 0x9d2c8b168b8ba70bULL, + 0x0151a7a6a7a7f653ULL, + 0x94cf7de97d7db2faULL, + 0xfbdc956e95954937ULL, + 0x9f8ed847d8d856adULL, + 0x308bfbcbfbfb70ebULL, + 0x7123ee9feeeecdc1ULL, + 0x91c77ced7c7cbbf8ULL, + 0xe3176685666671ccULL, + 0x8ea6dd53dddd7ba7ULL, + 0x4bb8175c1717af2eULL, + 0x460247014747458eULL, + 0xdc849e429e9e1a21ULL, + 0xc51eca0fcacad489ULL, + 0x99752db42d2d585aULL, + 0x7991bfc6bfbf2e63ULL, + 0x1b38071c07073f0eULL, + 0x2301ad8eadadac47ULL, + 0x2fea5a755a5ab0b4ULL, + 0xb56c83368383ef1bULL, + 0xff8533cc3333b666ULL, + 0xf23f639163635cc6ULL, + 0x0a10020802021204ULL, + 0x3839aa92aaaa9349ULL, + 0xa8af71d97171dee2ULL, + 0xcf0ec807c8c8c68dULL, + 0x7dc819641919d132ULL, + 0x7072493949493b92ULL, + 0x9a86d943d9d95fafULL, + 0x1dc3f2eff2f231f9ULL, + 0x484be3abe3e3a8dbULL, + 0x2ae25b715b5bb9b6ULL, + 0x9234881a8888bc0dULL, + 0xc8a49a529a9a3e29ULL, + 0xbe2d269826260b4cULL, + 0xfa8d32c83232bf64ULL, + 0x4ae9b0fab0b0597dULL, + 0x6a1be983e9e9f2cfULL, + 0x33780f3c0f0f771eULL, + 0xa6e6d573d5d533b7ULL, + 0xba74803a8080f41dULL, + 0x7c99bec2bebe2761ULL, + 0xde26cd13cdcdeb87ULL, + 0xe4bd34d034348968ULL, + 0x757a483d48483290ULL, + 0x24abffdbffff54e3ULL, + 0x8ff77af57a7a8df4ULL, + 0xeaf4907a9090643dULL, + 0x3ec25f615f5f9dbeULL, + 0xa01d208020203d40ULL, + 0xd56768bd68680fd0ULL, + 0x72d01a681a1aca34ULL, + 0x2c19ae82aeaeb741ULL, + 0x5ec9b4eab4b47d75ULL, + 0x199a544d5454cea8ULL, + 0xe5ec937693937f3bULL, + 0xaa0d228822222f44ULL, + 0xe907648d646463c8ULL, + 0x12dbf1e3f1f12affULL, + 0xa2bf73d17373cce6ULL, + 0x5a90124812128224ULL, + 0x5d3a401d40407a80ULL, + 0x2840082008084810ULL, + 0xe856c32bc3c3959bULL, + 0x7b33ec97ececdfc5ULL, + 0x9096db4bdbdb4dabULL, + 0x1f61a1bea1a1c05fULL, + 0x831c8d0e8d8d9107ULL, + 0xc9f53df43d3dc87aULL, + 0xf1cc976697975b33ULL, + 0x0000000000000000ULL, + 0xd436cf1bcfcff983ULL, + 0x87452bac2b2b6e56ULL, + 0xb39776c57676e1ecULL, + 0xb06482328282e619ULL, + 0xa9fed67fd6d628b1ULL, + 0x77d81b6c1b1bc336ULL, + 0x5bc1b5eeb5b57477ULL, + 0x2911af86afafbe43ULL, + 0xdf776ab56a6a1dd4ULL, + 0x0dba505d5050eaa0ULL, + 0x4c1245094545578aULL, + 0x18cbf3ebf3f338fbULL, + 0xf09d30c03030ad60ULL, + 0x742bef9befefc4c3ULL, + 0xc3e53ffc3f3fda7eULL, + 0x1c9255495555c7aaULL, + 0x1079a2b2a2a2db59ULL, + 0x6503ea8feaeae9c9ULL, + 0xec0f658965656acaULL, + 0x68b9bad2baba0369ULL, + 0x93652fbc2f2f4a5eULL, + 0xe74ec027c0c08e9dULL, + 0x81bede5fdede60a1ULL, + 0x6ce01c701c1cfc38ULL, + 0x2ebbfdd3fdfd46e7ULL, + 0x64524d294d4d1f9aULL, + 0xe0e4927292927639ULL, + 0xbc8f75c97575faeaULL, + 0x1e3006180606360cULL, + 0x98248a128a8aae09ULL, + 0x40f9b2f2b2b24b79ULL, + 0x5963e6bfe6e685d1ULL, + 0x36700e380e0e7e1cULL, + 0x63f81f7c1f1fe73eULL, + 0xf7376295626255c4ULL, + 0xa3eed477d4d43ab5ULL, + 0x3229a89aa8a8814dULL, + 0xf4c4966296965231ULL, + 0x3a9bf9c3f9f962efULL, + 0xf666c533c5c5a397ULL, + 0xb13525942525104aULL, + 0x20f259795959abb2ULL, + 0xae54842a8484d015ULL, + 0xa7b772d57272c5e4ULL, + 0xddd539e43939ec72ULL, + 0x615a4c2d4c4c1698ULL, + 0x3bca5e655e5e94bcULL, + 0x85e778fd78789ff0ULL, + 0xd8dd38e03838e570ULL, + 0x86148c0a8c8c9805ULL, + 0xb2c6d163d1d117bfULL, + 0x0b41a5aea5a5e457ULL, + 0x4d43e2afe2e2a1d9ULL, + 0xf82f619961614ec2ULL, + 0x45f1b3f6b3b3427bULL, + 0xa515218421213442ULL, + 0xd6949c4a9c9c0825ULL, + 0x66f01e781e1eee3cULL, + 0x5222431143436186ULL, + 0xfc76c73bc7c7b193ULL, + 0x2bb3fcd7fcfc4fe5ULL, + 0x1420041004042408ULL, + 0x08b251595151e3a2ULL, + 0xc7bc995e9999252fULL, + 0xc44f6da96d6d22daULL, + 0x39680d340d0d651aULL, + 0x3583facffafa79e9ULL, + 0x84b6df5bdfdf69a3ULL, + 0x9bd77ee57e7ea9fcULL, + 0xb43d249024241948ULL, + 0xd7c53bec3b3bfe76ULL, + 0x3d31ab96abab9a4bULL, + 0xd13ece1fcecef081ULL, + 0x5588114411119922ULL, + 0x890c8f068f8f8303ULL, + 0x6b4a4e254e4e049cULL, + 0x51d1b7e6b7b76673ULL, + 0x600beb8bebebe0cbULL, + 0xccfd3cf03c3cc178ULL, + 0xbf7c813e8181fd1fULL, + 0xfed4946a94944035ULL, + 0x0cebf7fbf7f71cf3ULL, + 0x67a1b9deb9b9186fULL, + 0x5f98134c13138b26ULL, + 0x9c7d2cb02c2c5158ULL, + 0xb8d6d36bd3d305bbULL, + 0x5c6be7bbe7e78cd3ULL, + 0xcb576ea56e6e39dcULL, + 0xf36ec437c4c4aa95ULL, + 0x0f18030c03031b06ULL, + 0x138a56455656dcacULL, + 0x491a440d44445e88ULL, + 0x9edf7fe17f7fa0feULL, + 0x3721a99ea9a9884fULL, + 0x824d2aa82a2a6754ULL, + 0x6db1bbd6bbbb0a6bULL, + 0xe246c123c1c1879fULL, + 0x02a253515353f1a6ULL, + 0x8baedc57dcdc72a5ULL, + 0x27580b2c0b0b5316ULL, + 0xd39c9d4e9d9d0127ULL, + 0xc1476cad6c6c2bd8ULL, + 0xf59531c43131a462ULL, + 0xb98774cd7474f3e8ULL, + 0x09e3f6fff6f615f1ULL, + 0x430a460546464c8cULL, + 0x2609ac8aacaca545ULL, + 0x973c891e8989b50fULL, + 0x44a014501414b428ULL, + 0x425be1a3e1e1badfULL, + 0x4eb016581616a62cULL, + 0xd2cd3ae83a3af774ULL, + 0xd06f69b9696906d2ULL, + 0x2d48092409094112ULL, + 0xada770dd7070d7e0ULL, + 0x54d9b6e2b6b66f71ULL, + 0xb7ced067d0d01ebdULL, + 0x7e3bed93ededd6c7ULL, + 0xdb2ecc17cccce285ULL, + 0x572a421542426884ULL, + 0xc2b4985a98982c2dULL, + 0x0e49a4aaa4a4ed55ULL, + 0x885d28a028287550ULL, + 0x31da5c6d5c5c86b8ULL, + 0x3f93f8c7f8f86bedULL, + 0xa44486228686c211ULL, +}; + +static const uint64_t T3[256] = { + 0xc018601818d83078ULL, + 0x05238c23232646afULL, + 0x7ec63fc6c6b891f9ULL, + 0x13e887e8e8fbcd6fULL, + 0x4c87268787cb13a1ULL, + 0xa9b8dab8b8116d62ULL, + 0x0801040101090205ULL, + 0x424f214f4f0d9e6eULL, + 0xad36d836369b6ceeULL, + 0x59a6a2a6a6ff5104ULL, + 0xded26fd2d20cb9bdULL, + 0xfbf5f3f5f50ef706ULL, + 0xef79f9797996f280ULL, + 0x5f6fa16f6f30deceULL, + 0xfc917e91916d3fefULL, + 0xaa52555252f8a407ULL, + 0x27609d606047c0fdULL, + 0x89bccabcbc356576ULL, + 0xac9b569b9b372bcdULL, + 0x048e028e8e8a018cULL, + 0x71a3b6a3a3d25b15ULL, + 0x600c300c0c6c183cULL, + 0xff7bf17b7b84f68aULL, + 0xb535d43535806ae1ULL, + 0xe81d741d1df53a69ULL, + 0x53e0a7e0e0b3dd47ULL, + 0xf6d77bd7d721b3acULL, + 0x5ec22fc2c29c99edULL, + 0x6d2eb82e2e435c96ULL, + 0x624b314b4b29967aULL, + 0xa3fedffefe5de121ULL, + 0x8257415757d5ae16ULL, + 0xa815541515bd2a41ULL, + 0x9f77c17777e8eeb6ULL, + 0xa537dc3737926eebULL, + 0x7be5b3e5e59ed756ULL, + 0x8c9f469f9f1323d9ULL, + 0xd3f0e7f0f023fd17ULL, + 0x6a4a354a4a20947fULL, + 0x9eda4fdada44a995ULL, + 0xfa587d5858a2b025ULL, + 0x06c903c9c9cf8fcaULL, + 0x5529a429297c528dULL, + 0x500a280a0a5a1422ULL, + 0xe1b1feb1b1507f4fULL, + 0x69a0baa0a0c95d1aULL, + 0x7f6bb16b6b14d6daULL, + 0x5c852e8585d917abULL, + 0x81bdcebdbd3c6773ULL, + 0xd25d695d5d8fba34ULL, + 0x8010401010902050ULL, + 0xf3f4f7f4f407f503ULL, + 0x16cb0bcbcbdd8bc0ULL, + 0xed3ef83e3ed37cc6ULL, + 0x28051405052d0a11ULL, + 0x1f6781676778cee6ULL, + 0x73e4b7e4e497d553ULL, + 0x25279c2727024ebbULL, + 0x3241194141738258ULL, + 0x2c8b168b8ba70b9dULL, + 0x51a7a6a7a7f65301ULL, + 0xcf7de97d7db2fa94ULL, + 0xdc956e95954937fbULL, + 0x8ed847d8d856ad9fULL, + 0x8bfbcbfbfb70eb30ULL, + 0x23ee9feeeecdc171ULL, + 0xc77ced7c7cbbf891ULL, + 0x176685666671cce3ULL, + 0xa6dd53dddd7ba78eULL, + 0xb8175c1717af2e4bULL, + 0x0247014747458e46ULL, + 0x849e429e9e1a21dcULL, + 0x1eca0fcacad489c5ULL, + 0x752db42d2d585a99ULL, + 0x91bfc6bfbf2e6379ULL, + 0x38071c07073f0e1bULL, + 0x01ad8eadadac4723ULL, + 0xea5a755a5ab0b42fULL, + 0x6c83368383ef1bb5ULL, + 0x8533cc3333b666ffULL, + 0x3f639163635cc6f2ULL, + 0x100208020212040aULL, + 0x39aa92aaaa934938ULL, + 0xaf71d97171dee2a8ULL, + 0x0ec807c8c8c68dcfULL, + 0xc819641919d1327dULL, + 0x72493949493b9270ULL, + 0x86d943d9d95faf9aULL, + 0xc3f2eff2f231f91dULL, + 0x4be3abe3e3a8db48ULL, + 0xe25b715b5bb9b62aULL, + 0x34881a8888bc0d92ULL, + 0xa49a529a9a3e29c8ULL, + 0x2d269826260b4cbeULL, + 0x8d32c83232bf64faULL, + 0xe9b0fab0b0597d4aULL, + 0x1be983e9e9f2cf6aULL, + 0x780f3c0f0f771e33ULL, + 0xe6d573d5d533b7a6ULL, + 0x74803a8080f41dbaULL, + 0x99bec2bebe27617cULL, + 0x26cd13cdcdeb87deULL, + 0xbd34d034348968e4ULL, + 0x7a483d4848329075ULL, + 0xabffdbffff54e324ULL, + 0xf77af57a7a8df48fULL, + 0xf4907a9090643deaULL, + 0xc25f615f5f9dbe3eULL, + 0x1d208020203d40a0ULL, + 0x6768bd68680fd0d5ULL, + 0xd01a681a1aca3472ULL, + 0x19ae82aeaeb7412cULL, + 0xc9b4eab4b47d755eULL, + 0x9a544d5454cea819ULL, + 0xec937693937f3be5ULL, + 0x0d228822222f44aaULL, + 0x07648d646463c8e9ULL, + 0xdbf1e3f1f12aff12ULL, + 0xbf73d17373cce6a2ULL, + 0x901248121282245aULL, + 0x3a401d40407a805dULL, + 0x4008200808481028ULL, + 0x56c32bc3c3959be8ULL, + 0x33ec97ececdfc57bULL, + 0x96db4bdbdb4dab90ULL, + 0x61a1bea1a1c05f1fULL, + 0x1c8d0e8d8d910783ULL, + 0xf53df43d3dc87ac9ULL, + 0xcc976697975b33f1ULL, + 0x0000000000000000ULL, + 0x36cf1bcfcff983d4ULL, + 0x452bac2b2b6e5687ULL, + 0x9776c57676e1ecb3ULL, + 0x6482328282e619b0ULL, + 0xfed67fd6d628b1a9ULL, + 0xd81b6c1b1bc33677ULL, + 0xc1b5eeb5b574775bULL, + 0x11af86afafbe4329ULL, + 0x776ab56a6a1dd4dfULL, + 0xba505d5050eaa00dULL, + 0x1245094545578a4cULL, + 0xcbf3ebf3f338fb18ULL, + 0x9d30c03030ad60f0ULL, + 0x2bef9befefc4c374ULL, + 0xe53ffc3f3fda7ec3ULL, + 0x9255495555c7aa1cULL, + 0x79a2b2a2a2db5910ULL, + 0x03ea8feaeae9c965ULL, + 0x0f658965656acaecULL, + 0xb9bad2baba036968ULL, + 0x652fbc2f2f4a5e93ULL, + 0x4ec027c0c08e9de7ULL, + 0xbede5fdede60a181ULL, + 0xe01c701c1cfc386cULL, + 0xbbfdd3fdfd46e72eULL, + 0x524d294d4d1f9a64ULL, + 0xe4927292927639e0ULL, + 0x8f75c97575faeabcULL, + 0x3006180606360c1eULL, + 0x248a128a8aae0998ULL, + 0xf9b2f2b2b24b7940ULL, + 0x63e6bfe6e685d159ULL, + 0x700e380e0e7e1c36ULL, + 0xf81f7c1f1fe73e63ULL, + 0x376295626255c4f7ULL, + 0xeed477d4d43ab5a3ULL, + 0x29a89aa8a8814d32ULL, + 0xc4966296965231f4ULL, + 0x9bf9c3f9f962ef3aULL, + 0x66c533c5c5a397f6ULL, + 0x3525942525104ab1ULL, + 0xf259795959abb220ULL, + 0x54842a8484d015aeULL, + 0xb772d57272c5e4a7ULL, + 0xd539e43939ec72ddULL, + 0x5a4c2d4c4c169861ULL, + 0xca5e655e5e94bc3bULL, + 0xe778fd78789ff085ULL, + 0xdd38e03838e570d8ULL, + 0x148c0a8c8c980586ULL, + 0xc6d163d1d117bfb2ULL, + 0x41a5aea5a5e4570bULL, + 0x43e2afe2e2a1d94dULL, + 0x2f619961614ec2f8ULL, + 0xf1b3f6b3b3427b45ULL, + 0x15218421213442a5ULL, + 0x949c4a9c9c0825d6ULL, + 0xf01e781e1eee3c66ULL, + 0x2243114343618652ULL, + 0x76c73bc7c7b193fcULL, + 0xb3fcd7fcfc4fe52bULL, + 0x2004100404240814ULL, + 0xb251595151e3a208ULL, + 0xbc995e9999252fc7ULL, + 0x4f6da96d6d22dac4ULL, + 0x680d340d0d651a39ULL, + 0x83facffafa79e935ULL, + 0xb6df5bdfdf69a384ULL, + 0xd77ee57e7ea9fc9bULL, + 0x3d249024241948b4ULL, + 0xc53bec3b3bfe76d7ULL, + 0x31ab96abab9a4b3dULL, + 0x3ece1fcecef081d1ULL, + 0x8811441111992255ULL, + 0x0c8f068f8f830389ULL, + 0x4a4e254e4e049c6bULL, + 0xd1b7e6b7b7667351ULL, + 0x0beb8bebebe0cb60ULL, + 0xfd3cf03c3cc178ccULL, + 0x7c813e8181fd1fbfULL, + 0xd4946a94944035feULL, + 0xebf7fbf7f71cf30cULL, + 0xa1b9deb9b9186f67ULL, + 0x98134c13138b265fULL, + 0x7d2cb02c2c51589cULL, + 0xd6d36bd3d305bbb8ULL, + 0x6be7bbe7e78cd35cULL, + 0x576ea56e6e39dccbULL, + 0x6ec437c4c4aa95f3ULL, + 0x18030c03031b060fULL, + 0x8a56455656dcac13ULL, + 0x1a440d44445e8849ULL, + 0xdf7fe17f7fa0fe9eULL, + 0x21a99ea9a9884f37ULL, + 0x4d2aa82a2a675482ULL, + 0xb1bbd6bbbb0a6b6dULL, + 0x46c123c1c1879fe2ULL, + 0xa253515353f1a602ULL, + 0xaedc57dcdc72a58bULL, + 0x580b2c0b0b531627ULL, + 0x9c9d4e9d9d0127d3ULL, + 0x476cad6c6c2bd8c1ULL, + 0x9531c43131a462f5ULL, + 0x8774cd7474f3e8b9ULL, + 0xe3f6fff6f615f109ULL, + 0x0a460546464c8c43ULL, + 0x09ac8aacaca54526ULL, + 0x3c891e8989b50f97ULL, + 0xa014501414b42844ULL, + 0x5be1a3e1e1badf42ULL, + 0xb016581616a62c4eULL, + 0xcd3ae83a3af774d2ULL, + 0x6f69b9696906d2d0ULL, + 0x480924090941122dULL, + 0xa770dd7070d7e0adULL, + 0xd9b6e2b6b66f7154ULL, + 0xced067d0d01ebdb7ULL, + 0x3bed93ededd6c77eULL, + 0x2ecc17cccce285dbULL, + 0x2a42154242688457ULL, + 0xb4985a98982c2dc2ULL, + 0x49a4aaa4a4ed550eULL, + 0x5d28a02828755088ULL, + 0xda5c6d5c5c86b831ULL, + 0x93f8c7f8f86bed3fULL, + 0x4486228686c211a4ULL, +}; + +static const uint64_t T4[256] = { + 0x18601818d83078c0ULL, + 0x238c23232646af05ULL, + 0xc63fc6c6b891f97eULL, + 0xe887e8e8fbcd6f13ULL, + 0x87268787cb13a14cULL, + 0xb8dab8b8116d62a9ULL, + 0x0104010109020508ULL, + 0x4f214f4f0d9e6e42ULL, + 0x36d836369b6ceeadULL, + 0xa6a2a6a6ff510459ULL, + 0xd26fd2d20cb9bddeULL, + 0xf5f3f5f50ef706fbULL, + 0x79f9797996f280efULL, + 0x6fa16f6f30dece5fULL, + 0x917e91916d3feffcULL, + 0x52555252f8a407aaULL, + 0x609d606047c0fd27ULL, + 0xbccabcbc35657689ULL, + 0x9b569b9b372bcdacULL, + 0x8e028e8e8a018c04ULL, + 0xa3b6a3a3d25b1571ULL, + 0x0c300c0c6c183c60ULL, + 0x7bf17b7b84f68affULL, + 0x35d43535806ae1b5ULL, + 0x1d741d1df53a69e8ULL, + 0xe0a7e0e0b3dd4753ULL, + 0xd77bd7d721b3acf6ULL, + 0xc22fc2c29c99ed5eULL, + 0x2eb82e2e435c966dULL, + 0x4b314b4b29967a62ULL, + 0xfedffefe5de121a3ULL, + 0x57415757d5ae1682ULL, + 0x15541515bd2a41a8ULL, + 0x77c17777e8eeb69fULL, + 0x37dc3737926eeba5ULL, + 0xe5b3e5e59ed7567bULL, + 0x9f469f9f1323d98cULL, + 0xf0e7f0f023fd17d3ULL, + 0x4a354a4a20947f6aULL, + 0xda4fdada44a9959eULL, + 0x587d5858a2b025faULL, + 0xc903c9c9cf8fca06ULL, + 0x29a429297c528d55ULL, + 0x0a280a0a5a142250ULL, + 0xb1feb1b1507f4fe1ULL, + 0xa0baa0a0c95d1a69ULL, + 0x6bb16b6b14d6da7fULL, + 0x852e8585d917ab5cULL, + 0xbdcebdbd3c677381ULL, + 0x5d695d5d8fba34d2ULL, + 0x1040101090205080ULL, + 0xf4f7f4f407f503f3ULL, + 0xcb0bcbcbdd8bc016ULL, + 0x3ef83e3ed37cc6edULL, + 0x051405052d0a1128ULL, + 0x6781676778cee61fULL, + 0xe4b7e4e497d55373ULL, + 0x279c2727024ebb25ULL, + 0x4119414173825832ULL, + 0x8b168b8ba70b9d2cULL, + 0xa7a6a7a7f6530151ULL, + 0x7de97d7db2fa94cfULL, + 0x956e95954937fbdcULL, + 0xd847d8d856ad9f8eULL, + 0xfbcbfbfb70eb308bULL, + 0xee9feeeecdc17123ULL, + 0x7ced7c7cbbf891c7ULL, + 0x6685666671cce317ULL, + 0xdd53dddd7ba78ea6ULL, + 0x175c1717af2e4bb8ULL, + 0x47014747458e4602ULL, + 0x9e429e9e1a21dc84ULL, + 0xca0fcacad489c51eULL, + 0x2db42d2d585a9975ULL, + 0xbfc6bfbf2e637991ULL, + 0x071c07073f0e1b38ULL, + 0xad8eadadac472301ULL, + 0x5a755a5ab0b42feaULL, + 0x83368383ef1bb56cULL, + 0x33cc3333b666ff85ULL, + 0x639163635cc6f23fULL, + 0x0208020212040a10ULL, + 0xaa92aaaa93493839ULL, + 0x71d97171dee2a8afULL, + 0xc807c8c8c68dcf0eULL, + 0x19641919d1327dc8ULL, + 0x493949493b927072ULL, + 0xd943d9d95faf9a86ULL, + 0xf2eff2f231f91dc3ULL, + 0xe3abe3e3a8db484bULL, + 0x5b715b5bb9b62ae2ULL, + 0x881a8888bc0d9234ULL, + 0x9a529a9a3e29c8a4ULL, + 0x269826260b4cbe2dULL, + 0x32c83232bf64fa8dULL, + 0xb0fab0b0597d4ae9ULL, + 0xe983e9e9f2cf6a1bULL, + 0x0f3c0f0f771e3378ULL, + 0xd573d5d533b7a6e6ULL, + 0x803a8080f41dba74ULL, + 0xbec2bebe27617c99ULL, + 0xcd13cdcdeb87de26ULL, + 0x34d034348968e4bdULL, + 0x483d48483290757aULL, + 0xffdbffff54e324abULL, + 0x7af57a7a8df48ff7ULL, + 0x907a9090643deaf4ULL, + 0x5f615f5f9dbe3ec2ULL, + 0x208020203d40a01dULL, + 0x68bd68680fd0d567ULL, + 0x1a681a1aca3472d0ULL, + 0xae82aeaeb7412c19ULL, + 0xb4eab4b47d755ec9ULL, + 0x544d5454cea8199aULL, + 0x937693937f3be5ecULL, + 0x228822222f44aa0dULL, + 0x648d646463c8e907ULL, + 0xf1e3f1f12aff12dbULL, + 0x73d17373cce6a2bfULL, + 0x1248121282245a90ULL, + 0x401d40407a805d3aULL, + 0x0820080848102840ULL, + 0xc32bc3c3959be856ULL, + 0xec97ececdfc57b33ULL, + 0xdb4bdbdb4dab9096ULL, + 0xa1bea1a1c05f1f61ULL, + 0x8d0e8d8d9107831cULL, + 0x3df43d3dc87ac9f5ULL, + 0x976697975b33f1ccULL, + 0x0000000000000000ULL, + 0xcf1bcfcff983d436ULL, + 0x2bac2b2b6e568745ULL, + 0x76c57676e1ecb397ULL, + 0x82328282e619b064ULL, + 0xd67fd6d628b1a9feULL, + 0x1b6c1b1bc33677d8ULL, + 0xb5eeb5b574775bc1ULL, + 0xaf86afafbe432911ULL, + 0x6ab56a6a1dd4df77ULL, + 0x505d5050eaa00dbaULL, + 0x45094545578a4c12ULL, + 0xf3ebf3f338fb18cbULL, + 0x30c03030ad60f09dULL, + 0xef9befefc4c3742bULL, + 0x3ffc3f3fda7ec3e5ULL, + 0x55495555c7aa1c92ULL, + 0xa2b2a2a2db591079ULL, + 0xea8feaeae9c96503ULL, + 0x658965656acaec0fULL, + 0xbad2baba036968b9ULL, + 0x2fbc2f2f4a5e9365ULL, + 0xc027c0c08e9de74eULL, + 0xde5fdede60a181beULL, + 0x1c701c1cfc386ce0ULL, + 0xfdd3fdfd46e72ebbULL, + 0x4d294d4d1f9a6452ULL, + 0x927292927639e0e4ULL, + 0x75c97575faeabc8fULL, + 0x06180606360c1e30ULL, + 0x8a128a8aae099824ULL, + 0xb2f2b2b24b7940f9ULL, + 0xe6bfe6e685d15963ULL, + 0x0e380e0e7e1c3670ULL, + 0x1f7c1f1fe73e63f8ULL, + 0x6295626255c4f737ULL, + 0xd477d4d43ab5a3eeULL, + 0xa89aa8a8814d3229ULL, + 0x966296965231f4c4ULL, + 0xf9c3f9f962ef3a9bULL, + 0xc533c5c5a397f666ULL, + 0x25942525104ab135ULL, + 0x59795959abb220f2ULL, + 0x842a8484d015ae54ULL, + 0x72d57272c5e4a7b7ULL, + 0x39e43939ec72ddd5ULL, + 0x4c2d4c4c1698615aULL, + 0x5e655e5e94bc3bcaULL, + 0x78fd78789ff085e7ULL, + 0x38e03838e570d8ddULL, + 0x8c0a8c8c98058614ULL, + 0xd163d1d117bfb2c6ULL, + 0xa5aea5a5e4570b41ULL, + 0xe2afe2e2a1d94d43ULL, + 0x619961614ec2f82fULL, + 0xb3f6b3b3427b45f1ULL, + 0x218421213442a515ULL, + 0x9c4a9c9c0825d694ULL, + 0x1e781e1eee3c66f0ULL, + 0x4311434361865222ULL, + 0xc73bc7c7b193fc76ULL, + 0xfcd7fcfc4fe52bb3ULL, + 0x0410040424081420ULL, + 0x51595151e3a208b2ULL, + 0x995e9999252fc7bcULL, + 0x6da96d6d22dac44fULL, + 0x0d340d0d651a3968ULL, + 0xfacffafa79e93583ULL, + 0xdf5bdfdf69a384b6ULL, + 0x7ee57e7ea9fc9bd7ULL, + 0x249024241948b43dULL, + 0x3bec3b3bfe76d7c5ULL, + 0xab96abab9a4b3d31ULL, + 0xce1fcecef081d13eULL, + 0x1144111199225588ULL, + 0x8f068f8f8303890cULL, + 0x4e254e4e049c6b4aULL, + 0xb7e6b7b7667351d1ULL, + 0xeb8bebebe0cb600bULL, + 0x3cf03c3cc178ccfdULL, + 0x813e8181fd1fbf7cULL, + 0x946a94944035fed4ULL, + 0xf7fbf7f71cf30cebULL, + 0xb9deb9b9186f67a1ULL, + 0x134c13138b265f98ULL, + 0x2cb02c2c51589c7dULL, + 0xd36bd3d305bbb8d6ULL, + 0xe7bbe7e78cd35c6bULL, + 0x6ea56e6e39dccb57ULL, + 0xc437c4c4aa95f36eULL, + 0x030c03031b060f18ULL, + 0x56455656dcac138aULL, + 0x440d44445e88491aULL, + 0x7fe17f7fa0fe9edfULL, + 0xa99ea9a9884f3721ULL, + 0x2aa82a2a6754824dULL, + 0xbbd6bbbb0a6b6db1ULL, + 0xc123c1c1879fe246ULL, + 0x53515353f1a602a2ULL, + 0xdc57dcdc72a58baeULL, + 0x0b2c0b0b53162758ULL, + 0x9d4e9d9d0127d39cULL, + 0x6cad6c6c2bd8c147ULL, + 0x31c43131a462f595ULL, + 0x74cd7474f3e8b987ULL, + 0xf6fff6f615f109e3ULL, + 0x460546464c8c430aULL, + 0xac8aacaca5452609ULL, + 0x891e8989b50f973cULL, + 0x14501414b42844a0ULL, + 0xe1a3e1e1badf425bULL, + 0x16581616a62c4eb0ULL, + 0x3ae83a3af774d2cdULL, + 0x69b9696906d2d06fULL, + 0x0924090941122d48ULL, + 0x70dd7070d7e0ada7ULL, + 0xb6e2b6b66f7154d9ULL, + 0xd067d0d01ebdb7ceULL, + 0xed93ededd6c77e3bULL, + 0xcc17cccce285db2eULL, + 0x421542426884572aULL, + 0x985a98982c2dc2b4ULL, + 0xa4aaa4a4ed550e49ULL, + 0x28a028287550885dULL, + 0x5c6d5c5c86b831daULL, + 0xf8c7f8f86bed3f93ULL, + 0x86228686c211a444ULL, +}; + +static const uint64_t T5[256] = { + 0x601818d83078c018ULL, + 0x8c23232646af0523ULL, + 0x3fc6c6b891f97ec6ULL, + 0x87e8e8fbcd6f13e8ULL, + 0x268787cb13a14c87ULL, + 0xdab8b8116d62a9b8ULL, + 0x0401010902050801ULL, + 0x214f4f0d9e6e424fULL, + 0xd836369b6ceead36ULL, + 0xa2a6a6ff510459a6ULL, + 0x6fd2d20cb9bdded2ULL, + 0xf3f5f50ef706fbf5ULL, + 0xf9797996f280ef79ULL, + 0xa16f6f30dece5f6fULL, + 0x7e91916d3feffc91ULL, + 0x555252f8a407aa52ULL, + 0x9d606047c0fd2760ULL, + 0xcabcbc35657689bcULL, + 0x569b9b372bcdac9bULL, + 0x028e8e8a018c048eULL, + 0xb6a3a3d25b1571a3ULL, + 0x300c0c6c183c600cULL, + 0xf17b7b84f68aff7bULL, + 0xd43535806ae1b535ULL, + 0x741d1df53a69e81dULL, + 0xa7e0e0b3dd4753e0ULL, + 0x7bd7d721b3acf6d7ULL, + 0x2fc2c29c99ed5ec2ULL, + 0xb82e2e435c966d2eULL, + 0x314b4b29967a624bULL, + 0xdffefe5de121a3feULL, + 0x415757d5ae168257ULL, + 0x541515bd2a41a815ULL, + 0xc17777e8eeb69f77ULL, + 0xdc3737926eeba537ULL, + 0xb3e5e59ed7567be5ULL, + 0x469f9f1323d98c9fULL, + 0xe7f0f023fd17d3f0ULL, + 0x354a4a20947f6a4aULL, + 0x4fdada44a9959edaULL, + 0x7d5858a2b025fa58ULL, + 0x03c9c9cf8fca06c9ULL, + 0xa429297c528d5529ULL, + 0x280a0a5a1422500aULL, + 0xfeb1b1507f4fe1b1ULL, + 0xbaa0a0c95d1a69a0ULL, + 0xb16b6b14d6da7f6bULL, + 0x2e8585d917ab5c85ULL, + 0xcebdbd3c677381bdULL, + 0x695d5d8fba34d25dULL, + 0x4010109020508010ULL, + 0xf7f4f407f503f3f4ULL, + 0x0bcbcbdd8bc016cbULL, + 0xf83e3ed37cc6ed3eULL, + 0x1405052d0a112805ULL, + 0x81676778cee61f67ULL, + 0xb7e4e497d55373e4ULL, + 0x9c2727024ebb2527ULL, + 0x1941417382583241ULL, + 0x168b8ba70b9d2c8bULL, + 0xa6a7a7f6530151a7ULL, + 0xe97d7db2fa94cf7dULL, + 0x6e95954937fbdc95ULL, + 0x47d8d856ad9f8ed8ULL, + 0xcbfbfb70eb308bfbULL, + 0x9feeeecdc17123eeULL, + 0xed7c7cbbf891c77cULL, + 0x85666671cce31766ULL, + 0x53dddd7ba78ea6ddULL, + 0x5c1717af2e4bb817ULL, + 0x014747458e460247ULL, + 0x429e9e1a21dc849eULL, + 0x0fcacad489c51ecaULL, + 0xb42d2d585a99752dULL, + 0xc6bfbf2e637991bfULL, + 0x1c07073f0e1b3807ULL, + 0x8eadadac472301adULL, + 0x755a5ab0b42fea5aULL, + 0x368383ef1bb56c83ULL, + 0xcc3333b666ff8533ULL, + 0x9163635cc6f23f63ULL, + 0x08020212040a1002ULL, + 0x92aaaa93493839aaULL, + 0xd97171dee2a8af71ULL, + 0x07c8c8c68dcf0ec8ULL, + 0x641919d1327dc819ULL, + 0x3949493b92707249ULL, + 0x43d9d95faf9a86d9ULL, + 0xeff2f231f91dc3f2ULL, + 0xabe3e3a8db484be3ULL, + 0x715b5bb9b62ae25bULL, + 0x1a8888bc0d923488ULL, + 0x529a9a3e29c8a49aULL, + 0x9826260b4cbe2d26ULL, + 0xc83232bf64fa8d32ULL, + 0xfab0b0597d4ae9b0ULL, + 0x83e9e9f2cf6a1be9ULL, + 0x3c0f0f771e33780fULL, + 0x73d5d533b7a6e6d5ULL, + 0x3a8080f41dba7480ULL, + 0xc2bebe27617c99beULL, + 0x13cdcdeb87de26cdULL, + 0xd034348968e4bd34ULL, + 0x3d48483290757a48ULL, + 0xdbffff54e324abffULL, + 0xf57a7a8df48ff77aULL, + 0x7a9090643deaf490ULL, + 0x615f5f9dbe3ec25fULL, + 0x8020203d40a01d20ULL, + 0xbd68680fd0d56768ULL, + 0x681a1aca3472d01aULL, + 0x82aeaeb7412c19aeULL, + 0xeab4b47d755ec9b4ULL, + 0x4d5454cea8199a54ULL, + 0x7693937f3be5ec93ULL, + 0x8822222f44aa0d22ULL, + 0x8d646463c8e90764ULL, + 0xe3f1f12aff12dbf1ULL, + 0xd17373cce6a2bf73ULL, + 0x48121282245a9012ULL, + 0x1d40407a805d3a40ULL, + 0x2008084810284008ULL, + 0x2bc3c3959be856c3ULL, + 0x97ececdfc57b33ecULL, + 0x4bdbdb4dab9096dbULL, + 0xbea1a1c05f1f61a1ULL, + 0x0e8d8d9107831c8dULL, + 0xf43d3dc87ac9f53dULL, + 0x6697975b33f1cc97ULL, + 0x0000000000000000ULL, + 0x1bcfcff983d436cfULL, + 0xac2b2b6e5687452bULL, + 0xc57676e1ecb39776ULL, + 0x328282e619b06482ULL, + 0x7fd6d628b1a9fed6ULL, + 0x6c1b1bc33677d81bULL, + 0xeeb5b574775bc1b5ULL, + 0x86afafbe432911afULL, + 0xb56a6a1dd4df776aULL, + 0x5d5050eaa00dba50ULL, + 0x094545578a4c1245ULL, + 0xebf3f338fb18cbf3ULL, + 0xc03030ad60f09d30ULL, + 0x9befefc4c3742befULL, + 0xfc3f3fda7ec3e53fULL, + 0x495555c7aa1c9255ULL, + 0xb2a2a2db591079a2ULL, + 0x8feaeae9c96503eaULL, + 0x8965656acaec0f65ULL, + 0xd2baba036968b9baULL, + 0xbc2f2f4a5e93652fULL, + 0x27c0c08e9de74ec0ULL, + 0x5fdede60a181bedeULL, + 0x701c1cfc386ce01cULL, + 0xd3fdfd46e72ebbfdULL, + 0x294d4d1f9a64524dULL, + 0x7292927639e0e492ULL, + 0xc97575faeabc8f75ULL, + 0x180606360c1e3006ULL, + 0x128a8aae0998248aULL, + 0xf2b2b24b7940f9b2ULL, + 0xbfe6e685d15963e6ULL, + 0x380e0e7e1c36700eULL, + 0x7c1f1fe73e63f81fULL, + 0x95626255c4f73762ULL, + 0x77d4d43ab5a3eed4ULL, + 0x9aa8a8814d3229a8ULL, + 0x6296965231f4c496ULL, + 0xc3f9f962ef3a9bf9ULL, + 0x33c5c5a397f666c5ULL, + 0x942525104ab13525ULL, + 0x795959abb220f259ULL, + 0x2a8484d015ae5484ULL, + 0xd57272c5e4a7b772ULL, + 0xe43939ec72ddd539ULL, + 0x2d4c4c1698615a4cULL, + 0x655e5e94bc3bca5eULL, + 0xfd78789ff085e778ULL, + 0xe03838e570d8dd38ULL, + 0x0a8c8c980586148cULL, + 0x63d1d117bfb2c6d1ULL, + 0xaea5a5e4570b41a5ULL, + 0xafe2e2a1d94d43e2ULL, + 0x9961614ec2f82f61ULL, + 0xf6b3b3427b45f1b3ULL, + 0x8421213442a51521ULL, + 0x4a9c9c0825d6949cULL, + 0x781e1eee3c66f01eULL, + 0x1143436186522243ULL, + 0x3bc7c7b193fc76c7ULL, + 0xd7fcfc4fe52bb3fcULL, + 0x1004042408142004ULL, + 0x595151e3a208b251ULL, + 0x5e9999252fc7bc99ULL, + 0xa96d6d22dac44f6dULL, + 0x340d0d651a39680dULL, + 0xcffafa79e93583faULL, + 0x5bdfdf69a384b6dfULL, + 0xe57e7ea9fc9bd77eULL, + 0x9024241948b43d24ULL, + 0xec3b3bfe76d7c53bULL, + 0x96abab9a4b3d31abULL, + 0x1fcecef081d13eceULL, + 0x4411119922558811ULL, + 0x068f8f8303890c8fULL, + 0x254e4e049c6b4a4eULL, + 0xe6b7b7667351d1b7ULL, + 0x8bebebe0cb600bebULL, + 0xf03c3cc178ccfd3cULL, + 0x3e8181fd1fbf7c81ULL, + 0x6a94944035fed494ULL, + 0xfbf7f71cf30cebf7ULL, + 0xdeb9b9186f67a1b9ULL, + 0x4c13138b265f9813ULL, + 0xb02c2c51589c7d2cULL, + 0x6bd3d305bbb8d6d3ULL, + 0xbbe7e78cd35c6be7ULL, + 0xa56e6e39dccb576eULL, + 0x37c4c4aa95f36ec4ULL, + 0x0c03031b060f1803ULL, + 0x455656dcac138a56ULL, + 0x0d44445e88491a44ULL, + 0xe17f7fa0fe9edf7fULL, + 0x9ea9a9884f3721a9ULL, + 0xa82a2a6754824d2aULL, + 0xd6bbbb0a6b6db1bbULL, + 0x23c1c1879fe246c1ULL, + 0x515353f1a602a253ULL, + 0x57dcdc72a58baedcULL, + 0x2c0b0b531627580bULL, + 0x4e9d9d0127d39c9dULL, + 0xad6c6c2bd8c1476cULL, + 0xc43131a462f59531ULL, + 0xcd7474f3e8b98774ULL, + 0xfff6f615f109e3f6ULL, + 0x0546464c8c430a46ULL, + 0x8aacaca5452609acULL, + 0x1e8989b50f973c89ULL, + 0x501414b42844a014ULL, + 0xa3e1e1badf425be1ULL, + 0x581616a62c4eb016ULL, + 0xe83a3af774d2cd3aULL, + 0xb9696906d2d06f69ULL, + 0x24090941122d4809ULL, + 0xdd7070d7e0ada770ULL, + 0xe2b6b66f7154d9b6ULL, + 0x67d0d01ebdb7ced0ULL, + 0x93ededd6c77e3bedULL, + 0x17cccce285db2eccULL, + 0x1542426884572a42ULL, + 0x5a98982c2dc2b498ULL, + 0xaaa4a4ed550e49a4ULL, + 0xa028287550885d28ULL, + 0x6d5c5c86b831da5cULL, + 0xc7f8f86bed3f93f8ULL, + 0x228686c211a44486ULL, +}; + +static const uint64_t T6[256] = { + 0x1818d83078c01860ULL, + 0x23232646af05238cULL, + 0xc6c6b891f97ec63fULL, + 0xe8e8fbcd6f13e887ULL, + 0x8787cb13a14c8726ULL, + 0xb8b8116d62a9b8daULL, + 0x0101090205080104ULL, + 0x4f4f0d9e6e424f21ULL, + 0x36369b6ceead36d8ULL, + 0xa6a6ff510459a6a2ULL, + 0xd2d20cb9bdded26fULL, + 0xf5f50ef706fbf5f3ULL, + 0x797996f280ef79f9ULL, + 0x6f6f30dece5f6fa1ULL, + 0x91916d3feffc917eULL, + 0x5252f8a407aa5255ULL, + 0x606047c0fd27609dULL, + 0xbcbc35657689bccaULL, + 0x9b9b372bcdac9b56ULL, + 0x8e8e8a018c048e02ULL, + 0xa3a3d25b1571a3b6ULL, + 0x0c0c6c183c600c30ULL, + 0x7b7b84f68aff7bf1ULL, + 0x3535806ae1b535d4ULL, + 0x1d1df53a69e81d74ULL, + 0xe0e0b3dd4753e0a7ULL, + 0xd7d721b3acf6d77bULL, + 0xc2c29c99ed5ec22fULL, + 0x2e2e435c966d2eb8ULL, + 0x4b4b29967a624b31ULL, + 0xfefe5de121a3fedfULL, + 0x5757d5ae16825741ULL, + 0x1515bd2a41a81554ULL, + 0x7777e8eeb69f77c1ULL, + 0x3737926eeba537dcULL, + 0xe5e59ed7567be5b3ULL, + 0x9f9f1323d98c9f46ULL, + 0xf0f023fd17d3f0e7ULL, + 0x4a4a20947f6a4a35ULL, + 0xdada44a9959eda4fULL, + 0x5858a2b025fa587dULL, + 0xc9c9cf8fca06c903ULL, + 0x29297c528d5529a4ULL, + 0x0a0a5a1422500a28ULL, + 0xb1b1507f4fe1b1feULL, + 0xa0a0c95d1a69a0baULL, + 0x6b6b14d6da7f6bb1ULL, + 0x8585d917ab5c852eULL, + 0xbdbd3c677381bdceULL, + 0x5d5d8fba34d25d69ULL, + 0x1010902050801040ULL, + 0xf4f407f503f3f4f7ULL, + 0xcbcbdd8bc016cb0bULL, + 0x3e3ed37cc6ed3ef8ULL, + 0x05052d0a11280514ULL, + 0x676778cee61f6781ULL, + 0xe4e497d55373e4b7ULL, + 0x2727024ebb25279cULL, + 0x4141738258324119ULL, + 0x8b8ba70b9d2c8b16ULL, + 0xa7a7f6530151a7a6ULL, + 0x7d7db2fa94cf7de9ULL, + 0x95954937fbdc956eULL, + 0xd8d856ad9f8ed847ULL, + 0xfbfb70eb308bfbcbULL, + 0xeeeecdc17123ee9fULL, + 0x7c7cbbf891c77cedULL, + 0x666671cce3176685ULL, + 0xdddd7ba78ea6dd53ULL, + 0x1717af2e4bb8175cULL, + 0x4747458e46024701ULL, + 0x9e9e1a21dc849e42ULL, + 0xcacad489c51eca0fULL, + 0x2d2d585a99752db4ULL, + 0xbfbf2e637991bfc6ULL, + 0x07073f0e1b38071cULL, + 0xadadac472301ad8eULL, + 0x5a5ab0b42fea5a75ULL, + 0x8383ef1bb56c8336ULL, + 0x3333b666ff8533ccULL, + 0x63635cc6f23f6391ULL, + 0x020212040a100208ULL, + 0xaaaa93493839aa92ULL, + 0x7171dee2a8af71d9ULL, + 0xc8c8c68dcf0ec807ULL, + 0x1919d1327dc81964ULL, + 0x49493b9270724939ULL, + 0xd9d95faf9a86d943ULL, + 0xf2f231f91dc3f2efULL, + 0xe3e3a8db484be3abULL, + 0x5b5bb9b62ae25b71ULL, + 0x8888bc0d9234881aULL, + 0x9a9a3e29c8a49a52ULL, + 0x26260b4cbe2d2698ULL, + 0x3232bf64fa8d32c8ULL, + 0xb0b0597d4ae9b0faULL, + 0xe9e9f2cf6a1be983ULL, + 0x0f0f771e33780f3cULL, + 0xd5d533b7a6e6d573ULL, + 0x8080f41dba74803aULL, + 0xbebe27617c99bec2ULL, + 0xcdcdeb87de26cd13ULL, + 0x34348968e4bd34d0ULL, + 0x48483290757a483dULL, + 0xffff54e324abffdbULL, + 0x7a7a8df48ff77af5ULL, + 0x9090643deaf4907aULL, + 0x5f5f9dbe3ec25f61ULL, + 0x20203d40a01d2080ULL, + 0x68680fd0d56768bdULL, + 0x1a1aca3472d01a68ULL, + 0xaeaeb7412c19ae82ULL, + 0xb4b47d755ec9b4eaULL, + 0x5454cea8199a544dULL, + 0x93937f3be5ec9376ULL, + 0x22222f44aa0d2288ULL, + 0x646463c8e907648dULL, + 0xf1f12aff12dbf1e3ULL, + 0x7373cce6a2bf73d1ULL, + 0x121282245a901248ULL, + 0x40407a805d3a401dULL, + 0x0808481028400820ULL, + 0xc3c3959be856c32bULL, + 0xececdfc57b33ec97ULL, + 0xdbdb4dab9096db4bULL, + 0xa1a1c05f1f61a1beULL, + 0x8d8d9107831c8d0eULL, + 0x3d3dc87ac9f53df4ULL, + 0x97975b33f1cc9766ULL, + 0x0000000000000000ULL, + 0xcfcff983d436cf1bULL, + 0x2b2b6e5687452bacULL, + 0x7676e1ecb39776c5ULL, + 0x8282e619b0648232ULL, + 0xd6d628b1a9fed67fULL, + 0x1b1bc33677d81b6cULL, + 0xb5b574775bc1b5eeULL, + 0xafafbe432911af86ULL, + 0x6a6a1dd4df776ab5ULL, + 0x5050eaa00dba505dULL, + 0x4545578a4c124509ULL, + 0xf3f338fb18cbf3ebULL, + 0x3030ad60f09d30c0ULL, + 0xefefc4c3742bef9bULL, + 0x3f3fda7ec3e53ffcULL, + 0x5555c7aa1c925549ULL, + 0xa2a2db591079a2b2ULL, + 0xeaeae9c96503ea8fULL, + 0x65656acaec0f6589ULL, + 0xbaba036968b9bad2ULL, + 0x2f2f4a5e93652fbcULL, + 0xc0c08e9de74ec027ULL, + 0xdede60a181bede5fULL, + 0x1c1cfc386ce01c70ULL, + 0xfdfd46e72ebbfdd3ULL, + 0x4d4d1f9a64524d29ULL, + 0x92927639e0e49272ULL, + 0x7575faeabc8f75c9ULL, + 0x0606360c1e300618ULL, + 0x8a8aae0998248a12ULL, + 0xb2b24b7940f9b2f2ULL, + 0xe6e685d15963e6bfULL, + 0x0e0e7e1c36700e38ULL, + 0x1f1fe73e63f81f7cULL, + 0x626255c4f7376295ULL, + 0xd4d43ab5a3eed477ULL, + 0xa8a8814d3229a89aULL, + 0x96965231f4c49662ULL, + 0xf9f962ef3a9bf9c3ULL, + 0xc5c5a397f666c533ULL, + 0x2525104ab1352594ULL, + 0x5959abb220f25979ULL, + 0x8484d015ae54842aULL, + 0x7272c5e4a7b772d5ULL, + 0x3939ec72ddd539e4ULL, + 0x4c4c1698615a4c2dULL, + 0x5e5e94bc3bca5e65ULL, + 0x78789ff085e778fdULL, + 0x3838e570d8dd38e0ULL, + 0x8c8c980586148c0aULL, + 0xd1d117bfb2c6d163ULL, + 0xa5a5e4570b41a5aeULL, + 0xe2e2a1d94d43e2afULL, + 0x61614ec2f82f6199ULL, + 0xb3b3427b45f1b3f6ULL, + 0x21213442a5152184ULL, + 0x9c9c0825d6949c4aULL, + 0x1e1eee3c66f01e78ULL, + 0x4343618652224311ULL, + 0xc7c7b193fc76c73bULL, + 0xfcfc4fe52bb3fcd7ULL, + 0x0404240814200410ULL, + 0x5151e3a208b25159ULL, + 0x9999252fc7bc995eULL, + 0x6d6d22dac44f6da9ULL, + 0x0d0d651a39680d34ULL, + 0xfafa79e93583facfULL, + 0xdfdf69a384b6df5bULL, + 0x7e7ea9fc9bd77ee5ULL, + 0x24241948b43d2490ULL, + 0x3b3bfe76d7c53becULL, + 0xabab9a4b3d31ab96ULL, + 0xcecef081d13ece1fULL, + 0x1111992255881144ULL, + 0x8f8f8303890c8f06ULL, + 0x4e4e049c6b4a4e25ULL, + 0xb7b7667351d1b7e6ULL, + 0xebebe0cb600beb8bULL, + 0x3c3cc178ccfd3cf0ULL, + 0x8181fd1fbf7c813eULL, + 0x94944035fed4946aULL, + 0xf7f71cf30cebf7fbULL, + 0xb9b9186f67a1b9deULL, + 0x13138b265f98134cULL, + 0x2c2c51589c7d2cb0ULL, + 0xd3d305bbb8d6d36bULL, + 0xe7e78cd35c6be7bbULL, + 0x6e6e39dccb576ea5ULL, + 0xc4c4aa95f36ec437ULL, + 0x03031b060f18030cULL, + 0x5656dcac138a5645ULL, + 0x44445e88491a440dULL, + 0x7f7fa0fe9edf7fe1ULL, + 0xa9a9884f3721a99eULL, + 0x2a2a6754824d2aa8ULL, + 0xbbbb0a6b6db1bbd6ULL, + 0xc1c1879fe246c123ULL, + 0x5353f1a602a25351ULL, + 0xdcdc72a58baedc57ULL, + 0x0b0b531627580b2cULL, + 0x9d9d0127d39c9d4eULL, + 0x6c6c2bd8c1476cadULL, + 0x3131a462f59531c4ULL, + 0x7474f3e8b98774cdULL, + 0xf6f615f109e3f6ffULL, + 0x46464c8c430a4605ULL, + 0xacaca5452609ac8aULL, + 0x8989b50f973c891eULL, + 0x1414b42844a01450ULL, + 0xe1e1badf425be1a3ULL, + 0x1616a62c4eb01658ULL, + 0x3a3af774d2cd3ae8ULL, + 0x696906d2d06f69b9ULL, + 0x090941122d480924ULL, + 0x7070d7e0ada770ddULL, + 0xb6b66f7154d9b6e2ULL, + 0xd0d01ebdb7ced067ULL, + 0xededd6c77e3bed93ULL, + 0xcccce285db2ecc17ULL, + 0x42426884572a4215ULL, + 0x98982c2dc2b4985aULL, + 0xa4a4ed550e49a4aaULL, + 0x28287550885d28a0ULL, + 0x5c5c86b831da5c6dULL, + 0xf8f86bed3f93f8c7ULL, + 0x8686c211a4448622ULL, +}; + +static const uint64_t T7[256] = { + 0x18d83078c0186018ULL, + 0x232646af05238c23ULL, + 0xc6b891f97ec63fc6ULL, + 0xe8fbcd6f13e887e8ULL, + 0x87cb13a14c872687ULL, + 0xb8116d62a9b8dab8ULL, + 0x0109020508010401ULL, + 0x4f0d9e6e424f214fULL, + 0x369b6ceead36d836ULL, + 0xa6ff510459a6a2a6ULL, + 0xd20cb9bdded26fd2ULL, + 0xf50ef706fbf5f3f5ULL, + 0x7996f280ef79f979ULL, + 0x6f30dece5f6fa16fULL, + 0x916d3feffc917e91ULL, + 0x52f8a407aa525552ULL, + 0x6047c0fd27609d60ULL, + 0xbc35657689bccabcULL, + 0x9b372bcdac9b569bULL, + 0x8e8a018c048e028eULL, + 0xa3d25b1571a3b6a3ULL, + 0x0c6c183c600c300cULL, + 0x7b84f68aff7bf17bULL, + 0x35806ae1b535d435ULL, + 0x1df53a69e81d741dULL, + 0xe0b3dd4753e0a7e0ULL, + 0xd721b3acf6d77bd7ULL, + 0xc29c99ed5ec22fc2ULL, + 0x2e435c966d2eb82eULL, + 0x4b29967a624b314bULL, + 0xfe5de121a3fedffeULL, + 0x57d5ae1682574157ULL, + 0x15bd2a41a8155415ULL, + 0x77e8eeb69f77c177ULL, + 0x37926eeba537dc37ULL, + 0xe59ed7567be5b3e5ULL, + 0x9f1323d98c9f469fULL, + 0xf023fd17d3f0e7f0ULL, + 0x4a20947f6a4a354aULL, + 0xda44a9959eda4fdaULL, + 0x58a2b025fa587d58ULL, + 0xc9cf8fca06c903c9ULL, + 0x297c528d5529a429ULL, + 0x0a5a1422500a280aULL, + 0xb1507f4fe1b1feb1ULL, + 0xa0c95d1a69a0baa0ULL, + 0x6b14d6da7f6bb16bULL, + 0x85d917ab5c852e85ULL, + 0xbd3c677381bdcebdULL, + 0x5d8fba34d25d695dULL, + 0x1090205080104010ULL, + 0xf407f503f3f4f7f4ULL, + 0xcbdd8bc016cb0bcbULL, + 0x3ed37cc6ed3ef83eULL, + 0x052d0a1128051405ULL, + 0x6778cee61f678167ULL, + 0xe497d55373e4b7e4ULL, + 0x27024ebb25279c27ULL, + 0x4173825832411941ULL, + 0x8ba70b9d2c8b168bULL, + 0xa7f6530151a7a6a7ULL, + 0x7db2fa94cf7de97dULL, + 0x954937fbdc956e95ULL, + 0xd856ad9f8ed847d8ULL, + 0xfb70eb308bfbcbfbULL, + 0xeecdc17123ee9feeULL, + 0x7cbbf891c77ced7cULL, + 0x6671cce317668566ULL, + 0xdd7ba78ea6dd53ddULL, + 0x17af2e4bb8175c17ULL, + 0x47458e4602470147ULL, + 0x9e1a21dc849e429eULL, + 0xcad489c51eca0fcaULL, + 0x2d585a99752db42dULL, + 0xbf2e637991bfc6bfULL, + 0x073f0e1b38071c07ULL, + 0xadac472301ad8eadULL, + 0x5ab0b42fea5a755aULL, + 0x83ef1bb56c833683ULL, + 0x33b666ff8533cc33ULL, + 0x635cc6f23f639163ULL, + 0x0212040a10020802ULL, + 0xaa93493839aa92aaULL, + 0x71dee2a8af71d971ULL, + 0xc8c68dcf0ec807c8ULL, + 0x19d1327dc8196419ULL, + 0x493b927072493949ULL, + 0xd95faf9a86d943d9ULL, + 0xf231f91dc3f2eff2ULL, + 0xe3a8db484be3abe3ULL, + 0x5bb9b62ae25b715bULL, + 0x88bc0d9234881a88ULL, + 0x9a3e29c8a49a529aULL, + 0x260b4cbe2d269826ULL, + 0x32bf64fa8d32c832ULL, + 0xb0597d4ae9b0fab0ULL, + 0xe9f2cf6a1be983e9ULL, + 0x0f771e33780f3c0fULL, + 0xd533b7a6e6d573d5ULL, + 0x80f41dba74803a80ULL, + 0xbe27617c99bec2beULL, + 0xcdeb87de26cd13cdULL, + 0x348968e4bd34d034ULL, + 0x483290757a483d48ULL, + 0xff54e324abffdbffULL, + 0x7a8df48ff77af57aULL, + 0x90643deaf4907a90ULL, + 0x5f9dbe3ec25f615fULL, + 0x203d40a01d208020ULL, + 0x680fd0d56768bd68ULL, + 0x1aca3472d01a681aULL, + 0xaeb7412c19ae82aeULL, + 0xb47d755ec9b4eab4ULL, + 0x54cea8199a544d54ULL, + 0x937f3be5ec937693ULL, + 0x222f44aa0d228822ULL, + 0x6463c8e907648d64ULL, + 0xf12aff12dbf1e3f1ULL, + 0x73cce6a2bf73d173ULL, + 0x1282245a90124812ULL, + 0x407a805d3a401d40ULL, + 0x0848102840082008ULL, + 0xc3959be856c32bc3ULL, + 0xecdfc57b33ec97ecULL, + 0xdb4dab9096db4bdbULL, + 0xa1c05f1f61a1bea1ULL, + 0x8d9107831c8d0e8dULL, + 0x3dc87ac9f53df43dULL, + 0x975b33f1cc976697ULL, + 0x0000000000000000ULL, + 0xcff983d436cf1bcfULL, + 0x2b6e5687452bac2bULL, + 0x76e1ecb39776c576ULL, + 0x82e619b064823282ULL, + 0xd628b1a9fed67fd6ULL, + 0x1bc33677d81b6c1bULL, + 0xb574775bc1b5eeb5ULL, + 0xafbe432911af86afULL, + 0x6a1dd4df776ab56aULL, + 0x50eaa00dba505d50ULL, + 0x45578a4c12450945ULL, + 0xf338fb18cbf3ebf3ULL, + 0x30ad60f09d30c030ULL, + 0xefc4c3742bef9befULL, + 0x3fda7ec3e53ffc3fULL, + 0x55c7aa1c92554955ULL, + 0xa2db591079a2b2a2ULL, + 0xeae9c96503ea8feaULL, + 0x656acaec0f658965ULL, + 0xba036968b9bad2baULL, + 0x2f4a5e93652fbc2fULL, + 0xc08e9de74ec027c0ULL, + 0xde60a181bede5fdeULL, + 0x1cfc386ce01c701cULL, + 0xfd46e72ebbfdd3fdULL, + 0x4d1f9a64524d294dULL, + 0x927639e0e4927292ULL, + 0x75faeabc8f75c975ULL, + 0x06360c1e30061806ULL, + 0x8aae0998248a128aULL, + 0xb24b7940f9b2f2b2ULL, + 0xe685d15963e6bfe6ULL, + 0x0e7e1c36700e380eULL, + 0x1fe73e63f81f7c1fULL, + 0x6255c4f737629562ULL, + 0xd43ab5a3eed477d4ULL, + 0xa8814d3229a89aa8ULL, + 0x965231f4c4966296ULL, + 0xf962ef3a9bf9c3f9ULL, + 0xc5a397f666c533c5ULL, + 0x25104ab135259425ULL, + 0x59abb220f2597959ULL, + 0x84d015ae54842a84ULL, + 0x72c5e4a7b772d572ULL, + 0x39ec72ddd539e439ULL, + 0x4c1698615a4c2d4cULL, + 0x5e94bc3bca5e655eULL, + 0x789ff085e778fd78ULL, + 0x38e570d8dd38e038ULL, + 0x8c980586148c0a8cULL, + 0xd117bfb2c6d163d1ULL, + 0xa5e4570b41a5aea5ULL, + 0xe2a1d94d43e2afe2ULL, + 0x614ec2f82f619961ULL, + 0xb3427b45f1b3f6b3ULL, + 0x213442a515218421ULL, + 0x9c0825d6949c4a9cULL, + 0x1eee3c66f01e781eULL, + 0x4361865222431143ULL, + 0xc7b193fc76c73bc7ULL, + 0xfc4fe52bb3fcd7fcULL, + 0x0424081420041004ULL, + 0x51e3a208b2515951ULL, + 0x99252fc7bc995e99ULL, + 0x6d22dac44f6da96dULL, + 0x0d651a39680d340dULL, + 0xfa79e93583facffaULL, + 0xdf69a384b6df5bdfULL, + 0x7ea9fc9bd77ee57eULL, + 0x241948b43d249024ULL, + 0x3bfe76d7c53bec3bULL, + 0xab9a4b3d31ab96abULL, + 0xcef081d13ece1fceULL, + 0x1199225588114411ULL, + 0x8f8303890c8f068fULL, + 0x4e049c6b4a4e254eULL, + 0xb7667351d1b7e6b7ULL, + 0xebe0cb600beb8bebULL, + 0x3cc178ccfd3cf03cULL, + 0x81fd1fbf7c813e81ULL, + 0x944035fed4946a94ULL, + 0xf71cf30cebf7fbf7ULL, + 0xb9186f67a1b9deb9ULL, + 0x138b265f98134c13ULL, + 0x2c51589c7d2cb02cULL, + 0xd305bbb8d6d36bd3ULL, + 0xe78cd35c6be7bbe7ULL, + 0x6e39dccb576ea56eULL, + 0xc4aa95f36ec437c4ULL, + 0x031b060f18030c03ULL, + 0x56dcac138a564556ULL, + 0x445e88491a440d44ULL, + 0x7fa0fe9edf7fe17fULL, + 0xa9884f3721a99ea9ULL, + 0x2a6754824d2aa82aULL, + 0xbb0a6b6db1bbd6bbULL, + 0xc1879fe246c123c1ULL, + 0x53f1a602a2535153ULL, + 0xdc72a58baedc57dcULL, + 0x0b531627580b2c0bULL, + 0x9d0127d39c9d4e9dULL, + 0x6c2bd8c1476cad6cULL, + 0x31a462f59531c431ULL, + 0x74f3e8b98774cd74ULL, + 0xf615f109e3f6fff6ULL, + 0x464c8c430a460546ULL, + 0xaca5452609ac8aacULL, + 0x89b50f973c891e89ULL, + 0x14b42844a0145014ULL, + 0xe1badf425be1a3e1ULL, + 0x16a62c4eb0165816ULL, + 0x3af774d2cd3ae83aULL, + 0x6906d2d06f69b969ULL, + 0x0941122d48092409ULL, + 0x70d7e0ada770dd70ULL, + 0xb66f7154d9b6e2b6ULL, + 0xd01ebdb7ced067d0ULL, + 0xedd6c77e3bed93edULL, + 0xcce285db2ecc17ccULL, + 0x426884572a421542ULL, + 0x982c2dc2b4985a98ULL, + 0xa4ed550e49a4aaa4ULL, + 0x287550885d28a028ULL, + 0x5c86b831da5c6d5cULL, + 0xf86bed3f93f8c7f8ULL, + 0x86c211a444862286ULL, +}; + +struct whirlpool_context { + uint64_t H[8]; + uint64_t len; + uint8_t m[512 / 8]; + unsigned int m_len; +}; + +static void __whirlpool_update(void *_ctx, const uint8_t *m) +{ + struct whirlpool_context *ctx = _ctx; + uint64_t W[8], K[8]; + unsigned int i; + int r; + + for (i = 0; i < 8; i++) { + K[i] = ctx->H[i]; + W[i] = K[i] ^ le64toh(*(uint64_t *)(m + 8 * i)); + } + + for (r = 0; r < R; r++) { + uint64_t K1[8]; + uint64_t W1[8]; + + K1[0] = T0[K[0] & 0xff] ^ + T1[(K[7] >> (1 * 8)) & 0xff] ^ + T2[(K[6] >> (2 * 8)) & 0xff] ^ + T3[(K[5] >> (3 * 8)) & 0xff] ^ + T4[(K[4] >> (4 * 8)) & 0xff] ^ + T5[(K[3] >> (5 * 8)) & 0xff] ^ + T6[(K[2] >> (6 * 8)) & 0xff] ^ + T7[(K[1] >> (7 * 8)) & 0xff] ^ + c[r]; + K1[1] = T0[K[1] & 0xff] ^ + T1[(K[0] >> (1 * 8)) & 0xff] ^ + T2[(K[7] >> (2 * 8)) & 0xff] ^ + T3[(K[6] >> (3 * 8)) & 0xff] ^ + T4[(K[5] >> (4 * 8)) & 0xff] ^ + T5[(K[4] >> (5 * 8)) & 0xff] ^ + T6[(K[3] >> (6 * 8)) & 0xff] ^ + T7[(K[2] >> (7 * 8)) & 0xff]; + K1[2] = T0[K[2] & 0xff] ^ + T1[(K[1] >> (1 * 8)) & 0xff] ^ + T2[(K[0] >> (2 * 8)) & 0xff] ^ + T3[(K[7] >> (3 * 8)) & 0xff] ^ + T4[(K[6] >> (4 * 8)) & 0xff] ^ + T5[(K[5] >> (5 * 8)) & 0xff] ^ + T6[(K[4] >> (6 * 8)) & 0xff] ^ + T7[(K[3] >> (7 * 8)) & 0xff]; + K1[3] = T0[K[3] & 0xff] ^ + T1[(K[2] >> (1 * 8)) & 0xff] ^ + T2[(K[1] >> (2 * 8)) & 0xff] ^ + T3[(K[0] >> (3 * 8)) & 0xff] ^ + T4[(K[7] >> (4 * 8)) & 0xff] ^ + T5[(K[6] >> (5 * 8)) & 0xff] ^ + T6[(K[5] >> (6 * 8)) & 0xff] ^ + T7[(K[4] >> (7 * 8)) & 0xff]; + K1[4] = T0[K[4] & 0xff] ^ + T1[(K[3] >> (1 * 8)) & 0xff] ^ + T2[(K[2] >> (2 * 8)) & 0xff] ^ + T3[(K[1] >> (3 * 8)) & 0xff] ^ + T4[(K[0] >> (4 * 8)) & 0xff] ^ + T5[(K[7] >> (5 * 8)) & 0xff] ^ + T6[(K[6] >> (6 * 8)) & 0xff] ^ + T7[(K[5] >> (7 * 8)) & 0xff]; + K1[5] = T0[K[5] & 0xff] ^ + T1[(K[4] >> (1 * 8)) & 0xff] ^ + T2[(K[3] >> (2 * 8)) & 0xff] ^ + T3[(K[2] >> (3 * 8)) & 0xff] ^ + T4[(K[1] >> (4 * 8)) & 0xff] ^ + T5[(K[0] >> (5 * 8)) & 0xff] ^ + T6[(K[7] >> (6 * 8)) & 0xff] ^ + T7[(K[6] >> (7 * 8)) & 0xff]; + K1[6] = T0[K[6] & 0xff] ^ + T1[(K[5] >> (1 * 8)) & 0xff] ^ + T2[(K[4] >> (2 * 8)) & 0xff] ^ + T3[(K[3] >> (3 * 8)) & 0xff] ^ + T4[(K[2] >> (4 * 8)) & 0xff] ^ + T5[(K[1] >> (5 * 8)) & 0xff] ^ + T6[(K[0] >> (6 * 8)) & 0xff] ^ + T7[(K[7] >> (7 * 8)) & 0xff]; + K1[7] = T0[K[7] & 0xff] ^ + T1[(K[6] >> (1 * 8)) & 0xff] ^ + T2[(K[5] >> (2 * 8)) & 0xff] ^ + T3[(K[4] >> (3 * 8)) & 0xff] ^ + T4[(K[3] >> (4 * 8)) & 0xff] ^ + T5[(K[2] >> (5 * 8)) & 0xff] ^ + T6[(K[1] >> (6 * 8)) & 0xff] ^ + T7[(K[0] >> (7 * 8)) & 0xff]; + + for (i = 0; i < 8; i++) + K[i] = K1[i]; + + W1[0] = T0[W[0] & 0xff] ^ + T1[(W[7] >> (1 * 8)) & 0xff] ^ + T2[(W[6] >> (2 * 8)) & 0xff] ^ + T3[(W[5] >> (3 * 8)) & 0xff] ^ + T4[(W[4] >> (4 * 8)) & 0xff] ^ + T5[(W[3] >> (5 * 8)) & 0xff] ^ + T6[(W[2] >> (6 * 8)) & 0xff] ^ + T7[(W[1] >> (7 * 8)) & 0xff] ^ + K[0]; + W1[1] = T0[W[1] & 0xff] ^ + T1[(W[0] >> (1 * 8)) & 0xff] ^ + T2[(W[7] >> (2 * 8)) & 0xff] ^ + T3[(W[6] >> (3 * 8)) & 0xff] ^ + T4[(W[5] >> (4 * 8)) & 0xff] ^ + T5[(W[4] >> (5 * 8)) & 0xff] ^ + T6[(W[3] >> (6 * 8)) & 0xff] ^ + T7[(W[2] >> (7 * 8)) & 0xff] ^ + K[1]; + W1[2] = T0[W[2] & 0xff] ^ + T1[(W[1] >> (1 * 8)) & 0xff] ^ + T2[(W[0] >> (2 * 8)) & 0xff] ^ + T3[(W[7] >> (3 * 8)) & 0xff] ^ + T4[(W[6] >> (4 * 8)) & 0xff] ^ + T5[(W[5] >> (5 * 8)) & 0xff] ^ + T6[(W[4] >> (6 * 8)) & 0xff] ^ + T7[(W[3] >> (7 * 8)) & 0xff] ^ + K[2]; + W1[3] = T0[W[3] & 0xff] ^ + T1[(W[2] >> (1 * 8)) & 0xff] ^ + T2[(W[1] >> (2 * 8)) & 0xff] ^ + T3[(W[0] >> (3 * 8)) & 0xff] ^ + T4[(W[7] >> (4 * 8)) & 0xff] ^ + T5[(W[6] >> (5 * 8)) & 0xff] ^ + T6[(W[5] >> (6 * 8)) & 0xff] ^ + T7[(W[4] >> (7 * 8)) & 0xff] ^ + K[3]; + W1[4] = T0[W[4] & 0xff] ^ + T1[(W[3] >> (1 * 8)) & 0xff] ^ + T2[(W[2] >> (2 * 8)) & 0xff] ^ + T3[(W[1] >> (3 * 8)) & 0xff] ^ + T4[(W[0] >> (4 * 8)) & 0xff] ^ + T5[(W[7] >> (5 * 8)) & 0xff] ^ + T6[(W[6] >> (6 * 8)) & 0xff] ^ + T7[(W[5] >> (7 * 8)) & 0xff] ^ + K[4]; + W1[5] = T0[W[5] & 0xff] ^ + T1[(W[4] >> (1 * 8)) & 0xff] ^ + T2[(W[3] >> (2 * 8)) & 0xff] ^ + T3[(W[2] >> (3 * 8)) & 0xff] ^ + T4[(W[1] >> (4 * 8)) & 0xff] ^ + T5[(W[0] >> (5 * 8)) & 0xff] ^ + T6[(W[7] >> (6 * 8)) & 0xff] ^ + T7[(W[6] >> (7 * 8)) & 0xff] ^ + K[5]; + W1[6] = T0[W[6] & 0xff] ^ + T1[(W[5] >> (1 * 8)) & 0xff] ^ + T2[(W[4] >> (2 * 8)) & 0xff] ^ + T3[(W[3] >> (3 * 8)) & 0xff] ^ + T4[(W[2] >> (4 * 8)) & 0xff] ^ + T5[(W[1] >> (5 * 8)) & 0xff] ^ + T6[(W[0] >> (6 * 8)) & 0xff] ^ + T7[(W[7] >> (7 * 8)) & 0xff] ^ + K[6]; + W1[7] = T0[W[7] & 0xff] ^ + T1[(W[6] >> (1 * 8)) & 0xff] ^ + T2[(W[5] >> (2 * 8)) & 0xff] ^ + T3[(W[4] >> (3 * 8)) & 0xff] ^ + T4[(W[3] >> (4 * 8)) & 0xff] ^ + T5[(W[2] >> (5 * 8)) & 0xff] ^ + T6[(W[1] >> (6 * 8)) & 0xff] ^ + T7[(W[0] >> (7 * 8)) & 0xff] ^ + K[7]; + + for (i = 0; i < 8; i++) + W[i] = W1[i]; + } + + for (i = 0; i < 8; i++) + ctx->H[i] ^= W[i] ^ le64toh(*(uint64_t *)(m + 8 * i)); +} + +void *whirlpool_init_context(void) +{ + struct whirlpool_context *ctx; + + ctx = malloc(sizeof(struct whirlpool_context)); + if (!ctx) + return NULL; + memset(ctx, 0, sizeof(struct whirlpool_context)); + return ctx; +} + +void whirlpool_fini_context(void *_ctx) +{ + struct whirlpool_context *ctx = _ctx; + + memset(ctx, 0, sizeof(struct whirlpool_context)); + free(ctx); +} + +void whirlpool_update(void *_ctx, const uint8_t *m) +{ + struct whirlpool_context *ctx = _ctx; + + __whirlpool_update(ctx, m); + ctx->len += 512; +} + +void _whirlpool_update(void *_ctx, const uint8_t *m, unsigned int len) +{ + struct whirlpool_context *ctx = _ctx; + + while (len > 0) { + unsigned int inc; + + if (64 - ctx->m_len < len) + inc = 64 - ctx->m_len; + else + inc = len; + memcpy(&ctx->m[ctx->m_len], m, inc); + ctx->m_len += inc; + ctx->len += inc * 8; + len -= inc; + m += inc; + + if (ctx->m_len == 512 / 8) { + __whirlpool_update(ctx, ctx->m); + ctx->m_len = 0; + } + } +} + +void whirlpool_fini(void *_ctx) +{ + struct whirlpool_context *ctx = _ctx; + + ctx->m[ctx->m_len] = 0x80; + ctx->m_len++; + if (ctx->m_len <= 64 - 32) { + memset(&ctx->m[ctx->m_len], 0, 64 - 8 - ctx->m_len); + } else { + memset(&ctx->m[ctx->m_len], 0, 64 - ctx->m_len); + __whirlpool_update(ctx, ctx->m); + memset(ctx->m, 0, 64 - 8); + } + *(uint64_t *)&ctx->m[64 - 8] = htobe64(ctx->len); + __whirlpool_update(ctx, ctx->m); +} + +void whirlpool_digest(void *_ctx, uint8_t *digest) +{ + struct whirlpool_context *ctx = _ctx; + + memcpy(digest, ctx->H, 8 * 8); +} -- 2.11.4.GIT