git ssb

0+

dangerousbeans / %aPBe2k3ugtjBr4rrsU1…



Commit 7e4f6e0afadfe4fcafb532df1846f9f05c340463

Move MRI C extension into 'mri' subdirectory.

Signed-off-by: Coda Hale <coda.hale@gmail.com>
Hongli Lai (Phusion) authored on 8/12/2009, 9:25:54 AM
Coda Hale committed on 8/12/2009, 10:19:11 PM
Parent: b4024d4b1505f3c87b4c0b1ed59b8850aeea719f

Files changed

.gitignorechanged
Rakefilechanged
ext/bcrypt.cdeleted
ext/bcrypt.hdeleted
ext/mri/bcrypt.cadded
ext/mri/bcrypt.hadded
ext/mri/bcrypt_ext.cadded
ext/mri/blf.hadded
ext/mri/blowfish.cadded
ext/mri/extconf.rbadded
ext/bcrypt_ext.cdeleted
ext/blf.hdeleted
ext/blowfish.cdeleted
ext/extconf.rbdeleted
lib/bcrypt.rbchanged
.gitignoreView
@@ -1,6 +1,7 @@
1-ext/*.o
2-ext/*.bundle
3-ext/Makefile
1+*.o
2+*.bundle
3+*.so
4+ext/mri/Makefile
45 doc
56 pkg
67 *.class
RakefileView
@@ -12,20 +12,22 @@
1212 PKG_FILES = FileList[
1313 '[A-Z]*',
1414 'lib/**/*.rb',
1515 'spec/**/*.rb',
16- 'ext/*.c',
17- 'ext/*.h',
18- 'ext/*.rb',
16+ 'ext/mri/*.c',
17+ 'ext/mri/*.h',
18+ 'ext/mri/*.rb',
1919 'ext/jruby/bcrypt_jruby/BCrypt.java',
2020 'ext/jruby/bcrypt_jruby/BCrypt.class'
2121 ]
2222 CLEAN.include(
23- "ext/*.o",
24- "ext/*.bundle",
25- "ext/*.so"
23+ "ext/mri/*.o",
24+ "ext/mri/*.bundle",
25+ "ext/mri/*.so",
26+ "ext/jruby/bcrypt_jruby/*.class"
2627 )
2728 CLOBBER.include(
29+ "ext/mri/Makefile",
2830 "doc/coverage"
2931 )
3032
3133 task :default => [:compile, :spec]
@@ -69,9 +71,9 @@
6971 s.has_rdoc = true
7072 s.rdoc_options = rd.options
7173 s.extra_rdoc_files = rd.rdoc_files.to_a
7274
73- s.extensions = FileList["ext/extconf.rb"].to_a
75+ s.extensions = FileList["ext/mri/extconf.rb"].to_a
7476
7577 s.authors = ["Coda Hale"]
7678 s.email = "coda.hale@gmail.com"
7779 s.homepage = "http://bcrypt-ruby.rubyforge.org"
@@ -95,9 +97,9 @@
9597 task :all => [:mri, :jruby]
9698
9799 desc "Clean, then compile the MRI extension"
98100 task :mri => :clean do
99- Dir.chdir('ext') do
101+ Dir.chdir('ext/mri') do
100102 ruby "extconf.rb"
101103 sh "make"
102104 end
103105 end
ext/bcrypt.cView
@@ -1,328 +1,0 @@
1-/* $OpenBSD: bcrypt.c,v 1.22 2007/02/20 01:44:16 ray Exp $ */
2-
3-/*
4- * Modified by <hongli@phusion.nl> on 2009-08-05:
5- *
6- * - Got rid of the global variables; they're not thread-safe.
7- * Modified the functions to accept local buffers instead.
8- *
9- * Modified by <coda.hale@gmail.com> on 2007-02-27:
10- *
11- * - Changed bcrypt_gensalt to accept a random seed as a parameter,
12- * to remove the code's dependency on arc4random(), which isn't
13- * available on Linux.
14- */
15-
16-/*
17- * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
18- * All rights reserved.
19- *
20- * Redistribution and use in source and binary forms, with or without
21- * modification, are permitted provided that the following conditions
22- * are met:
23- * 1. Redistributions of source code must retain the above copyright
24- * notice, this list of conditions and the following disclaimer.
25- * 2. Redistributions in binary form must reproduce the above copyright
26- * notice, this list of conditions and the following disclaimer in the
27- * documentation and/or other materials provided with the distribution.
28- * 3. All advertising materials mentioning features or use of this software
29- * must display the following acknowledgement:
30- * This product includes software developed by Niels Provos.
31- * 4. The name of the author may not be used to endorse or promote products
32- * derived from this software without specific prior written permission.
33- *
34- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
35- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
36- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
37- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
38- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
39- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
40- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
41- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
42- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
43- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44- */
45-
46-/* This password hashing algorithm was designed by David Mazieres
47- * <dm@lcs.mit.edu> and works as follows:
48- *
49- * 1. state := InitState ()
50- * 2. state := ExpandKey (state, salt, password) 3.
51- * REPEAT rounds:
52- * state := ExpandKey (state, 0, salt)
53- * state := ExpandKey(state, 0, password)
54- * 4. ctext := "OrpheanBeholderScryDoubt"
55- * 5. REPEAT 64:
56- * ctext := Encrypt_ECB (state, ctext);
57- * 6. RETURN Concatenate (salt, ctext);
58- *
59- */
60-
61-#if 0
62-#include <stdio.h>
63-#endif
64-
65-#include <stdio.h>
66-#include <stdlib.h>
67-#include <sys/types.h>
68-#include <string.h>
69-#include "blf.h"
70-#include "bcrypt.h"
71-
72-/* This implementation is adaptable to current computing power.
73- * You can have up to 2^31 rounds which should be enough for some
74- * time to come.
75- */
76-
77-static void encode_salt(char *, u_int8_t *, u_int16_t, u_int8_t);
78-static void encode_base64(u_int8_t *, u_int8_t *, u_int16_t);
79-static void decode_base64(u_int8_t *, u_int16_t, u_int8_t *);
80-
81-const static u_int8_t Base64Code[] =
82-"./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
83-
84-const static u_int8_t index_64[128] = {
85- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
86- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
87- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
88- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
89- 255, 255, 255, 255, 255, 255, 0, 1, 54, 55,
90- 56, 57, 58, 59, 60, 61, 62, 63, 255, 255,
91- 255, 255, 255, 255, 255, 2, 3, 4, 5, 6,
92- 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
93- 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
94- 255, 255, 255, 255, 255, 255, 28, 29, 30,
95- 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
96- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
97- 51, 52, 53, 255, 255, 255, 255, 255
98-};
99-#define CHAR64(c) ( (c) > 127 ? 255 : index_64[(c)])
100-
101-static void
102-decode_base64(u_int8_t *buffer, u_int16_t len, u_int8_t *data)
103-{
104- u_int8_t *bp = buffer;
105- u_int8_t *p = data;
106- u_int8_t c1, c2, c3, c4;
107- while (bp < buffer + len) {
108- c1 = CHAR64(*p);
109- c2 = CHAR64(*(p + 1));
110-
111- /* Invalid data */
112- if (c1 == 255 || c2 == 255)
113- break;
114-
115- *bp++ = (c1 << 2) | ((c2 & 0x30) >> 4);
116- if (bp >= buffer + len)
117- break;
118-
119- c3 = CHAR64(*(p + 2));
120- if (c3 == 255)
121- break;
122-
123- *bp++ = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2);
124- if (bp >= buffer + len)
125- break;
126-
127- c4 = CHAR64(*(p + 3));
128- if (c4 == 255)
129- break;
130- *bp++ = ((c3 & 0x03) << 6) | c4;
131-
132- p += 4;
133- }
134-}
135-
136-static void
137-encode_salt(char *salt, u_int8_t *csalt, u_int16_t clen, u_int8_t logr)
138-{
139- salt[0] = '$';
140- salt[1] = BCRYPT_VERSION;
141- salt[2] = 'a';
142- salt[3] = '$';
143-
144- snprintf(salt + 4, 4, "%2.2u$", logr);
145-
146- encode_base64((u_int8_t *) salt + 7, csalt, clen);
147-}
148-/* Generates a salt for this version of crypt.
149- Since versions may change. Keeping this here
150- seems sensible.
151- */
152-
153-char *
154-bcrypt_gensalt(char *output, u_int8_t log_rounds, u_int8_t *rseed)
155-{
156- if (log_rounds < 4)
157- log_rounds = 4;
158- else if (log_rounds > 31)
159- log_rounds = 31;
160-
161- encode_salt(output, rseed, BCRYPT_MAXSALT, log_rounds);
162- return output;
163-}
164-/* We handle $Vers$log2(NumRounds)$salt+passwd$
165- i.e. $2$04$iwouldntknowwhattosayetKdJ6iFtacBqJdKe6aW7ou */
166-
167-char *
168-bcrypt(char *output, const char *key, const char *salt)
169-{
170- blf_ctx state;
171- u_int32_t rounds, i, k;
172- u_int16_t j;
173- u_int8_t key_len, salt_len, logr, minor;
174- u_int8_t ciphertext[4 * BCRYPT_BLOCKS] = "OrpheanBeholderScryDoubt";
175- u_int8_t csalt[BCRYPT_MAXSALT];
176- u_int32_t cdata[BCRYPT_BLOCKS];
177- int n;
178-
179- /* Discard "$" identifier */
180- salt++;
181-
182- if (*salt > BCRYPT_VERSION) {
183- return NULL;
184- }
185-
186- /* Check for minor versions */
187- if (salt[1] != '$') {
188- switch (salt[1]) {
189- case 'a':
190- /* 'ab' should not yield the same as 'abab' */
191- minor = salt[1];
192- salt++;
193- break;
194- default:
195- return NULL;
196- }
197- } else
198- minor = 0;
199-
200- /* Discard version + "$" identifier */
201- salt += 2;
202-
203- if (salt[2] != '$')
204- /* Out of sync with passwd entry */
205- return NULL;
206-
207- /* Computer power doesn't increase linear, 2^x should be fine */
208- n = atoi(salt);
209- if (n > 31 || n < 0)
210- return NULL;
211- logr = (u_int8_t)n;
212- if ((rounds = (u_int32_t) 1 << logr) < BCRYPT_MINROUNDS)
213- return NULL;
214-
215- /* Discard num rounds + "$" identifier */
216- salt += 3;
217-
218- if (strlen(salt) * 3 / 4 < BCRYPT_MAXSALT)
219- return NULL;
220-
221- /* We dont want the base64 salt but the raw data */
222- decode_base64(csalt, BCRYPT_MAXSALT, (u_int8_t *) salt);
223- salt_len = BCRYPT_MAXSALT;
224- key_len = strlen(key) + (minor >= 'a' ? 1 : 0);
225-
226- /* Setting up S-Boxes and Subkeys */
227- Blowfish_initstate(&state);
228- Blowfish_expandstate(&state, csalt, salt_len,
229- (u_int8_t *) key, key_len);
230- for (k = 0; k < rounds; k++) {
231- Blowfish_expand0state(&state, (u_int8_t *) key, key_len);
232- Blowfish_expand0state(&state, csalt, salt_len);
233- }
234-
235- /* This can be precomputed later */
236- j = 0;
237- for (i = 0; i < BCRYPT_BLOCKS; i++)
238- cdata[i] = Blowfish_stream2word(ciphertext, 4 * BCRYPT_BLOCKS, &j);
239-
240- /* Now do the encryption */
241- for (k = 0; k < 64; k++)
242- blf_enc(&state, cdata, BCRYPT_BLOCKS / 2);
243-
244- for (i = 0; i < BCRYPT_BLOCKS; i++) {
245- ciphertext[4 * i + 3] = cdata[i] & 0xff;
246- cdata[i] = cdata[i] >> 8;
247- ciphertext[4 * i + 2] = cdata[i] & 0xff;
248- cdata[i] = cdata[i] >> 8;
249- ciphertext[4 * i + 1] = cdata[i] & 0xff;
250- cdata[i] = cdata[i] >> 8;
251- ciphertext[4 * i + 0] = cdata[i] & 0xff;
252- }
253-
254-
255- i = 0;
256- output[i++] = '$';
257- output[i++] = BCRYPT_VERSION;
258- if (minor)
259- output[i++] = minor;
260- output[i++] = '$';
261-
262- snprintf(output + i, 4, "%2.2u$", logr);
263-
264- encode_base64((u_int8_t *) output + i + 3, csalt, BCRYPT_MAXSALT);
265- encode_base64((u_int8_t *) output + strlen(output), ciphertext,
266- 4 * BCRYPT_BLOCKS - 1);
267- return output;
268-}
269-
270-static void
271-encode_base64(u_int8_t *buffer, u_int8_t *data, u_int16_t len)
272-{
273- u_int8_t *bp = buffer;
274- u_int8_t *p = data;
275- u_int8_t c1, c2;
276- while (p < data + len) {
277- c1 = *p++;
278- *bp++ = Base64Code[(c1 >> 2)];
279- c1 = (c1 & 0x03) << 4;
280- if (p >= data + len) {
281- *bp++ = Base64Code[c1];
282- break;
283- }
284- c2 = *p++;
285- c1 |= (c2 >> 4) & 0x0f;
286- *bp++ = Base64Code[c1];
287- c1 = (c2 & 0x0f) << 2;
288- if (p >= data + len) {
289- *bp++ = Base64Code[c1];
290- break;
291- }
292- c2 = *p++;
293- c1 |= (c2 >> 6) & 0x03;
294- *bp++ = Base64Code[c1];
295- *bp++ = Base64Code[c2 & 0x3f];
296- }
297- *bp = '\0';
298-}
299-#if 0
300-void
301-main()
302-{
303- char blubber[73];
304- char salt[100];
305- char *p;
306- salt[0] = '$';
307- salt[1] = BCRYPT_VERSION;
308- salt[2] = '$';
309-
310- snprintf(salt + 3, 4, "%2.2u$", 5);
311-
312- printf("24 bytes of salt: ");
313- fgets(salt + 6, sizeof(salt) - 6, stdin);
314- salt[99] = 0;
315- printf("72 bytes of password: ");
316- fpurge(stdin);
317- fgets(blubber, sizeof(blubber), stdin);
318- blubber[72] = 0;
319-
320- p = crypt(blubber, salt);
321- printf("Passwd entry: %s\n\n", p);
322-
323- p = bcrypt_gensalt(5);
324- printf("Generated salt: %s\n", p);
325- p = crypt(blubber, p);
326- printf("Passwd entry: %s\n", p);
327-}
328-#endif
ext/bcrypt.hView
@@ -1,65 +1,0 @@
1-/*
2- * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
3- * All rights reserved.
4- *
5- * Redistribution and use in source and binary forms, with or without
6- * modification, are permitted provided that the following conditions
7- * are met:
8- * 1. Redistributions of source code must retain the above copyright
9- * notice, this list of conditions and the following disclaimer.
10- * 2. Redistributions in binary form must reproduce the above copyright
11- * notice, this list of conditions and the following disclaimer in the
12- * documentation and/or other materials provided with the distribution.
13- * 3. All advertising materials mentioning features or use of this software
14- * must display the following acknowledgement:
15- * This product includes software developed by Niels Provos.
16- * 4. The name of the author may not be used to endorse or promote products
17- * derived from this software without specific prior written permission.
18- *
19- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29- */
30-
31-#ifndef _BCRYPT_H_
32-#define _BCRYPT_H_
33-
34-#define BCRYPT_VERSION '2'
35-#define BCRYPT_MAXSALT 16 /* Precomputation is just so nice */
36-#define BCRYPT_BLOCKS 6 /* Ciphertext blocks */
37-#define BCRYPT_MINROUNDS 16 /* we have log2(rounds) in salt */
38-#define BCRYPT_SALT_OUTPUT_SIZE (7 + (BCRYPT_MAXSALT * 4 + 2) / 3 + 1)
39-#define BCRYPT_OUTPUT_SIZE 128
40-
41-/*
42- * Given a logarithmic cost parameter, generates a salt for use with bcrypt().
43- *
44- * output: the computed salt will be stored here. This buffer must be
45- * at least BCRYPT_SALT_OUTPUT_SIZE bytes. The result will be
46- * null-terminated.
47- * log_rounds: the logarithmic cost.
48- * rseed: a seed of BCRYPT_MAXSALT bytes. Should be obtained from a
49- * cryptographically secure random source.
50- * Returns: output
51- */
52-char *bcrypt_gensalt(char *output, u_int8_t log_rounds, u_int8_t *rseed);
53-
54-/*
55- * Given a secret and a salt, generates a salted hash (which you can then store safely).
56- *
57- * output: the computed salted hash will be stored here. This buffer must
58- * be at least BCRYPT_OUTPUT_SIZE bytes, and will become null-terminated.
59- * key: A null-terminated secret.
60- * salt: The salt, as generated by bcrypt_gensalt().
61- * Returns: output on success, NULL on error.
62- */
63-char *bcrypt(char *output, const char *key, const char *salt);
64-
65-#endif /* _BCRYPT_H_ */
ext/mri/bcrypt.cView
@@ -1,0 +1,328 @@
1+/* $OpenBSD: bcrypt.c,v 1.22 2007/02/20 01:44:16 ray Exp $ */
2+
3+/*
4+ * Modified by <hongli@phusion.nl> on 2009-08-05:
5+ *
6+ * - Got rid of the global variables; they're not thread-safe.
7+ * Modified the functions to accept local buffers instead.
8+ *
9+ * Modified by <coda.hale@gmail.com> on 2007-02-27:
10+ *
11+ * - Changed bcrypt_gensalt to accept a random seed as a parameter,
12+ * to remove the code's dependency on arc4random(), which isn't
13+ * available on Linux.
14+ */
15+
16+/*
17+ * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
18+ * All rights reserved.
19+ *
20+ * Redistribution and use in source and binary forms, with or without
21+ * modification, are permitted provided that the following conditions
22+ * are met:
23+ * 1. Redistributions of source code must retain the above copyright
24+ * notice, this list of conditions and the following disclaimer.
25+ * 2. Redistributions in binary form must reproduce the above copyright
26+ * notice, this list of conditions and the following disclaimer in the
27+ * documentation and/or other materials provided with the distribution.
28+ * 3. All advertising materials mentioning features or use of this software
29+ * must display the following acknowledgement:
30+ * This product includes software developed by Niels Provos.
31+ * 4. The name of the author may not be used to endorse or promote products
32+ * derived from this software without specific prior written permission.
33+ *
34+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
35+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
36+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
37+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
38+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
39+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
40+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
41+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
42+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
43+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44+ */
45+
46+/* This password hashing algorithm was designed by David Mazieres
47+ * <dm@lcs.mit.edu> and works as follows:
48+ *
49+ * 1. state := InitState ()
50+ * 2. state := ExpandKey (state, salt, password) 3.
51+ * REPEAT rounds:
52+ * state := ExpandKey (state, 0, salt)
53+ * state := ExpandKey(state, 0, password)
54+ * 4. ctext := "OrpheanBeholderScryDoubt"
55+ * 5. REPEAT 64:
56+ * ctext := Encrypt_ECB (state, ctext);
57+ * 6. RETURN Concatenate (salt, ctext);
58+ *
59+ */
60+
61+#if 0
62+#include <stdio.h>
63+#endif
64+
65+#include <stdio.h>
66+#include <stdlib.h>
67+#include <sys/types.h>
68+#include <string.h>
69+#include "blf.h"
70+#include "bcrypt.h"
71+
72+/* This implementation is adaptable to current computing power.
73+ * You can have up to 2^31 rounds which should be enough for some
74+ * time to come.
75+ */
76+
77+static void encode_salt(char *, u_int8_t *, u_int16_t, u_int8_t);
78+static void encode_base64(u_int8_t *, u_int8_t *, u_int16_t);
79+static void decode_base64(u_int8_t *, u_int16_t, u_int8_t *);
80+
81+const static u_int8_t Base64Code[] =
82+"./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
83+
84+const static u_int8_t index_64[128] = {
85+ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
86+ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
87+ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
88+ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
89+ 255, 255, 255, 255, 255, 255, 0, 1, 54, 55,
90+ 56, 57, 58, 59, 60, 61, 62, 63, 255, 255,
91+ 255, 255, 255, 255, 255, 2, 3, 4, 5, 6,
92+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
93+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
94+ 255, 255, 255, 255, 255, 255, 28, 29, 30,
95+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
96+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
97+ 51, 52, 53, 255, 255, 255, 255, 255
98+};
99+#define CHAR64(c) ( (c) > 127 ? 255 : index_64[(c)])
100+
101+static void
102+decode_base64(u_int8_t *buffer, u_int16_t len, u_int8_t *data)
103+{
104+ u_int8_t *bp = buffer;
105+ u_int8_t *p = data;
106+ u_int8_t c1, c2, c3, c4;
107+ while (bp < buffer + len) {
108+ c1 = CHAR64(*p);
109+ c2 = CHAR64(*(p + 1));
110+
111+ /* Invalid data */
112+ if (c1 == 255 || c2 == 255)
113+ break;
114+
115+ *bp++ = (c1 << 2) | ((c2 & 0x30) >> 4);
116+ if (bp >= buffer + len)
117+ break;
118+
119+ c3 = CHAR64(*(p + 2));
120+ if (c3 == 255)
121+ break;
122+
123+ *bp++ = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2);
124+ if (bp >= buffer + len)
125+ break;
126+
127+ c4 = CHAR64(*(p + 3));
128+ if (c4 == 255)
129+ break;
130+ *bp++ = ((c3 & 0x03) << 6) | c4;
131+
132+ p += 4;
133+ }
134+}
135+
136+static void
137+encode_salt(char *salt, u_int8_t *csalt, u_int16_t clen, u_int8_t logr)
138+{
139+ salt[0] = '$';
140+ salt[1] = BCRYPT_VERSION;
141+ salt[2] = 'a';
142+ salt[3] = '$';
143+
144+ snprintf(salt + 4, 4, "%2.2u$", logr);
145+
146+ encode_base64((u_int8_t *) salt + 7, csalt, clen);
147+}
148+/* Generates a salt for this version of crypt.
149+ Since versions may change. Keeping this here
150+ seems sensible.
151+ */
152+
153+char *
154+bcrypt_gensalt(char *output, u_int8_t log_rounds, u_int8_t *rseed)
155+{
156+ if (log_rounds < 4)
157+ log_rounds = 4;
158+ else if (log_rounds > 31)
159+ log_rounds = 31;
160+
161+ encode_salt(output, rseed, BCRYPT_MAXSALT, log_rounds);
162+ return output;
163+}
164+/* We handle $Vers$log2(NumRounds)$salt+passwd$
165+ i.e. $2$04$iwouldntknowwhattosayetKdJ6iFtacBqJdKe6aW7ou */
166+
167+char *
168+bcrypt(char *output, const char *key, const char *salt)
169+{
170+ blf_ctx state;
171+ u_int32_t rounds, i, k;
172+ u_int16_t j;
173+ u_int8_t key_len, salt_len, logr, minor;
174+ u_int8_t ciphertext[4 * BCRYPT_BLOCKS] = "OrpheanBeholderScryDoubt";
175+ u_int8_t csalt[BCRYPT_MAXSALT];
176+ u_int32_t cdata[BCRYPT_BLOCKS];
177+ int n;
178+
179+ /* Discard "$" identifier */
180+ salt++;
181+
182+ if (*salt > BCRYPT_VERSION) {
183+ return NULL;
184+ }
185+
186+ /* Check for minor versions */
187+ if (salt[1] != '$') {
188+ switch (salt[1]) {
189+ case 'a':
190+ /* 'ab' should not yield the same as 'abab' */
191+ minor = salt[1];
192+ salt++;
193+ break;
194+ default:
195+ return NULL;
196+ }
197+ } else
198+ minor = 0;
199+
200+ /* Discard version + "$" identifier */
201+ salt += 2;
202+
203+ if (salt[2] != '$')
204+ /* Out of sync with passwd entry */
205+ return NULL;
206+
207+ /* Computer power doesn't increase linear, 2^x should be fine */
208+ n = atoi(salt);
209+ if (n > 31 || n < 0)
210+ return NULL;
211+ logr = (u_int8_t)n;
212+ if ((rounds = (u_int32_t) 1 << logr) < BCRYPT_MINROUNDS)
213+ return NULL;
214+
215+ /* Discard num rounds + "$" identifier */
216+ salt += 3;
217+
218+ if (strlen(salt) * 3 / 4 < BCRYPT_MAXSALT)
219+ return NULL;
220+
221+ /* We dont want the base64 salt but the raw data */
222+ decode_base64(csalt, BCRYPT_MAXSALT, (u_int8_t *) salt);
223+ salt_len = BCRYPT_MAXSALT;
224+ key_len = strlen(key) + (minor >= 'a' ? 1 : 0);
225+
226+ /* Setting up S-Boxes and Subkeys */
227+ Blowfish_initstate(&state);
228+ Blowfish_expandstate(&state, csalt, salt_len,
229+ (u_int8_t *) key, key_len);
230+ for (k = 0; k < rounds; k++) {
231+ Blowfish_expand0state(&state, (u_int8_t *) key, key_len);
232+ Blowfish_expand0state(&state, csalt, salt_len);
233+ }
234+
235+ /* This can be precomputed later */
236+ j = 0;
237+ for (i = 0; i < BCRYPT_BLOCKS; i++)
238+ cdata[i] = Blowfish_stream2word(ciphertext, 4 * BCRYPT_BLOCKS, &j);
239+
240+ /* Now do the encryption */
241+ for (k = 0; k < 64; k++)
242+ blf_enc(&state, cdata, BCRYPT_BLOCKS / 2);
243+
244+ for (i = 0; i < BCRYPT_BLOCKS; i++) {
245+ ciphertext[4 * i + 3] = cdata[i] & 0xff;
246+ cdata[i] = cdata[i] >> 8;
247+ ciphertext[4 * i + 2] = cdata[i] & 0xff;
248+ cdata[i] = cdata[i] >> 8;
249+ ciphertext[4 * i + 1] = cdata[i] & 0xff;
250+ cdata[i] = cdata[i] >> 8;
251+ ciphertext[4 * i + 0] = cdata[i] & 0xff;
252+ }
253+
254+
255+ i = 0;
256+ output[i++] = '$';
257+ output[i++] = BCRYPT_VERSION;
258+ if (minor)
259+ output[i++] = minor;
260+ output[i++] = '$';
261+
262+ snprintf(output + i, 4, "%2.2u$", logr);
263+
264+ encode_base64((u_int8_t *) output + i + 3, csalt, BCRYPT_MAXSALT);
265+ encode_base64((u_int8_t *) output + strlen(output), ciphertext,
266+ 4 * BCRYPT_BLOCKS - 1);
267+ return output;
268+}
269+
270+static void
271+encode_base64(u_int8_t *buffer, u_int8_t *data, u_int16_t len)
272+{
273+ u_int8_t *bp = buffer;
274+ u_int8_t *p = data;
275+ u_int8_t c1, c2;
276+ while (p < data + len) {
277+ c1 = *p++;
278+ *bp++ = Base64Code[(c1 >> 2)];
279+ c1 = (c1 & 0x03) << 4;
280+ if (p >= data + len) {
281+ *bp++ = Base64Code[c1];
282+ break;
283+ }
284+ c2 = *p++;
285+ c1 |= (c2 >> 4) & 0x0f;
286+ *bp++ = Base64Code[c1];
287+ c1 = (c2 & 0x0f) << 2;
288+ if (p >= data + len) {
289+ *bp++ = Base64Code[c1];
290+ break;
291+ }
292+ c2 = *p++;
293+ c1 |= (c2 >> 6) & 0x03;
294+ *bp++ = Base64Code[c1];
295+ *bp++ = Base64Code[c2 & 0x3f];
296+ }
297+ *bp = '\0';
298+}
299+#if 0
300+void
301+main()
302+{
303+ char blubber[73];
304+ char salt[100];
305+ char *p;
306+ salt[0] = '$';
307+ salt[1] = BCRYPT_VERSION;
308+ salt[2] = '$';
309+
310+ snprintf(salt + 3, 4, "%2.2u$", 5);
311+
312+ printf("24 bytes of salt: ");
313+ fgets(salt + 6, sizeof(salt) - 6, stdin);
314+ salt[99] = 0;
315+ printf("72 bytes of password: ");
316+ fpurge(stdin);
317+ fgets(blubber, sizeof(blubber), stdin);
318+ blubber[72] = 0;
319+
320+ p = crypt(blubber, salt);
321+ printf("Passwd entry: %s\n\n", p);
322+
323+ p = bcrypt_gensalt(5);
324+ printf("Generated salt: %s\n", p);
325+ p = crypt(blubber, p);
326+ printf("Passwd entry: %s\n", p);
327+}
328+#endif
ext/mri/bcrypt.hView
@@ -1,0 +1,65 @@
1+/*
2+ * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
3+ * All rights reserved.
4+ *
5+ * Redistribution and use in source and binary forms, with or without
6+ * modification, are permitted provided that the following conditions
7+ * are met:
8+ * 1. Redistributions of source code must retain the above copyright
9+ * notice, this list of conditions and the following disclaimer.
10+ * 2. Redistributions in binary form must reproduce the above copyright
11+ * notice, this list of conditions and the following disclaimer in the
12+ * documentation and/or other materials provided with the distribution.
13+ * 3. All advertising materials mentioning features or use of this software
14+ * must display the following acknowledgement:
15+ * This product includes software developed by Niels Provos.
16+ * 4. The name of the author may not be used to endorse or promote products
17+ * derived from this software without specific prior written permission.
18+ *
19+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29+ */
30+
31+#ifndef _BCRYPT_H_
32+#define _BCRYPT_H_
33+
34+#define BCRYPT_VERSION '2'
35+#define BCRYPT_MAXSALT 16 /* Precomputation is just so nice */
36+#define BCRYPT_BLOCKS 6 /* Ciphertext blocks */
37+#define BCRYPT_MINROUNDS 16 /* we have log2(rounds) in salt */
38+#define BCRYPT_SALT_OUTPUT_SIZE (7 + (BCRYPT_MAXSALT * 4 + 2) / 3 + 1)
39+#define BCRYPT_OUTPUT_SIZE 128
40+
41+/*
42+ * Given a logarithmic cost parameter, generates a salt for use with bcrypt().
43+ *
44+ * output: the computed salt will be stored here. This buffer must be
45+ * at least BCRYPT_SALT_OUTPUT_SIZE bytes. The result will be
46+ * null-terminated.
47+ * log_rounds: the logarithmic cost.
48+ * rseed: a seed of BCRYPT_MAXSALT bytes. Should be obtained from a
49+ * cryptographically secure random source.
50+ * Returns: output
51+ */
52+char *bcrypt_gensalt(char *output, u_int8_t log_rounds, u_int8_t *rseed);
53+
54+/*
55+ * Given a secret and a salt, generates a salted hash (which you can then store safely).
56+ *
57+ * output: the computed salted hash will be stored here. This buffer must
58+ * be at least BCRYPT_OUTPUT_SIZE bytes, and will become null-terminated.
59+ * key: A null-terminated secret.
60+ * salt: The salt, as generated by bcrypt_gensalt().
61+ * Returns: output on success, NULL on error.
62+ */
63+char *bcrypt(char *output, const char *key, const char *salt);
64+
65+#endif /* _BCRYPT_H_ */
ext/mri/bcrypt_ext.cView
@@ -1,0 +1,87 @@
1+#include "ruby.h"
2+#include "bcrypt.h"
3+
4+static VALUE mBCrypt;
5+static VALUE cBCryptEngine;
6+
7+/* Define RSTRING_PTR for Ruby 1.8.5, ruby-core's idea of a point release is
8+ insane. */
9+#ifndef RSTRING_PTR
10+# define RSTRING_PTR(s) (RSTRING(s)->ptr)
11+#endif
12+
13+#ifdef RUBY_VM
14+# define RUBY_1_9
15+#endif
16+
17+#ifdef RUBY_1_9
18+
19+ /* When on Ruby 1.9+, we will want to unlock the GIL while performing
20+ * expensive calculations, for greater concurrency. Do not do this for
21+ * cheap calculations because locking/unlocking the GIL incurs some overhead as well.
22+ */
23+ #define GIL_UNLOCK_COST_THRESHOLD 9
24+
25+ typedef struct {
26+ char *output;
27+ const char *key;
28+ const char *salt;
29+ } BCryptArguments;
30+
31+ static VALUE bcrypt_wrapper(void *_args) {
32+ BCryptArguments *args = (BCryptArguments *)_args;
33+ return (VALUE)bcrypt(args->output, args->key, args->salt);
34+ }
35+
36+#endif /* RUBY_1_9 */
37+
38+/* Given a logarithmic cost parameter, generates a salt for use with +bc_crypt+.
39+ */
40+static VALUE bc_salt(VALUE self, VALUE cost, VALUE seed) {
41+ int icost = NUM2INT(cost);
42+ char salt[BCRYPT_SALT_OUTPUT_SIZE];
43+
44+ bcrypt_gensalt(salt, icost, (u_int8_t *)RSTRING_PTR(seed));
45+ return rb_str_new2(salt);
46+}
47+
48+/* Given a secret and a salt, generates a salted hash (which you can then store safely).
49+ */
50+static VALUE bc_crypt(VALUE self, VALUE key, VALUE salt, VALUE cost) {
51+ const char * safeguarded = RSTRING_PTR(key) ? RSTRING_PTR(key) : "";
52+ char output[BCRYPT_OUTPUT_SIZE];
53+
54+ #ifdef RUBY_1_9
55+ int icost = NUM2INT(cost);
56+ if (icost >= GIL_UNLOCK_COST_THRESHOLD) {
57+ BCryptArguments args;
58+ VALUE ret;
59+
60+ args.output = output;
61+ args.key = safeguarded;
62+ args.salt = RSTRING_PTR(salt);
63+ ret = rb_thread_blocking_region(bcrypt_wrapper, &args, RUBY_UBF_IO, 0);
64+ if (ret != (VALUE) 0) {
65+ return rb_str_new2(output);
66+ } else {
67+ return Qnil;
68+ }
69+ }
70+ /* otherwise, fallback to the non-GIL-unlocking code, just like on Ruby 1.8 */
71+ #endif
72+
73+ if (bcrypt(output, safeguarded, (char *)RSTRING_PTR(salt)) != NULL) {
74+ return rb_str_new2(output);
75+ } else {
76+ return Qnil;
77+ }
78+}
79+
80+/* Create the BCrypt and BCrypt::Engine modules, and populate them with methods. */
81+void Init_bcrypt_ext(){
82+ mBCrypt = rb_define_module("BCrypt");
83+ cBCryptEngine = rb_define_class_under(mBCrypt, "Engine", rb_cObject);
84+
85+ rb_define_singleton_method(cBCryptEngine, "__bc_salt", bc_salt, 2);
86+ rb_define_singleton_method(cBCryptEngine, "__bc_crypt", bc_crypt, 3);
87+}
ext/mri/blf.hView
@@ -1,0 +1,93 @@
1+/* $OpenBSD: blf.h,v 1.6 2002/02/16 21:27:17 millert Exp $ */
2+/*
3+ * Blowfish - a fast block cipher designed by Bruce Schneier
4+ *
5+ * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
6+ * All rights reserved.
7+ *
8+ * Redistribution and use in source and binary forms, with or without
9+ * modification, are permitted provided that the following conditions
10+ * are met:
11+ * 1. Redistributions of source code must retain the above copyright
12+ * notice, this list of conditions and the following disclaimer.
13+ * 2. Redistributions in binary form must reproduce the above copyright
14+ * notice, this list of conditions and the following disclaimer in the
15+ * documentation and/or other materials provided with the distribution.
16+ * 3. All advertising materials mentioning features or use of this software
17+ * must display the following acknowledgement:
18+ * This product includes software developed by Niels Provos.
19+ * 4. The name of the author may not be used to endorse or promote products
20+ * derived from this software without specific prior written permission.
21+ *
22+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32+ */
33+
34+/* Add this type so we'll compile nicely on Solaris.
35+ Thanks to Jeremy LaTrasse and the Twitter crew. */
36+#ifdef __sun
37+ #define u_int8_t uint8_t
38+ #define u_int16_t uint16_t
39+ #define u_int32_t uint32_t
40+ #define u_int64_t uint64_t
41+#endif
42+
43+#ifndef _BLF_H_
44+#define _BLF_H_
45+
46+// Imported from pwd.h. <coda.hale@gmail.com>
47+#define _PASSWORD_LEN 128 /* max length, not counting NUL */
48+
49+/* Schneier specifies a maximum key length of 56 bytes.
50+ * This ensures that every key bit affects every cipher
51+ * bit. However, the subkeys can hold up to 72 bytes.
52+ * Warning: For normal blowfish encryption only 56 bytes
53+ * of the key affect all cipherbits.
54+ */
55+
56+#define BLF_N 16 /* Number of Subkeys */
57+#define BLF_MAXKEYLEN ((BLF_N-2)*4) /* 448 bits */
58+
59+/* Blowfish context */
60+typedef struct BlowfishContext {
61+ u_int32_t S[4][256]; /* S-Boxes */
62+ u_int32_t P[BLF_N + 2]; /* Subkeys */
63+} blf_ctx;
64+
65+/* Raw access to customized Blowfish
66+ * blf_key is just:
67+ * Blowfish_initstate( state )
68+ * Blowfish_expand0state( state, key, keylen )
69+ */
70+
71+void Blowfish_encipher(blf_ctx *, u_int32_t *, u_int32_t *);
72+void Blowfish_decipher(blf_ctx *, u_int32_t *, u_int32_t *);
73+void Blowfish_initstate(blf_ctx *);
74+void Blowfish_expand0state(blf_ctx *, const u_int8_t *, u_int16_t);
75+void Blowfish_expandstate
76+(blf_ctx *, const u_int8_t *, u_int16_t, const u_int8_t *, u_int16_t);
77+
78+/* Standard Blowfish */
79+
80+void blf_key(blf_ctx *, const u_int8_t *, u_int16_t);
81+void blf_enc(blf_ctx *, u_int32_t *, u_int16_t);
82+void blf_dec(blf_ctx *, u_int32_t *, u_int16_t);
83+
84+void blf_ecb_encrypt(blf_ctx *, u_int8_t *, u_int32_t);
85+void blf_ecb_decrypt(blf_ctx *, u_int8_t *, u_int32_t);
86+
87+void blf_cbc_encrypt(blf_ctx *, u_int8_t *, u_int8_t *, u_int32_t);
88+void blf_cbc_decrypt(blf_ctx *, u_int8_t *, u_int8_t *, u_int32_t);
89+
90+/* Converts u_int8_t to u_int32_t */
91+u_int32_t Blowfish_stream2word(const u_int8_t *, u_int16_t , u_int16_t *);
92+
93+#endif
ext/mri/blowfish.cView
@@ -1,0 +1,685 @@
1+/* $OpenBSD: blowfish.c,v 1.18 2004/11/02 17:23:26 hshoexer Exp $ */
2+/*
3+ * Blowfish block cipher for OpenBSD
4+ * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
5+ * All rights reserved.
6+ *
7+ * Implementation advice by David Mazieres <dm@lcs.mit.edu>.
8+ *
9+ * Redistribution and use in source and binary forms, with or without
10+ * modification, are permitted provided that the following conditions
11+ * are met:
12+ * 1. Redistributions of source code must retain the above copyright
13+ * notice, this list of conditions and the following disclaimer.
14+ * 2. Redistributions in binary form must reproduce the above copyright
15+ * notice, this list of conditions and the following disclaimer in the
16+ * documentation and/or other materials provided with the distribution.
17+ * 3. All advertising materials mentioning features or use of this software
18+ * must display the following acknowledgement:
19+ * This product includes software developed by Niels Provos.
20+ * 4. The name of the author may not be used to endorse or promote products
21+ * derived from this software without specific prior written permission.
22+ *
23+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33+ */
34+
35+/*
36+ * This code is derived from section 14.3 and the given source
37+ * in section V of Applied Cryptography, second edition.
38+ * Blowfish is an unpatented fast block cipher designed by
39+ * Bruce Schneier.
40+ */
41+
42+#if 0
43+#include <stdio.h> /* used for debugging */
44+#include <string.h>
45+#endif
46+
47+#include <sys/types.h>
48+#include "blf.h"
49+
50+#undef inline
51+#ifdef __GNUC__
52+#define inline __inline
53+#else /* !__GNUC__ */
54+#define inline
55+#endif /* !__GNUC__ */
56+
57+/* Function for Feistel Networks */
58+
59+#define F(s, x) ((((s)[ (((x)>>24)&0xFF)] \
60+ + (s)[0x100 + (((x)>>16)&0xFF)]) \
61+ ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \
62+ + (s)[0x300 + ( (x) &0xFF)])
63+
64+#define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])
65+
66+void
67+Blowfish_encipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
68+{
69+ u_int32_t Xl;
70+ u_int32_t Xr;
71+ u_int32_t *s = c->S[0];
72+ u_int32_t *p = c->P;
73+
74+ Xl = *xl;
75+ Xr = *xr;
76+
77+ Xl ^= p[0];
78+ BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);
79+ BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);
80+ BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);
81+ BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);
82+ BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);
83+ BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);
84+ BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);
85+ BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);
86+
87+ *xl = Xr ^ p[17];
88+ *xr = Xl;
89+}
90+
91+void
92+Blowfish_decipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
93+{
94+ u_int32_t Xl;
95+ u_int32_t Xr;
96+ u_int32_t *s = c->S[0];
97+ u_int32_t *p = c->P;
98+
99+ Xl = *xl;
100+ Xr = *xr;
101+
102+ Xl ^= p[17];
103+ BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15);
104+ BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13);
105+ BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11);
106+ BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9);
107+ BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7);
108+ BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5);
109+ BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3);
110+ BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1);
111+
112+ *xl = Xr ^ p[0];
113+ *xr = Xl;
114+}
115+
116+void
117+Blowfish_initstate(blf_ctx *c)
118+{
119+ /* P-box and S-box tables initialized with digits of Pi */
120+
121+ static const blf_ctx initstate =
122+ { {
123+ {
124+ 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
125+ 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
126+ 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
127+ 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
128+ 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
129+ 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
130+ 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
131+ 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
132+ 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
133+ 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
134+ 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
135+ 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
136+ 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
137+ 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
138+ 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
139+ 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
140+ 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
141+ 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
142+ 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
143+ 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
144+ 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
145+ 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
146+ 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
147+ 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
148+ 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
149+ 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
150+ 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
151+ 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
152+ 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
153+ 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
154+ 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
155+ 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
156+ 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
157+ 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
158+ 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
159+ 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
160+ 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
161+ 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
162+ 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
163+ 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
164+ 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
165+ 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
166+ 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
167+ 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
168+ 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
169+ 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
170+ 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
171+ 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
172+ 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
173+ 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
174+ 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
175+ 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
176+ 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
177+ 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
178+ 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
179+ 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
180+ 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
181+ 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
182+ 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
183+ 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
184+ 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
185+ 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
186+ 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
187+ 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},
188+ {
189+ 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
190+ 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
191+ 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
192+ 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
193+ 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
194+ 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
195+ 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
196+ 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
197+ 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
198+ 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
199+ 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
200+ 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
201+ 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
202+ 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
203+ 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
204+ 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
205+ 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
206+ 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
207+ 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
208+ 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
209+ 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
210+ 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
211+ 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
212+ 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
213+ 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
214+ 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
215+ 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
216+ 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
217+ 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
218+ 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
219+ 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
220+ 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
221+ 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
222+ 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
223+ 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
224+ 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
225+ 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
226+ 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
227+ 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
228+ 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
229+ 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
230+ 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
231+ 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
232+ 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
233+ 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
234+ 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
235+ 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
236+ 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
237+ 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
238+ 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
239+ 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
240+ 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
241+ 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
242+ 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
243+ 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
244+ 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
245+ 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
246+ 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
247+ 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
248+ 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
249+ 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
250+ 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
251+ 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
252+ 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},
253+ {
254+ 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
255+ 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
256+ 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
257+ 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
258+ 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
259+ 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
260+ 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
261+ 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
262+ 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
263+ 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
264+ 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
265+ 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
266+ 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
267+ 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
268+ 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
269+ 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
270+ 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
271+ 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
272+ 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
273+ 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
274+ 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
275+ 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
276+ 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
277+ 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
278+ 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
279+ 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
280+ 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
281+ 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
282+ 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
283+ 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
284+ 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
285+ 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
286+ 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
287+ 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
288+ 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
289+ 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
290+ 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
291+ 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
292+ 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
293+ 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
294+ 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
295+ 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
296+ 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
297+ 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
298+ 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
299+ 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
300+ 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
301+ 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
302+ 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
303+ 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
304+ 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
305+ 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
306+ 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
307+ 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
308+ 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
309+ 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
310+ 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
311+ 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
312+ 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
313+ 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
314+ 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
315+ 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
316+ 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
317+ 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},
318+ {
319+ 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
320+ 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
321+ 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
322+ 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
323+ 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
324+ 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
325+ 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
326+ 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
327+ 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
328+ 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
329+ 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
330+ 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
331+ 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
332+ 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
333+ 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
334+ 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
335+ 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
336+ 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
337+ 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
338+ 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
339+ 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
340+ 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
341+ 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
342+ 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
343+ 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
344+ 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
345+ 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
346+ 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
347+ 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
348+ 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
349+ 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
350+ 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
351+ 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
352+ 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
353+ 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
354+ 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
355+ 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
356+ 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
357+ 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
358+ 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
359+ 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
360+ 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
361+ 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
362+ 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
363+ 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
364+ 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
365+ 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
366+ 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
367+ 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
368+ 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
369+ 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
370+ 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
371+ 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
372+ 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
373+ 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
374+ 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
375+ 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
376+ 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
377+ 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
378+ 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
379+ 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
380+ 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
381+ 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
382+ 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}
383+ },
384+ {
385+ 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
386+ 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
387+ 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
388+ 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
389+ 0x9216d5d9, 0x8979fb1b
390+ } };
391+
392+ *c = initstate;
393+}
394+
395+u_int32_t
396+Blowfish_stream2word(const u_int8_t *data, u_int16_t databytes,
397+ u_int16_t *current)
398+{
399+ u_int8_t i;
400+ u_int16_t j;
401+ u_int32_t temp;
402+
403+ temp = 0x00000000;
404+ j = *current;
405+
406+ for (i = 0; i < 4; i++, j++) {
407+ if (j >= databytes)
408+ j = 0;
409+ temp = (temp << 8) | data[j];
410+ }
411+
412+ *current = j;
413+ return temp;
414+}
415+
416+void
417+Blowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes)
418+{
419+ u_int16_t i;
420+ u_int16_t j;
421+ u_int16_t k;
422+ u_int32_t temp;
423+ u_int32_t datal;
424+ u_int32_t datar;
425+
426+ j = 0;
427+ for (i = 0; i < BLF_N + 2; i++) {
428+ /* Extract 4 int8 to 1 int32 from keystream */
429+ temp = Blowfish_stream2word(key, keybytes, &j);
430+ c->P[i] = c->P[i] ^ temp;
431+ }
432+
433+ j = 0;
434+ datal = 0x00000000;
435+ datar = 0x00000000;
436+ for (i = 0; i < BLF_N + 2; i += 2) {
437+ Blowfish_encipher(c, &datal, &datar);
438+
439+ c->P[i] = datal;
440+ c->P[i + 1] = datar;
441+ }
442+
443+ for (i = 0; i < 4; i++) {
444+ for (k = 0; k < 256; k += 2) {
445+ Blowfish_encipher(c, &datal, &datar);
446+
447+ c->S[i][k] = datal;
448+ c->S[i][k + 1] = datar;
449+ }
450+ }
451+}
452+
453+
454+void
455+Blowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes,
456+ const u_int8_t *key, u_int16_t keybytes)
457+{
458+ u_int16_t i;
459+ u_int16_t j;
460+ u_int16_t k;
461+ u_int32_t temp;
462+ u_int32_t datal;
463+ u_int32_t datar;
464+
465+ j = 0;
466+ for (i = 0; i < BLF_N + 2; i++) {
467+ /* Extract 4 int8 to 1 int32 from keystream */
468+ temp = Blowfish_stream2word(key, keybytes, &j);
469+ c->P[i] = c->P[i] ^ temp;
470+ }
471+
472+ j = 0;
473+ datal = 0x00000000;
474+ datar = 0x00000000;
475+ for (i = 0; i < BLF_N + 2; i += 2) {
476+ datal ^= Blowfish_stream2word(data, databytes, &j);
477+ datar ^= Blowfish_stream2word(data, databytes, &j);
478+ Blowfish_encipher(c, &datal, &datar);
479+
480+ c->P[i] = datal;
481+ c->P[i + 1] = datar;
482+ }
483+
484+ for (i = 0; i < 4; i++) {
485+ for (k = 0; k < 256; k += 2) {
486+ datal ^= Blowfish_stream2word(data, databytes, &j);
487+ datar ^= Blowfish_stream2word(data, databytes, &j);
488+ Blowfish_encipher(c, &datal, &datar);
489+
490+ c->S[i][k] = datal;
491+ c->S[i][k + 1] = datar;
492+ }
493+ }
494+
495+}
496+
497+void
498+blf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len)
499+{
500+ /* Initialize S-boxes and subkeys with Pi */
501+ Blowfish_initstate(c);
502+
503+ /* Transform S-boxes and subkeys with key */
504+ Blowfish_expand0state(c, k, len);
505+}
506+
507+void
508+blf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
509+{
510+ u_int32_t *d;
511+ u_int16_t i;
512+
513+ d = data;
514+ for (i = 0; i < blocks; i++) {
515+ Blowfish_encipher(c, d, d + 1);
516+ d += 2;
517+ }
518+}
519+
520+void
521+blf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
522+{
523+ u_int32_t *d;
524+ u_int16_t i;
525+
526+ d = data;
527+ for (i = 0; i < blocks; i++) {
528+ Blowfish_decipher(c, d, d + 1);
529+ d += 2;
530+ }
531+}
532+
533+void
534+blf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
535+{
536+ u_int32_t l, r;
537+ u_int32_t i;
538+
539+ for (i = 0; i < len; i += 8) {
540+ l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
541+ r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
542+ Blowfish_encipher(c, &l, &r);
543+ data[0] = l >> 24 & 0xff;
544+ data[1] = l >> 16 & 0xff;
545+ data[2] = l >> 8 & 0xff;
546+ data[3] = l & 0xff;
547+ data[4] = r >> 24 & 0xff;
548+ data[5] = r >> 16 & 0xff;
549+ data[6] = r >> 8 & 0xff;
550+ data[7] = r & 0xff;
551+ data += 8;
552+ }
553+}
554+
555+void
556+blf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
557+{
558+ u_int32_t l, r;
559+ u_int32_t i;
560+
561+ for (i = 0; i < len; i += 8) {
562+ l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
563+ r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
564+ Blowfish_decipher(c, &l, &r);
565+ data[0] = l >> 24 & 0xff;
566+ data[1] = l >> 16 & 0xff;
567+ data[2] = l >> 8 & 0xff;
568+ data[3] = l & 0xff;
569+ data[4] = r >> 24 & 0xff;
570+ data[5] = r >> 16 & 0xff;
571+ data[6] = r >> 8 & 0xff;
572+ data[7] = r & 0xff;
573+ data += 8;
574+ }
575+}
576+
577+void
578+blf_cbc_encrypt(blf_ctx *c, u_int8_t *iv, u_int8_t *data, u_int32_t len)
579+{
580+ u_int32_t l, r;
581+ u_int32_t i, j;
582+
583+ for (i = 0; i < len; i += 8) {
584+ for (j = 0; j < 8; j++)
585+ data[j] ^= iv[j];
586+ l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
587+ r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
588+ Blowfish_encipher(c, &l, &r);
589+ data[0] = l >> 24 & 0xff;
590+ data[1] = l >> 16 & 0xff;
591+ data[2] = l >> 8 & 0xff;
592+ data[3] = l & 0xff;
593+ data[4] = r >> 24 & 0xff;
594+ data[5] = r >> 16 & 0xff;
595+ data[6] = r >> 8 & 0xff;
596+ data[7] = r & 0xff;
597+ iv = data;
598+ data += 8;
599+ }
600+}
601+
602+void
603+blf_cbc_decrypt(blf_ctx *c, u_int8_t *iva, u_int8_t *data, u_int32_t len)
604+{
605+ u_int32_t l, r;
606+ u_int8_t *iv;
607+ u_int32_t i, j;
608+
609+ iv = data + len - 16;
610+ data = data + len - 8;
611+ for (i = len - 8; i >= 8; i -= 8) {
612+ l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
613+ r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
614+ Blowfish_decipher(c, &l, &r);
615+ data[0] = l >> 24 & 0xff;
616+ data[1] = l >> 16 & 0xff;
617+ data[2] = l >> 8 & 0xff;
618+ data[3] = l & 0xff;
619+ data[4] = r >> 24 & 0xff;
620+ data[5] = r >> 16 & 0xff;
621+ data[6] = r >> 8 & 0xff;
622+ data[7] = r & 0xff;
623+ for (j = 0; j < 8; j++)
624+ data[j] ^= iv[j];
625+ iv -= 8;
626+ data -= 8;
627+ }
628+ l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
629+ r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
630+ Blowfish_decipher(c, &l, &r);
631+ data[0] = l >> 24 & 0xff;
632+ data[1] = l >> 16 & 0xff;
633+ data[2] = l >> 8 & 0xff;
634+ data[3] = l & 0xff;
635+ data[4] = r >> 24 & 0xff;
636+ data[5] = r >> 16 & 0xff;
637+ data[6] = r >> 8 & 0xff;
638+ data[7] = r & 0xff;
639+ for (j = 0; j < 8; j++)
640+ data[j] ^= iva[j];
641+}
642+
643+#if 0
644+void
645+report(u_int32_t data[], u_int16_t len)
646+{
647+ u_int16_t i;
648+ for (i = 0; i < len; i += 2)
649+ printf("Block %0hd: %08lx %08lx.\n",
650+ i / 2, data[i], data[i + 1]);
651+}
652+void
653+main(void)
654+{
655+
656+ blf_ctx c;
657+ char key[] = "AAAAA";
658+ char key2[] = "abcdefghijklmnopqrstuvwxyz";
659+
660+ u_int32_t data[10];
661+ u_int32_t data2[] =
662+ {0x424c4f57l, 0x46495348l};
663+
664+ u_int16_t i;
665+
666+ /* First test */
667+ for (i = 0; i < 10; i++)
668+ data[i] = i;
669+
670+ blf_key(&c, (u_int8_t *) key, 5);
671+ blf_enc(&c, data, 5);
672+ blf_dec(&c, data, 1);
673+ blf_dec(&c, data + 2, 4);
674+ printf("Should read as 0 - 9.\n");
675+ report(data, 10);
676+
677+ /* Second test */
678+ blf_key(&c, (u_int8_t *) key2, strlen(key2));
679+ blf_enc(&c, data2, 1);
680+ printf("\nShould read as: 0x324ed0fe 0xf413a203.\n");
681+ report(data2, 2);
682+ blf_dec(&c, data2, 1);
683+ report(data2, 2);
684+}
685+#endif
ext/mri/extconf.rbView
@@ -1,0 +1,18 @@
1+if RUBY_PLATFORM == "java"
2+ # Don't do anything when run in JRuby; this allows gem installation to pass.
3+ # We need to write a dummy Makefile so that RubyGems doesn't think compilation
4+ # failed.
5+ File.open('Makefile', 'w') do |f|
6+ f.puts "all:"
7+ f.puts "\t@true"
8+ f.puts "install:"
9+ f.puts "\t@true"
10+ end
11+ exit 0
12+else
13+ require "mkmf"
14+ dir_config("bcrypt_ext")
15+ # enable this when we're feeling nitpicky
16+ # CONFIG['CC'] << " -Wall "
17+ create_makefile("bcrypt_ext")
18+end
ext/bcrypt_ext.cView
@@ -1,87 +1,0 @@
1-#include "ruby.h"
2-#include "bcrypt.h"
3-
4-static VALUE mBCrypt;
5-static VALUE cBCryptEngine;
6-
7-/* Define RSTRING_PTR for Ruby 1.8.5, ruby-core's idea of a point release is
8- insane. */
9-#ifndef RSTRING_PTR
10-# define RSTRING_PTR(s) (RSTRING(s)->ptr)
11-#endif
12-
13-#ifdef RUBY_VM
14-# define RUBY_1_9
15-#endif
16-
17-#ifdef RUBY_1_9
18-
19- /* When on Ruby 1.9+, we will want to unlock the GIL while performing
20- * expensive calculations, for greater concurrency. Do not do this for
21- * cheap calculations because locking/unlocking the GIL incurs some overhead as well.
22- */
23- #define GIL_UNLOCK_COST_THRESHOLD 9
24-
25- typedef struct {
26- char *output;
27- const char *key;
28- const char *salt;
29- } BCryptArguments;
30-
31- static VALUE bcrypt_wrapper(void *_args) {
32- BCryptArguments *args = (BCryptArguments *)_args;
33- return (VALUE)bcrypt(args->output, args->key, args->salt);
34- }
35-
36-#endif /* RUBY_1_9 */
37-
38-/* Given a logarithmic cost parameter, generates a salt for use with +bc_crypt+.
39- */
40-static VALUE bc_salt(VALUE self, VALUE cost, VALUE seed) {
41- int icost = NUM2INT(cost);
42- char salt[BCRYPT_SALT_OUTPUT_SIZE];
43-
44- bcrypt_gensalt(salt, icost, (u_int8_t *)RSTRING_PTR(seed));
45- return rb_str_new2(salt);
46-}
47-
48-/* Given a secret and a salt, generates a salted hash (which you can then store safely).
49- */
50-static VALUE bc_crypt(VALUE self, VALUE key, VALUE salt, VALUE cost) {
51- const char * safeguarded = RSTRING_PTR(key) ? RSTRING_PTR(key) : "";
52- char output[BCRYPT_OUTPUT_SIZE];
53-
54- #ifdef RUBY_1_9
55- int icost = NUM2INT(cost);
56- if (icost >= GIL_UNLOCK_COST_THRESHOLD) {
57- BCryptArguments args;
58- VALUE ret;
59-
60- args.output = output;
61- args.key = safeguarded;
62- args.salt = RSTRING_PTR(salt);
63- ret = rb_thread_blocking_region(bcrypt_wrapper, &args, RUBY_UBF_IO, 0);
64- if (ret != (VALUE) 0) {
65- return rb_str_new2(output);
66- } else {
67- return Qnil;
68- }
69- }
70- /* otherwise, fallback to the non-GIL-unlocking code, just like on Ruby 1.8 */
71- #endif
72-
73- if (bcrypt(output, safeguarded, (char *)RSTRING_PTR(salt)) != NULL) {
74- return rb_str_new2(output);
75- } else {
76- return Qnil;
77- }
78-}
79-
80-/* Create the BCrypt and BCrypt::Engine modules, and populate them with methods. */
81-void Init_bcrypt_ext(){
82- mBCrypt = rb_define_module("BCrypt");
83- cBCryptEngine = rb_define_class_under(mBCrypt, "Engine", rb_cObject);
84-
85- rb_define_singleton_method(cBCryptEngine, "__bc_salt", bc_salt, 2);
86- rb_define_singleton_method(cBCryptEngine, "__bc_crypt", bc_crypt, 3);
87-}
ext/blf.hView
@@ -1,93 +1,0 @@
1-/* $OpenBSD: blf.h,v 1.6 2002/02/16 21:27:17 millert Exp $ */
2-/*
3- * Blowfish - a fast block cipher designed by Bruce Schneier
4- *
5- * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
6- * All rights reserved.
7- *
8- * Redistribution and use in source and binary forms, with or without
9- * modification, are permitted provided that the following conditions
10- * are met:
11- * 1. Redistributions of source code must retain the above copyright
12- * notice, this list of conditions and the following disclaimer.
13- * 2. Redistributions in binary form must reproduce the above copyright
14- * notice, this list of conditions and the following disclaimer in the
15- * documentation and/or other materials provided with the distribution.
16- * 3. All advertising materials mentioning features or use of this software
17- * must display the following acknowledgement:
18- * This product includes software developed by Niels Provos.
19- * 4. The name of the author may not be used to endorse or promote products
20- * derived from this software without specific prior written permission.
21- *
22- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32- */
33-
34-/* Add this type so we'll compile nicely on Solaris.
35- Thanks to Jeremy LaTrasse and the Twitter crew. */
36-#ifdef __sun
37- #define u_int8_t uint8_t
38- #define u_int16_t uint16_t
39- #define u_int32_t uint32_t
40- #define u_int64_t uint64_t
41-#endif
42-
43-#ifndef _BLF_H_
44-#define _BLF_H_
45-
46-// Imported from pwd.h. <coda.hale@gmail.com>
47-#define _PASSWORD_LEN 128 /* max length, not counting NUL */
48-
49-/* Schneier specifies a maximum key length of 56 bytes.
50- * This ensures that every key bit affects every cipher
51- * bit. However, the subkeys can hold up to 72 bytes.
52- * Warning: For normal blowfish encryption only 56 bytes
53- * of the key affect all cipherbits.
54- */
55-
56-#define BLF_N 16 /* Number of Subkeys */
57-#define BLF_MAXKEYLEN ((BLF_N-2)*4) /* 448 bits */
58-
59-/* Blowfish context */
60-typedef struct BlowfishContext {
61- u_int32_t S[4][256]; /* S-Boxes */
62- u_int32_t P[BLF_N + 2]; /* Subkeys */
63-} blf_ctx;
64-
65-/* Raw access to customized Blowfish
66- * blf_key is just:
67- * Blowfish_initstate( state )
68- * Blowfish_expand0state( state, key, keylen )
69- */
70-
71-void Blowfish_encipher(blf_ctx *, u_int32_t *, u_int32_t *);
72-void Blowfish_decipher(blf_ctx *, u_int32_t *, u_int32_t *);
73-void Blowfish_initstate(blf_ctx *);
74-void Blowfish_expand0state(blf_ctx *, const u_int8_t *, u_int16_t);
75-void Blowfish_expandstate
76-(blf_ctx *, const u_int8_t *, u_int16_t, const u_int8_t *, u_int16_t);
77-
78-/* Standard Blowfish */
79-
80-void blf_key(blf_ctx *, const u_int8_t *, u_int16_t);
81-void blf_enc(blf_ctx *, u_int32_t *, u_int16_t);
82-void blf_dec(blf_ctx *, u_int32_t *, u_int16_t);
83-
84-void blf_ecb_encrypt(blf_ctx *, u_int8_t *, u_int32_t);
85-void blf_ecb_decrypt(blf_ctx *, u_int8_t *, u_int32_t);
86-
87-void blf_cbc_encrypt(blf_ctx *, u_int8_t *, u_int8_t *, u_int32_t);
88-void blf_cbc_decrypt(blf_ctx *, u_int8_t *, u_int8_t *, u_int32_t);
89-
90-/* Converts u_int8_t to u_int32_t */
91-u_int32_t Blowfish_stream2word(const u_int8_t *, u_int16_t , u_int16_t *);
92-
93-#endif
ext/blowfish.cView
@@ -1,685 +1,0 @@
1-/* $OpenBSD: blowfish.c,v 1.18 2004/11/02 17:23:26 hshoexer Exp $ */
2-/*
3- * Blowfish block cipher for OpenBSD
4- * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
5- * All rights reserved.
6- *
7- * Implementation advice by David Mazieres <dm@lcs.mit.edu>.
8- *
9- * Redistribution and use in source and binary forms, with or without
10- * modification, are permitted provided that the following conditions
11- * are met:
12- * 1. Redistributions of source code must retain the above copyright
13- * notice, this list of conditions and the following disclaimer.
14- * 2. Redistributions in binary form must reproduce the above copyright
15- * notice, this list of conditions and the following disclaimer in the
16- * documentation and/or other materials provided with the distribution.
17- * 3. All advertising materials mentioning features or use of this software
18- * must display the following acknowledgement:
19- * This product includes software developed by Niels Provos.
20- * 4. The name of the author may not be used to endorse or promote products
21- * derived from this software without specific prior written permission.
22- *
23- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33- */
34-
35-/*
36- * This code is derived from section 14.3 and the given source
37- * in section V of Applied Cryptography, second edition.
38- * Blowfish is an unpatented fast block cipher designed by
39- * Bruce Schneier.
40- */
41-
42-#if 0
43-#include <stdio.h> /* used for debugging */
44-#include <string.h>
45-#endif
46-
47-#include <sys/types.h>
48-#include "blf.h"
49-
50-#undef inline
51-#ifdef __GNUC__
52-#define inline __inline
53-#else /* !__GNUC__ */
54-#define inline
55-#endif /* !__GNUC__ */
56-
57-/* Function for Feistel Networks */
58-
59-#define F(s, x) ((((s)[ (((x)>>24)&0xFF)] \
60- + (s)[0x100 + (((x)>>16)&0xFF)]) \
61- ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \
62- + (s)[0x300 + ( (x) &0xFF)])
63-
64-#define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])
65-
66-void
67-Blowfish_encipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
68-{
69- u_int32_t Xl;
70- u_int32_t Xr;
71- u_int32_t *s = c->S[0];
72- u_int32_t *p = c->P;
73-
74- Xl = *xl;
75- Xr = *xr;
76-
77- Xl ^= p[0];
78- BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);
79- BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);
80- BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);
81- BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);
82- BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);
83- BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);
84- BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);
85- BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);
86-
87- *xl = Xr ^ p[17];
88- *xr = Xl;
89-}
90-
91-void
92-Blowfish_decipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
93-{
94- u_int32_t Xl;
95- u_int32_t Xr;
96- u_int32_t *s = c->S[0];
97- u_int32_t *p = c->P;
98-
99- Xl = *xl;
100- Xr = *xr;
101-
102- Xl ^= p[17];
103- BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15);
104- BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13);
105- BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11);
106- BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9);
107- BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7);
108- BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5);
109- BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3);
110- BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1);
111-
112- *xl = Xr ^ p[0];
113- *xr = Xl;
114-}
115-
116-void
117-Blowfish_initstate(blf_ctx *c)
118-{
119- /* P-box and S-box tables initialized with digits of Pi */
120-
121- static const blf_ctx initstate =
122- { {
123- {
124- 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
125- 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
126- 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
127- 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
128- 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
129- 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
130- 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
131- 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
132- 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
133- 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
134- 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
135- 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
136- 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
137- 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
138- 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
139- 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
140- 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
141- 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
142- 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
143- 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
144- 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
145- 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
146- 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
147- 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
148- 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
149- 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
150- 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
151- 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
152- 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
153- 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
154- 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
155- 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
156- 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
157- 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
158- 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
159- 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
160- 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
161- 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
162- 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
163- 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
164- 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
165- 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
166- 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
167- 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
168- 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
169- 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
170- 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
171- 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
172- 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
173- 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
174- 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
175- 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
176- 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
177- 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
178- 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
179- 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
180- 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
181- 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
182- 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
183- 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
184- 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
185- 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
186- 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
187- 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},
188- {
189- 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
190- 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
191- 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
192- 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
193- 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
194- 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
195- 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
196- 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
197- 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
198- 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
199- 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
200- 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
201- 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
202- 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
203- 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
204- 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
205- 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
206- 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
207- 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
208- 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
209- 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
210- 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
211- 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
212- 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
213- 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
214- 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
215- 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
216- 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
217- 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
218- 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
219- 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
220- 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
221- 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
222- 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
223- 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
224- 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
225- 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
226- 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
227- 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
228- 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
229- 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
230- 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
231- 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
232- 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
233- 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
234- 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
235- 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
236- 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
237- 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
238- 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
239- 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
240- 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
241- 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
242- 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
243- 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
244- 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
245- 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
246- 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
247- 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
248- 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
249- 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
250- 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
251- 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
252- 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},
253- {
254- 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
255- 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
256- 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
257- 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
258- 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
259- 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
260- 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
261- 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
262- 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
263- 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
264- 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
265- 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
266- 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
267- 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
268- 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
269- 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
270- 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
271- 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
272- 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
273- 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
274- 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
275- 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
276- 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
277- 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
278- 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
279- 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
280- 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
281- 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
282- 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
283- 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
284- 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
285- 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
286- 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
287- 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
288- 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
289- 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
290- 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
291- 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
292- 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
293- 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
294- 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
295- 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
296- 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
297- 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
298- 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
299- 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
300- 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
301- 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
302- 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
303- 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
304- 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
305- 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
306- 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
307- 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
308- 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
309- 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
310- 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
311- 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
312- 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
313- 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
314- 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
315- 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
316- 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
317- 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},
318- {
319- 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
320- 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
321- 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
322- 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
323- 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
324- 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
325- 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
326- 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
327- 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
328- 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
329- 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
330- 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
331- 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
332- 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
333- 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
334- 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
335- 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
336- 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
337- 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
338- 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
339- 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
340- 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
341- 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
342- 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
343- 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
344- 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
345- 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
346- 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
347- 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
348- 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
349- 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
350- 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
351- 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
352- 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
353- 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
354- 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
355- 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
356- 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
357- 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
358- 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
359- 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
360- 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
361- 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
362- 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
363- 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
364- 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
365- 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
366- 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
367- 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
368- 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
369- 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
370- 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
371- 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
372- 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
373- 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
374- 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
375- 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
376- 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
377- 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
378- 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
379- 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
380- 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
381- 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
382- 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}
383- },
384- {
385- 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
386- 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
387- 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
388- 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
389- 0x9216d5d9, 0x8979fb1b
390- } };
391-
392- *c = initstate;
393-}
394-
395-u_int32_t
396-Blowfish_stream2word(const u_int8_t *data, u_int16_t databytes,
397- u_int16_t *current)
398-{
399- u_int8_t i;
400- u_int16_t j;
401- u_int32_t temp;
402-
403- temp = 0x00000000;
404- j = *current;
405-
406- for (i = 0; i < 4; i++, j++) {
407- if (j >= databytes)
408- j = 0;
409- temp = (temp << 8) | data[j];
410- }
411-
412- *current = j;
413- return temp;
414-}
415-
416-void
417-Blowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes)
418-{
419- u_int16_t i;
420- u_int16_t j;
421- u_int16_t k;
422- u_int32_t temp;
423- u_int32_t datal;
424- u_int32_t datar;
425-
426- j = 0;
427- for (i = 0; i < BLF_N + 2; i++) {
428- /* Extract 4 int8 to 1 int32 from keystream */
429- temp = Blowfish_stream2word(key, keybytes, &j);
430- c->P[i] = c->P[i] ^ temp;
431- }
432-
433- j = 0;
434- datal = 0x00000000;
435- datar = 0x00000000;
436- for (i = 0; i < BLF_N + 2; i += 2) {
437- Blowfish_encipher(c, &datal, &datar);
438-
439- c->P[i] = datal;
440- c->P[i + 1] = datar;
441- }
442-
443- for (i = 0; i < 4; i++) {
444- for (k = 0; k < 256; k += 2) {
445- Blowfish_encipher(c, &datal, &datar);
446-
447- c->S[i][k] = datal;
448- c->S[i][k + 1] = datar;
449- }
450- }
451-}
452-
453-
454-void
455-Blowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes,
456- const u_int8_t *key, u_int16_t keybytes)
457-{
458- u_int16_t i;
459- u_int16_t j;
460- u_int16_t k;
461- u_int32_t temp;
462- u_int32_t datal;
463- u_int32_t datar;
464-
465- j = 0;
466- for (i = 0; i < BLF_N + 2; i++) {
467- /* Extract 4 int8 to 1 int32 from keystream */
468- temp = Blowfish_stream2word(key, keybytes, &j);
469- c->P[i] = c->P[i] ^ temp;
470- }
471-
472- j = 0;
473- datal = 0x00000000;
474- datar = 0x00000000;
475- for (i = 0; i < BLF_N + 2; i += 2) {
476- datal ^= Blowfish_stream2word(data, databytes, &j);
477- datar ^= Blowfish_stream2word(data, databytes, &j);
478- Blowfish_encipher(c, &datal, &datar);
479-
480- c->P[i] = datal;
481- c->P[i + 1] = datar;
482- }
483-
484- for (i = 0; i < 4; i++) {
485- for (k = 0; k < 256; k += 2) {
486- datal ^= Blowfish_stream2word(data, databytes, &j);
487- datar ^= Blowfish_stream2word(data, databytes, &j);
488- Blowfish_encipher(c, &datal, &datar);
489-
490- c->S[i][k] = datal;
491- c->S[i][k + 1] = datar;
492- }
493- }
494-
495-}
496-
497-void
498-blf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len)
499-{
500- /* Initialize S-boxes and subkeys with Pi */
501- Blowfish_initstate(c);
502-
503- /* Transform S-boxes and subkeys with key */
504- Blowfish_expand0state(c, k, len);
505-}
506-
507-void
508-blf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
509-{
510- u_int32_t *d;
511- u_int16_t i;
512-
513- d = data;
514- for (i = 0; i < blocks; i++) {
515- Blowfish_encipher(c, d, d + 1);
516- d += 2;
517- }
518-}
519-
520-void
521-blf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
522-{
523- u_int32_t *d;
524- u_int16_t i;
525-
526- d = data;
527- for (i = 0; i < blocks; i++) {
528- Blowfish_decipher(c, d, d + 1);
529- d += 2;
530- }
531-}
532-
533-void
534-blf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
535-{
536- u_int32_t l, r;
537- u_int32_t i;
538-
539- for (i = 0; i < len; i += 8) {
540- l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
541- r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
542- Blowfish_encipher(c, &l, &r);
543- data[0] = l >> 24 & 0xff;
544- data[1] = l >> 16 & 0xff;
545- data[2] = l >> 8 & 0xff;
546- data[3] = l & 0xff;
547- data[4] = r >> 24 & 0xff;
548- data[5] = r >> 16 & 0xff;
549- data[6] = r >> 8 & 0xff;
550- data[7] = r & 0xff;
551- data += 8;
552- }
553-}
554-
555-void
556-blf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
557-{
558- u_int32_t l, r;
559- u_int32_t i;
560-
561- for (i = 0; i < len; i += 8) {
562- l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
563- r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
564- Blowfish_decipher(c, &l, &r);
565- data[0] = l >> 24 & 0xff;
566- data[1] = l >> 16 & 0xff;
567- data[2] = l >> 8 & 0xff;
568- data[3] = l & 0xff;
569- data[4] = r >> 24 & 0xff;
570- data[5] = r >> 16 & 0xff;
571- data[6] = r >> 8 & 0xff;
572- data[7] = r & 0xff;
573- data += 8;
574- }
575-}
576-
577-void
578-blf_cbc_encrypt(blf_ctx *c, u_int8_t *iv, u_int8_t *data, u_int32_t len)
579-{
580- u_int32_t l, r;
581- u_int32_t i, j;
582-
583- for (i = 0; i < len; i += 8) {
584- for (j = 0; j < 8; j++)
585- data[j] ^= iv[j];
586- l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
587- r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
588- Blowfish_encipher(c, &l, &r);
589- data[0] = l >> 24 & 0xff;
590- data[1] = l >> 16 & 0xff;
591- data[2] = l >> 8 & 0xff;
592- data[3] = l & 0xff;
593- data[4] = r >> 24 & 0xff;
594- data[5] = r >> 16 & 0xff;
595- data[6] = r >> 8 & 0xff;
596- data[7] = r & 0xff;
597- iv = data;
598- data += 8;
599- }
600-}
601-
602-void
603-blf_cbc_decrypt(blf_ctx *c, u_int8_t *iva, u_int8_t *data, u_int32_t len)
604-{
605- u_int32_t l, r;
606- u_int8_t *iv;
607- u_int32_t i, j;
608-
609- iv = data + len - 16;
610- data = data + len - 8;
611- for (i = len - 8; i >= 8; i -= 8) {
612- l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
613- r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
614- Blowfish_decipher(c, &l, &r);
615- data[0] = l >> 24 & 0xff;
616- data[1] = l >> 16 & 0xff;
617- data[2] = l >> 8 & 0xff;
618- data[3] = l & 0xff;
619- data[4] = r >> 24 & 0xff;
620- data[5] = r >> 16 & 0xff;
621- data[6] = r >> 8 & 0xff;
622- data[7] = r & 0xff;
623- for (j = 0; j < 8; j++)
624- data[j] ^= iv[j];
625- iv -= 8;
626- data -= 8;
627- }
628- l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
629- r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
630- Blowfish_decipher(c, &l, &r);
631- data[0] = l >> 24 & 0xff;
632- data[1] = l >> 16 & 0xff;
633- data[2] = l >> 8 & 0xff;
634- data[3] = l & 0xff;
635- data[4] = r >> 24 & 0xff;
636- data[5] = r >> 16 & 0xff;
637- data[6] = r >> 8 & 0xff;
638- data[7] = r & 0xff;
639- for (j = 0; j < 8; j++)
640- data[j] ^= iva[j];
641-}
642-
643-#if 0
644-void
645-report(u_int32_t data[], u_int16_t len)
646-{
647- u_int16_t i;
648- for (i = 0; i < len; i += 2)
649- printf("Block %0hd: %08lx %08lx.\n",
650- i / 2, data[i], data[i + 1]);
651-}
652-void
653-main(void)
654-{
655-
656- blf_ctx c;
657- char key[] = "AAAAA";
658- char key2[] = "abcdefghijklmnopqrstuvwxyz";
659-
660- u_int32_t data[10];
661- u_int32_t data2[] =
662- {0x424c4f57l, 0x46495348l};
663-
664- u_int16_t i;
665-
666- /* First test */
667- for (i = 0; i < 10; i++)
668- data[i] = i;
669-
670- blf_key(&c, (u_int8_t *) key, 5);
671- blf_enc(&c, data, 5);
672- blf_dec(&c, data, 1);
673- blf_dec(&c, data + 2, 4);
674- printf("Should read as 0 - 9.\n");
675- report(data, 10);
676-
677- /* Second test */
678- blf_key(&c, (u_int8_t *) key2, strlen(key2));
679- blf_enc(&c, data2, 1);
680- printf("\nShould read as: 0x324ed0fe 0xf413a203.\n");
681- report(data2, 2);
682- blf_dec(&c, data2, 1);
683- report(data2, 2);
684-}
685-#endif
ext/extconf.rbView
@@ -1,18 +1,0 @@
1-if RUBY_PLATFORM == "java"
2- # Don't do anything when run in JRuby; this allows gem installation to pass.
3- # We need to write a dummy Makefile so that RubyGems doesn't think compilation
4- # failed.
5- File.open('Makefile', 'w') do |f|
6- f.puts "all:"
7- f.puts "\t@true"
8- f.puts "install:"
9- f.puts "\t@true"
10- end
11- exit 0
12-else
13- require "mkmf"
14- dir_config("bcrypt_ext")
15- # enable this when we're feeling nitpicky
16- # CONFIG['CC'] << " -Wall "
17- create_makefile("bcrypt_ext")
18-end
lib/bcrypt.rbView
@@ -3,10 +3,9 @@
33 if RUBY_PLATFORM == "java"
44 require 'java'
55 $CLASSPATH << File.expand_path(File.join(File.dirname(__FILE__), "..", "ext", "jruby"))
66 else
7- $LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", "ext")))
8- puts $LOAD_PATH
7+ $LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", "ext", "mri")))
98 require "bcrypt_ext"
109 require "openssl"
1110 end
1211

Built with git-ssb-web