PDFium Delphi Component Docs

FPdfCms ユニット

ユニット: FPdfCms
RFC 5652 CMS / CAdES SignedData 構造体を構築し、署名ポリシードキュメントを検証し、オプションの RFC 3161 タイムスタンプを埋め込みます

構文

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 準拠の形式を生成します

ICmsSigner メソッド

メソッド説明
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 のどちらの署名アルゴリズムになるかはここで決まり、すべての署名バックエンドがこれを必要とするため、いずれかの側に置かずこのユニットに置いてあります
ExtractIssuerAndSerialSignerIdentifier が持つ issuer と serialNumber の生 TLV を取り出して IssuerTlv と SerialTlv に格納します
EcDsaP1363ToDerP1363 r||s 形式の生 ECDSA 署名を、CMS が期待する 2 つの INTEGER からなる DER SEQUENCE へ変換します。トークンやプラットフォームの暗号 API は生形式を返してくるためです
VerifyCmsSignaturePolicyDocument空でない SignaturePolicyOid と 32 バイトの SignaturePolicyHash を要求し、指定されたポリシードキュメントを SHA-256 で検証して、失敗時には診断テキストを返します
BuildSignedData1 つの CAdES SignerInfo、署名者証明書、任意のチェーン、構成された署名付き属性を持つ、完全な分離型 RFC 5652 CMS ContentInfo を構築します
ExtractSignatureValueRFC 3161 タイムスタンプのメッセージインプリント入力として使われる、SignerInfo の生の署名オクテットを取り出します
AddSignatureTimestampToCms完全な RFC 3161 TimeStampToken を signature-time-stamp 署名なし属性として追加し、外側の長さを再エンコードします

型

型説明
TCmsSignerIdKindsidIssuerAndSerial は発行者名とシリアル TLV を、sidSubjectKeyIdentifier は生のサブジェクトキー識別子オクテットを選択します
TCmsSignerIdKind、IssuerDer、SerialDer、SubjectKeyId が、選択された SignerInfo 識別子形式を保持します
TCmsBuildOptionsSigningTimeUtc、CommitmentTypeOid、SignaturePolicyOid、SignaturePolicyHash、SignaturePolicyUri、SignaturePolicyDocument が署名付き属性を構成します。Default はすべての任意値をクリアします

備考

関連項目

FPdfTsa, FPdfCrypto, FPdfSha256, TPdf.SignPades