diff options
| author | provos <> | 1999-12-28 13:09:13 +0000 | 
|---|---|---|
| committer | provos <> | 1999-12-28 13:09:13 +0000 | 
| commit | c90229eaa6df37dd29c45c1aa632cb37ca8cfa06 (patch) | |
| tree | db4a87834377aa19929d8b55126f7101fa4868be | |
| parent | c01482d9c8c7329044dfb4a98ba1abd6cc766483 (diff) | |
| download | openbsd-c90229eaa6df37dd29c45c1aa632cb37ca8cfa06.tar.gz openbsd-c90229eaa6df37dd29c45c1aa632cb37ca8cfa06.tar.bz2 openbsd-c90229eaa6df37dd29c45c1aa632cb37ca8cfa06.zip | |
speed up blowfish by > 20%.
| -rw-r--r-- | src/lib/libc/crypt/blowfish.c | 60 | 
1 files changed, 32 insertions, 28 deletions
| diff --git a/src/lib/libc/crypt/blowfish.c b/src/lib/libc/crypt/blowfish.c index 8d7ae9141f..846cee0e8a 100644 --- a/src/lib/libc/crypt/blowfish.c +++ b/src/lib/libc/crypt/blowfish.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: blowfish.c,v 1.13 1999/05/14 16:08:58 niklas Exp $ */ | 1 | /* $OpenBSD: blowfish.c,v 1.14 1999/12/28 13:09:13 provos Exp $ */ | 
| 2 | /* | 2 | /* | 
| 3 | * Blowfish block cipher for OpenBSD | 3 | * Blowfish block cipher for OpenBSD | 
| 4 | * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> | 4 | * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> | 
| @@ -56,12 +56,12 @@ | |||
| 56 | 56 | ||
| 57 | /* Function for Feistel Networks */ | 57 | /* Function for Feistel Networks */ | 
| 58 | 58 | ||
| 59 | #define F(bc, x) ((((bc)->S[0][((x) & 0xFF000000) >> 24] \ | 59 | #define F(s, x) ((((s)[ (((x)>>24)&0xFF)] \ | 
| 60 | + (bc)->S[1][((x) &0xFF0000 ) >> 16]) \ | 60 | + (s)[0x100 + (((x)>>16)&0xFF)]) \ | 
| 61 | ^ (bc)->S[2][((x) & 0xFF00) >> 8]) \ | 61 | ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \ | 
| 62 | + (bc)->S[3][(x) & 0x00FF]) | 62 | + (s)[0x300 + ( (x) &0xFF)]) | 
| 63 | 63 | ||
| 64 | #define BLFRND(bc,i,j,n) (i ^= F(bc,j) ^ (bc)->P[n]) | 64 | #define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n]) | 
| 65 | 65 | ||
| 66 | void | 66 | void | 
| 67 | Blowfish_encipher(c, xl, xr) | 67 | Blowfish_encipher(c, xl, xr) | 
| @@ -71,21 +71,23 @@ Blowfish_encipher(c, xl, xr) | |||
| 71 | { | 71 | { | 
| 72 | u_int32_t Xl; | 72 | u_int32_t Xl; | 
| 73 | u_int32_t Xr; | 73 | u_int32_t Xr; | 
| 74 | u_int32_t *s = c->S[0]; | ||
| 75 | u_int32_t *p = c->P; | ||
| 74 | 76 | ||
| 75 | Xl = *xl; | 77 | Xl = *xl; | 
| 76 | Xr = *xr; | 78 | Xr = *xr; | 
| 77 | 79 | ||
| 78 | Xl ^= c->P[0]; | 80 | Xl ^= p[0]; | 
| 79 | BLFRND(c, Xr, Xl, 1); BLFRND(c, Xl, Xr, 2); | 81 | BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2); | 
| 80 | BLFRND(c, Xr, Xl, 3); BLFRND(c, Xl, Xr, 4); | 82 | BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4); | 
| 81 | BLFRND(c, Xr, Xl, 5); BLFRND(c, Xl, Xr, 6); | 83 | BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6); | 
| 82 | BLFRND(c, Xr, Xl, 7); BLFRND(c, Xl, Xr, 8); | 84 | BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8); | 
| 83 | BLFRND(c, Xr, Xl, 9); BLFRND(c, Xl, Xr, 10); | 85 | BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10); | 
| 84 | BLFRND(c, Xr, Xl, 11); BLFRND(c, Xl, Xr, 12); | 86 | BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12); | 
| 85 | BLFRND(c, Xr, Xl, 13); BLFRND(c, Xl, Xr, 14); | 87 | BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14); | 
| 86 | BLFRND(c, Xr, Xl, 15); BLFRND(c, Xl, Xr, 16); | 88 | BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16); | 
| 87 | 89 | ||
| 88 | *xl = Xr ^ c->P[17]; | 90 | *xl = Xr ^ p[17]; | 
| 89 | *xr = Xl; | 91 | *xr = Xl; | 
| 90 | } | 92 | } | 
| 91 | 93 | ||
| @@ -97,21 +99,23 @@ Blowfish_decipher(c, xl, xr) | |||
| 97 | { | 99 | { | 
| 98 | u_int32_t Xl; | 100 | u_int32_t Xl; | 
| 99 | u_int32_t Xr; | 101 | u_int32_t Xr; | 
| 102 | u_int32_t *s = c->S[0]; | ||
| 103 | u_int32_t *p = c->P; | ||
| 100 | 104 | ||
| 101 | Xl = *xl; | 105 | Xl = *xl; | 
| 102 | Xr = *xr; | 106 | Xr = *xr; | 
| 103 | 107 | ||
| 104 | Xl ^= c->P[17]; | 108 | Xl ^= p[17]; | 
| 105 | BLFRND(c, Xr, Xl, 16); BLFRND(c, Xl, Xr, 15); | 109 | BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15); | 
| 106 | BLFRND(c, Xr, Xl, 14); BLFRND(c, Xl, Xr, 13); | 110 | BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13); | 
| 107 | BLFRND(c, Xr, Xl, 12); BLFRND(c, Xl, Xr, 11); | 111 | BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11); | 
| 108 | BLFRND(c, Xr, Xl, 10); BLFRND(c, Xl, Xr, 9); | 112 | BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9); | 
| 109 | BLFRND(c, Xr, Xl, 8); BLFRND(c, Xl, Xr, 7); | 113 | BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7); | 
| 110 | BLFRND(c, Xr, Xl, 6); BLFRND(c, Xl, Xr, 5); | 114 | BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5); | 
| 111 | BLFRND(c, Xr, Xl, 4); BLFRND(c, Xl, Xr, 3); | 115 | BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3); | 
| 112 | BLFRND(c, Xr, Xl, 2); BLFRND(c, Xl, Xr, 1); | 116 | BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1); | 
| 113 | 117 | ||
| 114 | *xl = Xr ^ c->P[0]; | 118 | *xl = Xr ^ p[0]; | 
| 115 | *xr = Xl; | 119 | *xr = Xl; | 
| 116 | } | 120 | } | 
| 117 | 121 | ||
