Changeset 230 for trunk/src/rijndael-api-fst.c
- Timestamp:
- May 1, 2009, 12:30:57 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/rijndael-api-fst.c
r1 r230 23 23 #ifdef SH_ENCRYPT 24 24 25 #include "rijndael-alg-fst.h"26 25 #include "rijndael-api-fst.h" 27 26 … … 124 123 RIJ_BYTE *input, int inputLen, RIJ_BYTE *outBuffer) { 125 124 int i, k, numBlocks; 126 word8 block[16], iv[4][4]; 125 union { 126 word32 bloc4[4]; 127 word8 block[16]; 128 } bb; 129 union { 130 word32 i4[4]; 131 word8 iv[4][4]; 132 } iu; 127 133 128 134 if (cipher == NULL || … … 151 157 */ 152 158 #if STRICT_ALIGN 153 memcpy(i v, cipher->IV, 16);154 ((word32*)block)[0] = ((word32*)iv)[0] ^ ((word32*)input)[0];155 ((word32*)block)[1] = ((word32*)iv)[1] ^ ((word32*)input)[1];156 ((word32*)block)[2] = ((word32*)iv)[2] ^ ((word32*)input)[2];157 ((word32*)block)[3] = ((word32*)iv)[3] ^ ((word32*)input)[3];159 memcpy(iu.iv, cipher->IV, 16); 160 bb.bloc4[0] = iu.i4[0] ^ ((word32*)input)[0]; 161 bb.bloc4[1] = iu.i4[1] ^ ((word32*)input)[1]; 162 bb.bloc4[2] = iu.i4[2] ^ ((word32*)input)[2]; 163 bb.bloc4[3] = iu.i4[3] ^ ((word32*)input)[3]; 158 164 #else /* !STRICT_ALIGN */ 159 165 ((word32*)block)[0] = ((word32*)cipher->IV)[0] ^ ((word32*)input)[0]; … … 162 168 ((word32*)block)[3] = ((word32*)cipher->IV)[3] ^ ((word32*)input)[3]; 163 169 #endif /* ?STRICT_ALIGN */ 164 rijndaelEncrypt(b lock, outBuffer, key->keySched, key->ROUNDS);170 rijndaelEncrypt(bb.block, outBuffer, key->keySched, key->ROUNDS); 165 171 input += 16; 166 172 for (i = numBlocks - 1; i > 0; i--) { 167 ((word32*)block)[0] = ((word32*)outBuffer)[0] ^ ((word32*)input)[0];168 ((word32*)block)[1] = ((word32*)outBuffer)[1] ^ ((word32*)input)[1];169 ((word32*)block)[2] = ((word32*)outBuffer)[2] ^ ((word32*)input)[2];170 ((word32*)block)[3] = ((word32*)outBuffer)[3] ^ ((word32*)input)[3];173 bb.bloc4[0] = ((word32*)outBuffer)[0] ^ ((word32*)input)[0]; 174 bb.bloc4[1] = ((word32*)outBuffer)[1] ^ ((word32*)input)[1]; 175 bb.bloc4[2] = ((word32*)outBuffer)[2] ^ ((word32*)input)[2]; 176 bb.bloc4[3] = ((word32*)outBuffer)[3] ^ ((word32*)input)[3]; 171 177 outBuffer += 16; 172 rijndaelEncrypt(b lock, outBuffer, key->keySched, key->ROUNDS);178 rijndaelEncrypt(bb.block, outBuffer, key->keySched, key->ROUNDS); 173 179 input += 16; 174 180 } … … 177 183 case MODE_CFB1: 178 184 #if STRICT_ALIGN 179 memcpy(i v, cipher->IV, 16);185 memcpy(iu.iv, cipher->IV, 16); 180 186 #else /* !STRICT_ALIGN */ 181 187 *((word32*)iv[0]) = *((word32*)(cipher->IV )); … … 186 192 for (i = numBlocks; i > 0; i--) { 187 193 for (k = 0; k < 128; k++) { 188 *((word32*) block ) = *((word32*)iv[0]);189 *((word32*)(block+ 4)) = *((word32*)iv[1]);190 *((word32*)(block+ 8)) = *((word32*)iv[2]);191 *((word32*)(block+12)) = *((word32*)iv[3]);192 rijndaelEncrypt(b lock,block, key->keySched, key->ROUNDS);193 outBuffer[k/8] ^= (b lock[0] & 0x80) >> (k & 7);194 i v[0][0] = (iv[0][0] << 1) | (iv[0][1] >> 7);195 i v[0][1] = (iv[0][1] << 1) | (iv[0][2] >> 7);196 i v[0][2] = (iv[0][2] << 1) | (iv[0][3] >> 7);197 i v[0][3] = (iv[0][3] << 1) | (iv[1][0] >> 7);198 i v[1][0] = (iv[1][0] << 1) | (iv[1][1] >> 7);199 i v[1][1] = (iv[1][1] << 1) | (iv[1][2] >> 7);200 i v[1][2] = (iv[1][2] << 1) | (iv[1][3] >> 7);201 i v[1][3] = (iv[1][3] << 1) | (iv[2][0] >> 7);202 i v[2][0] = (iv[2][0] << 1) | (iv[2][1] >> 7);203 i v[2][1] = (iv[2][1] << 1) | (iv[2][2] >> 7);204 i v[2][2] = (iv[2][2] << 1) | (iv[2][3] >> 7);205 i v[2][3] = (iv[2][3] << 1) | (iv[3][0] >> 7);206 i v[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7);207 i v[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7);208 i v[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7);209 i v[3][3] = (iv[3][3] << 1) | ((outBuffer[k/8] >> (7-(k&7))) & 1);194 bb.bloc4[0] = iu.i4[0]; 195 bb.bloc4[1] = iu.i4[1]; 196 bb.bloc4[2] = iu.i4[2]; 197 bb.bloc4[3] = iu.i4[3]; 198 rijndaelEncrypt(bb.block, bb.block, key->keySched, key->ROUNDS); 199 outBuffer[k/8] ^= (bb.block[0] & 0x80) >> (k & 7); 200 iu.iv[0][0] = (iu.iv[0][0] << 1) | (iu.iv[0][1] >> 7); 201 iu.iv[0][1] = (iu.iv[0][1] << 1) | (iu.iv[0][2] >> 7); 202 iu.iv[0][2] = (iu.iv[0][2] << 1) | (iu.iv[0][3] >> 7); 203 iu.iv[0][3] = (iu.iv[0][3] << 1) | (iu.iv[1][0] >> 7); 204 iu.iv[1][0] = (iu.iv[1][0] << 1) | (iu.iv[1][1] >> 7); 205 iu.iv[1][1] = (iu.iv[1][1] << 1) | (iu.iv[1][2] >> 7); 206 iu.iv[1][2] = (iu.iv[1][2] << 1) | (iu.iv[1][3] >> 7); 207 iu.iv[1][3] = (iu.iv[1][3] << 1) | (iu.iv[2][0] >> 7); 208 iu.iv[2][0] = (iu.iv[2][0] << 1) | (iu.iv[2][1] >> 7); 209 iu.iv[2][1] = (iu.iv[2][1] << 1) | (iu.iv[2][2] >> 7); 210 iu.iv[2][2] = (iu.iv[2][2] << 1) | (iu.iv[2][3] >> 7); 211 iu.iv[2][3] = (iu.iv[2][3] << 1) | (iu.iv[3][0] >> 7); 212 iu.iv[3][0] = (iu.iv[3][0] << 1) | (iu.iv[3][1] >> 7); 213 iu.iv[3][1] = (iu.iv[3][1] << 1) | (iu.iv[3][2] >> 7); 214 iu.iv[3][2] = (iu.iv[3][2] << 1) | (iu.iv[3][3] >> 7); 215 iu.iv[3][3] = (iu.iv[3][3] << 1) | ((outBuffer[k/8] >> (7-(k&7))) & 1); 210 216 } 211 217 } … … 222 228 RIJ_BYTE *input, int inputLen, RIJ_BYTE *outBuffer) { 223 229 int i, k, numBlocks; 224 word8 block[16], iv[4][4]; 230 union { 231 word32 bloc4[4]; 232 word8 block[16]; 233 } bb; 234 union { 235 word32 i4[4]; 236 word8 iv[4][4]; 237 } iu; 225 238 226 239 if (cipher == NULL || … … 246 259 case MODE_CBC: 247 260 #if STRICT_ALIGN 248 memcpy(i v, cipher->IV, 16);249 #else 250 *((word32*)i v[0]) = *((word32*)(cipher->IV ));251 *((word32*)i v[1]) = *((word32*)(cipher->IV+ 4));252 *((word32*)i v[2]) = *((word32*)(cipher->IV+ 8));253 *((word32*)i v[3]) = *((word32*)(cipher->IV+12));261 memcpy(iu.iv, cipher->IV, 16); 262 #else 263 *((word32*)iu.i4[0]) = *((word32*)(cipher->IV )); 264 *((word32*)iu.i4[1]) = *((word32*)(cipher->IV+ 4)); 265 *((word32*)iu.i4[2]) = *((word32*)(cipher->IV+ 8)); 266 *((word32*)iu.i4[3]) = *((word32*)(cipher->IV+12)); 254 267 #endif 255 268 for (i = numBlocks; i > 0; i--) { 256 rijndaelDecrypt(input, b lock, key->keySched, key->ROUNDS);257 ((word32*)block)[0] ^= *((word32*)iv[0]);258 ((word32*)block)[1] ^= *((word32*)iv[1]);259 ((word32*)block)[2] ^= *((word32*)iv[2]);260 ((word32*)block)[3] ^= *((word32*)iv[3]);269 rijndaelDecrypt(input, bb.block, key->keySched, key->ROUNDS); 270 bb.bloc4[0] ^= iu.i4[0]; 271 bb.bloc4[1] ^= iu.i4[1]; 272 bb.bloc4[2] ^= iu.i4[2]; 273 bb.bloc4[3] ^= iu.i4[3]; 261 274 #if STRICT_ALIGN 262 memcpy(i v, input, 16);263 memcpy(outBuffer, b lock, 16);275 memcpy(iu.iv, input, 16); 276 memcpy(outBuffer, bb.block, 16); 264 277 #else 265 278 *((word32*)iv[0]) = ((word32*)input)[0]; ((word32*)outBuffer)[0] = ((word32*)block)[0]; … … 275 288 case MODE_CFB1: 276 289 #if STRICT_ALIGN 277 memcpy(i v, cipher->IV, 16);290 memcpy(iu.iv, cipher->IV, 16); 278 291 #else 279 292 *((word32*)iv[0]) = *((word32*)(cipher->IV)); … … 284 297 for (i = numBlocks; i > 0; i--) { 285 298 for (k = 0; k < 128; k++) { 286 *((word32*) block ) = *((word32*)iv[0]);287 *((word32*)(block+ 4)) = *((word32*)iv[1]);288 *((word32*)(block+ 8)) = *((word32*)iv[2]);289 *((word32*)(block+12)) = *((word32*)iv[3]);290 rijndaelEncrypt(b lock,block, key->keySched, key->ROUNDS);291 i v[0][0] = (iv[0][0] << 1) | (iv[0][1] >> 7);292 i v[0][1] = (iv[0][1] << 1) | (iv[0][2] >> 7);293 i v[0][2] = (iv[0][2] << 1) | (iv[0][3] >> 7);294 i v[0][3] = (iv[0][3] << 1) | (iv[1][0] >> 7);295 i v[1][0] = (iv[1][0] << 1) | (iv[1][1] >> 7);296 i v[1][1] = (iv[1][1] << 1) | (iv[1][2] >> 7);297 i v[1][2] = (iv[1][2] << 1) | (iv[1][3] >> 7);298 i v[1][3] = (iv[1][3] << 1) | (iv[2][0] >> 7);299 i v[2][0] = (iv[2][0] << 1) | (iv[2][1] >> 7);300 i v[2][1] = (iv[2][1] << 1) | (iv[2][2] >> 7);301 i v[2][2] = (iv[2][2] << 1) | (iv[2][3] >> 7);302 i v[2][3] = (iv[2][3] << 1) | (iv[3][0] >> 7);303 i v[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7);304 i v[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7);305 i v[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7);306 i v[3][3] = (iv[3][3] << 1) | ((input[k/8] >> (7-(k&7))) & 1);307 outBuffer[k/8] ^= (b lock[0] & 0x80) >> (k & 7);299 bb.bloc4[0] = iu.i4[0]; 300 bb.bloc4[1] = iu.i4[1]; 301 bb.bloc4[2] = iu.i4[2]; 302 bb.bloc4[3] = iu.i4[3]; 303 rijndaelEncrypt(bb.block, bb.block, key->keySched, key->ROUNDS); 304 iu.iv[0][0] = (iu.iv[0][0] << 1) | (iu.iv[0][1] >> 7); 305 iu.iv[0][1] = (iu.iv[0][1] << 1) | (iu.iv[0][2] >> 7); 306 iu.iv[0][2] = (iu.iv[0][2] << 1) | (iu.iv[0][3] >> 7); 307 iu.iv[0][3] = (iu.iv[0][3] << 1) | (iu.iv[1][0] >> 7); 308 iu.iv[1][0] = (iu.iv[1][0] << 1) | (iu.iv[1][1] >> 7); 309 iu.iv[1][1] = (iu.iv[1][1] << 1) | (iu.iv[1][2] >> 7); 310 iu.iv[1][2] = (iu.iv[1][2] << 1) | (iu.iv[1][3] >> 7); 311 iu.iv[1][3] = (iu.iv[1][3] << 1) | (iu.iv[2][0] >> 7); 312 iu.iv[2][0] = (iu.iv[2][0] << 1) | (iu.iv[2][1] >> 7); 313 iu.iv[2][1] = (iu.iv[2][1] << 1) | (iu.iv[2][2] >> 7); 314 iu.iv[2][2] = (iu.iv[2][2] << 1) | (iu.iv[2][3] >> 7); 315 iu.iv[2][3] = (iu.iv[2][3] << 1) | (iu.iv[3][0] >> 7); 316 iu.iv[3][0] = (iu.iv[3][0] << 1) | (iu.iv[3][1] >> 7); 317 iu.iv[3][1] = (iu.iv[3][1] << 1) | (iu.iv[3][2] >> 7); 318 iu.iv[3][2] = (iu.iv[3][2] << 1) | (iu.iv[3][3] >> 7); 319 iu.iv[3][3] = (iu.iv[3][3] << 1) | ((input[k/8] >> (7-(k&7))) & 1); 320 outBuffer[k/8] ^= (bb.block[0] & 0x80) >> (k & 7); 308 321 } 309 322 } … … 316 329 return 128*numBlocks; 317 330 } 318 331 #ifdef INTERMEDIATE_VALUE_KAT 332 /** 333 * cipherUpdateRounds: 334 * 335 * Encrypts/Decrypts exactly one full block a specified number of rounds. 336 * Only used in the Intermediate Value Known Answer Test. 337 * 338 * Returns: 339 * TRUE - on success 340 * BAD_CIPHER_STATE - cipher in bad state (e.g., not initialized) 341 */ 342 int cipherUpdateRounds(cipherInstance *cipher, keyInstance *key, 343 RIJ_BYTE *input, int inputLen, RIJ_BYTE *outBuffer, int rounds) { 344 int j; 345 word8 block[4][4]; 346 347 if (cipher == NULL || key == NULL) { 348 return BAD_CIPHER_STATE; 349 } 350 351 for (j = 3; j >= 0; j--) { 352 /* parse input stream into rectangular array */ 353 *((word32*)block[j]) = *((word32*)(input+4*j)); 354 } 355 356 switch (key->direction) { 357 case DIR_ENCRYPT: 358 rijndaelEncryptRound(block, key->keySched, key->ROUNDS, rounds); 359 break; 360 361 case DIR_DECRYPT: 362 rijndaelDecryptRound(block, key->keySched, key->ROUNDS, rounds); 363 break; 364 365 default: 366 return BAD_KEY_DIR; 367 } 368 369 for (j = 3; j >= 0; j--) { 370 /* parse rectangular array into output ciphertext bytes */ 371 *((word32*)(outBuffer+4*j)) = *((word32*)block[j]); 372 } 373 374 return TRUE; 375 } 376 #endif /* INTERMEDIATE_VALUE_KAT */ 319 377 #endif
Note:
See TracChangeset
for help on using the changeset viewer.