EternalWindows
証明書管理 / PFXの検証

PFXファイルに格納されているデータは、PFXパケットと呼ばれることがあります。 PFX系の関数では、特定のデータがPFXパケットとして正しいかどうか、 また、特定のパスワードがPFXパケットを複合化できるかどうかを調べる関数があるため、 それらの呼び出し方を見ていきます。 まず、指定したデータがPFXパケットとして正しいかどうか調べるPFXIsPFXBlobからです。

BOOL WINAPI PFXIsPFXBlob(
  CRYPT_DATA_BLOB *pPFX
);

pPFXは、PFXパケットを格納したCRYPT_DATA_BLOB構造体のアドレスを指定します。 戻り値がTRUEである場合、pPFXがPFXパケットとして問題ないことを意味します。

次に示すPFXVerifyPasswordは、指定したパスワードがPFXパケットを複合化できるかを調べます。

BOOL WINAPI PFXVerifyPassword(
  CRYPT_DATA_BLOB *pPFX,
  LPCWSTR szPassword,
  DWORD dwFlags
);

pPFXは、PFXパケットを格納したCRYPT_DATA_BLOB構造体のアドレスを指定します。 szPasswordは、PFXパケットに対して検証するパスワードを指定します。 dwFlagsは、0を指定します。 戻り値がTRUEである場合、パスワードは正しいことになります。

今回のプログラムは、ファイルからデータを読み取り、 それがPFXファイルとして正しいかどうかを調べます。

#include <windows.h>

#pragma comment (lib, "crypt32.lib")

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	HANDLE          hFile;
	DWORD           dwReadByte;
	WCHAR           szPassword[] = L"pass";
	CRYPT_DATA_BLOB pfxPacket;

	hFile = CreateFile(TEXT("sample.pfx"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
		return 0;
	
	pfxPacket.cbData = GetFileSize(hFile, NULL);
	pfxPacket.pbData = (LPBYTE)CryptMemAlloc(pfxPacket.cbData);
	ReadFile(hFile, pfxPacket.pbData, pfxPacket.cbData, &dwReadByte, NULL);
	CloseHandle(hFile);
	
	if (!PFXIsPFXBlob(&pfxPacket)) {
		MessageBox(NULL, TEXT("PFX形式ではありません。"), NULL, MB_ICONWARNING);
		CryptMemFree(GetProcessHeap(), 0, pfxPacket.pbData);
		return 0;
	}
	
	if (!PFXVerifyPassword(&pfxPacket, szPassword, 0)) {
		MessageBox(NULL, TEXT("パスワードが不正です。"), NULL, MB_ICONWARNING);
		CryptMemFree(GetProcessHeap(), 0, pfxPacket.pbData);
		return 0;
	}
	
	MessageBox(NULL, TEXT("正常なPFXファイルです。"), TEXT("OK"), MB_OK);

	CryptMemFree(pfxPacket.pbData);
	
	return 0;
}

PFXパケットはPFXデータとサイズで構成されます。 PFXデータというのは、PFXファイルに格納されているデータそのものですから、 ファイルからファイルサイズ分データを読み取り、 それをpbDataメンバに指定すればよいことになります。


戻る