use OpenSSL::NativeLib;
use NativeCall;

unit module OpenSSL::Digest;

our constant MD5_DIGEST_LENGTH    = 16;
our constant SHA1_DIGEST_LENGTH   = 20;
our constant SHA256_DIGEST_LENGTH = 32;
our constant SHA384_DIGEST_LENGTH = 48;
our constant SHA512_DIGEST_LENGTH = 64;

sub MD5( Blob, size_t, Blob ) is native(&gen-lib)    { ... }
sub SHA1( Blob, size_t, Blob ) is native(&gen-lib)   { ... }
sub SHA256( Blob, size_t, Blob ) is native(&gen-lib) { ... }
sub SHA384( Blob, size_t, Blob ) is native(&gen-lib) { ... }
sub SHA512( Blob, size_t, Blob ) is native(&gen-lib) { ... }

sub md5(Blob $msg) is export {
     my $digest = buf8.allocate(MD5_DIGEST_LENGTH);
     MD5($msg, $msg.bytes, $digest);
     $digest;
}

sub sha1(Blob $msg) is export {
     my $digest = buf8.allocate(SHA1_DIGEST_LENGTH);
     SHA1($msg, $msg.bytes, $digest);
     $digest;
}

sub sha256(Blob $msg) is export {
     my $digest = buf8.allocate(SHA256_DIGEST_LENGTH);
     SHA256($msg, $msg.bytes, $digest);
     $digest;
}

sub sha384(Blob $msg) is export {
     my $digest = buf8.allocate(SHA384_DIGEST_LENGTH);
     SHA384($msg, $msg.bytes, $digest);
     $digest;
}

sub sha512(Blob $msg) is export {
     my $digest = buf8.allocate(SHA512_DIGEST_LENGTH);
     SHA512($msg, $msg.bytes, $digest);
     $digest;
}

