ÐалидиÑанеÑо на един PAdES Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ð¸Ð·Ð¸Ñква пÑовеÑка на ÑÑи незавиÑими неÑа, а зеленаÑа оÑмеÑка в пÑогÑамаÑа за пÑеглед ви инÑоÑмиÑа Ñамо за ÑÑеÑоÑо. ÐÑÑво: маÑивÑÑ /ByteRange ÑÑÑбва да покÑива пÑавилниÑе байÑове, каÑо диапазонÑÑ Ð¾Ñ Ð´Ð°Ð½Ð½Ð¸ ÑÑÑбва да ÑÑоÑвеÑÑÑва ÑоÑно на вÑ
одÑÑиÑе данни за изÑиÑлÑване на CMS дайджеÑÑа, без подпиÑани байÑове извÑн него. ÐÑоÑо: ÑеÑÑиÑикаÑÑÑ Ð² CMS ÑÑÑбва да води до довеÑен коÑенен ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð¸ да ÑÑдÑÑжа подпиÑÐ°Ð½Ð¸Ñ Ð°ÑÑибÑÑ Ð·Ð° ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð½Ð° подпиÑваÑиÑ, изиÑкван Ð¾Ñ PAdES. ТÑеÑо: ако пÑоÑилÑÑ Ð¸Ð·Ð¸Ñква вÑемеви пеÑаÑ, Ñокен по RFC 3161 ÑÑÑбва да обвÑÑже ÑÑойноÑÑÑа на подпиÑа Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñв вÑемеÑо пÑеди изÑиÑанеÑо на ÑеÑÑиÑикаÑа. Acrobat обединÑва Ñези ÑÑи ÑÑÑпки в една икона; пÑогÑама за пÑовеÑка на ÑÑвмеÑÑимоÑÑ Ð³Ð¸ анализиÑа пооÑделно, какÑо би ÑÑÑбвало да пÑави и кодÑÑ, койÑо генеÑиÑа Ñези Ñайлове. losLab PDF Library (PDFlibPas) пÑедоÑÑÐ°Ð²Ñ Ð²ÑзможноÑÑи за подпиÑване, вгÑаждане на вÑемеви пеÑÐ°Ñ Ð¸ Ð¾Ð´Ð¸Ñ Ð½Ð° ByteRange, пÑеди да Ñе довеÑиÑе на Ñайла.
Ðдна Ñазлика заÑÑÑднÑва поÑÑи вÑÑка пÑÑва имплеменÑаÑÐ¸Ñ Ð½Ð° PAdES, заÑова е добÑе да Ñ Ð¸Ð·ÑÑним пÑеди ÑазглежданеÑо на кода. ÐодпиÑ, напÑавен Ñ /SubFilter /adbe.pkcs7.detached, е напÑлно коÑекÑен Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ð¿Ð¾ ISO 32000-1 §12.8, койÑо Acrobat Ñе оÑÑеÑе каÑо валиден. Той обаÑе не е PAdES подпиÑ, ÑÑй каÑо ÑÑандаÑÑÑÑ ETSI EN 319 142-1 изиÑква използванеÑо на ETSI.CAdES.detached за вÑÑко базово ниво. ÐалидаÑÐ¾Ñ Ð·Ð° ÑÑвмеÑÑимоÑÑ Ñ eIDAS Ñе оÑÑ
вÑÑли пÑÑÐ²Ð¸Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð¸ Ñе пÑиеме вÑоÑиÑ, вÑпÑеки Ñе кÑипÑогÑаÑиÑÑа е иденÑиÑна. ÐÑоÑилÑÑ Ðµ деклаÑаÑиÑ, коÑÑо докÑменÑÑÑ Ð¿Ñави за Ñебе Ñи, а задаванеÑо на Ñази деклаÑаÑÐ¸Ñ Ñе извÑÑÑва Ñ ÐµÐ´Ð½Ð¾ извикване в PDFlibPas.
Ðакво пÑевÑÑÑа подпиÑа в PDF в PAdES подпиÑ
ETSI EN 319 142-1 деÑиниÑа ÑеÑиÑи базови нива, надгÑаждаÑи CMS ÑоÑмаÑа. PAdES-B-B е оÑпÑавнаÑа ÑоÑка: CAdES Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ð² PDF поле за Ð¿Ð¾Ð´Ð¿Ð¸Ñ ÑÑÑ SubFilter ETSI.CAdES.detached и подпиÑан аÑÑибÑÑ Ð·Ð° ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð½Ð° подпиÑваÑиÑ. PAdES-B-T Ð´Ð¾Ð±Ð°Ð²Ñ Ð²Ñемеви пеÑÐ°Ñ Ð¿Ð¾ RFC 3161 над ÑÑойноÑÑÑа на подпиÑа, доказвайки ÑÑÑеÑÑвÑванеÑо Ð¼Ñ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¾Ñ Ð²ÑемеÑо, койÑо никой не може да пÑомени Ñ Ð·Ð°Ð´Ð½Ð° даÑа. PAdES-B-LT вгÑажда ÑеÑÑиÑикаÑи, CRL ÑпиÑÑÑи и OCSP оÑговоÑи за валидиÑане в ÑеÑник Document Security Store (DSS), Ñака Ñе ÑайлÑÑ Ð¾ÑÑава пÑовеÑим и Ñлед каÑо издаваÑиÑÑ Ð¾Ñган (CA) пÑекÑаÑи ÑвоÑÑа инÑÑаÑÑÑÑкÑÑÑа. PAdES-B-LTA завÑÑÑва ÑÑека Ñ Ð²Ñемеви пеÑÐ°Ñ Ð½Ð° докÑменÑа, койÑо заÑиÑава наÑÑÑпаниÑе доказаÑелÑÑва пÑи оÑÑлабване на кÑипÑогÑаÑÑкиÑе алгоÑиÑми.
ÐенеÑиÑане на базов подпиÑ
ÐÑновниÑÑ API ÑпÑавлÑва подпиÑванеÑо каÑо пÑоÑÑ ÐºÑаен авÑомаÑ: оÑваÑÑне на пÑоÑÐµÑ Ð²ÑÑÑ Ñ Ð¸Ð·Ñ Ð¾Ð´Ð½Ð¸Ñ Ñайл, конÑигÑÑиÑане, Ð·Ð°Ð¿Ð¸Ñ Ð² Ð¸Ð·Ñ Ð¾Ð´ÐµÐ½ Ñайл и ÑеÑене на кода за ÑезÑлÑаÑ.
var
Pdf: TPDFlib;
SignId: Integer;
begin
Pdf := TPDFlib.Create;
try
SignId := Pdf.NewSignProcessFromFile('invoice.pdf', '');
if SignId = 0 then
raise Exception.Create('cannot open source PDF');
Pdf.SetSignProcessField(SignId, 'Sig1');
Pdf.SetSignProcessPFXFromFile(SignId, 'company.pfx', PfxPassword);
Pdf.SetSignProcessInfo(SignId, 'Approved', 'Vienna', 'billing@example.com');
Pdf.SetSignProcessCustomSubFilter(SignId, 'ETSI.CAdES.detached');
Pdf.SetSignProcessDigestAlgorithm(SignId, 2); // SHA-256
Pdf.SetSignProcessReserveContentsBytes(SignId, 8192); // room for a timestamp later
Pdf.EndSignProcessToFile(SignId, 'invoice-signed.pdf');
if Pdf.GetSignProcessResult(SignId) <> 1 then
raise Exception.CreateFmt('signing failed, code %d',
[Pdf.GetSignProcessResult(SignId)]);
Pdf.ReleaseSignProcess(SignId);
finally
Pdf.Free;
end;
end;
NewSignProcessFromFile вÑÑÑа 0, когаÑо изÑоÑникÑÑ Ð¸Ð·Ð¾Ð±Ñо не може да бÑде оÑвоÑен. След Ñова меÑодÑÑ GetSignProcessResult ÑазгÑаниÑава видовеÑе гÑеÑки, коиÑо Ñе ÑлÑÑÐ²Ð°Ñ Ð² Ñеална ÑÑеда: 4 ознаÑава гÑеÑна PDF паÑола, 7 - гÑеÑна PFX паÑола, 9 - ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð±ÐµÐ· ÑаÑÑен клÑÑ, 10 - липÑа на пÑава за Ð·Ð°Ð¿Ð¸Ñ Ð² изÑ
Ð¾Ð´Ð½Ð¸Ñ Ð¿ÑÑ, 11 - гÑеÑка пÑи пÑилагане на байÑовеÑе на подпиÑа. ÐапиÑванеÑо на ÑиÑÑÐ¾Ð²Ð¸Ñ ÐºÐ¾Ð´ до имеÑо на Ñайла пÑевÑÑÑа неÑÑноÑо ÑÑобÑение за пÑоблем в бÑÑза диагноÑÑика.
ÐобавÑне на вÑемеви пеÑÐ°Ñ Ð¿Ð¾ RFC 3161, койÑо библиоÑекаÑа нÑма да извлеÑе вмеÑÑо ваÑ
PDFlibPas не ÑÑдÑÑжа вгÑаден TSA клиенÑ, коеÑо е ÑÑзнаÑелно ÑеÑение за огÑаниÑаване на обÑ
ваÑа, а не пÑопÑÑк. ÐиблиоÑекаÑа изÑиÑлÑва Ñ
еÑа, койÑо ÑÑÑвÑÑÑÑ Ð·Ð° вÑемеви пеÑÐ°Ñ (TSA) ÑÑÑбва да подпиÑе, и вгÑажда обÑаÑно ÑазÑиÑÐµÐ½Ð¸Ñ CMS; HTTP комÑникаÑиÑÑа и обÑабоÑкаÑа на CMS Ñа задаÑа на извикваÑÐ¸Ñ ÐºÐ¾Ð´. Ðма ÑеÑиозна ÑеÑ
ниÑеÑка пÑиÑина за Ñова Ñазделение: ÑÑнкÑиÑÑа на Windows CryptoAPI за добавÑне на неподпиÑани аÑÑибÑÑи (CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR) Ñе пÑÐ¾Ð²Ð°Ð»Ñ Ñ Ð³ÑеÑка CRYPT_E_INVALID_INDEX пÑи ÑÑÑÑкÑÑÑаÑа SignedData, използвана Ð¾Ñ PAdES. ÐоÑади Ñази пÑиÑина ÑазÑиÑениÑÑ CMS ÑÑÑбва да бÑде генеÑиÑан Ð¾Ñ ÐºÐ¾Ð´ÐµÑ Ð·Ð° CMS под Ð²Ð°Ñ ÐºÐ¾Ð½ÑÑол. Ðикой инÑÑÑÑÐ¼ÐµÐ½Ñ Ð½Ðµ може безÑÑмно да внедÑи Ñокена Ñ ÐµÐ´Ð½Ð¾ извикване и вÑеки, койÑо ÑвÑÑди обÑаÑноÑо, извÑÑÑва Ñази опеÑаÑÐ¸Ñ ÑкÑиÑо.
var
Pdf: TPDFlib;
StsId: Integer;
HashHex, TstDer, TsAttr, AugmentedCms: AnsiString;
begin
Pdf := TPDFlib.Create;
try
StsId := Pdf.NewPAdESSignatureTimeStampProcessFromFile('invoice-signed.pdf', '');
Pdf.SetPAdESSignatureTimeStampField(StsId, 'Sig1');
Pdf.SetPAdESSignatureTimeStampDigestAlgorithm(StsId, 2);
HashHex := Pdf.GetPAdESSignatureValueHashHex(StsId);
// both calls below are application code: an HTTP POST to your TSA,
// and a CMS re-encode that attaches the token as an unsigned attribute
TstDer := RequestTimeStampToken(HashHex);
TsAttr := Pdf.BuildPAdESSignatureTimeStampAttribute(TstDer);
AugmentedCms := AttachUnsignedAttribute(Pdf.GetPAdESSignatureCMSBytes(StsId), TsAttr);
Pdf.SetPAdESSignatureCMSBytes(StsId, AugmentedCms);
Pdf.EndPAdESSignatureTimeStampProcessToFile(StsId, 'invoice-bt.pdf');
if Pdf.GetPAdESSignatureTimeStampProcessResult(StsId) <> 1 then
raise Exception.Create('timestamp embedding failed');
Pdf.ReleasePAdESSignatureTimeStampProcess(StsId);
finally
Pdf.Free;
end;
end;
СледеÑе кодовеÑе за гÑеÑка ÑÑк: 12 ознаÑава, Ñе поÑоÑеноÑо поле за Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ð½Ðµ ÑÑÑеÑÑвÑва, 11 - Ñе ÑÑÑеÑÑвÑваÑиÑÑ CMS не може да бÑде анализиÑан, а 13 - Ñе ÑазÑиÑениÑÑ CMS веÑе не Ñе побиÑа в запазеноÑо мÑÑÑо в /Contents. ÐÑеÑка 13 е най-ÑеÑиознаÑа, ÑÑй каÑо единÑÑвеноÑо ÑеÑение е повÑоÑно подпиÑване: ÑÑандаÑÑниÑÑ Ñокен за вÑемеви пеÑÐ°Ñ ÑÑÑ ÑвоÑÑа веÑига Ð¾Ñ ÑеÑÑиÑикаÑи заема Ð¼ÐµÐ¶Ð´Ñ 4 и 6 KB, а запазванеÑо на 8192 байÑа по вÑеме на ÑазаÑа B-B ÑÑÑеÑÑвÑва именно за да оÑигÑÑи доÑÑаÑÑÑно мÑÑÑо за Ñази опеÑаÑиÑ.
ÐалидиÑанеÑо запоÑва Ð¾Ñ ByteRange, а не Ð¾Ñ Ð²ÐµÑигаÑа ÑеÑÑиÑикаÑи
ÐеленаÑа оÑмеÑка в ÑеÑеÑа е ÑеÑение за довеÑие ÑпÑÑмо базаÑа данни ÑÑÑ ÑеÑÑиÑикаÑи на ÑÑоÑвеÑнаÑа маÑина, а не ÑÑÑÑкÑÑÑна пÑовеÑка на Ñайла. ÐÑогÑамноÑо валидиÑане ÑÑÑбва да запоÑне Ð¾Ñ Ð¿Ð¾-ниÑко ниво, Ñ Ð²ÑпÑоÑа, койÑо инкÑеменÑалниÑе акÑÑализаÑии пÑавÑÑ Ñложен: кои байÑове дейÑÑвиÑелно покÑива вÑеки подпиÑ? ÐÑÑко ÑазÑиÑение, незавиÑимо дали е вÑоÑи подпиÑ, DSS ÑеÑник или вÑемеви пеÑÐ°Ñ Ð½Ð° докÑменÑа, Ñе Ð´Ð¾Ð±Ð°Ð²Ñ ÐºÐ°Ñо инкÑеменÑална акÑÑализаÑиÑ, каÑо вÑÑка акÑÑализаÑÐ¸Ñ Ð´Ð¾Ð±Ð°Ð²Ñ Ð±Ð°Ð¹Ñове извÑн пÑÑвонаÑÐ°Ð»Ð½Ð¸Ñ /ByteRange на подпиÑа. Тези добавени байÑове Ñа напÑлно легиÑимни. ÐалидаÑоÑÑÑ ÑÑÑбва да ги клаÑиÑиÑиÑа ÑÑглаÑно полиÑикаÑа за пÑомÑна на докÑменÑа, каÑо нивоÑо DocMDP на Ñази полиÑика за вÑÑко поле може да бÑде пÑоÑеÑено ÑÑез GetSignatureDocMDPLevelByName.
var
Doc: TPDFlibSignDoc;
Names: TStringList;
I: Integer;
B0, B1, B2, B3, FileSize: Int64;
begin
FileSize := TFile.GetSize('invoice-bt.pdf'); // before Open: SignDoc holds a share lock
Doc := TPDFlibSignDoc.Create;
try
if not Doc.Open('invoice-bt.pdf', '', False) then
raise Exception.Create('cannot open for audit');
Names := TStringList.Create;
try
Doc.GetSignatureFieldNames(Names);
for I := 0 to Names.Count - 1 do
if Doc.GetSignatureValueObjNum(Names[I]) > 0 then // >0 means actually signed
begin
B0 := StrToInt64(string(Doc.GetSignatureValueByName(Names[I], 11)));
B1 := StrToInt64(string(Doc.GetSignatureValueByName(Names[I], 12)));
B2 := StrToInt64(string(Doc.GetSignatureValueByName(Names[I], 13)));
B3 := StrToInt64(string(Doc.GetSignatureValueByName(Names[I], 14)));
if (B0 = 0) and (B2 + B3 = FileSize) then
Writeln(Names[I], ': covers the file to EOF')
else
Writeln(Names[I], ': earlier revision, or unexpected ByteRange layout');
end;
finally
Names.Free;
end;
Doc.Close;
finally
Doc.Free;
end;
end;
Ðва капана ÑÑÑеÑÑвÑÐ²Ð°Ñ Ð² Ñози одиÑен пÑоÑеÑ. ÐеÑодÑÑ TPDFlibSignDoc.Open заклÑÑва Ñайла Ñ Ð¸Ð·ÐºÐ»ÑÑиÑелно пÑаво, Ñака Ñе валидаÑоÑÑÑ, койÑо иÑка да изÑиÑли Ñ
еÑа на Ñайла за пÑовеÑка на CMS, ÑÑÑбва да пÑоÑеÑе Ñайла в памеÑÑа пÑеди оÑваÑÑнеÑо Ð¼Ñ Ð·Ð° одиÑ. Ðко обÑÑнеÑе Ñози Ñед, ÑеÑенеÑо Ñе Ñе пÑовали поÑади заклÑÑване, коеÑо Ñами ÑÑе наложили. ÐÑоÑиÑÑ ÐºÐ°Ð¿Ð°Ð½ е ÑиÑ
: ÑÑнкÑиÑÑа GetSignProcessByteRange Ð¾Ñ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¸Ñ API вÑÑÑа Ñип Integer, докаÑо базовиÑе оÑмеÑÑÐ²Ð°Ð½Ð¸Ñ Ñа Int64, коеÑо ознаÑава, Ñе пÑи Ñайл над 2 GB ÑÑойноÑÑÑа Ñе бÑде ÑÑкÑаÑена без пÑедÑпÑеждение. ÐоÑади Ñази пÑиÑина в Ñози пÑÐ¸Ð¼ÐµÑ Ð¾ÑмеÑÑваниÑÑа Ñе извлиÑÐ°Ñ Ð¿Ñез одиÑÐ½Ð¸Ñ ÐºÐ»Ð°Ñ. ТÑÑбва да оÑбележим и една липÑа: оÑновниÑÑ API не ÑÑдÑÑжа обвивка VerifySignature. ÐÑипÑогÑаÑÑкиÑе ÑезÑлÑаÑи Ñе извлиÑÐ°Ñ Ð¾Ñ ÐºÐ»Ð°Ñа TPDFlibSignatureVerifier, койÑо вÑÑÑа vsValid, vsInvalid или vsUnknown, или Ð¾Ñ Ð²ÑнÑен валидаÑоÑ, на когоÑо Ñе довеÑÑваÑе.
ÐÑлгоÑÑоÑно валидиÑане: DSS, VRI и вÑемеви пеÑÐ°Ñ Ð½Ð° докÑменÑа
PAdES-B-LT ÑÑÑеÑÑвÑва, ÑÑй каÑо инÑÑаÑÑÑÑкÑÑÑаÑа за пÑовеÑка на оÑменени ÑеÑÑиÑикаÑи не е веÑна. ETSI EN 319 142-1 §5.4.2.2 ÑпеÑиÑиÑиÑа Document Security Store: ÑеÑник на ниво докÑменÑ, ÑÑдÑÑÐ¶Ð°Ñ ÑеÑÑиÑикаÑи, CRL ÑпиÑÑÑи и OCSP оÑговоÑи, опÑионално индекÑиÑани за вÑеки Ð¿Ð¾Ð´Ð¿Ð¸Ñ ÑÑез VRI запиÑи, ÑвÑÑзани Ñ Ñ
еÑа на /Contents на подпиÑа. ÐÑоÑеÑÑÑ Ð² PDFlibPas ÑÑоÑвеÑÑÑва на Ñози пÑи вÑÐµÐ¼ÐµÐ²Ð¸Ñ Ð¿ÐµÑаÑ. NewPAdESDSSProcessFromFile оÑваÑÑ Ð¿ÑоÑеÑа; AddPAdESDSSCertificate, AddPAdESDSSCRL, и AddPAdESDSSOCSP пÑÐ¸ÐµÐ¼Ð°Ñ DER маÑиви; AddPAdESDSSVRI ÑвÑÑзва данниÑе Ñ ÐºÐ¾Ð½ÐºÑеÑен подпиÑ; EndPAdESDSSProcessToFile запиÑва вÑиÑко каÑо инкÑеменÑална акÑÑализаÑиÑ. ÐÑновнаÑа задаÑа оÑÑава за ваÑ: извлиÑанеÑо на инÑоÑмаÑÐ¸Ñ Ð·Ð° оÑменени ÑеÑÑиÑикаÑи и оÑенкаÑа дали ÑÑ Ðµ доÑÑаÑÑÑно акÑÑална за вгÑаждане е оÑговоÑноÑÑ Ð½Ð° ÑазÑабоÑÑика. ÐиблиоÑекаÑа гаÑанÑиÑа ÑÑвмеÑÑимоÑÑÑа на ÑеÑниÑиÑе, но не може да гаÑанÑиÑа доÑÑовеÑноÑÑÑа на OCSP оÑговоÑиÑе.
ÐÑайнаÑа аÑÑ
ивна ÑоÑка (B-LTA) Ð´Ð¾Ð±Ð°Ð²Ñ Ð²Ñемеви пеÑÐ°Ñ Ð½Ð° докÑменÑа: оÑделно поле за Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ñ Ñип DocTimeStamp вмеÑÑо Sig, ÑÑздадено ÑÑез SetSignProcessDocTimeStamp ÑÑÑ Ð·Ð°Ð¿Ð°Ð·ÐµÐ½Ð° дÑлжина. То не Ð·Ð°Ð¼ÐµÐ½Ñ Ð²ÑÐµÐ¼ÐµÐ²Ð¸Ñ Ð¿ÐµÑÐ°Ñ Ð½Ð° подпиÑа Ð¾Ñ ÑÑÑпка B-T. ÐÑемевиÑÑ Ð¿ÐµÑÐ°Ñ Ð½Ð° подпиÑа доказва ÑÑÑеÑÑвÑванеÑо на конкÑеÑен подпиÑ, докаÑо вÑемевиÑÑ Ð¿ÐµÑÐ°Ñ Ð½Ð° докÑменÑа заÑиÑава ÑÐµÐ»Ð¸Ñ Ñайл (вклÑÑиÑелно DSS данниÑе) и е елеменÑÑÑ, койÑо аÑÑ
ивниÑе ÑиÑÑеми подновÑÐ²Ð°Ñ Ð¿Ñез нÑколко години пÑи оÑÑаÑÑване на алгоÑиÑмиÑе. ÐÑлниÑÑ Ð°ÑÑ
ивен пÑоÑил ÑÑдÑÑжа и дваÑа елеменÑа. Ðа ÑеÑÑи, коиÑо не поддÑÑÐ¶Ð°Ñ Ñези ÑÑÑÑкÑÑÑи, меÑодÑÑ TPDFlibSignDoc.EnsurePAdESExtensions запиÑва ÑазÑиÑениеÑо ESIC в каÑалога на докÑменÑа, Ñказвайки използванеÑо на ETSI ÑпеÑиÑикаÑии.
Ðдна ÑеакÑÐ¸Ñ ÑÑÑбва да бÑде пÑедоÑвÑаÑена, ÑÑй каÑо изглежда каÑо ÑоÑÑÑеÑен пÑоблем, но не е: ÑеÑеÑÑÑ ÑеÑÑо показва ÑÑаÑÑÑ "неизвеÑÑна валидноÑÑ" на Ñайл Ñ Ð¿Ñавилна PAdES ÑÑÑÑкÑÑÑа. ÐовеÑиеÑо и ÑÑÑÑкÑÑÑаÑа Ñа ÑазлиÑни неÑа. ЧеÑеÑÑÑ Ð¿ÑоÑÑо не може да ÑвÑÑже ÑеÑÑиÑикаÑа Ñ Ð´Ð¾Ð²ÐµÑен коÑен на ÑÑоÑвеÑнаÑа маÑина, коеÑо е ноÑмално пÑи ÑаÑÑни CA и ÑеÑÑови ÑеÑÑиÑикаÑи, вÑпÑеки Ñе пÑовеÑкаÑа на ByteRange и CMS ÑÑвпадаÑ. РеÑениеÑо е пÑавилно ÑазпÑоÑÑÑанение на коÑÐµÐ½Ð½Ð¸Ñ ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð¸Ð»Ð¸ пÑовеÑка ÑпÑÑмо ÑпиÑÑÑиÑе Ñ Ð´Ð¾Ð²ÐµÑени доÑÑавÑиÑи на ÐС (EU trusted lists), ако ÑелÑа е пÑидобиване на квалиÑиÑиÑан eIDAS ÑÑаÑÑÑ.
Ðа одиÑна гледна ÑоÑка (избÑоÑване на полеÑа за подпиÑи, ByteRange ÑÑÑÑкÑÑÑи и DocMDP нива в големи обеми), вижÑе ÑÑаÑиÑÑа за ÑабоÑна ÑÑеда за ÑÑвмеÑÑимоÑÑ Ð¸ подпиÑване. ÐодпиÑаниÑе докÑменÑи, коиÑо ÑÑÑбва да изпÑлнÑÐ²Ð°Ñ Ð¸ полиÑики за аÑÑ Ð¸Ð²Ð¸Ñане, ÑÐ»ÐµÐ´Ð²Ð°Ñ Ð¿ÑоÑеÑа, опиÑан в PDF/A и PDF/UA пÑовеÑка в Delphi. ÐÑлнаÑа докÑменÑаÑÐ¸Ñ Ð·Ð° API и веÑÑии за оÑенка Ñа налиÑни на пÑодÑкÑоваÑа ÑÑÑаниÑа на PDFlibPas за Delphi.