Skip to content

Commit 18a7ebd

Browse files
committed
[Sanitizers] intercept md5 and sha* apis on FreeBSD.
Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D110989
1 parent 3129aa5 commit 18a7ebd

File tree

5 files changed

+372
-2
lines changed

5 files changed

+372
-2
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -548,10 +548,10 @@
548548
#define SANITIZER_INTERCEPT_SHA1 SI_NETBSD
549549
#define SANITIZER_INTERCEPT_MD4 SI_NETBSD
550550
#define SANITIZER_INTERCEPT_RMD160 SI_NETBSD
551-
#define SANITIZER_INTERCEPT_MD5 SI_NETBSD
551+
#define SANITIZER_INTERCEPT_MD5 (SI_NETBSD || SI_FREEBSD)
552552
#define SANITIZER_INTERCEPT_FSEEK (SI_NETBSD || SI_FREEBSD)
553553
#define SANITIZER_INTERCEPT_MD2 SI_NETBSD
554-
#define SANITIZER_INTERCEPT_SHA2 SI_NETBSD
554+
#define SANITIZER_INTERCEPT_SHA2 (SI_NETBSD || SI_FREEBSD)
555555
#define SANITIZER_INTERCEPT_CDB SI_NETBSD
556556
#define SANITIZER_INTERCEPT_VIS (SI_NETBSD || SI_FREEBSD)
557557
#define SANITIZER_INTERCEPT_POPEN SI_POSIX

compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_freebsd.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@
6969
#include <semaphore.h>
7070
#include <signal.h>
7171
#include <stddef.h>
72+
#include <md5.h>
73+
#include <sha224.h>
74+
#include <sha256.h>
75+
#include <sha384.h>
76+
#include <sha512.h>
7277
#include <stdio.h>
7378
#include <stringlist.h>
7479
#include <term.h>
@@ -361,6 +366,22 @@ const int si_SEGV_MAPERR = SEGV_MAPERR;
361366
const int si_SEGV_ACCERR = SEGV_ACCERR;
362367
const int unvis_valid = UNVIS_VALID;
363368
const int unvis_validpush = UNVIS_VALIDPUSH;
369+
370+
const unsigned MD5_CTX_sz = sizeof(MD5_CTX);
371+
const unsigned MD5_return_length = MD5_DIGEST_STRING_LENGTH;
372+
373+
#define SHA2_CONST(LEN) \
374+
const unsigned SHA##LEN##_CTX_sz = sizeof(SHA##LEN##_CTX); \
375+
const unsigned SHA##LEN##_return_length = SHA##LEN##_DIGEST_STRING_LENGTH; \
376+
const unsigned SHA##LEN##_block_length = SHA##LEN##_BLOCK_LENGTH; \
377+
const unsigned SHA##LEN##_digest_length = SHA##LEN##_DIGEST_LENGTH
378+
379+
SHA2_CONST(224);
380+
SHA2_CONST(256);
381+
SHA2_CONST(384);
382+
SHA2_CONST(512);
383+
384+
#undef SHA2_CONST
364385
} // namespace __sanitizer
365386

366387
using namespace __sanitizer;

compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_freebsd.h

+16
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,22 @@ extern unsigned IOCTL_KDSKBMODE;
647647
extern const int si_SEGV_MAPERR;
648648
extern const int si_SEGV_ACCERR;
649649

