[PATCH v1 1/2] ccryptlib: library for encrypting/decrypting

Gerd Pauli gp at high-consulting.de
Mon Oct 9 00:30:52 PDT 2017


ccryptlib implements a stream cipher based on the block cipher Rijndael,
the candidate for the AES standard.

Ported 2017 to barebox by Gerd Pauli <gp at high-consulting.de>
Copyright (C) 2000-2009 Peter Selinger.

Signed-off-by: Gerd Pauli <gp at high-consulting.de>
---
 include/ccryptlib.h       |  103 +++
 lib/Kconfig               |    3 +
 lib/Makefile              |    1 +
 lib/ccryptlib/Makefile    |    4 +
 lib/ccryptlib/ccryptlib.c |  388 +++++++++
 lib/ccryptlib/rijndael.c  |  255 ++++++
 lib/ccryptlib/rijndael.h  |   67 ++
 lib/ccryptlib/tables.c    | 2133 +++++++++++++++++++++++++++++++++++++++++++++
 lib/ccryptlib/tables.h    |   18 +
 9 files changed, 2972 insertions(+)
 create mode 100644 include/ccryptlib.h
 create mode 100644 lib/ccryptlib/Makefile
 create mode 100644 lib/ccryptlib/ccryptlib.c
 create mode 100644 lib/ccryptlib/rijndael.c
 create mode 100644 lib/ccryptlib/rijndael.h
 create mode 100644 lib/ccryptlib/tables.c
 create mode 100644 lib/ccryptlib/tables.h

diff --git a/include/ccryptlib.h b/include/ccryptlib.h
new file mode 100644
index 0000000..49b8de0
--- /dev/null
+++ b/include/ccryptlib.h
@@ -0,0 +1,103 @@
+/* -*- Mode:C; c-file-style:"linux"; -*- */
+
+/*
+ * ccryptlib.h: library for encrypting/decrypting a character stream
+ * Ported to barebox by Gerd Pauli <gp at high-consulting.de>
+ */
+
+/* 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.
+ */
+
+#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 */
+};
+
+/*
+   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(struct ccrypt_stream_s *b, const char *key);
+int ccencrypt(struct ccrypt_stream_s *b);
+int ccencrypt_end(struct ccrypt_stream_s *b);
+
+int ccdecrypt_init(struct ccrypt_stream_s *b, const char *key, int flags);
+int ccdecrypt(struct ccrypt_stream_s *b);
+int ccdecrypt_end(struct ccrypt_stream_s *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(struct ccrypt_stream_s *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 */
diff --git a/lib/Kconfig b/lib/Kconfig
index 9562b1b..0813d30 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -90,6 +90,9 @@ config RATP
 	  transferring packets over serial links described in RFC916. This implementation
 	  is used for controlling barebox over serial ports.
 
+config CCRYPTLIB
+        bool "ccryptlib"
+
 config ALLOW_PRNG_FALLBACK
 	bool "Allow fallback to PRNG if HWRNG not available."
 	help
diff --git a/lib/Makefile b/lib/Makefile
index 1be1742..d32e102 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -59,3 +59,4 @@ obj-y			+= reed_solomon/
 obj-$(CONFIG_RATP)	+= ratp.o
 obj-y			+= list_sort.o
 obj-y			+= int_sqrt.o
