Skip to content

Commit

Permalink
From: Mike McCauley <mikem@open.com.au>
Browse files Browse the repository at this point in the history
Subject: Patch for Digest-SHA1-2.02
To: Gisle Aas <gisle@ActiveState.com>
Date: Thu, 5 Jun 2003 11:28:31 +1000
Organization: Open System Consultants

Hello Gisle,

I have attached a patch for Digest-SHA1-2.02 which adds a new function
to get at the raw sha_transform. This is required to support NIST FIPS
186-2 Random Number Generation algorithm 1.

There are some test cases included.

I hope you will be able to roll this patch into your main line?

patch -p1 <Digest-SHA1-2.02.patch

Cheers.

--
Mike McCauley                               mikem@open.com.au
Open System Consultants Pty. Ltd            Unix, Perl, Motif, C++, WWW
24 Bateman St Hampton, VIC 3188 Australia   http://www.open.com.au
Phone +61 3 9598-0985                       Fax   +61 3 9598-0955
  • Loading branch information
gisle committed Jul 5, 2003
1 parent 5d9bf8c commit 93acdc0
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 25 deletions.
7 changes: 7 additions & 0 deletions Changes
@@ -1,3 +1,10 @@
2003-06-04 Mike McCauley (mikem@open.com.au)

Release 2.03

Added sha1_transform, required to implement NIST FIPS 186-2.


2002-12-27 Gisle Aas <gisle@ActiveState.com>

Release 2.02
Expand Down
9 changes: 8 additions & 1 deletion SHA1.pm
Expand Up @@ -7,7 +7,7 @@ $VERSION = '2.03'; # $Date$

require Exporter;
*import = \&Exporter::import;
@EXPORT_OK = qw(sha1 sha1_hex sha1_base64);
@EXPORT_OK = qw(sha1 sha1_hex sha1_base64 sha1_transform);

require DynaLoader;
@ISA=qw(DynaLoader);
Expand All @@ -30,6 +30,7 @@ Digest::SHA1 - Perl interface to the SHA-1 Algorithm
$digest = sha1($data);
$digest = sha1_hex($data);
$digest = sha1_base64($data);
$digest = sha1_transform($data);
# OO style
Expand All @@ -43,6 +44,7 @@ Digest::SHA1 - Perl interface to the SHA-1 Algorithm
$digest = $ctx->digest;
$digest = $ctx->hexdigest;
$digest = $ctx->b64digest;
$digest = $ctx->transform;
=head1 DESCRIPTION
Expand Down Expand Up @@ -79,6 +81,11 @@ Same as sha1(), but will return the digest in hexadecimal form.
Same as sha1(), but will return the digest as a base64 encoded string.
=item sha1_transform($data)
Implements the basic SHA1 trasnform on a 64 byte block. $data and the returned $digest are
in binary form. This algorithm is used in NIST FIPS 186-2
=back
=head1 METHODS
Expand Down
71 changes: 49 additions & 22 deletions SHA1.xs
Expand Up @@ -295,8 +295,33 @@ static void sha_update(SHA_INFO *sha_info, U8 *buffer, int count)
sha_info->local = count;
}

/* finish computing the SHA digest */

static void sha_transform_and_copy(unsigned char digest[20], SHA_INFO *sha_info)
{
sha_transform(sha_info);
digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);
digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);
digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff);
digest[ 3] = (unsigned char) ((sha_info->digest[0] ) & 0xff);
digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);
digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);
digest[ 6] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff);
digest[ 7] = (unsigned char) ((sha_info->digest[1] ) & 0xff);
digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);
digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);
digest[10] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff);
digest[11] = (unsigned char) ((sha_info->digest[2] ) & 0xff);
digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);
digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);
digest[14] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff);
digest[15] = (unsigned char) ((sha_info->digest[3] ) & 0xff);
digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);
digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);
digest[18] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff);
digest[19] = (unsigned char) ((sha_info->digest[4] ) & 0xff);
}

/* finish computing the SHA digest */
static void sha_final(unsigned char digest[20], SHA_INFO *sha_info)
{
int count;
Expand All @@ -322,32 +347,13 @@ static void sha_final(unsigned char digest[20], SHA_INFO *sha_info)
sha_info->data[61] = (lo_bit_count >> 16) & 0xff;
sha_info->data[62] = (lo_bit_count >> 8) & 0xff;
sha_info->data[63] = (lo_bit_count >> 0) & 0xff;
sha_transform(sha_info);
digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);
digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);
digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff);
digest[ 3] = (unsigned char) ((sha_info->digest[0] ) & 0xff);
digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);
digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);
digest[ 6] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff);
digest[ 7] = (unsigned char) ((sha_info->digest[1] ) & 0xff);
digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);
digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);
digest[10] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff);
digest[11] = (unsigned char) ((sha_info->digest[2] ) & 0xff);
digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);
digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);
digest[14] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff);
digest[15] = (unsigned char) ((sha_info->digest[3] ) & 0xff);
digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);
digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);
digest[18] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff);
digest[19] = (unsigned char) ((sha_info->digest[4] ) & 0xff);
sha_transform_and_copy(digest, sha_info);
}





/*----------------------------------------------------------------*/
#ifndef INT2PTR
#define INT2PTR(any,d) (any)(d)
Expand Down Expand Up @@ -583,3 +589,24 @@ sha1(...)
sha_final(digeststr, &ctx);
ST(0) = make_mortal_sv(digeststr, ix);
XSRETURN(1);

void
sha1_transform(...)
PREINIT:
SHA_INFO ctx;
int i;
unsigned char *data;
unsigned char test[64];
STRLEN len;
unsigned char digeststr[20];
PPCODE:
sha_init(&ctx);

memset (test, 0, 64);
data = (unsigned char *)(SvPVbyte(ST(0), len));
memcpy (test, data, len);
memcpy ((&ctx)->data, test, 64);
sha_transform_and_copy(digeststr, &ctx);
ST(0) = newSVpv(digeststr, 20);
XSRETURN(1);

18 changes: 16 additions & 2 deletions t/sha1.t
@@ -1,6 +1,6 @@
print "1..5\n";
print "1..8\n";

use Digest::SHA1 qw(sha1 sha1_hex sha1_base64);
use Digest::SHA1 qw(sha1 sha1_hex sha1_base64 sha1_transform);

print "not " unless Digest::SHA1->new->add("abc")->hexdigest eq "a9993e364706816aba3e25717850c26c9cd0d89d";
print "ok 1\n";
Expand Down Expand Up @@ -29,3 +29,17 @@ print "ok 5\n";
close(FILE);

unlink("stest$$.txt");


print "not " unless sha1_transform(pack('H*', 'dc71a8092d4b1b7b98101d58698d9d1cc48225bb'))
eq pack('H*', '2e4c75ad39160f52614d122e6c7ec80446f68567');
print "ok 6\n";

print "not " unless sha1_transform(pack('H*', '0abe1db666612acdf95d2f86d60c65210b78ab23'))
eq pack('H*', '7c1c2aabca822912f3016299b160035787477b48');
print "ok 7\n";

print "not " unless sha1_transform(pack('H*', '86da486230e353e0ec5e9220876c687892c0266c'))
eq pack('H*', '1da304aec652c21d4f54642434705c91aeaf9abe');
print "ok 8\n";

0 comments on commit 93acdc0

Please sign in to comment.