Salta ai contenuti
getnextpdf.com

Enterprise edizione

FIPS 140 — Riferimento approfondito

Questa pagina è il riferimento approfondito del modulo FIPS 140 di NextPDF Enterprise. Il modulo è una capacità di policy e self-test. Restringe le scelte crittografiche a un allow-list allineato a FIPS, esegue una batteria di known-answer-test al power-on e inibisce l’output crittografico quando la batteria fallisce. NextPDF non è un modulo crittografico FIPS 140 validated, non detiene alcuna certificazione e non ne conferisce alcuna. Il supporto non equivale alla conformità e la conformità non equivale alla certificazione. Un deployment FIPS-compatible richiede inoltre un provider crittografico FIPS-validated fornito dall’operatore.

Questa capacità è distribuita in NextPDF Enterprise (nextpdf/enterprise) e si attiva con un envelope di licenza di tier Enterprise. Un deployment privo di tale entitlement non carica le classi della capacità. Confronta le edizioni e ottieni una licenza.

Tutti i simboli risiedono in NextPDF\Enterprise\Security\Fips, tranne FipsBootstrap in NextPDF\Enterprise\Bootstrap.

SimboloParametriComportamento predefinitoRestituisceLancia o fallisce conNote
FipsBootstrap::boot()?CryptoPolicyInterface $policy, ?FipsSelfTest $selfTest, ?LoggerInterface $auditLogger (tutti predefiniti a null)Esegue una volta la batteria al power-on all’avvio; usa come predefinita la policy strictFipsModeGuardFipsModuleErrorStateException in caso di qualsiasi fallimento di un test al power-onComposition root; audit trail disattivato quando $auditLogger è null
FipsBootstrap::lazy()Come boot()Rimanda la batteria alla prima assertion di confineFipsModeGuardNessuna al momento della chiamata; la prima assertion può lanciare FipsModuleErrorStateExceptionIl modulo resta PRE_OPERATIONAL fino alla prima assertion
FipsBootstrap::signatureEnforcer()?CryptoPolicyInterface $policy = null, ?FipsSelfTest $selfTest = nullAvvia il modulo, poi avvolge il guard per i chokepoint di firmaFipsSignatureEnforcerFipsModuleErrorStateException in caso di qualsiasi fallimento di un test al power-onDelega a boot()
FipsBootstrap::selfTestReport()?FipsSelfTest $selfTest = nullEsegue la batteria on demand e la riepilogaarray{status: FipsSelfTestStatus, operational: bool, failed: list<string>}Non lancia; i fallimenti compaiono in failedPer endpoint di health amministrativi e uso da CLI
FipsCryptoPolicy::strict()?FipsSelfTest $selfTest = nullPreset FIPS 140-3: SHA-256/384/512; OID approvati di RSA, RSASSA-PSS, ECDSA; aes-256-cbc, aes-256-gcm; RSA >= 2048, EC >= 256selfNessunaIl costruttore è privato; i preset sono l’unico punto d’ingresso
FipsCryptoPolicy::standard()?FipsSelfTest $selfTest = nullPreset FIPS 140-2: insieme strict più aes-128-cbcselfNessunaSolo per interoperabilità legacy
FipsCryptoPolicy::assertPreOperational()NessunoEsegue, o riproduce il risultato latched, della batteria al power-onvoidFipsModuleErrorStateException quando qualsiasi test al power-on fallisceGuidata dal seam di enforcement del Core prima della prima operazione
Superficie di query di FipsCryptoPolicyInput string / intControlli di appartenenza all’allow-list; un tipo di chiave sconosciuto viene negatobool / stringNessunaisHashAlgorithmAllowed, isSignatureAlgorithmAllowed, isEncryptionAlgorithmAllowed, isKeyStrengthAllowed, getPreferredHashAlgorithm, getName
FipsModeGuard::__construct()CryptoPolicyInterface $policy, ?FipsBootGuard $bootGuard = null, ?FipsAuditLogger $auditLogger = nullAvvolge una policy con confini in stile assertNessunaSenza $bootGuard non c’è alcun gate di self-test; la composizione di produzione lo fornisce
FipsModeGuard::assertHashAllowed()string $algorithmPrima il deny catalogue, poi l’allow-listvoidFipsViolationException; FipsModuleErrorStateException quando un boot guard è cablatoIl record di audit precede qualsiasi FipsViolationException
FipsModeGuard::assertSignatureAlgorithmAllowed()string $oidPrima il deny catalogue, poi l’allow-listvoidCome sopraGli OID sono confrontati esattamente
FipsModeGuard::assertEncryptionAllowed()string $algorithmPrima il deny catalogue, poi l’allow-listvoidCome sopraI nomi sono confrontati in minuscolo
FipsModeGuard::assertKeyStrengthAllowed()string $keyType, int $bitLengthPrima il deny catalogue, poi i minimi della policyvoidCome sopraUn tipo di chiave sconosciuto viene negato
FipsModeGuard::getPolicy()NessunoRestituisce la policy avvoltaCryptoPolicyInterfaceNessuna
FipsBootGuard::__construct()FipsSelfTest $selfTestDetiene la batteria; non la esegueNessunaUn ciclo al power-on per istanza
FipsBootGuard::report()NessunoEsegue la batteria una volta, memorizza in cache il report, latch in caso di erroreFipsSelfTestReportNessunaLa prima chiamata esegue i test
FipsBootGuard::rerun()NessunoForza una nuova esecuzione; un’esecuzione con errore fa latch del processoFipsSelfTestReportNessunaSelf-test on demand; non è un percorso di error-recovery
FipsBootGuard::assertOperational()NessunoVerifica che il modulo sia operational; sticky per tutto il processovoidFipsModuleErrorStateExceptionUn’istanza pulita lancia comunque quando il processo ha fatto latch di un errore
FipsBootGuard::status()NessunoRiporta lo stato in cacheFipsSelfTestStatusNessunaERROR quando latched; PRE_OPERATIONAL quando mai eseguito
FipsSelfTest::__construct()?callable $randomBytesProvider = null, ?callable $hashProvider = nullUsa hash() e random_bytes() della piattaformaNessunaEsistono override per test di fallimento deterministici
FipsSelfTest::run()NessunoEsegue la batteria completa; non fa mai short-circuitFipsSelfTestReportNessunaI fallimenti finiscono nel report, non nelle eccezioni
FipsSelfTestReportFipsSelfTestStatus $status, array $results, array $failedResultsAggregato immutabile di una singola esecuzioneassertOperational() lancia FipsModuleErrorStateException nello stato di erroreAnche isOperational(), isError()
FipsSelfTestResultstring $algorithm, string $kind, bool $passed, string $message = ''Esito immutabile per singolo testNessunakind è KAT, PWCT o HEALTH; anche isPassed(), isFailed()
FipsSelfTestStatusEnum backed da stringaNessunaCasi PRE_OPERATIONAL, OPERATIONAL, ERROR
FipsSignatureEnforcer::__construct()FipsModeGuard $guardAvvolge un guard boot-gated per i chokepoint di firmaNessuna
FipsSignatureEnforcer::assertSignatureGenerationAllowed()string $algorithm, string $certificatePemRisolve l’OID e la robustezza di chiave, poi delega al guardvoidFipsViolationException (algoritmo sconosciuto, digest PSS non approvato, chiave non dimostrabile o negazione da policy); FipsModuleErrorStateException tramite il guardSolo percorso di generazione; la verifica non passa mai di qui
FipsAuditLogger::__construct()CryptoPolicyInterface $policy, LoggerInterface $loggerAvvolge un logger PSR-3 e la stessa policy applicata dal guardNessunaLe decisioni registrate non possono divergere da quelle applicate
FipsAuditLogger::logHashOperation() / logSignatureOperation() / logEncryptionOperation() / logKeyStrengthCheck()Input string / int per decisioneRegistra ALLOW a INFO e DENY a WARNINGbool (true quando consentito)NessunaContesto strutturato: nome della policy, item, decisione
FipsTransitioningAlgorithmsInput string / intDeny catalogue statico SP 800-131A Rev.2bool / list<string>NessunaisHashDisallowed, isSignatureOidDisallowed, isEncryptionDisallowed, isKeyStrengthDisallowed, più disallowedHashes, disallowedSignatureOids, disallowedEncryption
FipsViolationExceptionstring $policyName, string $violatingItem, string $reasonViolazione di policy tipizzata con campi public readonlySottotipo di NextPDF\Exception\NextPdfException
FipsModuleErrorStateExceptionarray $failedResults, ?string $message = nullRifiuto in stato di errore che trasporta i risultati dei test fallitiSottotipo di NextPDF\Exception\NextPdfException
public static function boot(?CryptoPolicyInterface $policy = null, ?FipsSelfTest $selfTest = null, ?LoggerInterface $auditLogger = null): FipsModeGuard
public static function lazy(?CryptoPolicyInterface $policy = null, ?FipsSelfTest $selfTest = null, ?LoggerInterface $auditLogger = null): FipsModeGuard
public static function signatureEnforcer(?CryptoPolicyInterface $policy = null, ?FipsSelfTest $selfTest = null): FipsSignatureEnforcer
public static function selfTestReport(?FipsSelfTest $selfTest = null): array
public static function strict(?FipsSelfTest $selfTest = null): self
public static function standard(?FipsSelfTest $selfTest = null): self
public function assertPreOperational(): void
public function isHashAlgorithmAllowed(string $algorithm): bool
public function isSignatureAlgorithmAllowed(string $oid): bool
public function isEncryptionAlgorithmAllowed(string $algorithm): bool
public function isKeyStrengthAllowed(string $keyType, int $bitLength): bool
public function getPreferredHashAlgorithm(): string
public function getName(): string
public function __construct(private CryptoPolicyInterface $policy, private ?FipsBootGuard $bootGuard = null, private ?FipsAuditLogger $auditLogger = null)
public function assertHashAllowed(string $algorithm): void
public function assertSignatureAlgorithmAllowed(string $oid): void
public function assertEncryptionAllowed(string $algorithm): void
public function assertKeyStrengthAllowed(string $keyType, int $bitLength): void
public function getPolicy(): CryptoPolicyInterface
public function __construct(private readonly FipsSelfTest $selfTest)
public function report(): FipsSelfTestReport
public function rerun(): FipsSelfTestReport
public function assertOperational(): void
public function status(): FipsSelfTestStatus
public function __construct(?callable $randomBytesProvider = null, ?callable $hashProvider = null)
public function run(): FipsSelfTestReport
public function __construct(private readonly FipsModeGuard $guard)
public function assertSignatureGenerationAllowed(string $algorithm, string $certificatePem): void
public function __construct(private CryptoPolicyInterface $policy, private LoggerInterface $logger)
public function logHashOperation(string $algorithm): bool
public function logSignatureOperation(string $oid): bool
public function logEncryptionOperation(string $algorithm): bool
public function logKeyStrengthCheck(string $keyType, int $bitLength): bool
public static function isHashDisallowed(string $algorithm): bool
public static function isSignatureOidDisallowed(string $oid): bool
public static function isEncryptionDisallowed(string $algorithm): bool
public static function isKeyStrengthDisallowed(string $keyType, int $bitLength): bool
public static function disallowedHashes(): array
public static function disallowedSignatureOids(): array
public static function disallowedEncryption(): array
public function __construct(public FipsSelfTestStatus $status, public array $results, public array $failedResults)
public function isOperational(): bool
public function isError(): bool
public function assertOperational(): void
// FipsSelfTestResult
public function __construct(public string $algorithm, public string $kind, public bool $passed, public string $message = '')
public function isPassed(): bool
public function isFailed(): bool
// FipsSelfTestStatus
enum FipsSelfTestStatus: string
{
case PRE_OPERATIONAL = 'pre_operational';
case OPERATIONAL = 'operational';
case ERROR = 'error';
}
  • L’allow-list della policy è la decisione autoritativa. FipsTransitioningAlgorithms aggiunge sopra di essa un layer di deny esplicito SP 800-131A Rev.2, per messaggi di rifiuto chiari ai fini dell’audit. Il layer di deny non allarga né sovrascrive mai l’allow-list.
  • FipsCryptoPolicy::strict() consente SHA-256, SHA-384 e SHA-512; OID di firma RSA PKCS#1 v1.5, RSASSA-PSS ed ECDSA legati a quegli hash; aes-256-cbc e aes-256-gcm; e soglie di chiave RSA 2048, EC 256, Ed25519 256. standard() consente in aggiunta aes-128-cbc.
  • La batteria al power-on copre: KAT di digest SHA-256/384/512, un KAT HMAC-SHA-256, un KAT di cifratura-e-decifratura AES-256-CBC, un KAT di tag AES-256-GCM, un test di consistenza pair-wise ECDSA P-256 e un health check del DRBG. FipsSelfTest::run() esegue sempre ogni test e non fa mai short-circuit, così il report è completo come evidenza di audit.
  • La riga del DRBG è un health test continuo (lunghezza dell’estrazione più estrazioni successive distinte), non un known-answer test. L’obbligo di known-answer del DRBG è delegato al provider FIPS-validated sottostante fornito dall’operatore.
  • Lo stato di errore è process-sticky. Il primo report ERROR osservato da qualsiasi FipsBootGuard fa latch dell’intero processo. Un guard o una policy istanziati di fresco non possono ripulire l’errore, e un rerun con esito positivo successivo non lo cancella. Solo un riavvio del processo (un vero power cycle) reimposta lo stato.
  • FipsCryptoPolicy implementa NextPDF\Contracts\CryptoPolicyInterface e NextPDF\Contracts\PreOperationalSelfTestInterface. Quando configurata come policy crittografica del Core, il seam di enforcement del Core guida assertPreOperational() prima che venga prodotta la prima firma o il primo ciphertext.
  • FipsSignatureEnforcer presidia solo il percorso di generazione. La verifica di firme già generate è uso legacy secondo SP 800-131A Rev.2 e non passa mai attraverso l’enforcer.
  • Quando un audit logger è cablato, ogni confine di assert emette un record ALLOW (INFO) o DENY (WARNING) prima di qualsiasi throw di violazione di policy. Ogni negazione FipsViolationException è quindi documentata nel trail. Il gate del boot-guard viene eseguito per primo, così un rifiuto in stato di errore viene sollevato prima del record di audit. FipsAuditLogger consulta la stessa policy applicata dal guard, così le decisioni registrate non possono divergere da quelle applicate.
  • Un tipo di chiave sconosciuto viene negato da entrambi i layer: la policy restituisce false e il catalogue lo tratta come disallowed.
  • Un identificatore di algoritmo di firma che l’enforcer non riesce a mappare a un OID di firma viene rifiutato fail-closed con FipsViolationException.
  • Ogni variante RSASSA-PSS condivide l’OID 1.2.840.113549.1.1.10, quindi l’OID da solo non può dimostrare il digest. L’enforcer lega esplicitamente il digest effettivo e nega qualsiasi token PSS il cui digest non sia SHA-256/384/512.
  • Un certificato che non può essere analizzato, o la cui lunghezza in bit della chiave pubblica non è disponibile, viene negato come key:unprovable.
  • Su un runtime privo di primitive asimmetriche OpenSSL, il test di consistenza pair-wise ECDSA registra un fallimento, non uno skip, e il modulo entra in ERROR.
  • Due estrazioni casuali successive identiche da 32 byte fanno fallire l’health check del DRBG (rilevamento di stuck-output) e forzano ERROR.
  • Un FipsModeGuard costruito senza un boot guard esegue solo i controlli di policy e non ha alcun gate di self-test. La composizione di produzione passa attraverso FipsBootstrap, che cabla sempre il gate.
  • I nomi di hash e cifrario sono confrontati in minuscolo; gli OID di firma sono confrontati esattamente, senza alcuna normalizzazione.
  • Dopo FipsBootstrap::lazy(), il modulo resta PRE_OPERATIONAL finché il primo confine di assert non esegue la batteria. PRE_OPERATIONAL è trattato come non operational al momento dell’assertion.

