PDFium Delphi Component Docs

FPdfAsn1 유닛

유닛: FPdfAsn1
한정된 자원 사용으로 ASN.1 Distinguished Encoding Rules 데이터를 인코딩, 탐색, 디코딩, 검증합니다

Public Types

TypeDescription
TAsnTag식별자 구성과 검증에 쓰이는 universal 태그 상수(BOOLEAN, INTEGER, OCTET STRING, OID, SEQUENCE, SET, 시간 및 문자열 형태)입니다
TAsnClass식별자 클래스입니다. asnClassUniversal, asnClassApplication, asnClassContextSpecific, asnClassPrivate 중 하나입니다
TAsnIdentifier식별자 클래스, constructed 플래그, high-tag-number 형태를 포함한 64비트 태그 번호입니다
TDerTlv소스 버퍼를 복사하지 않으면서 Offset, HeaderLength, ContentOffset, ContentLength, NextOffset, Identifier를 담은 파싱된 TLV입니다
TDerWriter재사용 가능한 DER 출력 버퍼이자 타입 인코더입니다
TDerReaderpeek, 전진, 건너뛰기, 예상 태그, 자식 윈도우, 슬라이스, 타입 디코드 연산을 갖춘 한정된 리더입니다
TDerByteArraysConcatMany 등 다중 버퍼 헬퍼가 사용하는 TBytes의 동적 배열입니다
TDerValidationErrorKind검증 오류 범주입니다. dvekMalformedTlv, dvekTrailingData, 깊이·노드·콘텐츠 한도(dvekDepthLimit, dvekNodeLimit, dvekContentLimit), dvekUniversalForm, 타입별 정규 형식 실패(dvekBoolean, dvekInteger, dvekBitString, dvekNull, dvekOid, dvekString, dvekTime), 그리고 dvekSetOrder가 있습니다
TDerValidationErrorOffset과 Depth를 담고 Kind와 사람이 읽을 수 있는 메시지 텍스트를 갖는 오류 레코드입니다
TDerValidationErrorsTDerValidationResult 안에 담겨 반환되는 TDerValidationError의 동적 배열입니다
TDerValidationOptionsMaxDepth, MaxNodes, MaxContentLength, MaxErrors 한도와 RequireSingleRoot 플래그, 선택적 ValidateSetOrder, Default 클래스 함수입니다
TDerValidationResultIsValid, NodeCount, MaximumDepth, 오프셋이 담긴 Errors로 검증 상태를 알려주고 ErrorCount와 FirstError 헬퍼를 제공합니다

Writer APIs

APIDescription
Clear, IsEmpty, Count, Capacity, Bytes, Finish버퍼링된 데이터를 리셋하거나 살펴보고, 스냅샷을 복사하거나, 완성된 배열을 넘기고 라이터를 리셋합니다
Reserve, Append, AppendMany, AppendByte한 번만 늘린 뒤 오버플로 검사와 함께 배열, 호출자 소유 버퍼, 여러 배열, 단일 바이트를 추가합니다
Wrap, WrapIdentifier, WrapConstructed콘텐츠를 raw identifier 옥텟, 임의의 식별자 클래스와 64비트 태그 번호, 또는 constructed 식별자로 감쌉니다
ContextSpecific, ApplicationSpecific, PrivateSpecific식별자를 잘라내지 않고 낮은 또는 높은 태그 번호를 인코딩합니다
Sequence, SequenceOf, SetOf, SetOfSorted인코딩된 값을 SEQUENCE 또는 SET 컨테이너로 구성합니다. SetOfSorted는 값을 인코딩된 바이트 기준으로 정렬합니다
BooleanOf, IntegerOf, UnsignedIntegerOf, IntegerBytes, EnumeratedOfBOOLEAN, 부호 있거나 없는 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, AlgIdWithParamsNULL 또는 명시적 파라미터를 가진 AlgorithmIdentifier SEQUENCE를 만듭니다

Reader APIs

APIDescription
Initialize, AtEnd, EffectiveLimit, Remaining리더를 초기화하고 한정된 윈도우와 남은 바이트 수를 살펴봅니다
TryReadTlvAt, PeekTlvPosition을 바꾸지 않고 낮거나 높은 태그 번호와 최소 definite 길이를 파싱합니다
ReadNextTlv, SkipTlv완전하고 유효한 TLV가 확인된 뒤에만 전진합니다
TryReadExpected클래스, constructed 형태, 태그 번호가 모두 일치할 때만 전진합니다
EnterConstructed콘텐츠를 복사하지 않고 같은 소스 배열 위에 자식 리더 윈도우를 만듭니다
ContentBytes, EncodedBytes소유권이 필요할 때 검증된 콘텐츠나 완전한 TLV 슬라이스를 복사합니다
TryReadBoolean, TryReadUnsignedInteger, TryReadBitString범위와 미사용 비트 검사를 거쳐 정규 primitive 값을 디코드합니다
TryReadString, TryReadTime, TryReadNull검증된 UTF8String, PrintableString, IA5String, DER 시간, NULL 콘텐츠를 디코드합니다
ReadTlv, TryReadOID, ReadOID, TryReadInteger, ReadIntegerraw TLV 오프셋 접근과 객체 식별자·부호 있는 정수 디코드를 호환성 목적으로 제공합니다

Validation

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

ValidateDer는 식별자와 길이의 최소성, 버퍼 경계, universal primitive 형태, BOOLEAN, INTEGER, ENUMERATED, BIT STRING, NULL, OBJECT IDENTIFIER, 지원되는 문자열, 정규 시간 값을 검사합니다

기본 한도는 하나의 루트 TLV를 요구하면서 최대 깊이 64, 노드 100000개, 콘텐츠 값당 64 MiB, 보고되는 오류 32개를 허용합니다

스키마 없는 DER는 모든 SET을 SET OF와 구별할 수 없으므로 ValidateSetOrder는 기본적으로 꺼져 있습니다. CMS 속성 모음처럼 SET OF임이 분명한 컨테이너에서는 켜세요

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클래스, 태그 번호, constructed 플래그로 TAsnIdentifier를 만들며, TDerReader.TryReadExpected를 구동하는 데 쓰입니다
EncodeIdentifierhigh-tag-number 형태를 포함해 TAsnIdentifier를 DER 식별자 바이트로 인코딩합니다
ConcatBytes, Concat3, Concat4, ConcatMany두 개, 세 개, 네 개 또는 TBytes의 동적 배열을 한 번의 할당으로 이어 붙입니다. CMS 빌더가 폭넓게 사용합니다
EncodeOIDContent점으로 구분된 10진 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