Re: [PATCH v1] Crypt and decrypt files using password in keystore.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Gerd,

please use scripts/checkpatch.pl

currently i get
total: 2020 errors, 0 warnings, 2020 lines checked

We use kernel coding style. Please read it:
https://www.kernel.org/doc/html/v4.16/process/coding-style.html

Am 20.04.2018 um 10:01 schrieb Gerd Pauli:
> Adds ccryptlib library in crypto which implements a
> stream cipher based on the block cipher Rijndael,
> the candidate for the AES standard.
> Compatible with the ccrypt tool in linux
> from Peter Selinger.
> 
> Usage: ccrypt [-e|-d] -k KEYNAME_IN_KEYSTORE SRC DST
> 
> Signed-off-by: Gerd Pauli <gp@xxxxxxxxxxxxxxxxxx>
> ---
>  commands/Kconfig    |   17 +
>  commands/Makefile   |    1 +
>  commands/ccrypt.c   |  249 +++++++++
>  crypto/Kconfig      |    7 +
>  crypto/Makefile     |    1 +
>  crypto/ccryptlib.c  | 1467 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  include/ccryptlib.h |  102 ++++
>  7 files changed, 1844 insertions(+)
>  create mode 100644 commands/ccrypt.c
>  create mode 100644 crypto/ccryptlib.c
>  create mode 100644 include/ccryptlib.h
> 
> diff --git a/commands/Kconfig b/commands/Kconfig
> index 951a86963..b6911246a 100644
> --- a/commands/Kconfig
> +++ b/commands/Kconfig
> @@ -2137,6 +2137,23 @@ config CMD_SEED
>  	help
>  	  Seed the pseudo random number generator (PRNG)
>  
> +config CMD_CCRYPT
> +        tristate
> +        prompt "ccrypt"
> +        select CRYPTO_CCRYPTLIB
> +        select CRYPTO_KEYSTORE
> +        help
> +          encrypting/decrypting a character stream
> +          ccrypt implements a stream cipher based on the block cipher
> +          Rijndael.

> +          Usage: ccrypt [-ed] [-K name] srcfile dstfile
> +
> +          Options:
> +                        -e            encrypt srcfile to dstfile
> +                        -d            decrypt srcfile to dstfile
> +                        -k name       use key with name from keystore
> +

usage help should be provided by the command, not within Kconfig

>  # end Miscellaneous commands
>  endmenu
>  
> diff --git a/commands/Makefile b/commands/Makefile
> index eb4796389..3693bf553 100644
> --- a/commands/Makefile
> +++ b/commands/Makefile
> @@ -123,3 +123,4 @@ obj-$(CONFIG_CMD_MMC_EXTCSD)	+= mmc_extcsd.o
>  obj-$(CONFIG_CMD_NAND_BITFLIP)	+= nand-bitflip.o
>  obj-$(CONFIG_CMD_SEED)		+= seed.o
>  obj-$(CONFIG_CMD_IP_ROUTE_GET)  += ip-route-get.o
> +obj-$(CONFIG_CMD_CCRYPT)        += ccrypt.o
> diff --git a/commands/ccrypt.c b/commands/ccrypt.c
> new file mode 100644
> index 000000000..1b0ee9f1a
> --- /dev/null
> +++ b/commands/ccrypt.c
> @@ -0,0 +1,249 @@
> +/* -*- Mode:C; c-file-style:"linux"; -*- */

please no style annotations here.

> +/* Copyright (C) 2018 Gerd Pauli <gp@xxxxxxxxxxxxxxxxxx */
>
> +/* Copyright (C) 2000-2012 Peter Selinger. */

all this should be within one comment block

> +/* See file CREDITS for list of people who contributed to this
> + * project. 

no need for complete GPL text. Instead please use SPDX-License-Identifier
For example:
drivers/usb/gadget/f_fastboot.c
you will get some thing like:

/*
 * ccrypt implements a stream cipher based on the block cipher Rijndael
 *
 * Copyright (C) 2018 Gerd Pauli <gp@xxxxxxxxxxxxxxxxxx>
 * Copyright (C) 2000-2012 Peter Selinger
 *
 * SPDX-License-Identifier: GPL-2.0+
 */


> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + * 
> + * This program 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 General Public License for more details.    
> + */
> +
> +/* ccrypt implements a stream cipher based on the block cipher
> +   Rijndael  */
> +
> +/* needs library ccryptlib and keystore from barebox */

no need for this comment, needed headers are already included

> +#include <common.h>
> +#include <command.h>
> +#include <libfile.h>
> +#include <getopt.h>
> +#include <fcntl.h>
> +#include <fs.h>
> +#include <ccryptlib.h>

i prefer headers sorted alphabetically. this helps to reduce
patch conflicts.

> +#define INBUFSIZE 1024  
> +#define OUTBUFSIZE INBUFSIZE+32
> +
> +void ccrypt_error( int e ) {
> +	if ( e == -1 ) {  
> +		printf("ccrypt: %s\n",strerror(-errno));
> +		return;
> +	} 
> +        if ( e == -2 ) {
> +                switch (ccrypt_errno) {
> +                case CCRYPT_EFORMAT:
> +                        printf("ccrypt: %s\n","bad file format");
> +                        break;
> +                case CCRYPT_EMISMATCH:
> +                        printf("ccrypt: %s\n","key does not match");
> +                        break;
> +                case CCRYPT_EBUFFER:
> +                        printf("ccrypt: %s\n","buffer overflow");
> +                        break;
> +                default:
> +                        /* do nothing */
> +                        printf("ccrypt: %s %d\n","unknown ccrypt error: ",ccrypt_errno);
> +                        break;
> +		}
> +		return;
> +	}
> +	if ( e == -3 ) {  
> +		printf("ccrypt: %s\n","no key");
> +		return;
> +	} 
> +	printf("ccrypt: %s: %d\n","unknown error",e);
> +}
> +
> +static int do_ccrypt(int argc, char *argv[])
> +{
> +	int opt;
> +	int ret=-EINVAL;
> +	int encrypt=0;
> +	int decrypt=0;
> +	char *extract = NULL;
> +	char *from = NULL;
> +	char *to = NULL;
> +	char *r_buf = NULL;
> +	char *w_buf = NULL;
> +	int from_fd = 0;
> +	int to_fd = 0;
> +	int r,w;
> +	void *buf;
> +	ccrypt_stream_t ccs;
> +	ccrypt_stream_t *b = &ccs;
> +	char *key;
> +	int keylen;
> +	int eof=0;
> +
> +	while ((opt = getopt(argc, argv, "dek:")) > 0) {
> +		switch(opt) {
> +		case 'e':
> +			encrypt=1;
> +			break;
> +		case 'd':
> +			decrypt=1;
> +			break;
> +		case 'k':
> +			extract = optarg;
> +			break;
> +		}
> +	}
> +	if ( encrypt == 1 && decrypt == 1 ) 
> +		return ret;
> +	if ( extract == NULL )
> +		return ret;
> +
> +	if ( optind != 4 ) 
> +		return ret;
> +
> +	if ( argc != 6 )
> +		return ret;
> +
> +	from = argv[optind];
> +	to = argv[optind + 1];
> +
> +	r_buf=malloc(INBUFSIZE);
> +        if ( r_buf == NULL ) {
> +                ret = -1;
> +                goto out;
> +        }
> +        
> +	w_buf=malloc(OUTBUFSIZE);
> +        if ( w_buf == NULL ) {
> +                free(r_buf);
> +                ret = -1;
> +                goto out;
> +        }
> +  
> +	ret=keystore_get_secret(extract, (const u8 **)&key, &keylen);
> +
> +#ifdef DEBUG
> +        if ( key && keystore ) 
> +                memory_display(key,0,keylen,1,0);
> +#endif
> +        
> +        if ( ret ) {
> +                ret=-3;
> +		goto out;
> +        }
> +        
> +	from_fd = open(from, O_RDONLY);
> +	if (from_fd < 0) {
> +		printf("could not open %s: %s\n", from, errno_str());
> +		ret=-1;
> +		goto out;
> +	}
> +
> +	to_fd = open(to, O_WRONLY | O_CREAT | O_TRUNC);
> +	if (to_fd < 0) {
> +		printf("could not open %s: %s\n", to, errno_str());
> +		ret=-1;
> +		goto out;
> +	}
> +
> +	ret=0;
> +
> +	if ( encrypt == 1 ) 
> +		ret = ccencrypt_init(b, key, keylen);
> +  
> +	if ( decrypt == 1 ) 
> +		ret = ccdecrypt_init(b, key, keylen);
> +  
> +	if ( ret != 0 ) {
> +                printf("cc init error\n");
> +		goto out;
> +	}
> +
> +	b->avail_in = 0;
> +  
> +	while (1) {
> +		/* fill input buffer */
> +		if (b->avail_in == 0 && !eof) {
> +			r = read(from_fd, r_buf, INBUFSIZE);
> +			if (r < 0) {
> +				perror("read");
> +                                ret=-1;
> +				goto out;
> +			}
> +			if (!r)
> +				eof=1;
> +			b->next_in = &r_buf[0];
> +			b->avail_in = r;
> +		}
> +    
> +		/* prepare output buffer */
> +		b->next_out = &w_buf[0];
> +		b->avail_out = OUTBUFSIZE;
> +    
> +		/* do some work */
> +		if ( encrypt == 1 ) {
> +			ret = ccencrypt(b);
> +		}
> +		if ( decrypt == 1 ) {
> +			ret = ccdecrypt(b);
> +			if (ret) {
> +                                printf("cc dec err\n");
> +				ret=-2;
> +				goto out;
> +			}
> +		}
> +    
> +		r = OUTBUFSIZE-b->avail_out;
> +		buf = &w_buf[0];
> +
> +		/* process output buffer */
> +		while (r) {
> +			w = write(to_fd, buf, r);
> +			if (w < 0) {
> +                                printf("write error\n");
> +                                ret=-1;
> +				goto out;
> +			}
> +			buf += w;
> +			r -= w;
> +		}
> +
> +		/* ready */ 
> +		if (eof && b->avail_out != 0) {
> +			break;
> +		}
> +	}
> +	ret = 0;
> +out:
> +        free(r_buf);
> +        free(w_buf);
> +	if (from_fd > 0)
> +		close(from_fd);
> +	if (to_fd > 0)
> +		close(to_fd);
> +
> +	return ret;
> +}
> +
> +BAREBOX_CMD_HELP_START(ccrypt)
> +BAREBOX_CMD_HELP_TEXT("Rijandel Crypt and Decrypt")
> +BAREBOX_CMD_HELP_TEXT("")
> +BAREBOX_CMD_HELP_TEXT("Options:")
> +BAREBOX_CMD_HELP_OPT("-e", "encrypt")
> +BAREBOX_CMD_HELP_OPT("-d", "decrypt")
> +BAREBOX_CMD_HELP_OPT("-k name", "Name of key in keystore")
> +BAREBOX_CMD_HELP_END
> +
> +BAREBOX_CMD_START(ccrypt)
> +.cmd	= do_ccrypt,
> +	BAREBOX_CMD_DESC("Crypt and Decrypt Files")
> +	BAREBOX_CMD_OPTS("[-e|-d] -k NAME SRC DST")
> +        BAREBOX_CMD_GROUP(CMD_GRP_MISC)
> +	BAREBOX_CMD_HELP(cmd_ccrypt_help)
> +	BAREBOX_CMD_END
> diff --git a/crypto/Kconfig b/crypto/Kconfig
> index 6d65c24d4..08669a2de 100644
> --- a/crypto/Kconfig
> +++ b/crypto/Kconfig
> @@ -101,4 +101,11 @@ config CRYPTO_KEYSTORE
>  	  This is a simple keystore, which can be used to pass keys
>  	  between several components via simple interface.
>  
> +config CRYPTO_CCRYPTLIB
> +        bool "ccryptlib"
> +        help
> +          This option provides functions implementing a stream cipher based
> +          on the block cipher rijandel.
> +          The cipher is based on Peter Selingers ccrypt implementation.
> +
>  endmenu
> diff --git a/crypto/Makefile b/crypto/Makefile
> index a7240d1d6..1231bc76d 100644
> --- a/crypto/Makefile
> +++ b/crypto/Makefile
> @@ -14,3 +14,4 @@ obj-$(CONFIG_DIGEST_SHA512_GENERIC)	+= sha4.o
>  obj-$(CONFIG_CRYPTO_PBKDF2)	+= pbkdf2.o
>  obj-$(CONFIG_CRYPTO_RSA)	+= rsa.o
>  obj-$(CONFIG_CRYPTO_KEYSTORE)	+= keystore.o
> +obj-$(CONFIG_CRYPTO_CCRYPTLIB)  += ccryptlib.o
> diff --git a/crypto/ccryptlib.c b/crypto/ccryptlib.c
> new file mode 100644
> index 000000000..78f0ac843
> --- /dev/null
> +++ b/crypto/ccryptlib.c
> @@ -0,0 +1,1467 @@
> +/* -*- Mode:C; c-file-style:"linux"; -*- */
> +
> +/* Ported to barebox by Gerd Pauli <gp@xxxxxxxxxxxxxxxxxx> 2018 */
> +
> +/* Copyright (C) 2000-2012 Peter Selinger.
> +   This file is part of ccrypt. It is free software and it is covered
> +   by the GNU general public license. See the file COPYING for details. */
> +
> +/* NOTE: this library is copyrighted under the GNU General Public
> +   License, *not* under the GNU Library General Public License.  This
> +   means, among other things, that you cannot use this library in
> +   closed-source software. */
> +
> +/* ccryptlib implements a stream cipher based on the block cipher
> +   Rijndael, the candidate for the AES standard. */

Same header stile as before.

> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <ccryptlib.h>
> +#include <common.h>
> +#include <malloc.h>

includes alphabetically

