PDFium Delphi Component Docs

FPdfAsn1 ユニット

ユニット: FPdfAsn1
上限付きリソース使用で ASN.1 Distinguished Encoding Rules データのエンコード、ナビゲート、デコード、検証を行います

公開型

型説明
TAsnTag識別子の構築と検証で使用されるユニバーサルタグ定数 (BOOLEAN、INTEGER、OCTET STRING、OID、SEQUENCE、SET、時刻および文字列形式)
TAsnClass識別子クラス: asnClassUniversal、asnClassApplication、asnClassContextSpecific、asnClassPrivate
TAsnIdentifier識別子クラス、constructed フラグ、64 ビットタグ番号を格納します。high-tag-number 形式を含みます
TDerTlvソースバッファをコピーせずに Offset、HeaderLength、ContentOffset、ContentLength、NextOffset、Identifier を持つ解析済み TLV を表します
TDerWriter再利用可能な DER 出力バッファと型付きエンコーダーです
TDerReaderpeek、advance、skip、期待タグ、子ウィンドウ、スライス、型付きデコードの各操作を持つ上限付きリーダーです
TDerByteArraysConcatMany などの複数バッファヘルパーで使用される TBytes の動的配列です
TDerValidationErrorKind検証エラーのカテゴリ: dvekMalformedTlv、dvekTrailingData、深さ/ノード/コンテンツ上限 (dvekDepthLimit、dvekNodeLimit、dvekContentLimit)、dvekUniversalForm、型ごとの正規形違反 (dvekBoolean、dvekInteger、dvekBitString、dvekNull、dvekOid、dvekString、dvekTime)、および dvekSetOrder
TDerValidationErrorオフセットと Depth を保持するエラーレコードで、Kind と人が読めるメッセージテキストを持ちます
TDerValidationErrorsTDerValidationResult 内で返される TDerValidationError の動的配列です
TDerValidationOptionsMaxDepth、MaxNodes、MaxContentLength、MaxErrors の上限、RequireSingleRoot フラグ、オプションの ValidateSetOrder、および Default クラス関数からなる上限設定です
TDerValidationResultIsValid、NodeCount、MaximumDepth、オフセット付きの Errors による検証ステータスに加え、ErrorCount と FirstError ヘルパーを提供します

ライター API

API説明
Clear, IsEmpty, Count, Capacity, Bytes, Finishバッファされたデータをリセットまたは検査し、スナップショットをコピー、あるいは完成した配列を転送してライターをリセットします
Reserve, Append, AppendMany, AppendByte一度だけ拡張を行い、オーバーフローチェック付きで配列、呼び出し側所有のバッファ、複数の配列、または 1 バイトを追記します
Wrap, WrapIdentifier, WrapConstructed生の識別子オクテット、任意の識別子クラスと 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 を構築します

リーダー API

API説明
Initialize, AtEnd, EffectiveLimit, Remainingリーダーを初期化し、上限付きウィンドウと残りバイト数を検査します
TryReadTlvAt, PeekTlvPosition を変更せずに低い/高いタグ番号と最短の definite 長を解析します
ReadNextTlv, SkipTlv完全で有効な TLV が利用可能な場合にのみ前進します
TryReadExpectedクラス、constructed 形式、タグ番号がすべて一致した場合にのみ前進します
EnterConstructedコンテンツをコピーせずに、同じソース配列上の子リーダーウィンドウを作成します
ContentBytes, EncodedBytes所有権が必要な場合に、検証済みのコンテンツまたは完全な TLV スライスをコピーします
TryReadBoolean, TryReadUnsignedInteger, TryReadBitString範囲チェックと未使用ビットチェック付きで正規のプリミティブ値をデコードします
TryReadString, TryReadTime, TryReadNull検証済みの UTF8String、PrintableString、IA5String、DER 時刻、NULL コンテンツをデコードします
ReadTlv, TryReadOID, ReadOID, TryReadInteger, ReadInteger生の TLV オフセットへの互換アクセスに加え、オブジェクト識別子と符号付き整数のデコードを提供します

検証

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 が 1 つであることを要求します

ValidateSetOrder は、スキーマ非依存の DER ではすべての SET を SET OF と区別できないため既定で無効です。CMS 属性コレクションのような既知の SET OF コンテナに対して有効化してください

TDerValidationOptions.Default が上限付きの既定値を供給し、TDerValidationResult.ErrorCount と FirstError が診断処理を簡素化します

公開ヘルパー関数

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;

関数説明
AsnIdentifierクラス、タグ番号、constructed フラグから TAsnIdentifier を構築します。TDerReader.TryReadExpected の駆動に使用します
EncodeIdentifierTAsnIdentifier を DER 識別子バイトにエンコードします。high-tag-number 形式を含みます
ConcatBytes, Concat3, Concat4, ConcatMany2 つ、3 つ、4 つ、または動的配列の TBytes を 1 回のアロケーションで連結します。CMS ビルダーで広く使われます
EncodeOIDContentドット区切りの 10 進 OID 文字列をタグと長さを除いたコンテンツバイトにエンコードします。呼び出し側が OID を検査または再ラップできます
DerValidationErrorKindName診断用に TDerValidationErrorKind の表示名を返します

例

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;

備考