Annotation of embedaddon/ipsec-tools/src/racoon/missing/crypto/rijndael/rijndael-alg-fst.c, revision 1.1
1.1 ! misho 1: /* $NetBSD: rijndael-alg-fst.c,v 1.4 2006/09/09 16:22:36 manu Exp $ */
! 2:
! 3: /* $KAME: rijndael-alg-fst.c,v 1.1.1.1 2001/08/08 09:56:23 sakane Exp $ */
! 4:
! 5: /*
! 6: * rijndael-alg-fst.c v2.3 April '2000
! 7: *
! 8: * Optimised ANSI C code
! 9: *
! 10: * authors: v1.0: Antoon Bosselaers
! 11: * v2.0: Vincent Rijmen
! 12: * v2.3: Paulo Barreto
! 13: *
! 14: * This code is placed in the public domain.
! 15: */
! 16:
! 17: #include "config.h"
! 18:
! 19: #include <sys/cdefs.h>
! 20: #include <sys/types.h>
! 21: #ifdef _KERNEL
! 22: #include <sys/systm.h>
! 23: #else
! 24: #include <string.h>
! 25: #endif
! 26: #include <crypto/rijndael/rijndael-alg-fst.h>
! 27: #include <crypto/rijndael/rijndael_local.h>
! 28:
! 29: #include <crypto/rijndael/boxes-fst.dat>
! 30:
! 31: #include <err.h>
! 32: #define bcopy(a, b, c) memcpy((b), (a), (c))
! 33: #define bzero(a, b) memset((a), 0, (b))
! 34: #define panic(a) err(1, (a))
! 35:
! 36: int rijndaelKeySched(word8 k[MAXKC][4], word8 W[MAXROUNDS+1][4][4], int ROUNDS) {
! 37: /* Calculate the necessary round keys
! 38: * The number of calculations depends on keyBits and blockBits
! 39: */
! 40: int j, r, t, rconpointer = 0;
! 41: union {
! 42: word8 x8[MAXKC][4];
! 43: word32 x32[MAXKC];
! 44: } xtk;
! 45: #define tk xtk.x8
! 46: int KC = ROUNDS - 6;
! 47:
! 48: for (j = KC-1; j >= 0; j--) {
! 49: *((word32*)tk[j]) = *((word32*)k[j]);
! 50: }
! 51: r = 0;
! 52: t = 0;
! 53: /* copy values into round key array */
! 54: for (j = 0; (j < KC) && (r < ROUNDS + 1); ) {
! 55: for (; (j < KC) && (t < 4); j++, t++) {
! 56: *((word32*)W[r][t]) = *((word32*)tk[j]);
! 57: }
! 58: if (t == 4) {
! 59: r++;
! 60: t = 0;
! 61: }
! 62: }
! 63:
! 64: while (r < ROUNDS + 1) { /* while not enough round key material calculated */
! 65: /* calculate new values */
! 66: tk[0][0] ^= S[tk[KC-1][1]];
! 67: tk[0][1] ^= S[tk[KC-1][2]];
! 68: tk[0][2] ^= S[tk[KC-1][3]];
! 69: tk[0][3] ^= S[tk[KC-1][0]];
! 70: tk[0][0] ^= rcon[rconpointer++];
! 71:
! 72: if (KC != 8) {
! 73: for (j = 1; j < KC; j++) {
! 74: *((word32*)tk[j]) ^= *((word32*)tk[j-1]);
! 75: }
! 76: } else {
! 77: for (j = 1; j < KC/2; j++) {
! 78: *((word32*)tk[j]) ^= *((word32*)tk[j-1]);
! 79: }
! 80: tk[KC/2][0] ^= S[tk[KC/2 - 1][0]];
! 81: tk[KC/2][1] ^= S[tk[KC/2 - 1][1]];
! 82: tk[KC/2][2] ^= S[tk[KC/2 - 1][2]];
! 83: tk[KC/2][3] ^= S[tk[KC/2 - 1][3]];
! 84: for (j = KC/2 + 1; j < KC; j++) {
! 85: *((word32*)tk[j]) ^= *((word32*)tk[j-1]);
! 86: }
! 87: }
! 88: /* copy values into round key array */
! 89: for (j = 0; (j < KC) && (r < ROUNDS + 1); ) {
! 90: for (; (j < KC) && (t < 4); j++, t++) {
! 91: *((word32*)W[r][t]) = *((word32*)tk[j]);
! 92: }
! 93: if (t == 4) {
! 94: r++;
! 95: t = 0;
! 96: }
! 97: }
! 98: }
! 99: return 0;
! 100: #undef tk
! 101: }
! 102:
! 103: int rijndaelKeyEncToDec(word8 W[MAXROUNDS+1][4][4], int ROUNDS) {
! 104: int r;
! 105: word8 *w;
! 106:
! 107: for (r = 1; r < ROUNDS; r++) {
! 108: w = W[r][0];
! 109: *((word32*)w) =
! 110: *((const word32*)U1[w[0]])
! 111: ^ *((const word32*)U2[w[1]])
! 112: ^ *((const word32*)U3[w[2]])
! 113: ^ *((const word32*)U4[w[3]]);
! 114:
! 115: w = W[r][1];
! 116: *((word32*)w) =
! 117: *((const word32*)U1[w[0]])
! 118: ^ *((const word32*)U2[w[1]])
! 119: ^ *((const word32*)U3[w[2]])
! 120: ^ *((const word32*)U4[w[3]]);
! 121:
! 122: w = W[r][2];
! 123: *((word32*)w) =
! 124: *((const word32*)U1[w[0]])
! 125: ^ *((const word32*)U2[w[1]])
! 126: ^ *((const word32*)U3[w[2]])
! 127: ^ *((const word32*)U4[w[3]]);
! 128:
! 129: w = W[r][3];
! 130: *((word32*)w) =
! 131: *((const word32*)U1[w[0]])
! 132: ^ *((const word32*)U2[w[1]])
! 133: ^ *((const word32*)U3[w[2]])
! 134: ^ *((const word32*)U4[w[3]]);
! 135: }
! 136: return 0;
! 137: }
! 138:
! 139: /**
! 140: * Encrypt a single block.
! 141: */
! 142: int rijndaelEncrypt(word8 in[16], word8 out[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) {
! 143: int r;
! 144: union {
! 145: word8 x8[16];
! 146: word32 x32[4];
! 147: } xa, xb;
! 148: #define a xa.x8
! 149: #define b xb.x8
! 150: union {
! 151: word8 x8[4][4];
! 152: word32 x32[4];
! 153: } xtemp;
! 154: #define temp xtemp.x8
! 155:
! 156: memcpy(a, in, sizeof a);
! 157:
! 158: *((word32*)temp[0]) = *((word32*)(a )) ^ *((word32*)rk[0][0]);
! 159: *((word32*)temp[1]) = *((word32*)(a+ 4)) ^ *((word32*)rk[0][1]);
! 160: *((word32*)temp[2]) = *((word32*)(a+ 8)) ^ *((word32*)rk[0][2]);
! 161: *((word32*)temp[3]) = *((word32*)(a+12)) ^ *((word32*)rk[0][3]);
! 162: *((word32*)(b )) = *((const word32*)T1[temp[0][0]])
! 163: ^ *((const word32*)T2[temp[1][1]])
! 164: ^ *((const word32*)T3[temp[2][2]])
! 165: ^ *((const word32*)T4[temp[3][3]]);
! 166: *((word32*)(b + 4)) = *((const word32*)T1[temp[1][0]])
! 167: ^ *((const word32*)T2[temp[2][1]])
! 168: ^ *((const word32*)T3[temp[3][2]])
! 169: ^ *((const word32*)T4[temp[0][3]]);
! 170: *((word32*)(b + 8)) = *((const word32*)T1[temp[2][0]])
! 171: ^ *((const word32*)T2[temp[3][1]])
! 172: ^ *((const word32*)T3[temp[0][2]])
! 173: ^ *((const word32*)T4[temp[1][3]]);
! 174: *((word32*)(b +12)) = *((const word32*)T1[temp[3][0]])
! 175: ^ *((const word32*)T2[temp[0][1]])
! 176: ^ *((const word32*)T3[temp[1][2]])
! 177: ^ *((const word32*)T4[temp[2][3]]);
! 178: for (r = 1; r < ROUNDS-1; r++) {
! 179: *((word32*)temp[0]) = *((word32*)(b )) ^ *((word32*)rk[r][0]);
! 180: *((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[r][1]);
! 181: *((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[r][2]);
! 182: *((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[r][3]);
! 183:
! 184: *((word32*)(b )) = *((const word32*)T1[temp[0][0]])
! 185: ^ *((const word32*)T2[temp[1][1]])
! 186: ^ *((const word32*)T3[temp[2][2]])
! 187: ^ *((const word32*)T4[temp[3][3]]);
! 188: *((word32*)(b + 4)) = *((const word32*)T1[temp[1][0]])
! 189: ^ *((const word32*)T2[temp[2][1]])
! 190: ^ *((const word32*)T3[temp[3][2]])
! 191: ^ *((const word32*)T4[temp[0][3]]);
! 192: *((word32*)(b + 8)) = *((const word32*)T1[temp[2][0]])
! 193: ^ *((const word32*)T2[temp[3][1]])
! 194: ^ *((const word32*)T3[temp[0][2]])
! 195: ^ *((const word32*)T4[temp[1][3]]);
! 196: *((word32*)(b +12)) = *((const word32*)T1[temp[3][0]])
! 197: ^ *((const word32*)T2[temp[0][1]])
! 198: ^ *((const word32*)T3[temp[1][2]])
! 199: ^ *((const word32*)T4[temp[2][3]]);
! 200: }
! 201: /* last round is special */
! 202: *((word32*)temp[0]) = *((word32*)(b )) ^ *((word32*)rk[ROUNDS-1][0]);
! 203: *((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[ROUNDS-1][1]);
! 204: *((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[ROUNDS-1][2]);
! 205: *((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[ROUNDS-1][3]);
! 206: b[ 0] = T1[temp[0][0]][1];
! 207: b[ 1] = T1[temp[1][1]][1];
! 208: b[ 2] = T1[temp[2][2]][1];
! 209: b[ 3] = T1[temp[3][3]][1];
! 210: b[ 4] = T1[temp[1][0]][1];
! 211: b[ 5] = T1[temp[2][1]][1];
! 212: b[ 6] = T1[temp[3][2]][1];
! 213: b[ 7] = T1[temp[0][3]][1];
! 214: b[ 8] = T1[temp[2][0]][1];
! 215: b[ 9] = T1[temp[3][1]][1];
! 216: b[10] = T1[temp[0][2]][1];
! 217: b[11] = T1[temp[1][3]][1];
! 218: b[12] = T1[temp[3][0]][1];
! 219: b[13] = T1[temp[0][1]][1];
! 220: b[14] = T1[temp[1][2]][1];
! 221: b[15] = T1[temp[2][3]][1];
! 222: *((word32*)(b )) ^= *((word32*)rk[ROUNDS][0]);
! 223: *((word32*)(b+ 4)) ^= *((word32*)rk[ROUNDS][1]);
! 224: *((word32*)(b+ 8)) ^= *((word32*)rk[ROUNDS][2]);
! 225: *((word32*)(b+12)) ^= *((word32*)rk[ROUNDS][3]);
! 226:
! 227: memcpy(out, b, sizeof b /* XXX out */);
! 228:
! 229: return 0;
! 230: #undef a
! 231: #undef b
! 232: #undef temp
! 233: }
! 234:
! 235: #ifdef INTERMEDIATE_VALUE_KAT
! 236: /**
! 237: * Encrypt only a certain number of rounds.
! 238: * Only used in the Intermediate Value Known Answer Test.
! 239: */
! 240: int rijndaelEncryptRound(word8 a[4][4], word8 rk[MAXROUNDS+1][4][4], int ROUNDS, int rounds) {
! 241: int r;
! 242: word8 temp[4][4];
! 243:
! 244: /* make number of rounds sane */
! 245: if (rounds > ROUNDS) {
! 246: rounds = ROUNDS;
! 247: }
! 248:
! 249: *((word32*)a[0]) = *((word32*)a[0]) ^ *((word32*)rk[0][0]);
! 250: *((word32*)a[1]) = *((word32*)a[1]) ^ *((word32*)rk[0][1]);
! 251: *((word32*)a[2]) = *((word32*)a[2]) ^ *((word32*)rk[0][2]);
! 252: *((word32*)a[3]) = *((word32*)a[3]) ^ *((word32*)rk[0][3]);
! 253:
! 254: for (r = 1; (r <= rounds) && (r < ROUNDS); r++) {
! 255: *((word32*)temp[0]) = *((const word32*)T1[a[0][0]])
! 256: ^ *((const word32*)T2[a[1][1]])
! 257: ^ *((const word32*)T3[a[2][2]])
! 258: ^ *((const word32*)T4[a[3][3]]);
! 259: *((word32*)temp[1]) = *((const word32*)T1[a[1][0]])
! 260: ^ *((const word32*)T2[a[2][1]])
! 261: ^ *((const word32*)T3[a[3][2]])
! 262: ^ *((const word32*)T4[a[0][3]]);
! 263: *((word32*)temp[2]) = *((const word32*)T1[a[2][0]])
! 264: ^ *((const word32*)T2[a[3][1]])
! 265: ^ *((const word32*)T3[a[0][2]])
! 266: ^ *((const word32*)T4[a[1][3]]);
! 267: *((word32*)temp[3]) = *((const word32*)T1[a[3][0]])
! 268: ^ *((const word32*)T2[a[0][1]])
! 269: ^ *((const word32*)T3[a[1][2]])
! 270: ^ *((const word32*)T4[a[2][3]]);
! 271: *((word32*)a[0]) = *((word32*)temp[0]) ^ *((word32*)rk[r][0]);
! 272: *((word32*)a[1]) = *((word32*)temp[1]) ^ *((word32*)rk[r][1]);
! 273: *((word32*)a[2]) = *((word32*)temp[2]) ^ *((word32*)rk[r][2]);
! 274: *((word32*)a[3]) = *((word32*)temp[3]) ^ *((word32*)rk[r][3]);
! 275: }
! 276: if (rounds == ROUNDS) {
! 277: /* last round is special */
! 278: temp[0][0] = T1[a[0][0]][1];
! 279: temp[0][1] = T1[a[1][1]][1];
! 280: temp[0][2] = T1[a[2][2]][1];
! 281: temp[0][3] = T1[a[3][3]][1];
! 282: temp[1][0] = T1[a[1][0]][1];
! 283: temp[1][1] = T1[a[2][1]][1];
! 284: temp[1][2] = T1[a[3][2]][1];
! 285: temp[1][3] = T1[a[0][3]][1];
! 286: temp[2][0] = T1[a[2][0]][1];
! 287: temp[2][1] = T1[a[3][1]][1];
! 288: temp[2][2] = T1[a[0][2]][1];
! 289: temp[2][3] = T1[a[1][3]][1];
! 290: temp[3][0] = T1[a[3][0]][1];
! 291: temp[3][1] = T1[a[0][1]][1];
! 292: temp[3][2] = T1[a[1][2]][1];
! 293: temp[3][3] = T1[a[2][3]][1];
! 294: *((word32*)a[0]) = *((word32*)temp[0]) ^ *((word32*)rk[ROUNDS][0]);
! 295: *((word32*)a[1]) = *((word32*)temp[1]) ^ *((word32*)rk[ROUNDS][1]);
! 296: *((word32*)a[2]) = *((word32*)temp[2]) ^ *((word32*)rk[ROUNDS][2]);
! 297: *((word32*)a[3]) = *((word32*)temp[3]) ^ *((word32*)rk[ROUNDS][3]);
! 298: }
! 299:
! 300: return 0;
! 301: }
! 302: #endif /* INTERMEDIATE_VALUE_KAT */
! 303:
! 304: /**
! 305: * Decrypt a single block.
! 306: */
! 307: int rijndaelDecrypt(word8 in[16], word8 out[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) {
! 308: int r;
! 309: union {
! 310: word8 x8[16];
! 311: word32 x32[4];
! 312: } xa, xb;
! 313: #define a xa.x8
! 314: #define b xb.x8
! 315: union {
! 316: word8 x8[4][4];
! 317: word32 x32[4];
! 318: } xtemp;
! 319: #define temp xtemp.x8
! 320:
! 321: memcpy(a, in, sizeof a);
! 322:
! 323: *((word32*)temp[0]) = *((word32*)(a )) ^ *((word32*)rk[ROUNDS][0]);
! 324: *((word32*)temp[1]) = *((word32*)(a+ 4)) ^ *((word32*)rk[ROUNDS][1]);
! 325: *((word32*)temp[2]) = *((word32*)(a+ 8)) ^ *((word32*)rk[ROUNDS][2]);
! 326: *((word32*)temp[3]) = *((word32*)(a+12)) ^ *((word32*)rk[ROUNDS][3]);
! 327:
! 328: *((word32*)(b )) = *((const word32*)T5[temp[0][0]])
! 329: ^ *((const word32*)T6[temp[3][1]])
! 330: ^ *((const word32*)T7[temp[2][2]])
! 331: ^ *((const word32*)T8[temp[1][3]]);
! 332: *((word32*)(b+ 4)) = *((const word32*)T5[temp[1][0]])
! 333: ^ *((const word32*)T6[temp[0][1]])
! 334: ^ *((const word32*)T7[temp[3][2]])
! 335: ^ *((const word32*)T8[temp[2][3]]);
! 336: *((word32*)(b+ 8)) = *((const word32*)T5[temp[2][0]])
! 337: ^ *((const word32*)T6[temp[1][1]])
! 338: ^ *((const word32*)T7[temp[0][2]])
! 339: ^ *((const word32*)T8[temp[3][3]]);
! 340: *((word32*)(b+12)) = *((const word32*)T5[temp[3][0]])
! 341: ^ *((const word32*)T6[temp[2][1]])
! 342: ^ *((const word32*)T7[temp[1][2]])
! 343: ^ *((const word32*)T8[temp[0][3]]);
! 344: for (r = ROUNDS-1; r > 1; r--) {
! 345: *((word32*)temp[0]) = *((word32*)(b )) ^ *((word32*)rk[r][0]);
! 346: *((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[r][1]);
! 347: *((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[r][2]);
! 348: *((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[r][3]);
! 349: *((word32*)(b )) = *((const word32*)T5[temp[0][0]])
! 350: ^ *((const word32*)T6[temp[3][1]])
! 351: ^ *((const word32*)T7[temp[2][2]])
! 352: ^ *((const word32*)T8[temp[1][3]]);
! 353: *((word32*)(b+ 4)) = *((const word32*)T5[temp[1][0]])
! 354: ^ *((const word32*)T6[temp[0][1]])
! 355: ^ *((const word32*)T7[temp[3][2]])
! 356: ^ *((const word32*)T8[temp[2][3]]);
! 357: *((word32*)(b+ 8)) = *((const word32*)T5[temp[2][0]])
! 358: ^ *((const word32*)T6[temp[1][1]])
! 359: ^ *((const word32*)T7[temp[0][2]])
! 360: ^ *((const word32*)T8[temp[3][3]]);
! 361: *((word32*)(b+12)) = *((const word32*)T5[temp[3][0]])
! 362: ^ *((const word32*)T6[temp[2][1]])
! 363: ^ *((const word32*)T7[temp[1][2]])
! 364: ^ *((const word32*)T8[temp[0][3]]);
! 365: }
! 366: /* last round is special */
! 367: *((word32*)temp[0]) = *((word32*)(b )) ^ *((word32*)rk[1][0]);
! 368: *((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[1][1]);
! 369: *((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[1][2]);
! 370: *((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[1][3]);
! 371: b[ 0] = S5[temp[0][0]];
! 372: b[ 1] = S5[temp[3][1]];
! 373: b[ 2] = S5[temp[2][2]];
! 374: b[ 3] = S5[temp[1][3]];
! 375: b[ 4] = S5[temp[1][0]];
! 376: b[ 5] = S5[temp[0][1]];
! 377: b[ 6] = S5[temp[3][2]];
! 378: b[ 7] = S5[temp[2][3]];
! 379: b[ 8] = S5[temp[2][0]];
! 380: b[ 9] = S5[temp[1][1]];
! 381: b[10] = S5[temp[0][2]];
! 382: b[11] = S5[temp[3][3]];
! 383: b[12] = S5[temp[3][0]];
! 384: b[13] = S5[temp[2][1]];
! 385: b[14] = S5[temp[1][2]];
! 386: b[15] = S5[temp[0][3]];
! 387: *((word32*)(b )) ^= *((word32*)rk[0][0]);
! 388: *((word32*)(b+ 4)) ^= *((word32*)rk[0][1]);
! 389: *((word32*)(b+ 8)) ^= *((word32*)rk[0][2]);
! 390: *((word32*)(b+12)) ^= *((word32*)rk[0][3]);
! 391:
! 392: memcpy(out, b, sizeof b /* XXX out */);
! 393:
! 394: return 0;
! 395: #undef a
! 396: #undef b
! 397: #undef temp
! 398: }
! 399:
! 400:
! 401: #ifdef INTERMEDIATE_VALUE_KAT
! 402: /**
! 403: * Decrypt only a certain number of rounds.
! 404: * Only used in the Intermediate Value Known Answer Test.
! 405: * Operations rearranged such that the intermediate values
! 406: * of decryption correspond with the intermediate values
! 407: * of encryption.
! 408: */
! 409: int rijndaelDecryptRound(word8 a[4][4], word8 rk[MAXROUNDS+1][4][4], int ROUNDS, int rounds) {
! 410: int r, i;
! 411: word8 temp[4], shift;
! 412:
! 413: /* make number of rounds sane */
! 414: if (rounds > ROUNDS) {
! 415: rounds = ROUNDS;
! 416: }
! 417: /* first round is special: */
! 418: *(word32 *)a[0] ^= *(word32 *)rk[ROUNDS][0];
! 419: *(word32 *)a[1] ^= *(word32 *)rk[ROUNDS][1];
! 420: *(word32 *)a[2] ^= *(word32 *)rk[ROUNDS][2];
! 421: *(word32 *)a[3] ^= *(word32 *)rk[ROUNDS][3];
! 422: for (i = 0; i < 4; i++) {
! 423: a[i][0] = Si[a[i][0]];
! 424: a[i][1] = Si[a[i][1]];
! 425: a[i][2] = Si[a[i][2]];
! 426: a[i][3] = Si[a[i][3]];
! 427: }
! 428: for (i = 1; i < 4; i++) {
! 429: shift = (4 - i) & 3;
! 430: temp[0] = a[(0 + shift) & 3][i];
! 431: temp[1] = a[(1 + shift) & 3][i];
! 432: temp[2] = a[(2 + shift) & 3][i];
! 433: temp[3] = a[(3 + shift) & 3][i];
! 434: a[0][i] = temp[0];
! 435: a[1][i] = temp[1];
! 436: a[2][i] = temp[2];
! 437: a[3][i] = temp[3];
! 438: }
! 439: /* ROUNDS-1 ordinary rounds */
! 440: for (r = ROUNDS-1; r > rounds; r--) {
! 441: *(word32 *)a[0] ^= *(word32 *)rk[r][0];
! 442: *(word32 *)a[1] ^= *(word32 *)rk[r][1];
! 443: *(word32 *)a[2] ^= *(word32 *)rk[r][2];
! 444: *(word32 *)a[3] ^= *(word32 *)rk[r][3];
! 445:
! 446: *((word32*)a[0]) =
! 447: *((const word32*)U1[a[0][0]])
! 448: ^ *((const word32*)U2[a[0][1]])
! 449: ^ *((const word32*)U3[a[0][2]])
! 450: ^ *((const word32*)U4[a[0][3]]);
! 451:
! 452: *((word32*)a[1]) =
! 453: *((const word32*)U1[a[1][0]])
! 454: ^ *((const word32*)U2[a[1][1]])
! 455: ^ *((const word32*)U3[a[1][2]])
! 456: ^ *((const word32*)U4[a[1][3]]);
! 457:
! 458: *((word32*)a[2]) =
! 459: *((const word32*)U1[a[2][0]])
! 460: ^ *((const word32*)U2[a[2][1]])
! 461: ^ *((const word32*)U3[a[2][2]])
! 462: ^ *((const word32*)U4[a[2][3]]);
! 463:
! 464: *((word32*)a[3]) =
! 465: *((const word32*)U1[a[3][0]])
! 466: ^ *((const word32*)U2[a[3][1]])
! 467: ^ *((const word32*)U3[a[3][2]])
! 468: ^ *((const word32*)U4[a[3][3]]);
! 469: for (i = 0; i < 4; i++) {
! 470: a[i][0] = Si[a[i][0]];
! 471: a[i][1] = Si[a[i][1]];
! 472: a[i][2] = Si[a[i][2]];
! 473: a[i][3] = Si[a[i][3]];
! 474: }
! 475: for (i = 1; i < 4; i++) {
! 476: shift = (4 - i) & 3;
! 477: temp[0] = a[(0 + shift) & 3][i];
! 478: temp[1] = a[(1 + shift) & 3][i];
! 479: temp[2] = a[(2 + shift) & 3][i];
! 480: temp[3] = a[(3 + shift) & 3][i];
! 481: a[0][i] = temp[0];
! 482: a[1][i] = temp[1];
! 483: a[2][i] = temp[2];
! 484: a[3][i] = temp[3];
! 485: }
! 486: }
! 487: if (rounds == 0) {
! 488: /* End with the extra key addition */
! 489: *(word32 *)a[0] ^= *(word32 *)rk[0][0];
! 490: *(word32 *)a[1] ^= *(word32 *)rk[0][1];
! 491: *(word32 *)a[2] ^= *(word32 *)rk[0][2];
! 492: *(word32 *)a[3] ^= *(word32 *)rk[0][3];
! 493: }
! 494: return 0;
! 495: }
! 496: #endif /* INTERMEDIATE_VALUE_KAT */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>