Coverage Report

Created: 2026-06-09 06:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/bind9/lib/dns/rdata/generic/rrsig_46.c
Line
Count
Source
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
/* RFC2535 */
15
16
#ifndef RDATA_GENERIC_RRSIG_46_C
17
#define RDATA_GENERIC_RRSIG_46_C
18
19
#define RRTYPE_RRSIG_ATTRIBUTES                                     \
20
33.5k
  (DNS_RDATATYPEATTR_DNSSEC | DNS_RDATATYPEATTR_ZONECUTAUTH | \
21
33.5k
   DNS_RDATATYPEATTR_ATCNAME)
22
23
static isc_result_t
24
9.52k
fromtext_rrsig(ARGS_FROMTEXT) {
25
9.52k
  isc_token_t token;
26
9.52k
  unsigned char alg, c;
27
9.52k
  long i;
28
9.52k
  dns_rdatatype_t covered;
29
9.52k
  char *e;
30
9.52k
  isc_result_t result;
31
9.52k
  isc_buffer_t buffer;
32
9.52k
  uint32_t time_signed, time_expire;
33
9.52k
  unsigned int used;
34
35
9.52k
  REQUIRE(type == dns_rdatatype_rrsig);
36
37
9.52k
  UNUSED(type);
38
9.52k
  UNUSED(rdclass);
39
9.52k
  UNUSED(callbacks);
40
41
  /*
42
   * Type covered.
43
   */
44
9.52k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
45
9.52k
              false));
46
9.52k
  result = dns_rdatatype_fromtext(&covered, &token.value.as_textregion);
47
9.52k
  if (result != ISC_R_SUCCESS && result != ISC_R_NOTIMPLEMENTED) {
48
6.82k
    i = strtol(DNS_AS_STR(token), &e, 10);
49
6.82k
    if (i < 0 || i > 65535) {
50
262
      RETTOK(ISC_R_RANGE);
51
262
    }
52
6.56k
    if (*e != 0) {
53
36
      RETTOK(result);
54
36
    }
55
6.53k
    covered = (dns_rdatatype_t)i;
56
6.53k
  }
57
9.22k
  RETERR(uint16_tobuffer(covered, target));
58
59
  /*
60
   * Algorithm.
61
   */
62
9.22k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
63
9.22k
              false));
64
9.16k
  RETTOK(dns_secalg_fromtext(&alg, &token.value.as_textregion));
65
9.05k
  RETERR(mem_tobuffer(target, &alg, 1));
66
67
  /*
68
   * Labels.
69
   */
70
9.05k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
71
9.05k
              false));
72
9.02k
  if (token.value.as_ulong > 0xffU) {
73
38
    RETTOK(ISC_R_RANGE);
74
38
  }
75
8.98k
  c = (unsigned char)token.value.as_ulong;
76
8.98k
  RETERR(mem_tobuffer(target, &c, 1));
77
78
  /*
79
   * Original ttl.
80
   */
81
8.98k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
82
8.98k
              false));
83
8.96k
  RETERR(uint32_tobuffer(token.value.as_ulong, target));
84
85
  /*
86
   * Signature expiration.
87
   */
88
8.96k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
89
8.96k
              false));
90
8.95k
  if (strlen(DNS_AS_STR(token)) <= 10U && *DNS_AS_STR(token) != '-' &&
91
8.48k
      *DNS_AS_STR(token) != '+')
92
8.48k
  {
93
8.48k
    char *end;
94
8.48k
    unsigned long u;
95
8.48k
    uint64_t u64;
96
97
8.48k
    u64 = u = strtoul(DNS_AS_STR(token), &end, 10);
98
8.48k
    if (u == ULONG_MAX || *end != 0) {
99
28
      RETTOK(DNS_R_SYNTAX);
100
28
    }
101
8.45k
    if (u64 > 0xffffffffUL) {
102
57
      RETTOK(ISC_R_RANGE);
103
57
    }
104
8.39k
    time_expire = u;
105
8.39k
  } else {
106
476
    RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &time_expire));
107
476
  }
108
8.85k
  RETERR(uint32_tobuffer(time_expire, target));
109
110
  /*
111
   * Time signed.
112
   */