> +/* ---------- rijandel.c ---------- */
> +
> +/* rijndael.c - optimized version of the Rijndeal cipher */
> +/* derived from original source: rijndael-alg-ref.c   v2.0   August '99
> + * Reference ANSI C code for NIST competition
> + * authors: Paulo Barreto
> + *          Vincent Rijmen
> + */
> +
> +typedef unsigned char word8;
> +
> +#ifdef UINT32_TYPE
> +typedef UINT32_TYPE word32;
> +#else
> +typedef int word32;		/* should be a 32-bit integer type */
> +#endif
> +
> +/* a type to hold 32 bits accessible as 1 integer or 4 bytes */
> +union word8x4_u {
> +        word8 w8[4];
> +        word32 w32;
> +};
> +typedef union word8x4_u word8x4;
> +
> +/* ---------- tables.c ------------ */
> +
> +word8x4 M0[4][256] = {
> +        {
> +                {{  0,   0,   0,   0}}, {{  2,   1,   1,   3}}, {{  4,   2,   2,   6}}, 
> +                {{  6,   3,   3,   5}}, {{  8,   4,   4,  12}}, {{ 10,   5,   5,  15}}, 
> +                {{ 12,   6,   6,  10}}, {{ 14,   7,   7,   9}}, {{ 16,   8,   8,  24}}, 
> +                {{ 18,   9,   9,  27}}, {{ 20,  10,  10,  30}}, {{ 22,  11,  11,  29}}, 
> +                {{ 24,  12,  12,  20}}, {{ 26,  13,  13,  23}}, {{ 28,  14,  14,  18}}, 
> +                {{ 30,  15,  15,  17}}, {{ 32,  16,  16,  48}}, {{ 34,  17,  17,  51}}, 
> +                {{ 36,  18,  18,  54}}, {{ 38,  19,  19,  53}}, {{ 40,  20,  20,  60}}, 
> +                {{ 42,  21,  21,  63}}, {{ 44,  22,  22,  58}}, {{ 46,  23,  23,  57}}, 
> +                {{ 48,  24,  24,  40}}, {{ 50,  25,  25,  43}}, {{ 52,  26,  26,  46}}, 
> +                {{ 54,  27,  27,  45}}, {{ 56,  28,  28,  36}}, {{ 58,  29,  29,  39}}, 
> +                {{ 60,  30,  30,  34}}, {{ 62,  31,  31,  33}}, {{ 64,  32,  32,  96}}, 
> +                {{ 66,  33,  33,  99}}, {{ 68,  34,  34, 102}}, {{ 70,  35,  35, 101}}, 
> +                {{ 72,  36,  36, 108}}, {{ 74,  37,  37, 111}}, {{ 76,  38,  38, 106}}, 
> +                {{ 78,  39,  39, 105}}, {{ 80,  40,  40, 120}}, {{ 82,  41,  41, 123}}, 
> +                {{ 84,  42,  42, 126}}, {{ 86,  43,  43, 125}}, {{ 88,  44,  44, 116}}, 
> +                {{ 90,  45,  45, 119}}, {{ 92,  46,  46, 114}}, {{ 94,  47,  47, 113}}, 
> +                {{ 96,  48,  48,  80}}, {{ 98,  49,  49,  83}}, {{100,  50,  50,  86}}, 
> +                {{102,  51,  51,  85}}, {{104,  52,  52,  92}}, {{106,  53,  53,  95}}, 
> +                {{108,  54,  54,  90}}, {{110,  55,  55,  89}}, {{112,  56,  56,  72}}, 
> +                {{114,  57,  57,  75}}, {{116,  58,  58,  78}}, {{118,  59,  59,  77}}, 
> +                {{120,  60,  60,  68}}, {{122,  61,  61,  71}}, {{124,  62,  62,  66}}, 
> +                {{126,  63,  63,  65}}, {{128,  64,  64, 192}}, {{130,  65,  65, 195}}, 
> +                {{132,  66,  66, 198}}, {{134,  67,  67, 197}}, {{136,  68,  68, 204}}, 
> +                {{138,  69,  69, 207}}, {{140,  70,  70, 202}}, {{142,  71,  71, 201}}, 
> +                {{144,  72,  72, 216}}, {{146,  73,  73, 219}}, {{148,  74,  74, 222}}, 
> +                {{150,  75,  75, 221}}, {{152,  76,  76, 212}}, {{154,  77,  77, 215}}, 
> +                {{156,  78,  78, 210}}, {{158,  79,  79, 209}}, {{160,  80,  80, 240}}, 
> +                {{162,  81,  81, 243}}, {{164,  82,  82, 246}}, {{166,  83,  83, 245}}, 
> +                {{168,  84,  84, 252}}, {{170,  85,  85, 255}}, {{172,  86,  86, 250}}, 
> +                {{174,  87,  87, 249}}, {{176,  88,  88, 232}}, {{178,  89,  89, 235}}, 
> +                {{180,  90,  90, 238}}, {{182,  91,  91, 237}}, {{184,  92,  92, 228}}, 
> +                {{186,  93,  93, 231}}, {{188,  94,  94, 226}}, {{190,  95,  95, 225}}, 
> +                {{192,  96,  96, 160}}, {{194,  97,  97, 163}}, {{196,  98,  98, 166}}, 
> +                {{198,  99,  99, 165}}, {{200, 100, 100, 172}}, {{202, 101, 101, 175}}, 
> +                {{204, 102, 102, 170}}, {{206, 103, 103, 169}}, {{208, 104, 104, 184}}, 
> +                {{210, 105, 105, 187}}, {{212, 106, 106, 190}}, {{214, 107, 107, 189}}, 
> +                {{216, 108, 108, 180}}, {{218, 109, 109, 183}}, {{220, 110, 110, 178}}, 
> +                {{222, 111, 111, 177}}, {{224, 112, 112, 144}}, {{226, 113, 113, 147}}, 
> +                {{228, 114, 114, 150}}, {{230, 115, 115, 149}}, {{232, 116, 116, 156}}, 
> +                {{234, 117, 117, 159}}, {{236, 118, 118, 154}}, {{238, 119, 119, 153}}, 
> +                {{240, 120, 120, 136}}, {{242, 121, 121, 139}}, {{244, 122, 122, 142}}, 
> +                {{246, 123, 123, 141}}, {{248, 124, 124, 132}}, {{250, 125, 125, 135}}, 
> +                {{252, 126, 126, 130}}, {{254, 127, 127, 129}}, {{ 27, 128, 128, 155}}, 
> +                {{ 25, 129, 129, 152}}, {{ 31, 130, 130, 157}}, {{ 29, 131, 131, 158}}, 
> +                {{ 19, 132, 132, 151}}, {{ 17, 133, 133, 148}}, {{ 23, 134, 134, 145}}, 
> +                {{ 21, 135, 135, 146}}, {{ 11, 136, 136, 131}}, {{  9, 137, 137, 128}}, 
> +                {{ 15, 138, 138, 133}}, {{ 13, 139, 139, 134}}, {{  3, 140, 140, 143}}, 
> +                {{  1, 141, 141, 140}}, {{  7, 142, 142, 137}}, {{  5, 143, 143, 138}}, 
> +                {{ 59, 144, 144, 171}}, {{ 57, 145, 145, 168}}, {{ 63, 146, 146, 173}}, 
> +                {{ 61, 147, 147, 174}}, {{ 51, 148, 148, 167}}, {{ 49, 149, 149, 164}}, 
> +                {{ 55, 150, 150, 161}}, {{ 53, 151, 151, 162}}, {{ 43, 152, 152, 179}}, 
> +                {{ 41, 153, 153, 176}}, {{ 47, 154, 154, 181}}, {{ 45, 155, 155, 182}}, 
> +                {{ 35, 156, 156, 191}}, {{ 33, 157, 157, 188}}, {{ 39, 158, 158, 185}}, 
> +                {{ 37, 159, 159, 186}}, {{ 91, 160, 160, 251}}, {{ 89, 161, 161, 248}}, 
> +                {{ 95, 162, 162, 253}}, {{ 93, 163, 163, 254}}, {{ 83, 164, 164, 247}}, 
> +                {{ 81, 165, 165, 244}}, {{ 87, 166, 166, 241}}, {{ 85, 167, 167, 242}}, 
> +                {{ 75, 168, 168, 227}}, {{ 73, 169, 169, 224}}, {{ 79, 170, 170, 229}}, 
> +                {{ 77, 171, 171, 230}}, {{ 67, 172, 172, 239}}, {{ 65, 173, 173, 236}}, 
> +                {{ 71, 174, 174, 233}}, {{ 69, 175, 175, 234}}, {{123, 176, 176, 203}}, 
> +                {{121, 177, 177, 200}}, {{127, 178, 178, 205}}, {{125, 179, 179, 206}}, 
> +                {{115, 180, 180, 199}}, {{113, 181, 181, 196}}, {{119, 182, 182, 193}}, 
> +                {{117, 183, 183, 194}}, {{107, 184, 184, 211}}, {{105, 185, 185, 208}}, 
> +                {{111, 186, 186, 213}}, {{109, 187, 187, 214}}, {{ 99, 188, 188, 223}}, 
> +                {{ 97, 189, 189, 220}}, {{103, 190, 190, 217}}, {{101, 191, 191, 218}}, 
> +                {{155, 192, 192,  91}}, {{153, 193, 193,  88}}, {{159, 194, 194,  93}}, 
> +                {{157, 195, 195,  94}}, {{147, 196, 196,  87}}, {{145, 197, 197,  84}}, 
> +                {{151, 198, 198,  81}}, {{149, 199, 199,  82}}, {{139, 200, 200,  67}}, 
> +                {{137, 201, 201,  64}}, {{143, 202, 202,  69}}, {{141, 203, 203,  70}}, 
> +                {{131, 204, 204,  79}}, {{129, 205, 205,  76}}, {{135, 206, 206,  73}}, 
> +                {{133, 207, 207,  74}}, {{187, 208, 208, 107}}, {{185, 209, 209, 104}}, 
> +                {{191, 210, 210, 109}}, {{189, 211, 211, 110}}, {{179, 212, 212, 103}}, 
> +                {{177, 213, 213, 100}}, {{183, 214, 214,  97}}, {{181, 215, 215,  98}}, 
> +                {{171, 216, 216, 115}}, {{169, 217, 217, 112}}, {{175, 218, 218, 117}}, 
> +                {{173, 219, 219, 118}}, {{163, 220, 220, 127}}, {{161, 221, 221, 124}}, 
> +                {{167, 222, 222, 121}}, {{165, 223, 223, 122}}, {{219, 224, 224,  59}}, 
> +                {{217, 225, 225,  56}}, {{223, 226, 226,  61}}, {{221, 227, 227,  62}}, 
> +                {{211, 228, 228,  55}}, {{209, 229, 229,  52}}, {{215, 230, 230,  49}}, 
> +                {{213, 231, 231,  50}}, {{203, 232, 232,  35}}, {{201, 233, 233,  32}}, 
> +                {{207, 234, 234,  37}}, {{205, 235, 235,  38}}, {{195, 236, 236,  47}}, 
> +                {{193, 237, 237,  44}}, {{199, 238, 238,  41}}, {{197, 239, 239,  42}}, 
> +                {{251, 240, 240,  11}}, {{249, 241, 241,   8}}, {{255, 242, 242,  13}}, 
> +                {{253, 243, 243,  14}}, {{243, 244, 244,   7}}, {{241, 245, 245,   4}}, 
> +                {{247, 246, 246,   1}}, {{245, 247, 247,   2}}, {{235, 248, 248,  19}}, 
> +                {{233, 249, 249,  16}}, {{239, 250, 250,  21}}, {{237, 251, 251,  22}}, 
> +                {{227, 252, 252,  31}}, {{225, 253, 253,  28}}, {{231, 254, 254,  25}}, 
> +                {{229, 255, 255,  26}}, 
> +        },
> +        {
> +                {{  0,   0,   0,   0}}, {{  3,   2,   1,   1}}, {{  6,   4,   2,   2}}, 
> +                {{  5,   6,   3,   3}}, {{ 12,   8,   4,   4}}, {{ 15,  10,   5,   5}}, 
> +                {{ 10,  12,   6,   6}}, {{  9,  14,   7,   7}}, {{ 24,  16,   8,   8}}, 
> +                {{ 27,  18,   9,   9}}, {{ 30,  20,  10,  10}}, {{ 29,  22,  11,  11}}, 
> +                {{ 20,  24,  12,  12}}, {{ 23,  26,  13,  13}}, {{ 18,  28,  14,  14}}, 
> +                {{ 17,  30,  15,  15}}, {{ 48,  32,  16,  16}}, {{ 51,  34,  17,  17}}, 
> +                {{ 54,  36,  18,  18}}, {{ 53,  38,  19,  19}}, {{ 60,  40,  20,  20}}, 
> +                {{ 63,  42,  21,  21}}, {{ 58,  44,  22,  22}}, {{ 57,  46,  23,  23}}, 
> +                {{ 40,  48,  24,  24}}, {{ 43,  50,  25,  25}}, {{ 46,  52,  26,  26}}, 
> +                {{ 45,  54,  27,  27}}, {{ 36,  56,  28,  28}}, {{ 39,  58,  29,  29}}, 
> +                {{ 34,  60,  30,  30}}, {{ 33,  62,  31,  31}}, {{ 96,  64,  32,  32}}, 
> +                {{ 99,  66,  33,  33}}, {{102,  68,  34,  34}}, {{101,  70,  35,  35}}, 
> +                {{108,  72,  36,  36}}, {{111,  74,  37,  37}}, {{106,  76,  38,  38}}, 
> +                {{105,  78,  39,  39}}, {{120,  80,  40,  40}}, {{123,  82,  41,  41}}, 
> +                {{126,  84,  42,  42}}, {{125,  86,  43,  43}}, {{116,  88,  44,  44}}, 
> +                {{119,  90,  45,  45}}, {{114,  92,  46,  46}}, {{113,  94,  47,  47}}, 
> +                {{ 80,  96,  48,  48}}, {{ 83,  98,  49,  49}}, {{ 86, 100,  50,  50}}, 
> +                {{ 85, 102,  51,  51}}, {{ 92, 104,  52,  52}}, {{ 95, 106,  53,  53}}, 
> +                {{ 90, 108,  54,  54}}, {{ 89, 110,  55,  55}}, {{ 72, 112,  56,  56}}, 
> +                {{ 75, 114,  57,  57}}, {{ 78, 116,  58,  58}}, {{ 77, 118,  59,  59}}, 
> +                {{ 68, 120,  60,  60}}, {{ 71, 122,  61,  61}}, {{ 66, 124,  62,  62}}, 
> +                {{ 65, 126,  63,  63}}, {{192, 128,  64,  64}}, {{195, 130,  65,  65}}, 
> +                {{198, 132,  66,  66}}, {{197, 134,  67,  67}}, {{204, 136,  68,  68}}, 
> +                {{207, 138,  69,  69}}, {{202, 140,  70,  70}}, {{201, 142,  71,  71}}, 
> +                {{216, 144,  72,  72}}, {{219, 146,  73,  73}}, {{222, 148,  74,  74}}, 
> +                {{221, 150,  75,  75}}, {{212, 152,  76,  76}}, {{215, 154,  77,  77}}, 
> +                {{210, 156,  78,  78}}, {{209, 158,  79,  79}}, {{240, 160,  80,  80}}, 
> +                {{243, 162,  81,  81}}, {{246, 164,  82,  82}}, {{245, 166,  83,  83}}, 
> +                {{252, 168,  84,  84}}, {{255, 170,  85,  85}}, {{250, 172,  86,  86}}, 
> +                {{249, 174,  87,  87}}, {{232, 176,  88,  88}}, {{235, 178,  89,  89}}, 
> +                {{238, 180,  90,  90}}, {{237, 182,  91,  91}}, {{228, 184,  92,  92}}, 
> +                {{231, 186,  93,  93}}, {{226, 188,  94,  94}}, {{225, 190,  95,  95}}, 
> +                {{160, 192,  96,  96}}, {{163, 194,  97,  97}}, {{166, 196,  98,  98}}, 
> +                {{165, 198,  99,  99}}, {{172, 200, 100, 100}}, {{175, 202, 101, 101}}, 
> +                {{170, 204, 102, 102}}, {{169, 206, 103, 103}}, {{184, 208, 104, 104}}, 
> +                {{187, 210, 105, 105}}, {{190, 212, 106, 106}}, {{189, 214, 107, 107}}, 
> +                {{180, 216, 108, 108}}, {{183, 218, 109, 109}}, {{178, 220, 110, 110}}, 
> +                {{177, 222, 111, 111}}, {{144, 224, 112, 112}}, {{147, 226, 113, 113}}, 
> +                {{150, 228, 114, 114}}, {{149, 230, 115, 115}}, {{156, 232, 116, 116}}, 
> +                {{159, 234, 117, 117}}, {{154, 236, 118, 118}}, {{153, 238, 119, 119}}, 
> +                {{136, 240, 120, 120}}, {{139, 242, 121, 121}}, {{142, 244, 122, 122}}, 
> +                {{141, 246, 123, 123}}, {{132, 248, 124, 124}}, {{135, 250, 125, 125}}, 
> +                {{130, 252, 126, 126}}, {{129, 254, 127, 127}}, {{155,  27, 128, 128}}, 
> +                {{152,  25, 129, 129}}, {{157,  31, 130, 130}}, {{158,  29, 131, 131}}, 
> +                {{151,  19, 132, 132}}, {{148,  17, 133, 133}}, {{145,  23, 134, 134}}, 
> +                {{146,  21, 135, 135}}, {{131,  11, 136, 136}}, {{128,   9, 137, 137}}, 
> +                {{133,  15, 138, 138}}, {{134,  13, 139, 139}}, {{143,   3, 140, 140}}, 
> +                {{140,   1, 141, 141}}, {{137,   7, 142, 142}}, {{138,   5, 143, 143}}, 
> +                {{171,  59, 144, 144}}, {{168,  57, 145, 145}}, {{173,  63, 146, 146}}, 
> +                {{174,  61, 147, 147}}, {{167,  51, 148, 148}}, {{164,  49, 149, 149}}, 
> +                {{161,  55, 150, 150}}, {{162,  53, 151, 151}}, {{179,  43, 152, 152}}, 
> +                {{176,  41, 153, 153}}, {{181,  47, 154, 154}}, {{182,  45, 155, 155}}, 
> +                {{191,  35, 156, 156}}, {{188,  33, 157, 157}}, {{185,  39, 158, 158}}, 
> +                {{186,  37, 159, 159}}, {{251,  91, 160, 160}}, {{248,  89, 161, 161}}, 
> +                {{253,  95, 162, 162}}, {{254,  93, 163, 163}}, {{247,  83, 164, 164}}, 
> +                {{244,  81, 165, 165}}, {{241,  87, 166, 166}}, {{242,  85, 167, 167}}, 
> +                {{227,  75, 168, 168}}, {{224,  73, 169, 169}}, {{229,  79, 170, 170}}, 
> +                {{230,  77, 171, 171}}, {{239,  67, 172, 172}}, {{236,  65, 173, 173}}, 
> +                {{233,  71, 174, 174}}, {{234,  69, 175, 175}}, {{203, 123, 176, 176}}, 
> +                {{200, 121, 177, 177}}, {{205, 127, 178, 178}}, {{206, 125, 179, 179}}, 
> +                {{199, 115, 180, 180}}, {{196, 113, 181, 181}}, {{193, 119, 182, 182}}, 
> +                {{194, 117, 183, 183}}, {{211, 107, 184, 184}}, {{208, 105, 185, 185}}, 
> +                {{213, 111, 186, 186}}, {{214, 109, 187, 187}}, {{223,  99, 188, 188}}, 
> +                {{220,  97, 189, 189}}, {{217, 103, 190, 190}}, {{218, 101, 191, 191}}, 
> +                {{ 91, 155, 192, 192}}, {{ 88, 153, 193, 193}}, {{ 93, 159, 194, 194}}, 
> +                {{ 94, 157, 195, 195}}, {{ 87, 147, 196, 196}}, {{ 84, 145, 197, 197}}, 
> +                {{ 81, 151, 198, 198}}, {{ 82, 149, 199, 199}}, {{ 67, 139, 200, 200}}, 
> +                {{ 64, 137, 201, 201}}, {{ 69, 143, 202, 202}}, {{ 70, 141, 203, 203}}, 
> +                {{ 79, 131, 204, 204}}, {{ 76, 129, 205, 205}}, {{ 73, 135, 206, 206}}, 
> +                {{ 74, 133, 207, 207}}, {{107, 187, 208, 208}}, {{104, 185, 209, 209}}, 
> +                {{109, 191, 210, 210}}, {{110, 189, 211, 211}}, {{103, 179, 212, 212}}, 
> +                {{100, 177, 213, 213}}, {{ 97, 183, 214, 214}}, {{ 98, 181, 215, 215}}, 
> +                {{115, 171, 216, 216}}, {{112, 169, 217, 217}}, {{117, 175, 218, 218}}, 
> +                {{118, 173, 219, 219}}, {{127, 163, 220, 220}}, {{124, 161, 221, 221}}, 
> +                {{121, 167, 222, 222}}, {{122, 165, 223, 223}}, {{ 59, 219, 224, 224}}, 
> +                {{ 56, 217, 225, 225}}, {{ 61, 223, 226, 226}}, {{ 62, 221, 227, 227}}, 
> +                {{ 55, 211, 228, 228}}, {{ 52, 209, 229, 229}}, {{ 49, 215, 230, 230}}, 
> +                {{ 50, 213, 231, 231}}, {{ 35, 203, 232, 232}}, {{ 32, 201, 233, 233}}, 
> +                {{ 37, 207, 234, 234}}, {{ 38, 205, 235, 235}}, {{ 47, 195, 236, 236}}, 
> +                {{ 44, 193, 237, 237}}, {{ 41, 199, 238, 238}}, {{ 42, 197, 239, 239}}, 
> +                {{ 11, 251, 240, 240}}, {{  8, 249, 241, 241}}, {{ 13, 255, 242, 242}}, 
> +                {{ 14, 253, 243, 243}}, {{  7, 243, 244, 244}}, {{  4, 241, 245, 245}}, 
> +                {{  1, 247, 246, 246}}, {{  2, 245, 247, 247}}, {{ 19, 235, 248, 248}}, 
> +                {{ 16, 233, 249, 249}}, {{ 21, 239, 250, 250}}, {{ 22, 237, 251, 251}}, 
> +                {{ 31, 227, 252, 252}}, {{ 28, 225, 253, 253}}, {{ 25, 231, 254, 254}}, 
> +                {{ 26, 229, 255, 255}}, 
> +        },
> +        {
> +                {{  0,   0,   0,   0}}, {{  1,   3,   2,   1}}, {{  2,   6,   4,   2}}, 
> +                {{  3,   5,   6,   3}}, {{  4,  12,   8,   4}}, {{  5,  15,  10,   5}}, 
> +                {{  6,  10,  12,   6}}, {{  7,   9,  14,   7}}, {{  8,  24,  16,   8}}, 
> +                {{  9,  27,  18,   9}}, {{ 10,  30,  20,  10}}, {{ 11,  29,  22,  11}}, 
> +                {{ 12,  20,  24,  12}}, {{ 13,  23,  26,  13}}, {{ 14,  18,  28,  14}}, 
> +                {{ 15,  17,  30,  15}}, {{ 16,  48,  32,  16}}, {{ 17,  51,  34,  17}}, 
> +                {{ 18,  54,  36,  18}}, {{ 19,  53,  38,  19}}, {{ 20,  60,  40,  20}}, 
> +                {{ 21,  63,  42,  21}}, {{ 22,  58,  44,  22}}, {{ 23,  57,  46,  23}}, 
> +                {{ 24,  40,  48,  24}}, {{ 25,  43,  50,  25}}, {{ 26,  46,  52,  26}}, 
> +                {{ 27,  45,  54,  27}}, {{ 28,  36,  56,  28}}, {{ 29,  39,  58,  29}}, 
> +                {{ 30,  34,  60,  30}}, {{ 31,  33,  62,  31}}, {{ 32,  96,  64,  32}}, 
> +                {{ 33,  99,  66,  33}}, {{ 34, 102,  68,  34}}, {{ 35, 101,  70,  35}}, 
> +                {{ 36, 108,  72,  36}}, {{ 37, 111,  74,  37}}, {{ 38, 106,  76,  38}}, 
> +                {{ 39, 105,  78,  39}}, {{ 40, 120,  80,  40}}, {{ 41, 123,  82,  41}}, 
> +                {{ 42, 126,  84,  42}}, {{ 43, 125,  86,  43}}, {{ 44, 116,  88,  44}}, 
> +                {{ 45, 119,  90,  45}}, {{ 46, 114,  92,  46}}, {{ 47, 113,  94,  47}}, 
> +                {{ 48,  80,  96,  48}}, {{ 49,  83,  98,  49}}, {{ 50,  86, 100,  50}}, 
> +                {{ 51,  85, 102,  51}}, {{ 52,  92, 104,  52}}, {{ 53,  95, 106,  53}}, 
> +                {{ 54,  90, 108,  54}}, {{ 55,  89, 110,  55}}, {{ 56,  72, 112,  56}}, 
> +                {{ 57,  75, 114,  57}}, {{ 58,  78, 116,  58}}, {{ 59,  77, 118,  59}}, 
> +                {{ 60,  68, 120,  60}}, {{ 61,  71, 122,  61}}, {{ 62,  66, 124,  62}}, 
> +                {{ 63,  65, 126,  63}}, {{ 64, 192, 128,  64}}, {{ 65, 195, 130,  65}}, 
> +                {{ 66, 198, 132,  66}}, {{ 67, 197, 134,  67}}, {{ 68, 204, 136,  68}}, 
> +                {{ 69, 207, 138,  69}}, {{ 70, 202, 140,  70}}, {{ 71, 201, 142,  71}}, 
> +                {{ 72, 216, 144,  72}}, {{ 73, 219, 146,  73}}, {{ 74, 222, 148,  74}}, 
> +                {{ 75, 221, 150,  75}}, {{ 76, 212, 152,  76}}, {{ 77, 215, 154,  77}}, 
> +                {{ 78, 210, 156,  78}}, {{ 79, 209, 158,  79}}, {{ 80, 240, 160,  80}}, 
> +                {{ 81, 243, 162,  81}}, {{ 82, 246, 164,  82}}, {{ 83, 245, 166,  83}}, 
> +                {{ 84, 252, 168,  84}}, {{ 85, 255, 170,  85}}, {{ 86, 250, 172,  86}}, 
> +                {{ 87, 249, 174,  87}}, {{ 88, 232, 176,  88}}, {{ 89, 235, 178,  89}}, 
> +                {{ 90, 238, 180,  90}}, {{ 91, 237, 182,  91}}, {{ 92, 228, 184,  92}}, 
> +                {{ 93, 231, 186,  93}}, {{ 94, 226, 188,  94}}, {{ 95, 225, 190,  95}}, 
> +                {{ 96, 160, 192,  96}}, {{ 97, 163, 194,  97}}, {{ 98, 166, 196,  98}}, 
> +                {{ 99, 165, 198,  99}}, {{100, 172, 200, 100}}, {{101, 175, 202, 101}}, 
> +                {{102, 170, 204, 102}}, {{103, 169, 206, 103}}, {{104, 184, 208, 104}}, 
> +                {{105, 187, 210, 105}}, {{106, 190, 212, 106}}, {{107, 189, 214, 107}}, 
> +                {{108, 180, 216, 108}}, {{109, 183, 218, 109}}, {{110, 178, 220, 110}}, 
> +                {{111, 177, 222, 111}}, {{112, 144, 224, 112}}, {{113, 147, 226, 113}}, 
> +                {{114, 150, 228, 114}}, {{115, 149, 230, 115}}, {{116, 156, 232, 116}}, 
> +                {{117, 159, 234, 117}}, {{118, 154, 236, 118}}, {{119, 153, 238, 119}}, 
> +                {{120, 136, 240, 120}}, {{121, 139, 242, 121}}, {{122, 142, 244, 122}}, 
> +                {{123, 141, 246, 123}}, {{124, 132, 248, 124}}, {{125, 135, 250, 125}}, 
> +                {{126, 130, 252, 126}}, {{127, 129, 254, 127}}, {{128, 155,  27, 128}}, 
> +                {{129, 152,  25, 129}}, {{130, 157,  31, 130}}, {{131, 158,  29, 131}}, 
> +                {{132, 151,  19, 132}}, {{133, 148,  17, 133}}, {{134, 145,  23, 134}}, 
> +                {{135, 146,  21, 135}}, {{136, 131,  11, 136}}, {{137, 128,   9, 137}}, 
> +                {{138, 133,  15, 138}}, {{139, 134,  13, 139}}, {{140, 143,   3, 140}}, 
> +                {{141, 140,   1, 141}}, {{142, 137,   7, 142}}, {{143, 138,   5, 143}}, 
> +                {{144, 171,  59, 144}}, {{145, 168,  57, 145}}, {{146, 173,  63, 146}}, 
> +                {{147, 174,  61, 147}}, {{148, 167,  51, 148}}, {{149, 164,  49, 149}}, 
> +                {{150, 161,  55, 150}}, {{151, 162,  53, 151}}, {{152, 179,  43, 152}}, 
> +                {{153, 176,  41, 153}}, {{154, 181,  47, 154}}, {{155, 182,  45, 155}}, 
> +                {{156, 191,  35, 156}}, {{157, 188,  33, 157}}, {{158, 185,  39, 158}}, 
> +                {{159, 186,  37, 159}}, {{160, 251,  91, 160}}, {{161, 248,  89, 161}}, 
> +                {{162, 253,  95, 162}}, {{163, 254,  93, 163}}, {{164, 247,  83, 164}}, 
> +                {{165, 244,  81, 165}}, {{166, 241,  87, 166}}, {{167, 242,  85, 167}}, 
> +                {{168, 227,  75, 168}}, {{169, 224,  73, 169}}, {{170, 229,  79, 170}}, 
> +                {{171, 230,  77, 171}}, {{172, 239,  67, 172}}, {{173, 236,  65, 173}}, 
> +                {{174, 233,  71, 174}}, {{175, 234,  69, 175}}, {{176, 203, 123, 176}}, 
> +                {{177, 200, 121, 177}}, {{178, 205, 127, 178}}, {{179, 206, 125, 179}}, 
> +                {{180, 199, 115, 180}}, {{181, 196, 113, 181}}, {{182, 193, 119, 182}}, 
> +                {{183, 194, 117, 183}}, {{184, 211, 107, 184}}, {{185, 208, 105, 185}}, 
> +                {{186, 213, 111, 186}}, {{187, 214, 109, 187}}, {{188, 223,  99, 188}}, 
> +                {{189, 220,  97, 189}}, {{190, 217, 103, 190}}, {{191, 218, 101, 191}}, 
> +                {{192,  91, 155, 192}}, {{193,  88, 153, 193}}, {{194,  93, 159, 194}}, 
> +                {{195,  94, 157, 195}}, {{196,  87, 147, 196}}, {{197,  84, 145, 197}}, 
> +                {{198,  81, 151, 198}}, {{199,  82, 149, 199}}, {{200,  67, 139, 200}}, 
> +                {{201,  64, 137, 201}}, {{202,  69, 143, 202}}, {{203,  70, 141, 203}}, 
> +                {{204,  79, 131, 204}}, {{205,  76, 129, 205}}, {{206,  73, 135, 206}}, 
> +                {{207,  74, 133, 207}}, {{208, 107, 187, 208}}, {{209, 104, 185, 209}}, 
> +                {{210, 109, 191, 210}}, {{211, 110, 189, 211}}, {{212, 103, 179, 212}}, 
> +                {{213, 100, 177, 213}}, {{214,  97, 183, 214}}, {{215,  98, 181, 215}}, 
> +                {{216, 115, 171, 216}}, {{217, 112, 169, 217}}, {{218, 117, 175, 218}}, 
> +                {{219, 118, 173, 219}}, {{220, 127, 163, 220}}, {{221, 124, 161, 221}}, 
> +                {{222, 121, 167, 222}}, {{223, 122, 165, 223}}, {{224,  59, 219, 224}}, 
> +                {{225,  56, 217, 225}}, {{226,  61, 223, 226}}, {{227,  62, 221, 227}}, 
> +                {{228,  55, 211, 228}}, {{229,  52, 209, 229}}, {{230,  49, 215, 230}}, 
> +                {{231,  50, 213, 231}}, {{232,  35, 203, 232}}, {{233,  32, 201, 233}}, 
> +                {{234,  37, 207, 234}}, {{235,  38, 205, 235}}, {{236,  47, 195, 236}}, 
> +                {{237,  44, 193, 237}}, {{238,  41, 199, 238}}, {{239,  42, 197, 239}}, 
> +                {{240,  11, 251, 240}}, {{241,   8, 249, 241}}, {{242,  13, 255, 242}}, 
> +                {{243,  14, 253, 243}}, {{244,   7, 243, 244}}, {{245,   4, 241, 245}}, 
> +                {{246,   1, 247, 246}}, {{247,   2, 245, 247}}, {{248,  19, 235, 248}}, 
> +                {{249,  16, 233, 249}}, {{250,  21, 239, 250}}, {{251,  22, 237, 251}}, 
> +                {{252,  31, 227, 252}}, {{253,  28, 225, 253}}, {{254,  25, 231, 254}}, 
> +                {{255,  26, 229, 255}}, 
> +        },
> +        {
> +                {{  0,   0,   0,   0}}, {{  1,   1,   3,   2}}, {{  2,   2,   6,   4}}, 
> +                {{  3,   3,   5,   6}}, {{  4,   4,  12,   8}}, {{  5,   5,  15,  10}}, 
> +                {{  6,   6,  10,  12}}, {{  7,   7,   9,  14}}, {{  8,   8,  24,  16}}, 
> +                {{  9,   9,  27,  18}}, {{ 10,  10,  30,  20}}, {{ 11,  11,  29,  22}}, 
> +                {{ 12,  12,  20,  24}}, {{ 13,  13,  23,  26}}, {{ 14,  14,  18,  28}}, 
> +                {{ 15,  15,  17,  30}}, {{ 16,  16,  48,  32}}, {{ 17,  17,  51,  34}}, 
> +                {{ 18,  18,  54,  36}}, {{ 19,  19,  53,  38}}, {{ 20,  20,  60,  40}}, 
> +                {{ 21,  21,  63,  42}}, {{ 22,  22,  58,  44}}, {{ 23,  23,  57,  46}}, 
> +                {{ 24,  24,  40,  48}}, {{ 25,  25,  43,  50}}, {{ 26,  26,  46,  52}}, 
> +                {{ 27,  27,  45,  54}}, {{ 28,  28,  36,  56}}, {{ 29,  29,  39,  58}}, 
> +                {{ 30,  30,  34,  60}}, {{ 31,  31,  33,  62}}, {{ 32,  32,  96,  64}}, 
> +                {{ 33,  33,  99,  66}}, {{ 34,  34, 102,  68}}, {{ 35,  35, 101,  70}}, 
> +                {{ 36,  36, 108,  72}}, {{ 37,  37, 111,  74}}, {{ 38,  38, 106,  76}}, 
> +                {{ 39,  39, 105,  78}}, {{ 40,  40, 120,  80}}, {{ 41,  41, 123,  82}}, 
> +                {{ 42,  42, 126,  84}}, {{ 43,  43, 125,  86}}, {{ 44,  44, 116,  88}}, 
> +                {{ 45,  45, 119,  90}}, {{ 46,  46, 114,  92}}, {{ 47,  47, 113,  94}}, 
> +                {{ 48,  48,  80,  96}}, {{ 49,  49,  83,  98}}, {{ 50,  50,  86, 100}}, 
> +                {{ 51,  51,  85, 102}}, {{ 52,  52,  92, 104}}, {{ 53,  53,  95, 106}}, 
> +                {{ 54,  54,  90, 108}}, {{ 55,  55,  89, 110}}, {{ 56,  56,  72, 112}}, 
> +                {{ 57,  57,  75, 114}}, {{ 58,  58,  78, 116}}, {{ 59,  59,  77, 118}}, 
> +                {{ 60,  60,  68, 120}}, {{ 61,  61,  71, 122}}, {{ 62,  62,  66, 124}}, 
> +                {{ 63,  63,  65, 126}}, {{ 64,  64, 192, 128}}, {{ 65,  65, 195, 130}}, 
> +                {{ 66,  66, 198, 132}}, {{ 67,  67, 197, 134}}, {{ 68,  68, 204, 136}}, 
> +                {{ 69,  69, 207, 138}}, {{ 70,  70, 202, 140}}, {{ 71,  71, 201, 142}}, 
> +                {{ 72,  72, 216, 144}}, {{ 73,  73, 219, 146}}, {{ 74,  74, 222, 148}}, 
> +                {{ 75,  75, 221, 150}}, {{ 76,  76, 212, 152}}, {{ 77,  77, 215, 154}}, 
> +                {{ 78,  78, 210, 156}}, {{ 79,  79, 209, 158}}, {{ 80,  80, 240, 160}}, 
> +                {{ 81,  81, 243, 162}}, {{ 82,  82, 246, 164}}, {{ 83,  83, 245, 166}}, 
> +                {{ 84,  84, 252, 168}}, {{ 85,  85, 255, 170}}, {{ 86,  86, 250, 172}}, 
> +                {{ 87,  87, 249, 174}}, {{ 88,  88, 232, 176}}, {{ 89,  89, 235, 178}}, 
> +                {{ 90,  90, 238, 180}}, {{ 91,  91, 237, 182}}, {{ 92,  92, 228, 184}}, 
> +                {{ 93,  93, 231, 186}}, {{ 94,  94, 226, 188}}, {{ 95,  95, 225, 190}}, 
> +                {{ 96,  96, 160, 192}}, {{ 97,  97, 163, 194}}, {{ 98,  98, 166, 196}}, 
> +                {{ 99,  99, 165, 198}}, {{100, 100, 172, 200}}, {{101, 101, 175, 202}}, 
> +                {{102, 102, 170, 204}}, {{103, 103, 169, 206}}, {{104, 104, 184, 208}}, 
> +                {{105, 105, 187, 210}}, {{106, 106, 190, 212}}, {{107, 107, 189, 214}}, 
> +                {{108, 108, 180, 216}}, {{109, 109, 183, 218}}, {{110, 110, 178, 220}}, 
> +                {{111, 111, 177, 222}}, {{112, 112, 144, 224}}, {{113, 113, 147, 226}}, 
> +                {{114, 114, 150, 228}}, {{115, 115, 149, 230}}, {{116, 116, 156, 232}}, 
> +                {{117, 117, 159, 234}}, {{118, 118, 154, 236}}, {{119, 119, 153, 238}}, 
> +                {{120, 120, 136, 240}}, {{121, 121, 139, 242}}, {{122, 122, 142, 244}}, 
> +                {{123, 123, 141, 246}}, {{124, 124, 132, 248}}, {{125, 125, 135, 250}}, 
> +                {{126, 126, 130, 252}}, {{127, 127, 129, 254}}, {{128, 128, 155,  27}}, 
> +                {{129, 129, 152,  25}}, {{130, 130, 157,  31}}, {{131, 131, 158,  29}}, 
> +                {{132, 132, 151,  19}}, {{133, 133, 148,  17}}, {{134, 134, 145,  23}}, 
> +                {{135, 135, 146,  21}}, {{136, 136, 131,  11}}, {{137, 137, 128,   9}}, 
> +                {{138, 138, 133,  15}}, {{139, 139, 134,  13}}, {{140, 140, 143,   3}}, 
> +                {{141, 141, 140,   1}}, {{142, 142, 137,   7}}, {{143, 143, 138,   5}}, 
> +                {{144, 144, 171,  59}}, {{145, 145, 168,  57}}, {{146, 146, 173,  63}}, 
> +                {{147, 147, 174,  61}}, {{148, 148, 167,  51}}, {{149, 149, 164,  49}}, 
> +                {{150, 150, 161,  55}}, {{151, 151, 162,  53}}, {{152, 152, 179,  43}}, 
> +                {{153, 153, 176,  41}}, {{154, 154, 181,  47}}, {{155, 155, 182,  45}}, 
> +                {{156, 156, 191,  35}}, {{157, 157, 188,  33}}, {{158, 158, 185,  39}}, 
> +                {{159, 159, 186,  37}}, {{160, 160, 251,  91}}, {{161, 161, 248,  89}}, 
> +                {{162, 162, 253,  95}}, {{163, 163, 254,  93}}, {{164, 164, 247,  83}}, 
> +                {{165, 165, 244,  81}}, {{166, 166, 241,  87}}, {{167, 167, 242,  85}}, 
> +                {{168, 168, 227,  75}}, {{169, 169, 224,  73}}, {{170, 170, 229,  79}}, 
> +                {{171, 171, 230,  77}}, {{172, 172, 239,  67}}, {{173, 173, 236,  65}}, 
> +                {{174, 174, 233,  71}}, {{175, 175, 234,  69}}, {{176, 176, 203, 123}}, 
> +                {{177, 177, 200, 121}}, {{178, 178, 205, 127}}, {{179, 179, 206, 125}}, 
> +                {{180, 180, 199, 115}}, {{181, 181, 196, 113}}, {{182, 182, 193, 119}}, 
> +                {{183, 183, 194, 117}}, {{184, 184, 211, 107}}, {{185, 185, 208, 105}}, 
> +                {{186, 186, 213, 111}}, {{187, 187, 214, 109}}, {{188, 188, 223,  99}}, 
> +                {{189, 189, 220,  97}}, {{190, 190, 217, 103}}, {{191, 191, 218, 101}}, 
> +                {{192, 192,  91, 155}}, {{193, 193,  88, 153}}, {{194, 194,  93, 159}}, 
> +                {{195, 195,  94, 157}}, {{196, 196,  87, 147}}, {{197, 197,  84, 145}}, 
> +                {{198, 198,  81, 151}}, {{199, 199,  82, 149}}, {{200, 200,  67, 139}}, 
> +                {{201, 201,  64, 137}}, {{202, 202,  69, 143}}, {{203, 203,  70, 141}}, 
> +                {{204, 204,  79, 131}}, {{205, 205,  76, 129}}, {{206, 206,  73, 135}}, 
> +                {{207, 207,  74, 133}}, {{208, 208, 107, 187}}, {{209, 209, 104, 185}}, 
> +                {{210, 210, 109, 191}}, {{211, 211, 110, 189}}, {{212, 212, 103, 179}}, 
> +                {{213, 213, 100, 177}}, {{214, 214,  97, 183}}, {{215, 215,  98, 181}}, 
> +                {{216, 216, 115, 171}}, {{217, 217, 112, 169}}, {{218, 218, 117, 175}}, 
> +                {{219, 219, 118, 173}}, {{220, 220, 127, 163}}, {{221, 221, 124, 161}}, 
> +                {{222, 222, 121, 167}}, {{223, 223, 122, 165}}, {{224, 224,  59, 219}}, 
> +                {{225, 225,  56, 217}}, {{226, 226,  61, 223}}, {{227, 227,  62, 221}}, 
> +                {{228, 228,  55, 211}}, {{229, 229,  52, 209}}, {{230, 230,  49, 215}}, 
> +                {{231, 231,  50, 213}}, {{232, 232,  35, 203}}, {{233, 233,  32, 201}}, 
> +                {{234, 234,  37, 207}}, {{235, 235,  38, 205}}, {{236, 236,  47, 195}}, 
> +                {{237, 237,  44, 193}}, {{238, 238,  41, 199}}, {{239, 239,  42, 197}}, 
> +                {{240, 240,  11, 251}}, {{241, 241,   8, 249}}, {{242, 242,  13, 255}}, 
> +                {{243, 243,  14, 253}}, {{244, 244,   7, 243}}, {{245, 245,   4, 241}}, 
> +                {{246, 246,   1, 247}}, {{247, 247,   2, 245}}, {{248, 248,  19, 235}}, 
> +                {{249, 249,  16, 233}}, {{250, 250,  21, 239}}, {{251, 251,  22, 237}}, 
> +                {{252, 252,  31, 227}}, {{253, 253,  28, 225}}, {{254, 254,  25, 231}}, 
> +                {{255, 255,  26, 229}}, 
> +        },
> +};
> +
> +word8x4 M1[4][256] = {
> +        {
> +                {{  0,   0,   0,   0}}, {{ 14,   9,  13,  11}}, {{ 28,  18,  26,  22}}, 
> +                {{ 18,  27,  23,  29}}, {{ 56,  36,  52,  44}}, {{ 54,  45,  57,  39}}, 
> +                {{ 36,  54,  46,  58}}, {{ 42,  63,  35,  49}}, {{112,  72, 104,  88}}, 
> +                {{126,  65, 101,  83}}, {{108,  90, 114,  78}}, {{ 98,  83, 127,  69}}, 
> +                {{ 72, 108,  92, 116}}, {{ 70, 101,  81, 127}}, {{ 84, 126,  70,  98}}, 
> +                {{ 90, 119,  75, 105}}, {{224, 144, 208, 176}}, {{238, 153, 221, 187}}, 
> +                {{252, 130, 202, 166}}, {{242, 139, 199, 173}}, {{216, 180, 228, 156}}, 
> +                {{214, 189, 233, 151}}, {{196, 166, 254, 138}}, {{202, 175, 243, 129}}, 
> +                {{144, 216, 184, 232}}, {{158, 209, 181, 227}}, {{140, 202, 162, 254}}, 
> +                {{130, 195, 175, 245}}, {{168, 252, 140, 196}}, {{166, 245, 129, 207}}, 
> +                {{180, 238, 150, 210}}, {{186, 231, 155, 217}}, {{219,  59, 187, 123}}, 
> +                {{213,  50, 182, 112}}, {{199,  41, 161, 109}}, {{201,  32, 172, 102}}, 
> +                {{227,  31, 143,  87}}, {{237,  22, 130,  92}}, {{255,  13, 149,  65}}, 
> +                {{241,   4, 152,  74}}, {{171, 115, 211,  35}}, {{165, 122, 222,  40}}, 
> +                {{183,  97, 201,  53}}, {{185, 104, 196,  62}}, {{147,  87, 231,  15}}, 
> +                {{157,  94, 234,   4}}, {{143,  69, 253,  25}}, {{129,  76, 240,  18}}, 
> +                {{ 59, 171, 107, 203}}, {{ 53, 162, 102, 192}}, {{ 39, 185, 113, 221}}, 
> +                {{ 41, 176, 124, 214}}, {{  3, 143,  95, 231}}, {{ 13, 134,  82, 236}}, 
> +                {{ 31, 157,  69, 241}}, {{ 17, 148,  72, 250}}, {{ 75, 227,   3, 147}}, 
> +                {{ 69, 234,  14, 152}}, {{ 87, 241,  25, 133}}, {{ 89, 248,  20, 142}}, 
> +                {{115, 199,  55, 191}}, {{125, 206,  58, 180}}, {{111, 213,  45, 169}}, 
> +                {{ 97, 220,  32, 162}}, {{173, 118, 109, 246}}, {{163, 127,  96, 253}}, 
> +                {{177, 100, 119, 224}}, {{191, 109, 122, 235}}, {{149,  82,  89, 218}}, 
> +                {{155,  91,  84, 209}}, {{137,  64,  67, 204}}, {{135,  73,  78, 199}}, 
> +                {{221,  62,   5, 174}}, {{211,  55,   8, 165}}, {{193,  44,  31, 184}}, 
> +                {{207,  37,  18, 179}}, {{229,  26,  49, 130}}, {{235,  19,  60, 137}}, 
> +                {{249,   8,  43, 148}}, {{247,   1,  38, 159}}, {{ 77, 230, 189,  70}}, 
> +                {{ 67, 239, 176,  77}}, {{ 81, 244, 167,  80}}, {{ 95, 253, 170,  91}}, 
> +                {{117, 194, 137, 106}}, {{123, 203, 132,  97}}, {{105, 208, 147, 124}}, 
> +                {{103, 217, 158, 119}}, {{ 61, 174, 213,  30}}, {{ 51, 167, 216,  21}}, 
> +                {{ 33, 188, 207,   8}}, {{ 47, 181, 194,   3}}, {{  5, 138, 225,  50}}, 
> +                {{ 11, 131, 236,  57}}, {{ 25, 152, 251,  36}}, {{ 23, 145, 246,  47}}, 
> +                {{118,  77, 214, 141}}, {{120,  68, 219, 134}}, {{106,  95, 204, 155}}, 
> +                {{100,  86, 193, 144}}, {{ 78, 105, 226, 161}}, {{ 64,  96, 239, 170}}, 
> +                {{ 82, 123, 248, 183}}, {{ 92, 114, 245, 188}}, {{  6,   5, 190, 213}}, 
> +                {{  8,  12, 179, 222}}, {{ 26,  23, 164, 195}}, {{ 20,  30, 169, 200}}, 
> +                {{ 62,  33, 138, 249}}, {{ 48,  40, 135, 242}}, {{ 34,  51, 144, 239}}, 
> +                {{ 44,  58, 157, 228}}, {{150, 221,   6,  61}}, {{152, 212,  11,  54}}, 
> +                {{138, 207,  28,  43}}, {{132, 198,  17,  32}}, {{174, 249,  50,  17}}, 
> +                {{160, 240,  63,  26}}, {{178, 235,  40,   7}}, {{188, 226,  37,  12}}, 
> +                {{230, 149, 110, 101}}, {{232, 156,  99, 110}}, {{250, 135, 116, 115}}, 
> +                {{244, 142, 121, 120}}, {{222, 177,  90,  73}}, {{208, 184,  87,  66}}, 
> +                {{194, 163,  64,  95}}, {{204, 170,  77,  84}}, {{ 65, 236, 218, 247}}, 
> +                {{ 79, 229, 215, 252}}, {{ 93, 254, 192, 225}}, {{ 83, 247, 205, 234}}, 
> +                {{121, 200, 238, 219}}, {{119, 193, 227, 208}}, {{101, 218, 244, 205}}, 
> +                {{107, 211, 249, 198}}, {{ 49, 164, 178, 175}}, {{ 63, 173, 191, 164}}, 
> +                {{ 45, 182, 168, 185}}, {{ 35, 191, 165, 178}}, {{  9, 128, 134, 131}}, 
> +                {{  7, 137, 139, 136}}, {{ 21, 146, 156, 149}}, {{ 27, 155, 145, 158}}, 
> +                {{161, 124,  10,  71}}, {{175, 117,   7,  76}}, {{189, 110,  16,  81}}, 
> +                {{179, 103,  29,  90}}, {{153,  88,  62, 107}}, {{151,  81,  51,  96}}, 
> +                {{133,  74,  36, 125}}, {{139,  67,  41, 118}}, {{209,  52,  98,  31}}, 
> +                {{223,  61, 111,  20}}, {{205,  38, 120,   9}}, {{195,  47, 117,   2}}, 
> +                {{233,  16,  86,  51}}, {{231,  25,  91,  56}}, {{245,   2,  76,  37}}, 
> +                {{251,  11,  65,  46}}, {{154, 215,  97, 140}}, {{148, 222, 108, 135}}, 
> +                {{134, 197, 123, 154}}, {{136, 204, 118, 145}}, {{162, 243,  85, 160}}, 
> +                {{172, 250,  88, 171}}, {{190, 225,  79, 182}}, {{176, 232,  66, 189}}, 
> +                {{234, 159,   9, 212}}, {{228, 150,   4, 223}}, {{246, 141,  19, 194}}, 
> +                {{248, 132,  30, 201}}, {{210, 187,  61, 248}}, {{220, 178,  48, 243}}, 
> +                {{206, 169,  39, 238}}, {{192, 160,  42, 229}}, {{122,  71, 177,  60}}, 
> +                {{116,  78, 188,  55}}, {{102,  85, 171,  42}}, {{104,  92, 166,  33}}, 
> +                {{ 66,  99, 133,  16}}, {{ 76, 106, 136,  27}}, {{ 94, 113, 159,   6}}, 
> +                {{ 80, 120, 146,  13}}, {{ 10,  15, 217, 100}}, {{  4,   6, 212, 111}}, 
> +                {{ 22,  29, 195, 114}}, {{ 24,  20, 206, 121}}, {{ 50,  43, 237,  72}}, 
> +                {{ 60,  34, 224,  67}}, {{ 46,  57, 247,  94}}, {{ 32,  48, 250,  85}}, 
> +                {{236, 154, 183,   1}}, {{226, 147, 186,  10}}, {{240, 136, 173,  23}}, 
> +                {{254, 129, 160,  28}}, {{212, 190, 131,  45}}, {{218, 183, 142,  38}}, 
> +                {{200, 172, 153,  59}}, {{198, 165, 148,  48}}, {{156, 210, 223,  89}}, 
> +                {{146, 219, 210,  82}}, {{128, 192, 197,  79}}, {{142, 201, 200,  68}}, 
> +                {{164, 246, 235, 117}}, {{170, 255, 230, 126}}, {{184, 228, 241,  99}}, 
> +                {{182, 237, 252, 104}}, {{ 12,  10, 103, 177}}, {{  2,   3, 106, 186}}, 
> +                {{ 16,  24, 125, 167}}, {{ 30,  17, 112, 172}}, {{ 52,  46,  83, 157}}, 
> +                {{ 58,  39,  94, 150}}, {{ 40,  60,  73, 139}}, {{ 38,  53,  68, 128}}, 
> +                {{124,  66,  15, 233}}, {{114,  75,   2, 226}}, {{ 96,  80,  21, 255}}, 
> +                {{110,  89,  24, 244}}, {{ 68, 102,  59, 197}}, {{ 74, 111,  54, 206}}, 
> +                {{ 88, 116,  33, 211}}, {{ 86, 125,  44, 216}}, {{ 55, 161,  12, 122}}, 
> +                {{ 57, 168,   1, 113}}, {{ 43, 179,  22, 108}}, {{ 37, 186,  27, 103}}, 
> +                {{ 15, 133,  56,  86}}, {{  1, 140,  53,  93}}, {{ 19, 151,  34,  64}}, 
> +                {{ 29, 158,  47,  75}}, {{ 71, 233, 100,  34}}, {{ 73, 224, 105,  41}}, 
> +                {{ 91, 251, 126,  52}}, {{ 85, 242, 115,  63}}, {{127, 205,  80,  14}}, 
> +                {{113, 196,  93,   5}}, {{ 99, 223,  74,  24}}, {{109, 214,  71,  19}}, 
> +                {{215,  49, 220, 202}}, {{217,  56, 209, 193}}, {{203,  35, 198, 220}}, 
> +                {{197,  42, 203, 215}}, {{239,  21, 232, 230}}, {{225,  28, 229, 237}}, 
> +                {{243,   7, 242, 240}}, {{253,  14, 255, 251}}, {{167, 121, 180, 146}}, 
> +                {{169, 112, 185, 153}}, {{187, 107, 174, 132}}, {{181,  98, 163, 143}}, 
> +                {{159,  93, 128, 190}}, {{145,  84, 141, 181}}, {{131,  79, 154, 168}}, 
> +                {{141,  70, 151, 163}}, 
> +        },
> +        {
> +                {{  0,   0,   0,   0}}, {{ 11,  14,   9,  13}}, {{ 22,  28,  18,  26}}, 
> +                {{ 29,  18,  27,  23}}, {{ 44,  56,  36,  52}}, {{ 39,  54,  45,  57}}, 
> +                {{ 58,  36,  54,  46}}, {{ 49,  42,  63,  35}}, {{ 88, 112,  72, 104}}, 
> +                {{ 83, 126,  65, 101}}, {{ 78, 108,  90, 114}}, {{ 69,  98,  83, 127}}, 
> +                {{116,  72, 108,  92}}, {{127,  70, 101,  81}}, {{ 98,  84, 126,  70}}, 
> +                {{105,  90, 119,  75}}, {{176, 224, 144, 208}}, {{187, 238, 153, 221}}, 
> +                {{166, 252, 130, 202}}, {{173, 242, 139, 199}}, {{156, 216, 180, 228}}, 
> +                {{151, 214, 189, 233}}, {{138, 196, 166, 254}}, {{129, 202, 175, 243}}, 
> +                {{232, 144, 216, 184}}, {{227, 158, 209, 181}}, {{254, 140, 202, 162}}, 
> +                {{245, 130, 195, 175}}, {{196, 168, 252, 140}}, {{207, 166, 245, 129}}, 
> +                {{210, 180, 238, 150}}, {{217, 186, 231, 155}}, {{123, 219,  59, 187}}, 
> +                {{112, 213,  50, 182}}, {{109, 199,  41, 161}}, {{102, 201,  32, 172}}, 
> +                {{ 87, 227,  31, 143}}, {{ 92, 237,  22, 130}}, {{ 65, 255,  13, 149}}, 
> +                {{ 74, 241,   4, 152}}, {{ 35, 171, 115, 211}}, {{ 40, 165, 122, 222}}, 
> +                {{ 53, 183,  97, 201}}, {{ 62, 185, 104, 196}}, {{ 15, 147,  87, 231}}, 
> +                {{  4, 157,  94, 234}}, {{ 25, 143,  69, 253}}, {{ 18, 129,  76, 240}}, 
> +                {{203,  59, 171, 107}}, {{192,  53, 162, 102}}, {{221,  39, 185, 113}}, 
> +                {{214,  41, 176, 124}}, {{231,   3, 143,  95}}, {{236,  13, 134,  82}}, 
> +                {{241,  31, 157,  69}}, {{250,  17, 148,  72}}, {{147,  75, 227,   3}}, 
> +                {{152,  69, 234,  14}}, {{133,  87, 241,  25}}, {{142,  89, 248,  20}}, 
> +                {{191, 115, 199,  55}}, {{180, 125, 206,  58}}, {{169, 111, 213,  45}}, 
> +                {{162,  97, 220,  32}}, {{246, 173, 118, 109}}, {{253, 163, 127,  96}}, 
> +                {{224, 177, 100, 119}}, {{235, 191, 109, 122}}, {{218, 149,  82,  89}}, 
> +                {{209, 155,  91,  84}}, {{204, 137,  64,  67}}, {{199, 135,  73,  78}}, 
> +                {{174, 221,  62,   5}}, {{165, 211,  55,   8}}, {{184, 193,  44,  31}}, 
> +                {{179, 207,  37,  18}}, {{130, 229,  26,  49}}, {{137, 235,  19,  60}}, 
> +                {{148, 249,   8,  43}}, {{159, 247,   1,  38}}, {{ 70,  77, 230, 189}}, 
> +                {{ 77,  67, 239, 176}}, {{ 80,  81, 244, 167}}, {{ 91,  95, 253, 170}}, 
> +                {{106, 117, 194, 137}}, {{ 97, 123, 203, 132}}, {{124, 105, 208, 147}}, 
> +                {{119, 103, 217, 158}}, {{ 30,  61, 174, 213}}, {{ 21,  51, 167, 216}}, 
> +                {{  8,  33, 188, 207}}, {{  3,  47, 181, 194}}, {{ 50,   5, 138, 225}}, 
> +                {{ 57,  11, 131, 236}}, {{ 36,  25, 152, 251}}, {{ 47,  23, 145, 246}}, 
> +                {{141, 118,  77, 214}}, {{134, 120,  68, 219}}, {{155, 106,  95, 204}}, 
> +                {{144, 100,  86, 193}}, {{161,  78, 105, 226}}, {{170,  64,  96, 239}}, 
> +                {{183,  82, 123, 248}}, {{188,  92, 114, 245}}, {{213,   6,   5, 190}}, 
> +                {{222,   8,  12, 179}}, {{195,  26,  23, 164}}, {{200,  20,  30, 169}}, 
> +                {{249,  62,  33, 138}}, {{242,  48,  40, 135}}, {{239,  34,  51, 144}}, 
> +                {{228,  44,  58, 157}}, {{ 61, 150, 221,   6}}, {{ 54, 152, 212,  11}}, 
> +                {{ 43, 138, 207,  28}}, {{ 32, 132, 198,  17}}, {{ 17, 174, 249,  50}}, 
> +                {{ 26, 160, 240,  63}}, {{  7, 178, 235,  40}}, {{ 12, 188, 226,  37}}, 
> +                {{101, 230, 149, 110}}, {{110, 232, 156,  99}}, {{115, 250, 135, 116}}, 
> +                {{120, 244, 142, 121}}, {{ 73, 222, 177,  90}}, {{ 66, 208, 184,  87}}, 
> +                {{ 95, 194, 163,  64}}, {{ 84, 204, 170,  77}}, {{247,  65, 236, 218}}, 
> +                {{252,  79, 229, 215}}, {{225,  93, 254, 192}}, {{234,  83, 247, 205}}, 
> +                {{219, 121, 200, 238}}, {{208, 119, 193, 227}}, {{205, 101, 218, 244}}, 
> +                {{198, 107, 211, 249}}, {{175,  49, 164, 178}}, {{164,  63, 173, 191}}, 
> +                {{185,  45, 182, 168}}, {{178,  35, 191, 165}}, {{131,   9, 128, 134}}, 
> +                {{136,   7, 137, 139}}, {{149,  21, 146, 156}}, {{158,  27, 155, 145}}, 
> +                {{ 71, 161, 124,  10}}, {{ 76, 175, 117,   7}}, {{ 81, 189, 110,  16}}, 
> +                {{ 90, 179, 103,  29}}, {{107, 153,  88,  62}}, {{ 96, 151,  81,  51}}, 
> +                {{125, 133,  74,  36}}, {{118, 139,  67,  41}}, {{ 31, 209,  52,  98}}, 
> +                {{ 20, 223,  61, 111}}, {{  9, 205,  38, 120}}, {{  2, 195,  47, 117}}, 
> +                {{ 51, 233,  16,  86}}, {{ 56, 231,  25,  91}}, {{ 37, 245,   2,  76}}, 
> +                {{ 46, 251,  11,  65}}, {{140, 154, 215,  97}}, {{135, 148, 222, 108}}, 
> +                {{154, 134, 197, 123}}, {{145, 136, 204, 118}}, {{160, 162, 243,  85}}, 
> +                {{171, 172, 250,  88}}, {{182, 190, 225,  79}}, {{189, 176, 232,  66}}, 
> +                {{212, 234, 159,   9}}, {{223, 228, 150,   4}}, {{194, 246, 141,  19}}, 
> +                {{201, 248, 132,  30}}, {{248, 210, 187,  61}}, {{243, 220, 178,  48}}, 
> +                {{238, 206, 169,  39}}, {{229, 192, 160,  42}}, {{ 60, 122,  71, 177}}, 
> +                {{ 55, 116,  78, 188}}, {{ 42, 102,  85, 171}}, {{ 33, 104,  92, 166}}, 
> +                {{ 16,  66,  99, 133}}, {{ 27,  76, 106, 136}}, {{  6,  94, 113, 159}}, 
> +                {{ 13,  80, 120, 146}}, {{100,  10,  15, 217}}, {{111,   4,   6, 212}}, 
> +                {{114,  22,  29, 195}}, {{121,  24,  20, 206}}, {{ 72,  50,  43, 237}}, 
> +                {{ 67,  60,  34, 224}}, {{ 94,  46,  57, 247}}, {{ 85,  32,  48, 250}}, 
> +                {{  1, 236, 154, 183}}, {{ 10, 226, 147, 186}}, {{ 23, 240, 136, 173}}, 
> +                {{ 28, 254, 129, 160}}, {{ 45, 212, 190, 131}}, {{ 38, 218, 183, 142}}, 
> +                {{ 59, 200, 172, 153}}, {{ 48, 198, 165, 148}}, {{ 89, 156, 210, 223}}, 
> +                {{ 82, 146, 219, 210}}, {{ 79, 128, 192, 197}}, {{ 68, 142, 201, 200}}, 
> +                {{117, 164, 246, 235}}, {{126, 170, 255, 230}}, {{ 99, 184, 228, 241}}, 
> +                {{104, 182, 237, 252}}, {{177,  12,  10, 103}}, {{186,   2,   3, 106}}, 
> +                {{167,  16,  24, 125}}, {{172,  30,  17, 112}}, {{157,  52,  46,  83}}, 
> +                {{150,  58,  39,  94}}, {{139,  40,  60,  73}}, {{128,  38,  53,  68}}, 
> +                {{233, 124,  66,  15}}, {{226, 114,  75,   2}}, {{255,  96,  80,  21}}, 
> +                {{244, 110,  89,  24}}, {{197,  68, 102,  59}}, {{206,  74, 111,  54}}, 
> +                {{211,  88, 116,  33}}, {{216,  86, 125,  44}}, {{122,  55, 161,  12}}, 
> +                {{113,  57, 168,   1}}, {{108,  43, 179,  22}}, {{103,  37, 186,  27}}, 
> +                {{ 86,  15, 133,  56}}, {{ 93,   1, 140,  53}}, {{ 64,  19, 151,  34}}, 
> +                {{ 75,  29, 158,  47}}, {{ 34,  71, 233, 100}}, {{ 41,  73, 224, 105}}, 
> +                {{ 52,  91, 251, 126}}, {{ 63,  85, 242, 115}}, {{ 14, 127, 205,  80}}, 
> +                {{  5, 113, 196,  93}}, {{ 24,  99, 223,  74}}, {{ 19, 109, 214,  71}}, 
> +                {{202, 215,  49, 220}}, {{193, 217,  56, 209}}, {{220, 203,  35, 198}}, 
> +                {{215, 197,  42, 203}}, {{230, 239,  21, 232}}, {{237, 225,  28, 229}}, 
> +                {{240, 243,   7, 242}}, {{251, 253,  14, 255}}, {{146, 167, 121, 180}}, 
> +                {{153, 169, 112, 185}}, {{132, 187, 107, 174}}, {{143, 181,  98, 163}}, 
> +                {{190, 159,  93, 128}}, {{181, 145,  84, 141}}, {{168, 131,  79, 154}}, 
> +                {{163, 141,  70, 151}}, 
> +        },
> +        {
> +                {{  0,   0,   0,   0}}, {{ 13,  11,  14,   9}}, {{ 26,  22,  28,  18}}, 
> +                {{ 23,  29,  18,  27}}, {{ 52,  44,  56,  36}}, {{ 57,  39,  54,  45}}, 
> +                {{ 46,  58,  36,  54}}, {{ 35,  49,  42,  63}}, {{104,  88, 112,  72}}, 
> +                {{101,  83, 126,  65}}, {{114,  78, 108,  90}}, {{127,  69,  98,  83}}, 
> +                {{ 92, 116,  72, 108}}, {{ 81, 127,  70, 101}}, {{ 70,  98,  84, 126}}, 
> +                {{ 75, 105,  90, 119}}, {{208, 176, 224, 144}}, {{221, 187, 238, 153}}, 
> +                {{202, 166, 252, 130}}, {{199, 173, 242, 139}}, {{228, 156, 216, 180}}, 
> +                {{233, 151, 214, 189}}, {{254, 138, 196, 166}}, {{243, 129, 202, 175}}, 
> +                {{184, 232, 144, 216}}, {{181, 227, 158, 209}}, {{162, 254, 140, 202}}, 
> +                {{175, 245, 130, 195}}, {{140, 196, 168, 252}}, {{129, 207, 166, 245}}, 
> +                {{150, 210, 180, 238}}, {{155, 217, 186, 231}}, {{187, 123, 219,  59}}, 
> +                {{182, 112, 213,  50}}, {{161, 109, 199,  41}}, {{172, 102, 201,  32}}, 
> +                {{143,  87, 227,  31}}, {{130,  92, 237,  22}}, {{149,  65, 255,  13}}, 
> +                {{152,  74, 241,   4}}, {{211,  35, 171, 115}}, {{222,  40, 165, 122}}, 
> +                {{201,  53, 183,  97}}, {{196,  62, 185, 104}}, {{231,  15, 147,  87}}, 
> +                {{234,   4, 157,  94}}, {{253,  25, 143,  69}}, {{240,  18, 129,  76}}, 
> +                {{107, 203,  59, 171}}, {{102, 192,  53, 162}}, {{113, 221,  39, 185}}, 
> +                {{124, 214,  41, 176}}, {{ 95, 231,   3, 143}}, {{ 82, 236,  13, 134}}, 
> +                {{ 69, 241,  31, 157}}, {{ 72, 250,  17, 148}}, {{  3, 147,  75, 227}}, 
> +                {{ 14, 152,  69, 234}}, {{ 25, 133,  87, 241}}, {{ 20, 142,  89, 248}}, 
> +                {{ 55, 191, 115, 199}}, {{ 58, 180, 125, 206}}, {{ 45, 169, 111, 213}}, 
> +                {{ 32, 162,  97, 220}}, {{109, 246, 173, 118}}, {{ 96, 253, 163, 127}}, 
> +                {{119, 224, 177, 100}}, {{122, 235, 191, 109}}, {{ 89, 218, 149,  82}}, 
> +                {{ 84, 209, 155,  91}}, {{ 67, 204, 137,  64}}, {{ 78, 199, 135,  73}}, 
> +                {{  5, 174, 221,  62}}, {{  8, 165, 211,  55}}, {{ 31, 184, 193,  44}}, 
> +                {{ 18, 179, 207,  37}}, {{ 49, 130, 229,  26}}, {{ 60, 137, 235,  19}}, 
> +                {{ 43, 148, 249,   8}}, {{ 38, 159, 247,   1}}, {{189,  70,  77, 230}}, 
> +                {{176,  77,  67, 239}}, {{167,  80,  81, 244}}, {{170,  91,  95, 253}}, 
> +                {{137, 106, 117, 194}}, {{132,  97, 123, 203}}, {{147, 124, 105, 208}}, 
> +                {{158, 119, 103, 217}}, {{213,  30,  61, 174}}, {{216,  21,  51, 167}}, 
> +                {{207,   8,  33, 188}}, {{194,   3,  47, 181}}, {{225,  50,   5, 138}}, 
> +                {{236,  57,  11, 131}}, {{251,  36,  25, 152}}, {{246,  47,  23, 145}}, 
> +                {{214, 141, 118,  77}}, {{219, 134, 120,  68}}, {{204, 155, 106,  95}}, 
> +                {{193, 144, 100,  86}}, {{226, 161,  78, 105}}, {{239, 170,  64,  96}}, 
> +                {{248, 183,  82, 123}}, {{245, 188,  92, 114}}, {{190, 213,   6,   5}}, 
> +                {{179, 222,   8,  12}}, {{164, 195,  26,  23}}, {{169, 200,  20,  30}}, 
> +                {{138, 249,  62,  33}}, {{135, 242,  48,  40}}, {{144, 239,  34,  51}}, 
> +                {{157, 228,  44,  58}}, {{  6,  61, 150, 221}}, {{ 11,  54, 152, 212}}, 
> +                {{ 28,  43, 138, 207}}, {{ 17,  32, 132, 198}}, {{ 50,  17, 174, 249}}, 
> +                {{ 63,  26, 160, 240}}, {{ 40,   7, 178, 235}}, {{ 37,  12, 188, 226}}, 
> +                {{110, 101, 230, 149}}, {{ 99, 110, 232, 156}}, {{116, 115, 250, 135}}, 
> +                {{121, 120, 244, 142}}, {{ 90,  73, 222, 177}}, {{ 87,  66, 208, 184}}, 
> +                {{ 64,  95, 194, 163}}, {{ 77,  84, 204, 170}}, {{218, 247,  65, 236}}, 
> +                {{215, 252,  79, 229}}, {{192, 225,  93, 254}}, {{205, 234,  83, 247}}, 
> +                {{238, 219, 121, 200}}, {{227, 208, 119, 193}}, {{244, 205, 101, 218}}, 
> +                {{249, 198, 107, 211}}, {{178, 175,  49, 164}}, {{191, 164,  63, 173}}, 
> +                {{168, 185,  45, 182}}, {{165, 178,  35, 191}}, {{134, 131,   9, 128}}, 
> +                {{139, 136,   7, 137}}, {{156, 149,  21, 146}}, {{145, 158,  27, 155}}, 
> +                {{ 10,  71, 161, 124}}, {{  7,  76, 175, 117}}, {{ 16,  81, 189, 110}}, 
> +                {{ 29,  90, 179, 103}}, {{ 62, 107, 153,  88}}, {{ 51,  96, 151,  81}}, 
> +                {{ 36, 125, 133,  74}}, {{ 41, 118, 139,  67}}, {{ 98,  31, 209,  52}}, 
> +                {{111,  20, 223,  61}}, {{120,   9, 205,  38}}, {{117,   2, 195,  47}}, 
> +                {{ 86,  51, 233,  16}}, {{ 91,  56, 231,  25}}, {{ 76,  37, 245,   2}}, 
> +                {{ 65,  46, 251,  11}}, {{ 97, 140, 154, 215}}, {{108, 135, 148, 222}}, 
> +                {{123, 154, 134, 197}}, {{118, 145, 136, 204}}, {{ 85, 160, 162, 243}}, 
> +                {{ 88, 171, 172, 250}}, {{ 79, 182, 190, 225}}, {{ 66, 189, 176, 232}}, 
> +                {{  9, 212, 234, 159}}, {{  4, 223, 228, 150}}, {{ 19, 194, 246, 141}}, 
> +                {{ 30, 201, 248, 132}}, {{ 61, 248, 210, 187}}, {{ 48, 243, 220, 178}}, 
> +                {{ 39, 238, 206, 169}}, {{ 42, 229, 192, 160}}, {{177,  60, 122,  71}}, 
> +                {{188,  55, 116,  78}}, {{171,  42, 102,  85}}, {{166,  33, 104,  92}}, 
> +                {{133,  16,  66,  99}}, {{136,  27,  76, 106}}, {{159,   6,  94, 113}}, 
> +                {{146,  13,  80, 120}}, {{217, 100,  10,  15}}, {{212, 111,   4,   6}}, 
> +                {{195, 114,  22,  29}}, {{206, 121,  24,  20}}, {{237,  72,  50,  43}}, 
> +                {{224,  67,  60,  34}}, {{247,  94,  46,  57}}, {{250,  85,  32,  48}}, 
> +                {{183,   1, 236, 154}}, {{186,  10, 226, 147}}, {{173,  23, 240, 136}}, 
> +                {{160,  28, 254, 129}}, {{131,  45, 212, 190}}, {{142,  38, 218, 183}}, 
> +                {{153,  59, 200, 172}}, {{148,  48, 198, 165}}, {{223,  89, 156, 210}}, 
> +                {{210,  82, 146, 219}}, {{197,  79, 128, 192}}, {{200,  68, 142, 201}}, 
> +                {{235, 117, 164, 246}}, {{230, 126, 170, 255}}, {{241,  99, 184, 228}}, 
> +                {{252, 104, 182, 237}}, {{103, 177,  12,  10}}, {{106, 186,   2,   3}}, 
> +                {{125, 167,  16,  24}}, {{112, 172,  30,  17}}, {{ 83, 157,  52,  46}}, 
> +                {{ 94, 150,  58,  39}}, {{ 73, 139,  40,  60}}, {{ 68, 128,  38,  53}}, 
> +                {{ 15, 233, 124,  66}}, {{  2, 226, 114,  75}}, {{ 21, 255,  96,  80}}, 
> +                {{ 24, 244, 110,  89}}, {{ 59, 197,  68, 102}}, {{ 54, 206,  74, 111}}, 
> +                {{ 33, 211,  88, 116}}, {{ 44, 216,  86, 125}}, {{ 12, 122,  55, 161}}, 
> +                {{  1, 113,  57, 168}}, {{ 22, 108,  43, 179}}, {{ 27, 103,  37, 186}}, 
> +                {{ 56,  86,  15, 133}}, {{ 53,  93,   1, 140}}, {{ 34,  64,  19, 151}}, 
> +                {{ 47,  75,  29, 158}}, {{100,  34,  71, 233}}, {{105,  41,  73, 224}}, 
> +                {{126,  52,  91, 251}}, {{115,  63,  85, 242}}, {{ 80,  14, 127, 205}}, 
> +                {{ 93,   5, 113, 196}}, {{ 74,  24,  99, 223}}, {{ 71,  19, 109, 214}}, 
> +                {{220, 202, 215,  49}}, {{209, 193, 217,  56}}, {{198, 220, 203,  35}}, 
> +                {{203, 215, 197,  42}}, {{232, 230, 239,  21}}, {{229, 237, 225,  28}}, 
> +                {{242, 240, 243,   7}}, {{255, 251, 253,  14}}, {{180, 146, 167, 121}}, 
> +                {{185, 153, 169, 112}}, {{174, 132, 187, 107}}, {{163, 143, 181,  98}}, 
> +                {{128, 190, 159,  93}}, {{141, 181, 145,  84}}, {{154, 168, 131,  79}}, 
> +                {{151, 163, 141,  70}}, 
> +        },
> +        {
> +                {{  0,   0,   0,   0}}, {{  9,  13,  11,  14}}, {{ 18,  26,  22,  28}}, 
> +                {{ 27,  23,  29,  18}}, {{ 36,  52,  44,  56}}, {{ 45,  57,  39,  54}}, 
> +                {{ 54,  46,  58,  36}}, {{ 63,  35,  49,  42}}, {{ 72, 104,  88, 112}}, 
> +                {{ 65, 101,  83, 126}}, {{ 90, 114,  78, 108}}, {{ 83, 127,  69,  98}}, 
> +                {{108,  92, 116,  72}}, {{101,  81, 127,  70}}, {{126,  70,  98,  84}}, 
> +                {{119,  75, 105,  90}}, {{144, 208, 176, 224}}, {{153, 221, 187, 238}}, 
> +                {{130, 202, 166, 252}}, {{139, 199, 173, 242}}, {{180, 228, 156, 216}}, 
> +                {{189, 233, 151, 214}}, {{166, 254, 138, 196}}, {{175, 243, 129, 202}}, 
> +                {{216, 184, 232, 144}}, {{209, 181, 227, 158}}, {{202, 162, 254, 140}}, 
> +                {{195, 175, 245, 130}}, {{252, 140, 196, 168}}, {{245, 129, 207, 166}}, 
> +                {{238, 150, 210, 180}}, {{231, 155, 217, 186}}, {{ 59, 187, 123, 219}}, 
> +                {{ 50, 182, 112, 213}}, {{ 41, 161, 109, 199}}, {{ 32, 172, 102, 201}}, 
> +                {{ 31, 143,  87, 227}}, {{ 22, 130,  92, 237}}, {{ 13, 149,  65, 255}}, 
> +                {{  4, 152,  74, 241}}, {{115, 211,  35, 171}}, {{122, 222,  40, 165}}, 
> +                {{ 97, 201,  53, 183}}, {{104, 196,  62, 185}}, {{ 87, 231,  15, 147}}, 
> +                {{ 94, 234,   4, 157}}, {{ 69, 253,  25, 143}}, {{ 76, 240,  18, 129}}, 
> +                {{171, 107, 203,  59}}, {{162, 102, 192,  53}}, {{185, 113, 221,  39}}, 
> +                {{176, 124, 214,  41}}, {{143,  95, 231,   3}}, {{134,  82, 236,  13}}, 
> +                {{157,  69, 241,  31}}, {{148,  72, 250,  17}}, {{227,   3, 147,  75}}, 
> +                {{234,  14, 152,  69}}, {{241,  25, 133,  87}}, {{248,  20, 142,  89}}, 
> +                {{199,  55, 191, 115}}, {{206,  58, 180, 125}}, {{213,  45, 169, 111}}, 
> +                {{220,  32, 162,  97}}, {{118, 109, 246, 173}}, {{127,  96, 253, 163}}, 
> +                {{100, 119, 224, 177}}, {{109, 122, 235, 191}}, {{ 82,  89, 218, 149}}, 
> +                {{ 91,  84, 209, 155}}, {{ 64,  67, 204, 137}}, {{ 73,  78, 199, 135}}, 
> +                {{ 62,   5, 174, 221}}, {{ 55,   8, 165, 211}}, {{ 44,  31, 184, 193}}, 
> +                {{ 37,  18, 179, 207}}, {{ 26,  49, 130, 229}}, {{ 19,  60, 137, 235}}, 
> +                {{  8,  43, 148, 249}}, {{  1,  38, 159, 247}}, {{230, 189,  70,  77}}, 
> +                {{239, 176,  77,  67}}, {{244, 167,  80,  81}}, {{253, 170,  91,  95}}, 
> +                {{194, 137, 106, 117}}, {{203, 132,  97, 123}}, {{208, 147, 124, 105}}, 
> +                {{217, 158, 119, 103}}, {{174, 213,  30,  61}}, {{167, 216,  21,  51}}, 
> +                {{188, 207,   8,  33}}, {{181, 194,   3,  47}}, {{138, 225,  50,   5}}, 
> +                {{131, 236,  57,  11}}, {{152, 251,  36,  25}}, {{145, 246,  47,  23}}, 
> +                {{ 77, 214, 141, 118}}, {{ 68, 219, 134, 120}}, {{ 95, 204, 155, 106}}, 
> +                {{ 86, 193, 144, 100}}, {{105, 226, 161,  78}}, {{ 96, 239, 170,  64}}, 
> +                {{123, 248, 183,  82}}, {{114, 245, 188,  92}}, {{  5, 190, 213,   6}}, 
> +                {{ 12, 179, 222,   8}}, {{ 23, 164, 195,  26}}, {{ 30, 169, 200,  20}}, 
> +                {{ 33, 138, 249,  62}}, {{ 40, 135, 242,  48}}, {{ 51, 144, 239,  34}}, 
> +                {{ 58, 157, 228,  44}}, {{221,   6,  61, 150}}, {{212,  11,  54, 152}}, 
> +                {{207,  28,  43, 138}}, {{198,  17,  32, 132}}, {{249,  50,  17, 174}}, 
> +                {{240,  63,  26, 160}}, {{235,  40,   7, 178}}, {{226,  37,  12, 188}}, 
> +                {{149, 110, 101, 230}}, {{156,  99, 110, 232}}, {{135, 116, 115, 250}}, 
> +                {{142, 121, 120, 244}}, {{177,  90,  73, 222}}, {{184,  87,  66, 208}}, 
> +                {{163,  64,  95, 194}}, {{170,  77,  84, 204}}, {{236, 218, 247,  65}}, 
> +                {{229, 215, 252,  79}}, {{254, 192, 225,  93}}, {{247, 205, 234,  83}}, 
> +                {{200, 238, 219, 121}}, {{193, 227, 208, 119}}, {{218, 244, 205, 101}}, 
> +                {{211, 249, 198, 107}}, {{164, 178, 175,  49}}, {{173, 191, 164,  63}}, 
> +                {{182, 168, 185,  45}}, {{191, 165, 178,  35}}, {{128, 134, 131,   9}}, 
> +                {{137, 139, 136,   7}}, {{146, 156, 149,  21}}, {{155, 145, 158,  27}}, 
> +                {{124,  10,  71, 161}}, {{117,   7,  76, 175}}, {{110,  16,  81, 189}}, 
> +                {{103,  29,  90, 179}}, {{ 88,  62, 107, 153}}, {{ 81,  51,  96, 151}}, 
> +                {{ 74,  36, 125, 133}}, {{ 67,  41, 118, 139}}, {{ 52,  98,  31, 209}}, 
> +                {{ 61, 111,  20, 223}}, {{ 38, 120,   9, 205}}, {{ 47, 117,   2, 195}}, 
> +                {{ 16,  86,  51, 233}}, {{ 25,  91,  56, 231}}, {{  2,  76,  37, 245}}, 
> +                {{ 11,  65,  46, 251}}, {{215,  97, 140, 154}}, {{222, 108, 135, 148}}, 
> +                {{197, 123, 154, 134}}, {{204, 118, 145, 136}}, {{243,  85, 160, 162}}, 
> +                {{250,  88, 171, 172}}, {{225,  79, 182, 190}}, {{232,  66, 189, 176}}, 
> +                {{159,   9, 212, 234}}, {{150,   4, 223, 228}}, {{141,  19, 194, 246}}, 
> +                {{132,  30, 201, 248}}, {{187,  61, 248, 210}}, {{178,  48, 243, 220}}, 
> +                {{169,  39, 238, 206}}, {{160,  42, 229, 192}}, {{ 71, 177,  60, 122}}, 
> +                {{ 78, 188,  55, 116}}, {{ 85, 171,  42, 102}}, {{ 92, 166,  33, 104}}, 
> +                {{ 99, 133,  16,  66}}, {{106, 136,  27,  76}}, {{113, 159,   6,  94}}, 
> +                {{120, 146,  13,  80}}, {{ 15, 217, 100,  10}}, {{  6, 212, 111,   4}}, 
> +                {{ 29, 195, 114,  22}}, {{ 20, 206, 121,  24}}, {{ 43, 237,  72,  50}}, 
> +                {{ 34, 224,  67,  60}}, {{ 57, 247,  94,  46}}, {{ 48, 250,  85,  32}}, 
> +                {{154, 183,   1, 236}}, {{147, 186,  10, 226}}, {{136, 173,  23, 240}}, 
> +                {{129, 160,  28, 254}}, {{190, 131,  45, 212}}, {{183, 142,  38, 218}}, 
> +                {{172, 153,  59, 200}}, {{165, 148,  48, 198}}, {{210, 223,  89, 156}}, 
> +                {{219, 210,  82, 146}}, {{192, 197,  79, 128}}, {{201, 200,  68, 142}}, 
> +                {{246, 235, 117, 164}}, {{255, 230, 126, 170}}, {{228, 241,  99, 184}}, 
> +                {{237, 252, 104, 182}}, {{ 10, 103, 177,  12}}, {{  3, 106, 186,   2}}, 
> +                {{ 24, 125, 167,  16}}, {{ 17, 112, 172,  30}}, {{ 46,  83, 157,  52}}, 
> +                {{ 39,  94, 150,  58}}, {{ 60,  73, 139,  40}}, {{ 53,  68, 128,  38}}, 
> +                {{ 66,  15, 233, 124}}, {{ 75,   2, 226, 114}}, {{ 80,  21, 255,  96}}, 
> +                {{ 89,  24, 244, 110}}, {{102,  59, 197,  68}}, {{111,  54, 206,  74}}, 
> +                {{116,  33, 211,  88}}, {{125,  44, 216,  86}}, {{161,  12, 122,  55}}, 
> +                {{168,   1, 113,  57}}, {{179,  22, 108,  43}}, {{186,  27, 103,  37}}, 
> +                {{133,  56,  86,  15}}, {{140,  53,  93,   1}}, {{151,  34,  64,  19}}, 
> +                {{158,  47,  75,  29}}, {{233, 100,  34,  71}}, {{224, 105,  41,  73}}, 
> +                {{251, 126,  52,  91}}, {{242, 115,  63,  85}}, {{205,  80,  14, 127}}, 
> +                {{196,  93,   5, 113}}, {{223,  74,  24,  99}}, {{214,  71,  19, 109}}, 
> +                {{ 49, 220, 202, 215}}, {{ 56, 209, 193, 217}}, {{ 35, 198, 220, 203}}, 
> +                {{ 42, 203, 215, 197}}, {{ 21, 232, 230, 239}}, {{ 28, 229, 237, 225}}, 
> +                {{  7, 242, 240, 243}}, {{ 14, 255, 251, 253}}, {{121, 180, 146, 167}}, 
> +                {{112, 185, 153, 169}}, {{107, 174, 132, 187}}, {{ 98, 163, 143, 181}}, 
> +                {{ 93, 128, 190, 159}}, {{ 84, 141, 181, 145}}, {{ 79, 154, 168, 131}}, 
> +                {{ 70, 151, 163, 141}}, 
> +        },
> +};
> +
> +int xrcon[30] = {
> +        0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 
> +        0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 
> +        0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 
> +};
> +
> +word8 xS[256] = {
> +        99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254, 215, 
> +        171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212, 162, 175, 
> +        156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247, 204,  52, 165, 
> +        229, 241, 113, 216,  49,  21,   4, 199,  35, 195,  24, 150,   5, 154, 
> +        7,  18, 128, 226, 235,  39, 178, 117,   9, 131,  44,  26,  27, 110, 
> +        90, 160,  82,  59, 214, 179,  41, 227,  47, 132,  83, 209,   0, 237, 
> +        32, 252, 177,  91, 106, 203, 190,  57,  74,  76,  88, 207, 208, 239, 
> +        170, 251,  67,  77,  51, 133,  69, 249,   2, 127,  80,  60, 159, 168, 
> +        81, 163,  64, 143, 146, 157,  56, 245, 188, 182, 218,  33,  16, 255, 
> +        243, 210, 205,  12,  19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 
> +        100,  93,  25, 115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 
> +        184,  20, 222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92, 
> +        194, 211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213, 
> +        78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,  46, 
> +        28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138, 112,  62, 
> +        181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134, 193,  29, 158, 
> +        225, 248, 152,  17, 105, 217, 142, 148, 155,  30, 135, 233, 206,  85, 
> +        40, 223, 140, 161, 137,  13, 191, 230,  66, 104,  65, 153,  45,  15, 
> +        176,  84, 187,  22, 
> +};
> +
> +word8 xSi[256] = {
> +        82,   9, 106, 213,  48,  54, 165,  56, 191,  64, 163, 158, 129, 243, 
> +        215, 251, 124, 227,  57, 130, 155,  47, 255, 135,  52, 142,  67,  68, 
> +        196, 222, 233, 203,  84, 123, 148,  50, 166, 194,  35,  61, 238,  76, 
> +        149,  11,  66, 250, 195,  78,   8,  46, 161, 102,  40, 217,  36, 178, 
> +        118,  91, 162,  73, 109, 139, 209,  37, 114, 248, 246, 100, 134, 104, 
> +        152,  22, 212, 164,  92, 204,  93, 101, 182, 146, 108, 112,  72,  80, 
> +        253, 237, 185, 218,  94,  21,  70,  87, 167, 141, 157, 132, 144, 216, 
> +        171,   0, 140, 188, 211,  10, 247, 228,  88,   5, 184, 179,  69,   6, 
> +        208,  44,  30, 143, 202,  63,  15,   2, 193, 175, 189,   3,   1,  19, 
> +        138, 107,  58, 145,  17,  65,  79, 103, 220, 234, 151, 242, 207, 206, 
> +        240, 180, 230, 115, 150, 172, 116,  34, 231, 173,  53, 133, 226, 249, 
> +        55, 232,  28, 117, 223, 110,  71, 241,  26, 113,  29,  41, 197, 137, 
> +        111, 183,  98,  14, 170,  24, 190,  27, 252,  86,  62,  75, 198, 210, 
> +        121,  32, 154, 219, 192, 254, 120, 205,  90, 244,  31, 221, 168,  51, 
> +        136,   7, 199,  49, 177,  18,  16,  89,  39, 128, 236,  95,  96,  81, 
> +        127, 169,  25, 181,  74,  13,  45, 229, 122, 159, 147, 201, 156, 239, 
> +        160, 224,  59,  77, 174,  42, 245, 176, 200, 235, 187,  60, 131,  83, 
> +        153,  97,  23,  43,   4, 126, 186, 119, 214,  38, 225, 105,  20,  99, 
> +        85,  33,  12, 125, 
> +};
> +
> +/* -------------------------------- */
> +
> +#define MAXBC		(256/32)
> +#define MAXKC		(256/32)
> +#define MAXROUNDS	14
> +#define MAXRK           ((MAXROUNDS+1)*MAXBC)
> +
> +typedef struct {
> +        int BC;
> +        int KC;
> +        int ROUNDS;
> +        int shift[2][4];
> +        word32 rk[MAXRK];
> +} roundkey;
> +
> +/* keys and blocks are externally treated as word32 arrays, to
> +   make sure they are aligned on 4-byte boundaries on architectures
> +   that require it. */
> +
> +static int xshifts[3][2][4] = {
> +        {{0, 1, 2, 3},
> +         {0, 3, 2, 1}},
> +
> +        {{0, 1, 2, 3},
> +         {0, 5, 4, 3}},
> +
> +        {{0, 1, 3, 4},
> +         {0, 7, 5, 4}},
> +};
> +
> +/* Exor corresponding text input and round key input bytes */
> +/* the result is written to res, which can be the same as a */
> +static inline void xKeyAddition(word32 res[MAXBC], word32 a[MAXBC],
> +                                word32 rk[MAXBC], int BC)
> +{
> +        int j;
> +
> +        for (j = 0; j < BC; j++) {
> +                res[j] = a[j] ^ rk[j];
> +        }
> +}
> +
> +/* profiling shows that the ccrypt program spends about 50% of its
> +   time in the function xShiftSubst. Splitting the inner "for"
> +   statement into two parts - versus using the expensive "%" modulo
> +   operation, makes this function about 44% faster, thereby making the
> +   entire program about 28% faster. With -O3 optimization, the time
> +   savings are even more dramatic - ccrypt runs between 55% and 65%
> +   faster on most platforms. */
> +
> +/* do ShiftRow and Substitution together. res must not be a. */
> +static inline void xShiftSubst(word32 res[MAXBC], word32 a[MAXBC],
> +                               int shift[4], int BC, word8 box[256])
> +{
> +        int i, j;
> +        int s;
> +        word8 (*a8)[4] = (word8 (*)[4]) a;
> +        word8 (*res8)[4] = (word8 (*)[4]) res;
> +
> +        for (j = 0; j < BC; j++) {
> +                res8[j][0] = box[a8[j][0]];
> +        }
> +        for (i = 1; i < 4; i++) {
> +                s = shift[i];
> +                for (j = 0; j < BC - s; j++) {
> +                        res8[j][i] = box[a8[(j + s)][i]];
> +                }
> +                for (j = BC - s; j < BC; j++) {
> +                        res8[j][i] = box[a8[(j + s) - BC][i]];
> +                }
> +        }
> +}
> +
> +/* do MixColumn and KeyAddition together */
> +static inline void xMixAdd(word32 res[MAXBC], word32 a[MAXBC],
> +                           word32 rk[MAXBC], int BC)
> +{
> +        int j;
> +        word32 b;
> +        word8 (*a8)[4] = (word8 (*)[4]) a;
> +
> +        for (j = 0; j < BC; j++) {
> +                b = M0[0][a8[j][0]].w32;
> +                b ^= M0[1][a8[j][1]].w32;
> +                b ^= M0[2][a8[j][2]].w32;
> +                b ^= M0[3][a8[j][3]].w32;
> +                b ^= rk[j];
> +                res[j] = b;
> +        }
> +}
> +
> +/* Mix the four bytes of every column in a linear way
> + * This is the opposite operation of xMixColumn */
> +/* the result is written to res, which may equal a */
> +static inline void xInvMixColumn(word32 res[MAXBC], word32 a[MAXBC], int BC)
> +{
> +        int j;
> +        word32 b;
> +        word8 (*a8)[4] = (word8 (*)[4]) a;
> +
> +        for (j = 0; j < BC; j++) {
> +                b = M1[0][a8[j][0]].w32;
> +                b ^= M1[1][a8[j][1]].w32;
> +                b ^= M1[2][a8[j][2]].w32;
> +                b ^= M1[3][a8[j][3]].w32;
> +                res[j] = b;
> +        }
> +}
> +
> +/* make a roundkey rkk from key. key must have appropriate size given
> +   by keyBits. keyBits and blockBits may only be 128, 196, or
> +   256. Returns non-zero if arguments are invalid. */

