Salta ai contenuti

Criterio crittografico e self-test FIPS 140-2/3

NextPDF Enterprise limita le scelte crittografiche che un’operazione di firma o cifratura può effettuare a un insieme approvato dai Federal Information Processing Standards (FIPS) e rifiuta qualsiasi scelta esterna a tale insieme. Un guard runtime asserisce ogni hash, identificatore di algoritmo di firma, algoritmo di cifratura e robustezza della chiave prima dell’esecuzione dell’operazione. La batteria di self-test all’avvio viene eseguita una sola volta quando il processo parte e porta il modulo in uno stato di errore se un qualsiasi known-answer test fallisce. Questa pagina descrive il comportamento: cosa il criterio consente, cosa il guard rifiuta, cosa copre il self-test e la posizione esplicita in materia di certificazione.

NextPDF Enterprise è uno strumento di supporto alla conformità, non un modulo crittografico certificato. La posizione esplicita di non certificazione è indicata in Sicurezza e conformità.

I prerequisiti sono dichiarati nel front matter e ripetuti in Prerequisiti.

Il profilo del criterio crittografico in modalità FIPS, il guard runtime e il guard di self-test all’avvio sono distribuiti nel pacchetto nextpdf/enterprise e sono regolati dal feature flag di licenza enterprise. NextPDF Core e NextPDF Pro non forniscono un profilo in modalità FIPS. Il guard e il self-test vengono eseguiti nel processo; nessun contenuto del documento lascia l’host per la verifica del criterio o per il self-test. Confronta le edizioni.

La funzionalità si articola in tre parti: un criterio crittografico, un guard runtime e un self-test all’avvio.

Il criterio crittografico limita le scelte crittografiche a un insieme approvato, con due preset:

  • Strict (allineato alla generazione FIPS 140-3) — hash SHA-256, SHA-384 e SHA-512; identificatori di oggetto (OID) di firma RSA ed ECDSA con tali hash; cifratura AES-256-CBC; e dimensioni minime pari a chiave RSA 2048 e curva ellittica 256.
  • Standard (allineato alla generazione FIPS 140-2) — come strict, ma consente anche AES-128-CBC per l’interoperabilità con sistemi più datati.

Una chiave RSA di almeno 2048 bit e un ordine ECDSA di almeno 224 bit sono i minimi accettabili per la generazione della firma secondo NIST SP 800-131A Rev.2 §3; i limiti minimi 2048/256 del preset strict sono pari o superiori a tali minimi. Un tipo di chiave sconosciuto viene negato per impostazione predefinita — il criterio non accetta silenziosamente un tipo non riconosciuto.

Il guard runtime incapsula il criterio ed espone metodi in stile assert per hash, OID di firma, algoritmo di cifratura e robustezza della chiave. Una scelta non consentita solleva una violazione tipizzata che indica il criterio e l’elemento in violazione e interrompe l’operazione. Il percorso è fail-closed: il criterio non viene mai allentato e non sostituisce mai un algoritmo più debole. Per una firma RSASSA-PSS, il gate di generazione vincola esplicitamente il digest del messaggio: poiché ogni variante PSS condivide un unico OID di firma — l’hash risiede nei parametri PSS, non nell’OID — la sola allowlist di OID non può provare il digest effettivo; quindi il gate asserisce che tale digest sia approvato FIPS (SHA-256/384/512) e nega in modo fail-closed un token PSS il cui digest è sconosciuto o non approvato, per esempio SHA-1 PSS, prima di qualsiasi dispatch verso il signer (FIPS 186-5 §5.4(b)).

Il self-test all’avvio esegue una batteria di known-answer test (KAT) una volta all’avvio del processo, coprendo le funzioni approvate di hash, autenticazione del messaggio, cifratura, cifratura autenticata, firma e bit casuali. Un known-answer test fallisce quando l’output calcolato non è uguale alla risposta nota, secondo ISO/IEC 19790:2025 §7.10.4.2. In caso di qualsiasi fallimento il modulo entra in uno stato di errore e rifiuta i servizi crittografici (ISO/IEC 19790:2025 §7.2.4.3). Lo stato di errore è persistente per il processo: una volta che un qualsiasi boot guard nel processo osserva un errore, l’intero processo rimane fail-closed per tutta la sua durata. Costruire un nuovo boot guard o criterio non può cancellarlo, e una successiva ri-esecuzione superata del self-test non azzera un errore bloccato — può farlo solo un riavvio del processo (un vero ciclo di spegnimento e riaccensione), secondo ISO/IEC 19790:2025 §7.10.2. Il risultato viene memorizzato nella cache per tutta la durata del processo; una ri-esecuzione su richiesta è disponibile per un endpoint amministrativo o un comando, ma soddisfa l’obbligo di self-test periodico, non il ripristino dall’errore.