650+
extern const unsigned MD5_CTX_sz;
651+
extern const unsigned MD5_return_length;
652+
653+
#define SHA2_EXTERN(LEN) \
654+
extern const unsigned SHA##LEN##_CTX_sz; \
655+
extern const unsigned SHA##LEN##_return_length; \
656+
extern const unsigned SHA##LEN##_block_length; \
657+
extern const unsigned SHA##LEN##_digest_length
658+
659+
SHA2_EXTERN(224);
660+
SHA2_EXTERN(256);
661+
SHA2_EXTERN(384);
662+
SHA2_EXTERN(512);
663+
664+
#undef SHA2_EXTERN
665+
650666
struct __sanitizer_cap_rights {
651667
u64 cr_rights[2];
652668
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// RUN: %clangxx -O0 -g %s -o %t -lmd && %run %t 2>&1 | FileCheck %s
2+
3+
#include <sys/param.h>
4+
5+
#include <assert.h>
6+
#include <md5.h>
7+
#include <stdio.h>
8+
#include <stdlib.h>
9+
#include <string.h>
10+
11+
void test1() {
12+
MD5_CTX ctx;
13+
uint8_t entropy[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
14+
uint8_t digest[MD5_DIGEST_LENGTH];
15+
size_t entropysz = sizeof(entropy);
16+
size_t digestsz = sizeof(digest);
17+
18+
MD5Init(&ctx);
19+
MD5Update(&ctx, entropy, entropysz);
20+
MD5Final(digest, &ctx);
21+
22+
printf("test1: '");
23+
for (size_t i = 0; i < digestsz; i++)
24+
printf("%02x", digest[i]);
25+
printf("'\n");
26+
}
27+
28+
void test2() {
29+
MD5_CTX ctx;
30+
uint8_t entropy[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
31+
char digest[MD5_DIGEST_STRING_LENGTH];
32+
size_t entropysz = sizeof(entropy);
33+
34+
MD5Init(&ctx);
35+
MD5Update(&ctx, entropy, entropysz);
36+
char *p = MD5End(&ctx, digest);
37+
assert(p);
38+
39+
printf("test2: '%s'\n", digest);
40+
}
41+
42+
void test3() {
43+
MD5_CTX ctx;
44+
uint8_t entropy[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
45+
size_t entropysz = sizeof(entropy);
46+
47+
MD5Init(&ctx);
48+
MD5Update(&ctx, entropy, entropysz);
49+
char *p = MD5End(&ctx, NULL);
50+
assert(strlen(p) == MD5_DIGEST_STRING_LENGTH - 1);
51+
52+
printf("test3: '%s'\n", p);
53+
54+
free(p);
55+
}
56+
57+
void test4() {
58+
char digest[MD5_DIGEST_STRING_LENGTH];
59+
60+
char *p = MD5File("/etc/fstab", digest);
61+
assert(p == digest);
62+
63+
printf("test4: '%s'\n", p);
64+
}
65+
66+
void test5() {
67+
char *p = MD5File("/etc/fstab", NULL);
68+
assert(strlen(p) == MD5_DIGEST_STRING_LENGTH - 1);
69+
70+
printf("test5: '%s'\n", p);
71+
72+
free(p);
73+
}
74+
75+
void test6() {
76+
uint8_t entropy[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
77+
char digest[MD5_DIGEST_STRING_LENGTH];
78+
size_t entropysz = sizeof(entropy);
79+
80+
char *p = MD5Data(entropy, entropysz, digest);
81+
assert(p == digest);
82+
83+
printf("test6: '%s'\n", p);
84+
}
85+
86+
void test7() {
87+
uint8_t entropy[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
88+
size_t entropysz = sizeof(entropy);
89+
90+
char *p = MD5Data(entropy, entropysz, NULL);
91+
assert(strlen(p) == MD5_DIGEST_STRING_LENGTH - 1);
92+
93+
printf("test7: '%s'\n", p);
94+
95+
free(p);
96+
}
97+
98+
int main(void) {
99+
printf("MD5\n");
100+
101+
test1();
102+
test2();
103+
test3();
104+
test4();
105+
test5();
106+
test6();
107+
test7();
108+
109+
// CHECK: MD5
110+
// CHECK: test1: '86e65b1ef4a830af347ac05ab4f0e999'
111+
// CHECK: test2: '86e65b1ef4a830af347ac05ab4f0e999'
112+
// CHECK: test3: '86e65b1ef4a830af347ac05ab4f0e999'
113+
// CHECK: test4: '{{.*}}'
114+
// CHECK: test5: '{{.*}}'
115+
// CHECK: test6: '86e65b1ef4a830af347ac05ab4f0e999'
116+
// CHECK: test7: '86e65b1ef4a830af347ac05ab4f0e999'
117+
118+
return 0;
119+
}

0 commit comments

Comments
 (0)