+obj-$(CONFIG_CCRYPTLIB) += ccryptlib/
diff --git a/lib/ccryptlib/Makefile b/lib/ccryptlib/Makefile
new file mode 100644
index 0000000..b9f8b17
--- /dev/null
+++ b/lib/ccryptlib/Makefile
@@ -0,0 +1,4 @@
+obj-$(CONFIG_CCRYPTLIB) += ccryptlib.o
+obj-$(CONFIG_CCRYPTLIB) += rijndael.o
+obj-$(CONFIG_CCRYPTLIB) += tables.o
+
diff --git a/lib/ccryptlib/ccryptlib.c b/lib/ccryptlib/ccryptlib.c
new file mode 100644
index 0000000..4d13739
--- /dev/null
+++ b/lib/ccryptlib/ccryptlib.c
@@ -0,0 +1,388 @@
+/* -*- Mode:C; c-file-style:"linux"; -*- */
+
+/*
+ * ccryptlib.c: library for encrypting/decrypting a character stream
+ * Ported to barebox by Gerd Pauli <gp at high-consulting.de>
+ */
+
+/* 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. */
+
+/* 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. */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>  /* generated by configure */
+#endif
+
+#include <ccryptlib.h>
+#include "rijndael.h"
+#include <common.h>
+#include <malloc.h>
+
+#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. */
+	struct 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 */
+	uint32_t buf[8];  /* current buffer; partly ciphertext, partly mask */
+	int flags;      /* flags determining behavior */
+};
+
+int ccrypt_errno;
+
+static void ccrypt_state_free(struct ccrypt_state_s *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, uint32_t hash[8])
+{
+	int i;
+	struct roundkey rkk;
+	uint32_t key[8];      /* rijndael key */
+
+	for (i = 0; i < 8; i++)
+		key[i] = hash[i] = 0;
+
+	do {
+		for (i = 0; i < 32; i++) {
+			if (*keystring != 0) {
+				((uint8_t *)key)[i] ^= *keystring;
+				keystring++;
+			}
+		}
+		xrijndaelKeySched(key, 256, 256, &rkk);
+		xrijndaelEncrypt(hash, &rkk);
+	} while (*keystring != 0);
+}
+
+/* return a 256-bit value that is practically unique */
+static void make_nonce(uint32_t nonce[8])
+{
+	char acc[512];
+	static int count;
+
+	count = 0;
+	sprintf(acc, "%s,%d,%d,%d,%d,%d", "barebox",
+		rand(),
+		rand(),
+		rand(),
+		rand(), count++);
+	hashstring(acc, nonce);
+}
+
+/* ---------------------------------------------------------------------- */
+/* core functions for encryption */
+
+int ccencrypt_init(struct ccrypt_stream_s *b, const char *key)
+{
+	uint32_t keyblock[8];
+	struct ccrypt_state_s *st;
+	struct roundkey *rkks;
+
+	b->state = NULL;
+
+	st = malloc(sizeof(struct ccrypt_state_s));
+	if (st == NULL)
+		return -1;
+
+	rkks = malloc(sizeof(struct roundkey));
+	if (!rkks) {
+		free(st);
+		return -1;
+	}
+
+	st->n = 1;
+	st->rkks = rkks;
+	st->ak = 0; /* not used */
+
+	/* generate the roundkey */
+	hashstring(key, 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 */
+
+	b->state = (void *)st;
+	return 0;
+}
+EXPORT_SYMBOL_GPL(ccencrypt_init);
+
+int ccencrypt(struct ccrypt_stream_s *b)
+{
+	struct ccrypt_state_s *st = (struct ccrypt_state_s *)b->state;
+	uint32_t 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*/
+				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++;
+		}
+	}
+	return 0;
+}
+EXPORT_SYMBOL_GPL(ccencrypt);
+
+int ccencrypt_end(struct ccrypt_stream_s *b)
+{
+	ccrypt_state_free(b->state);
+	b->state = NULL; /* guard against double free */
+	return 0;
+}
+EXPORT_SYMBOL_GPL(ccencrypt_end);
+
+/* ---------------------------------------------------------------------- */
+/* core functions for decryption */
+
+int ccdecrypt_multi_init(struct ccrypt_stream_s *b, int n,
+			 const char **keylist, int flags)
+{
+	uint32_t keyblock[8];
+	struct ccrypt_state_s *st;
+	struct roundkey *rkks;
+	int i;
+
+	b->state = NULL;
+
+	st = malloc(sizeof(struct ccrypt_state_s));
+	if (st == NULL)
+		return -1;
+
+	rkks = malloc(n * sizeof(struct roundkey));
+	if (!rkks) {
+		free(st);
+		return -1;
+	}
+
+	st->n = n;
+	st->rkks = rkks;
+	st->ak = 0;
+
+	/* generate the roundkeys */
+	for (i = 0; i < n; i++) {
+		hashstring(keylist[i], keyblock);
+		xrijndaelKeySched(keyblock, 256, 256, &st->rkks[i]);
+	}
+
+	/* Initialize rest of the state. */
+	st->iv = 1;
+	st->bufindex = 0;
+	st->flags = flags;
+
+	b->state = (void *)st;
+	return 0;
+}
+
+int ccdecrypt_init(struct ccrypt_stream_s *b, const char *key, int flags)
+{
+	return ccdecrypt_multi_init(b, 1, &key, flags);
+}
+EXPORT_SYMBOL_GPL(ccdecrypt_init);
+
+int ccdecrypt(struct ccrypt_stream_s *b)
+{
+	struct ccrypt_state_s *st = (struct ccrypt_state_s *)b->state;
+	uint32_t 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 */
+					ccrypt_state_free(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++;
+		}
+	}
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(ccdecrypt);
+
+int ccdecrypt_end(struct ccrypt_stream_s *b)
+{
+	struct ccrypt_state_s *st;
+
+	if (b->state) {
+
+		/* verify that we have read and verified the IV */
+		st = (struct ccrypt_state_s *)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_GPL(ccdecrypt_end);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Rijandel Crypt");
diff --git a/lib/ccryptlib/rijndael.c b/lib/ccryptlib/rijndael.c
new file mode 100644
index 0000000..bcebdae
--- /dev/null
+++ b/lib/ccryptlib/rijndael.c
@@ -0,0 +1,255 @@
+/* -*- Mode:C; c-file-style:"linux"; -*- */
+
+/*
+ * rijndael.c - optimized version of the Rijndeal cipher
+ * Ported to barebox by Gerd Pauli <gp at high-consulting.de>
+ */
+
+/* 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. */
+
+/* derived from original source: rijndael-alg-ref.c   v2.0   August '99
+ * Reference ANSI C code for NIST competition
+ * authors: Paulo Barreto
+ *          Vincent Rijmen
+ */
+
+#include "rijndael.h"
+
+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(uint32_t res[MAXBC], uint32_t a[MAXBC],
+				uint32_t 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(uint32_t res[MAXBC], uint32_t a[MAXBC],
+			       int shift[4], int BC, uint8_t box[256])
+{
+	int i, j;
+	int s;
+	uint8_t (*a8)[4] = (uint8_t (*)[4]) a;
+	uint8_t (*res8)[4] = (uint8_t (*)[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(uint32_t res[MAXBC], uint32_t a[MAXBC],
+			   uint32_t rk[MAXBC], int BC)
+{
+	int j;
+	uint32_t b;
+	uint8_t (*a8)[4] = (uint8_t (*)[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(uint32_t res[MAXBC], uint32_t a[MAXBC], int BC)
+{
+	int j;
+	uint32_t b;
+	uint8_t (*a8)[4] = (uint8_t (*)[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;
+	}
+}
+
+int xrijndaelKeySched(uint32_t key[], int keyBits, int blockBits,
+		      struct 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;
+	uint8_t (*k8)[4] = (uint8_t (*)[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) {
+		/* 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 struct 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;
+}
+
+/* Encryption of one block. */
+
+void xrijndaelEncrypt(uint32_t block[], struct roundkey *rkk)
+{
+	uint32_t block2[MAXBC];		/* hold intermediate result */
+	int r;
+
+	int *shift = rkk->shift[0];
+	int BC = rkk->BC;
+	int ROUNDS = rkk->ROUNDS;
+	uint32_t *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(uint32_t block[], struct roundkey *rkk)
+{
+	uint32_t block2[MAXBC];		/* hold intermediate result */
+	int r;
+
+	int *shift = rkk->shift[1];
+	int BC = rkk->BC;
+	int ROUNDS = rkk->ROUNDS;
+	uint32_t *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);
+}
diff --git a/lib/ccryptlib/rijndael.h b/lib/ccryptlib/rijndael.h
new file mode 100644
index 0000000..e468e06
--- /dev/null
+++ b/lib/ccryptlib/rijndael.h
@@ -0,0 +1,67 @@
+/* -*- Mode:C; c-file-style:"linux"; -*- */
+
+/*
+ * rijndael.h
+ * Ported to barebox by Gerd Pauli <gp at high-consulting.de>
+ */
+
+/* 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. */
+
+/* derived from original source: rijndael-alg-ref.h   v2.0   August '99
+ * Reference ANSI C code for NIST competition
+ * authors: Paulo Barreto
+ *          Vincent Rijmen
+ */
+
+#ifndef __RIJNDAEL_H
+#define __RIJNDAEL_H
+
+# ifndef __RIJNDAEL_WORD
+# define __RIJNDAEL_WORD
+#include <linux/types.h>
+# endif				/* __RIJNDAEL_WORD */
+
+/* a type to hold 32 bits accessible as 1 integer or 4 bytes */
+union uint8_tx4_u {
+	uint8_t w8[4];
+	uint32_t w32;
+};
+
+#include "tables.h"
+
+#define MAXBC		(256/32)
+#define MAXKC		(256/32)
+#define MAXROUNDS	14
+#define MAXRK           ((MAXROUNDS+1)*MAXBC)
+
+struct roundkey {
+	int BC;
+	int KC;
+	int ROUNDS;
+	int shift[2][4];
+	uint32_t rk[MAXRK];
+};
+
+/* keys and blocks are externally treated as uint32_t arrays, to
+   make sure they are aligned on 4-byte boundaries on architectures
+   that require it. */
+
+/* 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(uint32_t key[], int keyBits, int blockBits,
+		      struct roundkey *rkk);
+
+/* 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. */
+
+void xrijndaelEncrypt(uint32_t block[], struct roundkey *rkk);
+void xrijndaelDecrypt(uint32_t block[], struct roundkey *rkk);
+
+#endif				/* __RIJNDAEL_H */
diff --git a/lib/ccryptlib/tables.c b/lib/ccryptlib/tables.c
new file mode 100644
index 0000000..1fdfd09
--- /dev/null
+++ b/lib/ccryptlib/tables.c
@@ -0,0 +1,2133 @@
+/* -*- Mode:C; c-file-style:"linux"; -*- */
+
+/*
+ * tables.c
+ * Ported to barebox by Gerd Pauli <gp at high-consulting.de>
+ */
+
+/* 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. */
+
+#include "rijndael.h"
+
+union uint8_tx4_u 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} },
+	},
+};
+
+union uint8_tx4_u 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,
+};
+
+uint8_t 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,
+};
+
+uint8_t 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,
+};
+
diff --git a/lib/ccryptlib/tables.h b/lib/ccryptlib/tables.h
new file mode 100644
index 0000000..9eadf2b
--- /dev/null
+++ b/lib/ccryptlib/tables.h
@@ -0,0 +1,18 @@
+/* -*- Mode:C; c-file-style:"linux"; -*- */
+
+/*
+ * tables.h
+ * Ported to barebox by Gerd Pauli <gp at high-consulting.de>
+ */
+
+
+/* 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. */
+
+extern union uint8_tx4_u M0[4][256];
+extern union uint8_tx4_u M1[4][256];
+extern int xrcon[30];
+extern uint8_t xS[256];
+extern uint8_t xSi[256];
+
-- 
1.9.1




More information about the barebox mailing list