FIPS モード

sgcCrypto には、ライブラリに FIPS 承認済みアルゴリズムだけを残すための、オプションのコンパイル時のスイッチSGC_CRYPTO_FIPSがあります。これは、FIPS および NIST SP の刊行物の範囲外にあるアルゴリズムを使用してはならないプロジェクト向けのものです。このページでは、このスイッチの働き、有効にする方法、残るもの、削除されるもの、そして対象外となるものについて説明します。

 

ここでの FIPS の意味

 

FIPS 140-3 は、アルゴリズムではなく暗号モジュールに対する認証です。認定を受けた試験機関が、NIST の暗号モジュール検証プログラム(CMVP)のもとで製品の特定の1つのビルドを試験し、NIST がそのビルドに対する証明書を発行します。AES のような承認済みアルゴリズムを使用しても、それだけでプログラムが検証済みになるわけではありません。

 

sgcCrypto は FIPS 140-3 検証済みモジュールではありません。また、このスイッチを有効にしても、検証を受けていると主張することにはなりません。このスイッチが行うのは、次のようなより限定的なことです。

残るアルゴリズムは、下の表に挙げる FIPS および NIST SP の刊行物に準拠しています。

 

プロジェクトに正式な FIPS 140-3 要件がある場合、その暗号処理は検証済みモジュールを通じて行う必要があります。たとえば、システムを FIPS モードで動作させた Windows CNG です。このスイッチは、承認されていないアルゴリズムをコードから締め出すのに役立ちます。検証済みモジュールの代わりになるものではありません。

 

有効にする方法

 

このスイッチはデフォルトでオフです。オフのままであれば何も変わらず、暗号技術ページに挙げられているすべてのアルゴリズムを利用できます。有効にするには、次のいずれかを行います。

 


  {.$DEFINE SGC_CRYPTO_FIPS}   { off, the default }
  {$DEFINE SGC_CRYPTO_FIPS}    { on }

 

その後、再ビルドします。このスイッチはこの定義を付けてコンパイルされたコードにのみ作用するため、この定義なしでビルドされたコンパイル済みパッケージには影響しません。

 

スイッチを有効にすると、削除された関数は存在しなくなります。それらをまだ呼び出しているコードは、「Undeclared identifier」(未定義の識別子)エラーでコンパイルに失敗します。これは意図的な動作です。承認されていないものが誤ってバイナリに入り込むことはなく、別のアルゴリズムが必要な箇所はすべてコンパイラが示してくれます。

 

残るもの

 

証明書、ワンタイムパスワード、エンコーディングのヘルパーも残ります。これらは承認済みアルゴリズムだけで構成されているか、そもそも暗号アルゴリズムではないためです。

 

ファミリー 残るもの 標準
AES ECB、CBC、CFB、OFB、CTR、CTS、GCM、CCM の各モードの AES-128/192/256、AES Key Wrap(KW および KWP)、AES-CMAC、AES-GMAC FIPS 197、SP 800-38A/B/C/D/F
ハッシュ化 SHA-1(まだ許可されている用途に限り、新しい署名には決して使用しない)、SHA-224、SHA-256、SHA-384、SHA-512、SHA3-224/256/384/512、SHAKE128、SHAKE256、cSHAKE、KMAC FIPS 180-4、FIPS 202、SP 800-185
メッセージ認証 HMAC-SHA1、HMAC-SHA256、HMAC-SHA384、HMAC-SHA512 FIPS 198-1
鍵導出 PBKDF2、HKDF、ANSI X9.63 KDF SP 800-132(PBKDF2)、SP 800-56C(HKDF)、SP 800-135(ANSI X9.63 KDF)
RSA RSA 鍵生成、PKCS#1 v1.5 署名と PSS 署名、RSA-OAEP 暗号化 FIPS 186-5、SP 800-56B
ECDSA および ECDH NIST P-256、P-384、P-521 上の署名と鍵合意(P-224 は sgcCrypto では実装されていません) FIPS 186-5、SP 800-56A
EdDSA Ed25519 署名と Ed448 署名 FIPS 186-5
ポスト量子暗号 ML-KEM、ML-DSA、SLH-DSA FIPS 203、FIPS 204、FIPS 205
証明書 & PKI X.509 証明書の解析、チェーンの検証と CRL のチェック、および上記のアルゴリズムで署名する証明書または CSR の生成 RFC 5280、RFC 2986
ワンタイムパスワード HMAC を基盤とする HOTP と TOTP RFC 4226、RFC 6238
エンコーディング & ユーティリティ Hex、Base32、Base64 エンコーディング、定数時間比較、セキュアゼロ化 RFC 4648

 

