PDFium Delphi Component Docs

FPdfAsn1 الوحدة

الوحدة: FPdfAsn1
يرمِّز بيانات قواعد الترميز المميَّز (DER) في ASN.1 وينقّل فيها ويفك ترميزها ويتحقق منها مع موارد استخدام محدودة

الأنواع العامة

النوعالوصف
TAsnTagثوابت الوسوم العامة (BOOLEAN و INTEGER و OCTET STRING و OID و SEQUENCE و SET وصور الوقت والسلاسل) المستخدمة في بناء المعرفات والتحقق منها
TAsnClassصنف المعرف: asnClassUniversal أو asnClassApplication أو asnClassContextSpecific أو asnClassPrivate
TAsnIdentifierصنف المعرف، وعلامة البناء، ورقم وسم بعرض 64 بت، بما في ذلك صيغة رقم الوسم العالي
TDerTlvTLV مُحلَّل يحمل Offset و HeaderLength و ContentOffset و ContentLength و NextOffset و Identifier دون نسخ المخزن المصدر
TDerWriterمخزن إخراج DER قابل لإعادة الاستخدام مع مرمِّز مُنمَّط
TDerReaderقارئ محدود بعمليات إلقاء نظرة، وتقديم، وتخطٍ، ووسم متوقع، ونافذة ابنة، وشرائح، وفك ترميز مُنمَّط
TDerByteArraysمصفوفة ديناميكية من TBytes تستخدمها ConcatMany ومساعدات المخازن المتعددة الأخرى
TDerValidationErrorKindفئات أخطاء التحقق: dvekMalformedTlv و dvekTrailingData، وحدود العمق والعقد والمحتوى (dvekDepthLimit و dvekNodeLimit و dvekContentLimit)، و dvekUniversalForm، وإخفاقات التمثيل القانوني لكل نوع (dvekBoolean و dvekInteger و dvekBitString و dvekNull و dvekOid و dvekString و dvekTime)، و dvekSetOrder
TDerValidationErrorسجل خطأ واعٍ بالإزاحة و Depth يحمل Kind ونص رسالة مقروءًا للبشر
TDerValidationErrorsمصفوفة ديناميكية من TDerValidationError تُعاد داخل TDerValidationResult
TDerValidationOptionsحدود في MaxDepth و MaxNodes و MaxContentLength و MaxErrors، وعلامة RequireSingleRoot، و ValidateSetOrder الاختيارية، ودالة الفئة Default
TDerValidationResultحالة التحقق مع IsValid و NodeCount و MaximumDepth و Errors الواعية بالإزاحة، إضافة إلى المساعدين ErrorCount و FirstError

واجهات الكاتب

الواجهةالوصف
Clear, IsEmpty, Count, Capacity, Bytes, Finishإعادة ضبط البيانات المخزَّنة أو فحصها، أو نسخ لقطة، أو نقل المصفوفة المكتملة وإعادة ضبط الكاتب
Reserve, Append, AppendMany, AppendByteتنمي السعة مرة واحدة وتلحق مصفوفات، أو مخازن يملكها المستدعي، أو عدة مصفوفات، أو بايتًا واحدًا مع فحوص التجاوز
Wrap, WrapIdentifier, WrapConstructedتغلف المحتوى بثمانية معرف خام، أو بأي صنف معرف ورقم وسم بعرض 64 بت، أو بمعرف مُنشَّأ
ContextSpecific, ApplicationSpecific, PrivateSpecificترمِّز أرقام وسوم منخفضة أو عالية دون بتر المعرف
Sequence, SequenceOf, SetOf, SetOfSortedتؤلف القيم المرمَّزة كحاويات SEQUENCE أو SET؛ ويرتب SetOfSorted القيم حسب بايتاتها المرمَّزة
BooleanOf, IntegerOf, UnsignedIntegerOf, IntegerBytes, EnumeratedOfترمِّز قيم BOOLEAN و INTEGER بإشارة أو بدونها، ومحتوى INTEGER بأي طول بعد التحقق منه، وقيم ENUMERATED
OctetString, OctetStringOf, BitString, Null, OIDترمِّز قيم البيانات الثنائية وسلاسل البت و NULL ومعرفات الكائنات كـ TLVs مستقلة
PrintableString, Ia5String, Utf8Stringترمِّز صور سلاسل المحارف المدعومة في ASN.1
UTCTime, GeneralizedTime, UTCTimeOf, GeneralizedTimeOf, TimeOfترمِّز نصوص الوقت بصيغتها القانونية أو قيم TDateTime بتوقيت UTC، وينتقي TimeOf نوع وقت DER الصحيح
AlgId, AlgIdWithParamsتبني SEQUENCE من نوع AlgorithmIdentifier مع NULL أو مع معاملات صريحة

واجهات القارئ

