Expose the FIPS module hash at build- and run-time.

In order to provide evidence that a given build is being used when
testing the module (as part of validation), this change prints the
module hash during the build process and makes it available for logging
at run time.

Change-Id: Ib128858cc429655e86444ee86dd04f1467abc735
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/68528
Reviewed-by: David Benjamin <davidben@google.com>
Auto-Submit: Adam Langley <agl@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/68807
This commit is contained in:
Adam Langley
2024-05-19 23:41:16 +00:00
committed by David Benjamin
parent 5acbee6493
commit 85897d0719
4 changed files with 19 additions and 1 deletions
+5
View File
@@ -263,6 +263,11 @@ int BORINGSSL_integrity_test(void) {
OPENSSL_cleanse(result, sizeof(result)); // FIPS 140-3, AS05.10.
return 1;
}
const uint8_t* FIPS_module_hash(void) {
return BORINGSSL_bcm_text_hash;
}
#endif // OPENSSL_ASAN
void BORINGSSL_FIPS_abort(void) {
+3
View File
@@ -178,6 +178,9 @@ OPENSSL_EXPORT int FIPS_mode_set(int on);
// FIPS_module_name returns the name of the FIPS module.
OPENSSL_EXPORT const char *FIPS_module_name(void);
// FIPS_module_hash returns the 32-byte hash of the FIPS module.
OPENSSL_EXPORT const uint8_t* FIPS_module_hash(void);
// FIPS_version returns the version of the FIPS module, or zero if the build
// isn't exactly at a verified version. The version, expressed in base 10, will
// be a date in the form yyyymmddXX where XX is often "00", but can be
@@ -242,6 +242,9 @@ func do(outPath, oInput string, arInput string) error {
return errors.New("found two occurrences of uninitialised hash value in object file")
}
if _, exists := os.LookupEnv("BORINGSSL_FIPS_SHOW_HASH"); exists {
fmt.Printf("Module hash: %x\n", calculated)
}
copy(objectBytes[offset:], calculated)
return os.WriteFile(outPath, objectBytes, perm&0777)
+8 -1
View File
@@ -55,9 +55,16 @@ int main(int argc, char **argv) {
printf("No module version set\n");
goto err;
}
printf("Module: '%s', version: %" PRIu32 "\n", FIPS_module_name(),
printf("Module: '%s', version: %" PRIu32 " hash:\n", FIPS_module_name(),
module_version);
#if !defined(OPENSSL_ASAN)
hexdump(FIPS_module_hash(), SHA256_DIGEST_LENGTH);
#else
printf("(not available when compiled for ASAN)");
#endif
printf("\n");
static const uint8_t kAESKey[16] = "BoringCrypto Key";
static const uint8_t kPlaintext[64] =
"BoringCryptoModule FIPS KAT Encryption and Decryption Plaintext!";