Timestamp di firma su Windows
L'operazione sign di Windows può richiedere un timestamp RFC3161 autentico attraverso una callback sincrona dell'applicazione e pubblicare il PDF solo dopo aver autenticato la risposta
Opzioni di firma
{"schemaVersion":1,"type":"sign","incremental":true,
"existingField":true,"fieldName":"ApprovalOne",
"pfxFile":"C:/keys/signer.pfx","pfxPassword":"password",
"cades":true,"digestMethod":"SHA384","timestamp":true,
"timestampURL":"https://tsa.example/service",
"timestampTrustedCAFile":"C:/trust/tsa-roots.pem",
"timestampTrustedCRLFile":"C:/trust/tsa-crls.pem",
"requireTimestampRevocation":true}
timestamp ha default false; un valore true richiede la callback transport dell'applicazione e un timestampTrustedCAFile esplicito contenente root di certificati PEM trusted
digestMethod seleziona il digest CMS del documento reale e l'algoritmo di imprint del timestamp tra SHA256, SHA384 o SHA512; il messageImprint calcola l'hash degli ottetti di firma CMS reali esattamente una volta
timestampTrustedCRLFile fornisce opzionalmente CRL PEM; requireTimestampRevocation richiede quel file e abilita i controlli CRL su issuer e certificati, inclusi certificati revocati ed evidenza scaduta
I file di input per il trust restano aperti con condivisione in scrittura negata durante la firma e la loro dimensione combinata è limitata a un ottavo di memoryBytes prima che OpenSSL li carichi
Ogni richiesta contiene un nonce crittografico fresco e richiede i certificati TSA; la validazione della risposta autentica nonce della richiesta, imprint, firma CMS completa, binding ESS del certificato di firma, catena di certificati ed EKU critico del timestamp
Transport ABI C
Passa hpdf_signing_operation_v1 a hpdf_document_execute_json_v1, imposta operation.struct_size a sizeof(hpdf_signing_operation_v1), e fornisci timestamp_transport e timestamp_user_data
Il prefisso dell'operazione conserva il layout hpdf_operation_v1 esistente e la versione ABI; le operazioni ordinarie continuano a usare la struttura originale
La callback riceve il TimeStampReq DER completo e un response_io preso in prestito; scrivi il TimeStampResp DER completo attraverso response_io.write e restituisci un hpdf_status
La callback gira sul thread chiamante, e i puntatori IO di richiesta e risposta restano validi solo durante quell'invocazione; l'applicazione possiede il transport di rete, l'autenticazione, il timeout e la policy di connessione
response_io.is_cancelled interroga le callback di cancellazione di input, output e result dell'operazione; le scritture della risposta impongono un massimo di 16 MiB ulteriormente limitato a un ottavo di memoryBytes prima di copiare la memoria della callback
Un fallimento di scrittura della risposta o di cancellazione resta attivo per l'operazione anche se la callback restituisce success in seguito; le risposte fallite non possono pubblicare byte PDF
Entry del servizio Pascal
THPDFJobProcessor.ExecuteLoadedSigningOperation accetta il documento caricato, l'oggetto JSON dell'operazione, lo stream di output, il checkpoint, la callback THPDFHeadlessTimestampTransport e un contesto callback opaco
Il transport Pascal riceve il DER della richiesta e restituisce il DER della risposta; la firma sincrona annidata ripristina il contesto callback esterno quando l'operazione interna ritorna
Valori seed e provenienza
Un vincolo SV TimeStamp obbligatorio è soddisfatto da una risposta reale autenticata; quando il dizionario TimeStamp obbligatorio specifica un URL, timestampURL deve corrispondere a quel valore
timestampURL è una provenienza del transport dichiarata dall'applicazione; confrontare l'URL dichiarato non stabilisce l'identità del server HTTPS, e l'applicazione deve autenticare il proprio endpoint selezionato
I job file standalone senza callback dell'applicazione non possono eseguire una richiesta di timestamp; una stringa URL da sola non può soddisfare un timestamp obbligatorio