OpenSSL FIPS

Support for OpenSSL FIPS was added to MongooseIM in version 1.7.0.

Incompatibilities

Currently known incompatible features are:

  • SASL auth mechanism DIGEST-MD5: due to a forbidden MD5 hash function in FIPS mode.

Requirements

Build Erlang/OTP with FIPS support

Make sure the option --enable-fips is specified for configure command. If you want to use a different OpenSSL than the default one, specify the option --with-ssl=PATH_TO_YOUR_OPENSSL as well. Here's an example of a command for building Erlang/OTP with kerl:

KERL_CONFIGURE_OPTIONS="--enable-fips" ./kerl build 21.3 21.3-fips

Building MongooseIM with a custom OpenSSL

If you want to use a custom OpenSSL, please export the CFLAGS and LDFLAGS env vars pointing to a FIPS compliant OpenSSL before running ./rebar3 compile or make rel.

OPENSSL_LIB=~/openssl/lib #put your path here
OPENSSL_INC=~/openssl/inc #put your path here

export LDFLAGS="-Wl,-rpath=$OPENSSL_LIB -L$OPENSSL_LIB"
export CFLAGS="-I$OPENSSL_INC"

How to enable/disable FIPS mode

Find etc/app.config in the release directory. FIPS mode is an option of the crypto application. In order to enable/disable it, add the following section to app.config:

{crypto, [{fips_mode, Value}]},

where Value is either true or false.

How to check if the FIPS mode is enabled

Log message

When MongooseIM starts, it prints the following log message if FIPS mode is enabled

2015-02-25 14:30:54.501 [warning] <0.242.0>@mongoose_fips:do_notify:37 FIPS mode enabled

Run-time check

Run the following function in the MongooseIM console:

mongoose_fips:status().

The function returns: * not_enabled - fips_mode is not set to true in etc/app.config * enabled - fips_mode is set to true in etc/app.config * not_supported - erlang compiled without fips support

Cipher suites difference

A test using a cipher_suites_test.sh script (available in the tools directory) can be performed on MongooseIM with FIPS mode enabled and disabled. We've used OpenSSL 1.0.1j-fips.

Here are all the cipher suites available when the FIPS mode is enabled (the list may vary for different openssl versions):

  • ECDHE-RSA-AES256-SHA
  • DHE-RSA-AES256-SHA
  • AES256-SHA
  • ECDHE-RSA-DES-CBC3-SHA
  • EDH-RSA-DES-CBC3-SHA
  • DES-CBC3-SHA
  • ECDHE-RSA-AES128-SHA
  • DHE-RSA-AES128-SHA
  • AES128-SHA

Here are all the cipher suites available when the FIPS mode is disabled (the list may vary for different openssl versions):

  • ECDHE-RSA-AES256-SHA
  • DHE-RSA-AES256-SHA
  • DHE-RSA-CAMELLIA256-SHA
  • AES256-SHA
  • CAMELLIA256-SHA
  • ECDHE-RSA-DES-CBC3-SHA
  • EDH-RSA-DES-CBC3-SHA
  • DES-CBC3-SHA
  • ECDHE-RSA-AES128-SHA
  • DHE-RSA-AES128-SHA
  • DHE-RSA-SEED-SHA
  • DHE-RSA-CAMELLIA128-SHA
  • AES128-SHA
  • SEED-SHA
  • CAMELLIA128-SHA
  • ECDHE-RSA-RC4-SHA
  • RC4-SHA
  • RC4-MD5