HotPDF preverja podpise CMS ML-DSA-44, ML-DSA-65, ML-DSA-87, Ed25519 in Ed448 v naloženih dokumentih PDF in podpisuje skozi vtične ponudnike, tako da zasebni ključ nikoli ne mora živeti znotraj vašega procesa Delphi. Druga polovica je del, ki ga večina ekip potrebuje najprej. Strojni žeton, storitev oddaljenega podpisovanja in nacionalna kartica eID vsi odklonijo izročiti ključ in dokler cevovod podpisovanja ni ločen od shrambe ključev, od njih ni mogoče uporabljati nobenega
Ta ločitev je smisel THPDFSignatureProvider. HotPDF obdrži dele, ki jih mora imeti — razčlenjevanje CMS, gradnjo SignedData, razporeditev /ByteRange — in preda eno operacijo, ki je ne more imeti, to je pretvorbo povzetka v podpis s ključem, ki mu ni dovoljeno videti. Vse, kar sledi, izhaja iz te delitve
Zakaj veljaven podpis ML-DSA ne uspe preveriti?
Ker HotPDF odkloni ML-DSA na naloženem dokumentu, ki ne razglasi razširitve zanj. ML-DSA — mrežna shema podpisov, standardizirana kot FIPS 204 in razlog, zakaj ljudje govorijo o "postkvantnem PDF" — še nima registracije v ISO 32000-2. PDF, ki ga nosi, uporablja algoritem, ki ga osnovni standard ne poimenuje, datoteka, ki tiho uporablja neimenovan algoritem, pa je datoteka, katerega verdikta nihče drug ne more reproducirati
Tako HotPDF naredi zahtevo izrecno. EnsureMLDSAExtensions dokument, kjer je dovoljeno, dvigne na PDF 2.0 in v katalog zapiše /Extensions /HotPDF << /BaseVersion /2.0 /ExtensionLevel 1 >>. Na strani branja LoadedDocumentDeclaresMLDSAExtension poroča, ali je ta izjava preživela, VerifyLoadedSignatureWithOptions pa pred upoštevanjem Options.AllowMLDSA uporabi isti preizkus. Nastavite zastavico na nerazglašenem dokumentu in ostane izklopljena — možnost lahko sprosti politiko, nikoli pa strukturne zahteve
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'contract-pq.pdf';
Pdf.BeginDoc;
Pdf.CurrentPage.SetFont('Arial', [], 11);
Pdf.CurrentPage.TextOut(50, 720, 0, 'Supply agreement 2026-114');
Pdf.EnsureMLDSAExtensions; // declare before the signature is written
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Pokličite ga pred shranjevanjem in ne po njem. Izjava je del podpisanega razpona bajtov, katalog, popravljen pozneje, pa je bodisi nepodpisana sprememba podpisane datoteke bodisi druga revizija, ki jo bo validator poročal kot spremembo
Tri družine algoritmov, ena vstopna točka preverjanja
Vse tri družine prispejo skozi VerifyLoadedSignatureWithOptions, ki vzame indeks podpisa, izvorni tok, zapis THPDFCMSVerifyOptions in izhodni parameter za podrobnosti podpisa. Zapis ima natanko tri polja in vsako odgovarja na vprašanje, ki je nekoč zahtevalo ponovno gradnjo
SignatureProvider zamenja vgrajenega ponudnika platforme z vašim lastnim. OpenSSLLibraryPath izbere knjižnico OpenSSL 3, ki dobavlja preverjanje Ed25519 in Ed448 v čistem načinu, ki Windows CNG ne ponuja povsod. AllowMLDSA se odloči za mrežne algoritme, podrejeno preverjanju razširitve zgoraj. Natančen OID algoritma, ki je bil prepoznan, se vrne v THPDFSignatureInfo.SignatureAlgorithmOID, tako da revizijski dnevnik lahko zapiše, kaj je bilo preverjeno, in ne tega, kar je bilo zahtevano
var
Opts: THPDFCMSVerifyOptions;
Info: THPDFSignatureInfo;
Status: THPDFSignatureVerifyStatus;
Src: TFileStream;
begin
Opts := THPDFCMSVerifyOptions.Default;
Opts.OpenSSLLibraryPath := 'C:\openssl3\libcrypto-3-x64.dll';
Opts.AllowMLDSA := Pdf.LoadedDocumentDeclaresMLDSAExtension;
Src := TFileStream.Create('contract-pq.pdf', fmOpenRead or fmShareDenyWrite);
try
Status := Pdf.VerifyLoadedSignatureWithOptions(0, Src, Opts, Info);
if Status = svValid then
Memo1.Lines.Add('signed with OID ' + string(Info.SignatureAlgorithmOID));
finally
Src.Free;
end;
end;
Ed25519 in Ed448 ne potrebujeta izjave razširitve, ker ju ISO 32000-2 že sprejema. Potrebujeta pa ponudnika, ki ju izvaja, kar pri večini uvajanj v Windows pomeni usmerjanje OpenSSLLibraryPath na knjižnico, ki jo dobavite in nadzirate, in ne na tisto, ki se slučajno nahaja na stroju
Kaj ponudnik podpisovanja dejansko obljubi?
Ponudnik obljubi eno stvar: ob zahtevi vrne stanje in ob podpisovanju bajte. THPDFSignatureProviderRequest nosi algoritem in njegov OID, OID povzetka, dolžino soli PSS, ali je vhod sporočilo ali že izračunan povzetek, vhod sam, javni ključ ali potrdilo, identifikator ključa in identifikator operacije. Nič v tem zapisu ni specifično za HotPDF — to je besednjak, ki ga gonilnik žetona ali storitev podpisovanja že govori
Tri implementacije se dobavijo s knjižnico. THPDFCallbackSignatureProvider ovije anonimne metode, kar je najkrajša pot od obstoječe interne rutine podpisovanja do delujočega podpisa PDF. THPDFRemoteSignatureProvider ovije povratni klic prevoza z omejitvijo ponovitev, registrom preklicev in mejami velikosti vhoda in podpisa, tako obvisel HSM ne more postati obvisela aplikacija. THPDFPKCS11SignatureProvider serializira operacije RSA proti seji PKCS#11, ki je v lasti klicatelja in je že overjena, ter ročici zasebnega ključa — HotPDF se nikoli ne prijavi, nikoli ne vidi PIN-a in nikoli ne zapre seje, ki je ni odprl
var
Provider: THPDFRemoteSignatureProvider;
begin
Provider := THPDFRemoteSignatureProvider.Create(
function(const Req: THPDFSignatureProviderRequest; Attempt: Integer;
out Signature: TBytes): THPDFSignatureProviderStatus
begin
// POST Req.Input to the signing service; Req.KeyIdentifier selects the key
if PostToSigningService(Req.KeyIdentifier, Req.Input, Signature) then
Result := spsValid
else
Result := spsProviderError;
end,
3, // RetryLimit
1048576, // MaxInputBytes
65536); // MaxSignatureBytes
try
// hand Provider to the signing call
finally
Provider.Free;
end;
end;
Zakaj ima naštevka stanja šest vrednosti namesto booleana
THPDFSignatureProviderStatus ločuje spsValid, spsInvalid, spsUnsupported, spsMalformed, spsProviderError in spsCancelled, njihovo zlivanje pa stane zmožnost pravilnega delovanja. Podpis, ki je kriptografsko napačen (spsInvalid), je varnostni dogodek. Algoritem, ki ga ponudnik ne izvaja (spsUnsupported), je vzpostavitvena vrzel. Napaka prevoza (spsProviderError) se splača poskusiti znova, uporabniško preklican poziv žetona (spsCancelled) pa se sploh ne splača ponovno poskusiti
Pravilo za podpisovanje je ozko: ponudnik podpisovanja vrne spsValid le z nepraznim podpisom. Ponudniki preverjanja vračajo spsValid ali spsInvalid, ostale štiri pa ostanejo ločene na obeh poteh. Če pišete ponudnika, upirajte se skušnjavi, da bi vse, česar ne prepoznate, preslikali na spsInvalid — to manjkajočo DLL spremeni v poročilo, da je podpis stranke ponarejen
Kje podpis dejansko pristane v datoteki
Dve funkciji povežeta ponudnike z resničnimi bajti PDF. HPDFCMSBuildSignedDataWithProvider zgradi ločeni CMS iz povzetka SHA-256 dokumenta, kar je prava vstopna točka, ko vaš delovni tok povzetek izračuna drugje. HPDFCMSSignPDFStreamWithProvider podpiše obstoječi rezerviran prostor za podpis v toku PDF in ohrani standardni cevovod /ByteRange, kar je prava vstopna točka, ko je HotPDF razporedil rezerviran prostor sam
Ohranjanje tega cevovoda je pomembnejše, kot zveni. Dogovor /ByteRange — dva razpona, ki preskočita šestnajstiško okno podpisa — je tisto, kar validator preveri najprej, pot, ki temelji na ponudniku in bi ga prepisala, pa bi prekinila skladnost PAdES ne glede na to, kako zdrava je bila kriptografija. HotPDF ohranja postavitev enako vgrajeni poti podpisovanja, tako da dokument, podpisan skozi žeton PKCS#11, preverja ista koda za preverjanje podpisov kot tisti, podpisan iz datoteke PFX. Za profilna pravila, ki sedijo nad izbiro algoritma, glejte sprehod skozi osnovne podpise PAdES v Delphiju, za pasti kodiranja, specifične za ECDSA, ki predhajajo temu modelu ponudnika, pa zapiski o preverjanju CMS ECDSA in oblikah podpisov P1363
Vrstni red selitve, ki ne pusti dokumentov v težavah
Pripravljenost na postkvantno je težava razporeda in ne stikalo. Skoraj noben uvajani bralnik PDF danes ne preverja ML-DSA, zato je dokument, podpisan samo z njim, iz vidika bralca dokument z nepreverljivim podpisom. Vrstni red, ki preživi stik z resničnimi arhivi, je: obdržite RSA ali ECDSA kot podpis, ki ga bo validator presojal, dodajte izjavo razširitve in drugi podpis ML-DSA, kjer politika zahteva kvantno odporne dokaze, primarni podpis pa premaknite šele, ko uvozni sistemi dohitevajo
Kar vam HotPDF danes daje, je zmožnost pisanja in preverjanja obojega iz iste kode, pri čemer je algoritem v datoteki in rezultatu preverjanja zapisan pošteno. HotPDF je izvorna komponenta PDF VCL za Delphi in C++Builder brez zunanjega izvajalnega okolja PDF, tako da poti podpisovanja in preverjanja ladite v svoj izvršljivi datoteki in ne ob njej — glejte stran komponente HotPDF za Delphi PDF za popoln seznam zmogljivosti in preizkusni prenos