Index: trunk/Makefile.in
===================================================================
--- trunk/Makefile.in	(revision 229)
+++ trunk/Makefile.in	(revision 230)
@@ -1700,5 +1700,5 @@
 slib.o: $(srcsrc)/slib.c Makefile config_xor.h $(srcinc)/slib.h $(srcinc)/sh_calls.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h $(srcinc)/sh_string.h $(srcinc)/sh_mem.h 
 rijndael-alg-fst.o: $(srcsrc)/rijndael-alg-fst.c Makefile config_xor.h $(srcinc)/rijndael-alg-fst.h $(srcinc)/rijndael-boxes-fst.h 
-rijndael-api-fst.o: $(srcsrc)/rijndael-api-fst.c Makefile config_xor.h $(srcinc)/rijndael-alg-fst.h $(srcinc)/rijndael-api-fst.h 
+rijndael-api-fst.o: $(srcsrc)/rijndael-api-fst.c Makefile config_xor.h $(srcinc)/rijndael-api-fst.h 
 zAVLTree.o: $(srcsrc)/zAVLTree.c Makefile $(srcinc)/zAVLTree.h 
 sh_socket.o: $(srcsrc)/sh_socket.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_socket.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_calls.h $(srcinc)/sh_utils.h $(srcinc)/zAVLTree.h $(srcinc)/sh_html.h $(srcinc)/sh_tools.h 
Index: trunk/depend.dep
===================================================================
--- trunk/depend.dep	(revision 229)
+++ trunk/depend.dep	(revision 230)
@@ -48,5 +48,5 @@
 slib.o: $(srcsrc)/slib.c Makefile config_xor.h $(srcinc)/slib.h $(srcinc)/sh_calls.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h $(srcinc)/sh_string.h $(srcinc)/sh_mem.h 
 rijndael-alg-fst.o: $(srcsrc)/rijndael-alg-fst.c Makefile config_xor.h $(srcinc)/rijndael-alg-fst.h $(srcinc)/rijndael-boxes-fst.h 
-rijndael-api-fst.o: $(srcsrc)/rijndael-api-fst.c Makefile config_xor.h $(srcinc)/rijndael-alg-fst.h $(srcinc)/rijndael-api-fst.h 
+rijndael-api-fst.o: $(srcsrc)/rijndael-api-fst.c Makefile config_xor.h $(srcinc)/rijndael-api-fst.h 
 zAVLTree.o: $(srcsrc)/zAVLTree.c Makefile $(srcinc)/zAVLTree.h 
 sh_socket.o: $(srcsrc)/sh_socket.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_socket.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_calls.h $(srcinc)/sh_utils.h $(srcinc)/zAVLTree.h $(srcinc)/sh_html.h $(srcinc)/sh_tools.h 
Index: trunk/depend.sum
===================================================================
--- trunk/depend.sum	(revision 229)
+++ trunk/depend.sum	(revision 230)
@@ -1,1 +1,1 @@
-2676345821
+3298738653
Index: trunk/docs/Changelog
===================================================================
--- trunk/docs/Changelog	(revision 229)
+++ trunk/docs/Changelog	(revision 230)
@@ -1,3 +1,5 @@
 2.5.5:
+	* fix some warnings from gcc 4.4 (strict aliasing)
+	* fix minor memory leak in process check
 	* t-test1.c: change function names because of clashes with an 
 	  AIX system header file
