ldns  1.7.0
keys.h
Go to the documentation of this file.
1 /*
2  *
3  * keys.h
4  *
5  * priv key definitions
6  *
7  * a Net::DNS like library for C
8  *
9  * (c) NLnet Labs, 2005-2006
10  *
11  * See the file LICENSE for the license
12  */
13 
21 #ifndef LDNS_KEYS_H
22 #define LDNS_KEYS_H
23 
24 #include <ldns/common.h>
25 #if LDNS_BUILD_CONFIG_HAVE_SSL
26 #include <openssl/ssl.h>
27 #endif /* LDNS_BUILD_CONFIG_HAVE_SSL */
28 #include <ldns/util.h>
29 #include <errno.h>
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
36 
37 #define LDNS_KEY_ZONE_KEY 0x0100 /* rfc 4034 */
38 #define LDNS_KEY_SEP_KEY 0x0001 /* rfc 4034 */
39 #define LDNS_KEY_REVOKE_KEY 0x0080 /* rfc 5011 */
40 
45 {
46  LDNS_RSAMD5 = 1, /* RFC 4034,4035 */
47  LDNS_DH = 2,
48  LDNS_DSA = 3,
49  LDNS_ECC = 4,
53  LDNS_RSASHA256 = 8, /* RFC 5702 */
54  LDNS_RSASHA512 = 10, /* RFC 5702 */
55  LDNS_ECC_GOST = 12, /* RFC 5933 */
56  LDNS_ECDSAP256SHA256 = 13, /* RFC 6605 */
57  LDNS_ECDSAP384SHA384 = 14, /* RFC 6605 */
58 #ifdef USE_ED25519
59  /* this ifdef is internal to ldns, because we do not want to export
60  * the symbol. Users can define it if they want access,
61  * the feature is not fully implemented at this time and openssl
62  * does not support it fully either (also for ED448). */
63  LDNS_ED25519 = 15, /* draft-ietf-curdle-dnskey-ed25519 */
64 #endif
65 #ifdef USE_ED448
66  LDNS_ED448 = 16, /* draft-ietf-curdle-dnskey-ed448 */
67 #endif
71 };
73 
78 {
79  LDNS_SHA1 = 1, /* RFC 4034 */
80  LDNS_SHA256 = 2, /* RFC 4509 */
81  LDNS_HASH_GOST = 3, /* RFC 5933 */
82  LDNS_SHA384 = 4 /* RFC 6605 */
83 };
85 
90 {
101 #ifdef USE_ED25519
102  LDNS_SIGN_ED25519 = LDNS_ED25519,
103 #endif
104 #ifdef USE_ED448
105  LDNS_SIGN_ED448 = LDNS_ED448,
106 #endif
107  LDNS_SIGN_HMACMD5 = 157, /* not official! This type is for TSIG, not DNSSEC */
108  LDNS_SIGN_HMACSHA1 = 158, /* not official! This type is for TSIG, not DNSSEC */
109  LDNS_SIGN_HMACSHA256 = 159, /* ditto */
110  LDNS_SIGN_HMACSHA224 = 162, /* ditto */
111  LDNS_SIGN_HMACSHA384 = 164, /* ditto */
112  LDNS_SIGN_HMACSHA512 = 165 /* ditto */
113 };
115 
127  ldns_signing_algorithm _alg;
129  bool _use;
131  /* TODO remove unions? */
132  struct {
133 #if LDNS_BUILD_CONFIG_HAVE_SSL
134 #ifndef S_SPLINT_S
135  /* The key can be an OpenSSL EVP Key
136  */
137  EVP_PKEY *key;
138 #endif
139 #endif /* LDNS_BUILD_CONFIG_HAVE_SSL */
140 
143  struct {
144  unsigned char *key;
145  size_t size;
146  } hmac;
151  } _key;
153  union {
155  struct {
157  uint32_t orig_ttl;
159  uint32_t inception;
161  uint32_t expiration;
163  uint16_t keytag;
165  uint16_t flags;
166  } dnssec;
167  } _extra;
170 };
171 typedef struct ldns_struct_key ldns_key;
172 
177 {
178  size_t _key_count;
180 };
182 
183 
189 
194 ldns_key *ldns_key_new(void);
195 
203 ldns_key *ldns_key_new_frm_algorithm(ldns_signing_algorithm a, uint16_t size);
204 
216 
228 ldns_status ldns_key_new_frm_fp_l(ldns_key **k, FILE *fp, int *line_nr);
229 
230 #if LDNS_BUILD_CONFIG_HAVE_SSL
231 
235 ldns_status ldns_key_new_frm_engine(ldns_key **key, ENGINE *e, char *key_id, ldns_algorithm);
236 
237 
244 RSA *ldns_key_new_frm_fp_rsa(FILE *fp);
245 #endif /* LDNS_BUILD_CONFIG_HAVE_SSL */
246 
247 #if LDNS_BUILD_CONFIG_HAVE_SSL
248 
255 RSA *ldns_key_new_frm_fp_rsa_l(FILE *fp, int *line_nr);
256 #endif /* LDNS_BUILD_CONFIG_HAVE_SSL */
257 
258 #if LDNS_BUILD_CONFIG_HAVE_SSL
259 
265 DSA *ldns_key_new_frm_fp_dsa(FILE *fp);
266 #endif /* LDNS_BUILD_CONFIG_HAVE_SSL */
267 
268 #if LDNS_BUILD_CONFIG_HAVE_SSL
269 
276 DSA *ldns_key_new_frm_fp_dsa_l(FILE *fp, int *line_nr);
277 #endif /* LDNS_BUILD_CONFIG_HAVE_SSL */
278 
279 #if LDNS_BUILD_CONFIG_HAVE_SSL
280 
288 unsigned char *ldns_key_new_frm_fp_hmac(FILE *fp, size_t *hmac_size);
289 #endif
290 
291 #if LDNS_BUILD_CONFIG_HAVE_SSL
292 
301 unsigned char *ldns_key_new_frm_fp_hmac_l(FILE *fp, int *line_nr, size_t *hmac_size);
302 #endif /* LDNS_BUILD_CONFIG_HAVE_SSL */
303 
304 /* acces write functions */
310 void ldns_key_set_algorithm(ldns_key *k, ldns_signing_algorithm l);
311 #if LDNS_BUILD_CONFIG_HAVE_SSL
312 
317 void ldns_key_set_evp_key(ldns_key *k, EVP_PKEY *e);
318 
325 void ldns_key_set_rsa_key(ldns_key *k, RSA *r);
326 
333 void ldns_key_set_dsa_key(ldns_key *k, DSA *d);
334 
341 void ldns_key_assign_rsa_key(ldns_key *k, RSA *r);
342 
349 void ldns_key_assign_dsa_key(ldns_key *k, DSA *d);
350 
356 int ldns_key_EVP_load_gost_id(void);
357 
359 void ldns_key_EVP_unload_gost(void);
360 #endif /* LDNS_BUILD_CONFIG_HAVE_SSL */
361 
367 void ldns_key_set_hmac_key(ldns_key *k, unsigned char *hmac);
368 
380 
386 void ldns_key_set_hmac_size(ldns_key *k, size_t hmac_size);
392 void ldns_key_set_origttl(ldns_key *k, uint32_t t);
398 void ldns_key_set_inception(ldns_key *k, uint32_t i);
404 void ldns_key_set_expiration(ldns_key *k, uint32_t e);
416 void ldns_key_set_keytag(ldns_key *k, uint16_t tag);
422 void ldns_key_set_flags(ldns_key *k, uint16_t flags);
428 void ldns_key_list_set_key_count(ldns_key_list *key, size_t count);
429 
437 
443 size_t ldns_key_list_key_count(const ldns_key_list *key_list);
444 
451 ldns_key *ldns_key_list_key(const ldns_key_list *key, size_t nr);
452 
453 #if LDNS_BUILD_CONFIG_HAVE_SSL
454 
459 RSA *ldns_key_rsa_key(const ldns_key *k);
465 EVP_PKEY *ldns_key_evp_key(const ldns_key *k);
466 #endif /* LDNS_BUILD_CONFIG_HAVE_SSL */
467 
471 #if LDNS_BUILD_CONFIG_HAVE_SSL
472 DSA *ldns_key_dsa_key(const ldns_key *k);
473 #endif /* LDNS_BUILD_CONFIG_HAVE_SSL */
474 
480 ldns_signing_algorithm ldns_key_algorithm(const ldns_key *k);
486 void ldns_key_set_use(ldns_key *k, bool v);
492 bool ldns_key_use(const ldns_key *k);
498 unsigned char *ldns_key_hmac_key(const ldns_key *k);
504 void *ldns_key_external_key(const ldns_key *k);
510 size_t ldns_key_hmac_size(const ldns_key *k);
516 uint32_t ldns_key_origttl(const ldns_key *k);
522 uint32_t ldns_key_inception(const ldns_key *k);
528 uint32_t ldns_key_expiration(const ldns_key *k);
534 uint16_t ldns_key_keytag(const ldns_key *k);
546 void
547 ldns_key_list_set_use(ldns_key_list *keys, bool v);
548 
554 uint16_t ldns_key_flags(const ldns_key *k);
555 
562 
572 ldns_rr *ldns_key2rr(const ldns_key *k);
573 
580 void ldns_key_print(FILE *output, const ldns_key *k);
581 
587 void ldns_key_free(ldns_key *key);
588 
596 
601 void ldns_key_list_free(ldns_key_list *key_list);
602 
608 ldns_rr * ldns_read_anchor_file(const char *filename);
609 
621 
627 int ldns_key_algo_supported(int algo);
628 
634 ldns_signing_algorithm ldns_get_signing_algorithm_by_name(const char* name);
635 
636 #ifdef __cplusplus
637 }
638 #endif
639 
640 #endif /* LDNS_KEYS_H */
uint32_t ldns_key_origttl(const ldns_key *k)
return the original ttl of the key
Definition: keys.c:1600
ldns_status ldns_key_new_frm_fp_l(ldns_key **k, FILE *fp, int *line_nr)
Creates a new private key based on the contents of the file pointed by fp.
Definition: keys.c:454
uint32_t ldns_key_inception(const ldns_key *k)
return the key&#39;s inception date
Definition: keys.c:1612
unsigned char * key
Definition: keys.h:144
ldns_status ldns_key_new_frm_engine(ldns_key **key, ENGINE *e, char *key_id, ldns_algorithm)
Read the key with the given id from the given engine and store it in the given ldns_key structure...
Definition: keys.c:104
ldns_rr * ldns_read_anchor_file(const char *filename)
Instantiates a DNSKEY or DS RR from file.
Definition: keys.c:2101
uint32_t orig_ttl
The TTL of the rrset that is currently signed.
Definition: keys.h:157
DSA * ldns_key_new_frm_fp_dsa_l(FILE *fp, int *line_nr)
frm_fp helper function.
uint16_t keytag
The keytag of this key.
Definition: keys.h:163
unsigned char * ldns_key_hmac_key(const ldns_key *k)
return the hmac key data
Definition: keys.c:1574
void ldns_key_assign_rsa_key(ldns_key *k, RSA *r)
Assign the key&#39;s rsa data The rsa data will be freed automatically when the key is freed...
Definition: keys.c:1429
uint16_t flags
The dnssec key flags as specified in RFC4035, like ZSK and KSK.
Definition: keys.h:165
void ldns_key_free(ldns_key *key)
frees a key structure, but not its internal data structures
Definition: keys.c:2065
ldns_enum_algorithm
Algorithms used in dns.
Definition: keys.h:44
void ldns_key_list_set_key_count(ldns_key_list *key, size_t count)
Set the keylist&#39;s key count to count.
Definition: keys.c:1647
RSA * ldns_key_rsa_key(const ldns_key *k)
returns the (openssl) RSA struct contained in the key
Definition: keys.c:1547
ldns_key ** _keys
Definition: keys.h:179
void ldns_key_set_pubkey_owner(ldns_key *k, ldns_rdf *r)
Set the key&#39;s pubkey owner.
Definition: keys.c:1487
int ldns_key_algo_supported(int algo)
See if a key algorithm is supported.
Definition: keys.c:2170
Definition: keys.h:48
ldns_rdf * ldns_key_pubkey_owner(const ldns_key *k)
return the public key&#39;s owner
Definition: keys.c:1630
signed char ldns_key_use(const ldns_key *k)
return the use flag
Definition: keys.c:1530
enum ldns_enum_hash ldns_hash
Definition: keys.h:84
void * external_key
the key structure can also just point to some external key data
Definition: keys.h:150
struct ldns_struct_key::@0 _key
Storage pointers for the types of keys supported.
void ldns_key_set_hmac_size(ldns_key *k, size_t hmac_size)
Set the key&#39;s hmac size.
Definition: keys.c:1457
DSA * ldns_key_new_frm_fp_dsa(FILE *fp)
frm_fp helper function.
Definition: keys.c:946
ldns_key * ldns_key_list_key(const ldns_key_list *key, size_t nr)
returns a pointer to the key in the list at the given position
Definition: keys.c:1506
uint32_t expiration
The expiration date of signatures made with this key.
Definition: keys.h:161
EVP_PKEY * key
Definition: keys.h:137
RSA * ldns_key_new_frm_fp_rsa_l(FILE *fp, int *line_nr)
frm_fp helper function.
Definition: keys.c:774
ldns_enum_hash
Hashing algorithms used in the DS record.
Definition: keys.h:77
Resource Record.
Definition: rr.h:302
void ldns_key_set_external_key(ldns_key *key, void *external_key)
Set the key id data.
Definition: keys.c:1463
ldns_key * ldns_key_new(void)
Creates a new empty key structure.
Definition: keys.c:71
void ldns_key_set_hmac_key(ldns_key *k, unsigned char *hmac)
Set the key&#39;s hmac data.
Definition: keys.c:1451
ldns_rr * ldns_key2rr(const ldns_key *k)
converts a ldns_key to a public key rr If the key data exists at an external point, the corresponding rdata field must still be added with ldns_rr_rdf_push() to the result rr of this function
Definition: keys.c:1816
size_t size
Definition: keys.h:145
signed char _use
Whether to use this key when signing.
Definition: keys.h:129
General key structure, can contain all types of keys that are used in DNSSEC.
Definition: keys.h:126
ldns_key * ldns_key_new_frm_algorithm(ldns_signing_algorithm a, uint16_t size)
Creates a new key based on the algorithm.
Definition: keys.c:1124
size_t ldns_key_list_key_count(const ldns_key_list *key_list)
returns the number of keys in the key list
Definition: keys.c:1500
void ldns_key_set_expiration(ldns_key *k, uint32_t e)
Set the key&#39;s expiration date (seconds after epoch)
Definition: keys.c:1481
enum ldns_enum_signing_algorithm ldns_signing_algorithm
Definition: keys.h:114
void ldns_key_assign_dsa_key(ldns_key *k, DSA *d)
Assign the key&#39;s dsa data The dsa data will be freed automatically when the key is freed...
Definition: keys.c:1437
uint16_t ldns_key_flags(const ldns_key *k)
return the flag of the key
Definition: keys.c:1606
void ldns_key_print(FILE *output, const ldns_key *k)
print a private key to the file output
Definition: keys.c:1376
void ldns_key_set_rsa_key(ldns_key *k, RSA *r)
Set the key&#39;s rsa data.
Definition: keys.c:1409
struct ldns_struct_key::@1::@3 dnssec
Some values that influence generated signatures.
uint32_t inception
The inception date of signatures made with this key.
Definition: keys.h:159
ldns_rdf * _pubkey_owner
Owner name of the key.
Definition: keys.h:169
ldns_lookup_table ldns_signing_algorithms[]
Definition: keys.c:23
ldns_key_list * ldns_key_list_new(void)
Creates a new empty key list.
Definition: keys.c:58
union ldns_struct_key::@1 _extra
Depending on the key we can have extra data.
Same as rr_list, but now for keys.
Definition: keys.h:176
int ldns_key_EVP_load_gost_id(void)
Get the PKEY id for GOST, loads GOST into openssl as a side effect.
Definition: keys.c:132
void ldns_key_set_use(ldns_key *k, signed char v)
set the use flag
void * ldns_key_external_key(const ldns_key *k)
return the key id key data
Definition: keys.c:1594
size_t ldns_key_hmac_size(const ldns_key *k)
return the hmac key size
Definition: keys.c:1584
char * ldns_key_get_file_base_name(const ldns_key *key)
Returns the &#39;default base name&#39; for key files; IE.
Definition: keys.c:2153
ldns_signing_algorithm ldns_key_algorithm(const ldns_key *k)
return the signing alg of the key
Definition: keys.c:1516
ldns_signing_algorithm ldns_get_signing_algorithm_by_name(const char *name)
Get signing algorithm by name.
Definition: keys.c:2181
enum ldns_enum_status ldns_status
Definition: error.h:134
Definition: keys.h:47
A general purpose lookup table.
Definition: util.h:156
unsigned char * ldns_key_new_frm_fp_hmac(FILE *fp, size_t *hmac_size)
frm_fp helper function.
Definition: keys.c:1057
ldns_signing_algorithm _alg
Definition: keys.h:127
signed char ldns_key_list_push_key(ldns_key_list *key_list, ldns_key *key)
pushes a key to a keylist
Definition: keys.c:1653
Definition: keys.h:79
void ldns_key_set_inception(ldns_key *k, uint32_t i)
Set the key&#39;s inception date (seconds after epoch)
Definition: keys.c:1475
void ldns_key_list_set_use(ldns_key_list *keys, signed char v)
Set the &#39;use&#39; flag for all keys in the list.
void ldns_key_set_dsa_key(ldns_key *k, DSA *d)
Set the key&#39;s dsa data The dsa data should be freed by the user.
Definition: keys.c:1417
uint32_t ldns_key_expiration(const ldns_key *k)
return the key&#39;s expiration date
Definition: keys.c:1618
size_t _key_count
Definition: keys.h:178
void ldns_key_set_keytag(ldns_key *k, uint16_t tag)
Set the key&#39;s key tag.
Definition: keys.c:1493
void ldns_key_list_free(ldns_key_list *key_list)
Frees a key list structure.
Definition: keys.c:2090
void ldns_key_set_evp_key(ldns_key *k, EVP_PKEY *e)
Set the key&#39;s evp key.
Definition: keys.c:1403
DSA * ldns_key_dsa_key(const ldns_key *k)
returns the (openssl) DSA struct contained in the key
Definition: keys.c:1557
Resource record data field.
Definition: rdata.h:174
Common definitions for LDNS.
void ldns_key_deep_free(ldns_key *key)
frees a key structure and all its internal data structures, except the data set by ldns_key_set_exter...
Definition: keys.c:2071
ldns_enum_signing_algorithm
Algorithms used in dns for signing.
Definition: keys.h:89
unsigned char * ldns_key_new_frm_fp_hmac_l(FILE *fp, int *line_nr, size_t *hmac_size)
frm_fp helper function.
EVP_PKEY * ldns_key_evp_key(const ldns_key *k)
returns the (openssl) EVP struct contained in the key
Definition: keys.c:1541
void ldns_key_EVP_unload_gost(void)
Release the engine reference held for the GOST engine.
Definition: keys.c:180
ldns_key * ldns_key_list_pop_key(ldns_key_list *key_list)
pops the last rr from a keylist
Definition: keys.c:1676
struct ldns_struct_key::@0::@2 hmac
The key can be an HMAC key.
RSA * ldns_key_new_frm_fp_rsa(FILE *fp)
frm_fp helper function.
Definition: keys.c:768
void ldns_key_set_algorithm(ldns_key *k, ldns_signing_algorithm l)
Set the key&#39;s algorithm.
Definition: keys.c:1389
Definition: keys.h:49
void ldns_key_set_origttl(ldns_key *k, uint32_t t)
Set the key&#39;s original ttl.
Definition: keys.c:1469
ldns_status ldns_key_new_frm_fp(ldns_key **k, FILE *fp)
Creates a new priv key based on the contents of the file pointed by fp.
Definition: keys.c:97
void ldns_key_set_flags(ldns_key *k, uint16_t flags)
Set the key&#39;s flags.
Definition: keys.c:1395
enum ldns_enum_algorithm ldns_algorithm
Definition: keys.h:72
uint16_t ldns_key_keytag(const ldns_key *k)
return the keytag
Definition: keys.c:1624