Para verificar si openssl está funcionando en modo fips, emita lo siguiente:
$ openssl md5 somefile
Lo anterior debería fallar ya que MD5 no es un estándar Hash aprobado por FIPS.
$ openssl sha1 somefile
Lo anterior funcionaría ya que SHA1 es el estándar hash aprobado por fips.
Ejemplo :
# openssl md5 message.txt
Error setting digest md5
140062425388872:error:060800A3:digital envelope routines:EVP_DigestInit_ex:disabled for fips:digest.c:251:
# openssl sha1 message.txt
SHA1(messagetext.txt)= 9f5080758dbf71537cc44a4d8cb67564f2ad938a
Referencia
OpenSSL en sí mismo no está validado por FIPS 140-2 y, según sus mantenedores, nunca lo estará. Sin embargo, tiene un módulo validado por FIPS 140-2 llamado FIPS Object Module, que reemplaza en parte a libcrypto utilizado en vainilla OpenSSL. Puede encontrar más información, incluida la guía del usuario, aquí. En resumen:
OpenSSL en sí mismo no está validado y nunca lo estará. En su lugar, se ha creado un componente de software especial cuidadosamente definido llamado OpenSSL FIPS ObjectModule. Este módulo se diseñó para ser compatible con OpenSSL, de modo que los productos que utilizan la API de OpenSSL se puedan convertir para utilizar criptografía validada con un esfuerzo mínimo.
¿Cómo verifico si OpenSSL proporciona criptografía validada por FIPS o no?
Depende de cómo y cuándo quieras comprobarlo. También depende de la aplicación.
FIPS podría estar disponible pero no utilizado. Entonces, una aplicación debe habilitar la criptografía validada a través de FIPS_mode_set
, y la llamada debe tener éxito.
Si desea verificar si la biblioteca compatible con FIPS, como OpenSSL 1.0.1e, se configuró para usar el módulo de objetos FIPS, entonces puede:
$ cat /usr/local/ssl/include/openssl/opensslconf.h | grep -A 2 -i fips
#ifndef OPENSSL_FIPS
# define OPENSSL_FIPS
#endif
OPENSSL_FIPS
le dice que la biblioteca compatible con FIPS se configuró para usar el módulo de objetos FIPS. Por lo tanto, la criptografía validada por FIPS está disponible.
OPENSSL_FIPS
Sin embargo, no significa que la aplicación esté utilizando la criptografía validada por FIPS. La aplicación debe llamar a FIPS_mode_set
y la función debe devolver el éxito.
En tiempo de ejecución, puede imprimir la cadena asociada con lo siguiente (se toma del código que uso específicamente para esto):
ostringstream oss;
oss << OPENSSL_VERSION_TEXT;
LogVersion(oss.str().c_str());
El código producirá una entrada de registro similar a la siguiente:
Version: OpenSSL 1.0.1f-fips 6 Jan 2014
Puede auditar el módulo con algunos trucos. Por ejemplo, lo siguiente probará algunos símbolos que deben estar presente si el ejecutable es verdaderamente FIPS.
En este caso, estoy probando el objeto compartido compatible con OpenSSL FIPS. Si la aplicación enlaza con libcrypto.a
, entonces puede auditar el programa en lugar del objeto compartido de OpenSSL.
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_*
00000000000c7f60 T ERR_load_FIPS_strings
00000000000c2250 T FIPS_add_error_data
00000000000c3900 T FIPS_add_lock
0000000000082820 T FIPS_bn_bin2bn
0000000000082980 T FIPS_bn_bn2bin
0000000000082760 T FIPS_bn_clear
0000000000082350 T FIPS_bn_clear_free
00000000000823d0 T FIPS_bn_free
0000000000087c90 T FIPS_bn_generate_prime_ex
0000000000082790 T FIPS_bn_get_word
0000000000082d20 T FIPS_bn_is_bit_set
0000000000087c80 T FIPS_bn_is_prime_ex
0000000000087750 T FIPS_bn_is_prime_fasttest_ex
...
También tienes los símbolos de fips_premain.c
:
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_text_*
00000000000c4520 T FIPS_text_end
000000000007b340 T FIPS_text_start
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_rodata*
00000000001e1e20 R FIPS_rodata_end
00000000001d8ce0 R FIPS_rodata_start
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_signature*
00000000004696c0 B FIPS_signature
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_incore*
000000000007b5a0 T FIPS_incore_fingerprint
Ahora, esto es realmente astuto. Puede comprobar que el módulo incluye las autocomprobaciones. Por ejemplo, fips_drbg_selftest.h
incluirá los siguientes bytes en sus autoevaluaciones:
0x2e,0xbf,0x98,0xf9,0x85,0x27,0x8b,0xff,0x36,0xb9,0x40,0x0b,
0xc0,0xa1,0xa0,0x13,0x20,0x06,0xcc,0xe6,0x2a,0x03,0x77,0x7d,
0xee,0xde,0xcc,0x34,0xe3,0xcd,0x77,0xea,0xd0,0x3e,0xbe,0xdd,
0xf6,0x15,0xfb,0xa7,0xd7,0x8e,0xd0,0x2e,0x2f,0x82,0x4c,0xc7,
0x87,0xb1,0x6f,0xc5,0xf8,0x5c,0x78,0xde,0x77,0x9b,0x15,0x9a,
0xb9,0x3c,0x38
Y puede verificar que el desarrollador ejecutó incore
o macho_incore
en su ejecutable para incrustar la huella digital FIPS descargando los 20 bytes del símbolo FIPS_signature
. Si son 20 bytes de 0 (el valor predeterminado de fips_premain.c
), entonces la huella digital no se incrustó y FIPS_mode_set
fallará. Por lo tanto, no es posible utilizar criptografía validada por FIPS en este caso.
Actualizar :Cargué una presentación de diapositivas que tengo sobre el tema en el wiki de OpenSSL. Se llama Creación de aplicaciones usando criptografía validada OpenSSL:notas del campo para desarrolladores y auditores. Querrá revisar el material a partir de la diapositiva 18.
Construí la plataforma de diapositivas para OWASP pero no hubo interés en recibirla. Sé que Stack Overflow frunce el ceño ante enlaces como el de la wiki de OpenSSL, pero no sé cómo proporcionar una presentación de más de 35 diapositivas aquí.
Opción de núcleo "fips=1 " debería estar habilitado. Un poco más sobre eso aquí.
Para ver si eso está cargado:
sudo sysctl -a|grep fips