From: Francis Dupont Date: Sun, 31 May 2015 12:02:19 +0000 (+0200) Subject: [sedhcpv6] still real sign/verify to do (checkpoint) X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=c5d53a133c9e3a57f93c0100b281361af856fec4;p=thirdparty%2Fkea.git [sedhcpv6] still real sign/verify to do (checkpoint) --- diff --git a/src/bin/dhcp6/Makefile.am b/src/bin/dhcp6/Makefile.am index cc9e9a863a..19aa4cd2b6 100644 --- a/src/bin/dhcp6/Makefile.am +++ b/src/bin/dhcp6/Makefile.am @@ -21,7 +21,8 @@ if USE_STATIC_LINK AM_LDFLAGS = -static endif -CLEANFILES = spec_config.h dhcp6_messages.h dhcp6_messages.cc s-messages +CLEANFILES = spec_config.h dhcp6_messages.h dhcp6_messages.cc \ + sedhcp6_messages.h sedhcp6_messages.cc s-messages man_MANS = kea-dhcp6.8 DISTCLEANFILES = $(man_MANS) @@ -46,13 +47,15 @@ endif spec_config.h: spec_config.h.pre $(SED) -e "s|@@LOCALSTATEDIR@@|$(localstatedir)|" spec_config.h.pre >$@ -dhcp6_messages.h dhcp6_messages.cc: s-messages +dhcp6_messages.h dhcp6_messages.cc sedhcp6_messages.h sedhcp6_messages.cc: s-messages -s-messages: dhcp6_messages.mes +s-messages: dhcp6_messages.mes sedhcp6_messages.mes $(top_builddir)/src/lib/log/compiler/message $(top_srcdir)/src/bin/dhcp6/dhcp6_messages.mes + $(top_builddir)/src/lib/log/compiler/message $(top_srcdir)/src/bin/dhcp6/sedhcp6_messages.mes touch $@ -BUILT_SOURCES = spec_config.h dhcp6_messages.h dhcp6_messages.cc +BUILT_SOURCES = spec_config.h dhcp6_messages.h dhcp6_messages.cc \ + sedhcp6_messages.h sedhcp6_messages.cc # convenience archive @@ -72,8 +75,9 @@ if CONFIG_BACKEND_JSON libdhcp6_la_SOURCES += kea_controller.cc endif -nodist_libdhcp6_la_SOURCES = dhcp6_messages.h dhcp6_messages.cc -EXTRA_DIST += dhcp6_messages.mes +nodist_libdhcp6_la_SOURCES = dhcp6_messages.h dhcp6_messages.cc +nodist_libdhcp6_la_SOURCES += sedhcp6_messages.h sedhcp6_messages.cc +EXTRA_DIST += dhcp6_messages.mes sedhcp6_messages.mes sbin_PROGRAMS = kea-dhcp6 diff --git a/src/bin/dhcp6/dhcp6_log.h b/src/bin/dhcp6/dhcp6_log.h index 422af9c198..cc3f9cdb94 100644 --- a/src/bin/dhcp6/dhcp6_log.h +++ b/src/bin/dhcp6/dhcp6_log.h @@ -16,6 +16,7 @@ #define DHCP6_LOG_H #include +#include #include #include diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index a91a88a441..54191c2d4f 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -2887,6 +2887,8 @@ bool Dhcpv6Srv::validateSeDhcpOptions(const Pkt6Ptr& query, Pkt6Ptr& answer, bool has_pubkey = false; if (query->getOption(D6O_PUBLIC_KEY)) { has_pubkey = true; + LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL, SEDHCP6_OPTION_RECEIVED) + .arg("public key"); if (query->getOptions(D6O_PUBLIC_KEY).size() > 1) { answer->addOption(createStatusCode(STATUS_UnspecFail, "More than one public key option")); @@ -2897,6 +2899,8 @@ bool Dhcpv6Srv::validateSeDhcpOptions(const Pkt6Ptr& query, Pkt6Ptr& answer, bool has_cert = false; if (query->getOption(D6O_CERTIFICATE)) { has_cert = true; + LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL, SEDHCP6_OPTION_RECEIVED) + .arg("certificate"); if (query->getOptions(D6O_CERTIFICATE).size() > 1) { answer->addOption(createStatusCode(STATUS_UnspecFail, "More than one certificate option")); @@ -2929,6 +2933,7 @@ bool Dhcpv6Srv::validateSeDhcpOptions(const Pkt6Ptr& query, Pkt6Ptr& answer, } // Unsecure if (!signopt_required && !signopt) { + LOG_DEBUG(dhcp6_logger, DBG_DHCP6_BASIC, SEDHCP6_UNSECURE); return (true); } // signopt is true @@ -3027,6 +3032,8 @@ bool Dhcpv6Srv::validateSeDhcpOptions(const Pkt6Ptr& query, Pkt6Ptr& answer, tmstmp_opt = query->getOption(D6O_TIMESTAMP); } if (tmstmp_opt) { + LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL, SEDHCP6_OPTION_RECEIVED) + .arg("timestamp"); // Get timestamps in NTP format vector tmstmp_bin = tmstmp_opt->getData(); if (!ts_new.from_binary(tmstmp_bin)) { @@ -3066,9 +3073,11 @@ bool Dhcpv6Srv::validateSeDhcpOptions(const Pkt6Ptr& query, Pkt6Ptr& answer, // Update timestamps if (update_tmstmp) { - // TODO (ctx.host_ is a const) - // ctx.host_->setRDlast(rd_new); - // ctx.host_->setTSlast(ts_new); + Host* hp = const_cast(ctx.host_.get()); + hp->setRDlast(rd_new); + hp->setTSlast(ts_new); + LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL, + SEDHCP6_TIMESTAMP_UPDATED); } } @@ -3090,12 +3099,17 @@ void Dhcpv6Srv::appendSeDhcpOptions(Pkt6Ptr& answer) { if (state->getSignAnswers() && key && cred) { // Add the credential (public key or certificate) option uint16_t cred_type = D6O_PUBLIC_KEY; + string opt_name = "public key"; if (cred->getAsymKeyKind() == CERT) { cred_type = D6O_CERTIFICATE; + opt_name = "certificate"; } OptionBuffer buf = cred->exportkey(cred->getAsymKeyKind(), ASN1); OptionPtr cred_opt(new Option(Option::V6, cred_type, buf)); answer->addOption(cred_opt); + LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL, SEDHCP6_OPTION_ADDED) + .arg(opt_name) + .arg(cred_opt->len()); // Add the signature option uint8_t ha_id = SHA_256; @@ -3112,6 +3126,9 @@ void Dhcpv6Srv::appendSeDhcpOptions(Pkt6Ptr& answer) { assert(sig_def); OptionCustomPtr sig_opt(new OptionCustom(*sig_def, Option::V6, sig)); answer->addOption(sig_opt); + LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL, SEDHCP6_OPTION_ADDED) + .arg("signature") + .arg(sig_opt->len()); } // Add timestamps @@ -3122,6 +3139,9 @@ void Dhcpv6Srv::appendSeDhcpOptions(Pkt6Ptr& answer) { const OptionBuffer buf = val.to_binary(); OptionPtr tmsmtp_opt(new Option(Option::V6, D6O_TIMESTAMP, buf)); answer->addOption(tmsmtp_opt); + LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL, SEDHCP6_OPTION_ADDED) + .arg("timestamp") + .arg(tmsmtp_opt->len()); } } @@ -3130,17 +3150,25 @@ void Dhcpv6Srv::finalizeSignature(Pkt6Ptr& tbs) { ConstCfgSeDhcp6Ptr state = CfgMgr::instance().getCurrentCfg()->getCfgSeDhcp6(); if (!state) { - isc_throw(Unexpected, "no secure DHCPv6 configuration state"); + LOG_ERROR(dhcp6_logger, SEDHCP6_SIGNATURE_FINALIZE_FAIL) + .arg("no secure DHCPv6 configuration state"); + return; } if (!state->getSignAnswers()) { - isc_throw(Unexpected, "Signing answers is disabled"); + LOG_ERROR(dhcp6_logger, SEDHCP6_SIGNATURE_FINALIZE_FAIL) + .arg("Signing answers is disabled"); + return; } CfgSeDhcp6::AsymPtr key = state->getPrivateKey(); if (!key) { - isc_throw(Unexpected, "No private key configured"); + LOG_ERROR(dhcp6_logger, SEDHCP6_SIGNATURE_FINALIZE_FAIL) + .arg("No private key configured"); + return; } if (!tbs->getSignatureOffset()) { - isc_throw(Unexpected, "null signature offset"); + LOG_ERROR(dhcp6_logger, SEDHCP6_SIGNATURE_FINALIZE_FAIL) + .arg("null signature offset"); + return; } // TODO } diff --git a/src/bin/dhcp6/json_config_parser.cc b/src/bin/dhcp6/json_config_parser.cc index f56cfff208..37b32f0979 100644 --- a/src/bin/dhcp6/json_config_parser.cc +++ b/src/bin/dhcp6/json_config_parser.cc @@ -686,7 +686,7 @@ DhcpConfigParser* createGlobal6DhcpConfigParser(const std::string& config_id, } else if (config_id.compare("relay-supplied-options") == 0) { parser = new RSOOListConfigParser(config_id); } else if (config_id.compare("secure-dhcp6") == 0) { - parser = new SeDhcp6Parser(config_id, Option::V6); + parser = new SeDhcp6Parser(config_id, Option::V6); } else { isc_throw(DhcpConfigError, "unsupported global configuration parameter: " diff --git a/src/bin/dhcp6/kea-dhcp6.xml b/src/bin/dhcp6/kea-dhcp6.xml index 3b50427541..dafd31e4df 100644 --- a/src/bin/dhcp6/kea-dhcp6.xml +++ b/src/bin/dhcp6/kea-dhcp6.xml @@ -1,6 +1,6 @@ ]> + []>