@@ -183,14 +183,13 @@ static std::vector<BYTE> CalculateFileSha256(HANDLE hFile) {
183
183
}
184
184
185
185
HMODULE VerifyAndLoadAnalyticsLibrary (
186
- const wchar_t * library_filename, // This is expected to be just the DLL
187
- // filename e.g. "analytics_win.dll"
188
- const unsigned char * expected_hash, size_t expected_hash_size) {
186
+ const wchar_t * library_filename,
187
+ const std::vector<std::vector<unsigned char >>& allowed_hashes) {
189
188
if (library_filename == nullptr || library_filename[0 ] == L' \0 ' ) {
190
189
LogError (LOG_TAG " Invalid arguments." );
191
190
return nullptr ;
192
191
}
193
- if (expected_hash == nullptr || expected_hash_size == 0 ) {
192
+ if (allowed_hashes. empty () ) {
194
193
// Don't check the hash, just load the library.
195
194
LogWarning (LOG_TAG " No hash provided, using unverified Analytics DLL." );
196
195
return LoadLibraryW (library_filename);
@@ -251,15 +250,23 @@ HMODULE VerifyAndLoadAnalyticsLibrary(
251
250
if (calculated_hash.empty ()) {
252
251
LogError (LOG_TAG " Hash failed for Analytics DLL." );
253
252
} else {
254
- if (calculated_hash.size () != expected_hash_size) {
255
- LogError (LOG_TAG
256
- " Hash size mismatch for Analytics DLL. Expected: %zu, "
257
- " Calculated: %zu." ,
258
- expected_hash_size, calculated_hash.size ());
259
- } else if (memcmp (calculated_hash.data (), expected_hash,
260
- expected_hash_size) != 0 ) {
261
- LogError (LOG_TAG " Hash mismatch for Analytics DLL." );
262
- } else {
253
+ bool hash_matched = false ;
254
+ for (const auto & expected_hash : allowed_hashes) {
255
+ if (calculated_hash.size () != expected_hash.size ()) {
256
+ LogVerbose (LOG_TAG
257
+ " Hash size mismatch for Analytics DLL. Expected: %zu, "
258
+ " Calculated: %zu. Trying next allowed hash." ,
259
+ expected_hash.size (), calculated_hash.size ());
260
+ continue ;
261
+ }
262
+ if (memcmp (calculated_hash.data (), expected_hash.data (),
263
+ expected_hash.size ()) == 0 ) {
264
+ hash_matched = true ;
265
+ break ;
266
+ }
267
+ }
268
+
269
+ if (hash_matched) {
263
270
LogDebug (LOG_TAG " Successfully verified Analytics DLL." );
264
271
// Load the library. When loading with a full path string, other
265
272
// directories are not searched.
@@ -269,6 +276,8 @@ HMODULE VerifyAndLoadAnalyticsLibrary(
269
276
LogError (LOG_TAG " Library load failed for Analytics DLL. Error: %u" ,
270
277
dwError);
271
278
}
279
+ } else {
280
+ LogError (LOG_TAG " Hash mismatch for Analytics DLL." );
272
281
}
273
282
}
274
283
0 commit comments