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