PDFium Delphi Component Docs

FPdfAsn1 Unit

Unit: FPdfAsn1
Kodiert, navigiert, dekodiert und validiert ASN.1-Distinguished-Encoding-Rules-Daten mit begrenztem Ressourceneinsatz

Öffentliche Typen

TypBeschreibung
TAsnTagUniverselle Tag-Konstanten (BOOLEAN, INTEGER, OCTET STRING, OID, SEQUENCE, SET, Zeit- und String-Formen) für Aufbau und Validierung von Kennzeichnungen
TAsnClassKennzeichnungsklasse: asnClassUniversal, asnClassApplication, asnClassContextSpecific oder asnClassPrivate
TAsnIdentifierKennzeichnungsklasse, Constructed-Flag und 64-Bit-Tag-Nummer, einschließlich der High-Tag-Number-Form
TDerTlvGeparste TLV mit Offset, HeaderLength, ContentOffset, ContentLength, NextOffset und Identifier, ohne den Quellpuffer zu kopieren
TDerWriterWiederverwendbarer DER-Ausgabepuffer und typisierter Encoder
TDerReaderBegrenzter Reader mit Peek-, Advance-, Skip-, Erwartungs-Tag-, Kindfenster-, Slice- und typisierten Dekodier-Operationen
TDerByteArraysDynamisches Array aus TBytes, verwendet von ConcatMany und anderen Mehrfachpuffer-Helfern
TDerValidationErrorKindValidierungsfehler-Kategorien: dvekMalformedTlv, dvekTrailingData, Tiefen-, Knoten- und Inhaltsbegrenzungen (dvekDepthLimit, dvekNodeLimit, dvekContentLimit), dvekUniversalForm, typspezifische kanonische Fehler (dvekBoolean, dvekInteger, dvekBitString, dvekNull, dvekOid, dvekString, dvekTime) und dvekSetOrder
TDerValidationErrorOffset- und Depth-bewusster Fehler-Record mit Kind und menschenlesbarem Meldungstext
TDerValidationErrorsDynamisches Array aus TDerValidationError, zurückgegeben innerhalb von TDerValidationResult
TDerValidationOptionsBegrenzungen in MaxDepth, MaxNodes, MaxContentLength, MaxErrors, das RequireSingleRoot-Flag, optionales ValidateSetOrder und die Default-Klassenfunktion
TDerValidationResultValidierungsstatus mit IsValid, NodeCount, MaximumDepth, offset-bewussten Errors sowie ErrorCount und FirstError-Helfern

Writer-APIs

APIBeschreibung
Clear, IsEmpty, Count, Capacity, Bytes, FinishSetzt gepufferte Daten zurück oder inspiziert sie, kopiert einen Schnappschuss oder übergibt das fertige Array und setzt den Writer zurück
Reserve, Append, AppendMany, AppendByteWächst einmalig an und hängt Arrays, vom Aufrufer bereitgestellte Puffer, mehrere Arrays oder ein einzelnes Byte mit Überlaufprüfungen an
Wrap, WrapIdentifier, WrapConstructedVerpackt Inhalte mit einem rohen Kennzeichnungs-Oktett, einer beliebigen Kennzeichnungsklasse und 64-Bit-Tag-Nummer oder einer constructed-Kennzeichnung
ContextSpecific, ApplicationSpecific, PrivateSpecificKodiert niedrige oder hohe Tag-Nummern, ohne die Kennzeichnung abzuschneiden
Sequence, SequenceOf, SetOf, SetOfSortedKomponiert kodierte Werte als SEQUENCE- oder SET-Container; SetOfSorted sortiert Werte nach ihren kodierten Bytes
BooleanOf, IntegerOf, UnsignedIntegerOf, IntegerBytes, EnumeratedOfKodiert BOOLEAN, vorzeichenbehaftete oder vorzeichenlose INTEGER, validierten willkürlichen INTEGER-Inhalt und ENUMERATED-Werte
OctetString, OctetStringOf, BitString, Null, OIDKodiert Binär-, Bitstring-, NULL- und Objektbezeichner-Werte als eigenständige TLVs
PrintableString, Ia5String, Utf8StringKodiert die unterstützten ASN.1-Zeichenketten-Formen
UTCTime, GeneralizedTime, UTCTimeOf, GeneralizedTimeOf, TimeOfKodiert kanonischen Zeittext oder UTC-TDateTime-Werte, wobei TimeOf den richtigen DER-Zeittyp auswählt
AlgId, AlgIdWithParamsBaut eine AlgorithmIdentifier-SEQUENCE mit NULL oder expliziten Parametern