L’uso della cifratura autenticata secondo il criterio richiede un vettore di inizializzazione (IV) univoco per ciascuna chiave, secondo NIST SP 800-38D §5.2.1.

  1. Installare NextPDF Core e il pacchetto Enterprise e disporre di una licenza Enterprise attiva.
  2. Per dichiarare un funzionamento compatibile FIPS, configurare NextPDF con un provider crittografico convalidato FIPS — per esempio un provider OpenSSL convalidato FIPS — o un HSM convalidato FIPS. NextPDF Enterprise esegue l’assemblaggio strutturale, il calcolo del digest e l’applicazione del criterio; la primitiva sottostante viene eseguita nel boundary convalidato fornito dall’utente.
  3. Decidere il preset: strict per un’applicazione allineata a FIPS 140-3, oppure standard quando è richiesta l’interoperabilità AES-128-CBC.
  • Preset — scegliere strict o standard. Strict consente solo AES-256-CBC; standard consente anche AES-128-CBC.
  • Guard — costruire il guard con il criterio scelto. Il guard è il boundary nel quale si asserisce ogni scelta crittografica.
  • Wiring del self-test — collegare il boot guard al bootstrap dell’applicazione in modo che ogni processo worker esegua il proprio ciclo di self-test. Le diverse istanze di processo eseguono ciascuna il proprio self-test all’avvio.
  1. Al bootstrap dell’applicazione, eseguire il self-test all’avvio tramite il boot guard e asserire che il modulo sia operativo. Arrestare il processo se non lo è.
  2. Costruire il guard con il criterio strict o standard.
  3. Prima di ogni operazione crittografica, asserire tramite il guard l’hash, l’OID di firma, l’algoritmo di cifratura e la robustezza della chiave.
  4. Intercettare la violazione tipizzata, registrare un messaggio strutturato e rifiutare l’operazione — non ripiegare su una scelta più debole.