Questo modulo è la superficie della modalità FIPS in sé. Mentre il modulo è nello stato di errore, e mentre girano i self-test pre-operational, l’output crittografico è inibito: ogni confine di assert lancia FipsModuleErrorStateException prima che venga prodotta qualsiasi firma o ciphertext (ISO/IEC 19790:2025 §7.3.3 b), AS03.07). FipsBootGuard::status() e FipsBootstrap::selfTestReport() espongono lo stato così che un operatore possa determinare che il modulo è entrato nello stato di errore (ISO/IEC 19790:2025 §7.10.3). Questi comportamenti sono dichiarazioni di capacità sul codice NextPDF, non una dichiarazione di validazione: il confine del modulo che FIPS 140 valida è il provider crittografico fornito dall’operatore, non NextPDF.

DichiarazioneStandardClausola
FIPS 140-3 si basa su ISO/IEC 19790 e ISO/IEC 24759; questa pagina cita pertanto le clausole ISO/IEC 19790.FIPS 140-3Introduction (fips_140_3#x26.x2)
L’output è inibito nello stato di errore e durante i self-test pre-operational.ISO/IEC 19790:2025§7.3.3 b) [AS03.07]
Un known-answer test confronta un risultato calcolato con un output atteso noto; la batteria implementa questa forma.ISO/IEC 19790:2025§7.10.4
L’operatore può determinare lo stato di errore tramite un output di stato.ISO/IEC 19790:2025§7.10.3 [AS10.10]
Gli operatori possono avviare i self-test on demand per test periodici; rerun() e selfTestReport() lo forniscono.ISO/IEC 19790:2025§7.10.5 [AS10.54]
SHA-1 è disallowed per la generazione di nuove firme digitali; il deny catalogue lo rifiuta.NIST SP 800-131A Rev.2§9
La generazione di firme sotto la robustezza di 112 bit (RSA < 2048, ordine ECDSA < 224) è disallowed; le soglie di chiave lo impongono.NIST SP 800-131A Rev.2§3 Table 2
La verifica di firme SHA-1 già generate è uso legacy; non passa attraverso il gate di generazione.NIST SP 800-131A Rev.2Change summary (9.x4.p12)

