度々失礼します。
実ファイル名からMD5で変換されたファイル名を取得するプログラムを作りたかったので
すが、CryptAcquireContext、CryptCreateHash、CryptHashDataは戻り値にTRUEが帰って
きているため正常に終了していると思うのですがCryptSignHashのところでFALSEが帰って
きて変換後のファイル名が取得できません。
検索をして見たのですがこれとほぼ同じ使い方で正常のケースしか見つからず原因がよく
分かりません。ご教授のほどをよろしくお願いします。
開発環境はWin2003Server、VC++6.0SDKです。
ソースは以下のようになっています。よろしくお願いします。
--------------------------------------------------------------------------------
int chg_md5(char* hash_md5)
{
HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
BOOL bResult;
char Buf[32+1];
char Signature[32+1];
DWORD SignLen;
int ret ;
hProv = 0 ;
hHash = 0 ;
hKey = 0 ;
SignLen = 32;
sprintf(Buf,%s,hash_md5);
ret = CryptAcquireContext( &hProv, NULL, NULL, PROV_RSA_FULL, 0 ) ;
if(ret != TRUE )
{
if(!CryptAcquireContext( &hProv, NULL
, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET ))
{
return 1;
}
}
ret = CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
ret = CryptHashData(hHash, Buf, 32, 0);
ret = CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, &SignLen);
ret = CryptSignHash(hHash, AT_SIGNATURE
, NULL, 0, Signature, &SignLen);
ret = CryptGetUserKey(hProv, AT_SIGNATURE, &hKey);
bResult = CryptVerifySignature(hHash, Signature
, SignLen, hKey, NULL, 0);
if(bResult){ ret = 0 ; }
else { ret = 1 ; }
CryptDestroyKey(hKey);
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
return ret;
}
--------------------------------------------------------------------------------
せめてGetLastErrorの結果どんなエラーが出ているのか位は添えるべきだと思うのですが。
あと、
ret = CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, Signature, &SignLen);
このときのSignLenは、Signatureのサイズを渡すようにとMSDNには書いてあるようです。
確認されましたか?
PATIOさんありがとうございます。
まずエラーNOですが、失念しておりました。
CryptSignHashの戻り値がNTE_BAD_KEYSET(鍵コンテナ生成は正常終了しているのに鍵コ
ンテナが存在していないと言われている?)でした。
SignLenについては調べてあったのですが修正漏れです。
修正して再実行してみましたが、エラーは同じものが帰ってきました。
この場合は署名の作成ではなく鍵の取得がおかしいのでしょうか?
以上です。よろしくお願いします。
キーペアの取得を単純に行った時に取得できますか?
もし出来ないのであれば、そのPCに使用するべきキーペアが存在しないと言う事では
ないかと思うのですが。
CryptSignHashを呼び出した直後のGetLastErrorがNTE_BAD_KEYSETと言う事であれば、
それが原因ではないかと思います。
キーペアの生成というのがどうやればいいのかと言うのは私もわかりませんけれど。
キーペア取得が出来なかったのでキー自体が存在しないようです。
また、自分のやりたいこと違うことをやっている可能性が出てきましたので出直して調べ
なおします。
PATIO様ありがとうございました。
解決は出来ていないですが、調査の時間がほしいので解決に変更しておきます。
