| // RUN: %clangxx -O0 -g %s -DSHASIZE=224 -o %t -lmd && %run %t 2>&1 | FileCheck %s -check-prefix=CHECK-224 |
| // RUN: %clangxx -O0 -g %s -DSHASIZE=256 -o %t -lmd && %run %t 2>&1 | FileCheck %s -check-prefix=CHECK-256 |
| // RUN: %clangxx -O0 -g %s -DSHASIZE=384 -o %t -lmd && %run %t 2>&1 | FileCheck %s -check-prefix=CHECK-384 |
| // RUN: %clangxx -O0 -g %s -DSHASIZE=512 -o %t -lmd && %run %t 2>&1 | FileCheck %s -check-prefix=CHECK-512 |
| |
| #include <sys/param.h> |
| |
| #include <assert.h> |
| #include <sha224.h> |
| #include <sha256.h> |
| #include <sha384.h> |
| #include <sha512.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #ifndef SHASIZE |
| #error SHASIZE must be defined |
| #endif |
| |
| #define _SHA_CTX(x) SHA##x##_CTX |
| #define SHA_CTX(x) _SHA_CTX(x) |
| |
| #define _SHA_DIGEST_LENGTH(x) SHA##x##_DIGEST_LENGTH |
| #define SHA_DIGEST_LENGTH(x) _SHA_DIGEST_LENGTH(x) |
| |
| #define _SHA_DIGEST_STRING_LENGTH(x) SHA##x##_DIGEST_STRING_LENGTH |
| #define SHA_DIGEST_STRING_LENGTH(x) _SHA_DIGEST_STRING_LENGTH(x) |
| |
| #define _SHA_Init(x) SHA##x##_Init |
| #define SHA_Init(x) _SHA_Init(x) |
| |
| #define _SHA_Update(x) SHA##x##_Update |
| #define SHA_Update(x) _SHA_Update(x) |
| |
| #define _SHA_Final(x) SHA##x##_Final |
| #define SHA_Final(x) _SHA_Final(x) |
| |
| #define _SHA_End(x) SHA##x##_End |
| #define SHA_End(x) _SHA_End(x) |
| |
| #define _SHA_File(x) SHA##x##_File |
| #define SHA_File(x) _SHA_File(x) |
| |
| #define _SHA_FileChunk(x) SHA##x##_FileChunk |
| #define SHA_FileChunk(x) _SHA_FileChunk(x) |
| |
| #define _SHA_Data(x) SHA##x##_Data |
| #define SHA_Data(x) _SHA_Data(x) |
| |
| void test1() { |
| SHA_CTX(SHASIZE) ctx; |
| uint8_t entropy[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; |
| uint8_t digest[SHA_DIGEST_LENGTH(SHASIZE)]; |
| size_t entropysz = sizeof(entropy); |
| size_t digestsz = sizeof(digest); |
| |
| SHA_Init(SHASIZE)(&ctx); |
| SHA_Update(SHASIZE)(&ctx, entropy, entropysz); |
| SHA_Final(SHASIZE)(digest, &ctx); |
| |
| printf("test1: '"); |
| for (size_t i = 0; i < digestsz; i++) |
| printf("%02x", digest[i]); |
| printf("'\n"); |
| } |
| |
| void test2() { |
| SHA_CTX(SHASIZE) ctx; |
| uint8_t entropy[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; |
| char digest[SHA_DIGEST_STRING_LENGTH(SHASIZE)]; |
| size_t entropysz = sizeof(entropy); |
| |
| SHA_Init(SHASIZE)(&ctx); |
| SHA_Update(SHASIZE)(&ctx, entropy, entropysz); |
| char *p = SHA_End(SHASIZE)(&ctx, digest); |
| assert(p == digest); |
| |
| printf("test2: '%s'\n", digest); |
| } |
| |
| void test3() { |
| SHA_CTX(SHASIZE) ctx; |
| uint8_t entropy[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; |
| size_t entropysz = sizeof(entropy); |
| |
| SHA_Init(SHASIZE)(&ctx); |
| SHA_Update(SHASIZE)(&ctx, entropy, entropysz); |
| char *p = SHA_End(SHASIZE)(&ctx, NULL); |
| assert(strlen(p) == SHA_DIGEST_STRING_LENGTH(SHASIZE) - 1); |
| |
| printf("test3: '%s'\n", p); |
| |
| free(p); |
| } |
| |
| void test4() { |
| char digest[SHA_DIGEST_STRING_LENGTH(SHASIZE)]; |
| |
| char *p = SHA_File(SHASIZE)("/etc/fstab", digest); |
| assert(p == digest); |
| |
| printf("test4: '%s'\n", p); |
| } |
| |
| void test5() { |
| char *p = SHA_File(SHASIZE)("/etc/fstab", NULL); |
| assert(strlen(p) == SHA_DIGEST_STRING_LENGTH(SHASIZE) - 1); |
| |
| printf("test5: '%s'\n", p); |
| |
| free(p); |
| } |
| |
| void test6() { |
| char digest[SHA_DIGEST_STRING_LENGTH(SHASIZE)]; |
| |
| char *p = SHA_FileChunk(SHASIZE)("/etc/fstab", digest, 10, 20); |
| assert(p == digest); |
| |
| printf("test6: '%s'\n", p); |
| } |
| |
| void test7() { |
| char *p = SHA_FileChunk(SHASIZE)("/etc/fstab", NULL, 10, 20); |
| assert(strlen(p) == SHA_DIGEST_STRING_LENGTH(SHASIZE) - 1); |
| |
| printf("test7: '%s'\n", p); |
| |
| free(p); |
| } |
| |
| void test8() { |
| uint8_t entropy[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; |
| char digest[SHA_DIGEST_STRING_LENGTH(SHASIZE)]; |
| size_t entropysz = sizeof(entropy); |
| |
| char *p = SHA_Data(SHASIZE)(entropy, entropysz, digest); |
| assert(p == digest); |
| |
| printf("test8: '%s'\n", p); |
| } |
| |
| void test9() { |
| uint8_t entropy[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; |
| size_t entropysz = sizeof(entropy); |
| |
| char *p = SHA_Data(SHASIZE)(entropy, entropysz, NULL); |
| assert(strlen(p) == SHA_DIGEST_STRING_LENGTH(SHASIZE) - 1); |
| |
| printf("test9: '%s'\n", p); |
| |
| free(p); |
| } |
| |
| int main(void) { |
| printf("SHA%d\n", SHASIZE); |
| |
| test1(); |
| test2(); |
| test3(); |
| test4(); |
| test5(); |
| test6(); |
| test7(); |
| test8(); |
| test9(); |
| |
| // CHECK-224: SHA224 |
| // CHECK-224: test1: '760dfb93100a6bf5996c90f678e529dc945bb2f74a211eedcf0f3a48' |
| // CHECK-224: test2: '760dfb93100a6bf5996c90f678e529dc945bb2f74a211eedcf0f3a48' |
| // CHECK-224: test3: '760dfb93100a6bf5996c90f678e529dc945bb2f74a211eedcf0f3a48' |
| // CHECK-224: test4: '{{.*}}' |
| // CHECK-224: test5: '{{.*}}' |
| // CHECK-224: test6: '{{.*}}' |
| // CHECK-224: test7: '{{.*}}' |
| // CHECK-224: test8: '760dfb93100a6bf5996c90f678e529dc945bb2f74a211eedcf0f3a48' |
| // CHECK-224: test9: '760dfb93100a6bf5996c90f678e529dc945bb2f74a211eedcf0f3a48' |
| |
| // CHECK-256: SHA256 |
| // CHECK-256: test1: 'bb000ddd92a0a2a346f0b531f278af06e370f86932ccafccc892d68d350f80f8' |
| // CHECK-256: test2: 'bb000ddd92a0a2a346f0b531f278af06e370f86932ccafccc892d68d350f80f8' |
| // CHECK-256: test3: 'bb000ddd92a0a2a346f0b531f278af06e370f86932ccafccc892d68d350f80f8' |
| // CHECK-256: test4: '{{.*}}' |
| // CHECK-256: test5: '{{.*}}' |
| // CHECK-256: test6: '{{.*}}' |
| // CHECK-256: test7: '{{.*}}' |
| // CHECK-256: test8: 'bb000ddd92a0a2a346f0b531f278af06e370f86932ccafccc892d68d350f80f8' |
| // CHECK-256: test9: 'bb000ddd92a0a2a346f0b531f278af06e370f86932ccafccc892d68d350f80f8' |
| |
| // CHECK-384: SHA384 |
| // CHECK-384: test1: 'f450c023b168ebd56ff916ca9b1f1f0010b8c592d28205cc91fa3056f629eed108e8bac864f01ca37a3edee596739e12' |
| // CHECK-384: test2: 'f450c023b168ebd56ff916ca9b1f1f0010b8c592d28205cc91fa3056f629eed108e8bac864f01ca37a3edee596739e12' |
| // CHECK-384: test3: 'f450c023b168ebd56ff916ca9b1f1f0010b8c592d28205cc91fa3056f629eed108e8bac864f01ca37a3edee596739e12' |
| // CHECK-384: test4: '{{.*}}' |
| // CHECK-384: test5: '{{.*}}' |
| // CHECK-384: test6: '{{.*}}' |
| // CHECK-384: test7: '{{.*}}' |
| // CHECK-384: test8: 'f450c023b168ebd56ff916ca9b1f1f0010b8c592d28205cc91fa3056f629eed108e8bac864f01ca37a3edee596739e12' |
| // CHECK-384: test9: 'f450c023b168ebd56ff916ca9b1f1f0010b8c592d28205cc91fa3056f629eed108e8bac864f01ca37a3edee596739e12' |
| |
| // CHECK-512: SHA512 |
| // CHECK-512: test1: '0e3f68731c0e2a6a4eab5d713c9a80dc78086b5fa7d2b5ab127277958e68d1b1dee1882b083b0106cd4319de42c0c8f452871364f5baa8a6379690612c6b844e' |
| // CHECK-512: test2: '0e3f68731c0e2a6a4eab5d713c9a80dc78086b5fa7d2b5ab127277958e68d1b1dee1882b083b0106cd4319de42c0c8f452871364f5baa8a6379690612c6b844e' |
| // CHECK-512: test3: '0e3f68731c0e2a6a4eab5d713c9a80dc78086b5fa7d2b5ab127277958e68d1b1dee1882b083b0106cd4319de42c0c8f452871364f5baa8a6379690612c6b844e' |
| // CHECK-512: test4: '{{.*}}' |
| // CHECK-512: test5: '{{.*}}' |
| // CHECK-512: test6: '{{.*}}' |
| // CHECK-512: test7: '{{.*}}' |
| // CHECK-512: test8: '0e3f68731c0e2a6a4eab5d713c9a80dc78086b5fa7d2b5ab127277958e68d1b1dee1882b083b0106cd4319de42c0c8f452871364f5baa8a6379690612c6b844e' |
| // CHECK-512: test9: '0e3f68731c0e2a6a4eab5d713c9a80dc78086b5fa7d2b5ab127277958e68d1b1dee1882b083b0106cd4319de42c0c8f452871364f5baa8a6379690612c6b844e' |
| |
| return 0; |
| } |