15 #if !defined(_GNU_SOURCE)
16 #define _GNU_SOURCE // needed for syscall() on Linux.
22 #if defined(BORINGSSL_FIPS)
31 #include "../internal.h"
109 #if defined(BORINGSSL_FIPS)
111 #if !defined(OPENSSL_ASAN)
116 extern const uint8_t BORINGSSL_bcm_text_start[];
117 extern const uint8_t BORINGSSL_bcm_text_end[];
118 extern const uint8_t BORINGSSL_bcm_text_hash[];
119 #if defined(BORINGSSL_SHARED_LIBRARY)
120 extern const uint8_t BORINGSSL_bcm_rodata_start[];
121 extern const uint8_t BORINGSSL_bcm_rodata_end[];
127 static void assert_within(
const void *
start,
const void *symbol,
133 if (start_val <= symbol_val && symbol_val < end_val) {
139 "FIPS module doesn't span expected symbol. Expected %p <= %p < %p\n",
141 BORINGSSL_FIPS_abort();
144 #if defined(OPENSSL_ANDROID) && defined(OPENSSL_AARCH64)
145 static void BORINGSSL_maybe_set_module_text_permissions(
int permission) {
151 const uintptr_t page_size = getpagesize();
153 ((
uintptr_t)BORINGSSL_bcm_text_start) & ~(page_size - 1);
155 if (mprotect((
void *)page_start,
156 ((
uintptr_t)BORINGSSL_bcm_text_end) - page_start,
158 perror(
"BoringSSL: mprotect");
162 static void BORINGSSL_maybe_set_module_text_permissions(
int permission) {}
168 BORINGSSL_bcm_power_on_self_test(
void) {
171 #if !defined(OPENSSL_ASAN)
175 const uint8_t *
const end = BORINGSSL_bcm_text_end;
185 #if defined(BORINGSSL_SHARED_LIBRARY)
186 const uint8_t *
const rodata_start = BORINGSSL_bcm_rodata_start;
187 const uint8_t *
const rodata_end = BORINGSSL_bcm_rodata_end;
190 const uint8_t *
const rodata_start = BORINGSSL_bcm_text_start;
191 const uint8_t *
const rodata_end = BORINGSSL_bcm_text_end;
194 assert_within(rodata_start,
kPrimes, rodata_end);
195 assert_within(rodata_start,
des_skb, rodata_end);
196 assert_within(rodata_start,
kP256Params, rodata_end);
199 #if defined(OPENSSL_AARCH64) || defined(OPENSSL_ANDROID)
207 static const uint8_t kHMACKey[64] = {0};
211 if (!
HMAC_Init_ex(&hmac_ctx, kHMACKey,
sizeof(kHMACKey), kHashFunction,
213 fprintf(
stderr,
"HMAC_Init_ex failed.\n");
217 BORINGSSL_maybe_set_module_text_permissions(PROT_READ | PROT_EXEC);
218 #if defined(BORINGSSL_SHARED_LIBRARY)
223 length = rodata_end - rodata_start;
229 BORINGSSL_maybe_set_module_text_permissions(PROT_EXEC);
232 result_len !=
sizeof(
result)) {
233 fprintf(
stderr,
"HMAC failed.\n");
238 const uint8_t *expected = BORINGSSL_bcm_text_hash;
251 #endif // OPENSSL_ASAN
256 BORINGSSL_FIPS_abort();
259 void BORINGSSL_FIPS_abort(
void) {
266 #endif // BORINGSSL_FIPS