[dns-operations] calculating DNSSEC keytags in awk
Olaf Kolkman
olaf at NLnetLabs.nl
Sat Dec 17 08:09:23 UTC 2011
And then there is the keytag method in Net::DNS see http://search.cpan.org/~olaf/Net-DNS-SEC-0.16/RR/DNSKEY.pm
Sent from my iPhone
On Dec 17, 2011, at 12:19 AM, Lutz Donnerhacke <lutz at iks-jena.de> wrote:
> In iks.lists.dns-operations, you wrote:
>> I realise I'm probably the only person in the world who would ever
>> want to do such a thing
>
> No, you are not that alone.
>
>> It seems to generate the right keytags for the zones I have been
>> playing with.
>
> Fine!
>
> #! /usr/bin/perl
>
> package dnskey2ds;
>
> use strict;
> use warnings;
>
> use Digest;
> use MIME::Base64;
>
> BEGIN {
> use Exporter ();
> use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
>
> $VERSION = 1.00;
> @ISA = qw(Exporter);
> @EXPORT = qw(&generate_ds);
> %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
>
> # your exported package globals go here,
> # as well as any optionally exported functions
> @EXPORT_OK = qw(&generate_ds);
>
> }
>
> use vars @EXPORT_OK;
> my $sha1 = Digest->new("SHA-1");
>
> sub generate_ds($$) {
> my $fqdn = shift;
> my ($flags, $prot, $algo, $key) = split(/\s+/, shift, 4);
> my $rdata = join("", map {decode_base64 $_} (split /\s+/, $key));
>
> local $_;
> $sha1->reset();
>
> $fqdn =~ s/\.$//;
> foreach (split (/\./,$fqdn)) { $sha1->add(pack("c/a*",$_)); }
> $sha1->add(pack("c/a*",""));
>
> my $wire = pack("ncc", $flags, 3, $algo) . $rdata;
> $sha1->add($wire);
>
> my $keytag;
> if($algo == 1) {
> $keytag = 0xffff & unpack("n", substr($wire,-3,2)) ;
> } else {
> my ($sum, $i);
> for($sum = $i = 0; $i < length $wire; $i++) {
> $_ = unpack("C", substr($wire,$i,1));
> $sum += ($i & 1) ? $_ : $_ << 8;
> }
> $keytag = 0xffff & ($sum + ($sum >> 16));
> }
>
> my $comment = "";
> if($algo == 3) {
> $_ = $rdata;
> my $len = 8*(64 + 8*unpack("C", substr($_,0,1)));
> $comment = "; Modulus = $len bit";
> } elsif($algo == 5 || $algo == 1) {
> $_ = $rdata;
> my ($len, $exponent);
> $len = unpack("C", substr($_,0,1));
> $_ = substr($_,1);
> unless($len) {
> $len = unpack("n", substr($_,0,2));
> $_ = substr($_,2);
> }
> if($len == 1) {
> $exponent = unpack("C", substr($_,0,1));
> } elsif($len == 2) {
> $exponent = unpack("n", substr($_,0,2));
> } elsif($len == 3) {
> $exponent = unpack("n", substr($_,0,2)) * 256
> + unpack("C", substr($_,2,1));
> } elsif($len == 4) {
> $exponent = unpack("N", substr($_,0,4));
> } elsif($len == 5) {
> $exponent = unpack("N", substr($_,0,4)) * 256
> + unpack("C", substr($_,4,1));
> }
> $_ = substr($_,$len);
> $_ = 8*(length $_);
> $comment = "; Modulus = $_ bit";
> if($exponent) {
> $comment .= ", Exponent = $exponent";
> } else {
> $comment .= ", Exponent = $len byte";
> }
> }
> return "$keytag $algo 1 ${\$sha1->hexdigest()} $comment";
> }
>
> 1;
> _______________________________________________
> dns-operations mailing list
> dns-operations at lists.dns-oarc.net
> https://lists.dns-oarc.net/mailman/listinfo/dns-operations
> dns-jobs mailing list
> https://lists.dns-oarc.net/mailman/listinfo/dns-jobs
More information about the dns-operations
mailing list