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 のその他の部分では、承認されていないアルゴリズムが引き続き使われることがあります。
アプリケーション全体を承認済みアルゴリズムの範囲内に収める必要がある場合は、これらの部分も確認してください。
関連項目