113
8.85k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
114
8.85k
              false));
115
8.76k
  if (strlen(DNS_AS_STR(token)) <= 10U && *DNS_AS_STR(token) != '-' &&
116
8.39k
      *DNS_AS_STR(token) != '+')
117
8.39k
  {
118
8.39k
    char *end;
119
8.39k
    unsigned long u;
120
8.39k
    uint64_t u64;
121
122
8.39k
    u64 = u = strtoul(DNS_AS_STR(token), &end, 10);
123
8.39k
    if (u == ULONG_MAX || *end != 0) {
124
38
      RETTOK(DNS_R_SYNTAX);
125
38
    }
126
8.35k
    if (u64 > 0xffffffffUL) {
127
63
      RETTOK(ISC_R_RANGE);
128
63
    }
129
8.29k
    time_signed = u;
130
8.29k
  } else {
131
370
    RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &time_signed));
132
370
  }
133
8.64k
  RETERR(uint32_tobuffer(time_signed, target));
134
135
  /*
136
   * Key footprint.
137
   */
138
8.64k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
139
8.64k
              false));
140
8.54k
  RETERR(uint16_tobuffer(token.value.as_ulong, target));
141
142
  /*
143
   * Signer.
144
   */
145
8.50k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
146
8.50k
              false));
147
8.49k
  buffer_fromregion(&buffer, &token.value.as_region);
148
8.49k
  if (origin == NULL) {
149
24
    origin = dns_rootname;
150
24
  }
151
8.49k
  RETTOK(dns_name_wirefromtext(&buffer, origin, options, target));
152
153
  /*
154
   * Sig.
155
   */
156
8.49k
  used = isc_buffer_usedlength(target);
157
158
8.49k
  RETERR(isc_base64_tobuffer(lexer, target, isc_one_or_more));
159
160
8.45k
  if (alg == DNS_KEYALG_PRIVATEDNS || alg == DNS_KEYALG_PRIVATEOID) {
161
15
    isc_buffer_t b;
162
163
    /*
164
     * Set up 'b' so that the signature data can be parsed.
165
     */
166
15
    b = *target;
167
15
    b.active = b.used;
168
15
    b.current = used;
169
170
15
    RETERR(check_private(&b, alg));
171
8
  }
172
173
8.45k
  return ISC_R_SUCCESS;
174
8.45k
}
175
176
static isc_result_t
177
4.28k
totext_rrsig(ARGS_TOTEXT) {
178
4.28k
  isc_region_t sr;
179
4.28k
  char buf[sizeof("4294967295")]; /* Also TYPE65000. */
180
4.28k
  dns_rdatatype_t covered;
181
4.28k
  unsigned long ttl;
182
4.28k
  unsigned long when;
183
4.28k
  unsigned long exp;
184
4.28k
  unsigned long foot;
185
4.28k
  dns_name_t name;
186
187
4.28k
  REQUIRE(rdata->type == dns_rdatatype_rrsig);
188
4.28k
  REQUIRE(rdata->length != 0);
189
190
4.28k
  dns_rdata_toregion(rdata, &sr);
191
192
  /*
193
   * Type covered.
194
   */
195
4.28k
  covered = uint16_fromregion(&sr);
196
4.28k
  isc_region_consume(&sr, 2);
197
  /*
198
   * XXXAG We should have something like dns_rdatatype_isknown()
199
   * that does the right thing with type 0.
200
   */
201
4.28k
  if (dns_rdatatype_isknown(covered) && covered != 0) {
202
2.26k
    RETERR(dns_rdatatype_totext(covered, target));
203
2.26k
  } else {
204
2.02k
    snprintf(buf, sizeof(buf), "TYPE%u", covered);
205
2.02k
    RETERR(str_totext(buf, target));
206
2.02k
  }
207
4.28k
  RETERR(str_totext(" ", target));
208
209
  /*
210
   * Algorithm.
211
   */
212
4.28k
  snprintf(buf, sizeof(buf), "%u", sr.base[0]);
213
4.28k
  isc_region_consume(&sr, 1);
214
4.28k
  RETERR(str_totext(buf, target));
215
4.28k
  RETERR(str_totext(" ", target));
216
217
  /*
218
   * Labels.
219
   */
220
4.28k
  snprintf(buf, sizeof(buf), "%u", sr.base[0]);
221
4.28k
  isc_region_consume(&sr, 1);
222
4.28k
  RETERR(str_totext(buf, target));
223
4.28k
  RETERR(str_totext(" ", target));
224
225
  /*
226
   * Ttl.
227
   */
228
4.28k
  ttl = uint32_fromregion(&sr);
229
4.28k
  isc_region_consume(&sr, 4);
230
4.28k
  snprintf(buf, sizeof(buf), "%lu", ttl);
231
4.28k
  RETERR(str_totext(buf, target));
232
233
4.28k
  if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0) {
234
76
    RETERR(str_totext(" (", target));
235
76
  }
