PDFium Delphi Component Docs

FPdfAsn1 модуль

Unit: FPdfAsn1
Кодує, навігує, декодує та перевіряє дані ASN.1 Distinguished Encoding Rules з обмеженим використанням ресурсів

Public Types

TypeDescription
TAsnTagКонстанти універсальних тегів (BOOLEAN, INTEGER, OCTET STRING, OID, SEQUENCE, SET, форми часу та рядків), які використовуються побудовою ідентифікаторів і перевіркою
TAsnClassКлас ідентифікатора: asnClassUniversal, asnClassApplication, asnClassContextSpecific або asnClassPrivate
TAsnIdentifierКлас ідентифікатора, прапорець constructed і номер тега 64 біти, включно з формою high-tag-number
TDerTlvРозібраний TLV з Offset, HeaderLength, ContentOffset, ContentLength, NextOffset і Identifier без копіювання вихідного буфера
TDerWriterБагаторазовий вихідний буфер DER і типізований кодувальник
TDerReaderОбмежений читач із операціями peek, advance, skip, очікуваного тега, дочірнього вікна, зрізу та типізованого декодування
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Скинути чи оглянути буферизовані дані, скопіювати знімок або передати завершений масив і скинути записувач
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 та ідентифікатори об'єктів як окремі TLV
PrintableString, Ia5String, Utf8StringКодує підтримувані форми рядків символів ASN.1
UTCTime, GeneralizedTime, UTCTimeOf, GeneralizedTimeOf, TimeOfКодує канонічний текст часу або значення UTC TDateTime, де TimeOf обирає правильний тип часу DER
AlgId, AlgIdWithParamsБудує SEQUENCE AlgorithmIdentifier з NULL або явними параметрами

Reader APIs

APIDescription
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 плюс декодування ідентифікатора об'єкта і знакового цілого

Validation

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 спрощують обробку діагностики

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Будує TAsnIdentifier з класу, номера тега і прапорця constructed, використовується для керування 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