X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/8875ece689377314063458b05e9d5ce3af99ab7f..7c40480318648672af86e03bc72bc45c07194c37:/square.c diff --git a/square.c b/square.c index 5111a3d..7bdcfd8 100644 --- a/square.c +++ b/square.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: square.c,v 1.1 2000/07/15 20:51:58 mdw Exp $ + * $Id: square.c,v 1.3 2004/04/08 01:36:15 mdw Exp $ * * The Square block cipher * @@ -27,14 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: square.c,v $ - * Revision 1.1 2000/07/15 20:51:58 mdw - * New block cipher. - * - */ - /*----- Header files ------------------------------------------------------*/ #include @@ -61,10 +53,6 @@ static const octet rcon[] = SQUARE_RCON; /*----- Main code ---------------------------------------------------------*/ -#define BYTESUB(x, s) \ - (s[U8((x) >> 24)] << 24 | s[U8((x) >> 16)] << 16 | \ - s[U8((x) >> 8)] << 8 | s[U8((x) >> 0)] << 0) - /* --- @square_init@ --- * * * Arguments: @square_ctx *k@ = pointer to context to initialize @@ -148,26 +136,19 @@ void square_init(square_ctx *k, const void *buf, size_t sz) * Use: Low-level block encryption and decryption. */ -#define EROUND(aa, bb, cc, dd, a, b, c, d, w) do { \ - aa = (T[0][U8(a >> 0)] ^ T[1][U8(b >> 0)] ^ \ - T[2][U8(c >> 0)] ^ T[3][U8(d >> 0)]) ^ *w++; \ - bb = (T[0][U8(a >> 8)] ^ T[1][U8(b >> 8)] ^ \ - T[2][U8(c >> 8)] ^ T[3][U8(d >> 8)]) ^ *w++; \ - cc = (T[0][U8(a >> 16)] ^ T[1][U8(b >> 16)] ^ \ - T[2][U8(c >> 16)] ^ T[3][U8(d >> 16)]) ^ *w++; \ - dd = (T[0][U8(a >> 24)] ^ T[1][U8(b >> 24)] ^ \ - T[2][U8(c >> 24)] ^ T[3][U8(d >> 24)]) ^ *w++; \ -} while (0) +#define SUB(s, sh, a, b, c, d) \ + (s[U8((a) >> sh)] << 0 | s[U8((b) >> sh)] << 8 | \ + s[U8((c) >> sh)] << 16 | s[U8((d) >> sh)] << 24) + +#define MIX(t, sh, a, b, c, d) \ + (t[0][U8((a) >> sh)] ^ t[1][U8((b) >> sh)] ^ \ + t[2][U8((c) >> sh)] ^ t[3][U8((d) >> sh)]) -#define DROUND(aa, bb, cc, dd, a, b, c, d, w) do { \ - aa = (TI[0][U8(a >> 0)] ^ TI[1][U8(b >> 0)] ^ \ - TI[2][U8(c >> 0)] ^ TI[3][U8(d >> 0)]) ^ *w++; \ - bb = (TI[0][U8(a >> 8)] ^ TI[1][U8(b >> 8)] ^ \ - TI[2][U8(c >> 8)] ^ TI[3][U8(d >> 8)]) ^ *w++; \ - cc = (TI[0][U8(a >> 16)] ^ TI[1][U8(b >> 16)] ^ \ - TI[2][U8(c >> 16)] ^ TI[3][U8(d >> 16)]) ^ *w++; \ - dd = (TI[0][U8(a >> 24)] ^ TI[1][U8(b >> 24)] ^ \ - TI[2][U8(c >> 24)] ^ TI[3][U8(d >> 24)]) ^ *w++; \ +#define DO(what, t, aa, bb, cc, dd, a, b, c, d, w) do { \ + aa = what(t, 0, a, b, c, d) ^ *w++; \ + bb = what(t, 8, a, b, c, d) ^ *w++; \ + cc = what(t, 16, a, b, c, d) ^ *w++; \ + dd = what(t, 24, a, b, c, d) ^ *w++; \ } while (0) void square_eblk(const square_ctx *k, const uint32 *s, uint32 *dst) @@ -178,22 +159,14 @@ void square_eblk(const square_ctx *k, const uint32 *s, uint32 *dst) a ^= *w++; b ^= *w++; c ^= *w++; d ^= *w++; - EROUND(aa, bb, cc, dd, a, b, c, d, w); - EROUND(a, b, c, d, aa, bb, cc, dd, w); - EROUND(aa, bb, cc, dd, a, b, c, d, w); - EROUND(a, b, c, d, aa, bb, cc, dd, w); - EROUND(aa, bb, cc, dd, a, b, c, d, w); - EROUND(a, b, c, d, aa, bb, cc, dd, w); - EROUND(aa, bb, cc, dd, a, b, c, d, w); - - a = ((S[U8(aa >> 0)] << 0) ^ (S[U8(bb >> 0)] << 8) ^ - (S[U8(cc >> 0)] << 16) ^ (S[U8(dd >> 0)] << 24)) ^ *w++; - b = ((S[U8(aa >> 8)] << 0) ^ (S[U8(bb >> 8)] << 8) ^ - (S[U8(cc >> 8)] << 16) ^ (S[U8(dd >> 8)] << 24)) ^ *w++; - c = ((S[U8(aa >> 16)] << 0) ^ (S[U8(bb >> 16)] << 8) ^ - (S[U8(cc >> 16)] << 16) ^ (S[U8(dd >> 16)] << 24)) ^ *w++; - d = ((S[U8(aa >> 24)] << 0) ^ (S[U8(bb >> 24)] << 8) ^ - (S[U8(cc >> 24)] << 16) ^ (S[U8(dd >> 24)] << 24)) ^ *w++; + DO(MIX, T, aa, bb, cc, dd, a, b, c, d, w); + DO(MIX, T, a, b, c, d, aa, bb, cc, dd, w); + DO(MIX, T, aa, bb, cc, dd, a, b, c, d, w); + DO(MIX, T, a, b, c, d, aa, bb, cc, dd, w); + DO(MIX, T, aa, bb, cc, dd, a, b, c, d, w); + DO(MIX, T, a, b, c, d, aa, bb, cc, dd, w); + DO(MIX, T, aa, bb, cc, dd, a, b, c, d, w); + DO(SUB, S, a, b, c, d, aa, bb, cc, dd, w); dst[0] = a; dst[1] = b; dst[2] = c; dst[3] = d; } @@ -206,22 +179,14 @@ void square_dblk(const square_ctx *k, const uint32 *s, uint32 *dst) a ^= *w++; b ^= *w++; c ^= *w++; d ^= *w++; - DROUND(aa, bb, cc, dd, a, b, c, d, w); - DROUND(a, b, c, d, aa, bb, cc, dd, w); - DROUND(aa, bb, cc, dd, a, b, c, d, w); - DROUND(a, b, c, d, aa, bb, cc, dd, w); - DROUND(aa, bb, cc, dd, a, b, c, d, w); - DROUND(a, b, c, d, aa, bb, cc, dd, w); - DROUND(aa, bb, cc, dd, a, b, c, d, w); - - a = ((SI[U8(aa >> 0)] << 0) ^ (SI[U8(bb >> 0)] << 8) ^ - (SI[U8(cc >> 0)] << 16) ^ (SI[U8(dd >> 0)] << 24)) ^ *w++; - b = ((SI[U8(aa >> 8)] << 0) ^ (SI[U8(bb >> 8)] << 8) ^ - (SI[U8(cc >> 8)] << 16) ^ (SI[U8(dd >> 8)] << 24)) ^ *w++; - c = ((SI[U8(aa >> 16)] << 0) ^ (SI[U8(bb >> 16)] << 8) ^ - (SI[U8(cc >> 16)] << 16) ^ (SI[U8(dd >> 16)] << 24)) ^ *w++; - d = ((SI[U8(aa >> 24)] << 0) ^ (SI[U8(bb >> 24)] << 8) ^ - (SI[U8(cc >> 24)] << 16) ^ (SI[U8(dd >> 24)] << 24)) ^ *w++; + DO(MIX, TI, aa, bb, cc, dd, a, b, c, d, w); + DO(MIX, TI, a, b, c, d, aa, bb, cc, dd, w); + DO(MIX, TI, aa, bb, cc, dd, a, b, c, d, w); + DO(MIX, TI, a, b, c, d, aa, bb, cc, dd, w); + DO(MIX, TI, aa, bb, cc, dd, a, b, c, d, w); + DO(MIX, TI, a, b, c, d, aa, bb, cc, dd, w); + DO(MIX, TI, aa, bb, cc, dd, a, b, c, d, w); + DO(SUB, SI, a, b, c, d, aa, bb, cc, dd, w); dst[0] = a; dst[1] = b; dst[2] = c; dst[3] = d; }