236
4.28k
  RETERR(str_totext(tctx->linebreak, target));
237
238
  /*
239
   * Sig exp.
240
   */
241
4.28k
  exp = uint32_fromregion(&sr);
242
4.28k
  isc_region_consume(&sr, 4);
243
4.28k
  RETERR(dns_time32_totext(exp, target));
244
4.28k
  RETERR(str_totext(" ", target));
245
246
  /*
247
   * Time signed.
248
   */
249
4.28k
  when = uint32_fromregion(&sr);
250
4.28k
  isc_region_consume(&sr, 4);
251
4.28k
  RETERR(dns_time32_totext(when, target));
252
4.28k
  RETERR(str_totext(" ", target));
253
254
  /*
255
   * Footprint.
256
   */
257
4.28k
  foot = uint16_fromregion(&sr);
258
4.28k
  isc_region_consume(&sr, 2);
259
4.28k
  snprintf(buf, sizeof(buf), "%lu", foot);
260
4.28k
  RETERR(str_totext(buf, target));
261
4.28k
  RETERR(str_totext(" ", target));
262
263
  /*
264
   * Signer.
265
   */
266
4.28k
  dns_name_init(&name);
267
4.28k
  dns_name_fromregion(&name, &sr);
268
4.28k
  isc_region_consume(&sr, name_length(&name));
269
4.28k
  RETERR(dns_name_totext(&name, 0, target));
270
271
  /*
272
   * Sig.
273
   */
274
4.28k
  RETERR(str_totext(tctx->linebreak, target));
275
4.28k
  if ((tctx->flags & DNS_STYLEFLAG_NOCRYPTO) == 0) {
276
4.28k
    if (tctx->width == 0) { /* No splitting */
277
0
      RETERR(isc_base64_totext(&sr, 60, "", target));
278
4.28k
    } else {
279
4.28k
      RETERR(isc_base64_totext(&sr, tctx->width - 2,
280
4.28k
             tctx->linebreak, target));
281
4.28k
    }
282
4.28k
  } else {
283
0
    RETERR(str_totext("[omitted]", target));
284
0
  }
285
286
4.28k
  if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0) {
287
76
    RETERR(str_totext(" )", target));
288
76
  }
289
290
4.28k
  return ISC_R_SUCCESS;
