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 | ||