add sha-256 hash agrorithm

This commit is contained in:
Oleg Korshul
2018-02-05 13:52:29 +03:00
parent b2fb7f0fe7
commit e15c75b6aa
3 changed files with 39 additions and 3 deletions

View File

@ -7,6 +7,7 @@
#define OOXML_HASH_ALG_SHA1 0
#define OOXML_HASH_ALG_INVALID 1
#define OOXML_HASH_ALG_SHA256 2
#define OPEN_SSL_WARNING_OK 0
#define OPEN_SSL_WARNING_ERR 1

View File

@ -206,11 +206,15 @@ public:
return sReturn;
}
virtual std::string GetHash(unsigned char* pData, unsigned int nSize, int nAlg)
virtual std::string GetHash(unsigned char* pData, unsigned int nSize, int nAlgS)
{
if (nAlg == OOXML_HASH_ALG_INVALID)
if (nAlgS == OOXML_HASH_ALG_INVALID)
return "";
int nAlg = nAlgS;
if ((nAlg == OOXML_HASH_ALG_SHA256) && !IsWindowsVistaOrGreater())
nAlg = OOXML_HASH_ALG_SHA1;
BOOL bResult = TRUE;
DWORD dwKeySpec = 0;
HCRYPTHASH hHash = NULL;
@ -222,7 +226,7 @@ public:
bResult = (NULL != m_context) ? CryptAcquireCertificatePrivateKey(m_context, 0, NULL, &hCryptProv, &dwKeySpec, NULL) : FALSE;
if (!bResult)
bResult = CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
bResult = CryptAcquireContext(&hCryptProv, NULL, NULL, (nAlg == OOXML_HASH_ALG_SHA256) ? PROV_RSA_AES : PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
if (!bResult)
return "";
@ -400,10 +404,27 @@ private:
{
case OOXML_HASH_ALG_SHA1:
return CALG_SHA1;
case OOXML_HASH_ALG_SHA256:
return CALG_SHA_256;
default:
return CALG_SHA1;
}
}
bool IsWindowsVistaOrGreater()
{
OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0, 0, 0, 0 };
DWORDLONG const dwlConditionMask = VerSetConditionMask(
VerSetConditionMask(VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL),
VER_MINORVERSION, VER_GREATER_EQUAL),
VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
osvi.dwMajorVersion = HIBYTE(_WIN32_WINNT_VISTA);
osvi.dwMinorVersion = LOBYTE(_WIN32_WINNT_VISTA);
osvi.wServicePackMajor = 0;
return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
}
};
#endif // _XMLSIGNER_MSCRYPTO_H_

View File

@ -255,6 +255,20 @@ public:
return sReturn;
}
else if (nAlg == OOXML_HASH_ALG_SHA256)
{
unsigned char obuf[32];
SHA256(pData, (size_t)nSize, obuf);
char* pBase64_hash = NULL;
int nBase64Len_hash = 0;
NSFile::CBase64Converter::Encode(obuf, 32, pBase64_hash, nBase64Len_hash, NSBase64::B64_BASE64_FLAG_NOCRLF);
std::string sReturn(pBase64_hash, nBase64Len_hash);
delete [] pBase64_hash;
return sReturn;
}
return "";
}