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 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 は、署名時刻、コミットメント型、および SHA-256 ポリシハッシュ、URI、任意のメモリ内ポリシードキュメント付きの明示的な署名ポリシー識別子を追加できます
ExtractSignatureValue は完成した CMS 値から生の署名オクテットを取り出し、タイムスタンプ機関に送信できるようにします。AddSignatureTimestampToCms は返されたタイムスタンプトークンを署名なし属性として埋め込み、B-T/B-LTA 準拠の形式を生成します
| メソッド | 説明 |
|---|---|
GetDigestAlgorithmOid | 署名付き属性に対して使用されるハッシュアルゴリズムの OID を返します (例: SHA-256 では 2.16.840.1.101.3.4.2.1) |
GetSignatureAlgorithmOid | ダイジェストに適用される署名アルゴリズムの OID を返します |
GetSignatureAlgorithmParams | アルゴリズムパラメータを返します (ECDSA の場合は多くの場合空で、PSS の場合は RSA-PSS パラメータの BLOB を持ちます) |
GetSignerId | 発行者/シリアル番号またはサブジェクトキー識別子で署名者を特定する TCmsSignerId を返します |
SignSignedAttrsDigest | 指定されたダイジェストに対して秘密鍵署名を実行し、署名オクテットを返します |
| ルーチン | 説明 |
|---|---|
CertKeyAlgorithmOid | 証明書から SubjectPublicKeyInfo アルゴリズム OID を読み取ります。RSA と ECDSA のどちらの署名アルゴリズムになるかはここで決まり、すべての署名バックエンドがこれを必要とするため、いずれかの側に置かずこのユニットに置いてあります |
ExtractIssuerAndSerial | SignerIdentifier が持つ issuer と serialNumber の生 TLV を取り出して IssuerTlv と SerialTlv に格納します |
EcDsaP1363ToDer | P1363 r||s 形式の生 ECDSA 署名を、CMS が期待する 2 つの INTEGER からなる DER SEQUENCE へ変換します。トークンやプラットフォームの暗号 API は生形式を返してくるためです |
VerifyCmsSignaturePolicyDocument | 空でない SignaturePolicyOid と 32 バイトの SignaturePolicyHash を要求し、指定されたポリシードキュメントを SHA-256 で検証して、失敗時には診断テキストを返します |
BuildSignedData | 1 つの CAdES SignerInfo、署名者証明書、任意のチェーン、構成された署名付き属性を持つ、完全な分離型 RFC 5652 CMS ContentInfo を構築します |
ExtractSignatureValue | RFC 3161 タイムスタンプのメッセージインプリント入力として使われる、SignerInfo の生の署名オクテットを取り出します |
AddSignatureTimestampToCms | 完全な RFC 3161 TimeStampToken を signature-time-stamp 署名なし属性として追加し、外側の長さを再エンコードします |
| 型 | 説明 |
|---|---|
TCmsSignerIdKind | sidIssuerAndSerial は発行者名とシリアル TLV を、sidSubjectKeyIdentifier は生のサブジェクトキー識別子オクテットを選択します |
TCmsSignerId | Kind、IssuerDer、SerialDer、SubjectKeyId が、選択された SignerInfo 識別子形式を保持します |
TCmsBuildOptions | SigningTimeUtc、CommitmentTypeOid、SignaturePolicyOid、SignaturePolicyHash、SignaturePolicyUri、SignaturePolicyDocument が署名付き属性を構成します。Default はすべての任意値をクリアします |
TSHA256Digest は FPdfSha256 ユニットが提供しますBuildSignedData は証明書チェーンを DER エンコードされた証明書のオープン配列として受け取ります。署名者を最初にする必要はなく、順序は CMS の EncapsulatedCertificateSet に従います