Reader-APIs

APIBeschreibung
Initialize, AtEnd, EffectiveLimit, RemainingInitialisiert einen Reader und inspiziert sein begrenztes Fenster und die verbleibende Byteanzahl
TryReadTlvAt, PeekTlvParst niedrige oder hohe Tag-Nummern und minimale definite Längen, ohne Position zu verändern
ReadNextTlv, SkipTlvSchreitet nur voran, nachdem eine vollständige gültige TLV verfügbar ist
TryReadExpectedSchreitet nur voran, wenn Klasse, constructed-Form und Tag-Nummer alle übereinstimmen
EnterConstructedErstellt ein untergeordnetes Reader-Fenster über dasselbe Quell-Array, ohne Inhalte zu kopieren
ContentBytes, EncodedBytesKopiert einen validierten Inhalts- oder vollständigen TLV-Ausschnitt, wenn Eigentümerschaft benötigt wird
TryReadBoolean, TryReadUnsignedInteger, TryReadBitStringDekodiert kanonische primitive Werte mit Bereichs- und Unused-Bit-Prüfungen
TryReadString, TryReadTime, TryReadNullDekodiert validierte UTF8String-, PrintableString-, IA5String-, DER-Zeit- oder NULL-Inhalte
ReadTlv, TryReadOID, ReadOID, TryReadInteger, ReadIntegerBieten Kompatibilitätszugriff auf rohe TLV-Offsets sowie Objektbezeichner- und vorzeichenbehaftete Integer-Dekodierung

Validierung

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

ValidateDer prüft Kennzeichnungs- und Längenminimalität, Puffergrenzen, universelle primitive Formen, BOOLEAN, INTEGER, ENUMERATED, BIT STRING, NULL, OBJECT IDENTIFIER, unterstützte Zeichenketten und kanonische Zeitwerte

Die Standardbegrenzungen erlauben eine maximale Tiefe von 64, 100000 Knoten, 64 MiB pro Inhaltsstück und 32 gemeldete Fehler und verlangen genau eine Wurzel-TLV

ValidateSetOrder ist standardmäßig deaktiviert, weil schema-freies DER nicht jedes SET von SET OF unterscheiden kann; aktivieren Sie es für bekannte SET-OF-Container wie CMS-Attribut-Sammlungen

TDerValidationOptions.Default liefert die begrenzten Standardwerte, während TDerValidationResult.ErrorCount und FirstError die Diagnosebehandlung vereinfachen

Öffentliche Helferfunktionen

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;

FunktionBeschreibung
AsnIdentifierBaut eine TAsnIdentifier aus Klasse, Tag-Nummer und Constructed-Flag und steuert damit TDerReader.TryReadExpected
EncodeIdentifierKodiert eine TAsnIdentifier in ihre DER-Kennzeichnungs-Bytes, einschließlich der High-Tag-Number-Form
ConcatBytes, Concat3, Concat4, ConcatManyVerkettet zwei, drei, vier oder ein dynamisches Array von TBytes in einer einzigen Allokation; wird vielfach vom CMS-Builder verwendet
EncodeOIDContentKodiert einen OID-String in gepunkteter Dezimalform in seine Inhalts-Bytes ohne Tag und Länge, sodass Aufrufer eine OID inspizieren oder neu verpacken können
DerValidationErrorKindNameGibt den Anzeigenamen einer TDerValidationErrorKind für Diagnosen zurück

Beispiel

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;

Hinweise