diff options
Diffstat (limited to 'src/vm/comutilnative.cpp')
-rw-r--r-- | src/vm/comutilnative.cpp | 201 |
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; |