+static int dns_packet_read_public_key(DnsPacket *p, size_t length,
+ void **dp, size_t *lengthp,
+ size_t *start) {
+ int r;
+ const void *d;
+ void *d2;
+
+ r = dns_packet_read(p, length, &d, NULL);
+ if (r < 0)
+ return r;
+
+ d2 = memdup(d, length);
+ if (!d2)
+ return -ENOMEM;
+
+ *dp = d2;
+ *lengthp = length;
+ return 0;
+}
+
+static bool loc_size_ok(uint8_t size) {
+ uint8_t m = size >> 4, e = size & 0xF;
+
+ return m <= 9 && e <= 9 && (m > 0 || e == 0);
+}
+
+static int dnskey_parse_flags(DnsResourceRecord *rr, uint16_t flags) {
+ if (flags & ~(DNSKEY_FLAG_SEP | DNSKEY_FLAG_ZONE_KEY))
+ return -EBADMSG;
+
+ rr->dnskey.zone_key_flag = flags & DNSKEY_FLAG_ZONE_KEY;
+ rr->dnskey.sep_flag = flags & DNSKEY_FLAG_SEP;
+ return 0;
+}
+