aboutsummaryrefslogtreecommitdiff
path: root/src/dns
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2013-09-21 20:13:06 +0000
committerChristian Grothoff <christian@grothoff.org>2013-09-21 20:13:06 +0000
commit04bb54e0efe6f6770c016aedbb776dd4ae801972 (patch)
treebc59ffb8bd008cfb0b3e8c9ffdd8135f27c630bb /src/dns
parentcf4e6f6646619f854cab70c117452d44e3355fb6 (diff)
downloadgnunet-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.c84
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 */
49static enum GNUNET_BLOCK_EvaluationResult 51static 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 */
124static int 119static int
125block_plugin_dns_get_key (void *cls, enum GNUNET_BLOCK_Type type, 120block_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)
161void * 155void *
162libgnunet_plugin_block_dns_done (void *cls) 156libgnunet_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;