1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2  * Use of this source code is governed by a BSD-style license that can be
3  * found in the LICENSE file.
4  */
5 
6 /* FIPS 180-2 Tests for message digest functions. */
7 
8 #include <stdint.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 
13 #include "cryptolib.h"
14 #include "sha_test_vectors.h"
15 
SHA1_tests(void)16 int SHA1_tests(void) {
17   int i, success = 1;
18   uint8_t sha1_digest[SHA1_DIGEST_SIZE];
19   uint8_t* test_inputs[3];
20   test_inputs[0] = (uint8_t *) oneblock_msg;
21   test_inputs[1] = (uint8_t *) multiblock_msg1;
22   test_inputs[2] = (uint8_t *) long_msg;
23 
24   for (i = 0; i < 3; i++) {
25     internal_SHA1(test_inputs[i], strlen((char *)test_inputs[i]),
26          sha1_digest);
27     if (!memcmp(sha1_digest, sha1_results[i], SHA1_DIGEST_SIZE)) {
28       fprintf(stderr, "Test vector %d PASSED for SHA-1\n", i+1);
29     }
30     else {
31       fprintf(stderr, "Test vector %d FAILED for SHA-1\n", i+1);
32       success = 0;
33     }
34   }
35   return success;
36 }
37 
SHA256_tests(void)38 int SHA256_tests(void) {
39   int i, success = 1;
40   uint8_t sha256_digest[SHA256_DIGEST_SIZE];
41   uint8_t* test_inputs[3];
42   test_inputs[0] = (uint8_t *) oneblock_msg;
43   test_inputs[1] = (uint8_t *) multiblock_msg1;
44   test_inputs[2] = (uint8_t *) long_msg;
45 
46   for (i = 0; i < 3; i++) {
47     internal_SHA256(test_inputs[i], strlen((char *)test_inputs[i]),
48            sha256_digest);
49     if (!memcmp(sha256_digest, sha256_results[i], SHA256_DIGEST_SIZE)) {
50       fprintf(stderr, "Test vector %d PASSED for SHA-256\n", i+1);
51     }
52     else {
53       fprintf(stderr, "Test vector %d FAILED for SHA-256\n", i+1);
54       success = 0;
55     }
56   }
57   return success;
58 }
59 
SHA512_tests(void)60 int SHA512_tests(void) {
61   int i, success = 1;
62   uint8_t sha512_digest[SHA512_DIGEST_SIZE];
63   uint8_t* test_inputs[3];
64   test_inputs[0] = (uint8_t *) oneblock_msg;
65   test_inputs[1] = (uint8_t *) multiblock_msg2;
66   test_inputs[2] = (uint8_t *) long_msg;
67 
68   for (i = 0; i < 3; i++) {
69     internal_SHA512(test_inputs[i], strlen((char *)test_inputs[i]),
70            sha512_digest);
71     if (!memcmp(sha512_digest, sha512_results[i], SHA512_DIGEST_SIZE)) {
72       fprintf(stderr, "Test vector %d PASSED for SHA-512\n", i+1);
73     }
74     else {
75       fprintf(stderr, "Test vector %d FAILED for SHA-512\n", i+1);
76       success = 0;
77     }
78   }
79   return success;
80 }
81 
main(int argc,char * argv[])82 int main(int argc, char* argv[]) {
83   int success = 1;
84   /* Initialize long_msg with 'a' x 1,000,000 */
85   long_msg = (char *) malloc(1000001);
86   memset(long_msg, 'a', 1000000);
87   long_msg[1000000]=0;
88 
89   if (!SHA1_tests())
90     success = 0;
91   if (!SHA256_tests())
92     success = 0;
93   if (!SHA512_tests())
94     success = 0;
95 
96   free(long_msg);
97 
98   return !success;
99 }
100