Home | History | Annotate | Download | only in tests
      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 
     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 
     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 
     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 
     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