Added SILC Thread Queue API
[silc.git] / lib / silccrypt / tests / test_sha1.c
1 #include "silc.h"
2
3 /* Test vectors from NIST secure hashing definition for SHA-1 */
4
5 /* First test vector */
6 const unsigned char data1[] = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
7 const unsigned char data1_digest[] = "\x84\x98\x3e\x44\x1c\x3b\xd2\x6e\xba\xae\x4a\xa1\xf9\x51\x29\xe5\xe5\x46\x70\xf1";
8
9 /* Second test vector. This will be allocated with 1000000 'a' characters
10    and hashed */
11 char *data2 = NULL;
12 const unsigned char data2_digest[] = "\x34\xaa\x97\x3c\xd4\xc4\xda\xa4\xf6\x1e\xeb\x2b\xdb\xad\x27\x31\x65\x34\x01\x6f";
13
14 int main(int argc, char **argv)
15 {
16   SilcBool success = FALSE;
17   unsigned char digest[20];
18   SilcHash sha1;
19   
20   if (argc > 1 && !strcmp(argv[1], "-d")) {
21     silc_log_debug(TRUE);
22     silc_log_debug_hexdump(TRUE);
23     silc_log_set_debug_string("*crypt*,*hash*,*sha1*");
24   }
25
26   SILC_LOG_DEBUG(("Registering builtin hash functions"));
27   silc_hash_register_default();
28
29   SILC_LOG_DEBUG(("Allocating sha1 hash function"));
30   if (!silc_hash_alloc("sha1", &sha1)) {
31     SILC_LOG_DEBUG(("Allocating sha1 hash function failed"));
32     goto err;
33   }
34
35   /* First test vector */
36   SILC_LOG_DEBUG(("First test vector"));
37   silc_hash_init(sha1);
38   silc_hash_update(sha1, data1, strlen(data1));
39   silc_hash_final(sha1, digest);
40   SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data1, strlen(data1));
41   SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
42   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data1_digest,
43                    sizeof(digest));
44   if (memcmp(digest, data1_digest, sizeof(digest))) {
45     SILC_LOG_DEBUG(("Hash failed"));
46     goto err;
47   }
48   SILC_LOG_DEBUG(("Hash is successful"));
49   
50   /* First test vector */
51   SILC_LOG_DEBUG(("Second test vector"));
52   data2 = silc_malloc(1000000);
53   memset(data2, 'a', 1000000);
54   silc_hash_init(sha1);
55   silc_hash_update(sha1, data2, 1000000);
56   silc_hash_final(sha1, digest);
57   SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
58   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data2_digest,
59                    sizeof(digest));
60   if (memcmp(digest, data2_digest, sizeof(digest))) {
61     SILC_LOG_DEBUG(("Hash failed"));
62     goto err;
63   }
64   SILC_LOG_DEBUG(("Hash is successful"));
65
66   success = TRUE;
67   
68  err:
69   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
70   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
71
72   silc_free(data2);
73   silc_hash_free(sha1);
74   silc_hash_unregister_all();
75   return success;
76 }