PDFium Delphi Component Docs

модул FPdfAsn1

Модул: FPdfAsn1
Кодира, навигира, декодира и валидира ASN.1 Distinguished Encoding Rules данни с ограничено използване на ресурси

Публични типове

ТипОписание
TAsnTagУниверсални tag константи (BOOLEAN, INTEGER, OCTET STRING, OID, SEQUENCE, SET, времеви и низови форми), използвани от изграждането и валидирането на идентификатори
TAsnClassКлас на идентификатора: asnClassUniversal, asnClassApplication, asnClassContextSpecific или asnClassPrivate
TAsnIdentifierКлас на идентификатора, флаг constructed и 64-битов tag номер, включително форма с high-tag-number
TDerTlvАнализиран TLV с 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 и class функцията Default
TDerValidationResultСтатус на валидирането с IsValid, NodeCount, MaximumDepth, осъзнати за отместване Errors, плюс помощните ErrorCount и FirstError

API за запис

APIОписание
Clear, IsEmpty, Count, Capacity, Bytes, FinishНулира или инспектира буферираните данни, копира снимка или предава завършения масив и нулира писача
Reserve, Append, AppendMany, AppendByteУголемява еднократно и добавя масиви, буфери, притежавани от извикващия, няколко масива или един байт с проверки за препълване
Wrap, WrapIdentifier, WrapConstructedОбвива съдържание със суров идентификационен октет, произволен клас идентификатор и 64-битов tag номер или constructed идентификатор
ContextSpecific, ApplicationSpecific, PrivateSpecificКодира ниски или високи tag номера, без да съкращава идентификатора
Sequence, SequenceOf, SetOf, SetOfSortedКомбинира кодирани стойности в SEQUENCE или SET контейнери; SetOfSorted сортира стойностите по кодираните им байтове
BooleanOf, IntegerOf, UnsignedIntegerOf, IntegerBytes, EnumeratedOfКодира BOOLEAN, INTEGER със знак или без знак, валидирано произволно INTEGER съдържание и стойности ENUMERATED
OctetString, OctetStringOf, BitString, Null, OIDКодира бинарни, bit-string, NULL и object identifier стойности като самостоятелни TLV
PrintableString, Ia5String, Utf8StringКодира поддържаните ASN.1 низови форми
UTCTime, GeneralizedTime, UTCTimeOf, GeneralizedTimeOf, TimeOfКодира каноничен времеви текст или UTC стойности TDateTime, като TimeOf избира правилния DER времеви тип
AlgId, AlgIdWithParamsИзгражда SEQUENCE от тип AlgorithmIdentifier с NULL или изрични параметри

API за четене

APIОписание
Initialize, AtEnd, EffectiveLimit, RemainingИнициализира четец и инспектира ограничения му прозорец и оставащ брой байтове
TryReadTlvAt, PeekTlvАнализира ниски или високи tag номера и минимални definite дължини, без да променя Position
ReadNextTlv, SkipTlvНапредва само след като е наличен пълен валиден TLV
TryReadExpectedНапредва само когато клас, constructed форма и tag номер съвпадат едновременно
EnterConstructedСъздава детски прозорец-четец върху същия изходен масив, без да копира съдържание
ContentBytes, EncodedBytesКопира валидирано съдържание или пълен TLV отрязък, когато се изисква притежание
TryReadBoolean, TryReadUnsignedInteger, TryReadBitStringДекодира канонични примитивни стойности с проверки за диапазон и неизползвани битове
TryReadString, TryReadTime, TryReadNullДекодира валидирани UTF8String, PrintableString, IA5String, DER време или NULL съдържание
ReadTlv, TryReadOID, ReadOID, TryReadInteger, ReadIntegerОсигуряват съвместим достъп до сурови TLV отмествания плюс декодиране на object identifier и integer със знак

Валидиране

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;

FunctionОписание
AsnIdentifierИзгражда TAsnIdentifier от клас, tag номер и флаг constructed; използва се за задвижване на TDerReader.TryReadExpected
EncodeIdentifierКодира TAsnIdentifier в DER байтовете на идентификатора, включително форма с high-tag-number
ConcatBytes, Concat3, Concat4, ConcatManyСлепват два, три, четири или динамичен масив от TBytes в едно заделяне; използват се масово от CMS builder
EncodeOIDContentКодира OID низ с точки в съдържателните му байтове, без tag и дължина, така че извикващият може да инспектира или преобвие 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;

Забележки