summaryrefslogtreecommitdiff
path: root/src/lib/libc/crypt
diff options
context:
space:
mode:
authorprovos <>1998-03-02 14:11:50 +0000
committerprovos <>1998-03-02 14:11:50 +0000
commit9c1bcccc1715ca95d445661c50870f517c91ea56 (patch)
tree2ba1a7d6989c05296fea5602f40c9127e14d8251 /src/lib/libc/crypt
parentf913ef2d07533fed950955a665b620cf168da96a (diff)
downloadopenbsd-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.c111
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
57static 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
61static inline u_int32_t 59#define F(bc, x) ((((bc)->S[0][((x) & 0xFF000000) >> 24] \
62F(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
87void 66void
88Blowfish_encipher(c, xl, xr) 67Blowfish_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
124void 92void
@@ -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
161void 118void
@@ -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
631void 588void
632report(u_int32_t data[], u_int16_t len) 589report(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