> +int xrijndaelKeySched(word32 key[], int keyBits, int blockBits,
> +		      roundkey *rkk)
> +{
> +        /* Calculate the necessary round keys
> +         * The number of calculations depends on keyBits and blockBits */
> +        int KC, BC, ROUNDS;
> +        int i, j, t, rconpointer = 0;
> +        word8 (*k8)[4] = (word8 (*)[4]) key;
> +
> +        switch (keyBits) {
> +        case 128:
> +                KC = 4;
> +                break;
> +        case 192:
> +                KC = 6;
> +                break;
> +        case 256:
> +                KC = 8;
> +                break;
> +        default:
> +                return -1;
> +        }
> +
> +        switch (blockBits) {
> +        case 128:
> +                BC = 4;
> +                break;
> +        case 192:
> +                BC = 6;
> +                break;
> +        case 256:
> +                BC = 8;
> +                break;
> +        default:
> +                return -2;
> +        }
> +
> +        ROUNDS = KC > BC ? KC + 6 : BC + 6;
> +
> +        t = 0;
> +        /* copy values into round key array */
> +        for (j = 0; (j < KC) && (t < (ROUNDS + 1) * BC); j++, t++)
> +                rkk->rk[t] = key[j];
> +
> +        while (t < (ROUNDS + 1) * BC) {  /* while not enough round key material */
> +                /* calculate new values */
> +                for (i = 0; i < 4; i++) {
> +                        k8[0][i] ^= xS[k8[KC - 1][(i + 1) % 4]];
> +                }
> +                k8[0][0] ^= xrcon[rconpointer++];
> +
> +                if (KC != 8) {
> +                        for (j = 1; j < KC; j++) {
> +                                key[j] ^= key[j - 1];
> +                        }
> +                } else {
> +                        for (j = 1; j < 4; j++) {
> +                                key[j] ^= key[j - 1];
> +                        }
> +                        for (i = 0; i < 4; i++) {
> +                                k8[4][i] ^= xS[k8[3][i]];
> +                        }
> +                        for (j = 5; j < 8; j++) {
> +                                key[j] ^= key[j - 1];
> +                        }
> +                }
> +                /* copy values into round key array */
> +                for (j = 0; (j < KC) && (t < (ROUNDS + 1) * BC); j++, t++) {
> +                        rkk->rk[t] = key[j];
> +                }
> +        }
> +
> +        /* make roundkey structure */
> +        rkk->BC = BC;
> +        rkk->KC = KC;
> +        rkk->ROUNDS = ROUNDS;
> +        for (i = 0; i < 2; i++) {
> +                for (j = 0; j < 4; j++) {
> +                        rkk->shift[i][j] = xshifts[(BC - 4) >> 1][i][j];
> +                }
> +        }
> +
> +        return 0;
> +}
> +
> +/* encrypt, resp. decrypt, block using rijndael roundkey rkk. rkk must
> +   have been created with xrijndaelKeySched. Size of block, in bits,
> +   must be equal to blockBits parameter that was used to make rkk. In
> +   all other cases, behavior is undefined - for reasons of speed, no
> +   check for error conditions is done. */
> +
> +/* Encryption of one block. */
> +
> +void xrijndaelEncrypt(word32 block[], roundkey *rkk)
> +{
> +        word32 block2[MAXBC];		/* hold intermediate result */
> +        int r;
> +
> +        int *shift = rkk->shift[0];
> +        int BC = rkk->BC;
> +        int ROUNDS = rkk->ROUNDS;
> +        word32 *rp = rkk->rk;
> +
> +        /* begin with a key addition */
> +        xKeyAddition(block, block, rp, BC);
> +        rp += BC;
> +
> +        /* ROUNDS-1 ordinary rounds */
> +        for (r = 1; r < ROUNDS; r++) {
> +                xShiftSubst(block2, block, shift, BC, xS);
> +                xMixAdd(block, block2, rp, BC);
> +                rp += BC;
> +        }
> +
> +        /* Last round is special: there is no xMixColumn */
> +        xShiftSubst(block2, block, shift, BC, xS);
> +        xKeyAddition(block, block2, rp, BC);
> +}
> +
> +void xrijndaelDecrypt(word32 block[], roundkey *rkk)
> +{
> +        word32 block2[MAXBC];		/* hold intermediate result */
> +        int r;
> +
> +        int *shift = rkk->shift[1];
> +        int BC = rkk->BC;
> +        int ROUNDS = rkk->ROUNDS;
> +        word32 *rp = rkk->rk + ROUNDS * BC;
> +
> +        /* To decrypt: apply the inverse operations of the encrypt routine,
> +         *             in opposite order
> +         * 
> +         * (xKeyAddition is an involution: it's equal to its inverse)
> +         * (the inverse of xSubstitution with table S is xSubstitution with the 
> +         * inverse table of S)
> +         * (the inverse of xShiftRow is xShiftRow over a suitable distance)
> +         */
> +
> +        /* First the special round:
> +         *   without xInvMixColumn
> +         *   with extra xKeyAddition
> +         */
> +        xKeyAddition(block2, block, rp, BC);
> +        xShiftSubst(block, block2, shift, BC, xSi);
> +        rp -= BC;
> +
> +        /* ROUNDS-1 ordinary rounds
> +         */
> +        for (r = ROUNDS - 1; r > 0; r--) {
> +                xKeyAddition(block, block, rp, BC);
> +                xInvMixColumn(block2, block, BC);
> +                xShiftSubst(block, block2, shift, BC, xSi);
> +                rp -= BC;
> +        }
> +
> +        /* End with the extra key addition
> +         */
> +
> +        xKeyAddition(block, block, rp, BC);
> +}
> +
> +/* -------------------------------- */
> +
> +
> +#define MAGIC "c051"   /* magic string for this version of ccrypt */
> +
> +/* private struct, not visible by applications */
> +struct ccrypt_state_s {
> +        int n;          /* number of keys. n=1 for encryption, n>=1 for decryption */
> +        roundkey *rkks; /* array of n keys */
> +        int ak;         /* rkks[ak] is the active key */
> +        int iv;         /* are we reading/writing the IV? */
> +        int bufindex;   /* in bytes */
> +        word32 buf[8];  /* current buffer; partly ciphertext, partly mask */
> +        int flags;      /* flags determining behavior */
> +};
> +typedef struct ccrypt_state_s ccrypt_state_t;
> +
> +
> +int ccrypt_errno;
> +
> +#ifdef DEBUG
> +static void print_state(ccrypt_state_t *st) {
> +        if (st) {
> +                printf("State:\n");
> +                memory_display(st,0,sizeof(st),1,0);
> +                if (st->rkks) {
> +                        printf("Roundkey:\n");
> +                        memory_display(st->rkks,0,sizeof(roundkey),1,0);
> +                }
> +        }
> +}
> +#endif
> +
> +static void ccrypt_state_free(ccrypt_state_t *st) {
> +        if (st) {
> +                free(st->rkks);
> +        }
> +        free(st);
> +}
> +
> +/* ---------------------------------------------------------------------- */
> +/* some private functions dealing with hashes, keys, and nonces */
> +
> +/* hash a keystring into a 256-bit cryptographic random value. */
> +static void hashstring(const char *keystring, const int keylen, word32 hash[8]) {
> +        int i,j;
> +        roundkey rkk;
> +        word32 key[8];      /* rijndael key */
> +
> +        for (i=0; i<8; i++) 
> +                key[i] = hash[i] = 0;
> +  
> +        for ( j=0; j<keylen; ) {
> +                for (i=0; i<32; i++) {
> +                        if ( j<keylen ) {
> +                                ((word8 *)key)[i] ^= keystring[j];
> +                                j++;
> +                        }
> +                }
> +                xrijndaelKeySched(key, 256, 256, &rkk);
> +                xrijndaelEncrypt(hash, &rkk);
> +        }
> +
> +#if 0
> +        do {
> +                for (i=0; i<32; i++) {
> +                        if (*keystring != 0) {
> +                                ((word8 *)key)[i] ^= *keystring;
> +                                keystring++;
> +                        }
> +                }
> +                xrijndaelKeySched(key, 256, 256, &rkk);
> +                xrijndaelEncrypt(hash, &rkk);
> +        } while (*keystring != 0);
> +#endif
> +        
> +}
> +
> +/* return a 256-bit value that is practically unique */
> +static void make_nonce(word32 nonce[8]) {
> +        char acc[512];
> +        static int count=0;
> +  
> +        sprintf(acc, "%s,%d,%d,%d,%d,%d", "barebox", rand(),rand(),rand(),rand(),count++);
> +        hashstring(acc, strlen(acc), nonce); 
> +}
> +
> +/* ---------------------------------------------------------------------- */
> +/* core functions for encryption */
> +
> +int ccencrypt_init(ccrypt_stream_t *b, const char *key, const int keylen) {
> +        word32 keyblock[8];
> +        ccrypt_state_t *st;
> +        roundkey *rkks;
> +
> +        b->state = NULL;
> +  
> +        st = malloc(sizeof(ccrypt_state_t));
> +        if (st == NULL) {
> +                return -1;
> +        }
> +        rkks = malloc(sizeof(roundkey));
> +        if (!rkks) {
> +                free(st);
> +                return -1;
> +        }
> +
> +        st->n = 1;
> +        st->rkks = rkks;
> +        st->ak = 0; /* not used */
> +
> +        /* generate the roundkey */
> +        hashstring(key, keylen, keyblock);
> +        xrijndaelKeySched(keyblock, 256, 256, &st->rkks[0]);
> +  
> +        /* make a nonce */
> +        make_nonce(st->buf);
> +
> +        /* mark the nonce with a "magic number". */
> +        strncpy((char *)st->buf, MAGIC, 4);
> +
> +        /* encrypt the nonce with the given key */
> +        xrijndaelEncrypt(st->buf, &st->rkks[0]);
> +
> +        /* IV is now contained in st->buf. Initialize rest of the state. */
> +        st->iv = 1;
> +        st->bufindex = 0; /* initially use bufsize to count iv bytes output */
> +
> +#ifdef DEBUG
> +        print_state(st);
> +#endif
> +        b->state = (void *)st;
> +        return 0;
> +}
> +
> +EXPORT_SYMBOL(ccencrypt_init);
> +
> +int ccencrypt(ccrypt_stream_t *b) {
> +        ccrypt_state_t *st = (ccrypt_state_t *)b->state;
> +        word32 lbuf[8];
> +        char *cbuf = (char *)st->buf;
> +        int i;
> +        char c, cc;
> +
> +        while (1) {
> +                /* handle the typical case efficiently, one block at a time */
> +
> +                if (st->iv == 0 && st->bufindex == 32) {
> +                        while (b->avail_in >= 32 && b->avail_out >= 32) {
> +
> +                                /* block-encrypt buffer */
> +                                xrijndaelEncrypt(st->buf, &st->rkks[0]);
> +	
> +                                /* read input to local buffer for word alignment */
> +                                memcpy(lbuf, b->next_in, 32);
> +                                b->next_in += 32;
> +                                b->avail_in -= 32;
> +	
> +                                /* compute ciphertext */
> +                                for (i=0; i<8; i++) {
> +                                        st->buf[i] ^= lbuf[i];
> +                                }
> +
> +                                /* write output */
> +                                memcpy(b->next_out, st->buf, 32);
> +                                b->next_out += 32;
> +                                b->avail_out -= 32;
> +                        }
> +                }
> +    
> +                /* handle the general case systematically, one byte at a time */
> +
> +                if (b->avail_out == 0) {
> +                        break;
> +                } 
> +
> +                else if (st->iv) {  /* write IV byte */
> +                        *b->next_out = cbuf[st->bufindex];
> +                        b->next_out++;
> +                        b->avail_out--;
> +                        st->bufindex++;
> +                        if (st->bufindex == 32) {
> +                                st->iv = 0;
> +                        }
> +                } 
> +
> +                else if (b->avail_in == 0) {
> +                        break;
> +                }
> +
> +                else {              /* encrypt one byte */
> +                        if (st->bufindex == 32) {
> +                                xrijndaelEncrypt(st->buf, &st->rkks[0]);
> +                                st->bufindex = 0;
> +                        }
> +                        c = *b->next_in;
> +                        b->next_in++;
> +                        b->avail_in--;
> +                        cc = c ^ cbuf[st->bufindex];
> +                        cbuf[st->bufindex] = cc;
> +                        *b->next_out = cc;
> +                        b->next_out++;
> +                        b->avail_out--;
> +                        st->bufindex++;
> +                }
> +        }
> +#ifdef DEBUG
> +        print_state(st);
> +#endif
> +        return 0;
> +}
> +
> +EXPORT_SYMBOL(ccencrypt);
> +
> +int ccencrypt_end(ccrypt_stream_t *b) {
> +        ccrypt_state_free(b->state);
> +        b->state = NULL; /* guard against double free */
> +        return 0;
> +}
> +
> +EXPORT_SYMBOL(ccencrypt_end);
> +
> +/* ---------------------------------------------------------------------- */
> +/* core functions for decryption */
> +
> +int ccdecrypt_init(ccrypt_stream_t *b, const char *key, const int keylen) {
> +        word32 keyblock[8];
> +        ccrypt_state_t *st;
> +        roundkey *rkks;
> +  
> +        b->state = NULL;
> +
> +        st = malloc(sizeof(ccrypt_state_t));
> +        if (st == NULL) {
> +                return -1;
> +        }
> +        rkks = malloc(sizeof(roundkey));
> +        if (!rkks) {
> +                free(st);
> +                return -1;
> +        }
> +
> +        st->n = 1;
> +        st->rkks = rkks;
> +        st->ak = 0;
> +
> +        /* generate the roundkeys */
> +        hashstring(key, keylen, keyblock);
> +        xrijndaelKeySched(keyblock, 256, 256, &st->rkks[0]);
> +
> +        /* Initialize rest of the state. */
> +        st->iv = 1;
> +        st->bufindex = 0;
> +        st->flags = 0;
> +
> +#ifdef DEBUG
> +        print_state(st);
> +#endif
> +        b->state = (void *)st;
> +        return 0;
> +}
> +
> +EXPORT_SYMBOL(ccdecrypt_init);
> +
> +int ccdecrypt(ccrypt_stream_t *b) {
> +        ccrypt_state_t *st = (ccrypt_state_t *)b->state;
> +        word32 lbuf[8];
> +        char *cbuf = (char *)st->buf;
> +        int i;
> +        char c, cc;
> +  
> +        while (1) {
> +                /* handle the typical case efficiently, one block at a time */
> +
> +                if (st->iv == 0 && st->bufindex == 32) {
> +                        while (b->avail_in >= 32 && b->avail_out >= 32) {
> +	
> +                                /* block-encrypt buffer */
> +                                xrijndaelEncrypt(st->buf, &st->rkks[st->ak]);
> +                                memcpy(lbuf, st->buf, 32);
> +
> +                                /* read input */
> +                                memcpy(st->buf, b->next_in, 32);
> +                                b->next_in += 32;
> +                                b->avail_in -= 32;
> +
> +                                /* compute plaintext */
> +                                for (i=0; i<8; i++) {
> +                                        lbuf[i] ^= st->buf[i];
> +                                }
> +
> +                                /* write output */
> +                                memcpy(b->next_out, lbuf, 32);
> +                                b->next_out += 32;
> +                                b->avail_out -= 32;
> +                        }
> +                }
> +
> +                /* handle the general case systematically, one byte at a time */
> +
> +                if (b->avail_in == 0) {
> +                        break;
> +                }
> +
> +                else if (st->iv) {  /* read IV byte */
> +                        cbuf[st->bufindex] = *b->next_in;
> +                        b->next_in++;
> +                        b->avail_in--;
> +                        st->bufindex++;
> +                        if (st->bufindex == 32) {
> +                                st->iv = 0;
> +                                /* find the first matching key */
> +                                for (i=0; i<st->n; i++) {
> +                                        /* check the "magic number" */
> +                                        memcpy(lbuf, st->buf, 32);
> +                                        xrijndaelDecrypt(lbuf, &st->rkks[i]);
> +                                        if ((st->flags & CCRYPT_MISMATCH) != 0 || strncmp((char *)lbuf, MAGIC, 4) == 0) {
> +                                                /* key matches */
> +                                                break;
> +                                        }
> +                                }
> +                                if (i<st->n) { /* matching key found */
> +                                        st->ak = i;
> +                                } else {       /* not found */
> +                                        /* on error, invalidate the state so that the client cannot
> +                                           call here again. */
> +                                        ccrypt_state_free((ccrypt_state_t *)b->state);
> +                                        b->state = NULL;
> +                                        ccrypt_errno = CCRYPT_EMISMATCH;
> +                                        return -2;
> +                                }
> +                        }
> +                }
> +
> +                else if (b->avail_out == 0) {
> +                        break;
> +                }
> +
> +                else {              /* decrypt one byte */
> +                        if (st->bufindex == 32) {
> +                                xrijndaelEncrypt(st->buf, &st->rkks[st->ak]);
> +                                st->bufindex = 0;
> +                        }
> +                        cc = *b->next_in;
> +                        b->next_in++;
> +                        b->avail_in--;
> +                        c = cc ^ cbuf[st->bufindex];
> +                        cbuf[st->bufindex] = cc;
> +                        *b->next_out = c;
> +                        b->next_out++;
> +                        b->avail_out--;
> +                        st->bufindex++;
> +                }
> +        }
> +#ifdef DEBUG
> +        print_state(st);
> +#endif
> +        return 0;
> +}
> +
> +EXPORT_SYMBOL(ccdecrypt);
> +
> +int ccdecrypt_end(ccrypt_stream_t *b) {
> +        ccrypt_state_t *st;
> +  
> +        if (b->state) {
> +
> +                /* verify that we have read and verified the IV */
> +                st = (ccrypt_state_t *)b->state;
> +                if (st->iv) {
> +                        ccrypt_state_free(b->state);
> +                        b->state = NULL;
> +                        ccrypt_errno = CCRYPT_EFORMAT;
> +                        return -2;
> +                }
> +        }
> +
> +        ccrypt_state_free(b->state);
> +        b->state = NULL;
> +        return 0;
> +}
> +
> +EXPORT_SYMBOL(ccdecrypt_end);
> diff --git a/include/ccryptlib.h b/include/ccryptlib.h
> new file mode 100644
> index 000000000..b2446a232
> --- /dev/null
> +++ b/include/ccryptlib.h
> @@ -0,0 +1,102 @@
> +/* -*- Mode:C; c-file-style:"linux"; -*- */
> +
> +/* Ported to barebox by Gerd Pauli <gp@xxxxxxxxxxxxxxxxxx> 2018 */
> +
> +/* Copyright (C) 2000-2009 Peter Selinger.
> +   This file is part of ccrypt. It is free software and it is covered
> +   by the GNU general public license. See the file COPYING for details. */
> +
> +/* ccryptlib.h: library for encrypting/decrypting a character stream */
> +/* $Id: ccryptlib.h 258 2009-08-26 17:46:10Z selinger $ */
> +
> +#ifndef _CCRYPTLIB_H
> +#define _CCRYPTLIB_H
> +
> +struct ccrypt_stream_s {
> +        char          *next_in;  /* next input byte */
> +        unsigned int  avail_in;  /* number of bytes available at next_in */
> +
> +        char          *next_out; /* next output byte should be put there */
> +        unsigned int  avail_out; /* remaining free space at next_out */
> +
> +        void *state;             /* internal state, not visible by applications */
> +};
> +typedef struct ccrypt_stream_s ccrypt_stream_t;
> +
> +/* 
> +   The application may update next_in and avail_in when avail_in has
> +   dropped to zero. It must update next_out and avail_out when
> +   avail_out has dropped to zero. All other fields are set by the
> +   compression library and must not be updated by the application.
> +*/
> +
> +int ccencrypt_init(ccrypt_stream_t *b, const char *key, const int keylen);
> +int ccencrypt     (ccrypt_stream_t *b);
> +int ccencrypt_end (ccrypt_stream_t *b);
> +
> +int ccdecrypt_init(ccrypt_stream_t *b, const char *key, const int keylen);
> +int ccdecrypt     (ccrypt_stream_t *b);
> +int ccdecrypt_end (ccrypt_stream_t *b);
> +
> +/* The interface for encryption and decryption is the same. The
> +   application must first call the respective init function to
> +   initialize the internal state. Then it calls the encrypt/decrypt
> +   function repeatedly, as follows: next_in and next_out must point to
> +   valid, non-overlapping regions of memory of size at least avail_in
> +   and avail_out, respectively. Avail_out must be non-zero. Avail_in
> +   may be zero to retrieve some pending output when no input is
> +   available, for instance, in an interactive application or at the
> +   end of stream. Otherwise, avail_in should be non-zero. 
> +
> +   The encryption/decryption function will read and process as many
> +   input bytes as possible as long as there is room in the output
> +   buffer. It will update next_in, avail_in, next_out, and avail_out
> +   accordingly. It will always flush as much output as possible.
> +   However, it is possible that some input bytes produce no output,
> +   because some part of the input may be used for internal purposes.
> +   Conversely, it is possible that output is produced without reading
> +   any input. When the encryption/decryption function returns, at
> +   least one of avail_in or avail_out is 0. If avail_out is non-zero
> +   after a call, the application may conclude that no more output is
> +   pending.
> +
> +   Finally, the internal state must be freed by calling the respective
> +   end function. This function will discard any unprocessed input
> +   and/or output, so it should only be called after the application
> +   has retrieved any pending output. Note: the call to the end
> +   function should be checked for errors, because this is the only
> +   place where certain format errors (like a file that is too short)
> +   are detected.
> +
> +   All functions return 0 on success, or -1 on error with errno set,
> +   or -2 on error with ccrypt_errno set. Callers must check for
> +   errors. If an error occurs, the state is invalid and its resources
> +   are freed. It may not be used again. It is then safe, but not
> +   required, to call the corresponding *_end function.
> +
> +   The flags argument to ccdecrypt_init should be 0 by default, or
> +   CCRYPT_MISMATCH if non-matching keys should be ignored. All other
> +   values are undefined and reserved for future use.
> +*/
> +
> +/* ccdecrypt_multi_init this is a variant of ccdecrypt_init that
> +   allows a list of n>=1 keys to be defined. During decryption, the
> +   first matching key is used. This is useful when batch decrypting a
> +   set of files that have non-uniform keys. If flags includes
> +   CCRYPT_MISMATCH, then the first key is always used regardless of
> +   whether it matches or not. */
> +int ccdecrypt_multi_init(ccrypt_stream_t *b, int n, const char **keylist, int flags);
> +
> +/* errors */
> +
> +#define CCRYPT_EFORMAT   1          /* bad file format */
> +#define CCRYPT_EMISMATCH 2          /* key does not match */
> +#define CCRYPT_EBUFFER   3          /* buffer overflow */
> +
> +/* flags */
> +
> +#define CCRYPT_MISMATCH  1          /* ignore non-matching key */
> +
> +extern int ccrypt_errno;
> +
> +#endif /* _CCRYPTLIB_H */
> 


-- 
Regards,
Oleksij

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
barebox mailing list
barebox@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/barebox

[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux