]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
rrsig2buffer - basis function for dnssec
authorMiek Gieben <miekg@NLnetLabs.nl>
Thu, 24 Feb 2005 13:45:43 +0000 (13:45 +0000)
committerMiek Gieben <miekg@NLnetLabs.nl>
Thu, 24 Feb 2005 13:45:43 +0000 (13:45 +0000)
host2wire.c

index 3fc6cc436fc097beb02def2fffa0d524dec5e7e6..0341a2e62838497bb912a55d4c616a10217c42e2 100644 (file)
@@ -86,6 +86,56 @@ ldns_rr2buffer_wire(ldns_buffer *buffer, ldns_rr *rr, int section)
        return ldns_buffer_status(buffer);
 }
 
+/**
+ * convert a rrsig to wireformat BUT EXCLUDE the rrsig rdata
+ * This is needed in DNSSEC verification
+ * \param[out] *buffer buffer where to put the result
+ * \param[in] *rr sigrr to operate on
+ */
+ldns_status
+ldns_rrsig2buffer_wire(ldns_buffer *buffer, ldns_rr *rr)
+{
+       uint16_t i;
+       uint16_t rdl_pos = 0;
+
+       /* it must be a sig RR */
+       if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_RRSIG) {
+               return LDNS_STATUS_ERR;
+       }
+       
+       if (ldns_rr_owner(rr)) {
+               (void) ldns_dname2buffer_wire(buffer, ldns_rr_owner(rr));
+       }
+       
+       if (ldns_buffer_reserve(buffer, 4)) {
+               (void) ldns_buffer_write_u16(buffer, ldns_rr_get_type(rr));
+               (void) ldns_buffer_write_u16(buffer, ldns_rr_get_class(rr));
+       }
+
+       if (ldns_buffer_reserve(buffer, 6)) {
+               ldns_buffer_write_u32(buffer, ldns_rr_ttl(rr));
+               /* remember pos for later */
+               rdl_pos = ldns_buffer_position(buffer);
+               ldns_buffer_write_u16(buffer, 0);
+       }       
+
+       /* now convert all the rdf, except the actual signature data
+        * rdf number 8 */
+       for (i = 0; i < ldns_rr_rd_count(rr) - 1; i++) {
+               (void) ldns_rdf2buffer_wire(buffer, ldns_rr_rdf(rr, i));
+       }
+
+       if (rdl_pos != 0) {
+               ldns_buffer_write_u16_at(buffer,
+                               rdl_pos,
+                               ldns_buffer_position(buffer)
+                               - rdl_pos
+                               - 2
+                               );
+       }
+       return ldns_buffer_status(buffer);
+}
+
 /**
  * Copy the packet header data to the buffer in wire format
  */