PDFium Delphi Component Docs

Unidad FPdfAsn1

Unidad: FPdfAsn1
Codifica, navega, decodifica y valida datos ASN.1 Distinguished Encoding Rules con uso acotado de recursos

Tipos públicos

TipoDescripción
TAsnTagConstantes de etiquetas universales (BOOLEAN, INTEGER, OCTET STRING, OID, SEQUENCE, SET, formas de tiempo y de cadena) usadas por la construcción y validación de identificadores
TAsnClassClase del identificador: asnClassUniversal, asnClassApplication, asnClassContextSpecific o asnClassPrivate
TAsnIdentifierClase del identificador, marca de construido y número de etiqueta de 64 bits, incluida la forma de etiqueta alta
TDerTlvTLV analizado con Offset, HeaderLength, ContentOffset, ContentLength, NextOffset e Identifier sin copiar el búfer de origen
TDerWriterBúfer de salida DER reutilizable y codificador tipado
TDerReaderLector acotado con operaciones de peek, avance, salto, etiqueta esperada, ventana hija, porción y decodificación tipada
TDerByteArraysMatriz dinámica de TBytes usada por ConcatMany y otros asistentes multibúfer
TDerValidationErrorKindCategorías de errores de validación: dvekMalformedTlv, dvekTrailingData, límites de profundidad, de nodos y de contenido (dvekDepthLimit, dvekNodeLimit, dvekContentLimit), dvekUniversalForm, fallos canónicos por tipo (dvekBoolean, dvekInteger, dvekBitString, dvekNull, dvekOid, dvekString, dvekTime) y dvekSetOrder
TDerValidationErrorRegistro de error con información de Offset y Depth, con Kind y texto de mensaje legible
TDerValidationErrorsMatriz dinámica de TDerValidationError devuelta dentro de TDerValidationResult
TDerValidationOptionsLímites en MaxDepth, MaxNodes, MaxContentLength, MaxErrors, la marca RequireSingleRoot, el ValidateSetOrder opcional y la función de clase Default
TDerValidationResultEstado de validación con IsValid, NodeCount, MaximumDepth, Errors con información de desplazamiento, más los asistentes ErrorCount y FirstError

APIs del escritor

APIDescripción
Clear, IsEmpty, Count, Capacity, Bytes, FinishRestablece o inspecciona los datos almacenados, copia una instantánea o transfiere la matriz completada y restablece el escritor
Reserve, Append, AppendMany, AppendByteCrece una sola vez y anexa matrices, búferes propiedad del llamador, varias matrices o un byte con comprobaciones de desbordamiento
Wrap, WrapIdentifier, WrapConstructedEnvuelve el contenido con un octeto de identificador en bruto, cualquier clase de identificador y número de etiqueta de 64 bits, o un identificador construido
ContextSpecific, ApplicationSpecific, PrivateSpecificCodifica números de etiqueta bajos o altos sin truncar el identificador
Sequence, SequenceOf, SetOf, SetOfSortedCompone valores codificados como contenedores SEQUENCE o SET; SetOfSorted ordena los valores por sus bytes codificados
BooleanOf, IntegerOf, UnsignedIntegerOf, IntegerBytes, EnumeratedOfCodifica BOOLEAN, INTEGER con o sin signo, contenido INTEGER arbitrario validado y valores ENUMERATED
OctetString, OctetStringOf, BitString, Null, OIDCodifica valores binarios, de cadena de bits, NULL y de identificador de objeto como TLV independientes
PrintableString, Ia5String, Utf8StringCodifica las formas de cadena de caracteres ASN.1 admitidas
UTCTime, GeneralizedTime, UTCTimeOf, GeneralizedTimeOf, TimeOfCodifica texto de tiempo canónico o valores UTC TDateTime, con TimeOf seleccionando el tipo de tiempo DER correcto
AlgId, AlgIdWithParamsConstruye una SEQUENCE AlgorithmIdentifier con parámetros NULL o explícitos

APIs del lector

APIDescripción
Initialize, AtEnd, EffectiveLimit, RemainingInicializa un lector e inspecciona su ventana acotada y el número de bytes restantes
TryReadTlvAt, PeekTlvAnaliza números de etiqueta bajos o altos y longitudes definidas mínimas sin cambiar Position
ReadNextTlv, SkipTlvAvanza solo cuando hay un TLV válido completo disponible
TryReadExpectedAvanza solo cuando la clase, la forma construida y el número de etiqueta coinciden todos
EnterConstructedCrea una ventana de lector hija sobre la misma matriz de origen sin copiar contenido
ContentBytes, EncodedBytesCopia una porción de contenido validada o de TLV completo cuando se requiere propiedad
TryReadBoolean, TryReadUnsignedInteger, TryReadBitStringDecodifica valores primitivos canónicos con comprobaciones de rango y de bits no usados
TryReadString, TryReadTime, TryReadNullDecodifica contenido validado de UTF8String, PrintableString, IA5String, tiempo DER o NULL
ReadTlv, TryReadOID, ReadOID, TryReadInteger, ReadIntegerProporcionan acceso de compatibilidad a los desplazamientos en bruto de los TLV más la decodificación de identificadores de objeto y enteros con signo

Validación

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

ValidateDer comprueba la minimidad de identificador y longitud, los límites del búfer, las formas primitivas universales, BOOLEAN, INTEGER, ENUMERATED, BIT STRING, NULL, OBJECT IDENTIFIER, las cadenas admitidas y los valores de tiempo canónicos

Los límites predeterminados permiten una profundidad máxima de 64, 100000 nodos, 64 MiB por valor de contenido y 32 errores notificados, exigiendo un único TLV raíz

ValidateSetOrder está desactivado de forma predeterminada porque DER sin esquema no puede distinguir todo SET de un SET OF; actívelo para contenedores SET OF conocidos, como las colecciones de atributos de CMS

TDerValidationOptions.Default aporta los valores acotados predeterminados, mientras que TDerValidationResult.ErrorCount y FirstError simplifican el manejo de diagnóstico

Funciones auxiliares públicas

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;

FunciónDescripción
AsnIdentifierConstruye un TAsnIdentifier a partir de la clase, el número de etiqueta y la marca de construido; se usa para impulsar TDerReader.TryReadExpected
EncodeIdentifierCodifica un TAsnIdentifier en sus bytes DER de identificador, incluida la forma de etiqueta alta
ConcatBytes, Concat3, Concat4, ConcatManyConcatenan dos, tres, cuatro o una matriz dinámica de TBytes en una sola asignación; de amplio uso por el constructor CMS
EncodeOIDContentCodifica una cadena OID decimal punteada en sus bytes de contenido sin la etiqueta ni la longitud, de modo que quien llama pueda inspeccionar o reenvolver un OID
DerValidationErrorKindNameDevuelve el nombre visible de un TDerValidationErrorKind para diagnóstico

Ejemplo

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;

Observaciones