削除されるもの

 

削除されるもの 理由
ChaCha20、XChaCha20、Salsa20、XSalsa20、Poly1305、ChaCha20-Poly1305、XChaCha20-Poly1305 NIST のアルゴリズムではありません。
X25519 および X448 鍵交換 SP 800-56A で鍵合意用に承認されていません。
X25519 + ML-KEM-768 ハイブリッド、および ECIES どちらも X25519 を基盤としています。
secp256k1 曲線と Brainpool 曲線、および BIP-340 Schnorr 署名 NIST 推奨曲線ではなく、BIP-340 は FIPS 186-5 の署名方式ではありません。FIPS モードで残るのは NIST P 曲線だけです。
Argon2 と scrypt NIST のパスワード鍵導出関数ではありません。
BLAKE2b、BLAKE2s、SipHash、TLSH NIST のアルゴリズムではありません。
MD4、MD5、HMAC-MD5、RIPEMD-160、DES(sgcCrypto_Legacyユニット) 古くなっているか、NIST に一度も承認されていないものです。
KDF1 と KDF2 NIST の刊行物ではなく ISO 18033-2 で定義されています。ANSI X9.63 KDF は残ります。
RSA PKCS#1 v1.5 暗号化 SP 800-131A で使用が禁止されています。PKCS#1 v1.5 署名は残ります。
WinZip AES(AE-1 および AE-2) NIST の形式ではありません。

 

削除されるアルゴリズムのほとんどには、承認済みの代替が最初の表にあります。ChaCha20-Poly1305 の代わりに AES-GCM、X25519 の代わりに P-256 または P-384 上の ECDH、Argon2 や scrypt の代わりに PBKDF2、BLAKE2 の代わりに SHA-256 または SHA-3、PKCS#1 v1.5 暗号化の代わりに RSA-OAEP を使用してください。

 

実行時にチェックされるルール

 

一部のルールは関数に渡される値によって決まるため、コンパイラでは強制できません。スイッチを有効にすると、sgcCrypto は関数の実行時にそれらをチェックし、いずれのチェックも、満たされない場合はメッセージがsgcCrypto FIPS:で始まる例外を発生させます。

 

ランダムバイトの取得元

 

鍵、ノンス、ソルトにはランダムバイトが必要です。sgcRandomBytesは、どちらのモードでも常にオペレーティングシステムからランダムバイトを読み取り、その上に独自の生成器を重ねて実行することはありません。スイッチによって変わるのは、使用されるシステムのソースだけです。

 

プラットフォーム SGC_CRYPTO_FIPS を定義した場合 SGC_CRYPTO_FIPS を定義しない場合
Windows BCryptGenRandom(CNG、システム優先の RNG)。フォールバックはありません BCryptGenRandom。BCryptGenRandom が利用できない場合は RtlGenRandom、次に CryptGenRandom にフォールバックします
Linux および Android getrandom システムコール /dev/urandom
macOS および iOS Security フレームワークの SecRandomCopyBytes /dev/urandom

 

どちらのモードでも、どのソースからも読み取れない場合は、弱いバイトを返すのではなく例外が発生します。オペレーティングシステムの生成器が FIPS に適合するとみなされるかどうかは、sgcCrypto ではなく、オペレーティングシステムとその構成によって決まります。

 

スイッチの対象外となるもの

 

このスイッチが適用されるのは sgcCrypto ユニットだけです。sgcWebSockets のその他の部分では、承認されていないアルゴリズムが引き続き使われることがあります。

アプリケーション全体を承認済みアルゴリズムの範囲内に収める必要がある場合は、これらの部分も確認してください。

 

関連項目