mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-10 18:05:41 +08:00
add sha-256 hash agrorithm
This commit is contained in:
@ -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
|
||||
|
||||
@ -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_
|
||||
|
||||
@ -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 "";
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user