Tutte le clausole sono parafrasate; nessun testo normativo è riprodotto. NextPDF non avanza alcuna dichiarazione di certificazione FIPS 140. Il modulo allinea il proprio comportamento alle clausole citate come capacità di assistenza alla conformità. Se un deployment sia FIPS-compliant dipende dal provider validated dell’operatore, dalla definizione del confine del modulo e dal programma di conformità — non da NextPDF da solo.

  • I test di fallimento deterministici iniettano provider difettosi attraverso il costruttore di FipsSelfTest, o attraverso i parametri $selfTest di FipsCryptoPolicy::strict(), standard() e i metodi di FipsBootstrap.
  • Il latch dello stato di errore process-sticky ha un hook di reset interno, solo per test. Non fa parte dell’API supportata e il codice di produzione non deve chiamarlo.
  • Ogni processo worker PHP esegue la propria batteria al power-on. Il report è messo in cache per istanza, così le assertion sul percorso hot sono controlli di stato a tempo costante.
  • Non catturare FipsModuleErrorStateException e proseguire. L’eccezione significa che il modulo rifiuta i servizi crittografici; la risposta corretta è fermarsi e riavviare il processo dopo la remediation.
  • FipsBootstrap::selfTestReport() serve esigenze di self-test on demand e periodici, come gli endpoint di health. Un’esecuzione on demand con esito positivo non cancella mai un errore latched.

Questa pagina documenta solo il comportamento osservabile dall’esterno e la superficie API pubblica supportata. Percorsi di namespace interni, classi helper, tabelle di meccanismi, nomi di file di runbook e prefissi di ticket sono fuori ambito.