blob: 3dca5f5967cf068461d71ee4de8a58f607c62526 [file] [log] [blame]
#!/bin/bash
#
# fips_scanner.sh
#
# This program scans for low-level Openssl function calls that are NOT
# allowed when running in FIPS mode. The list of functions was taken
# from searching the Openssl library for calls to "fips_cipher_abort" and
# "fips_md_init_ctx" which are the functions for generating the low-level
# API abort messages. These abort messages are only generated when running
# in FIPS mode. We then looked at the ".h" for each cipher/digest and manpage to
# get the list of related low-level function calls.
#
# Usage:
# ./fips_scanner.sh <directory to scan>
#
# If no directory is given, it scans the directory the current directory.
#
echo "Starting scan ..."
# Set directory to scan
if [ -z "$1" ] ; then
DIR="."
else
DIR=$1
fi
echo -e "Scanning directory\n"
CIPHER_LIST=("AES_set_encrypt_key"
"AES_set_decrypt_key"
"AES_encrypt"
"AES_decrypt"
"AES_ctr128_encrypt"
"AES_ecb_encrypt"
"AES_cbc_encrypt"
"AES_cfb128_encrypt"
"AES_cfb1_encrypt"
"AES_cfb8_encrypt"
"AES_ofb128_encrypt"
"AES_ctr128_encrypt"
"AES_ige_encrypt"
"AES_bi_ige_encrypt"
"AES_wrap_key"
"AES_unwrap_key"
"BF_set_key"
"BF_encrypt"
"BF_ecb_encrypt"
"BF_cbc_encrypt"
"BF_cfb64_encrypt"
"BF_ofb64_encrypt"
"Camellia_set_key"
"Camellia_encrypt"
"Camellia_decrypt"
"Camellia_ecb_encrypt"
"Camellia_cbc_encrypt"
"Camellia_cfb128_encrypt"
"Camellia_cfb1_encrypt"
"Camellia_cfb8_encrypt"
"Camellia_ofb128_encrypt"
"Camellia_ctr128_encrypt"
"CAST_set_key"
"CAST_ecb_encrypt"
"CAST_encrypt"
"CAST_cbc_encrypt"
"CAST_cfb64_encrypt"
"CAST_ofb64_encrypt"
"DES_set_key_unchecked"
"DES_ecb2_encrypt"
"DES_ede2_cbc_encrypt"
"DES_ede2_cfb64_encrypt"
"DES_ede2_ofb64_encrypt"
"DES_ecb3_encrypt"
"DES_cbc_cksum"
"DES_cbc_encrypt"
"DES_ncbc_encrypt"
"DES_xcbc_encrypt"
"DES_cfb_encrypt"
"DES_ecb_encrypt"
"DES_encrypt1"
"DES_encrypt2"
"DES_encrypt3"
"DES_decrypt3"
"DES_ede3_cbc_encrypt"
"DES_ede3_cbcm_encrypt"
"DES_ede3_cfb64_encrypt"
"DES_ede3_cfb_encrypt"
"DES_ede3_ofb64_encrypt"
"DES_enc_read"
"DES_enc_write"
"DES_ofb_encrypt"
"DES_quad_cksum"
"DES_random_key"
"DES_check_key_parity"
"DES_set_key"
"DES_pcbc_encrypt"
"DES_set_key_checked"
"DES_string_to_key"
"DES_cfb64_encrypt"
"DES_ofb64_encrypt"
"DES_read_password"
"DES_fixup_key_parity"
"DES_set_odd_parity"
"idea_set_encrypt_key"
"idea_ecb_encrypt"
"idea_set_decrypt_key"
"idea_cfb64_encrypt"
"idea_ofb64_encrypt"
"idea_encrypt"
"RC2_set_key"
"RC2_encrypt"
"RC2_cbc_encrypt"
"RC2_cfb64_encrypt"
"RC2_ofb64_encrypt"
"RC4_set_key"
"SEED_set_key"
"SEED_encrypt"
"SEED_decrypt"
"SEED_ecb_encrypt"
"SEED_cbc_encrypt"
"SEED_cfb128_encrypt"
"SEED_ofb128_encrypt")
echo -e "Checking for low-level cipher calls"
echo -e "===================================\n"
#Exclude files that are being used to search for anything not fips compliant
#Unless excluded, these files will also be scanned and trigger false positives
fipsScanner="fips_scanner.sh"
testCrypto="test_crypto-0*"
for cipher in ${CIPHER_LIST[@]} ; do
echo "Scanning for cipher function: ${cipher}"
if grep -R ${cipher} ${DIR} --exclude={$fipsScanner,$testCrypto} ; then
echo -e "\e[92mFound potential calls for ${cipher}\e[0m"
fi
done
# Scan for unapproved digest calls
DIGEST_LIST=("SHA1_Init"
"SHA1_Update"
"SHA1_Final"
"SHA224_Init"
"SHA224_Update"
"SHA224_Final"
"SHA256_Init"
"SHA256_Update"
"SHA256_Final"
"SHA384_Init"
"SHA384_Update"
"SHA384_Final"
"SHA512_Init"
"SHA512_Update"
"SHA512_Final")
echo -e "\nChecking for low-level digest calls"
echo -e "===================================\n"
for digest in ${DIGEST_LIST[@]} ; do
echo "Scanning for cipher function: ${digest}"
if grep -R ${digest} ${DIR} --exclude={$fipsScanner,$testCrypto} ; then
echo -e "\e[92mFound potential calls for ${digest}\e[0m"
fi
done