1 /*
2  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
3  *
4  * SPDX-License-Identifier: MPL-2.0
5  *
6  * This Source Code Form is subject to the terms of the Mozilla Public
7  * License, v. 2.0. If a copy of the MPL was not distributed with this
8  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
9  *
10  * See the COPYRIGHT file distributed with this work for additional
11  * information regarding copyright ownership.
12  */
13 
14 /*! \file */
15 
16 #include <inttypes.h>
17 
18 #include <isc/buffer.h>
19 #include <isc/mem.h>
20 #include <isc/string.h>
21 #include <isc/util.h>
22 
23 #include <dns/keydata.h>
24 #include <dns/rdata.h>
25 #include <dns/rdatastruct.h>
26 
27 isc_result_t
dns_keydata_todnskey(dns_rdata_keydata_t * keydata,dns_rdata_dnskey_t * dnskey,isc_mem_t * mctx)28 dns_keydata_todnskey(dns_rdata_keydata_t *keydata, dns_rdata_dnskey_t *dnskey,
29 		     isc_mem_t *mctx) {
30 	REQUIRE(keydata != NULL && dnskey != NULL);
31 
32 	dnskey->common.rdtype = dns_rdatatype_dnskey;
33 	dnskey->common.rdclass = keydata->common.rdclass;
34 	dnskey->mctx = mctx;
35 	dnskey->flags = keydata->flags;
36 	dnskey->protocol = keydata->protocol;
37 	dnskey->algorithm = keydata->algorithm;
38 
39 	dnskey->datalen = keydata->datalen;
40 
41 	if (mctx == NULL) {
42 		dnskey->data = keydata->data;
43 	} else {
44 		dnskey->data = isc_mem_allocate(mctx, dnskey->datalen);
45 		memmove(dnskey->data, keydata->data, dnskey->datalen);
46 	}
47 
48 	return (ISC_R_SUCCESS);
49 }
50 
51 isc_result_t
dns_keydata_fromdnskey(dns_rdata_keydata_t * keydata,dns_rdata_dnskey_t * dnskey,uint32_t refresh,uint32_t addhd,uint32_t removehd,isc_mem_t * mctx)52 dns_keydata_fromdnskey(dns_rdata_keydata_t *keydata, dns_rdata_dnskey_t *dnskey,
53 		       uint32_t refresh, uint32_t addhd, uint32_t removehd,
54 		       isc_mem_t *mctx) {
55 	REQUIRE(keydata != NULL && dnskey != NULL);
56 
57 	keydata->common.rdtype = dns_rdatatype_keydata;
58 	keydata->common.rdclass = dnskey->common.rdclass;
59 	keydata->mctx = mctx;
60 	keydata->refresh = refresh;
61 	keydata->addhd = addhd;
62 	keydata->removehd = removehd;
63 	keydata->flags = dnskey->flags;
64 	keydata->protocol = dnskey->protocol;
65 	keydata->algorithm = dnskey->algorithm;
66 
67 	keydata->datalen = dnskey->datalen;
68 	if (mctx == NULL) {
69 		keydata->data = dnskey->data;
70 	} else {
71 		keydata->data = isc_mem_allocate(mctx, keydata->datalen);
72 		memmove(keydata->data, dnskey->data, keydata->datalen);
73 	}
74 
75 	return (ISC_R_SUCCESS);
76 }
77