From 0641d8970d84a3857fc274673bb433d3cda0cdb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Sat, 16 Oct 2004 12:17:47 +0000 Subject: [PATCH] add ds_record git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@14318 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/roken/resolve.c | 32 ++++++++++++++++++++++++-------- lib/roken/resolve.h | 9 +++++++++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/roken/resolve.c b/lib/roken/resolve.c index e6934f116..e4ad1545e 100644 --- a/lib/roken/resolve.c +++ b/lib/roken/resolve.c @@ -73,6 +73,7 @@ static struct stot{ DECL(srv), DECL(naptr), DECL(sshfp), + DECL(ds), {NULL, 0} }; @@ -327,7 +328,6 @@ parse_record(const unsigned char *data, const unsigned char *end_data, } case rk_ns_t_sshfp : { size_t sshfp_len; - unsigned type; if (size < 2) { free(*rr); @@ -336,13 +336,6 @@ parse_record(const unsigned char *data, const unsigned char *end_data, sshfp_len = size - 2; - type = p[1]; - - if (type != 1 && sshfp_len != 20) /* SHA-1 */ { - free(*rr); - return -1; - } - (*rr)->u.sshfp = malloc (sizeof(*(*rr)->u.sshfp) + sshfp_len - 1); if ((*rr)->u.sshfp == NULL) { free(*rr); @@ -355,6 +348,29 @@ parse_record(const unsigned char *data, const unsigned char *end_data, memcpy ((*rr)->u.sshfp->sshfp_data, p + 2, sshfp_len); break; } + case rk_ns_t_ds: { + size_t digest_len; + + if (size < 4) { + free(*rr); + return -1; + } + + digest_len = size - 4; + + (*rr)->u.ds = malloc (sizeof(*(*rr)->u.ds) + digest_len - 1); + if ((*rr)->u.ds == NULL) { + free(*rr); + return -1; + } + + (*rr)->u.ds->key_tag = (p[0] << 8) | p[1]; + (*rr)->u.ds->algorithm = p[2]; + (*rr)->u.ds->digest_type = p[3]; + (*rr)->u.ds->digest_len = digest_len; + memcpy ((*rr)->u.ds->digest_data, p + 4, digest_len); + break; + } default: (*rr)->u.data = (unsigned char*)malloc(size); if(size != 0 && (*rr)->u.data == NULL) { diff --git a/lib/roken/resolve.h b/lib/roken/resolve.h index 4e365fd19..34cfc0eed 100644 --- a/lib/roken/resolve.h +++ b/lib/roken/resolve.h @@ -80,6 +80,7 @@ typedef enum { rk_ns_t_sink = 40, /* Kitchen sink (experimentatl) */ rk_ns_t_opt = 41, /* EDNS0 option (meta-RR) */ rk_ns_t_apl = 42, /* Address prefix list (RFC 3123) */ + rk_ns_t_ds = 43, /* Delegation Signer (RFC 3658) */ rk_ns_t_sshfp = 44, /* SSH fingerprint */ rk_ns_t_tkey = 249, /* Transaction key */ rk_ns_t_tsig = 250, /* Transaction signature. */ @@ -218,6 +219,13 @@ struct sshfp_record { u_char sshfp_data[1]; }; +struct ds_record { + unsigned key_tag; + unsigned algorithm; + unsigned digest_type; + unsigned digest_len; + u_char digest_data[1]; +}; struct resource_record{ char *domain; @@ -236,6 +244,7 @@ struct resource_record{ struct cert_record *cert; struct sig_record *sig; struct sshfp_record *sshfp; + struct ds_record *ds; }u; struct resource_record *next; };