diff options
author | provos <> | 1998-03-02 14:11:50 +0000 |
---|---|---|
committer | provos <> | 1998-03-02 14:11:50 +0000 |
commit | 9c1bcccc1715ca95d445661c50870f517c91ea56 (patch) | |
tree | 2ba1a7d6989c05296fea5602f40c9127e14d8251 /src/lib/libc/crypt | |
parent | f913ef2d07533fed950955a665b620cf168da96a (diff) | |
download | openbsd-9c1bcccc1715ca95d445661c50870f517c91ea56.tar.gz openbsd-9c1bcccc1715ca95d445661c50870f517c91ea56.tar.bz2 openbsd-9c1bcccc1715ca95d445661c50870f517c91ea56.zip |
improve performance of blowfish encryption, also speeds up blowfish passwords.
Diffstat (limited to 'src/lib/libc/crypt')
-rw-r--r-- | src/lib/libc/crypt/blowfish.c | 111 |
1 files changed, 34 insertions, 77 deletions
diff --git a/src/lib/libc/crypt/blowfish.c b/src/lib/libc/crypt/blowfish.c index 9f1c79b0e7..ce5d8d3f93 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.6 1997/07/25 20:30:00 mickey Exp $ */ | 1 | /* $OpenBSD: blowfish.c,v 1.7 1998/03/02 14:11:50 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> |
@@ -39,7 +39,7 @@ | |||
39 | * Bruce Schneier. | 39 | * Bruce Schneier. |
40 | */ | 40 | */ |
41 | 41 | ||
42 | #ifdef TEST | 42 | #if 0 |
43 | #include <stdio.h> /* used for debugging */ | 43 | #include <stdio.h> /* used for debugging */ |
44 | #include <string.h> | 44 | #include <string.h> |
45 | #endif | 45 | #endif |
@@ -54,35 +54,14 @@ | |||
54 | #define inline | 54 | #define inline |
55 | #endif /* !__GNUC__ */ | 55 | #endif /* !__GNUC__ */ |
56 | 56 | ||
57 | static inline u_int32_t F __P((blf_ctx * bc, u_int32_t x)); | ||
58 | |||
59 | /* Function for Feistel Networks */ | 57 | /* Function for Feistel Networks */ |
60 | 58 | ||
61 | static inline u_int32_t | 59 | #define F(bc, x) ((((bc)->S[0][((x) & 0xFF000000) >> 24] \ |
62 | F(bc, x) | 60 | + (bc)->S[1][((x) &0xFF0000 ) >> 16]) \ |
63 | blf_ctx *bc; | 61 | ^ (bc)->S[2][((x) & 0xFF00) >> 8]) \ |
64 | u_int32_t x; | 62 | + (bc)->S[3][(x) & 0x00FF]) |
65 | { | 63 | |
66 | u_int8_t a; | 64 | #define BLFRND(bc,i,j,n) (i ^= F(bc,j) ^ (bc)->P[n]) |
67 | u_int8_t b; | ||
68 | u_int8_t c; | ||
69 | u_int8_t d; | ||
70 | u_int32_t y; | ||
71 | |||
72 | d = (u_int8_t) (x & 0xFF); | ||
73 | x >>= 8; | ||
74 | c = (u_int8_t) (x & 0xFF); | ||
75 | x >>= 8; | ||
76 | b = (u_int8_t) (x & 0xFF); | ||
77 | x >>= 8; | ||
78 | a = (u_int8_t) (x & 0xFF); | ||
79 | |||
80 | y = bc->S[0][a] + bc->S[1][b]; | ||
81 | y = y ^ bc->S[2][c]; | ||
82 | y = y + bc->S[3][d]; | ||
83 | |||
84 | return y; | ||
85 | } | ||
86 | 65 | ||
87 | void | 66 | void |
88 | Blowfish_encipher(c, xl, xr) | 67 | Blowfish_encipher(c, xl, xr) |
@@ -92,33 +71,22 @@ Blowfish_encipher(c, xl, xr) | |||
92 | { | 71 | { |
93 | u_int32_t Xl; | 72 | u_int32_t Xl; |
94 | u_int32_t Xr; | 73 | u_int32_t Xr; |
95 | u_int32_t temp; | ||
96 | u_int16_t i; | ||
97 | 74 | ||
98 | Xl = *xl; | 75 | Xl = *xl; |
99 | Xr = *xr; | 76 | Xr = *xr; |
100 | 77 | ||
101 | for (i = 0; i < BLF_N; i++) { | 78 | Xl ^= c->P[0]; |
102 | /* One round of a Feistel network */ | 79 | BLFRND(c, Xr, Xl, 1); BLFRND(c, Xl, Xr, 2); |
103 | Xl = Xl ^ c->P[i]; | 80 | BLFRND(c, Xr, Xl, 3); BLFRND(c, Xl, Xr, 4); |
104 | Xr = F(c, Xl) ^ Xr; | 81 | BLFRND(c, Xr, Xl, 5); BLFRND(c, Xl, Xr, 6); |
105 | 82 | BLFRND(c, Xr, Xl, 7); BLFRND(c, Xl, Xr, 8); | |
106 | /* Swap Xl and Xr */ | 83 | BLFRND(c, Xr, Xl, 9); BLFRND(c, Xl, Xr, 10); |
107 | temp = Xl; | 84 | BLFRND(c, Xr, Xl, 11); BLFRND(c, Xl, Xr, 12); |
108 | Xl = Xr; | 85 | BLFRND(c, Xr, Xl, 13); BLFRND(c, Xl, Xr, 14); |
109 | Xr = temp; | 86 | BLFRND(c, Xr, Xl, 15); BLFRND(c, Xl, Xr, 16); |
110 | } | 87 | |
111 | 88 | *xl = Xr ^ c->P[17]; | |
112 | /* End of Feistel Network, swap again */ | 89 | *xr = Xl; |
113 | temp = Xl; | ||
114 | Xl = Xr; | ||
115 | Xr = temp; | ||
116 | |||
117 | Xr = Xr ^ c->P[BLF_N]; | ||
118 | Xl = Xl ^ c->P[BLF_N + 1]; | ||
119 | |||
120 | *xl = Xl; | ||
121 | *xr = Xr; | ||
122 | } | 90 | } |
123 | 91 | ||
124 | void | 92 | void |
@@ -129,33 +97,22 @@ Blowfish_decipher(c, xl, xr) | |||
129 | { | 97 | { |
130 | u_int32_t Xl; | 98 | u_int32_t Xl; |
131 | u_int32_t Xr; | 99 | u_int32_t Xr; |
132 | u_int32_t temp; | ||
133 | u_int16_t i; | ||
134 | 100 | ||
135 | Xl = *xl; | 101 | Xl = *xl; |
136 | Xr = *xr; | 102 | Xr = *xr; |
137 | 103 | ||
138 | for (i = BLF_N + 1; i > 1; i--) { | 104 | Xl ^= c->P[17]; |
139 | /* One round of a Feistel network */ | 105 | BLFRND(c, Xr, Xl, 16); BLFRND(c, Xl, Xr, 15); |
140 | Xl = Xl ^ c->P[i]; | 106 | BLFRND(c, Xr, Xl, 14); BLFRND(c, Xl, Xr, 13); |
141 | Xr = F(c, Xl) ^ Xr; | 107 | BLFRND(c, Xr, Xl, 12); BLFRND(c, Xl, Xr, 11); |
142 | 108 | BLFRND(c, Xr, Xl, 10); BLFRND(c, Xl, Xr, 9); | |
143 | /* Swap Xl and Xr */ | 109 | BLFRND(c, Xr, Xl, 8); BLFRND(c, Xl, Xr, 7); |
144 | temp = Xl; | 110 | BLFRND(c, Xr, Xl, 6); BLFRND(c, Xl, Xr, 5); |
145 | Xl = Xr; | 111 | BLFRND(c, Xr, Xl, 4); BLFRND(c, Xl, Xr, 3); |
146 | Xr = temp; | 112 | BLFRND(c, Xr, Xl, 2); BLFRND(c, Xl, Xr, 1); |
147 | } | 113 | |
148 | 114 | *xl = Xr ^ c->P[0]; | |
149 | /* End of Feistel Network, swap again */ | 115 | *xr = Xl; |
150 | temp = Xl; | ||
151 | Xl = Xr; | ||
152 | Xr = temp; | ||
153 | |||
154 | Xr = Xr ^ c->P[1]; | ||
155 | Xl = Xl ^ c->P[0]; | ||
156 | |||
157 | *xr = Xr; | ||
158 | *xl = Xl; | ||
159 | } | 116 | } |
160 | 117 | ||
161 | void | 118 | void |
@@ -627,7 +584,7 @@ blf_dec(c, data, blocks) | |||
627 | d += 2; | 584 | d += 2; |
628 | } | 585 | } |
629 | } | 586 | } |
630 | #ifdef TEST | 587 | #ifdef 0 |
631 | void | 588 | void |
632 | report(u_int32_t data[], u_int16_t len) | 589 | report(u_int32_t data[], u_int16_t len) |
633 | { | 590 | { |
@@ -669,4 +626,4 @@ main(void) | |||
669 | blf_dec(&c, data2, 1); | 626 | blf_dec(&c, data2, 1); |
670 | report(data2, 2); | 627 | report(data2, 2); |
671 | } | 628 | } |
672 | #endif /* TEST */ | 629 | #endif |