TCmsSignerIdKind = (sidIssuerAndSerial, sidSubjectKeyIdentifier);
TCmsSignerId = record
Kind: TCmsSignerIdKind;
IssuerDer: TBytes;
SerialDer: TBytes;
SubjectKeyId: TBytes;
end;
ICmsSigner = interface
function GetDigestAlgorithmOid: AnsiString;
function GetSignatureAlgorithmOid: AnsiString;
function GetSignatureAlgorithmParams: TBytes;
function GetSignerId: TCmsSignerId;
function SignSignedAttrsDigest(const Digest: TSHA256Digest): TBytes;
end;
TCmsBuildOptions = record
SigningTimeUtc: TDateTime;
CommitmentTypeOid: AnsiString;
SignaturePolicyOid: AnsiString;
SignaturePolicyHash: TBytes;
SignaturePolicyUri: AnsiString;
SignaturePolicyDocument: TBytes;
class function Default: TCmsBuildOptions; static;
end;
function CertKeyAlgorithmOid(const CertDer: TBytes): AnsiString;
function ExtractIssuerAndSerial(const CertDer: TBytes;
out IssuerTlv, SerialTlv: TBytes): Boolean;
function EcDsaP1363ToDer(const Raw: TBytes): TBytes;
function VerifyCmsSignaturePolicyDocument(const Options: TCmsBuildOptions;
const PolicyDocument: TBytes; out ErrorText: string): Boolean;
function BuildSignedData(const DetachedDigest: TSHA256Digest;
const Signer: ICmsSigner; const SignerCertDer: TBytes;
const ChainCertDer: array of TBytes;
const Options: TCmsBuildOptions): TBytes;
function ExtractSignatureValue(const CmsDer: TBytes;
out SignatureValueOctets: TBytes): Boolean;
procedure AddSignatureTimestampToCms(var CmsDer: TBytes;
const TimestampTokenDer: TBytes);
FPdfCms هو باني CMS منخفض المستوى الذي تستهلكه داخليًا مسارات توقيع PAdES. وهو يمكّن المستخدم المتقدم من تجميع قيمة CMS SignedData من ملخص رسالة SHA-256 للسمات الموقَّعة، وتجريد موقِّع، وشهادة الموقِّع، وسلسلة شهادات اختيارية
واجهة ICmsSigner هي عقد خلفية التعمية: يزوِّد المستدعي معرفات OID لخوارزمية التجزئة والتوقيع، ومعرِّف الموقِّع، وينفذ عملية المفتاح الخاص الفعلية على ملخص السمات الموقَّعة. وهذا يفصل ترميز CMS عن أي مزود تعمية بعينه
يستطيع TCmsBuildOptions إضافة وقت التوقيع ونوع الالتزام ومعرِّف سياسة توقيع صريح مع تجزئة سياسة SHA-256 و URI ووثيقة سياسة في الذاكرة اختيارية
يسحب ExtractSignatureValue ثمانيات التوقيع الخام من قيمة CMS مكتملة لتُرسل إلى سلطة الطابع الزمني؛ ثم يضمّن AddSignatureTimestampToCms رمز الطابع الزمني المُعاد كسمة غير موقَّعة، منتِجًا الصيغة المطابقة لـ B-T/B-LTA
| الطريقة | الوصف |
|---|---|
GetDigestAlgorithmOid | يعيد معرف OID لخوارزمية التجزئة المستخدمة على السمات الموقَّعة (مثلًا 2.16.840.1.101.3.4.2.1 لـ SHA-256) |
GetSignatureAlgorithmOid | يعيد معرف OID لخوارزمية التوقيع المطبقة على الملخص |
GetSignatureAlgorithmParams | يعيد معاملات الخوارزمية (غالبًا فارغة في ECDSA؛ وتحمل كتلة معاملات RSA-PSS في PSS) |
GetSignerId | يعيد TCmsSignerId الذي يعرِّف الموقِّع بالمُصدِر/الرقم التسلسلي أو بمعرِّف مفتاح صاحب الشهادة |
SignSignedAttrsDigest | ينفذ توقيع المفتاح الخاص على الملخص المُزوَّد ويعيد ثمانيات التوقيع |
| الروتين | الوصف |
|---|---|
CertKeyAlgorithmOid | يقرأ معرف OID لخوارزمية SubjectPublicKeyInfo من الشهادة، وهو ما يفصل بين خوارزمية توقيع RSA وأخرى ECDSA؛ وكل خلفية توقيع تحتاج إليه، لذا فهو يسكن هنا بدلًا من أن يكون داخل إحداها |
ExtractIssuerAndSerial | يستخرج TLVs الخام للمُصدِر و serialNumber اللذين يحملهما SignerIdentifier داخل IssuerTlv و SerialTlv |
EcDsaP1363ToDer | يغلّف توقيع ECDSA خام بصيغة P1363 r||s داخل SEQUENCE بترميز DER من عددين INTEGER كما يتوقع CMS؛ والرموز وواجهات تعمية المنصات تعيد الصيغة الخام |
VerifyCmsSignaturePolicyDocument | يشترط SignaturePolicyOid غير فارغ و SignaturePolicyHash بطول 32 بايتًا، ثم يتحقق من وثيقة السياسة المُزوَّدة بـ SHA-256 ويعيد نصًا تشخيصيًا عند الفشل |
BuildSignedData | يبني CMS ContentInfo منفصلًا مكتملًا وفق RFC 5652 مع CAdES SignerInfo واحد، وشهادة الموقِّع، وسلسلة اختيارية، والسمات الموقَّعة المُعدَّة |
ExtractSignatureValue | يستخرج ثمانيات توقيع SignerInfo الخام المستخدمة كمدخل بصمة رسالة طابع RFC 3161 الزمني |
AddSignatureTimestampToCms | يضيف TimeStampToken كاملًا وفق RFC 3161 كسمة signature-time-stamp غير الموقَّعة ويعيد ترميز الأطوال المحيطة |
| النوع | الوصف |
|---|---|
TCmsSignerIdKind | ينتقي sidIssuerAndSerial اسم المُصدِر مع TLV الرقم التسلسلي وينتقي sidSubjectKeyIdentifier ثمانيات معرِّف مفتاح صاحب الشهادة الخام |
TCmsSignerId | تحمل Kind و IssuerDer و SerialDer و SubjectKeyId صيغة معرِّف SignerInfo المنتقاة |
TCmsBuildOptions | تُعدّ SigningTimeUtc و CommitmentTypeOid و SignaturePolicyOid و SignaturePolicyHash و SignaturePolicyUri و SignaturePolicyDocument السمات الموقَّعة؛ ويمسح Default كل قيمة اختيارية |
TSHA256DigestBuildSignedData سلسلة الشهادات كمصفوفة مفتوحة من شهادات مرمَّزة بـ DER، ولا يُشترط وضع الموقِّع أولًا؛ فالترتيب يتبع CMS EncapsulatedCertificateSet