summaryrefslogtreecommitdiff
path: root/src/vm/comutilnative.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/comutilnative.cpp')
-rw-r--r--src/vm/comutilnative.cpp201
1 files changed, 14 insertions, 187 deletions
diff --git a/src/vm/comutilnative.cpp b/src/vm/comutilnative.cpp
index 94e3831502..766336ee7f 100644
--- a/src/vm/comutilnative.cpp
+++ b/src/vm/comutilnative.cpp
@@ -2997,14 +2997,11 @@ COMNlsHashProvider::COMNlsHashProvider()
{
LIMITED_METHOD_CONTRACT;
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- bUseRandomHashing = FALSE;
pEntropy = NULL;
pDefaultSeed = NULL;
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
}
-INT32 COMNlsHashProvider::HashString(LPCWSTR szStr, SIZE_T strLen, BOOL forceRandomHashing, INT64 additionalEntropy)
+INT32 COMNlsHashProvider::HashString(LPCWSTR szStr, SIZE_T strLen)
{
CONTRACTL {
THROWS;
@@ -3013,108 +3010,15 @@ INT32 COMNlsHashProvider::HashString(LPCWSTR szStr, SIZE_T strLen, BOOL forceRan
}
CONTRACTL_END;
-#ifndef FEATURE_RANDOMIZED_STRING_HASHING
- _ASSERTE(forceRandomHashing == false);
- _ASSERTE(additionalEntropy == 0);
-#endif
-
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- if(bUseRandomHashing || forceRandomHashing)
- {
- int marvinResult[SYMCRYPT_MARVIN32_RESULT_SIZE / sizeof(int)];
-
- if(additionalEntropy == 0)
- {
- SymCryptMarvin32(GetDefaultSeed(), (PCBYTE) szStr, strLen * sizeof(WCHAR), (PBYTE) &marvinResult);
- }
- else
- {
- SYMCRYPT_MARVIN32_EXPANDED_SEED seed;
- CreateMarvin32Seed(additionalEntropy, &seed);
- SymCryptMarvin32(&seed, (PCBYTE) szStr, strLen * sizeof(WCHAR), (PBYTE) &marvinResult);
- }
+ int marvinResult[SYMCRYPT_MARVIN32_RESULT_SIZE / sizeof(int)];
+
+ SymCryptMarvin32(GetDefaultSeed(), (PCBYTE) szStr, strLen * sizeof(WCHAR), (PBYTE) &marvinResult);
- return marvinResult[0] ^ marvinResult[1];
- }
- else
- {
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
- return ::HashString(szStr);
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- }
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
+ return marvinResult[0] ^ marvinResult[1];
}
-INT32 COMNlsHashProvider::HashSortKey(PCBYTE pSrc, SIZE_T cbSrc, BOOL forceRandomHashing, INT64 additionalEntropy)
-{
- CONTRACTL {
- THROWS;
- GC_NOTRIGGER;
- MODE_ANY;
- }
- CONTRACTL_END;
-
-#ifndef FEATURE_RANDOMIZED_STRING_HASHING
- _ASSERTE(forceRandomHashing == false);
- _ASSERTE(additionalEntropy == 0);
-#endif
-
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- if(bUseRandomHashing || forceRandomHashing)
- {
- int marvinResult[SYMCRYPT_MARVIN32_RESULT_SIZE / sizeof(int)];
-
- // Sort Keys are terminated with a null byte which we didn't hash using the old algorithm,
- // so we don't have it with Marvin32 either.
- if(additionalEntropy == 0)
- {
- SymCryptMarvin32(GetDefaultSeed(), pSrc, cbSrc - 1, (PBYTE) &marvinResult);
- }
- else
- {
- SYMCRYPT_MARVIN32_EXPANDED_SEED seed;
- CreateMarvin32Seed(additionalEntropy, &seed);
- SymCryptMarvin32(&seed, pSrc, cbSrc - 1, (PBYTE) &marvinResult);
- }
-
- return marvinResult[0] ^ marvinResult[1];
- }
- else
- {
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
- // Ok, lets build the hashcode -- mostly lifted from GetHashCode() in String.cs, for strings.
- int hash1 = 5381;
- int hash2 = hash1;
- const BYTE *pB = pSrc;
- BYTE c;
-
- while (pB != 0 && *pB != 0) {
- hash1 = ((hash1 << 5) + hash1) ^ *pB;
- c = pB[1];
-
- //
- // FUTURE: Update NewAPis::LCMapStringEx to perhaps use a different, bug free, Win32 API on Win2k3 to workaround the issue discussed below.
- //
- // On Win2k3 Server, LCMapStringEx(LCMAP_SORTKEY) output does not correspond to CompareString in all cases, breaking the .NET GetHashCode<->Equality Contract
- // Due to a fluke in our GetHashCode method, we avoided this issue due to the break out of the loop on the binary-zero byte.
- //
- if (c == 0)
- break;
-
- hash2 = ((hash2 << 5) + hash2) ^ c;
- pB += 2;
- }
-
- return hash1 + (hash2 * 1566083941);
-
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- }
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
-
-}
-
-INT32 COMNlsHashProvider::HashiStringKnownLower80(LPCWSTR szStr, INT32 strLen, BOOL forceRandomHashing, INT64 additionalEntropy)
+INT32 COMNlsHashProvider::HashSortKey(PCBYTE pSrc, SIZE_T cbSrc)
{
CONTRACTL {
THROWS;
@@ -3123,73 +3027,15 @@ INT32 COMNlsHashProvider::HashiStringKnownLower80(LPCWSTR szStr, INT32 strLen, B
}
CONTRACTL_END;
-#ifndef FEATURE_RANDOMIZED_STRING_HASHING
- _ASSERTE(forceRandomHashing == false);
- _ASSERTE(additionalEntropy == 0);
-#endif
-
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- if(bUseRandomHashing || forceRandomHashing)
- {
- WCHAR buf[SYMCRYPT_MARVIN32_INPUT_BLOCK_SIZE * 8];
- SYMCRYPT_MARVIN32_STATE marvinState;
- SYMCRYPT_MARVIN32_EXPANDED_SEED seed;
-
- if(additionalEntropy == 0)
- {
- SymCryptMarvin32Init(&marvinState, GetDefaultSeed());
- }
- else
- {
- CreateMarvin32Seed(additionalEntropy, &seed);
- SymCryptMarvin32Init(&marvinState, &seed);
- }
-
- LPCWSTR szEnd = szStr + strLen;
-
- const UINT A_TO_Z_RANGE = (UINT)('z' - 'a');
-
- while (szStr != szEnd)
- {
- size_t count = (sizeof(buf) / sizeof(buf[0]));
-
- if ((size_t)(szEnd - szStr) < count)
- count = (size_t)(szEnd - szStr);
-
- for (size_t i = 0; i<count; i++)
- {
- WCHAR c = szStr[i];
-
- if ((UINT)(c - 'a') <= A_TO_Z_RANGE) // if (c >='a' && c <= 'z')
- {
- //If we have a lowercase character, ANDing off 0x20
- // will make it an uppercase character.
- c &= ~0x20;
- }
-
- buf[i] = c;
- }
-
- szStr += count;
-
- SymCryptMarvin32Append(&marvinState, (PCBYTE) &buf, sizeof(WCHAR) * count);
- }
+ int marvinResult[SYMCRYPT_MARVIN32_RESULT_SIZE / sizeof(int)];
+
+ // Sort Keys are terminated with a null byte which we didn't hash using the old algorithm,
+ // so we don't have it with Marvin32 either.
+ SymCryptMarvin32(GetDefaultSeed(), pSrc, cbSrc - 1, (PBYTE) &marvinResult);
- int marvinResult[SYMCRYPT_MARVIN32_RESULT_SIZE / sizeof(int)];
- SymCryptMarvin32Result(&marvinState, (PBYTE) &marvinResult);
- return marvinResult[0] ^ marvinResult[1];
- }
- else
- {
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
- return ::HashiStringKnownLower80(szStr);
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- }
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
+ return marvinResult[0] ^ marvinResult[1];
}
-
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
void COMNlsHashProvider::InitializeDefaultSeed()
{
CONTRACTL {
@@ -3257,27 +3103,8 @@ PCBYTE COMNlsHashProvider::GetEntropy()
return (PCBYTE) pEntropy;
}
-
-void COMNlsHashProvider::CreateMarvin32Seed(INT64 additionalEntropy, PSYMCRYPT_MARVIN32_EXPANDED_SEED pExpandedMarvinSeed)
-{
- CONTRACTL {
- THROWS;
- GC_NOTRIGGER;
- MODE_ANY;
- }
- CONTRACTL_END;
-
- INT64 *pEntropy = (INT64*) GetEntropy();
- INT64 entropy;
-
- entropy = *pEntropy ^ additionalEntropy;
-
- SymCryptMarvin32ExpandSeed(pExpandedMarvinSeed, (PCBYTE) &entropy, SYMCRYPT_MARVIN32_SEED_SIZE);
-}
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
-
#ifdef FEATURE_COREFX_GLOBALIZATION
-INT32 QCALLTYPE CoreFxGlobalization::HashSortKey(PCBYTE pSortKey, INT32 cbSortKey, BOOL forceRandomizedHashing, INT64 additionalEntropy)
+INT32 QCALLTYPE CoreFxGlobalization::HashSortKey(PCBYTE pSortKey, INT32 cbSortKey)
{
QCALL_CONTRACT;
@@ -3285,7 +3112,7 @@ INT32 QCALLTYPE CoreFxGlobalization::HashSortKey(PCBYTE pSortKey, INT32 cbSortKe
BEGIN_QCALL;
- retVal = COMNlsHashProvider::s_NlsHashProvider.HashSortKey(pSortKey, cbSortKey, forceRandomizedHashing, additionalEntropy);
+ retVal = COMNlsHashProvider::s_NlsHashProvider.HashSortKey(pSortKey, cbSortKey);
END_QCALL;