1// RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s
2
3#include <assert.h>
4#include <sha1.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <string.h>
8
9void test1() {
10 SHA1_CTX ctx;
11 uint8_t entropy[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
12 uint8_t digest[SHA1_DIGEST_LENGTH];
13
14 SHA1Init(&ctx);
15 SHA1Update(&ctx, entropy, __arraycount(entropy));
16 SHA1Final(digest, &ctx);
17
18 printf(format: "test1: '");
19 for (size_t i = 0; i < __arraycount(digest); i++)
20 printf(format: "%02x", digest[i]);
21 printf(format: "'\n");
22}
23
24void local_SHA1Update(SHA1_CTX *context, const uint8_t *data, unsigned int len)
25{
26 unsigned int a, b;
27
28 b = context->count[0];
29 context->count[0] += len << 3;
30 if (context->count[0] < b)
31 context->count[1] += (len >> 29) + 1;
32 b = (b >> 3) & 63;
33 if ((b + len) > 63) {
34 memcpy(dest: &context->buffer[b], src: data, n: (a = 64 - b));
35 SHA1Transform(context->state, context->buffer);
36 for ( ; a + 63 < len; a += 64)
37 SHA1Transform(context->state, &data[a]);
38 b = 0;
39 } else {
40 a = 0;
41 }
42 memcpy(dest: &context->buffer[b], src: &data[a], n: len - a);
43}
44
45void test2() {
46 SHA1_CTX ctx;
47 uint8_t entropy[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
48 uint8_t digest[SHA1_DIGEST_LENGTH];
49
50 SHA1Init(&ctx);
51 local_SHA1Update(&ctx, entropy, __arraycount(entropy));
52 SHA1Final(digest, &ctx);
53
54 printf(format: "test2: '");
55 for (size_t i = 0; i < __arraycount(digest); i++)
56 printf(format: "%02x", digest[i]);
57 printf(format: "'\n");
58}
59
60void test3() {
61 SHA1_CTX ctx;
62 uint8_t entropy[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
63 char digest[SHA1_DIGEST_STRING_LENGTH];
64
65 SHA1Init(&ctx);
66 SHA1Update(&ctx, entropy, __arraycount(entropy));
67 char *p = SHA1End(&ctx, digest);
68 assert(p == digest);
69
70 printf(format: "test3: '%s'\n", digest);
71}
72
73void test4() {
74 SHA1_CTX ctx;
75 uint8_t entropy[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
76
77 SHA1Init(&ctx);
78 SHA1Update(&ctx, entropy, __arraycount(entropy));
79 char *p = SHA1End(&ctx, NULL);
80 assert(strlen(p) == SHA1_DIGEST_STRING_LENGTH - 1);
81
82 printf(format: "test4: '%s'\n", p);
83
84 free(ptr: p);
85}
86
87void test5() {
88 char digest[SHA1_DIGEST_STRING_LENGTH];
89
90 char *p = SHA1File("/etc/fstab", digest);
91 assert(p == digest);
92
93 printf(format: "test5: '%s'\n", p);
94}
95
96void test6() {
97 char *p = SHA1File("/etc/fstab", NULL);
98 assert(strlen(p) == SHA1_DIGEST_STRING_LENGTH - 1);
99
100 printf(format: "test6: '%s'\n", p);
101
102 free(ptr: p);
103}
104
105void test7() {
106 char digest[SHA1_DIGEST_STRING_LENGTH];
107
108 char *p = SHA1FileChunk("/etc/fstab", digest, 10, 20);
109 assert(p == digest);
110
111 printf(format: "test7: '%s'\n", p);
112}
113
114void test8() {
115 char *p = SHA1FileChunk("/etc/fstab", NULL, 10, 20);
116 assert(strlen(p) == SHA1_DIGEST_STRING_LENGTH - 1);
117
118 printf(format: "test8: '%s'\n", p);
119
120 free(ptr: p);
121}
122
123void test9() {
124 uint8_t entropy[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
125 char digest[SHA1_DIGEST_STRING_LENGTH];
126
127 char *p = SHA1Data(entropy, __arraycount(entropy), digest);
128 assert(p == digest);
129
130 printf(format: "test9: '%s'\n", p);
131}
132
133void test10() {
134 uint8_t entropy[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
135
136 char *p = SHA1Data(entropy, __arraycount(entropy), NULL);
137 assert(strlen(p) == SHA1_DIGEST_STRING_LENGTH - 1);
138
139 printf(format: "test10: '%s'\n", p);
140
141 free(ptr: p);
142}
143
144int main(void) {
145 printf(format: "SHA1\n");
146
147 test1();
148 test2();
149 test3();
150 test4();
151 test5();
152 test6();
153 test7();
154 test8();
155 test9();
156 test10();
157
158 // CHECK: SHA1
159 // CHECK: test1: '57d1b759bf3d1811135748cb0328c73b51fa6f57'
160 // CHECK: test2: '57d1b759bf3d1811135748cb0328c73b51fa6f57'
161 // CHECK: test3: '57d1b759bf3d1811135748cb0328c73b51fa6f57'
162 // CHECK: test4: '57d1b759bf3d1811135748cb0328c73b51fa6f57'
163 // CHECK: test5: '{{.*}}'
164 // CHECK: test6: '{{.*}}'
165 // CHECK: test7: '{{.*}}'
166 // CHECK: test8: '{{.*}}'
167 // CHECK: test9: '57d1b759bf3d1811135748cb0328c73b51fa6f57'
168 // CHECK: test10: '57d1b759bf3d1811135748cb0328c73b51fa6f57'
169
170 return 0;
171}
172

source code of compiler-rt/test/sanitizer_common/TestCases/NetBSD/sha1.cpp