summaryrefslogtreecommitdiff
path: root/cpan/Digest-SHA/t/gglong.t
blob: 4d8c53d77c44fb38f20dbb21c71a8b91102da34e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# Test against long bitwise vectors from Jim Gillogly and Francois Grieu
#
# http://www.chiark.greenend.org.uk/pipermail/ukcrypto/1999-February/003538.html

use strict;
use FileHandle;

my $MODULE;

BEGIN {
	$MODULE = ($ENV{PERL_CORE} || -d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
	eval "require $MODULE" || die $@;
	$MODULE->import(qw());
}

BEGIN {
	if ($ENV{PERL_CORE}) {
		chdir 't' if -d 't';
		@INC = '../lib';
	}
}

#	SHA-1 Test Vectors
#
#	In the following we use the notation bitstring#n to mean a bitstring
#	repeated n (in decimal) times, and we use | for concatenation.
#	Therefore 110#3|1 is 1101101101.
#
#	Here is a set near 2^32 bits to test the roll-over in the length
#	field from one to two 32-bit words:
#
#	110#1431655764|11 1eef5a18 969255a3 b1793a2a 955c7ec2 8cd221a5
#	110#1431655765|   7a1045b9 14672afa ce8d90e6 d19b3a6a da3cb879
#	110#1431655765|1  d5e09777 a94f1ea9 240874c4 8d9fecb6 b634256b
#	110#1431655765|11 eb256904 3c3014e5 1b2862ae 6eb5fb4e 0b851d99
#
#	011#1431655764|01 4CB0C4EF 69143D5B F34FC35F 1D4B19F6 ECCAE0F2
#	011#1431655765    47D92F91 1FC7BB74 DE00ADFC 4E981A81 05556D52
#	011#1431655765|0  A3D7438C 589B0B93 2AA91CC2 446F06DF 9ABC73F0
#	011#1431655765|01 3EEE3E1E 28DEDE2C A444D68D A5675B2F AAAB3203

my @vec110 = (	# 110 rep 1431655764
	"11", "1eef5a18969255a3b1793a2a955c7ec28cd221a5",
	"110", "7a1045b914672aface8d90e6d19b3a6ada3cb879",
	"1101", "d5e09777a94f1ea9240874c48d9fecb6b634256b",
	"11011", "eb2569043c3014e51b2862ae6eb5fb4e0b851d99"
);

my @vec011 = (	# 011 rep 1431655764
	"01", "4cb0c4ef69143d5bf34fc35f1d4b19f6eccae0f2",
	"011", "47d92f911fc7bb74de00adfc4e981a8105556d52",
	"0110", "a3d7438c589b0b932aa91cc2446f06df9abc73f0",
	"01101", "3eee3e1e28dede2ca444d68da5675b2faaab3203"
);
print "1..", scalar(@vec110) / 2 + scalar(@vec011) / 2, "\n";

my $STATE110 = "gglong0.tmp";
my $STATE011 = "gglong1.tmp";

END { 1 while unlink $STATE110, $STATE011 }

for ($STATE011, $STATE110) {
	my $fh = FileHandle->new($_, "w");
	for (1 .. 8) { my $line = <DATA>; print $fh $line }
	$fh->close;
}

my $reps = 1 << 14;
my $loops = int(1431655764 / $reps);
my $rest = 3 * (1431655764 - $loops * $reps);

sub state110 {
	my $i;
	my $state;
	my $bitstr;

	$state = $MODULE->new(1);
	if (-r $STATE110) {
		if ($state->load($STATE110)) {
			return($state);
		}
	}
	$bitstr = pack("B*", "110" x $reps);
	$state->reset;
	for ($i = 0; $i < $loops; $i++) {
		$state->add_bits($bitstr, 3 * $reps);
	}
	$state->add_bits($bitstr, $rest);
	$state->dump($STATE110);
	return($state);
}

sub state011 {
	my $i;
	my $state;
	my $bitstr;

	$state = $MODULE->new(1);
	if (-r $STATE011) {
		if ($state->load($STATE011)) {
			return($state);
		}
	}
	$bitstr = pack("B*", "011" x $reps);
	$state->reset;
	for ($i = 0; $i < $loops; $i++) {
		$state->add_bits($bitstr, 3 * $reps);
	}
	$state->add_bits($bitstr, $rest);
	$state->dump($STATE011);
	return($state);
}

my $i;

my $testnum = 1;

my $state110 = state110();
for ($i = 0; $i < @vec110/2; $i++) {
	my $state = $state110->clone;
	$state->add_bits($vec110[2*$i]);
	print "not " unless $state->hexdigest eq $vec110[2*$i+1];
	print "ok ", $testnum++, "\n";
}

my $state011 = state011();
for ($i = 0; $i < @vec011/2; $i++) {
	my $state = $state011->clone;
	$state->add_bits($vec011[2*$i]);
	print "not " unless $state->hexdigest eq $vec011[2*$i+1];
	print "ok ", $testnum++, "\n";
}

__DATA__
alg:1
H:7950cbe2:86a45aa0:91ff7dff:29015b42:3912e764:00000000:00000000:00000000
block:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6
blockcnt:508
lenhh:0
lenhl:0
lenlh:0
lenll:4294967292
alg:1
H:dfc51a14:87b4a4b7:ecf19acd:8cbbe40e:03a435f8:00000000:00000000:00000000
block:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d:b6:db:6d
blockcnt:508
lenhh:0
lenhl:0
lenlh:0
lenll:4294967292