Added SILC Thread Queue API
[silc.git] / lib / silccrypt / tests / test_sha256.c
1 #include "silc.h"
2
3 /* Test vectors from NIST secure hashing definition for SHA-256 */
4
5 /* First test vector */
6 const unsigned char data1[] = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
7 const unsigned char data1_digest[] = "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1";
8
9 /* Second test vector */
10 const unsigned char data2[] = "abc";
11 const unsigned char data2_digest[] = "\xba\x78\x16\xbf\x8f\x01\xcf\xea\x41\x41\x40\xde\x5d\xae\x22\x23\xb0\x03\x61\xa3\x96\x17\x7a\x9c\xb4\x10\xff\x61\xf2\x00\x15\xad";
12
13 /* Third test vector */
14 const unsigned char data3[] ="ebaccc34d6d6d3d21ed0ad2ba7c07c21d253c4814f4ad89d32369237497f47a1adabfa2398ddd09d769cc46d3fd69c9303251c13c750799b8f151166bc2658609871168b30a4d0a162f183fb360f99b172811503681a11f813c16a446272ba6fd48586344533b9280856519c357059c344ef1718dbaf86fae5c10799e46b5316886fb4e68090757890539617e403c511a4f78a19c818c2ea2e9d4e2de9190c9dddb806";
15 const unsigned char data3_digest[] ="c907180443dee3cbccb4c31328e625158527a593b878de1b8e4ba37f1d69fb66";
16
17 SilcTimerStruct timer;
18
19 int main(int argc, char **argv)
20 {
21   SilcBool success = FALSE;
22   unsigned char digest[32], tmp[4096], digest2[32];
23   SilcUInt32 tmp_len;
24   SilcHash sha256;
25   
26   if (argc > 1 && !strcmp(argv[1], "-d")) {
27     silc_log_debug(TRUE);
28     silc_log_debug_hexdump(TRUE);
29     silc_log_set_debug_string("*crypt*,*hash*,*sha256*");
30   }
31
32   SILC_LOG_DEBUG(("Registering builtin hash functions"));
33   silc_hash_register_default();
34
35   SILC_LOG_DEBUG(("Allocating sha256 hash function"));
36   if (!silc_hash_alloc("sha256", &sha256)) {
37     SILC_LOG_DEBUG(("Allocating sha256 hash function failed"));
38     goto err;
39   }
40
41   SilcUInt64 t1, t2;
42   silc_timer_synchronize(&timer);
43
44   /* First test vector */
45   SILC_LOG_DEBUG(("First test vector"));
46   silc_hash_init(sha256);
47   silc_hash_update(sha256, data1, strlen(data1));
48   memset(digest, 0, sizeof(digest));
49   t1 = silc_timer_tick(&timer, FALSE);
50   silc_hash_final(sha256, digest);
51   t2 = silc_timer_tick(&timer, TRUE);
52   SILC_LOG_DEBUG(("cycles: %d", t2 - t1));
53   SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data1, strlen(data1));
54   SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
55   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data1_digest,
56                    sizeof(digest));
57   if (memcmp(digest, data1_digest, sizeof(digest))) {
58     SILC_LOG_DEBUG(("Hash failed"));
59     goto err;
60   }
61   SILC_LOG_DEBUG(("Hash is successful"));
62   
63   /* Second test vector */
64   SILC_LOG_DEBUG(("Second test vector"));
65   silc_hash_init(sha256);
66   silc_hash_update(sha256, data2, strlen(data2));
67   silc_hash_final(sha256, digest);
68   SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data2, strlen(data2));
69   SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
70   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data2_digest,
71                    sizeof(digest));
72   if (memcmp(digest, data2_digest, sizeof(digest))) {
73     SILC_LOG_DEBUG(("Hash failed"));
74     goto err;
75   }
76   SILC_LOG_DEBUG(("Hash is successful"));
77   
78   /* Third test vector */
79   SILC_LOG_DEBUG(("Third test vector"));
80   silc_hash_init(sha256);
81   silc_hex2data(data3, tmp, sizeof(tmp), &tmp_len);
82   silc_hash_update(sha256, tmp, tmp_len);
83   silc_hash_final(sha256, digest);
84   SILC_LOG_HEXDUMP(("Message"), tmp, tmp_len);
85   SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
86   silc_hex2data(data3_digest, digest2, sizeof(digest2), NULL);
87   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)digest2,
88                    sizeof(digest));
89   if (memcmp(digest, digest2, sizeof(digest))) {
90     SILC_LOG_DEBUG(("Hash failed"));
91     goto err;
92   }
93   SILC_LOG_DEBUG(("Hash is successful"));
94   
95   success = TRUE;
96   
97  err:
98   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
99   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
100
101   silc_hash_free(sha256);
102   silc_hash_unregister_all();
103   return success;
104 }