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

Vedi firma PFX incrementale e verifica RFC3161 nativa