@@ -295,6 +295,62 @@ static const ulong32 ORIG_S[4][256] = {
295295 0xB74E6132UL , 0xCE77E25BUL , 0x578FDFE3UL , 0x3AC372E6UL }
296296};
297297
298+ #ifndef __GNUC__
299+ #define F (x ) ((S1[LTC_BYTE(x,3)] + S2[LTC_BYTE(x,2)]) ^ S3[LTC_BYTE(x,1)]) + S4[LTC_BYTE(x,0)]
300+ #else
301+ #define F (x ) ((skey->blowfish.S[0][LTC_BYTE(x,3)] + skey->blowfish.S[1][LTC_BYTE(x,2)]) ^ skey->blowfish.S[2][LTC_BYTE(x,1)]) + skey->blowfish.S[3][LTC_BYTE(x,0)]
302+ #endif
303+
304+ static void s_blowfish_encipher (ulong32 * L , ulong32 * R , const symmetric_key * skey )
305+ {
306+ int r ;
307+
308+ ulong32 _L , _R ;
309+ #ifndef __GNUC__
310+ const ulong32 * S1 , * S2 , * S3 , * S4 ;
311+
312+ S1 = skey -> blowfish .S [0 ];
313+ S2 = skey -> blowfish .S [1 ];
314+ S3 = skey -> blowfish .S [2 ];
315+ S4 = skey -> blowfish .S [3 ];
316+ #endif
317+
318+ _L = * L ;
319+ _R = * R ;
320+
321+ /* do 16 rounds */
322+ for (r = 0 ; r < 16 ; ) {
323+ _L ^= skey -> blowfish .K [r ++ ]; _R ^= F (_L );
324+ _R ^= skey -> blowfish .K [r ++ ]; _L ^= F (_R );
325+ _L ^= skey -> blowfish .K [r ++ ]; _R ^= F (_L );
326+ _R ^= skey -> blowfish .K [r ++ ]; _L ^= F (_R );
327+ }
328+
329+ /* last keying */
330+ _R ^= skey -> blowfish .K [17 ];
331+ _L ^= skey -> blowfish .K [16 ];
332+
333+ * L = _L ;
334+ * R = _R ;
335+ }
336+
337+ static ulong32 s_blowfish_stream2word (const unsigned char * d , int dlen , int * cur )
338+ {
339+ unsigned int z ;
340+ int y = * cur ;
341+ ulong32 ret = 0 ;
342+
343+ for (z = 0 ; z < 4 ; z ++ ) {
344+ ret = (ret << 8 ) | ((ulong32 )d [y ++ ] & 255 );
345+ if (y == dlen ) {
346+ y = 0 ;
347+ }
348+ }
349+
350+ * cur = y ;
351+ return ret ;
352+ }
353+
298354 /**
299355 Initialize the Blowfish block cipher
300356 @param key The symmetric key you wish to pass
@@ -306,8 +362,8 @@ static const ulong32 ORIG_S[4][256] = {
306362int blowfish_setup (const unsigned char * key , int keylen , int num_rounds ,
307363 symmetric_key * skey )
308364{
309- ulong32 x , y , z , A ;
310- unsigned char B [ 8 ] ;
365+ ulong32 x , z , A , B [ 2 ] ;
366+ int y ;
311367
312368 LTC_ARGCHK (key != NULL );
313369 LTC_ARGCHK (skey != NULL );
@@ -323,14 +379,9 @@ int blowfish_setup(const unsigned char *key, int keylen, int num_rounds,
323379 }
324380
325381 /* load in key bytes (Supplied by David Hopwood) */
382+ y = 0 ;
326383 for (x = y = 0 ; x < 18 ; x ++ ) {
327- A = 0 ;
328- for (z = 0 ; z < 4 ; z ++ ) {
329- A = (A << 8 ) | ((ulong32 )key [y ++ ] & 255 );
330- if (y == (ulong32 )keylen ) {
331- y = 0 ;
332- }
333- }
384+ A = s_blowfish_stream2word (key , keylen , & y );
334385 skey -> blowfish .K [x ] = ORIG_P [x ] ^ A ;
335386 }
336387
@@ -342,26 +393,29 @@ int blowfish_setup(const unsigned char *key, int keylen, int num_rounds,
342393 }
343394
344395 /* encrypt K array */
345- for (x = 0 ; x < 8 ; x ++ ) {
396+ for (x = 0 ; x < 2 ; x ++ ) {
346397 B [x ] = 0 ;
347398 }
348399
349400 for (x = 0 ; x < 18 ; x += 2 ) {
350- /* encrypt it */
351- blowfish_ecb_encrypt (B , B , skey );
352- /* copy it */
353- LOAD32H (skey -> blowfish .K [x ], & B [0 ]);
354- LOAD32H (skey -> blowfish .K [x + 1 ], & B [4 ]);
401+
402+ /* encrypt it */
403+ s_blowfish_encipher (& B [0 ], & B [1 ], skey );
404+ /* copy it */
405+ skey -> blowfish .K [x ] = B [1 ];
406+ skey -> blowfish .K [x + 1 ] = B [1 ] = B [0 ];
407+ B [0 ] = skey -> blowfish .K [x ];
355408 }
356409
357410 /* encrypt S array */
358411 for (x = 0 ; x < 4 ; x ++ ) {
359412 for (y = 0 ; y < 256 ; y += 2 ) {
360413 /* encrypt it */
361- blowfish_ecb_encrypt ( B , B , skey );
414+ s_blowfish_encipher ( & B [ 0 ], & B [ 1 ] , skey );
362415 /* copy it */
363- LOAD32H (skey -> blowfish .S [x ][y ], & B [0 ]);
364- LOAD32H (skey -> blowfish .S [x ][y + 1 ], & B [4 ]);
416+ skey -> blowfish .S [x ][y ] = B [1 ];
417+ skey -> blowfish .S [x ][y + 1 ] = B [1 ] = B [0 ];
418+ B [0 ] = skey -> blowfish .S [x ][y ];
365419 }
366420 }
367421
@@ -372,12 +426,6 @@ int blowfish_setup(const unsigned char *key, int keylen, int num_rounds,
372426 return CRYPT_OK ;
373427}
374428
375- #ifndef __GNUC__
376- #define F (x ) ((S1[LTC_BYTE(x,3)] + S2[LTC_BYTE(x,2)]) ^ S3[LTC_BYTE(x,1)]) + S4[LTC_BYTE(x,0)]
377- #else
378- #define F (x ) ((skey->blowfish.S[0][LTC_BYTE(x,3)] + skey->blowfish.S[1][LTC_BYTE(x,2)]) ^ skey->blowfish.S[2][LTC_BYTE(x,1)]) + skey->blowfish.S[3][LTC_BYTE(x,0)]
379- #endif
380-
381429/**
382430 Encrypts a block of text with Blowfish
383431 @param pt The input plaintext (8 bytes)
@@ -392,37 +440,16 @@ int blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symme
392440#endif
393441{
394442 ulong32 L , R ;
395- int r ;
396- #ifndef __GNUC__
397- const ulong32 * S1 , * S2 , * S3 , * S4 ;
398- #endif
399-
400- LTC_ARGCHK (pt != NULL );
401- LTC_ARGCHK (ct != NULL );
402- LTC_ARGCHK (skey != NULL );
403443
404- #ifndef __GNUC__
405- S1 = skey -> blowfish .S [0 ];
406- S2 = skey -> blowfish .S [1 ];
407- S3 = skey -> blowfish .S [2 ];
408- S4 = skey -> blowfish .S [3 ];
409- #endif
444+ LTC_ARGCHK (pt != NULL );
445+ LTC_ARGCHK (ct != NULL );
446+ LTC_ARGCHK (skey != NULL );
410447
411448 /* load it */
412449 LOAD32H (L , & pt [0 ]);
413450 LOAD32H (R , & pt [4 ]);
414451
415- /* do 16 rounds */
416- for (r = 0 ; r < 16 ; ) {
417- L ^= skey -> blowfish .K [r ++ ]; R ^= F (L );
418- R ^= skey -> blowfish .K [r ++ ]; L ^= F (R );
419- L ^= skey -> blowfish .K [r ++ ]; R ^= F (L );
420- R ^= skey -> blowfish .K [r ++ ]; L ^= F (R );
421- }
422-
423- /* last keying */
424- R ^= skey -> blowfish .K [17 ];
425- L ^= skey -> blowfish .K [16 ];
452+ s_blowfish_encipher (& L , & R , skey );
426453
427454 /* store */
428455 STORE32H (R , & ct [0 ]);
0 commit comments