Index: trunk/include/rijndael-alg-fst.h
===================================================================
--- trunk/include/rijndael-alg-fst.h	(revision 229)
+++ trunk/include/rijndael-alg-fst.h	(revision 230)
@@ -34,4 +34,9 @@
 int rijndaelDecrypt(word8 a[16], word8 b[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS);
 
+#ifdef INTERMEDIATE_VALUE_KAT
+int rijndaelEncryptRound(word8 a[4][4], word8 rk[MAXROUNDS+1][4][4], int ROUNDS, int rounds);
+int rijndaelDecryptRound(word8 a[4][4], word8 rk[MAXROUNDS+1][4][4], int ROUNDS, int rounds);
+#endif
+
 /* SH_ENCRYPT */
 #endif
Index: trunk/include/rijndael-api-fst.h
===================================================================
--- trunk/include/rijndael-api-fst.h	(revision 229)
+++ trunk/include/rijndael-api-fst.h	(revision 230)
@@ -96,4 +96,8 @@
 int blockDecrypt(cipherInstance *cipher, keyInstance *key,
 		 RIJ_BYTE *input, int inputLen, RIJ_BYTE *outBuffer);
+#ifdef INTERMEDIATE_VALUE_KAT
+int cipherUpdateRounds(cipherInstance *cipher, keyInstance *key,
+		       RIJ_BYTE *input, int inputLen, RIJ_BYTE *outBuffer, int rounds);
+#endif
 
 /* SH_ENCRYPT */
Index: trunk/src/rijndael-alg-fst.c
===================================================================
--- trunk/src/rijndael-alg-fst.c	(revision 229)
+++ trunk/src/rijndael-alg-fst.c	(revision 230)
@@ -125,70 +125,74 @@
 int rijndaelEncrypt(word8 a[16], word8 b[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) {
 	int r;
-	word8 temp[4][4];
-
-    *((word32*)temp[0]) = *((word32*)(a   )) ^ *((word32*)rk[0][0]);
-    *((word32*)temp[1]) = *((word32*)(a+ 4)) ^ *((word32*)rk[0][1]);
-    *((word32*)temp[2]) = *((word32*)(a+ 8)) ^ *((word32*)rk[0][2]);
-    *((word32*)temp[3]) = *((word32*)(a+12)) ^ *((word32*)rk[0][3]);
-    *((word32*)(b    )) = *((word32*)T1[temp[0][0]])
-						^ *((word32*)T2[temp[1][1]])
-						^ *((word32*)T3[temp[2][2]]) 
-						^ *((word32*)T4[temp[3][3]]);
-    *((word32*)(b + 4)) = *((word32*)T1[temp[1][0]])
-						^ *((word32*)T2[temp[2][1]])
-						^ *((word32*)T3[temp[3][2]]) 
-						^ *((word32*)T4[temp[0][3]]);
-    *((word32*)(b + 8)) = *((word32*)T1[temp[2][0]])
-						^ *((word32*)T2[temp[3][1]])
-						^ *((word32*)T3[temp[0][2]]) 
-						^ *((word32*)T4[temp[1][3]]);
-    *((word32*)(b +12)) = *((word32*)T1[temp[3][0]])
-						^ *((word32*)T2[temp[0][1]])
-						^ *((word32*)T3[temp[1][2]]) 
-						^ *((word32*)T4[temp[2][3]]);
+	union {
+	  word32 tem4[4];
+	  word8  temp[4][4];
+	} tmpU;
+	tmpU.tem4[0] = tmpU.tem4[1] = tmpU.tem4[2] = tmpU.tem4[3] = 0;
+
+    tmpU.tem4[0] = *((word32*)(a   )) ^ *((word32*)rk[0][0]);
+    tmpU.tem4[1] = *((word32*)(a+ 4)) ^ *((word32*)rk[0][1]);
+    tmpU.tem4[2] = *((word32*)(a+ 8)) ^ *((word32*)rk[0][2]);
+    tmpU.tem4[3] = *((word32*)(a+12)) ^ *((word32*)rk[0][3]);
+    *((word32*)(b    )) = *((word32*)T1[tmpU.temp[0][0]])
+						^ *((word32*)T2[tmpU.temp[1][1]])
+						^ *((word32*)T3[tmpU.temp[2][2]]) 
+						^ *((word32*)T4[tmpU.temp[3][3]]);
+    *((word32*)(b + 4)) = *((word32*)T1[tmpU.temp[1][0]])
+						^ *((word32*)T2[tmpU.temp[2][1]])
+						^ *((word32*)T3[tmpU.temp[3][2]]) 
+						^ *((word32*)T4[tmpU.temp[0][3]]);
+    *((word32*)(b + 8)) = *((word32*)T1[tmpU.temp[2][0]])
+						^ *((word32*)T2[tmpU.temp[3][1]])
+						^ *((word32*)T3[tmpU.temp[0][2]]) 
+						^ *((word32*)T4[tmpU.temp[1][3]]);
+    *((word32*)(b +12)) = *((word32*)T1[tmpU.temp[3][0]])
+						^ *((word32*)T2[tmpU.temp[0][1]])
+						^ *((word32*)T3[tmpU.temp[1][2]]) 
+						^ *((word32*)T4[tmpU.temp[2][3]]);
 	for (r = 1; r < ROUNDS-1; r++) {
-		*((word32*)temp[0]) = *((word32*)(b   )) ^ *((word32*)rk[r][0]);
-		*((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[r][1]);
-		*((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[r][2]);
-		*((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[r][3]);
-
-		*((word32*)(b    )) = *((word32*)T1[temp[0][0]])
-							^ *((word32*)T2[temp[1][1]])
-							^ *((word32*)T3[temp[2][2]]) 
-							^ *((word32*)T4[temp[3][3]]);
-		*((word32*)(b + 4)) = *((word32*)T1[temp[1][0]])
-							^ *((word32*)T2[temp[2][1]])
-							^ *((word32*)T3[temp[3][2]]) 
-							^ *((word32*)T4[temp[0][3]]);
-		*((word32*)(b + 8)) = *((word32*)T1[temp[2][0]])
-							^ *((word32*)T2[temp[3][1]])
-							^ *((word32*)T3[temp[0][2]]) 
-							^ *((word32*)T4[temp[1][3]]);
-		*((word32*)(b +12)) = *((word32*)T1[temp[3][0]])
-							^ *((word32*)T2[temp[0][1]])
-							^ *((word32*)T3[temp[1][2]]) 
-							^ *((word32*)T4[temp[2][3]]);
+		tmpU.tem4[0] = *((word32*)(b   )) ^ *((word32*)rk[r][0]);
+		tmpU.tem4[1] = *((word32*)(b+ 4)) ^ *((word32*)rk[r][1]);
+		tmpU.tem4[2] = *((word32*)(b+ 8)) ^ *((word32*)rk[r][2]);
+		tmpU.tem4[3] = *((word32*)(b+12)) ^ *((word32*)rk[r][3]);
+
+		*((word32*)(b    )) = *((word32*)T1[tmpU.temp[0][0]])
+							^ *((word32*)T2[tmpU.temp[1][1]])
+							^ *((word32*)T3[tmpU.temp[2][2]]) 
+							^ *((word32*)T4[tmpU.temp[3][3]]);
+		*((word32*)(b + 4)) = *((word32*)T1[tmpU.temp[1][0]])
+							^ *((word32*)T2[tmpU.temp[2][1]])
+							^ *((word32*)T3[tmpU.temp[3][2]]) 
+							^ *((word32*)T4[tmpU.temp[0][3]]);
+		*((word32*)(b + 8)) = *((word32*)T1[tmpU.temp[2][0]])
+							^ *((word32*)T2[tmpU.temp[3][1]])
+							^ *((word32*)T3[tmpU.temp[0][2]]) 
+							^ *((word32*)T4[tmpU.temp[1][3]]);
+		*((word32*)(b +12)) = *((word32*)T1[tmpU.temp[3][0]])
+							^ *((word32*)T2[tmpU.temp[0][1]])
+							^ *((word32*)T3[tmpU.temp[1][2]]) 
+							^ *((word32*)T4[tmpU.temp[2][3]]);
 	}
 	/* last round is special */   
-	*((word32*)temp[0]) = *((word32*)(b   )) ^ *((word32*)rk[ROUNDS-1][0]);
-	*((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[ROUNDS-1][1]);
-	*((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[ROUNDS-1][2]);
-	*((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[ROUNDS-1][3]);
-	b[ 0] = T1[temp[0][0]][1];
-	b[ 1] = T1[temp[1][1]][1];
-	b[ 2] = T1[temp[2][2]][1];
-	b[ 3] = T1[temp[3][3]][1];
-	b[ 4] = T1[temp[1][0]][1];
-	b[ 5] = T1[temp[2][1]][1];
-	b[ 6] = T1[temp[3][2]][1];
-	b[ 7] = T1[temp[0][3]][1];
-	b[ 8] = T1[temp[2][0]][1];
-	b[ 9] = T1[temp[3][1]][1];
-	b[10] = T1[temp[0][2]][1];
-	b[11] = T1[temp[1][3]][1];
-	b[12] = T1[temp[3][0]][1];
-	b[13] = T1[temp[0][1]][1];
-	b[14] = T1[temp[1][2]][1];
-	b[15] = T1[temp[2][3]][1];
+	tmpU.tem4[0] = *((word32*)(b   )) ^ *((word32*)rk[ROUNDS-1][0]);
+	tmpU.tem4[1] = *((word32*)(b+ 4)) ^ *((word32*)rk[ROUNDS-1][1]);
+	tmpU.tem4[2] = *((word32*)(b+ 8)) ^ *((word32*)rk[ROUNDS-1][2]);
+	tmpU.tem4[3] = *((word32*)(b+12)) ^ *((word32*)rk[ROUNDS-1][3]);
+	b[ 0] = T1[tmpU.temp[0][0]][1];
+	b[ 1] = T1[tmpU.temp[1][1]][1];
+	b[ 2] = T1[tmpU.temp[2][2]][1];
+	b[ 3] = T1[tmpU.temp[3][3]][1];
+	b[ 4] = T1[tmpU.temp[1][0]][1];
+	b[ 5] = T1[tmpU.temp[2][1]][1];
+	b[ 6] = T1[tmpU.temp[3][2]][1];
+	b[ 7] = T1[tmpU.temp[0][3]][1];
+	b[ 8] = T1[tmpU.temp[2][0]][1];
+	b[ 9] = T1[tmpU.temp[3][1]][1];
+	b[10] = T1[tmpU.temp[0][2]][1];
+	b[11] = T1[tmpU.temp[1][3]][1];
+	b[12] = T1[tmpU.temp[3][0]][1];
+	b[13] = T1[tmpU.temp[0][1]][1];
+	b[14] = T1[tmpU.temp[1][2]][1];
+	b[15] = T1[tmpU.temp[2][3]][1];
 	*((word32*)(b   )) ^= *((word32*)rk[ROUNDS][0]);
 	*((word32*)(b+ 4)) ^= *((word32*)rk[ROUNDS][1]);
@@ -204,70 +208,74 @@
 int rijndaelDecrypt(word8 a[16], word8 b[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) {
 	int r;
-	word8 temp[4][4];
+	union {
+	  word32 tem4[4];
+	  word8  temp[4][4];
+	} tmpU;
+	tmpU.tem4[0] = tmpU.tem4[1] = tmpU.tem4[2] = tmpU.tem4[3] = 0;
 	
-    *((word32*)temp[0]) = *((word32*)(a   )) ^ *((word32*)rk[ROUNDS][0]);
-    *((word32*)temp[1]) = *((word32*)(a+ 4)) ^ *((word32*)rk[ROUNDS][1]);
-    *((word32*)temp[2]) = *((word32*)(a+ 8)) ^ *((word32*)rk[ROUNDS][2]);
-    *((word32*)temp[3]) = *((word32*)(a+12)) ^ *((word32*)rk[ROUNDS][3]);
-
-    *((word32*)(b   )) = *((word32*)T5[temp[0][0]])
-           ^ *((word32*)T6[temp[3][1]])
-           ^ *((word32*)T7[temp[2][2]]) 
-           ^ *((word32*)T8[temp[1][3]]);
-	*((word32*)(b+ 4)) = *((word32*)T5[temp[1][0]])
-           ^ *((word32*)T6[temp[0][1]])
-           ^ *((word32*)T7[temp[3][2]]) 
-           ^ *((word32*)T8[temp[2][3]]);
-	*((word32*)(b+ 8)) = *((word32*)T5[temp[2][0]])
-           ^ *((word32*)T6[temp[1][1]])
-           ^ *((word32*)T7[temp[0][2]]) 
-           ^ *((word32*)T8[temp[3][3]]);
-	*((word32*)(b+12)) = *((word32*)T5[temp[3][0]])
-           ^ *((word32*)T6[temp[2][1]])
-           ^ *((word32*)T7[temp[1][2]]) 
-           ^ *((word32*)T8[temp[0][3]]);
+    tmpU.tem4[0] = *((word32*)(a   )) ^ *((word32*)rk[ROUNDS][0]);
+    tmpU.tem4[1] = *((word32*)(a+ 4)) ^ *((word32*)rk[ROUNDS][1]);
+    tmpU.tem4[2] = *((word32*)(a+ 8)) ^ *((word32*)rk[ROUNDS][2]);
+    tmpU.tem4[3] = *((word32*)(a+12)) ^ *((word32*)rk[ROUNDS][3]);
+
+    *((word32*)(b   )) = *((word32*)T5[tmpU.temp[0][0]])
+           ^ *((word32*)T6[tmpU.temp[3][1]])
+           ^ *((word32*)T7[tmpU.temp[2][2]]) 
+           ^ *((word32*)T8[tmpU.temp[1][3]]);
+	*((word32*)(b+ 4)) = *((word32*)T5[tmpU.temp[1][0]])
+           ^ *((word32*)T6[tmpU.temp[0][1]])
+           ^ *((word32*)T7[tmpU.temp[3][2]]) 
+           ^ *((word32*)T8[tmpU.temp[2][3]]);
+	*((word32*)(b+ 8)) = *((word32*)T5[tmpU.temp[2][0]])
+           ^ *((word32*)T6[tmpU.temp[1][1]])
+           ^ *((word32*)T7[tmpU.temp[0][2]]) 
+           ^ *((word32*)T8[tmpU.temp[3][3]]);
+	*((word32*)(b+12)) = *((word32*)T5[tmpU.temp[3][0]])
+           ^ *((word32*)T6[tmpU.temp[2][1]])
+           ^ *((word32*)T7[tmpU.temp[1][2]]) 
+           ^ *((word32*)T8[tmpU.temp[0][3]]);
 	for (r = ROUNDS-1; r > 1; r--) {
-		*((word32*)temp[0]) = *((word32*)(b   )) ^ *((word32*)rk[r][0]);
-		*((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[r][1]);
-		*((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[r][2]);
-		*((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[r][3]);
-		*((word32*)(b   )) = *((word32*)T5[temp[0][0]])
-           ^ *((word32*)T6[temp[3][1]])
-           ^ *((word32*)T7[temp[2][2]]) 
-           ^ *((word32*)T8[temp[1][3]]);
-		*((word32*)(b+ 4)) = *((word32*)T5[temp[1][0]])
-           ^ *((word32*)T6[temp[0][1]])
-           ^ *((word32*)T7[temp[3][2]]) 
-           ^ *((word32*)T8[temp[2][3]]);
-		*((word32*)(b+ 8)) = *((word32*)T5[temp[2][0]])
-           ^ *((word32*)T6[temp[1][1]])
-           ^ *((word32*)T7[temp[0][2]]) 
-           ^ *((word32*)T8[temp[3][3]]);
-		*((word32*)(b+12)) = *((word32*)T5[temp[3][0]])
-           ^ *((word32*)T6[temp[2][1]])
-           ^ *((word32*)T7[temp[1][2]]) 
-           ^ *((word32*)T8[temp[0][3]]);
+		tmpU.tem4[0] = *((word32*)(b   )) ^ *((word32*)rk[r][0]);
+		tmpU.tem4[1] = *((word32*)(b+ 4)) ^ *((word32*)rk[r][1]);
+		tmpU.tem4[2] = *((word32*)(b+ 8)) ^ *((word32*)rk[r][2]);
+		tmpU.tem4[3] = *((word32*)(b+12)) ^ *((word32*)rk[r][3]);
+		*((word32*)(b   )) = *((word32*)T5[tmpU.temp[0][0]])
+           ^ *((word32*)T6[tmpU.temp[3][1]])
+           ^ *((word32*)T7[tmpU.temp[2][2]]) 
+           ^ *((word32*)T8[tmpU.temp[1][3]]);
+		*((word32*)(b+ 4)) = *((word32*)T5[tmpU.temp[1][0]])
+           ^ *((word32*)T6[tmpU.temp[0][1]])
+           ^ *((word32*)T7[tmpU.temp[3][2]]) 
+           ^ *((word32*)T8[tmpU.temp[2][3]]);
+		*((word32*)(b+ 8)) = *((word32*)T5[tmpU.temp[2][0]])
+           ^ *((word32*)T6[tmpU.temp[1][1]])
+           ^ *((word32*)T7[tmpU.temp[0][2]]) 
+           ^ *((word32*)T8[tmpU.temp[3][3]]);
+		*((word32*)(b+12)) = *((word32*)T5[tmpU.temp[3][0]])
+           ^ *((word32*)T6[tmpU.temp[2][1]])
+           ^ *((word32*)T7[tmpU.temp[1][2]]) 
+           ^ *((word32*)T8[tmpU.temp[0][3]]);
 	}
 	/* last round is special */   
-	*((word32*)temp[0]) = *((word32*)(b   )) ^ *((word32*)rk[1][0]);
-	*((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[1][1]);
-	*((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[1][2]);
-	*((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[1][3]);
-	b[ 0] = S5[temp[0][0]];
-	b[ 1] = S5[temp[3][1]];
-	b[ 2] = S5[temp[2][2]];
-	b[ 3] = S5[temp[1][3]];
-	b[ 4] = S5[temp[1][0]];
-	b[ 5] = S5[temp[0][1]];
-	b[ 6] = S5[temp[3][2]];
-	b[ 7] = S5[temp[2][3]];
-	b[ 8] = S5[temp[2][0]];
-	b[ 9] = S5[temp[1][1]];
-	b[10] = S5[temp[0][2]];
-	b[11] = S5[temp[3][3]];
-	b[12] = S5[temp[3][0]];
-	b[13] = S5[temp[2][1]];
-	b[14] = S5[temp[1][2]];
-	b[15] = S5[temp[0][3]];
+	tmpU.tem4[0] = *((word32*)(b   )) ^ *((word32*)rk[1][0]);
+	tmpU.tem4[1] = *((word32*)(b+ 4)) ^ *((word32*)rk[1][1]);
+	tmpU.tem4[2] = *((word32*)(b+ 8)) ^ *((word32*)rk[1][2]);
+	tmpU.tem4[3] = *((word32*)(b+12)) ^ *((word32*)rk[1][3]);
+	b[ 0] = S5[tmpU.temp[0][0]];
+	b[ 1] = S5[tmpU.temp[3][1]];
+	b[ 2] = S5[tmpU.temp[2][2]];
+	b[ 3] = S5[tmpU.temp[1][3]];
+	b[ 4] = S5[tmpU.temp[1][0]];
+	b[ 5] = S5[tmpU.temp[0][1]];
+	b[ 6] = S5[tmpU.temp[3][2]];
+	b[ 7] = S5[tmpU.temp[2][3]];
+	b[ 8] = S5[tmpU.temp[2][0]];
+	b[ 9] = S5[tmpU.temp[1][1]];
+	b[10] = S5[tmpU.temp[0][2]];
+	b[11] = S5[tmpU.temp[3][3]];
+	b[12] = S5[tmpU.temp[3][0]];
+	b[13] = S5[tmpU.temp[2][1]];
+	b[14] = S5[tmpU.temp[1][2]];
+	b[15] = S5[tmpU.temp[0][3]];
 	*((word32*)(b   )) ^= *((word32*)rk[0][0]);
 	*((word32*)(b+ 4)) ^= *((word32*)rk[0][1]);
@@ -278,3 +286,168 @@
 }
 
+#ifdef INTERMEDIATE_VALUE_KAT
+/**
+ * Encrypt only a certain number of rounds.
+ * Only used in the Intermediate Value Known Answer Test.
+ */
+int rijndaelEncryptRound(word8 a[4][4], word8 rk[MAXROUNDS+1][4][4], int ROUNDS, int rounds) {
+	int r;
+	word8 temp[4][4];
+
+	/* make number of rounds sane */
+	if (rounds > ROUNDS) {
+		rounds = ROUNDS;
+	}
+
+	*((word32*)a[0]) = *((word32*)a[0]) ^ *((word32*)rk[0][0]);
+	*((word32*)a[1]) = *((word32*)a[1]) ^ *((word32*)rk[0][1]);
+	*((word32*)a[2]) = *((word32*)a[2]) ^ *((word32*)rk[0][2]);
+	*((word32*)a[3]) = *((word32*)a[3]) ^ *((word32*)rk[0][3]);
+
+	for (r = 1; (r <= rounds) && (r < ROUNDS); r++) {
+		*((word32*)temp[0]) = *((word32*)T1[a[0][0]])
+           ^ *((word32*)T2[a[1][1]])
+           ^ *((word32*)T3[a[2][2]]) 
+           ^ *((word32*)T4[a[3][3]]);
+		*((word32*)temp[1]) = *((word32*)T1[a[1][0]])
+           ^ *((word32*)T2[a[2][1]])
+           ^ *((word32*)T3[a[3][2]]) 
+           ^ *((word32*)T4[a[0][3]]);
+		*((word32*)temp[2]) = *((word32*)T1[a[2][0]])
+           ^ *((word32*)T2[a[3][1]])
+           ^ *((word32*)T3[a[0][2]]) 
+           ^ *((word32*)T4[a[1][3]]);
+		*((word32*)temp[3]) = *((word32*)T1[a[3][0]])
+           ^ *((word32*)T2[a[0][1]])
+           ^ *((word32*)T3[a[1][2]]) 
+           ^ *((word32*)T4[a[2][3]]);
+		*((word32*)a[0]) = *((word32*)temp[0]) ^ *((word32*)rk[r][0]);
+		*((word32*)a[1]) = *((word32*)temp[1]) ^ *((word32*)rk[r][1]);
+		*((word32*)a[2]) = *((word32*)temp[2]) ^ *((word32*)rk[r][2]);
+		*((word32*)a[3]) = *((word32*)temp[3]) ^ *((word32*)rk[r][3]);
+	}
+	if (rounds == ROUNDS) {
+	   	/* last round is special */   
+	   	temp[0][0] = T1[a[0][0]][1];
+	   	temp[0][1] = T1[a[1][1]][1];
+	   	temp[0][2] = T1[a[2][2]][1]; 
+	   	temp[0][3] = T1[a[3][3]][1];
+	   	temp[1][0] = T1[a[1][0]][1];
+	   	temp[1][1] = T1[a[2][1]][1];
+	   	temp[1][2] = T1[a[3][2]][1]; 
+	   	temp[1][3] = T1[a[0][3]][1];
+	   	temp[2][0] = T1[a[2][0]][1];
+	   	temp[2][1] = T1[a[3][1]][1];
+	   	temp[2][2] = T1[a[0][2]][1]; 
+	   	temp[2][3] = T1[a[1][3]][1];
+	   	temp[3][0] = T1[a[3][0]][1];
+	   	temp[3][1] = T1[a[0][1]][1];
+	   	temp[3][2] = T1[a[1][2]][1]; 
+	   	temp[3][3] = T1[a[2][3]][1];
+		*((word32*)a[0]) = *((word32*)temp[0]) ^ *((word32*)rk[ROUNDS][0]);
+		*((word32*)a[1]) = *((word32*)temp[1]) ^ *((word32*)rk[ROUNDS][1]);
+		*((word32*)a[2]) = *((word32*)temp[2]) ^ *((word32*)rk[ROUNDS][2]);
+		*((word32*)a[3]) = *((word32*)temp[3]) ^ *((word32*)rk[ROUNDS][3]);
+	}
+
+	return 0;
+}   
+#endif /* INTERMEDIATE_VALUE_KAT */
+
+#ifdef INTERMEDIATE_VALUE_KAT
+/**
+ * Decrypt only a certain number of rounds.
+ * Only used in the Intermediate Value Known Answer Test.
+ * Operations rearranged such that the intermediate values
+ * of decryption correspond with the intermediate values
+ * of encryption.
+ */
+int rijndaelDecryptRound(word8 a[4][4], word8 rk[MAXROUNDS+1][4][4], int ROUNDS, int rounds) {
+	int r, i;
+	word8 temp[4], shift;
+
+	/* make number of rounds sane */
+	if (rounds > ROUNDS) {
+		rounds = ROUNDS;
+	}
+    /* first round is special: */
+	*(word32 *)a[0] ^= *(word32 *)rk[ROUNDS][0];
+	*(word32 *)a[1] ^= *(word32 *)rk[ROUNDS][1];
+	*(word32 *)a[2] ^= *(word32 *)rk[ROUNDS][2];
+	*(word32 *)a[3] ^= *(word32 *)rk[ROUNDS][3];
+	for (i = 0; i < 4; i++) {
+		a[i][0] = Si[a[i][0]];
+		a[i][1] = Si[a[i][1]];
+		a[i][2] = Si[a[i][2]];
+		a[i][3] = Si[a[i][3]];
+	}
+	for (i = 1; i < 4; i++) {
+		shift = (4 - i) & 3;
+		temp[0] = a[(0 + shift) & 3][i];
+		temp[1] = a[(1 + shift) & 3][i];
+		temp[2] = a[(2 + shift) & 3][i];
+		temp[3] = a[(3 + shift) & 3][i];
+		a[0][i] = temp[0];
+		a[1][i] = temp[1];
+		a[2][i] = temp[2];
+		a[3][i] = temp[3];
+	}
+	/* ROUNDS-1 ordinary rounds */
+	for (r = ROUNDS-1; r > rounds; r--) {
+		*(word32 *)a[0] ^= *(word32 *)rk[r][0];
+		*(word32 *)a[1] ^= *(word32 *)rk[r][1];
+		*(word32 *)a[2] ^= *(word32 *)rk[r][2];
+		*(word32 *)a[3] ^= *(word32 *)rk[r][3];
+
+		*((word32*)a[0]) =
+			  *((word32*)U1[a[0][0]])
+			^ *((word32*)U2[a[0][1]])
+			^ *((word32*)U3[a[0][2]])
+			^ *((word32*)U4[a[0][3]]);
+
+		*((word32*)a[1]) =
+			  *((word32*)U1[a[1][0]])
+			^ *((word32*)U2[a[1][1]])
+			^ *((word32*)U3[a[1][2]])
+			^ *((word32*)U4[a[1][3]]);
+
+		*((word32*)a[2]) =
+			  *((word32*)U1[a[2][0]])
+			^ *((word32*)U2[a[2][1]])
+			^ *((word32*)U3[a[2][2]])
+			^ *((word32*)U4[a[2][3]]);
+
+		*((word32*)a[3]) =
+			  *((word32*)U1[a[3][0]])
+			^ *((word32*)U2[a[3][1]])
+			^ *((word32*)U3[a[3][2]])
+			^ *((word32*)U4[a[3][3]]);
+		for (i = 0; i < 4; i++) {
+			a[i][0] = Si[a[i][0]];
+			a[i][1] = Si[a[i][1]];
+			a[i][2] = Si[a[i][2]];
+			a[i][3] = Si[a[i][3]];
+		}
+		for (i = 1; i < 4; i++) {
+			shift = (4 - i) & 3;
+			temp[0] = a[(0 + shift) & 3][i];
+			temp[1] = a[(1 + shift) & 3][i];
+			temp[2] = a[(2 + shift) & 3][i];
+			temp[3] = a[(3 + shift) & 3][i];
+			a[0][i] = temp[0];
+			a[1][i] = temp[1];
+			a[2][i] = temp[2];
+			a[3][i] = temp[3];
+		}
+	}
+	if (rounds == 0) {
+		/* End with the extra key addition */	
+		*(word32 *)a[0] ^= *(word32 *)rk[0][0];
+		*(word32 *)a[1] ^= *(word32 *)rk[0][1];
+		*(word32 *)a[2] ^= *(word32 *)rk[0][2];
+		*(word32 *)a[3] ^= *(word32 *)rk[0][3];
+	}    
+	return 0;
+}
+#endif /* INTERMEDIATE_VALUE_KAT */
 #endif
Index: trunk/src/rijndael-api-fst.c
===================================================================
--- trunk/src/rijndael-api-fst.c	(revision 229)
+++ trunk/src/rijndael-api-fst.c	(revision 230)
@@ -23,5 +23,4 @@
 #ifdef SH_ENCRYPT
 
-#include "rijndael-alg-fst.h"
 #include "rijndael-api-fst.h"
 
@@ -124,5 +123,12 @@
 		 RIJ_BYTE *input, int inputLen, RIJ_BYTE *outBuffer) {
   int i, k, numBlocks;
-  word8 block[16], iv[4][4];
+  union {
+    word32 bloc4[4];
+    word8  block[16];
+  } bb;
+  union {
+    word32 i4[4];
+    word8  iv[4][4];
+  } iu;
   
   if (cipher == NULL ||
@@ -151,9 +157,9 @@
      */
 #if STRICT_ALIGN 
-    memcpy(iv, cipher->IV, 16); 
-    ((word32*)block)[0] = ((word32*)iv)[0] ^ ((word32*)input)[0];
-    ((word32*)block)[1] = ((word32*)iv)[1] ^ ((word32*)input)[1];
-    ((word32*)block)[2] = ((word32*)iv)[2] ^ ((word32*)input)[2];
-    ((word32*)block)[3] = ((word32*)iv)[3] ^ ((word32*)input)[3];
+    memcpy(iu.iv, cipher->IV, 16); 
+    bb.bloc4[0] = iu.i4[0] ^ ((word32*)input)[0];
+    bb.bloc4[1] = iu.i4[1] ^ ((word32*)input)[1];
+    bb.bloc4[2] = iu.i4[2] ^ ((word32*)input)[2];
+    bb.bloc4[3] = iu.i4[3] ^ ((word32*)input)[3];
 #else  /* !STRICT_ALIGN */
     ((word32*)block)[0] = ((word32*)cipher->IV)[0] ^ ((word32*)input)[0];
@@ -162,13 +168,13 @@
     ((word32*)block)[3] = ((word32*)cipher->IV)[3] ^ ((word32*)input)[3];
 #endif /* ?STRICT_ALIGN */
-    rijndaelEncrypt(block, outBuffer, key->keySched, key->ROUNDS);
+    rijndaelEncrypt(bb.block, outBuffer, key->keySched, key->ROUNDS);
     input += 16;
     for (i = numBlocks - 1; i > 0; i--) {
-      ((word32*)block)[0] = ((word32*)outBuffer)[0] ^ ((word32*)input)[0];
-      ((word32*)block)[1] = ((word32*)outBuffer)[1] ^ ((word32*)input)[1];
-      ((word32*)block)[2] = ((word32*)outBuffer)[2] ^ ((word32*)input)[2];
-      ((word32*)block)[3] = ((word32*)outBuffer)[3] ^ ((word32*)input)[3];
+      bb.bloc4[0] = ((word32*)outBuffer)[0] ^ ((word32*)input)[0];
+      bb.bloc4[1] = ((word32*)outBuffer)[1] ^ ((word32*)input)[1];
+      bb.bloc4[2] = ((word32*)outBuffer)[2] ^ ((word32*)input)[2];
+      bb.bloc4[3] = ((word32*)outBuffer)[3] ^ ((word32*)input)[3];
       outBuffer += 16;
-      rijndaelEncrypt(block, outBuffer, key->keySched, key->ROUNDS);
+      rijndaelEncrypt(bb.block, outBuffer, key->keySched, key->ROUNDS);
       input += 16;
     }
@@ -177,5 +183,5 @@
   case MODE_CFB1:
 #if STRICT_ALIGN 
-    memcpy(iv, cipher->IV, 16); 
+    memcpy(iu.iv, cipher->IV, 16); 
 #else  /* !STRICT_ALIGN */
     *((word32*)iv[0]) = *((word32*)(cipher->IV   ));
@@ -186,26 +192,26 @@
     for (i = numBlocks; i > 0; i--) {
       for (k = 0; k < 128; k++) {
-	*((word32*) block    ) = *((word32*)iv[0]);
-	*((word32*)(block+ 4)) = *((word32*)iv[1]);
-	*((word32*)(block+ 8)) = *((word32*)iv[2]);
-	*((word32*)(block+12)) = *((word32*)iv[3]);
-	rijndaelEncrypt(block, block, key->keySched, key->ROUNDS);
-	outBuffer[k/8] ^= (block[0] & 0x80) >> (k & 7);
-	iv[0][0] = (iv[0][0] << 1) | (iv[0][1] >> 7);
-	iv[0][1] = (iv[0][1] << 1) | (iv[0][2] >> 7);
-	iv[0][2] = (iv[0][2] << 1) | (iv[0][3] >> 7);
-	iv[0][3] = (iv[0][3] << 1) | (iv[1][0] >> 7);
-	iv[1][0] = (iv[1][0] << 1) | (iv[1][1] >> 7);
-	iv[1][1] = (iv[1][1] << 1) | (iv[1][2] >> 7);
-	iv[1][2] = (iv[1][2] << 1) | (iv[1][3] >> 7);
-	iv[1][3] = (iv[1][3] << 1) | (iv[2][0] >> 7);
-	iv[2][0] = (iv[2][0] << 1) | (iv[2][1] >> 7);
-	iv[2][1] = (iv[2][1] << 1) | (iv[2][2] >> 7);
-	iv[2][2] = (iv[2][2] << 1) | (iv[2][3] >> 7);
-	iv[2][3] = (iv[2][3] << 1) | (iv[3][0] >> 7);
-	iv[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7);
-	iv[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7);
-	iv[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7);
-	iv[3][3] = (iv[3][3] << 1) | ((outBuffer[k/8] >> (7-(k&7))) & 1);
+	bb.bloc4[0] = iu.i4[0];
+	bb.bloc4[1] = iu.i4[1];
+	bb.bloc4[2] = iu.i4[2];
+	bb.bloc4[3] = iu.i4[3];
+	rijndaelEncrypt(bb.block, bb.block, key->keySched, key->ROUNDS);
+	outBuffer[k/8] ^= (bb.block[0] & 0x80) >> (k & 7);
+	iu.iv[0][0] = (iu.iv[0][0] << 1) | (iu.iv[0][1] >> 7);
+	iu.iv[0][1] = (iu.iv[0][1] << 1) | (iu.iv[0][2] >> 7);
+	iu.iv[0][2] = (iu.iv[0][2] << 1) | (iu.iv[0][3] >> 7);
+	iu.iv[0][3] = (iu.iv[0][3] << 1) | (iu.iv[1][0] >> 7);
+	iu.iv[1][0] = (iu.iv[1][0] << 1) | (iu.iv[1][1] >> 7);
+	iu.iv[1][1] = (iu.iv[1][1] << 1) | (iu.iv[1][2] >> 7);
+	iu.iv[1][2] = (iu.iv[1][2] << 1) | (iu.iv[1][3] >> 7);
+	iu.iv[1][3] = (iu.iv[1][3] << 1) | (iu.iv[2][0] >> 7);
+	iu.iv[2][0] = (iu.iv[2][0] << 1) | (iu.iv[2][1] >> 7);
+	iu.iv[2][1] = (iu.iv[2][1] << 1) | (iu.iv[2][2] >> 7);
+	iu.iv[2][2] = (iu.iv[2][2] << 1) | (iu.iv[2][3] >> 7);
+	iu.iv[2][3] = (iu.iv[2][3] << 1) | (iu.iv[3][0] >> 7);
+	iu.iv[3][0] = (iu.iv[3][0] << 1) | (iu.iv[3][1] >> 7);
+	iu.iv[3][1] = (iu.iv[3][1] << 1) | (iu.iv[3][2] >> 7);
+	iu.iv[3][2] = (iu.iv[3][2] << 1) | (iu.iv[3][3] >> 7);
+	iu.iv[3][3] = (iu.iv[3][3] << 1) | ((outBuffer[k/8] >> (7-(k&7))) & 1);
       }
     }
@@ -222,5 +228,12 @@
 		 RIJ_BYTE *input, int inputLen, RIJ_BYTE *outBuffer) {
   int i, k, numBlocks;
-  word8 block[16], iv[4][4];
+  union {
+    word32 bloc4[4];
+    word8  block[16];
+  } bb;
+  union {
+    word32 i4[4];
+    word8  iv[4][4];
+  } iu;
   
   if (cipher == NULL ||
@@ -246,20 +259,20 @@
   case MODE_CBC:
 #if STRICT_ALIGN 
-    memcpy(iv, cipher->IV, 16); 
-#else
-    *((word32*)iv[0]) = *((word32*)(cipher->IV   ));
-    *((word32*)iv[1]) = *((word32*)(cipher->IV+ 4));
-    *((word32*)iv[2]) = *((word32*)(cipher->IV+ 8));
-    *((word32*)iv[3]) = *((word32*)(cipher->IV+12));
+    memcpy(iu.iv, cipher->IV, 16); 
+#else
+    *((word32*)iu.i4[0]) = *((word32*)(cipher->IV   ));
+    *((word32*)iu.i4[1]) = *((word32*)(cipher->IV+ 4));
+    *((word32*)iu.i4[2]) = *((word32*)(cipher->IV+ 8));
+    *((word32*)iu.i4[3]) = *((word32*)(cipher->IV+12));
 #endif
     for (i = numBlocks; i > 0; i--) {
-      rijndaelDecrypt(input, block, key->keySched, key->ROUNDS);
-      ((word32*)block)[0] ^= *((word32*)iv[0]);
-      ((word32*)block)[1] ^= *((word32*)iv[1]);
-      ((word32*)block)[2] ^= *((word32*)iv[2]);
-      ((word32*)block)[3] ^= *((word32*)iv[3]);
+      rijndaelDecrypt(input, bb.block, key->keySched, key->ROUNDS);
+      bb.bloc4[0] ^= iu.i4[0];
+      bb.bloc4[1] ^= iu.i4[1];
+      bb.bloc4[2] ^= iu.i4[2];
+      bb.bloc4[3] ^= iu.i4[3];
 #if STRICT_ALIGN
-      memcpy(iv, input, 16);
-      memcpy(outBuffer, block, 16);
+      memcpy(iu.iv, input, 16);
+      memcpy(outBuffer, bb.block, 16);
 #else
       *((word32*)iv[0]) = ((word32*)input)[0]; ((word32*)outBuffer)[0] = ((word32*)block)[0];
@@ -275,5 +288,5 @@
   case MODE_CFB1:
 #if STRICT_ALIGN 
-    memcpy(iv, cipher->IV, 16); 
+    memcpy(iu.iv, cipher->IV, 16); 
 #else
     *((word32*)iv[0]) = *((word32*)(cipher->IV));
@@ -284,26 +297,26 @@
     for (i = numBlocks; i > 0; i--) {
       for (k = 0; k < 128; k++) {
-	*((word32*) block    ) = *((word32*)iv[0]);
-	*((word32*)(block+ 4)) = *((word32*)iv[1]);
-	*((word32*)(block+ 8)) = *((word32*)iv[2]);
-	*((word32*)(block+12)) = *((word32*)iv[3]);
-	rijndaelEncrypt(block, block, key->keySched, key->ROUNDS);
-	iv[0][0] = (iv[0][0] << 1) | (iv[0][1] >> 7);
-	iv[0][1] = (iv[0][1] << 1) | (iv[0][2] >> 7);
-	iv[0][2] = (iv[0][2] << 1) | (iv[0][3] >> 7);
-	iv[0][3] = (iv[0][3] << 1) | (iv[1][0] >> 7);
-	iv[1][0] = (iv[1][0] << 1) | (iv[1][1] >> 7);
-	iv[1][1] = (iv[1][1] << 1) | (iv[1][2] >> 7);
-	iv[1][2] = (iv[1][2] << 1) | (iv[1][3] >> 7);
-	iv[1][3] = (iv[1][3] << 1) | (iv[2][0] >> 7);
-	iv[2][0] = (iv[2][0] << 1) | (iv[2][1] >> 7);
-	iv[2][1] = (iv[2][1] << 1) | (iv[2][2] >> 7);
-	iv[2][2] = (iv[2][2] << 1) | (iv[2][3] >> 7);
-	iv[2][3] = (iv[2][3] << 1) | (iv[3][0] >> 7);
-	iv[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7);
-	iv[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7);
-	iv[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7);
-	iv[3][3] = (iv[3][3] << 1) | ((input[k/8] >> (7-(k&7))) & 1);
-	outBuffer[k/8] ^= (block[0] & 0x80) >> (k & 7);
+	bb.bloc4[0] = iu.i4[0];
+	bb.bloc4[1] = iu.i4[1];
+	bb.bloc4[2] = iu.i4[2];
+	bb.bloc4[3] = iu.i4[3];
+	rijndaelEncrypt(bb.block, bb.block, key->keySched, key->ROUNDS);
+	iu.iv[0][0] = (iu.iv[0][0] << 1) | (iu.iv[0][1] >> 7);
+	iu.iv[0][1] = (iu.iv[0][1] << 1) | (iu.iv[0][2] >> 7);
+	iu.iv[0][2] = (iu.iv[0][2] << 1) | (iu.iv[0][3] >> 7);
+	iu.iv[0][3] = (iu.iv[0][3] << 1) | (iu.iv[1][0] >> 7);
+	iu.iv[1][0] = (iu.iv[1][0] << 1) | (iu.iv[1][1] >> 7);
+	iu.iv[1][1] = (iu.iv[1][1] << 1) | (iu.iv[1][2] >> 7);
+	iu.iv[1][2] = (iu.iv[1][2] << 1) | (iu.iv[1][3] >> 7);
+	iu.iv[1][3] = (iu.iv[1][3] << 1) | (iu.iv[2][0] >> 7);
+	iu.iv[2][0] = (iu.iv[2][0] << 1) | (iu.iv[2][1] >> 7);
+	iu.iv[2][1] = (iu.iv[2][1] << 1) | (iu.iv[2][2] >> 7);
+	iu.iv[2][2] = (iu.iv[2][2] << 1) | (iu.iv[2][3] >> 7);
+	iu.iv[2][3] = (iu.iv[2][3] << 1) | (iu.iv[3][0] >> 7);
+	iu.iv[3][0] = (iu.iv[3][0] << 1) | (iu.iv[3][1] >> 7);
+	iu.iv[3][1] = (iu.iv[3][1] << 1) | (iu.iv[3][2] >> 7);
+	iu.iv[3][2] = (iu.iv[3][2] << 1) | (iu.iv[3][3] >> 7);
+	iu.iv[3][3] = (iu.iv[3][3] << 1) | ((input[k/8] >> (7-(k&7))) & 1);
+	outBuffer[k/8] ^= (bb.block[0] & 0x80) >> (k & 7);
       }
     }
@@ -316,4 +329,49 @@
   return 128*numBlocks;
 }
-
+#ifdef INTERMEDIATE_VALUE_KAT
+/**
+ *	cipherUpdateRounds:
+ *
+ *	Encrypts/Decrypts exactly one full block a specified number of rounds.
+ *	Only used in the Intermediate Value Known Answer Test.	
+ *
+ *	Returns:
+ *		TRUE - on success
+ *		BAD_CIPHER_STATE - cipher in bad state (e.g., not initialized)
+ */
+int cipherUpdateRounds(cipherInstance *cipher, keyInstance *key,
+		RIJ_BYTE *input, int inputLen, RIJ_BYTE *outBuffer, int rounds) {
+	int j;
+	word8 block[4][4];
+
+	if (cipher == NULL || key == NULL) {
+		return BAD_CIPHER_STATE;
+	}
+
+	for (j = 3; j >= 0; j--) {
+		/* parse input stream into rectangular array */
+  		*((word32*)block[j]) = *((word32*)(input+4*j));
+	}
+
+	switch (key->direction) {
+	case DIR_ENCRYPT:
+		rijndaelEncryptRound(block, key->keySched, key->ROUNDS, rounds);
+		break;
+		
+	case DIR_DECRYPT:
+		rijndaelDecryptRound(block, key->keySched, key->ROUNDS, rounds);
+		break;
+		
+	default:
+		return BAD_KEY_DIR;
+	} 
+
+	for (j = 3; j >= 0; j--) {
+		/* parse rectangular array into output ciphertext bytes */
+		*((word32*)(outBuffer+4*j)) = *((word32*)block[j]);
+	}
+	
+	return TRUE;
+}
+#endif /* INTERMEDIATE_VALUE_KAT */
 #endif
Index: trunk/src/sh_processcheck.c
===================================================================
--- trunk/src/sh_processcheck.c	(revision 229)
+++ trunk/src/sh_processcheck.c	(revision 230)
@@ -430,4 +430,5 @@
 			      MSG_PCK_MISS,
 			      tmp);
+	      SH_FREE(tmp);
 	      SH_MUTEX_UNLOCK(mutex_thread_nolog);
 	    }
@@ -451,6 +452,6 @@
 				  MSG_PCK_MISS, 
 				  tmp);
+		  SH_FREE(tmp);
 		  SH_MUTEX_UNLOCK(mutex_thread_nolog);
-		  SH_FREE(tmp);
 		}
 	    }
Index: trunk/src/sh_unix.c
===================================================================
--- trunk/src/sh_unix.c	(revision 229)
+++ trunk/src/sh_unix.c	(revision 230)
@@ -2318,5 +2318,8 @@
 	  if (fail == 0) 
 	    { 
-	      time_now = ntohl(* (long *) net_time) - UNIXEPOCH;
+	      unsigned long   ltmp;
+	      UINT32          ttmp;
+	      memcpy(&ttmp, net_time, sizeof(UINT32)); ltmp = ttmp;
+	      time_now = ntohl(ltmp) - UNIXEPOCH;
 	      /* fprintf(stderr, "TIME IS %ld\n", time_now); */
 	      if (failerr == 1) {
Index: trunk/src/trustfile.c
===================================================================
--- trunk/src/trustfile.c	(revision 229)
+++ trunk/src/trustfile.c	(revision 230)
@@ -135,4 +135,5 @@
 #define SL_EINTERNAL -1028     /* Internal error.                      */
 #define SL_EBADFILE  -1030     /* File access error. Check errno.      */
+#define SL_EMEM      -1032     /* Out of memory.                       */
 #define SL_EBADNAME  -1040     /* Invalid name.                        */
 #define SL_ESTAT     -1041     /* stat of file failed. Check errno.    */
Index: trunk/test/testhash.sh
===================================================================
--- trunk/test/testhash.sh	(revision 229)
+++ trunk/test/testhash.sh	(revision 230)
@@ -37,5 +37,5 @@
 	fi
 	#
-	${TOP_SRCDIR}/configure --quiet $TRUST --prefix=$PW_DIR --localstatedir=$PW_DIR --with-config-file=$RCFILE --with-log-file=$LOGFILE --with-pid-file=$PW_DIR/.samhain_lock --with-data-file=$PW_DIR/.samhain_file --enable-debug
+	${TOP_SRCDIR}/configure --quiet $TRUST --prefix=$PW_DIR --localstatedir=$PW_DIR --with-config-file=$RCFILE --with-log-file=$LOGFILE --with-pid-file=$PW_DIR/.samhain_lock --with-data-file=$PW_DIR/.samhain_file --enable-debug 
 	#
 	fail=0
