SHA1ハッシュがあり、署名する必要があります。CryptSignHash()メソッドには、署名用のHCRYPTHASHハンドルが必要です。私はそれを作成し、実際のハッシュ値をすでに持っているので、それを設定します:
CryptCreateHash(cryptoProvider, CALG_SHA1, 0, 0, &hash);
CryptSetHashParam(hash, HP_HASHVAL, hashBytes, 0);
hashBytesは20バイトの配列です。
ただし、問題は、このHCRYPTHASHハンドルから生成された署名が正しくないことです。問題は、CAPIがhashBytes配列の20バイトすべてを実際に使用しているわけではないという事実にまでさかのぼります。何らかの理由で、SHA1はわずか4バイトであると考えられます。
これを確認するために、私はこの小さなプログラムを作成しました。
HCRYPTPROV cryptoProvider;
CryptAcquireContext(&cryptoProvider, NULL, NULL, PROV_RSA_FULL, 0);
HCRYPTHASH hash;
HCRYPTKEY keyForHash;
CryptCreateHash(cryptoProvider, CALG_SHA1, keyForHash, 0, &hash);
DWORD hashLength;
CryptGetHashParam(hash, HP_HASHSIZE, NULL, &hashLength, 0);
printf("hashLength: %d\n", hashLength);
そしてこれはhashLengthを出力します:4!
誰かが私が間違っていることや、SHA1が20バイト(160ビット)ではなく4バイト(32ビット)であるとMicrosoftCAPIが考える理由を説明できますか?