الواجهةالوصف
Initialize, AtEnd, EffectiveLimit, Remainingتهيئ قارئًا وتفحص نافذته المحدودة وعدد البايتات المتبقية
TryReadTlvAt, PeekTlvتحلل أرقام وسوم منخفضة أو عالية وأطوالًا محددة دنيا دون تغيير Position
ReadNextTlv, SkipTlvتتقدمان فقط بعد توفر TLV كامل صالح
TryReadExpectedيتقدم فقط عندما تتطابق قيم الصنف والصيغة المُنشَّأة ورقم الوسم جميعها
EnterConstructedينشئ نافذة قارئ ابنة فوق مصفوفة المصدر نفسها دون نسخ المحتوى
ContentBytes, EncodedBytesتنسخان شريحة محتوى مُتحقق منه أو TLV كاملة عندما يلزم امتلاك البيانات
TryReadBoolean, TryReadUnsignedInteger, TryReadBitStringتفك ترميز القيم الأولية بصيغتها القانونية مع فحوص المدى والبتات غير المستخدمة
TryReadString, TryReadTime, TryReadNullتفك ترميز محتوى UTF8String أو PrintableString أو IA5String أو وقت DER أو NULL بعد التحقق منه
ReadTlv, TryReadOID, ReadOID, TryReadInteger, ReadIntegerتوفر وصول توافقية إلى إزاحات TLV الخام إضافة إلى فك ترميز معرفات الكائنات والأعداد الصحيحة بإشارة

التحقق

function ValidateDer(const Data: TBytes): TDerValidationResult; overload;
function ValidateDer(const Data: TBytes; const Options: TDerValidationOptions): TDerValidationResult; overload;

يفحص ValidateDer أقلية المعرف والطول، وحدود المخزن، والصور الأولية العامة، و BOOLEAN و INTEGER و ENUMERATED و BIT STRING و NULL و OBJECT IDENTIFIER، والسلاسل المدعومة، وقيم الوقت القانونية

تسمح الحدود الافتراضية بعمق أقصاه 64 و100000 عقدة و64 MiB لكل قيمة محتوى و32 خطأً مُبلَّغًا عنه، مع اشتراط جذر TLV واحد

تكون ValidateSetOrder معطلة افتراضيًا لأن DER الخالي من المخطط لا يستطيع تمييز كل SET عن SET OF؛ فعِّلها لحاويات SET OF المعروفة مثل تجميعات سمات CMS

يزوِّد TDerValidationOptions.Default بالقيم الافتراضية المحدودة، بينما يبسط TDerValidationResult.ErrorCount و FirstError معالجة التشخيص

الدوال المساعدة العامة

function AsnIdentifier(TagClass: TAsnClass; TagNumber: UInt64; Constructed: Boolean = False): TAsnIdentifier;
function EncodeIdentifier(const Identifier: TAsnIdentifier): TBytes;
function ConcatBytes(const A, B: TBytes): TBytes;
function Concat3(const A, B, C: TBytes): TBytes;
function Concat4(const A, B, C, D: TBytes): TBytes;
function ConcatMany(const Values: TDerByteArrays): TBytes;
function EncodeOIDContent(const Dotted: AnsiString): TBytes;
function DerValidationErrorKindName(Kind: TDerValidationErrorKind): string;

الدالةالوصف
AsnIdentifierيبني TAsnIdentifier من الصنف ورقم الوسم وعلامة البناء، ويُستخدم لقيادة TDerReader.TryReadExpected
EncodeIdentifierيرمِّز TAsnIdentifier إلى بايتات معرفه بصيغة DER، بما في ذلك صيغة رقم الوسم العالي
ConcatBytes, Concat3, Concat4, ConcatManyتربط اثنين أو ثلاثة أو أربعة أو مصفوفة ديناميكية من TBytes في حجز واحد؛ وتُستخدم على نطاق واسع في باني CMS
EncodeOIDContentيرمِّز سلسلة OID عشرية منقوطة إلى بايتات محتواها دون الوسم والطول، فيستطيع المستدعون فحص OID أو إعادة تغليفه
DerValidationErrorKindNameيعيد الاسم المعروض لقيمة TDerValidationErrorKind لأغراض التشخيص

مثال

uses FPdfAsn1;

var
  Child: TDerReader;
  Data: TBytes;
  Reader: TDerReader;
  Tlv: TDerTlv;
  Validation: TDerValidationResult;
  Writer: TDerWriter;
begin
  Writer := TDerWriter.Create;
  try
    Data := Writer.Sequence(Writer.UnsignedIntegerOf(42));
  finally
    Writer.Free;
  end;

  Validation := ValidateDer(Data);
  if not Validation.IsValid then
    raise EConvertError.Create(Validation.Errors[0].MessageText);

  Reader.Initialize(Data);
  if Reader.TryReadExpected(AsnIdentifier(asnClassUniversal, 16, True), Tlv) then
    Reader.EnterConstructed(Tlv, Child);
end;

ملاحظات