У меня есть хэш SHA1, и мне нужно его подписать. Метод CryptSignHash () требует дескриптор HCRYPTHASH для подписи. Я создаю его и, поскольку у меня уже есть фактическое значение хеш-функции, установите его:
CryptCreateHash(cryptoProvider, CALG_SHA1, 0, 0, &hash);
CryptSetHashParam(hash, HP_HASHVAL, hashBytes, 0);
hashBytes - это массив из 20 байтов.
Однако проблема в том, что подпись, созданная этим дескриптором HCRYPTHASH, неверна. Я проследил проблему до того факта, что CAPI фактически не использует все 20 байтов из моего массива hashBytes. По некоторым причинам он считает, что 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!
Может кто-нибудь объяснить, что я делаю неправильно или почему Microsoft CAPI считает, что SHA1 - это 4 байта (32 бита) вместо 20 байтов (160 бит).