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);
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 호환 형태를 만듭니다
| Method | Description |
|---|---|
GetDigestAlgorithmOid | 서명 속성에 적용되는 해시 알고리즘의 OID를 반환합니다(예: SHA-256의 2.16.840.1.101.3.4.2.1) |
GetSignatureAlgorithmOid | 다이제스트에 적용되는 서명 알고리즘의 OID를 반환합니다 |
GetSignatureAlgorithmParams | 알고리즘 파라미터를 반환합니다(ECDSA에서는 보통 비어 있고, PSS에서는 RSA-PSS 파라미터 블록을 담습니다) |
GetSignerId | issuer/serial 또는 subject key identifier로 서명자를 식별하는 TCmsSignerId를 반환합니다 |
SignSignedAttrsDigest | 전달된 다이제스트에 개인 키 서명을 수행하고 서명 옥텟을 반환합니다 |
| Routine | Description |
|---|---|
CertKeyAlgorithmOid | 인증서에서 SubjectPublicKeyInfo 알고리즘 OID를 읽습니다. 이 OID가 RSA와 ECDSA 서명 알고리즘 중 무엇을 쓸지 결정하며, 모든 서명 백엔드에 필요하기 때문에 특정 백엔드 안에 두지 않고 여기에 뒀습니다 |
ExtractIssuerAndSerial | SignerIdentifier가 담는 raw issuer와 serialNumber TLV를 IssuerTlv와 SerialTlv로 꺼냅니다 |
EcDsaP1363ToDer | raw P1363 r||s ECDSA 서명을 CMS가 기대하는 두 INTEGER의 DER SEQUENCE로 감쌉니다. 토큰과 플랫폼 크립토 API는 raw 형태를 돌려줍니다 |
VerifyCmsSignaturePolicyDocument | 비어 있지 않은 SignaturePolicyOid와 32바이트 SignaturePolicyHash를 요구한 뒤, 전달된 정책 문서를 SHA-256으로 검증하고 실패 시 진단 텍스트를 반환합니다 |
BuildSignedData | CAdES SignerInfo 하나, 서명자 인증서, 선택적 체인, 구성된 signed 속성을 갖춘 완전한 detached RFC 5652 CMS ContentInfo를 만듭니다 |
ExtractSignatureValue | RFC 3161 타임스탬프 message imprint 입력으로 쓰이는 raw SignerInfo 서명 옥텟을 꺼냅니다 |
AddSignatureTimestampToCms | 완전한 RFC 3161 TimeStampToken을 signature-time-stamp unsigned 속성으로 추가하고 감싸는 길이들을 다시 인코딩합니다 |
| Type | Description |
|---|---|
TCmsSignerIdKind | sidIssuerAndSerial은 issuer Name과 serial TLV를 고르고 sidSubjectKeyIdentifier는 raw subject-key-identifier 옥텟을 고릅니다 |
TCmsSignerId | Kind, IssuerDer, SerialDer, SubjectKeyId가 선택된 SignerInfo 식별자 형태를 담습니다 |
TCmsBuildOptions | SigningTimeUtc, CommitmentTypeOid, SignaturePolicyOid, SignaturePolicyHash, SignaturePolicyUri, SignaturePolicyDocument가 signed 속성을 구성합니다. Default는 모든 선택적 값을 지웁니다 |
TSHA256Digest는 FPdfSha256 유닛이 제공합니다BuildSignedData는 DER로 인코딩된 인증서의 open array로 체인을 받으며, 서명자 인증서가 먼저 올 필요는 없습니다. 순서는 CMS EncapsulatedCertificateSet을 따릅니다