Skip to content

Commit e69579c

Browse files
committed
start re-factor
1 parent 238eb73 commit e69579c

File tree

1 file changed

+76
-49
lines changed

1 file changed

+76
-49
lines changed

src/ciphers/blowfish.c

Lines changed: 76 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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] = {
306362
int 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

Comments
 (0)