From 372d88de22d3ecaed4047f7756683d3cd38cedc0 Mon Sep 17 00:00:00 2001
From: Jan Vcelak <jan.vcelak@nic.cz>
Date: Mon, 16 Sep 2013 15:41:25 +0200
Subject: [PATCH] DNSSEC: keep DNSKEY RDATA in knot_dnssec_key_t structure

We need the public key data to manage the keys in the zone.

refs #4
---
 src/libknot/dnssec/sign.c | 17 +++++++++++++++--
 src/libknot/dnssec/sign.h |  2 ++
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/libknot/dnssec/sign.c b/src/libknot/dnssec/sign.c
index 432b12de1a..bd1fb5765e 100644
--- a/src/libknot/dnssec/sign.c
+++ b/src/libknot/dnssec/sign.c
@@ -800,17 +800,27 @@ int knot_dnssec_key_from_params(const knot_key_params_t *params,
 		return KNOT_ENOMEM;
 	}
 
-	int result = init_algorithm_data(params, data);
+	knot_binary_t rdata_copy = { 0 };
+	int result = knot_binary_dup(&params->rdata, &rdata_copy);
 	if (result != KNOT_EOK) {
 		knot_dname_free(&name);
 		free(data);
 		return result;
 	}
 
+	result = init_algorithm_data(params, data);
+	if (result != KNOT_EOK) {
+		knot_dname_free(&name);
+		free(data);
+		knot_binary_free(&rdata_copy);
+		return result;
+	}
+
 	key->name = name;
 	key->keytag = params->keytag;
 	key->algorithm = params->algorithm;
 	key->data = data;
+	key->dnskey_rdata = rdata_copy;
 
 	return KNOT_EOK;
 }
@@ -820,8 +830,9 @@ int knot_dnssec_key_from_params(const knot_key_params_t *params,
  */
 int knot_dnssec_key_free(knot_dnssec_key_t *key)
 {
-	if (!key)
+	if (!key) {
 		return KNOT_EINVAL;
+	}
 
 	knot_dname_free(&key->name);
 
@@ -830,6 +841,8 @@ int knot_dnssec_key_free(knot_dnssec_key_t *key)
 		free(key->data);
 	}
 
+	knot_binary_free(&key->dnskey_rdata);
+
 	memset(key, '\0', sizeof(knot_dnssec_key_t));
 
 	return KNOT_EOK;
diff --git a/src/libknot/dnssec/sign.h b/src/libknot/dnssec/sign.h
index 82515e0971..a0601caeef 100644
--- a/src/libknot/dnssec/sign.h
+++ b/src/libknot/dnssec/sign.h
@@ -28,6 +28,7 @@
 #define _KNOT_DNSSEC_SIGN_H_
 
 #include "common/descriptor.h"
+#include "libknot/binary.h"
 #include "libknot/dnssec/algorithm.h"
 #include "libknot/dnssec/key.h"
 
@@ -51,6 +52,7 @@ typedef struct {
 	uint16_t keytag;                   //!< Key tag (for fast lookup).
 	knot_dnssec_algorithm_t algorithm; //!< Algorithm identification.
 	knot_dnssec_key_data_t *data;      //!< Private key data.
+	knot_binary_t dnskey_rdata;        //!< DNSKEY RDATA.
 } knot_dnssec_key_t;
 
 /*- DNSSEC private key manipulation ------------------------------------------*/
-- 
GitLab