diff options
author | Christian Grothoff <christian@grothoff.org> | 2013-09-21 20:13:06 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2013-09-21 20:13:06 +0000 |
commit | 04bb54e0efe6f6770c016aedbb776dd4ae801972 (patch) | |
tree | bc59ffb8bd008cfb0b3e8c9ffdd8135f27c630bb /src/dns | |
parent | cf4e6f6646619f854cab70c117452d44e3355fb6 (diff) | |
download | gnunet-04bb54e0efe6f6770c016aedbb776dd4ae801972.tar.gz gnunet-04bb54e0efe6f6770c016aedbb776dd4ae801972.zip |
changing DNS block plugin to represent DNS exit services instead of hidden services
Diffstat (limited to 'src/dns')
-rw-r--r-- | src/dns/plugin_block_dns.c | 84 |
1 files changed, 39 insertions, 45 deletions
diff --git a/src/dns/plugin_block_dns.c b/src/dns/plugin_block_dns.c index 58301e095..c0009dd68 100644 --- a/src/dns/plugin_block_dns.c +++ b/src/dns/plugin_block_dns.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of GNUnet | 2 | This file is part of GNUnet |
3 | (C) 2010 Christian Grothoff (and other contributing authors) | 3 | (C) 2013 Christian Grothoff (and other contributing authors) |
4 | 4 | ||
5 | GNUnet is free software; you can redistribute it and/or modify | 5 | GNUnet is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published | 6 | it under the terms of the GNU General Public License as published |
@@ -20,16 +20,18 @@ | |||
20 | 20 | ||
21 | /** | 21 | /** |
22 | * @file dns/plugin_block_dns.c | 22 | * @file dns/plugin_block_dns.c |
23 | * @brief block plugin for storing .gnunet-bindings | 23 | * @brief block plugin for advertising a DNS exit service |
24 | * @author Philipp Tölke | 24 | * @author Christian Grothoff |
25 | * | ||
26 | * Note that this plugin might more belong with EXIT and PT | ||
27 | * as those two are using this type of block. Still, this | ||
28 | * might be a natural enough place for people to find the code... | ||
25 | */ | 29 | */ |
26 | |||
27 | #include "platform.h" | 30 | #include "platform.h" |
28 | #include "gnunet_block_plugin.h" | 31 | #include "gnunet_block_plugin.h" |
29 | #include "block_dns.h" | 32 | #include "block_dns.h" |
30 | #include "gnunet_signatures.h" | 33 | #include "gnunet_signatures.h" |
31 | 34 | ||
32 | #define DEBUG_DHT GNUNET_EXTRA_LOGGING | ||
33 | 35 | ||
34 | /** | 36 | /** |
35 | * Function called to validate a reply or a request. For | 37 | * Function called to validate a reply or a request. For |
@@ -41,9 +43,9 @@ | |||
41 | * @param bf pointer to bloom filter associated with query; possibly updated (!) | 43 | * @param bf pointer to bloom filter associated with query; possibly updated (!) |
42 | * @param bf_mutator mutation value for bf | 44 | * @param bf_mutator mutation value for bf |
43 | * @param xquery extended query data (can be NULL, depending on type) | 45 | * @param xquery extended query data (can be NULL, depending on type) |
44 | * @param xquery_size number of bytes in xquery | 46 | * @param xquery_size number of bytes in @a xquery |
45 | * @param reply_block response to validate | 47 | * @param reply_block response to validate |
46 | * @param reply_block_size number of bytes in reply block | 48 | * @param reply_block_size number of bytes in @a reply_block |
47 | * @return characterization of result | 49 | * @return characterization of result |
48 | */ | 50 | */ |
49 | static enum GNUNET_BLOCK_EvaluationResult | 51 | static enum GNUNET_BLOCK_EvaluationResult |
@@ -54,55 +56,48 @@ block_plugin_dns_evaluate (void *cls, enum GNUNET_BLOCK_Type type, | |||
54 | size_t xquery_size, const void *reply_block, | 56 | size_t xquery_size, const void *reply_block, |
55 | size_t reply_block_size) | 57 | size_t reply_block_size) |
56 | { | 58 | { |
59 | const struct GNUNET_DNS_Advertisement *ad; | ||
60 | |||
57 | switch (type) | 61 | switch (type) |
58 | { | 62 | { |
59 | case GNUNET_BLOCK_TYPE_DNS: | 63 | case GNUNET_BLOCK_TYPE_DNS: |
60 | if (xquery_size != 0) | 64 | if (0 != xquery_size) |
61 | return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID; | 65 | return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID; |
62 | 66 | ||
63 | if (reply_block_size == 0) | 67 | if (0 == reply_block_size) |
64 | return GNUNET_BLOCK_EVALUATION_REQUEST_VALID; | 68 | return GNUNET_BLOCK_EVALUATION_REQUEST_VALID; |
65 | 69 | ||
66 | if (reply_block_size != sizeof (struct GNUNET_DNS_Record)) | 70 | if (sizeof (struct GNUNET_DNS_Advertisement) != reply_block_size) |
67 | { | 71 | { |
68 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 72 | GNUNET_break_op (0); |
69 | "DNS-Block is invalid: reply_block_size=%d != %d\n", | ||
70 | reply_block_size, sizeof (struct GNUNET_DNS_Record)); | ||
71 | return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; | 73 | return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; |
72 | } | 74 | } |
75 | ad = reply_block; | ||
73 | 76 | ||
74 | const struct GNUNET_DNS_Record *rec = reply_block; | 77 | if (ntohl (ad->purpose.size) != |
75 | 78 | sizeof (struct GNUNET_DNS_Advertisement) - | |
76 | if (ntohl (rec->purpose.size) != | ||
77 | sizeof (struct GNUNET_DNS_Record) - | ||
78 | sizeof (struct GNUNET_CRYPTO_EccSignature)) | 79 | sizeof (struct GNUNET_CRYPTO_EccSignature)) |
79 | { | 80 | { |
80 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 81 | GNUNET_break_op (0); |
81 | "DNS-Block is invalid: rec->purpose.size=%d != %d\n", | ||
82 | ntohl (rec->purpose.size), | ||
83 | sizeof (struct GNUNET_DNS_Record) - | ||
84 | sizeof (struct GNUNET_CRYPTO_EccSignature)); | ||
85 | return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; | 82 | return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; |
86 | } | 83 | } |
87 | |||
88 | if (0 == | 84 | if (0 == |
89 | GNUNET_TIME_absolute_get_remaining (GNUNET_TIME_absolute_ntoh | 85 | GNUNET_TIME_absolute_get_remaining (GNUNET_TIME_absolute_ntoh |
90 | (rec->expiration_time)).rel_value_us) | 86 | (ad->expiration_time)).rel_value_us) |
91 | { | 87 | { |
92 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "DNS-Block is invalid: Timeout\n"); | 88 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
89 | "DNS advertisement has expired\n"); | ||
93 | return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; | 90 | return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; |
94 | } | 91 | } |
95 | |||
96 | if (GNUNET_OK != | 92 | if (GNUNET_OK != |
97 | GNUNET_CRYPTO_ecc_verify (htonl (GNUNET_SIGNATURE_PURPOSE_DNS_RECORD), | 93 | GNUNET_CRYPTO_ecc_verify (GNUNET_SIGNATURE_PURPOSE_DNS_RECORD, |
98 | &rec->purpose, &rec->signature, &rec->peer)) | 94 | &ad->purpose, |
95 | &ad->signature, | ||
96 | &ad->peer)) | ||
99 | { | 97 | { |
100 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 98 | GNUNET_break_op (0); |
101 | "DNS-Block is invalid: invalid signature\n"); | ||
102 | return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; | 99 | return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; |
103 | } | 100 | } |
104 | |||
105 | /* How to decide whether there are no more? */ | ||
106 | return GNUNET_BLOCK_EVALUATION_OK_MORE; | 101 | return GNUNET_BLOCK_EVALUATION_OK_MORE; |
107 | default: | 102 | default: |
108 | return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED; | 103 | return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED; |
@@ -116,24 +111,23 @@ block_plugin_dns_evaluate (void *cls, enum GNUNET_BLOCK_Type type, | |||
116 | * @param cls closure | 111 | * @param cls closure |
117 | * @param type block type | 112 | * @param type block type |
118 | * @param block block to get the key for | 113 | * @param block block to get the key for |
119 | * @param block_size number of bytes in block | 114 | * @param block_size number of bytes in @a block |
120 | * @param key set to the key (query) for the given block | 115 | * @param key set to the key (query) for the given block |
121 | * @return GNUNET_OK on success, GNUNET_SYSERR if type not supported | 116 | * @return #GNUNET_OK on success, #GNUNET_SYSERR if type not supported |
122 | * (or if extracting a key from a block of this type does not work) | 117 | * (or if extracting a key from a block of this type does not work) |
123 | */ | 118 | */ |
124 | static int | 119 | static int |
125 | block_plugin_dns_get_key (void *cls, enum GNUNET_BLOCK_Type type, | 120 | block_plugin_dns_get_key (void *cls, |
126 | const void *block, size_t block_size, | 121 | enum GNUNET_BLOCK_Type type, |
127 | struct GNUNET_HashCode * key) | 122 | const void *block, |
123 | size_t block_size, | ||
124 | struct GNUNET_HashCode *key) | ||
128 | { | 125 | { |
129 | if (type != GNUNET_BLOCK_TYPE_DNS) | 126 | /* we cannot extract a key from a block of this type */ |
130 | return GNUNET_SYSERR; | 127 | return GNUNET_SYSERR; |
131 | const struct GNUNET_DNS_Record *rec = block; | ||
132 | |||
133 | memcpy (key, &rec->service_descriptor, sizeof (struct GNUNET_HashCode)); | ||
134 | return GNUNET_OK; | ||
135 | } | 128 | } |
136 | 129 | ||
130 | |||
137 | /** | 131 | /** |
138 | * Entry point for the plugin. | 132 | * Entry point for the plugin. |
139 | */ | 133 | */ |
@@ -147,7 +141,7 @@ libgnunet_plugin_block_dns_init (void *cls) | |||
147 | }; | 141 | }; |
148 | struct GNUNET_BLOCK_PluginFunctions *api; | 142 | struct GNUNET_BLOCK_PluginFunctions *api; |
149 | 143 | ||
150 | api = GNUNET_malloc (sizeof (struct GNUNET_BLOCK_PluginFunctions)); | 144 | api = GNUNET_new (struct GNUNET_BLOCK_PluginFunctions); |
151 | api->evaluate = &block_plugin_dns_evaluate; | 145 | api->evaluate = &block_plugin_dns_evaluate; |
152 | api->get_key = &block_plugin_dns_get_key; | 146 | api->get_key = &block_plugin_dns_get_key; |
153 | api->types = types; | 147 | api->types = types; |
@@ -161,7 +155,7 @@ libgnunet_plugin_block_dns_init (void *cls) | |||
161 | void * | 155 | void * |
162 | libgnunet_plugin_block_dns_done (void *cls) | 156 | libgnunet_plugin_block_dns_done (void *cls) |
163 | { | 157 | { |
164 | struct GNUNET_TRANSPORT_PluginFunctions *api = cls; | 158 | struct GNUNET_BLOCK_PluginFunctions *api = cls; |
165 | 159 | ||
166 | GNUNET_free (api); | 160 | GNUNET_free (api); |
167 | return NULL; | 161 | return NULL; |