Enterprise エディション
FIPS 140 — 詳細リファレンス
本ページは、NextPDF Enterprise FIPS 140 モジュールの詳細リファレンスです。このモジュールはポリシーおよびセルフテストの機能です。暗号方式の選択を FIPS 準拠の許可リストに制限し、電源投入時の既知応答テストバッテリーを実行し、バッテリーが失敗した場合には暗号出力を抑止します。**NextPDF は FIPS 140 検証済みの暗号モジュールではなく、認証を保有しておらず、いかなる認証も付与しません。**サポートは適合と同義ではなく、適合は認証と同義ではありません。FIPS 互換の運用構成には、加えて運用者が提供する FIPS 検証済みの暗号プロバイダーが必要です。
提供とライセンス
「提供とライセンス」という見出しのセクションこの機能は NextPDF Enterprise(nextpdf/enterprise)に含まれ、Enterprise ティアのライセンスエンベロープで有効化されます。この権利を持たないデプロイでは、機能のクラスは読み込まれません。エディションを比較してライセンスを取得する。
公開 API サーフェス
「公開 API サーフェス」という見出しのセクションすべてのシンボルは NextPDF\Enterprise\Security\Fips に属します。ただし FipsBootstrap は NextPDF\Enterprise\Bootstrap にあります。
| シンボル | パラメーター | 既定の動作 | 戻り値 | スロー/失敗 | 備考 |
|---|---|---|---|---|---|
FipsBootstrap::boot() | ?CryptoPolicyInterface $policy、?FipsSelfTest $selfTest、?LoggerInterface $auditLogger(いずれも既定 null) | 起動時に電源投入バッテリーを一度実行。既定は strict ポリシー | FipsModeGuard | 電源投入テストが失敗すると FipsModuleErrorStateException | コンポジションルート。$auditLogger が null のとき監査証跡は無効 |
FipsBootstrap::lazy() | boot() と同じ | バッテリーを最初の境界アサーションまで遅延 | FipsModeGuard | 呼び出し時にはなし。最初のアサーションで FipsModuleErrorStateException を投げうる | 最初のアサーションまでモジュールは PRE_OPERATIONAL のまま |
FipsBootstrap::signatureEnforcer() | ?CryptoPolicyInterface $policy = null、?FipsSelfTest $selfTest = null | モジュールをブートし、署名チョークポイント向けにガードをラップ | FipsSignatureEnforcer | 電源投入テストが失敗すると FipsModuleErrorStateException | boot() へ委譲 |
FipsBootstrap::selfTestReport() | ?FipsSelfTest $selfTest = null | バッテリーをオンデマンドで実行し要約 | array{status: FipsSelfTestStatus, operational: bool, failed: list<string>} | スローしない。失敗は failed に現れる | 管理ヘルスエンドポイントおよび CLI 用途 |
FipsCryptoPolicy::strict() | ?FipsSelfTest $selfTest = null | FIPS 140-3 プリセット:SHA-256/384/512、承認済み RSA・RSASSA-PSS・ECDSA OID、aes-256-cbc・aes-256-gcm、RSA >= 2048、EC >= 256 | self | なし | コンストラクターは private。プリセットが唯一の入口 |
FipsCryptoPolicy::standard() | ?FipsSelfTest $selfTest = null | FIPS 140-2 プリセット:strict セットに aes-128-cbc を追加 | self | なし | レガシー相互運用専用 |
FipsCryptoPolicy::assertPreOperational() | なし | 電源投入バッテリーを実行、またはラッチ済み結果を再生 | void | 電源投入テストが失敗すると FipsModuleErrorStateException | 最初の操作前に Core の適用シームが駆動 |
FipsCryptoPolicy クエリサーフェス | string / int 入力 | 許可リストのメンバーシップ判定。未知の鍵タイプは拒否 | bool / string | なし | isHashAlgorithmAllowed、isSignatureAlgorithmAllowed、isEncryptionAlgorithmAllowed、isKeyStrengthAllowed、getPreferredHashAlgorithm、getName |
FipsModeGuard::__construct() | CryptoPolicyInterface $policy、?FipsBootGuard $bootGuard = null、?FipsAuditLogger $auditLogger = null | ポリシーを assert 形式の境界でラップ | — | なし | $bootGuard がなければセルフテストゲートはなし。本番コンポジションはこれを供給 |
FipsModeGuard::assertHashAllowed() | string $algorithm | まず拒否カタログ、次に許可リスト | void | FipsViolationException。ブートガードが配線されている場合は FipsModuleErrorStateException | 監査記録はあらゆる FipsViolationException に先行 |
FipsModeGuard::assertSignatureAlgorithmAllowed() | string $oid | まず拒否カタログ、次に許可リスト | void | 上記と同じ | OID は完全一致で照合 |
FipsModeGuard::assertEncryptionAllowed() | string $algorithm | まず拒否カタログ、次に許可リスト | void | 上記と同じ | 名称は小文字で比較 |
FipsModeGuard::assertKeyStrengthAllowed() | string $keyType、int $bitLength | まず拒否カタログ、次にポリシー下限 | void | 上記と同じ | 未知の鍵タイプは拒否 |
FipsModeGuard::getPolicy() | なし | ラップされたポリシーを返す | CryptoPolicyInterface | なし | — |
FipsBootGuard::__construct() | FipsSelfTest $selfTest | バッテリーを保持。実行はしない | — | なし | インスタンスごとに 1 電源投入サイクル |
FipsBootGuard::report() | なし | バッテリーを一度実行、レポートをキャッシュ、エラー時にラッチ | FipsSelfTestReport | なし | 初回呼び出しでテストを実行 |
FipsBootGuard::rerun() | なし | 新規実行を強制。エラー実行はプロセスをラッチ | FipsSelfTestReport | なし | オンデマンドのセルフテスト。エラー回復経路ではない |
FipsBootGuard::assertOperational() | なし | モジュールが operational であることをアサート。プロセス全体で固着 | void | FipsModuleErrorStateException | プロセスがエラーをラッチしている場合、クリーンなインスタンスでもスロー |
FipsBootGuard::status() | なし | キャッシュ済みステータスを報告 | FipsSelfTestStatus | なし | ラッチ時は ERROR、未実行時は PRE_OPERATIONAL |
FipsSelfTest::__construct() | ?callable $randomBytesProvider = null、?callable $hashProvider = null | プラットフォームの hash() と random_bytes() を使用 | — | なし | 決定論的な失敗テスト向けのオーバーライドあり |
FipsSelfTest::run() | なし | フルバッテリーを実行。決してショートサーキットしない | FipsSelfTestReport | なし | 失敗はレポートに記録され、例外にはならない |
FipsSelfTestReport | FipsSelfTestStatus $status、array $results、array $failedResults | 1 回の実行の不変集約 | — | エラー状態では assertOperational() が FipsModuleErrorStateException をスロー | isOperational()、isError() も提供 |
FipsSelfTestResult | string $algorithm、string $kind、bool $passed、string $message = '' | テストごとの不変な結果 | — | なし | kind は KAT、PWCT、HEALTH のいずれか。isPassed()、isFailed() も提供 |
FipsSelfTestStatus | — | 文字列バック列挙型 | — | なし | ケース PRE_OPERATIONAL、OPERATIONAL、ERROR |
FipsSignatureEnforcer::__construct() | FipsModeGuard $guard | 署名チョークポイント向けにブートゲート済みガードをラップ | — | なし | — |
FipsSignatureEnforcer::assertSignatureGenerationAllowed() | string $algorithm、string $certificatePem | OID と鍵強度を解決し、ガードへ委譲 | void | FipsViolationException(未知のアルゴリズム、非承認 PSS ダイジェスト、証明不能な鍵、またはポリシー拒否)。ガード経由で FipsModuleErrorStateException | 生成経路のみ。検証はここを経由しない |
FipsAuditLogger::__construct() | CryptoPolicyInterface $policy、LoggerInterface $logger | PSR-3 ロガーと、ガードが適用するのと同じポリシーをラップ | — | なし | 記録された判定は適用された判定と乖離しえない |
FipsAuditLogger::logHashOperation() / logSignatureOperation() / logEncryptionOperation() / logKeyStrengthCheck() | 判定ごとに string / int 入力 | ALLOW を INFO、DENY を WARNING で記録 | bool(許可時は true) | なし | 構造化コンテキスト:ポリシー名、項目、判定 |
FipsTransitioningAlgorithms | string / int 入力 | 静的な SP 800-131A Rev.2 拒否カタログ | bool / list<string> | なし | isHashDisallowed、isSignatureOidDisallowed、isEncryptionDisallowed、isKeyStrengthDisallowed、加えて disallowedHashes、disallowedSignatureOids、disallowedEncryption |
FipsViolationException | string $policyName、string $violatingItem、string $reason | public readonly フィールドを持つ型付きポリシー違反 | — | — | NextPDF\Exception\NextPdfException のサブタイプ |
FipsModuleErrorStateException | array $failedResults、?string $message = null | 失敗したテスト結果を保持するエラー状態拒否 | — | — | NextPDF\Exception\NextPdfException のサブタイプ |
public static function boot(?CryptoPolicyInterface $policy = null, ?FipsSelfTest $selfTest = null, ?LoggerInterface $auditLogger = null): FipsModeGuardpublic static function lazy(?CryptoPolicyInterface $policy = null, ?FipsSelfTest $selfTest = null, ?LoggerInterface $auditLogger = null): FipsModeGuardpublic static function signatureEnforcer(?CryptoPolicyInterface $policy = null, ?FipsSelfTest $selfTest = null): FipsSignatureEnforcerpublic static function selfTestReport(?FipsSelfTest $selfTest = null): arraypublic static function strict(?FipsSelfTest $selfTest = null): selfpublic static function standard(?FipsSelfTest $selfTest = null): selfpublic function assertPreOperational(): voidpublic function isHashAlgorithmAllowed(string $algorithm): boolpublic function isSignatureAlgorithmAllowed(string $oid): boolpublic function isEncryptionAlgorithmAllowed(string $algorithm): boolpublic function isKeyStrengthAllowed(string $keyType, int $bitLength): boolpublic function getPreferredHashAlgorithm(): stringpublic function getName(): stringpublic function __construct(private CryptoPolicyInterface $policy, private ?FipsBootGuard $bootGuard = null, private ?FipsAuditLogger $auditLogger = null)public function assertHashAllowed(string $algorithm): voidpublic function assertSignatureAlgorithmAllowed(string $oid): voidpublic function assertEncryptionAllowed(string $algorithm): voidpublic function assertKeyStrengthAllowed(string $keyType, int $bitLength): voidpublic function getPolicy(): CryptoPolicyInterfacepublic function __construct(private readonly FipsSelfTest $selfTest)public function report(): FipsSelfTestReportpublic function rerun(): FipsSelfTestReportpublic function assertOperational(): voidpublic function status(): FipsSelfTestStatuspublic function __construct(?callable $randomBytesProvider = null, ?callable $hashProvider = null)public function run(): FipsSelfTestReportpublic function __construct(private readonly FipsModeGuard $guard)public function assertSignatureGenerationAllowed(string $algorithm, string $certificatePem): voidpublic function __construct(private CryptoPolicyInterface $policy, private LoggerInterface $logger)public function logHashOperation(string $algorithm): boolpublic function logSignatureOperation(string $oid): boolpublic function logEncryptionOperation(string $algorithm): boolpublic function logKeyStrengthCheck(string $keyType, int $bitLength): boolpublic static function isHashDisallowed(string $algorithm): boolpublic static function isSignatureOidDisallowed(string $oid): boolpublic static function isEncryptionDisallowed(string $algorithm): boolpublic static function isKeyStrengthDisallowed(string $keyType, int $bitLength): boolpublic static function disallowedHashes(): arraypublic static function disallowedSignatureOids(): arraypublic static function disallowedEncryption(): arraypublic function __construct(public FipsSelfTestStatus $status, public array $results, public array $failedResults)public function isOperational(): boolpublic function isError(): boolpublic function assertOperational(): void
// FipsSelfTestResultpublic function __construct(public string $algorithm, public string $kind, public bool $passed, public string $message = '')public function isPassed(): boolpublic function isFailed(): bool
// FipsSelfTestStatusenum FipsSelfTestStatus: string{ case PRE_OPERATIONAL = 'pre_operational'; case OPERATIONAL = 'operational'; case ERROR = 'error';}- ポリシーの許可リストが権威的な判定です。
FipsTransitioningAlgorithmsはその上に明示的な SP 800-131A Rev.2 の拒否レイヤーを追加し、監査上明確な拒否メッセージを提供します。この拒否レイヤーが許可リストを拡張したり上書きしたりすることはありません。 FipsCryptoPolicy::strict()は SHA-256、SHA-384、SHA-512、そしてそれらのハッシュに紐づく RSA PKCS#1 v1.5、RSASSA-PSS、ECDSA の署名 OID、aes-256-cbcとaes-256-gcm、加えて RSA 2048、EC 256、Ed25519 256 の鍵下限を許可します。standard()はさらにaes-128-cbcを許可します。- 電源投入バッテリーは次を対象とします:SHA-256/384/512 ダイジェスト KAT、HMAC-SHA-256 KAT、AES-256-CBC の暗号化・復号 KAT、AES-256-GCM タグ KAT、ECDSA P-256 の対整合性テスト、そして DRBG ヘルスチェック。
FipsSelfTest::run()は常にすべてのテストを実行し、決してショートサーキットしないため、監査証跡としてレポートは完全です。 - DRBG の行は継続的ヘルステスト(抽出長と、連続する異なる抽出)であり、既知応答テストではありません。DRBG の既知応答義務は、運用者が提供する基盤の FIPS 検証済みプロバイダーへ委譲されます。
- エラー状態はプロセス固着です。いずれかの
FipsBootGuardが最初に観測したERRORレポートがプロセス全体をラッチします。新しいガードやポリシーのインスタンスでもエラーを洗浄できず、後続の合格再実行でも解除されません。プロセス再起動(真の電源サイクル)だけが状態をリセットします。 FipsCryptoPolicyはNextPDF\Contracts\CryptoPolicyInterfaceとNextPDF\Contracts\PreOperationalSelfTestInterfaceを実装します。Core の暗号ポリシーとして構成されると、Core の適用シームが最初の署名または暗号文の生成前にassertPreOperational()を駆動します。FipsSignatureEnforcerは生成経路のみをゲートします。既に生成された署名の検証は SP 800-131A Rev.2 の下ではレガシー用途であり、決してエンフォーサーを経由しません。- 監査ロガーが配線されている場合、あらゆる assert 境界は、ポリシー違反のスローに先立って ALLOW(INFO)または DENY(WARNING)のレコードを 1 件出力します。したがってあらゆる
FipsViolationExceptionの拒否は証跡に記録されます。ブートガードのゲートが最初に実行されるため、エラー状態拒否は監査記録より前に発生します。FipsAuditLoggerはガードが適用するのと同じポリシーを参照するため、記録された判定が適用された判定と乖離することはありません。
エッジケースと障害モード
「エッジケースと障害モード」という見出しのセクション- 未知の鍵タイプは両レイヤーで拒否されます。ポリシーは
falseを返し、カタログはそれを不許可として扱います。 - エンフォーサーが署名 OID へ対応付けられない署名アルゴリズム識別子は、
FipsViolationExceptionでフェイルクローズドに拒否されます。 - あらゆる
RSASSA-PSSバリアントは OID1.2.840.113549.1.1.10を共有するため、OID だけではダイジェストを証明できません。エンフォーサーは有効なダイジェストを明示的に束縛し、ダイジェストが SHA-256/384/512 でない PSS トークンを拒否します。 - パースできない証明書、または公開鍵のビット長を取得できない証明書は、
key:unprovableとして拒否されます。 - OpenSSL の非対称プリミティブを持たないランタイムでは、ECDSA 対整合性テストはスキップではなく失敗として記録され、モジュールは
ERRORに入ります。 - 連続する 2 つの同一 32 バイトのランダム抽出は DRBG ヘルスチェック(スタック出力検出)に失敗し、
ERRORを強制します。 - ブートガードなしで構築された
FipsModeGuardはポリシーチェックのみを行い、セルフテストゲートを持ちません。本番コンポジションは常にゲートを配線するFipsBootstrapを経由します。 - ハッシュ名と暗号方式名は小文字で比較され、署名 OID は正規化なしで完全一致します。
FipsBootstrap::lazy()の後、モジュールは最初の assert 境界がバッテリーを実行するまでPRE_OPERATIONALのままです。アサーション時点でPRE_OPERATIONALは非 operational として扱われます。
FIPS モードの動作
「FIPS モードの動作」という見出しのセクションこのモジュール自体が FIPS モードのサーフェスです。モジュールがエラー状態にある間、および事前運用セルフテストの実行中は、暗号出力が抑止されます。あらゆる assert 境界は、署名または暗号文が生成される前に FipsModuleErrorStateException をスローします(ISO/IEC 19790:2025 §7.3.3 b)、AS03.07)。FipsBootGuard::status() と FipsBootstrap::selfTestReport() が状態を公開するため、運用者はモジュールがエラー状態に入ったことを判定できます(ISO/IEC 19790:2025 §7.10.3)。これらの動作は NextPDF コードに関する機能上の主張であって、検証の主張ではありません。FIPS 140 が検証するモジュール境界は、NextPDF ではなく運用者が提供する暗号プロバイダーです。
| 主張 | 標準 | 条項 |
|---|---|---|
| FIPS 140-3 は ISO/IEC 19790 および ISO/IEC 24759 に基づくため、本ページは ISO/IEC 19790 の条項を引用。 | FIPS 140-3 | Introduction (fips_140_3#x26.x2) |
| エラー状態および事前運用セルフテスト中は出力が抑止される。 | ISO/IEC 19790:2025 | §7.3.3 b) [AS03.07] |
| 既知応答テストは計算結果を既知の期待出力と比較する。バッテリーはこの形式を実装。 | ISO/IEC 19790:2025 | §7.10.4 |
| 運用者はステータス出力を通じてエラー状態を判定できる。 | ISO/IEC 19790:2025 | §7.10.3 [AS10.10] |
運用者は定期テストのためセルフテストをオンデマンドで開始できる。rerun() と selfTestReport() がこれを提供。 | ISO/IEC 19790:2025 | §7.10.5 [AS10.54] |
| SHA-1 は新規のデジタル署名生成には不許可。拒否カタログがこれを排除。 | NIST SP 800-131A Rev.2 | §9 |
| 112 ビット強度未満(RSA < 2048、ECDSA order < 224)の署名生成は不許可。鍵下限がこれを適用。 | NIST SP 800-131A Rev.2 | §3 Table 2 |
| 既に生成された SHA-1 署名の検証はレガシー用途であり、生成ゲートを経由しない。 | NIST SP 800-131A Rev.2 | Change summary (9.x4.p12) |
すべての条項は言い換えであり、規範的な本文は再現していません。**NextPDF は FIPS 140 の認証を主張しません。**モジュールはコンプライアンス支援機能として、引用された条項に動作を整合させます。あるデプロイが FIPS 準拠であるかどうかは、運用者の検証済みプロバイダー、モジュール境界の定義、およびコンプライアンスプログラムに依存し、NextPDF 単独では決まりません。
開発ノート
「開発ノート」という見出しのセクション- 決定論的な失敗テストは、
FipsSelfTestコンストラクター、またはFipsCryptoPolicy::strict()、standard()、FipsBootstrapメソッドの$selfTestパラメーターを通じて、壊れたプロバイダーを注入します。 - プロセス固着のエラーラッチには、内部のテスト専用リセットフックがあります。これはサポートされる API の一部ではなく、本番コードが呼び出してはなりません。
- 各 PHP ワーカープロセスは自身の電源投入バッテリーを実行します。レポートはインスタンスごとにキャッシュされるため、ホットパスのアサーションは定数時間のステータスチェックです。
FipsModuleErrorStateExceptionをキャッチして処理を続行してはなりません。この例外はモジュールが暗号サービスを拒否していることを意味します。正しい対応は、是正後に処理を停止しプロセスを再起動することです。FipsBootstrap::selfTestReport()は、ヘルスエンドポイントなどオンデマンドおよび定期のセルフテストのニーズに対応します。合格したオンデマンド実行がラッチ済みのエラーを解除することはありません。
- FIPS 140-2/3 暗号ポリシーとセルフテスト — セットアップと例を含む機能ページ。
- セキュリティ — 詳細リファレンス — Enterprise セキュリティ制御の統合。
- 署名 — 詳細リファレンス — PAdES 長期プロデューサーとその FIPS モードに関する注記。
- セキュリティ — NextPDF Core — ポリシーが束縛する Core の暗号化・署名サーフェス。
本ページは、外部から観測可能な動作とサポートされる公開 API サーフェスのみを記載します。内部の名前空間パス、ヘルパークラス、メカニズムテーブル、Runbook のファイル名、チケットの接頭辞は対象外です。