// When signing is disabled this is almost done
if (!sign_answers) {
- try {
- return (CfgSeDhcp6(sign_answers,
- timestamp_answers,
- check_signatures,
- check_authorizations,
- check_timestamps,
- online_validation));
- } catch (const std::exception& ex) {
- isc_throw(DhcpConfigError, "Failed to build the secure "
- "DHCPv6 configuration state: " << ex.what());
- } catch (...) {
- isc_throw(DhcpConfigError, "Failed to build the secure "
- "DHCPv6 configuration state");
- }
- // unreachable
+ try {
+ return (CfgSeDhcp6(sign_answers,
+ timestamp_answers,
+ check_signatures,
+ check_authorizations,
+ check_timestamps,
+ online_validation));
+ } catch (const std::exception& ex) {
+ isc_throw(DhcpConfigError, "Failed to build the secure "
+ "DHCPv6 configuration state: " << ex.what());
+ } catch (...) {
+ isc_throw(DhcpConfigError, "Failed to build the secure "
+ "DHCPv6 configuration state");
+ }
+ // unreachable
}
// Signing is enabled, we need more
CryptoLink& crypto = CryptoLink::getCryptoLink();
std::ostringstream errmsg;
try {
- errmsg.str("Failed to get the private key from '");
+ errmsg << "Failed to get the private key from '";
errmsg << private_key.c_str() << "'";
AsymPtr priv_key(crypto.createAsym(private_key,
"",
ASN1),
deleteAsym);
- errmsg.str("Failed to get the ");
+ errmsg.str("");
+ errmsg << "Failed to get the ";
errmsg << (public_key.empty() ? "certificate" : "public key")
- << " from '" << credential.c_str() << "'";
+ << " from '" << credential.c_str() << "'";
AsymPtr cred(crypto.createAsym(credential,
"",
signature_algorithm,
ASN1),
deleteAsym);
- errmsg.str("Failed to build the secure DHCPv6 configuration state");
- return (CfgSeDhcp6(sign_answers,
- timestamp_answers,
- check_signatures,
- check_authorizations,
- check_timestamps,
- online_validation,
- priv_key,
- cred));
+ errmsg.str("");
+ errmsg << "Mismatch between the private key and the";
+ errmsg << (public_key.empty() ? "certificate" : "public key");
+ if (!priv_key->compare(cred.get(), PUBLIC)) {
+ isc_throw(DhcpConfigError, errmsg.str());
+ }
+
+ errmsg.str("");
+ errmsg << "Failed to build the secure DHCPv6 configuration state";
+ return (CfgSeDhcp6(sign_answers,
+ timestamp_answers,
+ check_signatures,
+ check_authorizations,
+ check_timestamps,
+ online_validation,
+ priv_key,
+ cred));
+ } catch (const DhcpConfigError&) {
+ throw;
} catch (const std::exception& ex) {
isc_throw(DhcpConfigError, errmsg << ": " << ex.what());
} catch (...) {
- isc_throw(DhcpConfigError, errmsg);
+ isc_throw(DhcpConfigError, errmsg.str());
}
// unreachable
}
EXPECT_EQ(pub_key->getAsymKeyKind(), PUBLIC);
}
+// This test checks another public key config
+TEST_F(SeDhcp6ParserTest, fullPubKeyBadKey) {
+ std::string config = "{ \"sign-answers\": true,"
+ " \"private-key\": \"" SEDHCP6_DATA_DIR "/priv2.pem\","
+ " \"public-key\": \"" SEDHCP6_DATA_DIR "/pub.pem\" }";
+
+ ElementPtr config_element = Element::fromJSON(config);
+
+ SeDhcp6Parser parser("secure-dhcp6", Option::V6);
+ ASSERT_NO_THROW(parser.build(config_element));
+
+ // Keys don't match
+ ASSERT_THROW(parser.commit(), DhcpConfigError);
+}
+
// This test checks the parsing of a full config using a certificate
TEST_F(SeDhcp6ParserTest, fullWithCertificate) {
std::string config = "{ \"sign-answers\": true,"
--- /dev/null
+-----BEGIN PRIVATE KEY-----
+MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAK21g50Q7XXd8vuc
+D/irGG+qJaVOdnAYdzrCXgMv7yY0ViKYv49sI4qWkM7Yzx2mQpu6fkxRmShhIRyX
+HMlrE7swi6pLzb/ZXcH8yAM6gXtIOw97jiE8QQvawdZZ33kYThE/hd7N2uUAnejh
+iFHfLZSY9PIx5qfPhKKD1ZxudVXTAgMBAAECgYB83V5HF/TpZeqUrIDaifpdwhuf
+cQA34Y5LAY5ckidA+hv0cII6UUxXAZYD6dsvf+SfVnYU3A7Q9Mi9aW465qpeE1cZ
+AeshQvRrDNW5gz7pRmsQfoTlswQXuI4hKyOna1XnvI6OUTOLKh3Ohu/QBGtQbpqL
+a1ZWE/iB16Tdi47cUQJBAOFimVWoyQDjQCG4gSti2OORVgwsjN5fiG+4dJuvfRbK
+JIOoH4dQW5/BthZ/Tk6HRR+Dh8RP+B44Rcrl4N+VRikCQQDFTfZufrhUfooWT5pE
+w4sZtQcprKsQ3PBuIShwEPaBredRoZ5NVxE5d75d3DQmqLq+/XitXaQkqc3r6TBX
+omObAkEAm8Z6FCpEQsjOWoAbRtFa9m5M+r0P3+JHenASqEfyPP4ZnqVkpTF1IkXQ
+hFwY003LCKzv+U8MPlbGZiXb9qxFgQJBAIbgieL1K4tPSZSA7EOvrSpwrynVCMgp
+UQ7oCd26KtlxiV0rb60NJRA1BGTjgJ8g3zBq1BEnn2sUzVlE+rAdqZsCQQCk8yNm
+PGgVEd6dT2o9fTvJbOz3yHcFDga/e46/klm2aoEtZwFF+qIo8qiIRnbMJczgQL+Z
+3mT0bxrvypE3n6b4
+-----END PRIVATE KEY-----