00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifdef HAVE_CONFIG_H
00018 # include <dtn-config.h>
00019 #endif
00020
00021 #ifdef BSP_ENABLED
00022
00023 #include "BA_BlockProcessor.h"
00024 #include "bundling/Bundle.h"
00025 #include "bundling/BundleDaemon.h"
00026 #include "bundling/BundleProtocol.h"
00027 #include "contacts/Link.h"
00028
00029 namespace dtn {
00030
00031 static const char * log = "/dtn/bundle/ciphersuite";
00032
00033
00034 BA_BlockProcessor::BA_BlockProcessor()
00035 : BlockProcessor(BundleProtocol::BUNDLE_AUTHENTICATION_BLOCK)
00036 {
00037 }
00038
00039
00040 int
00041 BA_BlockProcessor::consume(Bundle* bundle, BlockInfo* block,
00042 u_char* buf, size_t len)
00043 {
00044 int cc = BlockProcessor::consume(bundle, block, buf, len);
00045
00046 if (cc == -1) {
00047 return -1;
00048 }
00049
00050
00051
00052
00053 if (! block->complete()) {
00054 ASSERT(cc == (int)len);
00055 return cc;
00056 }
00057
00058 if ( block->locals() == NULL ) {
00059 Ciphersuite::parse(block);
00060 }
00061
00062 return cc;
00063 }
00064
00065
00066 int
00067 BA_BlockProcessor::reload_post_process(Bundle* bundle,
00068 BlockInfoVec* block_list,
00069 BlockInfo* block)
00070 {
00071
00072
00073
00074
00075
00076
00077 Ciphersuite* p = NULL;
00078 int err = 0;
00079 int type = 0;
00080 BP_Local_CS* locals;
00081
00082 if ( ! block->reloaded() )
00083 return 0;
00084
00085 type = block->type();
00086 log_debug_p(log, "BA_BlockProcessor::reload block type %d", type);
00087
00088 Ciphersuite::parse(block);
00089 locals = dynamic_cast<BP_Local_CS*>(block->locals());
00090 CS_FAIL_IF_NULL(locals);
00091
00092 p = Ciphersuite::find_suite( locals->owner_cs_num() );
00093 if ( p != NULL )
00094 err = p->reload_post_process(bundle, block_list, block);
00095
00096 block->set_reloaded(false);
00097 return err;
00098
00099 fail:
00100 if ( locals != NULL )
00101 locals->set_proc_flag(Ciphersuite::CS_BLOCK_PROCESSING_FAILED_DO_NOT_SEND);
00102 return BP_FAIL;
00103 }
00104
00105
00106 bool
00107 BA_BlockProcessor::validate(const Bundle* bundle,
00108 BlockInfoVec* block_list,
00109 BlockInfo* block,
00110 status_report_reason_t* reception_reason,
00111 status_report_reason_t* deletion_reason)
00112 {
00113 (void)bundle;
00114 (void)block_list;
00115 (void)block;
00116 (void)reception_reason;
00117
00118 Ciphersuite* p = NULL;
00119 u_int16_t cs_flags = 0;
00120 EndpointID local_eid = BundleDaemon::instance()->local_eid();
00121 BP_Local_CS* locals = dynamic_cast<BP_Local_CS*>(block->locals());
00122 bool result = false;
00123
00124 CS_FAIL_IF_NULL(locals);
00125
00126 log_debug_p(log, "BA_BlockProcessor::validate() %p ciphersuite %d",
00127 block, locals->owner_cs_num());
00128 cs_flags = locals->cs_flags();
00129
00130 p = Ciphersuite::find_suite( locals->owner_cs_num() );
00131 if ( p != NULL ) {
00132 result = p->validate(bundle, block_list, block,
00133 reception_reason, deletion_reason);
00134 } else {
00135 log_err_p(log, "block failed security validation BA_BlockProcessor");
00136 *deletion_reason = BundleProtocol::REASON_SECURITY_FAILED;
00137 }
00138
00139 return result;
00140
00141
00142 fail:
00143 if ( locals != NULL )
00144 locals->set_proc_flag(Ciphersuite::CS_BLOCK_FAILED_VALIDATION |
00145 Ciphersuite::CS_BLOCK_COMPLETED_DO_NOT_FORWARD);
00146
00147 *deletion_reason = BundleProtocol::REASON_SECURITY_FAILED;
00148 return false;
00149 }
00150
00151
00152 int
00153 BA_BlockProcessor::prepare(const Bundle* bundle,
00154 BlockInfoVec* xmit_blocks,
00155 const BlockInfo* source,
00156 const LinkRef& link,
00157 list_owner_t list)
00158 {
00159 (void)bundle;
00160 (void)link;
00161 (void)xmit_blocks;
00162
00163 Ciphersuite* p = NULL;
00164 int result = BP_FAIL;
00165
00166 if ( list == BlockInfo::LIST_NONE || source == NULL )
00167 return BP_SUCCESS;
00168
00169 BP_Local_CS* locals = dynamic_cast<BP_Local_CS*>(source->locals());
00170 CS_FAIL_IF_NULL(locals);
00171
00172 log_debug_p(log, "BA_BlockProcessor::prepare() ciphersuite %d",
00173 locals->owner_cs_num());
00174
00175 switch ( list ) {
00176 case BlockInfo::LIST_API:
00177 case BlockInfo::LIST_EXT:
00178
00179
00180
00181
00182 p = Ciphersuite::find_suite(locals->owner_cs_num());
00183 if ( p == NULL )
00184 return result;
00185
00186
00187 result = p->prepare( bundle, xmit_blocks, source, link, list );
00188 break;
00189
00190
00191
00192 default:
00193 break;
00194
00195 }
00196
00197 return result;
00198
00199 fail:
00200 if ( locals != NULL )
00201 locals->set_proc_flag(Ciphersuite::CS_BLOCK_PROCESSING_FAILED_DO_NOT_SEND);
00202 return BP_FAIL;
00203 }
00204
00205
00206 int
00207 BA_BlockProcessor::generate(const Bundle* bundle,
00208 BlockInfoVec* xmit_blocks,
00209 BlockInfo* block,
00210 const LinkRef& link,
00211 bool last)
00212 {
00213 (void)bundle;
00214 (void)link;
00215 (void)xmit_blocks;
00216 (void)block;
00217 (void)last;
00218
00219 Ciphersuite* p = NULL;
00220 int result = BP_FAIL;
00221
00222 BP_Local_CS* locals = dynamic_cast<BP_Local_CS*>(block->locals());
00223 CS_FAIL_IF_NULL(locals);
00224
00225 p = Ciphersuite::find_suite( locals->owner_cs_num() );
00226 if ( p != NULL ) {
00227 result = p->generate(bundle, xmit_blocks, block, link, last);
00228 } else
00229 log_err_p(log, "BA_BlockProcessor::generate() - ciphersuite %d is missing",
00230 locals->owner_cs_num());
00231
00232 return result;
00233
00234 fail:
00235 if ( locals != NULL )
00236 locals->set_proc_flag(Ciphersuite::CS_BLOCK_PROCESSING_FAILED_DO_NOT_SEND);
00237 return BP_FAIL;
00238 }
00239
00240
00241 int
00242 BA_BlockProcessor::finalize(const Bundle* bundle,
00243 BlockInfoVec* xmit_blocks,
00244 BlockInfo* block,
00245 const LinkRef& link)
00246 {
00247 (void)bundle;
00248 (void)xmit_blocks;
00249 (void)link;
00250 (void)block;
00251
00252 Ciphersuite* p = NULL;
00253 int result = BP_FAIL;
00254
00255 BP_Local_CS* locals = dynamic_cast<BP_Local_CS*>(block->locals());
00256 CS_FAIL_IF_NULL(locals);
00257
00258 p = Ciphersuite::find_suite( locals->owner_cs_num() );
00259 if ( p != NULL ) {
00260 result = p->finalize(bundle, xmit_blocks, block, link);
00261 } else
00262 log_err_p(log, "BA_BlockProcessor::finalize() - ciphersuite %d is missing",
00263 locals->owner_cs_num());
00264
00265 return result;
00266
00267 fail:
00268 if ( locals != NULL )
00269 locals->set_proc_flag(Ciphersuite::CS_BLOCK_PROCESSING_FAILED_DO_NOT_SEND);
00270 return BP_FAIL;
00271 }
00272
00273 }
00274
00275 #endif