diff options
Diffstat (limited to 'src/block/plugin_block_fs.c')
-rw-r--r-- | src/block/plugin_block_fs.c | 408 |
1 files changed, 196 insertions, 212 deletions
diff --git a/src/block/plugin_block_fs.c b/src/block/plugin_block_fs.c index caf009ddf..db8e59991 100644 --- a/src/block/plugin_block_fs.c +++ b/src/block/plugin_block_fs.c | |||
@@ -57,14 +57,13 @@ | |||
57 | */ | 57 | */ |
58 | static enum GNUNET_BLOCK_EvaluationResult | 58 | static enum GNUNET_BLOCK_EvaluationResult |
59 | block_plugin_fs_evaluate (void *cls, | 59 | block_plugin_fs_evaluate (void *cls, |
60 | enum GNUNET_BLOCK_Type type, | 60 | enum GNUNET_BLOCK_Type type, |
61 | const GNUNET_HashCode *query, | 61 | const GNUNET_HashCode * query, |
62 | struct GNUNET_CONTAINER_BloomFilter **bf, | 62 | struct GNUNET_CONTAINER_BloomFilter **bf, |
63 | int32_t bf_mutator, | 63 | int32_t bf_mutator, |
64 | const void *xquery, | 64 | const void *xquery, |
65 | size_t xquery_size, | 65 | size_t xquery_size, |
66 | const void *reply_block, | 66 | const void *reply_block, size_t reply_block_size) |
67 | size_t reply_block_size) | ||
68 | { | 67 | { |
69 | const struct SBlock *sb; | 68 | const struct SBlock *sb; |
70 | GNUNET_HashCode chash; | 69 | GNUNET_HashCode chash; |
@@ -73,92 +72,81 @@ block_plugin_fs_evaluate (void *cls, | |||
73 | GNUNET_HashCode sh; | 72 | GNUNET_HashCode sh; |
74 | 73 | ||
75 | switch (type) | 74 | switch (type) |
75 | { | ||
76 | case GNUNET_BLOCK_TYPE_FS_DBLOCK: | ||
77 | case GNUNET_BLOCK_TYPE_FS_IBLOCK: | ||
78 | if (xquery_size != 0) | ||
76 | { | 79 | { |
77 | case GNUNET_BLOCK_TYPE_FS_DBLOCK: | 80 | GNUNET_break_op (0); |
78 | case GNUNET_BLOCK_TYPE_FS_IBLOCK: | 81 | return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID; |
79 | if (xquery_size != 0) | ||
80 | { | ||
81 | GNUNET_break_op (0); | ||
82 | return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID; | ||
83 | } | ||
84 | if (reply_block == NULL) | ||
85 | return GNUNET_BLOCK_EVALUATION_REQUEST_VALID; | ||
86 | return GNUNET_BLOCK_EVALUATION_OK_LAST; | ||
87 | case GNUNET_BLOCK_TYPE_FS_KBLOCK: | ||
88 | case GNUNET_BLOCK_TYPE_FS_NBLOCK: | ||
89 | if (xquery_size != 0) | ||
90 | { | ||
91 | GNUNET_break_op (0); | ||
92 | return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID; | ||
93 | } | ||
94 | if (reply_block == NULL) | ||
95 | return GNUNET_BLOCK_EVALUATION_REQUEST_VALID; | ||
96 | GNUNET_CRYPTO_hash (reply_block, | ||
97 | reply_block_size, | ||
98 | &chash); | ||
99 | GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash); | ||
100 | if (NULL != *bf) | ||
101 | { | ||
102 | if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (*bf, | ||
103 | &mhash)) | ||
104 | return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE; | ||
105 | } | ||
106 | else | ||
107 | { | ||
108 | *bf = GNUNET_CONTAINER_bloomfilter_init (NULL, | ||
109 | 8, | ||
110 | BLOOMFILTER_K); | ||
111 | } | ||
112 | GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash); | ||
113 | return GNUNET_BLOCK_EVALUATION_OK_MORE; | ||
114 | case GNUNET_BLOCK_TYPE_FS_SBLOCK: | ||
115 | if (xquery_size != sizeof (GNUNET_HashCode)) | ||
116 | { | ||
117 | GNUNET_break_op (0); | ||
118 | return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID; | ||
119 | } | ||
120 | if (reply_block == NULL) | ||
121 | return GNUNET_BLOCK_EVALUATION_REQUEST_VALID; | ||
122 | nsid = xquery; | ||
123 | if (reply_block_size < sizeof (struct SBlock)) | ||
124 | { | ||
125 | GNUNET_break_op (0); | ||
126 | return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; | ||
127 | } | ||
128 | sb = reply_block; | ||
129 | GNUNET_CRYPTO_hash (&sb->subspace, | ||
130 | sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), | ||
131 | &sh); | ||
132 | if (0 != memcmp (nsid, | ||
133 | &sh, | ||
134 | sizeof (GNUNET_HashCode))) | ||
135 | { | ||
136 | GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, | ||
137 | "block-fs", | ||
138 | _("Reply mismatched in terms of namespace. Discarded.\n")); | ||
139 | return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; | ||
140 | } | ||
141 | GNUNET_CRYPTO_hash (reply_block, | ||
142 | reply_block_size, | ||
143 | &chash); | ||
144 | GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash); | ||
145 | if (NULL != *bf) | ||
146 | { | ||
147 | if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (*bf, | ||
148 | &mhash)) | ||
149 | return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE; | ||
150 | } | ||
151 | else | ||
152 | { | ||
153 | *bf = GNUNET_CONTAINER_bloomfilter_init (NULL, | ||
154 | 8, | ||
155 | BLOOMFILTER_K); | ||
156 | } | ||
157 | GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash); | ||
158 | return GNUNET_BLOCK_EVALUATION_OK_MORE; | ||
159 | default: | ||
160 | return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED; | ||
161 | } | 82 | } |
83 | if (reply_block == NULL) | ||
84 | return GNUNET_BLOCK_EVALUATION_REQUEST_VALID; | ||
85 | return GNUNET_BLOCK_EVALUATION_OK_LAST; | ||
86 | case GNUNET_BLOCK_TYPE_FS_KBLOCK: | ||
87 | case GNUNET_BLOCK_TYPE_FS_NBLOCK: | ||
88 | if (xquery_size != 0) | ||
89 | { | ||
90 | GNUNET_break_op (0); | ||
91 | return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID; | ||
92 | } | ||
93 | if (reply_block == NULL) | ||
94 | return GNUNET_BLOCK_EVALUATION_REQUEST_VALID; | ||
95 | GNUNET_CRYPTO_hash (reply_block, reply_block_size, &chash); | ||
96 | GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash); | ||
97 | if (NULL != *bf) | ||
98 | { | ||
99 | if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (*bf, &mhash)) | ||
100 | return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE; | ||
101 | } | ||
102 | else | ||
103 | { | ||
104 | *bf = GNUNET_CONTAINER_bloomfilter_init (NULL, 8, BLOOMFILTER_K); | ||
105 | } | ||
106 | GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash); | ||
107 | return GNUNET_BLOCK_EVALUATION_OK_MORE; | ||
108 | case GNUNET_BLOCK_TYPE_FS_SBLOCK: | ||
109 | if (xquery_size != sizeof (GNUNET_HashCode)) | ||
110 | { | ||
111 | GNUNET_break_op (0); | ||
112 | return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID; | ||
113 | } | ||
114 | if (reply_block == NULL) | ||
115 | return GNUNET_BLOCK_EVALUATION_REQUEST_VALID; | ||
116 | nsid = xquery; | ||
117 | if (reply_block_size < sizeof (struct SBlock)) | ||
118 | { | ||
119 | GNUNET_break_op (0); | ||
120 | return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; | ||
121 | } | ||
122 | sb = reply_block; | ||
123 | GNUNET_CRYPTO_hash (&sb->subspace, | ||
124 | sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), | ||
125 | &sh); | ||
126 | if (0 != memcmp (nsid, &sh, sizeof (GNUNET_HashCode))) | ||
127 | { | ||
128 | GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, | ||
129 | "block-fs", | ||
130 | _ | ||
131 | ("Reply mismatched in terms of namespace. Discarded.\n")); | ||
132 | return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; | ||
133 | } | ||
134 | GNUNET_CRYPTO_hash (reply_block, reply_block_size, &chash); | ||
135 | GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash); | ||
136 | if (NULL != *bf) | ||
137 | { | ||
138 | if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (*bf, &mhash)) | ||
139 | return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE; | ||
140 | } | ||
141 | else | ||
142 | { | ||
143 | *bf = GNUNET_CONTAINER_bloomfilter_init (NULL, 8, BLOOMFILTER_K); | ||
144 | } | ||
145 | GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash); | ||
146 | return GNUNET_BLOCK_EVALUATION_OK_MORE; | ||
147 | default: | ||
148 | return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED; | ||
149 | } | ||
162 | } | 150 | } |
163 | 151 | ||
164 | 152 | ||
@@ -175,126 +163,122 @@ block_plugin_fs_evaluate (void *cls, | |||
175 | */ | 163 | */ |
176 | static int | 164 | static int |
177 | block_plugin_fs_get_key (void *cls, | 165 | block_plugin_fs_get_key (void *cls, |
178 | enum GNUNET_BLOCK_Type type, | 166 | enum GNUNET_BLOCK_Type type, |
179 | const void *block, | 167 | const void *block, |
180 | size_t block_size, | 168 | size_t block_size, GNUNET_HashCode * key) |
181 | GNUNET_HashCode *key) | ||
182 | { | 169 | { |
183 | const struct KBlock *kb; | 170 | const struct KBlock *kb; |
184 | const struct SBlock *sb; | 171 | const struct SBlock *sb; |
185 | const struct NBlock *nb; | 172 | const struct NBlock *nb; |
186 | 173 | ||
187 | switch (type) | 174 | switch (type) |
175 | { | ||
176 | case GNUNET_BLOCK_TYPE_FS_DBLOCK: | ||
177 | case GNUNET_BLOCK_TYPE_FS_IBLOCK: | ||
178 | GNUNET_CRYPTO_hash (block, block_size, key); | ||
179 | return GNUNET_OK; | ||
180 | case GNUNET_BLOCK_TYPE_FS_KBLOCK: | ||
181 | if (block_size < sizeof (struct KBlock)) | ||
182 | { | ||
183 | GNUNET_break_op (0); | ||
184 | return GNUNET_NO; | ||
185 | } | ||
186 | kb = block; | ||
187 | if (block_size - sizeof (struct KBlock) != | ||
188 | ntohl (kb->purpose.size) | ||
189 | - sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) | ||
190 | - sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded)) | ||
191 | { | ||
192 | GNUNET_break_op (0); | ||
193 | return GNUNET_NO; | ||
194 | } | ||
195 | if (GNUNET_OK != | ||
196 | GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_KBLOCK, | ||
197 | &kb->purpose, &kb->signature, &kb->keyspace)) | ||
198 | { | ||
199 | GNUNET_break_op (0); | ||
200 | return GNUNET_NO; | ||
201 | } | ||
202 | if (key != NULL) | ||
203 | GNUNET_CRYPTO_hash (&kb->keyspace, | ||
204 | sizeof (struct | ||
205 | GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), | ||
206 | key); | ||
207 | return GNUNET_OK; | ||
208 | case GNUNET_BLOCK_TYPE_FS_SBLOCK: | ||
209 | if (block_size < sizeof (struct SBlock)) | ||
210 | { | ||
211 | GNUNET_break_op (0); | ||
212 | return GNUNET_NO; | ||
213 | } | ||
214 | sb = block; | ||
215 | if (block_size != | ||
216 | ntohl (sb->purpose.size) + sizeof (struct GNUNET_CRYPTO_RsaSignature)) | ||
188 | { | 217 | { |
189 | case GNUNET_BLOCK_TYPE_FS_DBLOCK: | 218 | GNUNET_break_op (0); |
190 | case GNUNET_BLOCK_TYPE_FS_IBLOCK: | 219 | return GNUNET_NO; |
191 | GNUNET_CRYPTO_hash (block, block_size, key); | ||
192 | return GNUNET_OK; | ||
193 | case GNUNET_BLOCK_TYPE_FS_KBLOCK: | ||
194 | if (block_size < sizeof (struct KBlock)) | ||
195 | { | ||
196 | GNUNET_break_op (0); | ||
197 | return GNUNET_NO; | ||
198 | } | ||
199 | kb = block; | ||
200 | if (block_size - sizeof (struct KBlock) != | ||
201 | ntohl (kb->purpose.size) | ||
202 | - sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) | ||
203 | - sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded) ) | ||
204 | { | ||
205 | GNUNET_break_op (0); | ||
206 | return GNUNET_NO; | ||
207 | } | ||
208 | if (GNUNET_OK != | ||
209 | GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_KBLOCK, | ||
210 | &kb->purpose, | ||
211 | &kb->signature, | ||
212 | &kb->keyspace)) | ||
213 | { | ||
214 | GNUNET_break_op (0); | ||
215 | return GNUNET_NO; | ||
216 | } | ||
217 | if (key != NULL) | ||
218 | GNUNET_CRYPTO_hash (&kb->keyspace, | ||
219 | sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), | ||
220 | key); | ||
221 | return GNUNET_OK; | ||
222 | case GNUNET_BLOCK_TYPE_FS_SBLOCK: | ||
223 | if (block_size < sizeof (struct SBlock)) | ||
224 | { | ||
225 | GNUNET_break_op (0); | ||
226 | return GNUNET_NO; | ||
227 | } | ||
228 | sb = block; | ||
229 | if (block_size != | ||
230 | ntohl (sb->purpose.size) + sizeof (struct GNUNET_CRYPTO_RsaSignature)) | ||
231 | { | ||
232 | GNUNET_break_op (0); | ||
233 | return GNUNET_NO; | ||
234 | } | ||
235 | if (GNUNET_OK != | ||
236 | GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_SBLOCK, | ||
237 | &sb->purpose, | ||
238 | &sb->signature, | ||
239 | &sb->subspace)) | ||
240 | { | ||
241 | GNUNET_break_op (0); | ||
242 | return GNUNET_NO; | ||
243 | } | ||
244 | if (key != NULL) | ||
245 | *key = sb->identifier; | ||
246 | return GNUNET_OK; | ||
247 | case GNUNET_BLOCK_TYPE_FS_NBLOCK: | ||
248 | if (block_size < sizeof (struct NBlock)) | ||
249 | { | ||
250 | GNUNET_break_op (0); | ||
251 | return GNUNET_NO; | ||
252 | } | ||
253 | nb = block; | ||
254 | if (block_size - sizeof (struct NBlock) != | ||
255 | ntohl (nb->ns_purpose.size) | ||
256 | - sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) | ||
257 | - sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded) ) | ||
258 | { | ||
259 | GNUNET_break_op (0); | ||
260 | return GNUNET_NO; | ||
261 | } | ||
262 | if (block_size != | ||
263 | ntohl (nb->ksk_purpose.size) + sizeof (struct GNUNET_CRYPTO_RsaSignature)) | ||
264 | { | ||
265 | GNUNET_break_op (0); | ||
266 | return GNUNET_NO; | ||
267 | } | ||
268 | if (GNUNET_OK != | ||
269 | GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_NBLOCK_KSIG, | ||
270 | &nb->ksk_purpose, | ||
271 | &nb->ksk_signature, | ||
272 | &nb->keyspace)) | ||
273 | { | ||
274 | GNUNET_break_op (0); | ||
275 | return GNUNET_NO; | ||
276 | } | ||
277 | if (GNUNET_OK != | ||
278 | GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_NBLOCK, | ||
279 | &nb->ns_purpose, | ||
280 | &nb->ns_signature, | ||
281 | &nb->subspace)) | ||
282 | { | ||
283 | GNUNET_break_op (0); | ||
284 | return GNUNET_NO; | ||
285 | } | ||
286 | /* FIXME: we used to xor ID with NSID, | ||
287 | why not here? */ | ||
288 | if (key != NULL) | ||
289 | GNUNET_CRYPTO_hash (&nb->keyspace, | ||
290 | sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), | ||
291 | key); | ||
292 | return GNUNET_OK; | ||
293 | default: | ||
294 | return GNUNET_SYSERR; | ||
295 | } | 220 | } |
221 | if (GNUNET_OK != | ||
222 | GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_SBLOCK, | ||
223 | &sb->purpose, &sb->signature, &sb->subspace)) | ||
224 | { | ||
225 | GNUNET_break_op (0); | ||
226 | return GNUNET_NO; | ||
227 | } | ||
228 | if (key != NULL) | ||
229 | *key = sb->identifier; | ||
230 | return GNUNET_OK; | ||
231 | case GNUNET_BLOCK_TYPE_FS_NBLOCK: | ||
232 | if (block_size < sizeof (struct NBlock)) | ||
233 | { | ||
234 | GNUNET_break_op (0); | ||
235 | return GNUNET_NO; | ||
236 | } | ||
237 | nb = block; | ||
238 | if (block_size - sizeof (struct NBlock) != | ||
239 | ntohl (nb->ns_purpose.size) | ||
240 | - sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) | ||
241 | - sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded)) | ||
242 | { | ||
243 | GNUNET_break_op (0); | ||
244 | return GNUNET_NO; | ||
245 | } | ||
246 | if (block_size != | ||
247 | ntohl (nb->ksk_purpose.size) + | ||
248 | sizeof (struct GNUNET_CRYPTO_RsaSignature)) | ||
249 | { | ||
250 | GNUNET_break_op (0); | ||
251 | return GNUNET_NO; | ||
252 | } | ||
253 | if (GNUNET_OK != | ||
254 | GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_NBLOCK_KSIG, | ||
255 | &nb->ksk_purpose, | ||
256 | &nb->ksk_signature, &nb->keyspace)) | ||
257 | { | ||
258 | GNUNET_break_op (0); | ||
259 | return GNUNET_NO; | ||
260 | } | ||
261 | if (GNUNET_OK != | ||
262 | GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_NBLOCK, | ||
263 | &nb->ns_purpose, | ||
264 | &nb->ns_signature, &nb->subspace)) | ||
265 | { | ||
266 | GNUNET_break_op (0); | ||
267 | return GNUNET_NO; | ||
268 | } | ||
269 | /* FIXME: we used to xor ID with NSID, | ||
270 | * why not here? */ | ||
271 | if (key != NULL) | ||
272 | GNUNET_CRYPTO_hash (&nb->keyspace, | ||
273 | sizeof (struct | ||
274 | GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), | ||
275 | key); | ||
276 | return GNUNET_OK; | ||
277 | default: | ||
278 | return GNUNET_SYSERR; | ||
279 | } | ||
296 | } | 280 | } |
297 | 281 | ||
298 | 282 | ||
299 | /** | 283 | /** |
300 | * Entry point for the plugin. | 284 | * Entry point for the plugin. |
@@ -302,15 +286,15 @@ block_plugin_fs_get_key (void *cls, | |||
302 | void * | 286 | void * |
303 | libgnunet_plugin_block_fs_init (void *cls) | 287 | libgnunet_plugin_block_fs_init (void *cls) |
304 | { | 288 | { |
305 | static enum GNUNET_BLOCK_Type types[] = | 289 | static enum GNUNET_BLOCK_Type types[] = |
306 | { | 290 | { |
307 | GNUNET_BLOCK_TYPE_FS_DBLOCK, | 291 | GNUNET_BLOCK_TYPE_FS_DBLOCK, |
308 | GNUNET_BLOCK_TYPE_FS_IBLOCK, | 292 | GNUNET_BLOCK_TYPE_FS_IBLOCK, |
309 | GNUNET_BLOCK_TYPE_FS_KBLOCK, | 293 | GNUNET_BLOCK_TYPE_FS_KBLOCK, |
310 | GNUNET_BLOCK_TYPE_FS_SBLOCK, | 294 | GNUNET_BLOCK_TYPE_FS_SBLOCK, |
311 | GNUNET_BLOCK_TYPE_FS_NBLOCK, | 295 | GNUNET_BLOCK_TYPE_FS_NBLOCK, |
312 | GNUNET_BLOCK_TYPE_ANY /* end of list */ | 296 | GNUNET_BLOCK_TYPE_ANY /* end of list */ |
313 | }; | 297 | }; |
314 | struct GNUNET_BLOCK_PluginFunctions *api; | 298 | struct GNUNET_BLOCK_PluginFunctions *api; |
315 | 299 | ||
316 | api = GNUNET_malloc (sizeof (struct GNUNET_BLOCK_PluginFunctions)); | 300 | api = GNUNET_malloc (sizeof (struct GNUNET_BLOCK_PluginFunctions)); |