From b14a07687bb780f42364a9471a84a9d7bb8f4303 Mon Sep 17 00:00:00 2001 From: mdw Date: Mon, 7 May 2001 15:44:02 +0000 Subject: [PATCH] Simplify implementation. --- square.c | 88 +++++++++++++++++++++++----------------------------------------- 1 file changed, 32 insertions(+), 56 deletions(-) diff --git a/square.c b/square.c index 5111a3d..c0b2d76 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.2 2001/05/07 15:44:02 mdw Exp $ * * The Square block cipher * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: square.c,v $ + * Revision 1.2 2001/05/07 15:44:02 mdw + * Simplify implementation. + * * Revision 1.1 2000/07/15 20:51:58 mdw * New block cipher. * @@ -61,10 +64,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 +147,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 +170,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 +190,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; } -- 2.11.0