Ich habe einen SHA1-Hash und muss ihn signieren. Die Methode CryptSignHash() erfordert ein HCRYPTHASH-Handle zum Signieren. Ich erstelle es, und da ich den tatsächlichen Hash-Wert bereits habe, setze ich ihn:
CryptCreateHash(cryptoProvider, CALG_SHA1, 0, 0, &hash);
CryptSetHashParam(hash, HP_HASHVAL, hashBytes, 0);
Die HashBytes sind ein Array von 20 Bytes.
Das Problem ist jedoch, dass die von diesem HCRYPTHASH-Handle erzeugte Signatur falsch ist. Ich habe das Problem auf die Tatsache zurückgeführt, dass CAPI nicht alle 20 Bytes meines HashBytes-Arrays verwendet. Aus irgendeinem Grund denkt es, dass SHA1 nur 4 Bytes umfasst.
Um dies zu überprüfen, habe ich dieses kleine Programm geschrieben:
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);
Das Ergebnis ist: hashLength: 4 !
Kann mir jemand erklären, was ich falsch mache oder warum Microsoft CAPI denkt, dass SHA1 4 Bytes (32 Bits) statt 20 Bytes (160 Bits) ist.