PDFium Delphi Component Docs

FPdfCryptoMac 유닛

유닛: FPdfCryptoMac
PAdES 서명용 macOS Keychain 백엔드이자 Security.framework를 통한 CMS 검증 및 인증서 신뢰 평가입니다

구문

EPdfKeychainError = class(Exception);

TPdfKeychainSignerProvider = class(TInterfacedObject, IPadesSignerProvider)
  constructor Create(const KeychainPath: string = '');
  function BackendName: string;
  function Resolve(const Options: TPadesSignerOptions): TPadesResolvedSigner;
end;

TPdfKeychainCmsVerifier = class(TInterfacedObject, IPdfCmsVerifier)
  function BackendName: string;
  function VerifyDetached(const CmsDer: TBytes; Segment1: Pointer; Segment1Length: Cardinal; Segment2: Pointer; Segment2Length: Cardinal; const Options: TPdfCmsVerifyOptions): TPdfCmsVerifyResult;
  function VerifyAttached(const CmsDer: TBytes; const Options: TPdfCmsVerifyOptions): TPdfCmsVerifyResult;
end;

function KeychainAvailable: Boolean;
function KeychainMissingSymbols: string;
function KeychainVerificationAvailable: Boolean;
function ConfigureKeychainSignerProvider: IPadesSignerProvider;
function ConfigureKeychainCmsVerifier: IPdfCmsVerifier;
procedure ConfigureKeychainTrustAnchors(const Anchors: TPadesChainCertArray);
procedure ConfigureKeychainOcspResponses(const Responses: TPadesChainCertArray);

설명

FPdfCryptoMac은 FPdfCrypto와 FPdfCms가 사용하는 macOS 크립토 백엔드로, 플랫폼 통합의 양쪽 절반을 모두 맡습니다. Keychain 아이덴티티를 통한 PAdES 서명과 시스템 CMS 디코더 및 신뢰 평가를 통한 CMS 검증입니다. Security.framework와 CoreFoundation는 링크하지 않고 실행 시점에 이름으로 로드·해석하므로, 유닛은 모든 타깃에서 컴파일되고 플랫폼 서비스에 실제로 닿을 수 있는지 실행 중에 보고합니다

서명 쪽에서 TPdfKeychainSignerProvider는 IPadesSignerProvider를 구현합니다. Resolve 메서드는 Keychain 아이덴티티를 열거하고 TPadesSignerOptions가 담은 SHA-1 썸프린트와 인증서가 일치하는 것을 고른 뒤, 인증서 DER과 짝이 되는 개인 키 참조를 읽어 TPadesResolvedSigner를 반환합니다. 그 ICmsSigner는 Security.framework를 통해 CMS signed 속성에 서명하므로 개인 키는 Keychain을 떠나지 않습니다. 옵션으로 요청한 패딩 방식은 키가 실제로 할 수 있는 것과 조정되고, RSASSA-PSS 파라미터는 다른 백엔드가 출력하는 것과 같아서 macOS에서 서명한 문서는 동일한 AlgorithmIdentifier를 갖습니다. ConfigureKeychainSignerProvider는 공급자를 만들어 활성 PAdES 서명 백엔드로 설치하고, 등록한 인터페이스를 반환합니다

검증 쪽에서 TPdfKeychainCmsVerifier는 CMSDecoder와 SecTrust 위에서 IPdfCmsVerifier를 구현합니다. VerifyDetached는 서명 구멍 양옆의 두 서명 바이트 범위를 디코더가 기대하는 detached 콘텐츠로 합친 뒤 그 내용에 대해 CMS 값을 검증하고, VerifyAttached는 자체 콘텐츠를 담은 CMS 값을 검증합니다. 타임스탬프 토큰이 후자에 해당합니다. 둘 다 서명 상태, 신뢰 상태, 폐기 상태를 따로 보고하는 TPdfCmsVerifyResult를 반환하고, 선택적으로 서명자 인증서와 평가된 체인을 수집하며, TPdfCmsVerifyOptions의 폐기, 온라인 검색, checkpoint 설정을 모두 존중합니다. ConfigureKeychainCmsVerifier는 검증기를 만들어 활성 CMS 검증 백엔드로 설치합니다

서명 유효성과 인증서 신뢰는 독립된 결과로 유지되므로, 신뢰할 수 없거나 자가 서명된 체인 아래의 진짜 서명이 변조된 콘텐츠와 계속 구별됩니다

첨부된 RFC 3161 토큰에서는 크기 제한이 적용된 DER 파싱으로 원본 encapsulated TSTInfo 바이트를 네이티브 디코더에 전달하며, content type이나 signed attributes를 바꾸지 않습니다. 일반 CMS 검증 패스는 네이티브 입력에서 unsigned attributes를 제외하므로, 자동 타임스탬프 처리가 외부 서명 자체의 무결성이나 체인 결과를 바꾸지 못합니다. 이 패스는 countersignature나 다른 unsigned attributes를 검증하지 않습니다. ValidatePadesTrust가 각 원본 타임스탬프 토큰, message imprint, TSA 인증서 역할, 신뢰, 폐기 결과를 별도로 검증합니다

