package Crypt::Keyczar::HmacKey;
use base 'Crypt::Keyczar::Key';
use strict;
use warnings;

use Crypt::Keyczar qw(KEY_HASH_SIZE);
use Crypt::Keyczar::Util;


sub expose {
    my $self = shift;
    my $expose = {};
    $expose->{hmacKeyString} = $self->{hmacKeyString};
    $expose->{size}          = $self->{size};
    return $expose;
}



sub get_bytes {
    return Crypt::Keyczar::Util::decode($_[0]->{hmacKeyString});
}


sub digest_size {
    return 20;
}


sub init {
    my $self = shift;
    my $rawkey = $self->get_bytes;
    my $hash = Crypt::Keyczar::Util::hash($rawkey);
    $self->hash(substr $hash, 0, KEY_HASH_SIZE());
    return $self;
}


sub generate {
    my $class = shift;
    my $size = shift;

    my $self = $class->new;
    $self->{size} = $size || 256;

    my $raw = Crypt::Keyczar::Util::random($self->{size}/8);
    $self->{hmacKeyString} = Crypt::Keyczar::Util::encode($raw);
    $self->init();
    return $self;
}


sub read {
    my $class = shift;
    my $json_string = shift;

    my $obj = Crypt::Keyczar::Util::decode_json($json_string);
    my $self = bless $obj, $class;
    $self->init();
    return $self;
}


sub get_engine {
    my $self = shift;
    return Crypt::Keyczar::HmacEngine->new('sha1', $self->get_bytes);
}

1;


package Crypt::Keyczar::HmacEngine;
use base 'Exporter';
use strict;
use warnings;
use Crypt::Keyczar::Engine;


1;
__END__