PDFium Delphi Component Docs

Đơn vị FPdfAsn1

Unit: FPdfAsn1
Mã hóa, điều hướng, giải mã và kiểm tra dữ liệu ASN.1 Distinguished Encoding Rules với mức dùng tài nguyên có giới hạn

Public Types

TypeDescription
TAsnTagCác hằng tag universal (BOOLEAN, INTEGER, OCTET STRING, OID, SEQUENCE, SET, các dạng thời gian và chuỗi) dùng trong việc dựng và kiểm tra identifier
TAsnClassLớp identifier: asnClassUniversal, asnClassApplication, asnClassContextSpecific hoặc asnClassPrivate
TAsnIdentifierLớp identifier, cờ constructed và số tag 64-bit, bao gồm cả dạng high-tag-number
TDerTlvTLV đã parse với Offset, HeaderLength, ContentOffset, ContentLength, NextOffset và Identifier mà không sao chép buffer nguồn
TDerWriterBuffer đầu ra DER dùng lại được cùng bộ mã hóa có kiểu
TDerReaderReader có giới hạn với các thao tác peek, advance, skip, expected-tag, cửa sổ con, slice và giải mã có kiểu
TDerByteArraysMảng động của TBytes dùng bởi ConcatMany và các helper đa buffer khác
TDerValidationErrorKindCác nhóm lỗi kiểm tra: dvekMalformedTlv, dvekTrailingData, các giới hạn depth, node và content (dvekDepthLimit, dvekNodeLimit, dvekContentLimit), dvekUniversalForm, các thất bại canonical theo từng kiểu (dvekBoolean, dvekInteger, dvekBitString, dvekNull, dvekOid, dvekString, dvekTime) và dvekSetOrder
TDerValidationErrorRecord lỗi có Depth và offset, với Kind và nội dung thông báo dễ đọc
TDerValidationErrorsMảng động của TDerValidationError được trả về bên trong TDerValidationResult
TDerValidationOptionsCác giới hạn trong MaxDepth, MaxNodes, MaxContentLength, MaxErrors, cờ RequireSingleRoot, ValidateSetOrder tùy chọn và class function Default
TDerValidationResultTrạng thái kiểm tra với IsValid, NodeCount, MaximumDepth, Errors có kèm offset, cùng các helper ErrorCount và FirstError

Writer APIs

APIDescription
Clear, IsEmpty, Count, Capacity, Bytes, FinishReset hoặc xem dữ liệu đang đệm, sao chép một ảnh chụp, hoặc bàn giao mảng hoàn tất và reset writer
Reserve, Append, AppendMany, AppendByteMở rộng một lần và nối các mảng, buffer thuộc sở hữu người gọi, nhiều mảng hoặc một byte với kiểm tra tràn
Wrap, WrapIdentifier, WrapConstructedBao nội dung bằng một octet identifier thô, một lớp identifier và số tag 64-bit bất kỳ, hoặc một identifier constructed
ContextSpecific, ApplicationSpecific, PrivateSpecificMã hóa số tag thấp hoặc cao mà không cắt xén identifier
Sequence, SequenceOf, SetOf, SetOfSortedGhép các giá trị đã mã hóa thành container SEQUENCE hoặc SET; SetOfSorted sắp các giá trị theo byte đã mã hóa
BooleanOf, IntegerOf, UnsignedIntegerOf, IntegerBytes, EnumeratedOfMã hóa BOOLEAN, INTEGER có dấu hoặc không dấu, nội dung INTEGER tùy ý đã kiểm chứng, và ENUMERATED
OctetString, OctetStringOf, BitString, Null, OIDMã hóa các giá trị nhị phân, bit-string, NULL và object identifier thành TLV độc lập
PrintableString, Ia5String, Utf8StringMã hóa các dạng chuỗi ký tự ASN.1 được hỗ trợ
UTCTime, GeneralizedTime, UTCTimeOf, GeneralizedTimeOf, TimeOfMã hóa văn bản thời gian canonical hoặc giá trị UTC TDateTime, với TimeOf chọn đúng kiểu thời gian DER
AlgId, AlgIdWithParamsDựng một SEQUENCE AlgorithmIdentifier với tham số NULL hoặc tường minh

Reader APIs

APIDescription
Initialize, AtEnd, EffectiveLimit, RemainingKhởi tạo reader và xem cửa sổ có giới hạn cùng số byte còn lại của nó
TryReadTlvAt, PeekTlvParse số tag thấp hoặc cao và chiều dài definite tối thiểu mà không đổi Position
ReadNextTlv, SkipTlvChỉ tiến lên sau khi một TLV hoàn chỉnh và hợp lệ sẵn sàng
TryReadExpectedChỉ tiến lên khi lớp, dạng constructed và số tag đều khớp
EnterConstructedTạo một cửa sổ reader con trên cùng mảng nguồn mà không sao chép nội dung
ContentBytes, EncodedBytesSao chép một slice content đã kiểm chứng hoặc TLV hoàn chỉnh khi cần sở hữu dữ liệu
TryReadBoolean, TryReadUnsignedInteger, TryReadBitStringGiải mã các giá trị primitive canonical với kiểm tra phạm vi và bit-unused
TryReadString, TryReadTime, TryReadNullGiải mã nội dung UTF8String, PrintableString, IA5String, thời gian DER hoặc NULL đã kiểm chứng
ReadTlv, TryReadOID, ReadOID, TryReadInteger, ReadIntegerCung cấp đường truy cập tương thích tới các offset TLV thô cùng giải mã object identifier và số nguyên có dấu

Validation

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

ValidateDer kiểm tra tính tối thiểu của identifier và chiều dài, biên buffer, các dạng primitive universal, BOOLEAN, INTEGER, ENUMERATED, BIT STRING, NULL, OBJECT IDENTIFIER, các chuỗi được hỗ trợ và giá trị thời gian canonical

Giới hạn mặc định cho phép depth tối đa 64, 100000 node, 64 MiB mỗi giá trị content và 32 lỗi được báo cáo, đồng thời yêu cầu đúng một TLV gốc

ValidateSetOrder mặc định bị tắt vì DER không có schema không thể phân biệt mọi SET với SET OF; hãy bật nó cho các container SET OF đã biết như tập thuộc tính của CMS

TDerValidationOptions.Default cung cấp các mặc định có giới hạn, còn TDerValidationResult.ErrorCount và FirstError giúp xử lý chẩn đoán đơn giản hơn

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
AsnIdentifierDựng một TAsnIdentifier từ lớp, số tag và cờ constructed, dùng để điều phối TDerReader.TryReadExpected
EncodeIdentifierMã hóa một TAsnIdentifier thành các byte identifier DER, bao gồm cả dạng high-tag-number
ConcatBytes, Concat3, Concat4, ConcatManyNối hai, ba, bốn hoặc một mảng động các TBytes thành một vùng cấp phát; được trình dựng CMS dùng rộng rãi
EncodeOIDContentMã hóa chuỗi OID dạng chấm-thập phân thành các byte nội dung không kèm tag và chiều dài, để người gọi có thể xem lại hoặc bao lại một OID
DerValidationErrorKindNameTrả về tên hiển thị của một TDerValidationErrorKind phục vụ chẩn đoán

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