diff --git a/DesktopEditor/common/File.h b/DesktopEditor/common/File.h index cb0a9c1cd4..c588e575b6 100644 --- a/DesktopEditor/common/File.h +++ b/DesktopEditor/common/File.h @@ -45,7 +45,8 @@ #include #endif -#define U_TO_UTF8(val) NSFile::CUtf8Converter::GetUtf8StringFromUnicode2(val.c_str(), val.length()) +#define U_TO_UTF8(val) NSFile::CUtf8Converter::GetUtf8StringFromUnicode2(val.c_str(), (LONG)val.length()) +#define UTF8_TO_U(val) NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)val.c_str(), (LONG)val.length()) #if defined(__linux__) || defined(_MAC) && !defined(_IOS) #include diff --git a/DesktopEditor/xmlsec/test/windows_list_serts/main.cpp b/DesktopEditor/xmlsec/test/windows_list_serts/main.cpp index fbb2860131..838a9a13ce 100644 --- a/DesktopEditor/xmlsec/test/windows_list_serts/main.cpp +++ b/DesktopEditor/xmlsec/test/windows_list_serts/main.cpp @@ -12,6 +12,8 @@ #include "../../../xml/include/xmlutils.h" #include "../../../xml/libxml2/include/libxml/c14n.h" +#include + #pragma comment (lib, "crypt32.lib") #pragma comment (lib, "cryptui.lib") #pragma comment (lib, "Advapi32.lib") @@ -682,7 +684,239 @@ bool Verify(PCCERT_CONTEXT pCertContext, std::wstring sFileXml, std::wstring sSi return (TRUE == oSigner.Verify(sXmlUtf8Prepare, sXmlUtf8Signature)); } +class COOXMLSigner +{ +public: + PCCERT_CONTEXT m_context; + std::wstring m_sFolder; + + CXmlSigner* m_signer; + +public: + COOXMLSigner(const std::wstring& sFolder, PCCERT_CONTEXT pContext) + { + m_sFolder = sFolder; + m_context = pContext; + m_signer = new CXmlSigner(pContext); + } + ~COOXMLSigner() + { + RELEASEOBJECT(m_signer); + } + + std::wstring GetReference(const std::wstring& file, const std::wstring& content_type) + { + std::wstring sXml = L"" + file + L"?ContentType=" + content_type + L"\">"; + sXml += L""; + sXml += L""; + sXml += UTF8_TO_U(m_signer->GetHash(m_sFolder + file)); + sXml += L""; + sXml += L""; + return sXml; + } + + std::string GetHashXml(const std::wstring& xml) + { + std::string sXmlSigned = U_TO_UTF8(xml); + sXmlSigned = CXmlCanonicalizator::Execute(sXmlSigned, XML_C14N_1_0); + return m_signer->GetHash(sXmlSigned); + } + + std::string GetReferenceMain(const std::wstring& xml, const std::wstring& id, const bool& isCannon = true) + { + std::wstring sXml1 = L""; + else + sXml1 += (L" Id=\"#" + id + L"\">"); + sXml1 += xml; + sXml1 += L""; + + std::string sHash = GetHashXml(sXml1); + + std::string sRet; + if (isCannon) + sRet = ""; + + sRet += ("" + sHash + ""); + + return sRet; + } + + std::wstring GetImageBase64(const std::wstring& file) + { + BYTE* pData = NULL; + DWORD dwLen = 0; + if (!NSFile::CFileBinary::ReadAllBytes(file, &pData, dwLen)) + return L""; + + char* pDataC = NULL; + int nLen = 0; + NSFile::CBase64Converter::Encode(pData, (int)dwLen, pDataC, nLen, NSBase64::B64_BASE64_FLAG_NOCRLF); + + std::wstring sReturn = NSFile::CUtf8Converter::GetUnicodeFromCharPtr(pDataC, (LONG)nLen, FALSE); + + RELEASEARRAYOBJECTS(pData); + RELEASEARRAYOBJECTS(pDataC); + + return sReturn; + } +}; + bool SignDocument(std::wstring sFolderOOXML, PCCERT_CONTEXT pCertContext) { + std::wstring sFolder = NSFile::GetProcessDirectory(); + + COOXMLSigner oOOXMLSigner(sFolderOOXML, pCertContext); + + std::string sSignedData; + std::wstring sXmlData; + + std::wstring sDataSign = L"2017-04-21T08:30:21Z"; + + sSignedData += "\ +"; + + if (true) + { + // idPackageObject + std::wstring sXml = L""; + + // TODO: rels + sXml += oOOXMLSigner.GetReference(L"/word/document.xml", L"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"); + sXml += oOOXMLSigner.GetReference(L"/word/fontTable.xml", L"application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"); + sXml += oOOXMLSigner.GetReference(L"/word/settings.xml", L"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"); + sXml += oOOXMLSigner.GetReference(L"/word/styles.xml", L"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"); + sXml += oOOXMLSigner.GetReference(L"/word/theme/theme1.xml", L"application/vnd.openxmlformats-officedocument.theme+xml"); + sXml += oOOXMLSigner.GetReference(L"/word/webSettings.xml", L"application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml"); + + sXml += L""; + + sXml += L""; + sXml += (L"\ +YYYY-MM-DDThh:mm:ssTZD\ +" + sDataSign + L"\ +"); + + sXmlData += (L"" + sXml + L""); + + sSignedData += ("" + + oOOXMLSigner.GetReferenceMain(sXml, L"idPackageObject") + ""); + } + + + std::wstring sImageValid = oOOXMLSigner.GetImageBase64(sFolder + L"/../../../resources/valig.png"); + std::wstring sImageInValid = oOOXMLSigner.GetImageBase64(sFolder + L"/../../../resources/invalig.png"); + + if (true) + { + // idOfficeObject + std::wstring sXml = L"\ +\ +\ +{A3CE98BA-4553-442D-8E43-CB07A2F83B85}\ +\ +" + sImageValid + L"\ +\ +10.0\ +16.0\ +16.0\ +2\ +1680\ +1050\ +32\ +{00000000-0000-0000-0000-000000000000}\ +\ +9\ +2\ +\ +\ +"; + + sXmlData += (L"" + sXml + L""); + + sSignedData += ("" + + oOOXMLSigner.GetReferenceMain(sXml, L"idOfficeObject") + ""); + } + + if (true) + { + std::string sNameA((char*)pCertContext->pCertInfo->Issuer.pbData, (int)pCertContext->pCertInfo->Issuer.cbData); + std::wstring sName = UTF8_TO_U(sNameA); + CBigInteger oInteger(pCertContext->pCertInfo->SerialNumber.pbData, (int)pCertContext->pCertInfo->SerialNumber.cbData); + + std::string sKeyA = oInteger.ToString(); + std::wstring sKey = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)sKeyA.c_str(), (LONG)sKeyA.length()); + + std::wstring sXml = (L"\ +" + sDataSign + L"\ +\ +\ +\ +\ +MJJT2Y0iMxaPGVXBmOLb9bY60pA=\ +\ +\ +CN=" + sName + L"\ +" + sKey + L"\ +\ +\ +\ +\ +\ +\ +"); + + std::wstring sSignedXml = L""; + sSignedXml += sXml; + sSignedXml += L""; + + sXmlData += L"\ +"; + sXmlData += sXml; + sXmlData += L""; + + sSignedData += "\ +\ +"; + + std::string sXmlTmp = CXmlCanonicalizator::Execute(U_TO_UTF8(sSignedXml), XML_C14N_1_0); + sSignedData += oOOXMLSigner.m_signer->GetHash(sXmlTmp); + + sSignedData += ""; + } + + if (true) + { + std::wstring sXml = sImageValid; + + sXmlData += (L"" + sXml + L""); + + sSignedData += ("" + + oOOXMLSigner.GetReferenceMain(sXml, L"idValidSigLnImg", false) + ""); + } + + if (true) + { + std::wstring sXml = sImageInValid; + + sXmlData += (L"" + sXml + L""); + + sSignedData += ("" + + oOOXMLSigner.GetReferenceMain(sXml, L"idInvalidSigLnImg", false) + ""); + } + + std::string sXmlPrepend = (""); + sXmlPrepend += sSignedData; + sXmlPrepend += ""; + + sXmlPrepend += ""; + sXmlPrepend += oOOXMLSigner.m_signer->Sign("" + sSignedData + ""); + sXmlPrepend += ""; + sXmlPrepend += ("" + oOOXMLSigner.m_signer->GetCertificateBase64() + ""); + + sXmlData = (UTF8_TO_U(sXmlPrepend) + sXmlData); + sXmlData += L""; + return true; }