PDFium Delphi Component Docs

FPdfCms 유닛

유닛: FPdfCms
RFC 5652 CMS / CAdES SignedData 구조를 구성하고 서명 정책 문서를 검증하며 선택적 RFC 3161 타임스탬프를 삽입합니다

Syntax

TCmsSignerIdKind = (sidIssuerAndSerial, sidSubjectKeyIdentifier);

TCmsSignerId = record
  Kind: TCmsSignerIdKind;
  IssuerDer: TBytes;
  SerialDer: TBytes;
  SubjectKeyId: TBytes;
end;

ICmsSigner = interface
  function GetDigestAlgorithmOid: AnsiString;
  function GetSignatureAlgorithmOid: AnsiString;
  function GetSignatureAlgorithmParams: TBytes;
  function GetSignerId: TCmsSignerId;
  function SignSignedAttrsDigest(const Digest: TSHA256Digest): TBytes;
end;

TCmsBuildOptions = record
  SigningTimeUtc: TDateTime;
  CommitmentTypeOid: AnsiString;
  SignaturePolicyOid: AnsiString;
  SignaturePolicyHash: TBytes;
  SignaturePolicyUri: AnsiString;
  SignaturePolicyDocument: TBytes;
  class function Default: TCmsBuildOptions; static;
end;

function CertKeyAlgorithmOid(const CertDer: TBytes): AnsiString;
function ExtractIssuerAndSerial(const CertDer: TBytes;
  out IssuerTlv, SerialTlv: TBytes): Boolean;
function EcDsaP1363ToDer(const Raw: TBytes): TBytes;
function VerifyCmsSignaturePolicyDocument(const Options: TCmsBuildOptions;
  const PolicyDocument: TBytes; out ErrorText: string): Boolean;
function BuildSignedData(const DetachedDigest: TSHA256Digest;
  const Signer: ICmsSigner; const SignerCertDer: TBytes;
  const ChainCertDer: array of TBytes;
  const Options: TCmsBuildOptions): TBytes;
function ExtractSignatureValue(const CmsDer: TBytes;
  out SignatureValueOctets: TBytes): Boolean;
procedure AddSignatureTimestampToCms(var CmsDer: TBytes;
  const TimestampTokenDer: TBytes);

Description

FPdfCms는 PAdES 서명 경로가 내부에서 사용하는 저수준 CMS 빌더입니다. 고급 사용자가 서명 속성의 SHA-256 메시지 다이제스트, 서명자 추상화, 서명자 인증서, 선택적 인증서 체인으로 CMS SignedData 값을 조립할 수 있게 해줍니다

ICmsSigner 인터페이스가 크립토 백엔드 계약입니다. 호출자가 다이제스트와 서명 알고리즘 OID, 서명자 식별자를 공급하고 서명 속성 다이제스트에 대한 실제 개인 키 연산을 수행합니다. 이 덕분에 CMS 인코딩이 특정 크립토 공급자에서 분리됩니다

TCmsBuildOptions는 서명 시각, commitment type, SHA-256 정책 해시와 URI, 선택적 메모리상 정책 문서를 갖춘 명시적 서명 정책 식별자를 추가할 수 있습니다

ExtractSignatureValue는 완성된 CMS 값에서 raw 서명 옥텟을 꺼내 타임스탬프 기관에 보낼 수 있게 하고, AddSignatureTimestampToCms가 이어서 반환된 타임스탬프 토큰을 unsigned 속성으로 삽입해 B-T/B-LTA 호환 형태를 만듭니다

ICmsSigner methods

MethodDescription
GetDigestAlgorithmOid서명 속성에 적용되는 해시 알고리즘의 OID를 반환합니다(예: SHA-256의 2.16.840.1.101.3.4.2.1)
GetSignatureAlgorithmOid다이제스트에 적용되는 서명 알고리즘의 OID를 반환합니다
GetSignatureAlgorithmParams알고리즘 파라미터를 반환합니다(ECDSA에서는 보통 비어 있고, PSS에서는 RSA-PSS 파라미터 블록을 담습니다)
GetSignerIdissuer/serial 또는 subject key identifier로 서명자를 식별하는 TCmsSignerId를 반환합니다
SignSignedAttrsDigest전달된 다이제스트에 개인 키 서명을 수행하고 서명 옥텟을 반환합니다

Functions and procedures

RoutineDescription
CertKeyAlgorithmOid인증서에서 SubjectPublicKeyInfo 알고리즘 OID를 읽습니다. 이 OID가 RSA와 ECDSA 서명 알고리즘 중 무엇을 쓸지 결정하며, 모든 서명 백엔드에 필요하기 때문에 특정 백엔드 안에 두지 않고 여기에 뒀습니다
ExtractIssuerAndSerialSignerIdentifier가 담는 raw issuer와 serialNumber TLV를 IssuerTlv와 SerialTlv로 꺼냅니다
EcDsaP1363ToDerraw P1363 r||s ECDSA 서명을 CMS가 기대하는 두 INTEGER의 DER SEQUENCE로 감쌉니다. 토큰과 플랫폼 크립토 API는 raw 형태를 돌려줍니다
VerifyCmsSignaturePolicyDocument비어 있지 않은 SignaturePolicyOid와 32바이트 SignaturePolicyHash를 요구한 뒤, 전달된 정책 문서를 SHA-256으로 검증하고 실패 시 진단 텍스트를 반환합니다
BuildSignedDataCAdES SignerInfo 하나, 서명자 인증서, 선택적 체인, 구성된 signed 속성을 갖춘 완전한 detached RFC 5652 CMS ContentInfo를 만듭니다
ExtractSignatureValueRFC 3161 타임스탬프 message imprint 입력으로 쓰이는 raw SignerInfo 서명 옥텟을 꺼냅니다
AddSignatureTimestampToCms완전한 RFC 3161 TimeStampToken을 signature-time-stamp unsigned 속성으로 추가하고 감싸는 길이들을 다시 인코딩합니다

Types

TypeDescription
TCmsSignerIdKindsidIssuerAndSerial은 issuer Name과 serial TLV를 고르고 sidSubjectKeyIdentifier는 raw subject-key-identifier 옥텟을 고릅니다
TCmsSignerIdKind, IssuerDer, SerialDer, SubjectKeyId가 선택된 SignerInfo 식별자 형태를 담습니다
TCmsBuildOptionsSigningTimeUtc, CommitmentTypeOid, SignaturePolicyOid, SignaturePolicyHash, SignaturePolicyUri, SignaturePolicyDocument가 signed 속성을 구성합니다. Default는 모든 선택적 값을 지웁니다

Remarks

See Also

FPdfTsa, FPdfCrypto, FPdfSha256, TPdf.SignPades