// Cert361.cpp
//
//  注意:
//	Crypt32.lib以外にCryptui.libをリンクしてください。
//	このサンプルは、WindowXPとWindows Server 2003 でのみ動作します。
//

#include "stdafx.h"
#include <Windows.h>
#include <WinCrypt.h>
#include <CryptuiAPI.h>

int _tmain(int argc, _TCHAR* argv[])
{
	HCRYPTPROV	hProv;
	HCERTSTORE	hStore;

	//	CSPハンドルの取得
	if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, NULL))
	{
		if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
		{
			fprintf(stderr, "CryptAcquireContext error\n");
			return 1;
		}
	}

	//	証明書ストアーのオープン
	hStore = CertOpenSystemStore(
				hProv,
				"MY");
	if(!hStore)
	{
		fprintf(stderr, "CertOpenSystemStore error\n");
		return 2;
	}

	//	電子証明書の取り出し
	PCCERT_CONTEXT	pcCert;
	pcCert = CryptUIDlgSelectCertificateFromStore(
							hStore,
							NULL,
							NULL,
							NULL,
							0,
							0,
							NULL);
	if(!pcCert)
	{
		CertCloseStore(hStore, 0);
		CryptReleaseContext(hProv, 0);
		return 1;
	}

	//	利用期間の検証
	switch(CertVerifyTimeValidity(
							NULL,				//	今現在の時刻と比較
							pcCert->pCertInfo))	//	検証される電子証明書情報
	{
	case -1:
		printf("電子証明書の利用開始日に至っていません。\n");
		break;
	case  0:
		printf("電子証明書の利用期間内です。\n");
		break;
	case +1:
		printf("電子証明書の利用期間を過ぎています。\n");
		break;
	}

	//	後始末
	CertFreeCertificateContext(pcCert);
	CertCloseStore(hStore, 0);
	CryptReleaseContext(hProv, 0);

	return 0;
}