• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
test1()9 void 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("test1: '");
19   for (size_t i = 0; i < __arraycount(digest); i++)
20     printf("%02x", digest[i]);
21   printf("'\n");
22 }
23 
local_SHA1Update(SHA1_CTX * context,const uint8_t * data,unsigned int len)24 void 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(&context->buffer[b], data, (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(&context->buffer[b], &data[a], len - a);
43 }
44 
test2()45 void 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("test2: '");
55   for (size_t i = 0; i < __arraycount(digest); i++)
56     printf("%02x", digest[i]);
57   printf("'\n");
58 }
59 
test3()60 void 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("test3: '%s'\n", digest);
71 }
72 
test4()73 void 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("test4: '%s'\n", p);
83 
84   free(p);
85 }
86 
test5()87 void test5() {
88   char digest[SHA1_DIGEST_STRING_LENGTH];
89 
90   char *p = SHA1File("/etc/fstab", digest);
91   assert(p == digest);
92 
93   printf("test5: '%s'\n", p);
94 }
95 
test6()96 void test6() {
97   char *p = SHA1File("/etc/fstab", NULL);
98   assert(strlen(p) == SHA1_DIGEST_STRING_LENGTH - 1);
99 
100   printf("test6: '%s'\n", p);
101 
102   free(p);
103 }
104 
test7()105 void 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("test7: '%s'\n", p);
112 }
113 
test8()114 void test8() {
115   char *p = SHA1FileChunk("/etc/fstab", NULL, 10, 20);
116   assert(strlen(p) == SHA1_DIGEST_STRING_LENGTH - 1);
117 
118   printf("test8: '%s'\n", p);
119 
120   free(p);
121 }
122 
test9()123 void 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("test9: '%s'\n", p);
131 }
132 
test10()133 void 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("test10: '%s'\n", p);
140 
141   free(p);
142 }
143 
main(void)144 int main(void) {
145   printf("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