examples/enterprise/fips-boot-and-guard.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Enterprise\Security\Fips\FipsBootGuard;
use NextPDF\Enterprise\Security\Fips\FipsCryptoPolicy;
use NextPDF\Enterprise\Security\Fips\FipsModeGuard;
use NextPDF\Enterprise\Security\Fips\FipsSelfTest;
use NextPDF\Enterprise\Security\Fips\FipsModuleErrorStateException;
use Psr\Log\LoggerInterface;
/**
* Run the power-on self-test, then build a guard on the strict policy.
*
* The self-test runs once per process. A known-answer failure raises a
* module-error-state exception; the caller must stop rather than proceed
* with an unverified crypto path.
*
* @param LoggerInterface $logger Structural diagnostics only — never secrets.
*
* @throws FipsModuleErrorStateException When a power-on known-answer test fails.
*
* @return FipsModeGuard A guard ready to assert each cryptographic choice.
*/
function bootFipsGuard(LoggerInterface $logger): FipsModeGuard
{
$bootGuard = new FipsBootGuard(new FipsSelfTest());
try {
$bootGuard->assertOperational();
} catch (FipsModuleErrorStateException $e) {
$logger->critical('FIPS power-on self-test failed; refusing crypto services.', [
'reason' => $e->getMessage(),
]);
throw $e;
}
return new FipsModeGuard(FipsCryptoPolicy::strict());
}
examples/enterprise/fips-assert-choices.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Enterprise\Security\Fips\FipsModeGuard;
use NextPDF\Enterprise\Security\Fips\FipsViolationException;
use Psr\Log\LoggerInterface;
final readonly class FipsCheckedSigning
{
public function __construct(
private FipsModeGuard $guard,
private LoggerInterface $logger,
) {}
/**
* Assert the signing choices against the active policy before signing.
*
* A disallowed hash, signature OID, or key strength raises a typed
* violation; the operation is refused rather than downgraded.
*
* @param string $hash The hash algorithm name (e.g. 'sha256').
* @param string $signatureOid The signature algorithm OID.
* @param string $keyType The key type (e.g. 'rsa', 'ec').
* @param positive-int $keyBits The key length in bits.
*
* @throws FipsViolationException When any choice is not approved.
*/
public function assertApproved(
string $hash,
string $signatureOid,
string $keyType,
int $keyBits,
): void {
try {
$this->guard->assertHashAllowed($hash);
$this->guard->assertSignatureAlgorithmAllowed($signatureOid);
$this->guard->assertKeyStrengthAllowed($keyType, $keyBits);
} catch (FipsViolationException $e) {
$this->logger->error('FIPS policy violation', ['reason' => $e->getMessage()]);
throw $e;
}
}
}
  1. Eseguire il self-test all’avvio e verificare che riporti lo stato operativo. Verificare che ogni classe di algoritmi approvata — hash, autenticazione del messaggio, cifratura, cifratura autenticata, firma e bit casuali — venga esercitata.
  2. Asserire una scelta approvata (per esempio SHA-256, RSA 2048) e verificare che venga superata; asserire una scelta non consentita (per esempio SHA-1, RSA 1024) e verificare che sollevi una violazione tipizzata.
  3. Iniettare nel self-test un hash deliberatamente difettoso o una sorgente di casualità deliberatamente difettosa e verificare che il modulo entri nello stato di errore e rifiuti i servizi.
  4. Verificare che un tipo di chiave sconosciuto venga negato per impostazione predefinita anziché accettato.
  • Fail-closed. Una scelta crittografica non consentita solleva una violazione tipizzata e interrompe l’operazione. Il criterio non viene mai allentato e non sostituisce mai un algoritmo più debole.
  • Il self-test rifiuta in caso di mancata corrispondenza. Il fallimento di un known-answer test porta il modulo in uno stato di errore persistente per il processo. L’intero processo rimane fail-closed; un nuovo boot guard o criterio non può ripristinarlo, e una ri-esecuzione superata non rimuove il blocco — solo un riavvio del processo lo azzera (ISO/IEC 19790:2025 §7.10.4.2; §7.10.2).
  • Robustezza della chiave. Il preset strict impone i minimi RSA 2048 e curva ellittica 256, pari o superiori ai limiti minimi accettabili di NIST SP 800-131A Rev.2 §3.
  • Univocità dell’IV. L’uso della cifratura autenticata richiede un IV univoco per ciascuna chiave (NIST SP 800-38D §5.2.1).

Questa pagina è contrassegnata con export_control_class: legal-review-required perché riguarda il criterio crittografico. Ogni fonte normativa è parafrasata; nessun testo normativo viene riprodotto. È necessaria l’approvazione legale prima che il flag publish venga impostato.

NextPDF Enterprise non è un modulo crittografico convalidato FIPS e non formula alcuna dichiarazione di certificazione FIPS. Opera in una modalità compatibile FIPS solo quando è configurato con un provider crittografico convalidato FIPS — per esempio un provider OpenSSL convalidato FIPS — o un HSM convalidato FIPS. Il criterio in modalità FIPS supporta la conformità; non è una certificazione né un parere legale. Consultare i propri consulenti legali e di conformità per gli obblighi normativi applicabili.

  • Fallimento del self-test all’avvio. Il boot guard solleva un’eccezione di stato di errore del modulo. Arrestare il processo; non procedere con un percorso crittografico non verificato.
  • Violazione del criterio. Il guard solleva una violazione tipizzata che indica il criterio e l’elemento in violazione. Rifiutare l’operazione; non effettuare un downgrade.
  • Tipo di chiave sconosciuto. Il criterio lo nega per impostazione predefinita. Mappare esplicitamente il tipo di chiave se è effettivamente approvato.
  • Ri-esecuzione del self-test. Una ri-esecuzione è disponibile su richiesta per un endpoint amministrativo o un comando e soddisfa l’obbligo di self-test periodico su richiesta. Non è un meccanismo di ripristino: una ri-esecuzione fallita blocca anch’essa il processo, e una ri-esecuzione superata non rimuove un blocco esistente. Il ripristino di un modulo nello stato di errore richiede un riavvio del processo.

NextPDF Core distribuisce il signer software e la cifratura senza un profilo in modalità FIPS. NextPDF Enterprise aggiunge il profilo del criterio crittografico in modalità FIPS, il guard runtime e il guard di self-test all’avvio, così che un deployment possa limitare le scelte crittografiche a un insieme approvato e fallire in modo chiuso in caso di mancata corrispondenza del self-test. Abbinarlo a Firma HSM per eseguire la primitiva all’interno di un dispositivo convalidato FIPS. Confronta le edizioni.