CryptoAPI の CERT_CHAIN_ENGINE_CONFIG 構造体 の Windows 7 /Windows Server 2008 R2 での拡張

Windows の CryptoAPIに、証明書パスエンジンを作成する CertCreateCertificateChainEngine というAPIがある。

CertCreateCertificateChainEngine Function (Windows)
http://msdn.microsoft.com/en-us/library/aa376032%28VS.85%29.aspx

このAPIの引数になっている CERT_CHAIN_ENGINE_CONFIG 構造体 は Windows 7 と Windows Server 2008 R2 対応の SDK (V7.0)で拡張が行われた。

--

typedef struct _CERT_CHAIN_ENGINE_CONFIG {

DWORD       cbSize;
HCERTSTORE  hRestrictedRoot;
HCERTSTORE  hRestrictedTrust;
HCERTSTORE  hRestrictedOther;
DWORD       cAdditionalStore;
HCERTSTORE* rghAdditionalStore;
DWORD       dwFlags;
DWORD       dwUrlRetrievalTimeout;      // milliseconds
DWORD       MaximumCachedCertificates;
DWORD       CycleDetectionModulus;

#if (NTDDI_VERSION >= NTDDI_WIN7)
HCERTSTORE  hExclusiveRoot;
HCERTSTORE  hExclusiveTrustedPeople;
#endif

} CERT_CHAIN_ENGINE_CONFIG, *PCERT_CHAIN_ENGINE_CONFIG;

CERT_CHAIN_ENGINE_CONFIG Structure (Windows)
http://msdn.microsoft.com/en-us/library/aa377184(v=VS.85).aspx

hExclusiveRoot と hExclusiveTrustedPeople メンバは、
> Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP, and Windows 2000:  This member is not supported.

上記の赤い部分はSDK 7.0 のベータ段階では含まれてなかったので、(無いとは思うけど)ベータ段階である程度の実装/テストを終えているような場合は見直し・注意が必要だ。

下記のように構造体を初期化しているならば、OSのバージョンが違ってもAPIの動作には特に影響はないはずだ。
※通常、APIは cbSize の値をきちんと見ているはずなのでSecureZeroMemoryによる初期化は無くても良いと思う。ちなみにMSのAPIサンプルにも入ってない。だが SecureZeroMemory は速度優先部分でないのであれば入れても良いのではと思う。今回の場合、APIがcbSizeを見てないような動きをしていたので入れてみた。

--

// 検証エンジンの作成
CERT_CHAIN_ENGINE_CONFIG chainConfig;
::SecureZeroMemory(&chainConfig, sizeof (CERT_CHAIN_ENGINE_CONFIG));
chainConfig.cbSize                        = sizeof (CERT_CHAIN_ENGINE_CONFIG);
chainConfig.hRestrictedRoot               = NULL;
chainConfig.hRestrictedTrust              = NULL;
chainConfig.hRestrictedOther              = NULL;
chainConfig.cAdditionalStore              = 0;
chainConfig.rghAdditionalStore            = NULL;
chainConfig.dwFlags                       = dwFlagsCreateConfig;
chainConfig.dwUrlRetrievalTimeout         = 0;
chainConfig.MaximumCachedCertificates     = 0;
chainConfig.CycleDetectionModulus         = 0;

// 「証明書パスエンジン」を作成する
if (::CertCreateCertificateChainEngine(&chainConfig, phChainEngine))
{

SecureZeroMemory function (Windows)
http://msdn.microsoft.com/ja-jp/library/windows/desktop/aa366877%28v=vs.85%29.aspx

Livedoor タグ: ,,,
広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください