PDFium Component Docs

FPdfAsn1 Moduł

Unit: FPdfAsn1
Koduje, nawiguje, dekoduje i waliduje dane ASN.1 Distinguished Encoding Rules z ograniczonym użyciem zasobów

Public Types

TypeDescription
TAsnTagUniwersalne stałe tagów (BOOLEAN, INTEGER, OCTET STRING, OID, SEQUENCE, SET, formy czasowe i łańcuchowe) używane przy konstruowaniu i walidacji identyfikatorów
TAsnClassKlasa identyfikatora: asnClassUniversal, asnClassApplication, asnClassContextSpecific lub asnClassPrivate
TAsnIdentifierKlasa identyfikatora, flaga skonstruowania i 64-bitowy numer tagu, łącznie z formą high-tag-number
TDerTlvSparsowane TLV z Offset, HeaderLength, ContentOffset, ContentLength, NextOffset i Identifier bez kopiowania bufora źródłowego
TDerWriterWielokrotnego użytku bufor wyjściowy DER i typowany koder
TDerReaderOgraniczony czytnik z operacjami podejrzenia, przesunięcia, pominięcia, oczekiwanego tagu, okna potomnego, wycinka i typowanego dekodowania
TDerByteArraysTablica dynamiczna TBytes używana przez ConcatMany i inne pomocniki wielobuforowe
TDerValidationErrorKindKategorie błędów walidacji: dvekMalformedTlv, dvekTrailingData, limity głębokości, węzłów i treści (dvekDepthLimit, dvekNodeLimit, dvekContentLimit), dvekUniversalForm, per typ canonical niepowodzenia (dvekBoolean, dvekInteger, dvekBitString, dvekNull, dvekOid, dvekString, dvekTime) oraz dvekSetOrder
TDerValidationErrorRekord błędu świadomy offsetu i Depth z Kind i komunikatem czytelnym dla człowieka
TDerValidationErrorsTablica dynamiczna TDerValidationError zwracana wewnątrz TDerValidationResult
TDerValidationOptionsLimity w MaxDepth, MaxNodes, MaxContentLength, MaxErrors, flaga RequireSingleRoot, opcjonalne ValidateSetOrder oraz funkcja klasowa Default
TDerValidationResultStatus walidacji z IsValid, NodeCount, MaximumDepth, świadomymi offsetu Errors, a także pomocnikami ErrorCount i FirstError

Writer APIs

APIDescription
Clear, IsEmpty, Count, Capacity, Bytes, FinishResetują lub inspekcjonują dane buforowane, kopiują migawkę albo przekazują ukończoną tablicę i resetują pisarza
Reserve, Append, AppendMany, AppendByteRosną raz i dopisują tablice, bufory należące do wywołującego, wiele tablic lub jeden bajt z kontrolą przepełnienia
Wrap, WrapIdentifier, WrapConstructedOwijają treść surowym oktetem identyfikatora, dowolną klasą identyfikatora i 64-bitowym numerem tagu albo identyfikatorem skonstruowanym
ContextSpecific, ApplicationSpecific, PrivateSpecificKodują niskie lub wysokie numery tagów bez obcinania identyfikatora
Sequence, SequenceOf, SetOf, SetOfSortedKomponują zakodowane wartości w kontenery SEQUENCE lub SET; SetOfSorted sortuje wartości po zakodowanych bajtach
BooleanOf, IntegerOf, UnsignedIntegerOf, IntegerBytes, EnumeratedOfKodują BOOLEAN, INTEGER ze znakiem lub bez, walidowaną dowolną treść INTEGER oraz wartości ENUMERATED
OctetString, OctetStringOf, BitString, Null, OIDKodują wartości binarne, bit-string, NULL i identyfikatory obiektów jako samodzielne TLV
PrintableString, Ia5String, Utf8StringKodują obsługiwane formy łańcuchów znaków ASN.1
UTCTime, GeneralizedTime, UTCTimeOf, GeneralizedTimeOf, TimeOfKodują kanoniczny tekst czasu lub wartości UTC TDateTime, przy czym TimeOf wybiera właściwy typ czasu DER
AlgId, AlgIdWithParamsBudują SEQUENCE AlgorithmIdentifier z parametrami NULL lub jawnymi

Reader APIs

APIDescription
Initialize, AtEnd, EffectiveLimit, RemainingInicjalizują czytnik i inspekcjonują jego ograniczone okno oraz liczbę pozostałych bajtów
TryReadTlvAt, PeekTlvParsują niskie lub wysokie numery tagów i minimalne długości określone bez zmiany Position
ReadNextTlv, SkipTlvPrzesuwają się dopiero, gdy dostępne jest kompletne poprawne TLV
TryReadExpectedPrzesuwa się tylko wtedy, gdy klasa, forma skonstruowana i numer tagu wszystkie pasują
EnterConstructedTworzy potomne okno czytnika nad tą samą tablicą źródłową bez kopiowania treści
ContentBytes, EncodedBytesKopiują walidowany wycinek treści lub całego TLV, gdy wymagana jest własność danych
TryReadBoolean, TryReadUnsignedInteger, TryReadBitStringDekodują kanoniczne wartości prymitywne z kontrolą zakresu i nieużywanych bitów
TryReadString, TryReadTime, TryReadNullDekodują walidowaną treść UTF8String, PrintableString, IA5String, czasu DER lub NULL
ReadTlv, TryReadOID, ReadOID, TryReadInteger, ReadIntegerZapewniają kompatybilny dostęp do surowych offsetów TLV oraz dekodowanie identyfikatorów obiektów i liczb całkowitych ze znakiem

Validation

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

ValidateDer sprawdza minimalność identyfikatorów i długości, granice bufora, uniwersalne formy prymitywów, BOOLEAN, INTEGER, ENUMERATED, BIT STRING, NULL, OBJECT IDENTIFIER, obsługiwane łańcuchy oraz kanoniczne wartości czasu

Domyślne limity pozwalają na maksymalną głębokość 64, 100000 węzłów, 64 MiB na wartość treści i 32 raportowane błędy, wymagając jednego głównego TLV

ValidateSetOrder jest domyślnie wyłączone, bo DER bez schematu nie odróżni każdego SET od SET OF; włącz je dla znanych kontenerów SET OF, takich jak kolekcje atrybutów CMS

TDerValidationOptions.Default dostarcza ograniczone wartości domyślne, a TDerValidationResult.ErrorCount i FirstError upraszczają obsługę diagnostyki

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
AsnIdentifierBuduje TAsnIdentifier z klasy, numeru tagu i flagi skonstruowania, używane do sterowania TDerReader.TryReadExpected
EncodeIdentifierKoduje TAsnIdentifier na jego bajty identyfikatora DER, łącznie z formą high-tag-number
ConcatBytes, Concat3, Concat4, ConcatManyŁączą dwie, trzy, cztery lub tablicę dynamiczną TBytes w jedną alokację; szeroko używane przez kreatora CMS
EncodeOIDContentKoduje łańcuch OID w postaci kropkowej na bajty treści bez tagu i długości, więc wywołujący może zinspekcjonować lub ponownie owinąć OID
DerValidationErrorKindNameZwraca nazwę wyświetlaną TDerValidationErrorKind na potrzeby diagnostyki

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