aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-03-02 14:18:38 -0600
committerSean Hall <r.sean.hall@gmail.com>2021-03-02 15:40:02 -0600
commit3bbf1347b900ec115a12faf8f46965c9b7649696 (patch)
treeb5efc30d8990249c3bd047591c6e63549d130bdd
parent931d4e4d641155ab0c90fe7717abb12db4736317 (diff)
downloadwix-3bbf1347b900ec115a12faf8f46965c9b7649696.tar.gz
wix-3bbf1347b900ec115a12faf8f46965c9b7649696.tar.bz2
wix-3bbf1347b900ec115a12faf8f46965c9b7649696.zip
Add SHA512 support to apuputil.
#3992
-rw-r--r--src/dutil/apuputil.cpp35
-rw-r--r--src/dutil/inc/apuputil.h1
-rw-r--r--src/dutil/inc/cryputil.h3
3 files changed, 29 insertions, 10 deletions
diff --git a/src/dutil/apuputil.cpp b/src/dutil/apuputil.cpp
index 5bbdb8dd..bf655ecc 100644
--- a/src/dutil/apuputil.cpp
+++ b/src/dutil/apuputil.cpp
@@ -2,13 +2,11 @@
2 2
3#include "precomp.h" 3#include "precomp.h"
4 4
5#define SHA256_DIGEST_LEN 32
6
7// prototypes 5// prototypes
8static HRESULT ProcessEntry( 6static HRESULT ProcessEntry(
9 __in ATOM_ENTRY* pAtomEntry, 7 __in ATOM_ENTRY* pAtomEntry,
10 __in LPCWSTR wzDefaultAppId, 8 __in LPCWSTR wzDefaultAppId,
11 __out APPLICATION_UPDATE_ENTRY* pApupEntry 9 __inout APPLICATION_UPDATE_ENTRY* pApupEntry
12 ); 10 );
13static HRESULT ParseEnclosure( 11static HRESULT ParseEnclosure(
14 __in ATOM_LINK* pLink, 12 __in ATOM_LINK* pLink,
@@ -192,7 +190,7 @@ extern "C" void DAPI ApupFreeChain(
192static HRESULT ProcessEntry( 190static HRESULT ProcessEntry(
193 __in ATOM_ENTRY* pAtomEntry, 191 __in ATOM_ENTRY* pAtomEntry,
194 __in LPCWSTR wzDefaultAppId, 192 __in LPCWSTR wzDefaultAppId,
195 __out APPLICATION_UPDATE_ENTRY* pApupEntry 193 __inout APPLICATION_UPDATE_ENTRY* pApupEntry
196 ) 194 )
197{ 195{
198 HRESULT hr = S_OK; 196 HRESULT hr = S_OK;
@@ -325,6 +323,9 @@ static HRESULT ParseEnclosure(
325 ) 323 )
326{ 324{
327 HRESULT hr = S_OK; 325 HRESULT hr = S_OK;
326 DWORD dwDigestLength = 0;
327 DWORD dwDigestStringLength = 0;
328 size_t cchDigestString = 0;
328 329
329 // First search the ATOM link's custom elements to try and find the application update enclosure information. 330 // First search the ATOM link's custom elements to try and find the application update enclosure information.
330 for (ATOM_UNKNOWN_ELEMENT* pElement = pLink->pUnknownElements; pElement; pElement = pElement->pNext) 331 for (ATOM_UNKNOWN_ELEMENT* pElement = pLink->pUnknownElements; pElement; pElement = pElement->pNext)
@@ -333,36 +334,50 @@ static HRESULT ParseEnclosure(
333 { 334 {
334 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, L"digest", -1, pElement->wzElement, -1)) 335 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, L"digest", -1, pElement->wzElement, -1))
335 { 336 {
336 // Find the digest[@algorithm='sha256'] which is required. Everything else is ignored. 337 // Find the digest[@algorithm] which is required. Everything else is ignored.
337 for (ATOM_UNKNOWN_ATTRIBUTE* pAttribute = pElement->pAttributes; pAttribute; pAttribute = pAttribute->pNext) 338 for (ATOM_UNKNOWN_ATTRIBUTE* pAttribute = pElement->pAttributes; pAttribute; pAttribute = pAttribute->pNext)
338 { 339 {
340 dwDigestLength = 0;
339 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, L"algorithm", -1, pAttribute->wzAttribute, -1)) 341 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, L"algorithm", -1, pAttribute->wzAttribute, -1))
340 { 342 {
341 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, L"md5", -1, pAttribute->wzValue, -1)) 343 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, L"md5", -1, pAttribute->wzValue, -1))
342 { 344 {
343 pEnclosure->digestAlgorithm = APUP_HASH_ALGORITHM_MD5; 345 pEnclosure->digestAlgorithm = APUP_HASH_ALGORITHM_MD5;
346 dwDigestLength = MD5_HASH_LEN;
344 } 347 }
345 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, L"sha1", -1, pAttribute->wzValue, -1)) 348 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, L"sha1", -1, pAttribute->wzValue, -1))
346 { 349 {
347 pEnclosure->digestAlgorithm = APUP_HASH_ALGORITHM_SHA1; 350 pEnclosure->digestAlgorithm = APUP_HASH_ALGORITHM_SHA1;
351 dwDigestLength = SHA1_HASH_LEN;
348 } 352 }
349 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, L"sha256", -1, pAttribute->wzValue, -1)) 353 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, L"sha256", -1, pAttribute->wzValue, -1))
350 { 354 {
351 pEnclosure->digestAlgorithm = APUP_HASH_ALGORITHM_SHA256; 355 pEnclosure->digestAlgorithm = APUP_HASH_ALGORITHM_SHA256;
356 dwDigestLength = SHA256_HASH_LEN;
357 }
358 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, L"sha512", -1, pAttribute->wzValue, -1))
359 {
360 pEnclosure->digestAlgorithm = APUP_HASH_ALGORITHM_SHA512;
361 dwDigestLength = SHA512_HASH_LEN;
352 } 362 }
353 break; 363 break;
354 } 364 }
355 } 365 }
356 366
357 if (APUP_HASH_ALGORITHM_SHA256 == pEnclosure->digestAlgorithm) 367 if (dwDigestLength)
358 { 368 {
359 if (64 != lstrlenW(pElement->wzValue)) 369 dwDigestStringLength = 2 * dwDigestLength;
370
371 hr = ::StringCchLengthW(pElement->wzValue, STRSAFE_MAX_CCH, &cchDigestString);
372 ExitOnFailure(hr, "Failed to get string length of digest value.");
373
374 if (dwDigestStringLength != cchDigestString)
360 { 375 {
361 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); 376 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
362 ExitOnRootFailure(hr, "Invalid digest length for SHA256 algorithm."); 377 ExitOnRootFailure(hr, "Invalid digest length (%zu) for digest algorithm (%u).", cchDigestString, dwDigestStringLength);
363 } 378 }
364 379
365 pEnclosure->cbDigest = sizeof(BYTE) * SHA256_DIGEST_LEN; 380 pEnclosure->cbDigest = sizeof(BYTE) * dwDigestLength;
366 pEnclosure->rgbDigest = static_cast<BYTE*>(MemAlloc(pEnclosure->cbDigest, TRUE)); 381 pEnclosure->rgbDigest = static_cast<BYTE*>(MemAlloc(pEnclosure->cbDigest, TRUE));
367 ExitOnNull(pEnclosure->rgbDigest, hr, E_OUTOFMEMORY, "Failed to allocate memory for digest."); 382 ExitOnNull(pEnclosure->rgbDigest, hr, E_OUTOFMEMORY, "Failed to allocate memory for digest.");
368 383
diff --git a/src/dutil/inc/apuputil.h b/src/dutil/inc/apuputil.h
index 15d42f5d..f26a12b7 100644
--- a/src/dutil/inc/apuputil.h
+++ b/src/dutil/inc/apuputil.h
@@ -18,6 +18,7 @@ typedef enum APUP_HASH_ALGORITHM
18 APUP_HASH_ALGORITHM_MD5, 18 APUP_HASH_ALGORITHM_MD5,
19 APUP_HASH_ALGORITHM_SHA1, 19 APUP_HASH_ALGORITHM_SHA1,
20 APUP_HASH_ALGORITHM_SHA256, 20 APUP_HASH_ALGORITHM_SHA256,
21 APUP_HASH_ALGORITHM_SHA512,
21} APUP_HASH_ALGORITHM; 22} APUP_HASH_ALGORITHM;
22 23
23 24
diff --git a/src/dutil/inc/cryputil.h b/src/dutil/inc/cryputil.h
index 88aa784d..02492d8a 100644
--- a/src/dutil/inc/cryputil.h
+++ b/src/dutil/inc/cryputil.h
@@ -11,7 +11,10 @@ extern "C" {
11 11
12// Use CRYPTPROTECTMEMORY_BLOCK_SIZE, because it's larger and thus more restrictive than RTL_ENCRYPT_MEMORY_SIZE. 12// Use CRYPTPROTECTMEMORY_BLOCK_SIZE, because it's larger and thus more restrictive than RTL_ENCRYPT_MEMORY_SIZE.
13#define CRYP_ENCRYPT_MEMORY_SIZE CRYPTPROTECTMEMORY_BLOCK_SIZE 13#define CRYP_ENCRYPT_MEMORY_SIZE CRYPTPROTECTMEMORY_BLOCK_SIZE
14#define MD5_HASH_LEN 16
14#define SHA1_HASH_LEN 20 15#define SHA1_HASH_LEN 20
16#define SHA256_HASH_LEN 32
17#define SHA512_HASH_LEN 64
15 18
16typedef NTSTATUS (APIENTRY *PFN_RTLENCRYPTMEMORY)( 19typedef NTSTATUS (APIENTRY *PFN_RTLENCRYPTMEMORY)(
17 __inout PVOID Memory, 20 __inout PVOID Memory,