r19339: Merge my 4.0-unittest branch. This adds an API for more fine-grained
[sfrench/samba-autobuild/.git] / source4 / lib / crypto / sha1test.c
1 /*
2  This file contains the reference implementation of SHA-1
3  from http://www.ietf.org/rfc/rfc3174.txt
4 */
5 /*
6  *  sha1test.c
7  *
8  *  Description:
9  *      This file will exercise the SHA-1 code performing the three
10  *      tests documented in FIPS PUB 180-1 plus one which calls
11  *      SHA1Input with an exact multiple of 512 bits, plus a few
12  *      error test checks.
13  *
14  *  Portability Issues:
15  *      None.
16  *
17  */
18
19 #include "includes.h"
20 #include "torture/ui.h"
21
22 #include "lib/crypto/crypto.h"
23
24 struct torture_context;
25
26 /*
27  *  Define patterns for testing
28  */
29 #define TEST1   "abc"
30 #define TEST2a  "abcdbcdecdefdefgefghfghighijhi"
31 #define TEST2b  "jkijkljklmklmnlmnomnopnopq"
32 #define TEST2   TEST2a TEST2b
33 #define TEST3   "a"
34 #define TEST4a  "01234567012345670123456701234567"
35 #define TEST4b  "01234567012345670123456701234567"
36     /* an exact multiple of 512 bits */
37 #define TEST4   TEST4a TEST4b
38 static const char *testarray[4] =
39 {
40     TEST1,
41     TEST2,
42     TEST3,
43     TEST4
44 };
45 static int repeatcount[4] = { 1, 1, 1000000, 10 };
46 static const char *resultarray[4] =
47 {
48     "A9 99 3E 36 47 06 81 6A BA 3E 25 71 78 50 C2 6C 9C D0 D8 9D ",
49     "84 98 3E 44 1C 3B D2 6E BA AE 4A A1 F9 51 29 E5 E5 46 70 F1 ",
50     "34 AA 97 3C D4 C4 DA A4 F6 1E EB 2B DB AD 27 31 65 34 01 6F ",
51     "DE A3 56 A2 CD DD 90 C7 A7 EC ED C5 EB B5 63 93 4F 46 04 52 "
52 };
53
54
55 bool torture_local_crypto_sha1(struct torture_context *tctx)
56 {
57     struct SHA1Context sha;
58     int i, j, err;
59     uint8_t Message_Digest[20];
60     BOOL ret = True;
61     char tmp[60 + 10];
62
63     /*
64      *  Perform SHA-1 tests
65      */
66     for(j = 0; j < 4; ++j)
67     {
68         ZERO_STRUCT(tmp);
69         torture_comment(tctx, "Test %d: %d, '%s'\n",
70                 j+1,
71                 repeatcount[j],
72                 testarray[j]);
73
74         err = SHA1Init(&sha);
75         torture_assert_int_equal(tctx, err, 0, "SHA1Init Error");
76
77         for(i = 0; i < repeatcount[j]; ++i)
78         {
79             err = SHA1Update(&sha,
80                   (const unsigned char *) testarray[j],
81                   strlen(testarray[j]));
82                         torture_assert_int_equal(tctx, err, 0, "SHA1Update Error");
83         }
84
85         err = SHA1Final(Message_Digest, &sha);
86                 torture_assert_int_equal(tctx, err, 0, 
87             "SHA1Result Error, could not compute message digest.");
88         torture_comment(tctx, "\t");
89         for(i = 0; i < 20 ; ++i)
90         {
91                 snprintf(tmp+(i*3), sizeof(tmp) - (i*3),"%02X ", Message_Digest[i]);
92             torture_comment(tctx, "%02X ", Message_Digest[i]);
93         }
94         torture_comment(tctx, "\n");
95         torture_comment(tctx, "Should match:\n\t%s\n", resultarray[j]);
96         if (strcmp(resultarray[j], tmp) != 0) {
97             ret = False;        
98         }
99     }
100
101     /* Test some error returns */
102     err = SHA1Update(&sha,(const unsigned char *) testarray[1], 1);
103     torture_assert_int_equal(tctx, err, shaStateError, "SHA1Update failed");
104     err = SHA1Init(0);
105     torture_assert_int_equal(tctx, err, shaNull, "SHA1Init failed");
106
107         return true;
108 }
109
110