291
4.28k
}
292
293
static isc_result_t
294
5.71k
fromwire_rrsig(ARGS_FROMWIRE) {
295
5.71k
  isc_region_t sr;
296
5.71k
  dns_name_t name;
297
5.71k
  unsigned char algorithm;
298
299
5.71k
  REQUIRE(type == dns_rdatatype_rrsig);
300
301
5.71k
  UNUSED(type);
302
5.71k
  UNUSED(rdclass);
303
304
5.71k
  dctx = dns_decompress_setpermitted(dctx, false);
305
306
5.71k
  isc_buffer_activeregion(source, &sr);
307
  /*
308
   * type covered: 2
309
   * algorithm: 1
310
   * labels: 1
311
   * original ttl: 4
312
   * signature expiration: 4
313
   * time signed: 4
314
   * key footprint: 2
315
   */
316
5.71k
  if (sr.length < 18) {
317
26
    return ISC_R_UNEXPECTEDEND;
318
26
  }
319
320
5.69k
  algorithm = sr.base[2];
321
322
5.69k
  isc_buffer_forward(source, 18);
323
5.69k
  RETERR(mem_tobuffer(target, sr.base, 18));
324
325
  /*
326
   * Signer.
327
   */
328
5.45k
  dns_name_init(&name);
329
5.45k
  RETERR(dns_name_fromwire(&name, source, dctx, target));
330
331
  /*
332
   * Sig.
333
   */
334
5.24k
  isc_buffer_activeregion(source, &sr);
335
5.24k
  if (sr.length < 1) {
336
7
    return DNS_R_FORMERR;
337
7
  }
338
339
5.24k
  if (algorithm == DNS_KEYALG_PRIVATEDNS ||
340
4.80k
      algorithm == DNS_KEYALG_PRIVATEOID)
341
1.45k
  {
342
1.45k
    isc_buffer_t b = *source;
343
1.45k
    RETERR(check_private(&b, algorithm));
344
1.43k
  }
345
346
5.21k
  isc_buffer_forward(source, sr.length);
347
5.21k
  return mem_tobuffer(target, sr.base, sr.length);
348
5.24k
}
349
350
static isc_result_t
351
2.15k
towire_rrsig(ARGS_TOWIRE) {
352
2.15k
  isc_region_t sr;
353
2.15k
  dns_name_t name;
354
355
2.15k
  REQUIRE(rdata->type == dns_rdatatype_rrsig);
356
2.15k
  REQUIRE(rdata->length != 0);
357
358
2.15k
  dns_compress_setpermitted(cctx, false);
359
2.15k
  dns_rdata_toregion(rdata, &sr);
360
  /*
361
   * type covered: 2
362
   * algorithm: 1
363
   * labels: 1
364
   * original ttl: 4
365
   * signature expiration: 4
366
   * time signed: 4
367
   * key footprint: 2
368
   */
369
2.15k
  RETERR(mem_tobuffer(target, sr.base, 18));
370
2.15k
  isc_region_consume(&sr, 18);
371
372
  /*
373
   * Signer.
374
   */
375
2.15k
  dns_name_init(&name);
376
2.15k
  dns_name_fromregion(&name, &sr);
377
2.15k
  isc_region_consume(&sr, name_length(&name));
378
2.15k
  RETERR(dns_name_towire(&name, cctx, target));
379
380
  /*
381
   * Signature.
382
   */
383
2.15k
  return mem_tobuffer(target, sr.base, sr.length);
384
2.15k
}
385
386
static int
387
23.0k
compare_rrsig(ARGS_COMPARE) {
388
23.0k
  isc_region_t r1;
389
23.0k
  isc_region_t r2;
390
23.0k
  dns_name_t name1;
391
23.0k
  dns_name_t name2;
392
23.0k
  int order;
393
394
23.0k
  REQUIRE(rdata1->type == rdata2->type);
395
23.0k
  REQUIRE(rdata1->rdclass == rdata2->rdclass);
396
23.0k
  REQUIRE(rdata1->type == dns_rdatatype_rrsig);
397
23.0k
  REQUIRE(rdata1->length != 0);
398
23.0k
  REQUIRE(rdata2->length != 0);
399
400
23.0k
  dns_rdata_toregion(rdata1, &r1);
401
23.0k
  dns_rdata_toregion(rdata2, &r2);
402
403
23.0k
  INSIST(r1.length > 18);
404
23.0k
  INSIST(r2.length > 18);
405
23.0k
  r1.length = 18;
406
23.0k
  r2.length = 18;
407
23.0k
  order = isc_region_compare(&r1, &r2);
408
23.0k
  if (order != 0) {
409
7.26k
    return order;
410
7.26k
  }
411
412
15.7k
  dns_name_init(&name1);
413
15.7k
  dns_name_init(&name2);
414
15.7k
  dns_rdata_toregion(rdata1, &r1);
415
15.7k
  dns_rdata_toregion(rdata2, &r2);
416
15.7k
  isc_region_consume(&r1, 18);
417
15.7k
  isc_region_consume(&r2, 18);
418
15.7k
  dns_name_fromregion(&name1, &r1);
419
15.7k
  dns_name_fromregion(&name2, &r2);
420
15.7k
  order = dns_name_rdatacompare(&name1, &name2);
421
15.7k
  if (order != 0) {
422
3.94k
    return order;
423
3.94k
  }
424
425
11.8k
  isc_region_consume(&r1, name_length(&name1));
426
11.8k
  isc_region_consume(&r2, name_length(&name2));
427
428
11.8k
  return isc_region_compare(&r1, &r2);
429
15.7k
}
430
431
static isc_result_t
432
0
fromstruct_rrsig(ARGS_FROMSTRUCT) {
433
0
  dns_rdata_rrsig_t *sig = source;
434
435
0
  REQUIRE(type == dns_rdatatype_rrsig);
436
0
  REQUIRE(sig != NULL);
437
0
  REQUIRE(sig->common.rdtype == type);
438
0
  REQUIRE(sig->common.rdclass == rdclass);
439
0
  REQUIRE(sig->signature != NULL || sig->siglen == 0);
440
441
0
  UNUSED(type);
442
0
  UNUSED(rdclass);
443
444
  /*
445
   * Type covered.
446
   */
447
0
  RETERR(uint16_tobuffer(sig->covered, target));
448
449
  /*
450
   * Algorithm.
451
   */
452
0
  RETERR(uint8_tobuffer(sig->algorithm, target));
453
454
  /*
455
   * Labels.
456
   */
457
0
  RETERR(uint8_tobuffer(sig->labels, target));
458
459
  /*
460
   * Original TTL.
461
   */
462
0
  RETERR(uint32_tobuffer(sig->originalttl, target));
463
464
  /*
465
   * Expire time.
466
   */
467
0
  RETERR(uint32_tobuffer(sig->timeexpire, target));
468
469
  /*
470
   * Time signed.
471
   */
472
0
  RETERR(uint32_tobuffer(sig->timesigned, target));
473
474
  /*
475
   * Key ID.
476
   */
477
0
  RETERR(uint16_tobuffer(sig->keyid, target));
478
479
  /*
480
   * Signer name.
481
   */
482
0
  RETERR(name_tobuffer(&sig->signer, target));
483
484
  /*
485
   * Signature.
486
   */
487
0
  return mem_tobuffer(target, sig->signature, sig->siglen);
488
0
}
489
490
static isc_result_t
491
1.09k
tostruct_rrsig(ARGS_TOSTRUCT) {
492
1.09k
  isc_region_t sr;
493
1.09k
  dns_rdata_rrsig_t *sig = target;
494
1.09k
  dns_name_t signer;
495
496
1.09k
  REQUIRE(rdata->type == dns_rdatatype_rrsig);
497
1.09k
  REQUIRE(sig != NULL);
498
1.09k
  REQUIRE(rdata->length != 0);
499
500
1.09k
  DNS_RDATACOMMON_INIT(sig, rdata->type, rdata->rdclass);
501
502
1.09k
  dns_rdata_toregion(rdata, &sr);
503
504
  /*
505
   * Type covered.
506
   */
507
1.09k
  sig->covered = uint16_fromregion(&sr);
508
1.09k
  isc_region_consume(&sr, 2);
509
510
  /*
511
   * Algorithm.
512
   */
513
1.09k
  sig->algorithm = uint8_fromregion(&sr);
514
1.09k
  isc_region_consume(&sr, 1);
515
516
  /*
517
   * Labels.
518
   */
519
1.09k
  sig->labels = uint8_fromregion(&sr);
520
1.09k
  isc_region_consume(&sr, 1);
521
522
  /*
523
   * Original TTL.
524
   */
525
1.09k
  sig->originalttl = uint32_fromregion(&sr);
526
1.09k
  isc_region_consume(&sr, 4);
527
528
  /*
529
   * Expire time.
530
   */
531
1.09k
  sig->timeexpire = uint32_fromregion(&sr);
532
1.09k
  isc_region_consume(&sr, 4);
533
534
  /*
535
   * Time signed.
536
   */
537
1.09k
  sig->timesigned = uint32_fromregion(&sr);
538
1.09k
  isc_region_consume(&sr, 4);
539
540
  /*
541
   * Key ID.
542
   */
543
1.09k
  sig->keyid = uint16_fromregion(&sr);
544
1.09k
  isc_region_consume(&sr, 2);
545
546
1.09k
  dns_name_init(&signer);
547
1.09k
  dns_name_fromregion(&signer, &sr);
548
1.09k
  dns_name_init(&sig->signer);
549
1.09k
  name_duporclone(&signer, mctx, &sig->signer);
550
1.09k
  isc_region_consume(&sr, name_length(&sig->signer));
551
552
  /*
553
   * Signature.
554
   */
555
1.09k
  sig->siglen = sr.length;
556
1.09k
  sig->signature = mem_maybedup(mctx, sr.base, sig->siglen);
557
1.09k
  sig->mctx = mctx;
558
1.09k
  return ISC_R_SUCCESS;
559
1.09k
}
560
561
static void
562
0
freestruct_rrsig(ARGS_FREESTRUCT) {
563
0
  dns_rdata_rrsig_t *sig = (dns_rdata_rrsig_t *)source;
564
565
0
  REQUIRE(sig != NULL);
566
0
  REQUIRE(sig->common.rdtype == dns_rdatatype_rrsig);
567
568
0
  if (sig->mctx == NULL) {
569
0
    return;
570
0
  }
571
572
0
  dns_name_free(&sig->signer, sig->mctx);
573
0
  if (sig->signature != NULL) {
574
0
    isc_mem_free(sig->mctx, sig->signature);
575
0
  }
576
0
  sig->mctx = NULL;
577
0
}
578
579
static isc_result_t
580
0
additionaldata_rrsig(ARGS_ADDLDATA) {
581
0
  REQUIRE(rdata->type == dns_rdatatype_rrsig);
582
583
0
  UNUSED(rdata);
584
0
  UNUSED(owner);
585
0
  UNUSED(add);
586
0
  UNUSED(arg);
587
588
0
  return ISC_R_SUCCESS;
589
0
}
590
591
static isc_result_t
592
0
digest_rrsig(ARGS_DIGEST) {
593
0
  isc_region_t r1, r2;
594
0
  dns_name_t name;
595
596
0
  REQUIRE(rdata->type == dns_rdatatype_rrsig);
597
598
0
  dns_rdata_toregion(rdata, &r1);
599
0
  r2 = r1;
600
601
  /*
602
   * Type covered (2) + Algorithm (1) +
603
   * Labels (1) + Original TTL (4) +
604
   * Expire time (4) +  Time signed (4) +
605
   * Key ID (2).
606
   */
607
0
  isc_region_consume(&r2, 18);
608
0
  r1.length = 18;
609
0
  RETERR((digest)(arg, &r1));
610
611
  /* Signer */
612
0
  dns_name_init(&name);
613
0
  dns_name_fromregion(&name, &r2);
614
0
  RETERR(dns_name_digest(&name, digest, arg));
615
0
  isc_region_consume(&r2, name_length(&name));
616
617
  /* Signature */
618
0
  return (digest)(arg, &r2);
619
0
}
620
621
static dns_rdatatype_t
622
13.1k
covers_rrsig(dns_rdata_t *rdata) {
623
13.1k
  dns_rdatatype_t type;
624
13.1k
  isc_region_t r;
625
626
13.1k
  REQUIRE(rdata->type == dns_rdatatype_rrsig);
627
628
13.1k
  dns_rdata_toregion(rdata, &r);
629
13.1k
  type = uint16_fromregion(&r);
630
631
13.1k
  return type;
632
13.1k
}
633
634
static bool
635
0
checkowner_rrsig(ARGS_CHECKOWNER) {
636
0
  REQUIRE(type == dns_rdatatype_rrsig);
637
638
0
  UNUSED(name);
639
0
  UNUSED(type);
640
0
  UNUSED(rdclass);
641
0
  UNUSED(wildcard);
642
643
0
  return true;
644
0
}
645
646
static bool
647
0
checknames_rrsig(ARGS_CHECKNAMES) {
648
0
  REQUIRE(rdata->type == dns_rdatatype_rrsig);
649
650
0
  UNUSED(rdata);
651
0
  UNUSED(owner);
652
0
  UNUSED(bad);
653
654
0
  return true;
655
0
}
656
657
static int
658
0
casecompare_rrsig(ARGS_COMPARE) {
659
0
  return compare_rrsig(rdata1, rdata2);
660
0
}
661
662
#endif /* RDATA_GENERIC_RRSIG_46_C */