In aes_core.c, Te4 is an array of u8. When its members are to be
shifted, those members need to be cast to u32 explicitly. This is
necessary especially in 8/16-bit embedded environments such as SDCC
(http://sdcc.sourceforge.net/). 

My patch: 

Index: aes_core.c
===================================================================
RCS file: /v/openssl/cvs/openssl/crypto/aes/aes_core.c,v
retrieving revision 1.10
diff -u -r1.10 aes_core.c
 --- aes_core.c 25 Jan 2007 20:47:00 -0000      1.10
+++ aes_core.c  13 Jan 2011 14:27:14 -0000
@@ -1229,10 +1229,10 @@
                while (1) {
                        temp  = rk[3];
                        rk[4] = rk[0] ^
 -                              (Te4[(temp >> 16) & 0xff] << 24) ^
 -                              (Te4[(temp >>  8) & 0xff] << 16) ^
 -                              (Te4[(temp      ) & 0xff] << 8) ^
 -                              (Te4[(temp >> 24)       ]) ^
+                               ((u32)Te4[(temp >> 16) & 0xff] << 24) ^
+                               ((u32)Te4[(temp >>  8) & 0xff] << 16) ^
+                               ((u32)Te4[(temp      ) & 0xff] << 8) ^
+                               ((u32)Te4[(temp >> 24)       ]) ^
                                rcon[i];
                        rk[5] = rk[1] ^ rk[4];
                        rk[6] = rk[2] ^ rk[5];
@@ -1249,10 +1249,10 @@
                while (1) {
                        temp = rk[ 5];
                        rk[ 6] = rk[ 0] ^
 -                              (Te4[(temp >> 16) & 0xff] << 24) ^
 -                              (Te4[(temp >>  8) & 0xff] << 16) ^
 -                              (Te4[(temp      ) & 0xff] << 8) ^
 -                              (Te4[(temp >> 24)       ]) ^
+                               ((u32)Te4[(temp >> 16) & 0xff] << 24) ^
+                               ((u32)Te4[(temp >>  8) & 0xff] << 16) ^
+                               ((u32)Te4[(temp      ) & 0xff] << 8) ^
+                               ((u32)Te4[(temp >> 24)       ]) ^
                                rcon[i];
                        rk[ 7] = rk[ 1] ^ rk[ 6];
                        rk[ 8] = rk[ 2] ^ rk[ 7];
@@ -1271,10 +1271,10 @@
                while (1) {
                        temp = rk[ 7];
                        rk[ 8] = rk[ 0] ^
 -                              (Te4[(temp >> 16) & 0xff] << 24) ^
 -                              (Te4[(temp >>  8) & 0xff] << 16) ^
 -                              (Te4[(temp      ) & 0xff] << 8) ^
 -                              (Te4[(temp >> 24)       ]) ^
+                               ((u32)Te4[(temp >> 16) & 0xff] << 24) ^
+                               ((u32)Te4[(temp >>  8) & 0xff] << 16) ^
+                               ((u32)Te4[(temp      ) & 0xff] << 8) ^
+                               ((u32)Te4[(temp >> 24)       ]) ^
                                rcon[i];
                        rk[ 9] = rk[ 1] ^ rk[ 8];
                        rk[10] = rk[ 2] ^ rk[ 9];
@@ -1284,10 +1284,10 @@
                        }
                        temp = rk[11];
                        rk[12] = rk[ 4] ^
 -                              (Te4[(temp >> 24)       ] << 24) ^
 -                              (Te4[(temp >> 16) & 0xff] << 16) ^
 -                              (Te4[(temp >>  8) & 0xff] << 8) ^
 -                              (Te4[(temp      ) & 0xff]);
+                               ((u32)Te4[(temp >> 24)       ] << 24) ^
+                               ((u32)Te4[(temp >> 16) & 0xff] << 16) ^
+                               ((u32)Te4[(temp >>  8) & 0xff] << 8) ^
+                               ((u32)Te4[(temp      ) & 0xff]);
                        rk[13] = rk[ 5] ^ rk[12];
                        rk[14] = rk[ 6] ^ rk[13];
                        rk[15] = rk[ 7] ^ rk[14]; 


 ------------------------------------------------------------------------
                                                From Beijing, China

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [email protected]
Automated List Manager                           [email protected]

Reply via email to