|
@ -1,4 +1,4 @@ |
|
|
/* $OpenBSD: blowfish.c,v 1.6 1997/07/25 20:30:00 mickey Exp $ */ |
|
|
|
|
|
|
|
|
/* $OpenBSD: blowfish.c,v 1.7 1998/03/02 14:11:50 provos Exp $ */ |
|
|
/* |
|
|
/* |
|
|
* Blowfish block cipher for OpenBSD |
|
|
* Blowfish block cipher for OpenBSD |
|
|
* Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> |
|
|
* Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> |
|
@ -39,7 +39,7 @@ |
|
|
* Bruce Schneier. |
|
|
* Bruce Schneier. |
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
#ifdef TEST |
|
|
|
|
|
|
|
|
#if 0 |
|
|
#include <stdio.h> /* used for debugging */ |
|
|
#include <stdio.h> /* used for debugging */ |
|
|
#include <string.h> |
|
|
#include <string.h> |
|
|
#endif |
|
|
#endif |
|
@ -54,35 +54,14 @@ |
|
|
#define inline |
|
|
#define inline |
|
|
#endif /* !__GNUC__ */ |
|
|
#endif /* !__GNUC__ */ |
|
|
|
|
|
|
|
|
static inline u_int32_t F __P((blf_ctx * bc, u_int32_t x)); |
|
|
|
|
|
|
|
|
|
|
|
/* Function for Feistel Networks */ |
|
|
/* Function for Feistel Networks */ |
|
|
|
|
|
|
|
|
static inline u_int32_t |
|
|
|
|
|
F(bc, x) |
|
|
|
|
|
blf_ctx *bc; |
|
|
|
|
|
u_int32_t x; |
|
|
|
|
|
{ |
|
|
|
|
|
u_int8_t a; |
|
|
|
|
|
u_int8_t b; |
|
|
|
|
|
u_int8_t c; |
|
|
|
|
|
u_int8_t d; |
|
|
|
|
|
u_int32_t y; |
|
|
|
|
|
|
|
|
|
|
|
d = (u_int8_t) (x & 0xFF); |
|
|
|
|
|
x >>= 8; |
|
|
|
|
|
c = (u_int8_t) (x & 0xFF); |
|
|
|
|
|
x >>= 8; |
|
|
|
|
|
b = (u_int8_t) (x & 0xFF); |
|
|
|
|
|
x >>= 8; |
|
|
|
|
|
a = (u_int8_t) (x & 0xFF); |
|
|
|
|
|
|
|
|
|
|
|
y = bc->S[0][a] + bc->S[1][b]; |
|
|
|
|
|
y = y ^ bc->S[2][c]; |
|
|
|
|
|
y = y + bc->S[3][d]; |
|
|
|
|
|
|
|
|
|
|
|
return y; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
#define F(bc, x) ((((bc)->S[0][((x) & 0xFF000000) >> 24] \ |
|
|
|
|
|
+ (bc)->S[1][((x) &0xFF0000 ) >> 16]) \ |
|
|
|
|
|
^ (bc)->S[2][((x) & 0xFF00) >> 8]) \ |
|
|
|
|
|
+ (bc)->S[3][(x) & 0x00FF]) |
|
|
|
|
|
|
|
|
|
|
|
#define BLFRND(bc,i,j,n) (i ^= F(bc,j) ^ (bc)->P[n]) |
|
|
|
|
|
|
|
|
void |
|
|
void |
|
|
Blowfish_encipher(c, xl, xr) |
|
|
Blowfish_encipher(c, xl, xr) |
|
@ -92,33 +71,22 @@ Blowfish_encipher(c, xl, xr) |
|
|
{ |
|
|
{ |
|
|
u_int32_t Xl; |
|
|
u_int32_t Xl; |
|
|
u_int32_t Xr; |
|
|
u_int32_t Xr; |
|
|
u_int32_t temp; |
|
|
|
|
|
u_int16_t i; |
|
|
|
|
|
|
|
|
|
|
|
Xl = *xl; |
|
|
Xl = *xl; |
|
|
Xr = *xr; |
|
|
Xr = *xr; |
|
|
|
|
|
|
|
|
for (i = 0; i < BLF_N; i++) { |
|
|
|
|
|
/* One round of a Feistel network */ |
|
|
|
|
|
Xl = Xl ^ c->P[i]; |
|
|
|
|
|
Xr = F(c, Xl) ^ Xr; |
|
|
|
|
|
|
|
|
|
|
|
/* Swap Xl and Xr */ |
|
|
|
|
|
temp = Xl; |
|
|
|
|
|
Xl = Xr; |
|
|
|
|
|
Xr = temp; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* End of Feistel Network, swap again */ |
|
|
|
|
|
temp = Xl; |
|
|
|
|
|
Xl = Xr; |
|
|
|
|
|
Xr = temp; |
|
|
|
|
|
|
|
|
|
|
|
Xr = Xr ^ c->P[BLF_N]; |
|
|
|
|
|
Xl = Xl ^ c->P[BLF_N + 1]; |
|
|
|
|
|
|
|
|
|
|
|
*xl = Xl; |
|
|
|
|
|
*xr = Xr; |
|
|
|
|
|
|
|
|
Xl ^= c->P[0]; |
|
|
|
|
|
BLFRND(c, Xr, Xl, 1); BLFRND(c, Xl, Xr, 2); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 3); BLFRND(c, Xl, Xr, 4); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 5); BLFRND(c, Xl, Xr, 6); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 7); BLFRND(c, Xl, Xr, 8); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 9); BLFRND(c, Xl, Xr, 10); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 11); BLFRND(c, Xl, Xr, 12); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 13); BLFRND(c, Xl, Xr, 14); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 15); BLFRND(c, Xl, Xr, 16); |
|
|
|
|
|
|
|
|
|
|
|
*xl = Xr ^ c->P[17]; |
|
|
|
|
|
*xr = Xl; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void |
|
|
void |
|
@ -129,33 +97,22 @@ Blowfish_decipher(c, xl, xr) |
|
|
{ |
|
|
{ |
|
|
u_int32_t Xl; |
|
|
u_int32_t Xl; |
|
|
u_int32_t Xr; |
|
|
u_int32_t Xr; |
|
|
u_int32_t temp; |
|
|
|
|
|
u_int16_t i; |
|
|
|
|
|
|
|
|
|
|
|
Xl = *xl; |
|
|
Xl = *xl; |
|
|
Xr = *xr; |
|
|
Xr = *xr; |
|
|
|
|
|
|
|
|
for (i = BLF_N + 1; i > 1; i--) { |
|
|
|
|
|
/* One round of a Feistel network */ |
|
|
|
|
|
Xl = Xl ^ c->P[i]; |
|
|
|
|
|
Xr = F(c, Xl) ^ Xr; |
|
|
|
|
|
|
|
|
|
|
|
/* Swap Xl and Xr */ |
|
|
|
|
|
temp = Xl; |
|
|
|
|
|
Xl = Xr; |
|
|
|
|
|
Xr = temp; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* End of Feistel Network, swap again */ |
|
|
|
|
|
temp = Xl; |
|
|
|
|
|
Xl = Xr; |
|
|
|
|
|
Xr = temp; |
|
|
|
|
|
|
|
|
|
|
|
Xr = Xr ^ c->P[1]; |
|
|
|
|
|
Xl = Xl ^ c->P[0]; |
|
|
|
|
|
|
|
|
|
|
|
*xr = Xr; |
|
|
|
|
|
*xl = Xl; |
|
|
|
|
|
|
|
|
Xl ^= c->P[17]; |
|
|
|
|
|
BLFRND(c, Xr, Xl, 16); BLFRND(c, Xl, Xr, 15); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 14); BLFRND(c, Xl, Xr, 13); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 12); BLFRND(c, Xl, Xr, 11); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 10); BLFRND(c, Xl, Xr, 9); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 8); BLFRND(c, Xl, Xr, 7); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 6); BLFRND(c, Xl, Xr, 5); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 4); BLFRND(c, Xl, Xr, 3); |
|
|
|
|
|
BLFRND(c, Xr, Xl, 2); BLFRND(c, Xl, Xr, 1); |
|
|
|
|
|
|
|
|
|
|
|
*xl = Xr ^ c->P[0]; |
|
|
|
|
|
*xr = Xl; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void |
|
|
void |
|
@ -627,7 +584,7 @@ blf_dec(c, data, blocks) |
|
|
d += 2; |
|
|
d += 2; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
#ifdef TEST |
|
|
|
|
|
|
|
|
#ifdef 0 |
|
|
void |
|
|
void |
|
|
report(u_int32_t data[], u_int16_t len) |
|
|
report(u_int32_t data[], u_int16_t len) |
|
|
{ |
|
|
{ |
|
@ -669,4 +626,4 @@ main(void) |
|
|
blf_dec(&c, data2, 1); |
|
|
blf_dec(&c, data2, 1); |
|
|
report(data2, 2); |
|
|
report(data2, 2); |
|
|
} |
|
|
} |
|
|
#endif /* TEST */ |
|
|
|
|
|
|
|
|
#endif |