Rev 50 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
47 | holmgren | 1 | #! /bin/sh /usr/share/dpatch/dpatch-run |
2 | ## 02_smartlink_rpath.dpatch |
||
3 | ## |
||
4 | ## DP: Patch from CVS to make the Nettle module compile with Nettle 2.0 |
||
5 | |||
6 | @DPATCH@ |
||
7 | |||
8 | diff -urad Pike-v7.8.316/src/post_modules/Nettle/acconfig.h pike-cvs/7.8/src/post_modules/Nettle/acconfig.h |
||
9 | --- Pike-v7.8.316/src/post_modules/Nettle/acconfig.h 2004-02-21 06:07:35.000000000 +0100 |
||
10 | +++ pike-cvs/7.8/src/post_modules/Nettle/acconfig.h 2009-07-02 18:35:38.000000000 +0200 |
||
11 | @@ -1 +1,5 @@ |
||
12 | +/* Define this if your struct yarrow256_ctx has the field seed_file. */ |
||
13 | +#undef HAVE_STRUCT_YARROW256_CTX_SEED_FILE |
||
14 | |||
15 | +/* Define this if the nettle_crypt_func typedef is a pointer type. */ |
||
16 | +#undef HAVE_NETTLE_CRYPT_FUNC_IS_POINTER |
||
17 | diff -urad Pike-v7.8.316/src/post_modules/Nettle/cipher.cmod pike-cvs/7.8/src/post_modules/Nettle/cipher.cmod |
||
18 | --- Pike-v7.8.316/src/post_modules/Nettle/cipher.cmod 2008-07-31 16:52:27.000000000 +0200 |
||
19 | +++ pike-cvs/7.8/src/post_modules/Nettle/cipher.cmod 2009-07-02 18:35:38.000000000 +0200 |
||
20 | @@ -65,6 +65,13 @@ |
||
21 | /* Force means to use key even if it is weak */ |
||
22 | int force); |
||
23 | |||
24 | +#ifdef HAVE_NETTLE_CRYPT_FUNC_IS_POINTER |
||
25 | +typedef nettle_crypt_func crypt_func; |
||
26 | +#else |
||
27 | +/* Nettle 2.0 */ |
||
28 | +typedef nettle_crypt_func *crypt_func; |
||
29 | +#endif |
||
30 | + |
||
31 | struct pike_cipher |
||
32 | { |
||
33 | const char *name; |
||
34 | @@ -79,8 +86,8 @@ |
||
35 | pike_nettle_set_key_func set_encrypt_key; |
||
36 | pike_nettle_set_key_func set_decrypt_key; |
||
37 | |||
38 | - nettle_crypt_func encrypt; |
||
39 | - nettle_crypt_func decrypt; |
||
40 | + crypt_func encrypt; |
||
41 | + crypt_func decrypt; |
||
42 | }; |
||
43 | |||
44 | #define _PIKE_CIPHER(name, NAME) { \ |
||
45 | @@ -90,8 +97,8 @@ |
||
46 | NAME##_KEY_SIZE, \ |
||
47 | pike_##name##_set_encrypt_key, \ |
||
48 | pike_##name##_set_decrypt_key, \ |
||
49 | - (nettle_crypt_func) name##_encrypt, \ |
||
50 | - (nettle_crypt_func) name##_decrypt, \ |
||
51 | + (crypt_func) name##_encrypt, \ |
||
52 | + (crypt_func) name##_decrypt, \ |
||
53 | } |
||
54 | |||
55 | /*! @class CipherInfo |
||
56 | @@ -175,7 +182,7 @@ |
||
57 | PIKECLASS CipherState |
||
58 | { |
||
59 | INHERIT CipherInfo; |
||
60 | - CVAR nettle_crypt_func crypt; |
||
61 | + CVAR crypt_func crypt; |
||
62 | CVAR void *ctx; |
||
63 | CVAR int key_size; |
||
64 | |||
65 | diff -urad Pike-v7.8.316/src/post_modules/Nettle/configure.in pike-cvs/7.8/src/post_modules/Nettle/configure.in |
||
66 | --- Pike-v7.8.316/src/post_modules/Nettle/configure.in 2008-07-17 12:53:20.000000000 +0200 |
||
67 | +++ pike-cvs/7.8/src/post_modules/Nettle/configure.in 2009-07-02 23:27:56.000000000 +0200 |
||
68 | @@ -54,6 +54,52 @@ |
||
69 | AC_MSG_RESULT([no]) |
||
70 | IDEA_OBJ="" |
||
71 | fi |
||
72 | + |
||
73 | + # These might have been purged from the Nettle lib to avoid GPL |
||
74 | + # contamination. |
||
75 | + AC_CHECK_FUNCS(nettle_blowfish_decrypt nettle_serpent_decrypt) |
||
76 | + |
||
77 | + # This is the recomended interface in Nettle 2.0. |
||
78 | + AC_CHECK_FUNCS(nettle_yarrow256_slow_reseed) |
||
79 | + |
||
80 | + AC_MSG_CHECKING([for struct yarrow256_ctx.seed_file]) |
||
81 | + AC_CACHE_VAL(pike_cv_nettle_struct_yarrow256_ctx_seed_file, [ |
||
82 | + pike_cv_nettle_struct_yarrow256_ctx_seed_file=no |
||
83 | + AC_TRY_COMPILE([ |
||
84 | +#include <nettle/yarrow.h> |
||
85 | + ], [ |
||
86 | + struct yarrow256_ctx ctx; |
||
87 | + return !sizeof(ctx.seed_file); |
||
88 | + ], [ |
||
89 | + pike_cv_nettle_struct_yarrow256_ctx_seed_file=yes |
||
90 | + ]) |
||
91 | + ]) |
||
92 | + AC_MSG_RESULT($pike_cv_nettle_struct_yarrow256_ctx_seed_file); |
||
93 | + if test "x$pike_cv_nettle_struct_yarrow256_ctx_seed_file" = "xyes"; then |
||
94 | + AC_DEFINE(HAVE_STRUCT_YARROW256_CTX_SEED_FILE) |
||
95 | + fi |
||
96 | + |
||
97 | + AC_MSG_CHECKING([whether nettle_crypt_func is a pointer type]) |
||
98 | + AC_CACHE_VAL(pike_cv_nettle_crypt_func_is_pointer, [ |
||
99 | + pike_cv_nettle_crypt_func_is_pointer=no |
||
100 | + AC_TRY_COMPILE([ |
||
101 | +/* Note: Old Nettles had the nettle_crypt_func typedef directly |
||
102 | + * in <nettle/nettle-meta.h> while more modern have it in |
||
103 | + * <nettle/nettle-types.h>. Since <nettle/nettle-meta.h> |
||
104 | + * pulls in <nettle/nettle-types.h> it should be sufficient. |
||
105 | + */ |
||
106 | +#include <nettle/nettle-meta.h> |
||
107 | + ], [ |
||
108 | + nettle_crypt_func foo = (nettle_crypt_func)(void *)0; |
||
109 | + return (int)foo; |
||
110 | + ], [ |
||
111 | + pike_cv_nettle_crypt_func_is_pointer=yes |
||
112 | + ]) |
||
113 | + ]) |
||
114 | + AC_MSG_RESULT($pike_cv_nettle_crypt_func_is_pointer); |
||
115 | + if test "x$pike_cv_nettle_crypt_func_is_pointer" = "xyes"; then |
||
116 | + AC_DEFINE(HAVE_NETTLE_CRYPT_FUNC_IS_POINTER) |
||
117 | + fi |
||
118 | else |
||
119 | if test "$ac_cv_lib_gmp_mpz_init:$ac_cv_lib_gmp___mpz_init:$ac_cv_lib_gmp___gmpz_init" = "no:no:no"; then |
||
120 | # No gmp found; enable it if possible. |
||
121 | @@ -76,10 +122,6 @@ |
||
122 | ]) |
||
123 | PIKE_FEATURE_NODEP(Nettle) |
||
124 | fi |
||
125 | - |
||
126 | - # These might have been purged from the Nettle lib to avoid GPL |
||
127 | - # contamination. |
||
128 | - AC_CHECK_FUNCS(nettle_blowfish_decrypt nettle_serpent_decrypt) |
||
129 | fi |
||
130 | |||
131 | AC_OUTPUT(Makefile,echo FOO >stamp-h ) |
||
132 | diff -urad Pike-v7.8.316/src/post_modules/Nettle/nettle.cmod pike-cvs/7.8/src/post_modules/Nettle/nettle.cmod |
||
133 | --- Pike-v7.8.316/src/post_modules/Nettle/nettle.cmod 2008-06-29 00:57:14.000000000 +0200 |
||
134 | +++ pike-cvs/7.8/src/post_modules/Nettle/nettle.cmod 2009-07-05 21:41:58.000000000 +0200 |
||
135 | @@ -46,6 +46,36 @@ |
||
136 | CVAR struct yarrow256_ctx ctx; |
||
137 | CVAR struct yarrow_source *sources; |
||
138 | |||
139 | +#ifndef HAVE_STRUCT_YARROW256_CTX_SEED_FILE |
||
140 | + /* NOTE: Nettle 2.0 does not have the automatic seed_file maintenance |
||
141 | + * that Nettle 1.x had. This stuff is needed since it affected |
||
142 | + * the state emitted by random_string(). When Nettle 2.0 is the |
||
143 | + * default, consider implementing this via overloading of the |
||
144 | + * various seeding functions instead, since it does have a bit |
||
145 | + * of overhead. |
||
146 | + * |
||
147 | + * /grubba 2009-07-05 |
||
148 | + */ |
||
149 | + PIKEVAR string seed_file flags ID_PRIVATE|ID_STATIC; |
||
150 | +#endif |
||
151 | + |
||
152 | + DECLARE_STORAGE; |
||
153 | + |
||
154 | +#ifndef HAVE_STRUCT_YARROW256_CTX_SEED_FILE |
||
155 | + static void pike_generate_seed_file(void) |
||
156 | + { |
||
157 | + struct pike_string *seed_file = |
||
158 | + begin_shared_string(YARROW256_SEED_FILE_SIZE); |
||
159 | + yarrow256_random(&THIS->ctx, YARROW256_SEED_FILE_SIZE, STR0(seed_file)); |
||
160 | + if (THIS->seed_file) { |
||
161 | + free_string(THIS->seed_file); |
||
162 | + } |
||
163 | + THIS->seed_file = end_shared_string(seed_file); |
||
164 | + } |
||
165 | +#else |
||
166 | +#define pike_generate_seed_file() |
||
167 | +#endif |
||
168 | + |
||
169 | /*! @decl void create(void|int sources) |
||
170 | *! The number of entropy sources that will feed entropy to the |
||
171 | *! random number generator is given as an argument to Yarrow |
||
172 | @@ -90,10 +120,12 @@ |
||
173 | optflags OPT_SIDE_EFFECT; |
||
174 | { |
||
175 | if(data->len < YARROW256_SEED_FILE_SIZE) |
||
176 | - Pike_error( "Seed must be at least 32 characters.\n" ); |
||
177 | + Pike_error("Seed must be at least %d characters.\n", |
||
178 | + YARROW256_SEED_FILE_SIZE); |
||
179 | |||
180 | NO_WIDE_STRING(data); |
||
181 | - yarrow256_seed(&THIS->ctx, data->len, (const uint8_t *)data->str); |
||
182 | + yarrow256_seed(&THIS->ctx, data->len, STR0(data)); |
||
183 | + pike_generate_seed_file(); |
||
184 | RETURN this_object(); |
||
185 | } |
||
186 | |||
187 | @@ -109,19 +141,31 @@ |
||
188 | RETURN YARROW256_SEED_FILE_SIZE; |
||
189 | } |
||
190 | |||
191 | - /*! @decl string get_seed() |
||
192 | - *! Returns part of the internal state so that it can |
||
193 | - *! be saved for later seeding. |
||
194 | + /*! @decl string(0..255) get_seed() |
||
195 | + *! Returns part of the internal state so that it can |
||
196 | + *! be saved for later seeding. |
||
197 | + *! |
||
198 | *! @seealso |
||
199 | - *! @[seed] |
||
200 | + *! @[seed()], @[random_string()] |
||
201 | */ |
||
202 | PIKEFUN string get_seed() |
||
203 | optflags OPT_EXTERNAL_DEPEND; |
||
204 | + rawtype tDeprecated(tFunc(tNone, tStr8)); |
||
205 | { |
||
206 | if( !yarrow256_is_seeded(&THIS->ctx) ) |
||
207 | Pike_error("Random generator not seeded.\n"); |
||
208 | - RETURN make_shared_binary_string((const char *)THIS->ctx.seed_file, |
||
209 | - YARROW256_SEED_FILE_SIZE); |
||
210 | + |
||
211 | +#ifdef HAVE_STRUCT_YARROW256_CTX_SEED_FILE |
||
212 | + RETURN make_shared_binary_string(THIS->ctx.seed_file, |
||
213 | + YARROW256_SEED_FILE_SIZE); |
||
214 | +#else |
||
215 | + if (THIS->seed_file) { |
||
216 | + REF_RETURN THIS->seed_file; |
||
217 | + } else { |
||
218 | + struct pike_string *s = begin_shared_string(YARROW256_SEED_FILE_SIZE); |
||
219 | + RETURN end_shared_string(s); |
||
220 | + } |
||
221 | +#endif /* HAVE_STRUCT_YARROW256_CTX_SEED_FILE */ |
||
222 | } |
||
223 | |||
224 | /*! @decl int(0..1) is_seeded() |
||
225 | @@ -144,7 +188,19 @@ |
||
226 | PIKEFUN void force_reseed() |
||
227 | optflags OPT_SIDE_EFFECT; |
||
228 | { |
||
229 | +#ifdef HAVE_NETTLE_YARROW256_SLOW_RESEED |
||
230 | + /* From change notes for Nettle 2.0: |
||
231 | + * |
||
232 | + * * Changes to the yarrow256 interface. The function |
||
233 | + * yarrow256_force_reseed has been replaced by the two |
||
234 | + * functions yarrow256_fast_reseed and yarrow256_slow_reseed, |
||
235 | + * which were previously static. |
||
236 | + */ |
||
237 | + yarrow256_slow_reseed(&THIS->ctx); |
||
238 | +#else |
||
239 | yarrow256_force_reseed(&THIS->ctx); |
||
240 | +#endif |
||
241 | + pike_generate_seed_file(); |
||
242 | } |
||
243 | |||
244 | /*! @decl int(0..1) update(string data, int source, int entropy) |
||
245 | @@ -156,6 +212,7 @@ |
||
246 | PIKEFUN int(0..1) update(string data, int source, int entropy) |
||
247 | optflags OPT_SIDE_EFFECT; |
||
248 | { |
||
249 | + int ret; |
||
250 | /* FIXME: Wide strings could actually be supported here */ |
||
251 | NO_WIDE_STRING(data); |
||
252 | if( !THIS->sources ) |
||
253 | @@ -166,8 +223,11 @@ |
||
254 | Pike_error("Entropy must be positive.\n"); |
||
255 | if( entropy>(data->len*8) ) |
||
256 | Pike_error("Impossibly large entropy value.\n"); |
||
257 | - RETURN yarrow256_update(&THIS->ctx, source, entropy, data->len, |
||
258 | - (const uint8_t *)data->str); |
||
259 | + ret = yarrow256_update(&THIS->ctx, source, entropy, data->len, |
||
260 | + (const uint8_t *)data->str); |
||
261 | + if (ret) |
||
262 | + pike_generate_seed_file(); |
||
263 | + RETURN ret; |
||
264 | } |
||
265 | |||
266 | /*! @decl int(0..) needed_sources() |
||
267 | diff -urad Pike-v7.8.316/src/post_modules/Nettle/testsuite.in pike-cvs/7.8/src/post_modules/Nettle/testsuite.in |
||
268 | --- Pike-v7.8.316/src/post_modules/Nettle/testsuite.in 2007-06-18 02:43:51.000000000 +0200 |
||
269 | +++ pike-cvs/7.8/src/post_modules/Nettle/testsuite.in 2009-08-05 12:01:45.000000000 +0200 |
||
270 | @@ -193,4 +193,14 @@ |
||
271 | } |
||
272 | ) |
||
273 | ]]) |
||
274 | + |
||
275 | +cond_resolv( Nettle.Yarrow, [[ |
||
276 | + test_any_equal([[ |
||
277 | + object y = Nettle.Yarrow()->seed("What happen? Somebody set up us the bomb."); |
||
278 | + return ({ y->get_seed(), y->random_string(20), y->get_seed(), y->random_string(20) }); |
||
279 | + ]], [[({String.hex2string("73a35b2f896a8061be0ad434a592a43a82b81b9ed6c018f1c5a51300bbc8d53d"), |
||
280 | + String.hex2string("7847458e32fb789ff6b6cd6e1c8cc3712ba532a8"), |
||
281 | + String.hex2string("73a35b2f896a8061be0ad434a592a43a82b81b9ed6c018f1c5a51300bbc8d53d"), |
||
282 | + String.hex2string("49a090656a6d93782e169994f41005a3616d3cd7")})]]) |
||
283 | +]]) |
||
284 | END_MARKER |