mirror of
https://github.com/Kitware/CMake.git
synced 2026-04-30 02:59:22 -05:00
cmSystemTools: move ComputeCertificateThumbprint to the only consumer
There's no need to have this API on `cmSystemTools` with only a single consumer.
This commit is contained in:
@@ -47,12 +47,6 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(CMAKE_BOOTSTRAP)
|
|
||||||
# if defined(_WIN32)
|
|
||||||
# include <cm/memory>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CMake_USE_MACH_PARSER)
|
#if defined(CMake_USE_MACH_PARSER)
|
||||||
# include "cmMachO.h"
|
# include "cmMachO.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -1307,76 +1301,6 @@ void cmSystemTools::MoveFileIfDifferent(const std::string& source,
|
|||||||
RemoveFile(source);
|
RemoveFile(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CMAKE_BOOTSTRAP
|
|
||||||
# ifdef _WIN32
|
|
||||||
std::string cmSystemTools::ComputeCertificateThumbprint(
|
|
||||||
const std::string& source)
|
|
||||||
{
|
|
||||||
std::string thumbprint;
|
|
||||||
|
|
||||||
CRYPT_INTEGER_BLOB cryptBlob;
|
|
||||||
HCERTSTORE certStore = nullptr;
|
|
||||||
PCCERT_CONTEXT certContext = nullptr;
|
|
||||||
|
|
||||||
HANDLE certFile = CreateFileW(
|
|
||||||
cmsys::Encoding::ToWide(source.c_str()).c_str(), GENERIC_READ,
|
|
||||||
FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
|
|
||||||
|
|
||||||
if (certFile != INVALID_HANDLE_VALUE && certFile != nullptr) {
|
|
||||||
DWORD fileSize = GetFileSize(certFile, nullptr);
|
|
||||||
if (fileSize != INVALID_FILE_SIZE) {
|
|
||||||
auto certData = cm::make_unique<BYTE[]>(fileSize);
|
|
||||||
if (certData != nullptr) {
|
|
||||||
DWORD dwRead = 0;
|
|
||||||
if (ReadFile(certFile, certData.get(), fileSize, &dwRead, nullptr)) {
|
|
||||||
cryptBlob.cbData = fileSize;
|
|
||||||
cryptBlob.pbData = certData.get();
|
|
||||||
|
|
||||||
// Verify that this is a valid cert
|
|
||||||
if (PFXIsPFXBlob(&cryptBlob)) {
|
|
||||||
// Open the certificate as a store
|
|
||||||
certStore =
|
|
||||||
PFXImportCertStore(&cryptBlob, nullptr, CRYPT_EXPORTABLE);
|
|
||||||
if (certStore != nullptr) {
|
|
||||||
// There should only be 1 cert.
|
|
||||||
certContext =
|
|
||||||
CertEnumCertificatesInStore(certStore, certContext);
|
|
||||||
if (certContext != nullptr) {
|
|
||||||
// The hash is 20 bytes
|
|
||||||
BYTE hashData[20];
|
|
||||||
DWORD hashLength = 20;
|
|
||||||
|
|
||||||
// Buffer to print the hash. Each byte takes 2 chars +
|
|
||||||
// terminating character
|
|
||||||
char hashPrint[41];
|
|
||||||
char* pHashPrint = hashPrint;
|
|
||||||
// Get the hash property from the certificate
|
|
||||||
if (CertGetCertificateContextProperty(
|
|
||||||
certContext, CERT_HASH_PROP_ID, hashData, &hashLength)) {
|
|
||||||
for (DWORD i = 0; i < hashLength; i++) {
|
|
||||||
// Convert each byte to hexadecimal
|
|
||||||
snprintf(pHashPrint, 3, "%02X", hashData[i]);
|
|
||||||
pHashPrint += 2;
|
|
||||||
}
|
|
||||||
*pHashPrint = '\0';
|
|
||||||
thumbprint = hashPrint;
|
|
||||||
}
|
|
||||||
CertFreeCertificateContext(certContext);
|
|
||||||
}
|
|
||||||
CertCloseStore(certStore, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CloseHandle(certFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
return thumbprint;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void cmSystemTools::Glob(const std::string& directory,
|
void cmSystemTools::Glob(const std::string& directory,
|
||||||
const std::string& regexp,
|
const std::string& regexp,
|
||||||
std::vector<std::string>& files)
|
std::vector<std::string>& files)
|
||||||
|
|||||||
@@ -213,13 +213,6 @@ public:
|
|||||||
static void MoveFileIfDifferent(const std::string& source,
|
static void MoveFileIfDifferent(const std::string& source,
|
||||||
const std::string& destination);
|
const std::string& destination);
|
||||||
|
|
||||||
#ifndef CMAKE_BOOTSTRAP
|
|
||||||
# ifdef _WIN32
|
|
||||||
//! Get the SHA thumbprint for a certificate file
|
|
||||||
static std::string ComputeCertificateThumbprint(const std::string& source);
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run a single executable command
|
* Run a single executable command
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
#include <cmext/string_view>
|
#include <cmext/string_view>
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
// include wincrypt.h after windows.h
|
||||||
|
#include <wincrypt.h>
|
||||||
|
|
||||||
#include "cmsys/FStream.hxx"
|
#include "cmsys/FStream.hxx"
|
||||||
#include "cmsys/RegularExpression.hxx"
|
#include "cmsys/RegularExpression.hxx"
|
||||||
@@ -4867,6 +4869,73 @@ void cmVisualStudio10TargetGenerator::WriteSingleSDKReference(
|
|||||||
.Attribute("Include", cmStrCat(extension, ", Version=", version));
|
.Attribute("Include", cmStrCat(extension, ", Version=", version));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
std::string ComputeCertificateThumbprint(const std::string& source)
|
||||||
|
{
|
||||||
|
std::string thumbprint;
|
||||||
|
|
||||||
|
CRYPT_INTEGER_BLOB cryptBlob;
|
||||||
|
HCERTSTORE certStore = nullptr;
|
||||||
|
PCCERT_CONTEXT certContext = nullptr;
|
||||||
|
|
||||||
|
HANDLE certFile = CreateFileW(
|
||||||
|
cmsys::Encoding::ToWide(source.c_str()).c_str(), GENERIC_READ,
|
||||||
|
FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
|
||||||
|
|
||||||
|
if (certFile != INVALID_HANDLE_VALUE && certFile != nullptr) {
|
||||||
|
DWORD fileSize = GetFileSize(certFile, nullptr);
|
||||||
|
if (fileSize != INVALID_FILE_SIZE) {
|
||||||
|
auto certData = cm::make_unique<BYTE[]>(fileSize);
|
||||||
|
if (certData != nullptr) {
|
||||||
|
DWORD dwRead = 0;
|
||||||
|
if (ReadFile(certFile, certData.get(), fileSize, &dwRead, nullptr)) {
|
||||||
|
cryptBlob.cbData = fileSize;
|
||||||
|
cryptBlob.pbData = certData.get();
|
||||||
|
|
||||||
|
// Verify that this is a valid cert
|
||||||
|
if (PFXIsPFXBlob(&cryptBlob)) {
|
||||||
|
// Open the certificate as a store
|
||||||
|
certStore =
|
||||||
|
PFXImportCertStore(&cryptBlob, nullptr, CRYPT_EXPORTABLE);
|
||||||
|
if (certStore != nullptr) {
|
||||||
|
// There should only be 1 cert.
|
||||||
|
certContext =
|
||||||
|
CertEnumCertificatesInStore(certStore, certContext);
|
||||||
|
if (certContext != nullptr) {
|
||||||
|
// The hash is 20 bytes
|
||||||
|
BYTE hashData[20];
|
||||||
|
DWORD hashLength = 20;
|
||||||
|
|
||||||
|
// Buffer to print the hash. Each byte takes 2 chars +
|
||||||
|
// terminating character
|
||||||
|
char hashPrint[41];
|
||||||
|
char* pHashPrint = hashPrint;
|
||||||
|
// Get the hash property from the certificate
|
||||||
|
if (CertGetCertificateContextProperty(
|
||||||
|
certContext, CERT_HASH_PROP_ID, hashData, &hashLength)) {
|
||||||
|
for (DWORD i = 0; i < hashLength; i++) {
|
||||||
|
// Convert each byte to hexadecimal
|
||||||
|
snprintf(pHashPrint, 3, "%02X", hashData[i]);
|
||||||
|
pHashPrint += 2;
|
||||||
|
}
|
||||||
|
*pHashPrint = '\0';
|
||||||
|
thumbprint = hashPrint;
|
||||||
|
}
|
||||||
|
CertFreeCertificateContext(certContext);
|
||||||
|
}
|
||||||
|
CertCloseStore(certStore, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CloseHandle(certFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
return thumbprint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void cmVisualStudio10TargetGenerator::WriteWinRTPackageCertificateKeyFile(
|
void cmVisualStudio10TargetGenerator::WriteWinRTPackageCertificateKeyFile(
|
||||||
Elem& e0)
|
Elem& e0)
|
||||||
{
|
{
|
||||||
@@ -4913,14 +4982,14 @@ void cmVisualStudio10TargetGenerator::WriteWinRTPackageCertificateKeyFile(
|
|||||||
}
|
}
|
||||||
|
|
||||||
e1.Element("PackageCertificateKeyFile", pfxFile);
|
e1.Element("PackageCertificateKeyFile", pfxFile);
|
||||||
std::string thumb = cmSystemTools::ComputeCertificateThumbprint(pfxFile);
|
std::string thumb = ComputeCertificateThumbprint(pfxFile);
|
||||||
if (!thumb.empty()) {
|
if (!thumb.empty()) {
|
||||||
e1.Element("PackageCertificateThumbprint", thumb);
|
e1.Element("PackageCertificateThumbprint", thumb);
|
||||||
}
|
}
|
||||||
} else if (!pfxFile.empty()) {
|
} else if (!pfxFile.empty()) {
|
||||||
Elem e1(e0, "PropertyGroup");
|
Elem e1(e0, "PropertyGroup");
|
||||||
e1.Element("PackageCertificateKeyFile", pfxFile);
|
e1.Element("PackageCertificateKeyFile", pfxFile);
|
||||||
std::string thumb = cmSystemTools::ComputeCertificateThumbprint(pfxFile);
|
std::string thumb = ComputeCertificateThumbprint(pfxFile);
|
||||||
if (!thumb.empty()) {
|
if (!thumb.empty()) {
|
||||||
e1.Element("PackageCertificateThumbprint", thumb);
|
e1.Element("PackageCertificateThumbprint", thumb);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user