rsaenh: Get rid of the hash idle state, native doesn't behave as though it has one.
This commit is contained in:
parent
8d051c81b2
commit
cd3954e7fd
|
@ -44,7 +44,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(crypt);
|
|||
*/
|
||||
#define RSAENH_MAGIC_HASH 0x85938417u
|
||||
#define RSAENH_MAX_HASH_SIZE 104
|
||||
#define RSAENH_HASHSTATE_IDLE 0
|
||||
#define RSAENH_HASHSTATE_HASHING 1
|
||||
#define RSAENH_HASHSTATE_FINISHED 2
|
||||
typedef struct _RSAENH_TLS1PRF_PARAMS
|
||||
|
@ -1598,7 +1597,7 @@ BOOL WINAPI RSAENH_CPCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey,
|
|||
pCryptHash->aiAlgid = Algid;
|
||||
pCryptHash->hKey = hKey;
|
||||
pCryptHash->hProv = hProv;
|
||||
pCryptHash->dwState = RSAENH_HASHSTATE_IDLE;
|
||||
pCryptHash->dwState = RSAENH_HASHSTATE_HASHING;
|
||||
pCryptHash->pHMACInfo = (PHMAC_INFO)NULL;
|
||||
pCryptHash->dwHashSize = peaAlgidInfo->dwDefaultLen >> 3;
|
||||
init_data_blob(&pCryptHash->tpPRFParams.blobLabel);
|
||||
|
@ -2629,11 +2628,6 @@ BOOL WINAPI RSAENH_CPGetHashParam(HCRYPTPROV hProv, HCRYPTHASH hHash, DWORD dwPa
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
if (pCryptHash->dwState == RSAENH_HASHSTATE_IDLE) {
|
||||
SetLastError(NTE_BAD_HASH_STATE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (pbData && (pCryptHash->dwState != RSAENH_HASHSTATE_FINISHED))
|
||||
{
|
||||
finalize_hash(pCryptHash);
|
||||
|
@ -3290,9 +3284,6 @@ BOOL WINAPI RSAENH_CPHashData(HCRYPTPROV hProv, HCRYPTHASH hHash, CONST BYTE *pb
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (pCryptHash->dwState == RSAENH_HASHSTATE_IDLE)
|
||||
pCryptHash->dwState = RSAENH_HASHSTATE_HASHING;
|
||||
|
||||
if (pCryptHash->dwState != RSAENH_HASHSTATE_HASHING)
|
||||
{
|
||||
SetLastError(NTE_BAD_HASH_STATE);
|
||||
|
|
|
@ -165,6 +165,9 @@ static void test_hashes(void)
|
|||
static const unsigned char md4hash[16] = {
|
||||
0x8e, 0x2a, 0x58, 0xbf, 0xf2, 0xf5, 0x26, 0x23,
|
||||
0x79, 0xd2, 0x92, 0x36, 0x1b, 0x23, 0xe3, 0x81 };
|
||||
static const unsigned char empty_md5hash[16] = {
|
||||
0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
|
||||
0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e };
|
||||
static const unsigned char md5hash[16] = {
|
||||
0x15, 0x76, 0xa9, 0x4d, 0x6c, 0xb3, 0x34, 0xdd,
|
||||
0x12, 0x6c, 0xb1, 0xc2, 0x7f, 0x19, 0xe0, 0xf2 };
|
||||
|
@ -227,13 +230,13 @@ static void test_hashes(void)
|
|||
result = CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
|
||||
ok(result, "%08x\n", GetLastError());
|
||||
|
||||
result = CryptHashData(hHash, (BYTE*)pbData, sizeof(pbData), 0);
|
||||
ok(result, "%08x\n", GetLastError());
|
||||
|
||||
len = sizeof(DWORD);
|
||||
result = CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&hashlen, &len, 0);
|
||||
ok(result && (hashlen == 16), "%08x, hashlen: %d\n", GetLastError(), hashlen);
|
||||
|
||||
result = CryptHashData(hHash, (BYTE*)pbData, sizeof(pbData), 0);
|
||||
ok(result, "%08x\n", GetLastError());
|
||||
|
||||
len = 16;
|
||||
result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &len, 0);
|
||||
ok(result, "%08x\n", GetLastError());
|
||||
|
@ -243,6 +246,36 @@ static void test_hashes(void)
|
|||
result = CryptDestroyHash(hHash);
|
||||
ok(result, "%08x\n", GetLastError());
|
||||
|
||||
result = CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
|
||||
ok(result, "%08x\n", GetLastError());
|
||||
|
||||
/* The hash is available even if CryptHashData hasn't been called */
|
||||
len = 16;
|
||||
result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &len, 0);
|
||||
ok(result, "%08x\n", GetLastError());
|
||||
|
||||
ok(!memcmp(pbHashValue, empty_md5hash, 16), "Wrong MD5 hash!\n");
|
||||
|
||||
/* It's also stable: getting it twice results in the same value */
|
||||
result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &len, 0);
|
||||
ok(result, "%08x\n", GetLastError());
|
||||
|
||||
ok(!memcmp(pbHashValue, empty_md5hash, 16), "Wrong MD5 hash!\n");
|
||||
|
||||
/* Can't add data after the hash been retrieved */
|
||||
SetLastError(0xdeadbeef);
|
||||
result = CryptHashData(hHash, (BYTE*)pbData, sizeof(pbData), 0);
|
||||
ok(!result && GetLastError() == NTE_BAD_HASH_STATE, "%08x\n", GetLastError());
|
||||
|
||||
/* You can still retrieve the hash, its value just hasn't changed */
|
||||
result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &len, 0);
|
||||
ok(result, "%08x\n", GetLastError());
|
||||
|
||||
ok(!memcmp(pbHashValue, empty_md5hash, 16), "Wrong MD5 hash!\n");
|
||||
|
||||
result = CryptDestroyHash(hHash);
|
||||
ok(result, "%08x\n", GetLastError());
|
||||
|
||||
/* SHA1 Hashing */
|
||||
result = CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash);
|
||||
ok(result, "%08x\n", GetLastError());
|
||||
|
|
Loading…
Reference in New Issue