TPdfKeychainSignerProvider.Create에 Keychain 파일 경로를 전달하면 쿼리에 한정된 검색 목록으로 해당 Keychain에서만 identity를 찾습니다. 이후 ConfigurePadesSignerProvider로 provider를 등록하세요. 빈 경로는 현재 사용자의 검색 범위를 사용합니다. 선택한 Keychain을 열거나 검색해도 기본 Keychain, 사용자 검색 목록, 시스템 신뢰 설정은 바뀌지 않습니다. 경로가 유효하지 않거나 범위를 지정하는 검색 symbol이 없으면 EPdfKeychainError가 발생합니다

Resolve는 오프라인의 쿼리별 인증서 조회와 네이티브 체인 구성을 통해 서명 인증서의 사용 가능한 발급자 체인도 내보냅니다. 후보 인증서는 최대 4096개, 각 1 MiB, 합계 16 MiB로 제한합니다. 구성된 체인은 leaf를 포함해 최대 32개이며, leaf는 ChainCertDer와 별도로 반환됩니다. 인증서 내보내기는 신뢰를 확립하거나 trust anchor를 설치하는 작업이 아니며, 사용할 수 없는 발급자 인증서를 만들어낼 수도 없습니다

서명 함수

함수설명
KeychainAvailableSecurity.framework과 CoreFoundation가 로드되고 서명에 필요한 모든 심볼이 해석되었으면 True를 반환합니다
KeychainMissingSymbols해석에 실패한 이름을 공백으로 구분해 반환하거나, 모두 바인딩되었으면 빈 문자열을 반환합니다
ConfigureKeychainSignerProviderTPdfKeychainSignerProvider를 만들어 PAdES 서명 백엔드로 설치하고 IPadesSignerProvider로 반환합니다
TPdfKeychainSignerProvider.Create선택적으로 기존 Keychain 파일을 지정해 identity 검색 범위를 제한합니다. 경로에 NUL 문자가 포함되거나 문자열 코드 유닛 4096개를 넘으면 거부합니다
TPdfKeychainSignerProvider.BackendName서명 공급자가 보고하는 백엔드 식별자를 반환합니다
TPdfKeychainSignerProvider.ResolveTPadesSignerOptions를 Keychain 아이덴티티와 대조하고 서명자, 인증서 DER, 체인을 담은 TPadesResolvedSigner를 반환합니다

검증 함수

함수설명
KeychainVerificationAvailableCMS 디코더, 신뢰 정책, 신뢰 평가 심볼이 해석되었으면 True를 반환합니다
ConfigureKeychainCmsVerifierTPdfKeychainCmsVerifier를 만들어 CMS 검증 백엔드로 설치하고 IPdfCmsVerifier로 반환합니다
ConfigureKeychainTrustAnchors이후 신뢰 평가마다 명시적 DER 앵커를 복제해 Keychain을 바꾸지 않고 시스템 앵커를 보완합니다. 상한은 인증서 64개, 각 4 MiB, 합계 16 MiB이며 빈 배열은 설정을 지웁니다
ConfigureKeychainOcspResponses네이티브 Security.framework 평가용으로 명시적 DER OCSP 증거를 복제합니다. 상한은 응답 8개, 각 1 MiB, 합계 4 MiB이며 빈 배열은 설정을 지웁니다
TPdfKeychainCmsVerifier.BackendName검증 백엔드가 보고하는 백엔드 식별자를 반환합니다
TPdfKeychainCmsVerifier.VerifyDetachedSegment1, Segment1Length, Segment2, Segment2Length로 기술된 두 호출자 소유 콘텐츠 세그먼트에 대해 detached CMS 값을 전달된 TPdfCmsVerifyOptions로 검증합니다
TPdfKeychainCmsVerifier.VerifyAttached자체 서명 콘텐츠를 담은 attached CMS 값을 전달된 TPdfCmsVerifyOptions로 검증합니다

타입

타입멤버와 용도
EPdfKeychainErrorSecurity.framework을 쓸 수 없거나, 요청된 서명자와 일치하는 Keychain 아이덴티티가 없거나, 플랫폼 서명 호출이 실패할 때 발생하는 예외입니다
TPdfKeychainSignerProviderBackendName과 Resolve를 갖추고 IPadesSignerProvider를 구현하는 PAdES 서명 백엔드입니다
TPdfKeychainCmsVerifierBackendName, VerifyDetached, VerifyAttached를 갖추고 IPdfCmsVerifier를 구현하는 CMS 검증 백엔드입니다

참고 사항

관련 항목

FPdfCryptoWin, FPdfCrypto, FPdfCryptoOcsp, FPdfCms, FPdfTrustedList, FPdfMac