PDFium Delphi Component Docs

FPdfAsn1 واحد

واحد: FPdfAsn1
داده‌های Distinguished Encoding Rules در ASN.1 را با مصرف منبع کران‌دار کدگذاری، پیمایش، رمزگشایی و اعتبارسنجی می‌کند

Public Types

TypeDescription
TAsnTagثابت‌های تگ Universal (یعنی BOOLEAN، INTEGER، OCTET STRING، OID، SEQUENCE، SET و شکل‌های زمان و رشته) که ساخت و اعتبارسنجی شناسه از آن‌ها استفاده می‌کند
TAsnClassکلاس شناسه: asnClassUniversal، asnClassApplication، asnClassContextSpecific یا asnClassPrivate
TAsnIdentifierکلاس شناسه، پرچم constructed و شمارهٔ تگ ۶۴ بیتی، از جمله شکل high-tag-number
TDerTlvTLV تجزیه‌شده با Offset، HeaderLength، ContentOffset، ContentLength، NextOffset و Identifier، بدون رونوشت از بافر منبع
TDerWriterبافر خروجی DER قابل استفادهٔ مجدد و کدگذار نوع‌دار
TDerReaderخوانندهٔ کران‌دار با عملیات‌های peek، advance، skip، expected-tag، پنجرهٔ فرزند، slice و رمزگشایی نوع‌دار
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

Writer APIs

APIDescription
Clear، IsEmpty، Count، Capacity، Bytes، Finishبازنشانی یا بازرسی دادهٔ بافرشده، رونوشت یک تصویر لحظه‌ای، یا تحویل آرایهٔ کامل‌شده و بازنشانی writer
Reserve، Append، AppendMany، AppendByteیک‌باره بزرگ‌شدن و افزودن آرایه‌ها، بافرهای متعلق به فراخواننده، چندین آرایه یا یک بایت با بررسی‌های سرریز
Wrap، WrapIdentifier، WrapConstructedپیچیدن محتوا با یک اکتت شناسهٔ خام، هر کلاس شناسه و شمارهٔ تگ ۶۴ بیتی، یا یک شناسهٔ constructed
ContextSpecific، ApplicationSpecific، PrivateSpecificکدگذاری شمارهٔ تگ کم یا بالا بدون بریدن شناسه
Sequence، SequenceOf، SetOf، SetOfSortedترکیب مقادیر کدگذاری‌شده به‌صورت ظرف SEQUENCE یا SET؛ SetOfSorted مقادیر را بر اساس بایت‌های کدگذاری‌شده مرتب می‌کند
BooleanOf، IntegerOf، UnsignedIntegerOf، IntegerBytes، EnumeratedOfکدگذاری BOOLEAN، INTEGER علامت‌دار یا بی‌علامت، محتوای INTEGER دلخواهِ اعتبارسنجی‌شده و مقادیر ENUMERATED
OctetString، OctetStringOf، BitString، Null، OIDکدگذاری مقادیر باینری، bit-string، NULL و شناسهٔ شیء به‌صورت TLVهای مستقل
PrintableString، Ia5String، Utf8Stringکدگذاری شکل‌های رشتهٔ نویسه‌ای پشتیبانی‌شدهٔ ASN.1
UTCTime، GeneralizedTime، UTCTimeOf، GeneralizedTimeOf، TimeOfکدگذاری متن زمان کانونیک یا مقادیر TDateTime بر پایهٔ UTC، که در آن TimeOf نوع زمان DER درست را برمی‌گزیند
AlgId، AlgIdWithParamsساخت یک SEQUENCE از نوع AlgorithmIdentifier با پارامترهای NULL یا صریح

Reader APIs

APIDescription
Initialize، AtEnd، EffectiveLimit، Remainingمقداردهی اولیهٔ خواننده و بازرسی پنجرهٔ کران‌دار و شمار بایت باقی‌مانده
TryReadTlvAt، PeekTlvتجزیهٔ شماره‌های تگ کم یا بالا و طول‌های معین حداقلی بدون تغییر Position
ReadNextTlv، SkipTlvپیشروی تنها پس از در دست بودن یک TLV کامل و معتبر
TryReadExpectedپیشروی تنها وقتی کلاس، شکل constructed و شمارهٔ تگ همه مطابقت دارند
EnterConstructedساخت یک پنجرهٔ خوانندهٔ فرزند روی همان آرایهٔ منبع، بدون رونوشت محتوا
ContentBytes، EncodedBytesرونوشت یک برشِ محتوای اعتبارسنجی‌شده یا یک TLV کامل وقتی مالکیت لازم است
TryReadBoolean، TryReadUnsignedInteger، TryReadBitStringرمزگشایی مقادیر اولیهٔ کانونیک با بررسی بازه و بیت‌های بلااستفاده
TryReadString، TryReadTime، TryReadNullرمزگشایی محتوای UTF8String، PrintableString، IA5String، زمان DER یا NULLِ اعتبارسنجی‌شده
ReadTlv، TryReadOID، ReadOID، TryReadInteger، ReadIntegerفراهم‌کردن دسترسی سازگاری به آفست‌های خام TLV به‌علاوهٔ رمزگشایی شناسهٔ شیء و عدد صحیح علامت‌دار

Validation

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

ValidateDer کمینگی شناسه و طول، کران‌های بافر، شکل‌های اولیهٔ universal، BOOLEAN، INTEGER، ENUMERATED، BIT STRING، NULL، OBJECT IDENTIFIER، رشته‌های پشتیبانی‌شده و مقادیر زمان کانونیک را بررسی می‌کند

کران‌های پیش‌فرض حداکثر عمق ۶۴، ۱۰۰۰۰۰ گره، ۶۴ MiB به‌ازای هر مقدار محتوا و ۳۲ خطای گزارش‌شده را مجاز می‌دارند، در حالی که وجود یک TLV ریشه را الزامی می‌کنند

ValidateSetOrder به‌طور پیش‌فرض غیرفعال است، چون DER بدون شِما نمی‌تواند هر SET را از SET OF بازشناسد؛ برای ظرف‌های شناخته‌شدهٔ SET OF مانند مجموعه‌های attribute در CMS آن را فعال کنید

TDerValidationOptions.Default پیش‌فرض‌های کران‌دار را فراهم می‌کند و TDerValidationResult.ErrorCount و FirstError مدیریت تشخیصی را ساده می‌کنند

Public helper functions

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;

FunctionDescription
AsnIdentifierاز کلاس، شمارهٔ تگ و پرچم constructed یک TAsnIdentifier می‌سازد و برای راندن TDerReader.TryReadExpected به کار می‌رود
EncodeIdentifierیک TAsnIdentifier را به بایت‌های شناسهٔ DER آن کدگذاری می‌کند، از جمله شکل high-tag-number
ConcatBytes، Concat3، Concat4، ConcatManyدو، سه، چهار یا یک آرایهٔ پویا از TBytes را در یک تخصیص به هم می‌چسبانند؛ سازندهٔ CMS از آن‌ها به‌طور گسترده استفاده می‌کند
EncodeOIDContentرشتهٔ OID نقطه‌دهدهی را به بایت‌های محتوایش کدگذاری می‌کند، بدون تگ و طول، تا فراخواننده بتواند یک OID را بازرسی یا دوباره بپیچد
DerValidationErrorKindNameنام نمایشی یک TDerValidationErrorKind را برای اهداف تشخیصی برمی‌گرداند

Example

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;

Remarks