From: Oleksij Rempel <linux@rempel-privat.de>
To: Gerd Pauli <gp@high-consulting.de>, barebox@lists.infradead.org
Subject: Re: [PATCH v1] Crypt and decrypt files using password in keystore.
Date: Sun, 22 Apr 2018 10:27:11 +0200 [thread overview]
Message-ID: <51213c28-0443-3ba7-d161-d79dfaa3acdb@rempel-privat.de> (raw)
In-Reply-To: <20180420080114.9148-1-gp@high-consulting.de>
[-- Attachment #1.1.1: Type: text/plain, Size: 108291 bytes --]
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@high-consulting.de>
> ---
> 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@high-consulting.de */
>
> +/* 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@high-consulting.de>
* 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@high-consulting.de> 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@high-consulting.de> 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 #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
[-- Attachment #2: Type: text/plain, Size: 149 bytes --]
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2018-04-22 8:27 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-20 8:01 Gerd Pauli
2018-04-22 8:27 ` Oleksij Rempel [this message]
2018-04-23 8:13 ` Sascha Hauer
2018-04-23 8:33 ` Oleksij Rempel
2018-04-23 8:39 ` Sascha Hauer
2018-04-23 12:52 ` Gerd Pauli
2018-04-25 8:23 ` Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51213c28-0443-3ba7-d161-d79dfaa3acdb@rempel-privat.de \
--to=linux@rempel-privat.de \
--cc=barebox@lists.infradead.org \
--cc=gp@high-consulting.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox