Package: libnet-dns-perl
Version: 0.66-2+b2

        Please add support for the hmac-sha1, hmac-sha224, hmac-sha256,
        hmac-sha384, hmac-sha512 algorithms (as per RFC 4635.)

        An example algorithm switcher (untested) is MIME'd.  Please
        note, however, that it relies on a patched version of
        Digest::HMAC, which allows passing an instantiated Digest object
        to the Digest::HMAC->new () constructor.

-- 
FSF associate member #7257      np. Rime of the Ancient Mariner — Iron Maiden
require Digest;
require Digest::HMAC;
require MIME::Base64;

## based on Net::DNS::RR::TSIG::sign_hmac
sub new_sign_hmac {
    my ($digest, $block_size) = @_;

    ## .
    sub {
        my ($key_s, $data) = @_;
        $key_s =~ s/\s//g;
        my $key
            = MIME::Base64::decode_base64 ($key_s);
        my $hmac
            = Digest::HMAC->new ($key, $digest, $block_size);
        $hmac->add ($data);

        ## .
        $hmac->digest ();
    }
}

## NB: a value is either a CODE reference, or [ "digest", block_size ]
our $rr_tsig_algo_info = {
    "HMAC-MD5.SIG-ALG.REG.INT"  => [ "MD5",  64 ],
    "hmac-sha1"     => [ "SHA-1",    64 ],
    "hmac-sha224"   => [ "SHA-224",  64 ],
    "hmac-sha256"   => [ "SHA-256",  64 ],
    "hmac-sha384"   => [ "SHA-384", 128 ],
    "hmac-sha512"   => [ "SHA-512", 128 ]
};

sub rr_tsig_algo {
    my ($tsig, $algo) = @_;
    my $hmac
        = $rr_tsig_algo_info->{$algo};

    ## .
    return undef
        unless (defined ($hmac));

    $tsig->{"sign_func"}
        = (ref ($hmac) eq "CODE"
           ? $hmac
           : new_sign_hmac (Digest->new ($hmac->[0]), $hmac->[1]));
    $tsig->{"algorithm"}
        = $algo;

    ## .
    $tsig;
}

# my $tsig
#     = Net::DNS::TSIG->new (...)
#     or die ();
# rr_tsig_algo ($tsig, "hmac-sha512")
#     or die ();

Reply via email to