Chcete-li zkontrolovat, zda openssl funguje v režimu fips, proveďte následující:
$ openssl md5 somefile
Výše uvedené by mělo selhat, protože MD5 není hash Standard schválený pro fips.
$ openssl sha1 somefile
Výše uvedené by fungovalo jako SHA1 je schválený hash standard fips.
Příklad :
# 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
Reference
Samotné OpenSSL není ověřeno FIPS 140-2 a podle jeho správců nikdy nebude. Má však ověřený modul FIPS 140-2 nazvaný FIPS Object Module, který částečně nahrazuje libcrypto používá se ve vanilla OpenSSL. Více informací včetně uživatelské příručky naleznete zde. Ve zkratce:
Samotné OpenSSL není ověřeno a nikdy nebude. Místo toho byla vytvořena speciálně pečlivě definovaná softwarová komponenta nazvaná OpenSSL FIPS ObjectModule. Tento modul byl navržen pro kompatibilitu s OpenSSL, takže produkty využívající OpenSSL API lze s minimálním úsilím převést na ověřenou kryptografii.
Jak zjistím, zda OpenSSL poskytuje kryptografii ověřenou FIPS nebo ne?
Záleží na tom, jak a kdy chcete zkontrolovat. Záleží také na aplikaci.
FIPS může být k dispozici, ale nepoužívá se. Aplikace tedy musí povolit ověřenou kryptografii pomocí FIPS_mode_set
a hovor musí uspět.
Pokud chcete zkontrolovat, zda byla FIPS Capable Library, jako je OpenSSL 1.0.1e, nakonfigurována pro použití FIPS Object Module, můžete:
$ cat /usr/local/ssl/include/openssl/opensslconf.h | grep -A 2 -i fips
#ifndef OPENSSL_FIPS
# define OPENSSL_FIPS
#endif
OPENSSL_FIPS
říká, že FIPS Capable Library byla nakonfigurována pro použití FIPS Object Module. Takže je k dispozici kryptografie ověřená FIPS.
OPENSSL_FIPS
neznamená to však, že aplikace používá kryptografii ověřenou FIPS. Aplikace musí volat FIPS_mode_set
a funkce musí vrátit úspěch.
Za běhu můžete vytisknout řetězec spojený s následujícím (je převzat z kódu, který k tomu používám speciálně):
ostringstream oss;
oss << OPENSSL_VERSION_TEXT;
LogVersion(oss.str().c_str());
Kód vytvoří záznam protokolu podobný následujícímu:
Version: OpenSSL 1.0.1f-fips 6 Jan 2014
Modul můžete auditovat pomocí několika triků. Následující příklad otestuje některé symboly, které musí být přítomen, pokud je spustitelný soubor skutečně FIPS.
V tomto případě testuji sdílený objekt OpenSSL FIPS Capable. Pokud aplikace odkazuje na libcrypto.a
, pak můžete auditovat program spíše než sdílený objekt 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
...
Máte také symboly z 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
Tak tohle je opravdu záludné. Můžete zkontrolovat, zda modul obsahuje samotesty. Například fips_drbg_selftest.h
bude obsahovat následující bajty své vlastní testy:
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
A můžete ověřit, že vývojář spustil incore
nebo macho_incore
na jejich spustitelném souboru pro vložení otisku FIPS vypuštěním 20 bajtů symbolu FIPS_signature
. Pokud je jeho 20 bajtů 0 (výchozí hodnota je fips_premain.c
), pak otisk prstu nebyl vložen a FIPS_mode_set
selže. Takže v tomto případě není možné použít kryptografii ověřenou FIPS.
Aktualizovat :Nahrál jsem slide deck, který mám na toto téma, na OpenSSL wiki. Jmenuje se Vytváření aplikací pomocí OpenSSL Validated Cryptography:Notes from the Field for Developers and Auditors. Budete chtít zkontrolovat materiál od snímku 18.
Postavil jsem slide deck pro OWASP, ale nebyl o to zájem. Vím, že Stack Overflow se mračí na odkazy, jako je ten na wiki OpenSSL, ale nevím, jak zde poskytnout 35+ slide deck.
Možnost jádra "fips=1 " by mělo být povoleno. Trochu více o tom zde.
Chcete-li zjistit, zda je načten:
sudo sysctl -a|grep fips