Blame winpr/libwinpr/crypto/crypto.c

Packit Service fa4841
/**
Packit Service fa4841
 * WinPR: Windows Portable Runtime
Packit Service fa4841
 * Cryptography API (CryptoAPI)
Packit Service fa4841
 *
Packit Service fa4841
 * Copyright 2012-2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifdef HAVE_CONFIG_H
Packit Service fa4841
#include "config.h"
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#include <winpr/crypto.h>
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * CryptAcquireCertificatePrivateKey
Packit Service fa4841
 * CryptBinaryToStringA
Packit Service fa4841
 * CryptBinaryToStringW
Packit Service fa4841
 * CryptCloseAsyncHandle
Packit Service fa4841
 * CryptCreateAsyncHandle
Packit Service fa4841
 * CryptCreateKeyIdentifierFromCSP
Packit Service fa4841
 * CryptDecodeMessage
Packit Service fa4841
 * CryptDecodeObject
Packit Service fa4841
 * CryptDecodeObjectEx
Packit Service fa4841
 * CryptDecryptAndVerifyMessageSignature
Packit Service fa4841
 * CryptDecryptMessage
Packit Service fa4841
 * CryptEncodeObject
Packit Service fa4841
 * CryptEncodeObjectEx
Packit Service fa4841
 * CryptEncryptMessage
Packit Service fa4841
 * CryptEnumKeyIdentifierProperties
Packit Service fa4841
 * CryptEnumOIDFunction
Packit Service fa4841
 * CryptEnumOIDInfo
Packit Service fa4841
 * CryptExportPKCS8
Packit Service fa4841
 * CryptExportPublicKeyInfo
Packit Service fa4841
 * CryptExportPublicKeyInfoEx
Packit Service fa4841
 * CryptExportPublicKeyInfoFromBCryptKeyHandle
Packit Service fa4841
 * CryptFindCertificateKeyProvInfo
Packit Service fa4841
 * CryptFindLocalizedName
Packit Service fa4841
 * CryptFindOIDInfo
Packit Service fa4841
 * CryptFormatObject
Packit Service fa4841
 * CryptFreeOIDFunctionAddress
Packit Service fa4841
 * CryptGetAsyncParam
Packit Service fa4841
 * CryptGetDefaultOIDDllList
Packit Service fa4841
 * CryptGetDefaultOIDFunctionAddress
Packit Service fa4841
 * CryptGetKeyIdentifierProperty
Packit Service fa4841
 * CryptGetMessageCertificates
Packit Service fa4841
 * CryptGetMessageSignerCount
Packit Service fa4841
 * CryptGetOIDFunctionAddress
Packit Service fa4841
 * CryptGetOIDFunctionValue
Packit Service fa4841
 * CryptHashCertificate
Packit Service fa4841
 * CryptHashCertificate2
Packit Service fa4841
 * CryptHashMessage
Packit Service fa4841
 * CryptHashPublicKeyInfo
Packit Service fa4841
 * CryptHashToBeSigned
Packit Service fa4841
 * CryptImportPKCS8
Packit Service fa4841
 * CryptImportPublicKeyInfo
Packit Service fa4841
 * CryptImportPublicKeyInfoEx
Packit Service fa4841
 * CryptImportPublicKeyInfoEx2
Packit Service fa4841
 * CryptInitOIDFunctionSet
Packit Service fa4841
 * CryptInstallDefaultContext
Packit Service fa4841
 * CryptInstallOIDFunctionAddress
Packit Service fa4841
 * CryptLoadSip
Packit Service fa4841
 * CryptMemAlloc
Packit Service fa4841
 * CryptMemFree
Packit Service fa4841
 * CryptMemRealloc
Packit Service fa4841
 * CryptMsgCalculateEncodedLength
Packit Service fa4841
 * CryptMsgClose
Packit Service fa4841
 * CryptMsgControl
Packit Service fa4841
 * CryptMsgCountersign
Packit Service fa4841
 * CryptMsgCountersignEncoded
Packit Service fa4841
 * CryptMsgDuplicate
Packit Service fa4841
 * CryptMsgEncodeAndSignCTL
Packit Service fa4841
 * CryptMsgGetAndVerifySigner
Packit Service fa4841
 * CryptMsgGetParam
Packit Service fa4841
 * CryptMsgOpenToDecode
Packit Service fa4841
 * CryptMsgOpenToEncode
Packit Service fa4841
 * CryptMsgSignCTL
Packit Service fa4841
 * CryptMsgUpdate
Packit Service fa4841
 * CryptMsgVerifyCountersignatureEncoded
Packit Service fa4841
 * CryptMsgVerifyCountersignatureEncodedEx
Packit Service fa4841
 * CryptQueryObject
Packit Service fa4841
 * CryptRegisterDefaultOIDFunction
Packit Service fa4841
 * CryptRegisterOIDFunction
Packit Service fa4841
 * CryptRegisterOIDInfo
Packit Service fa4841
 * CryptRetrieveTimeStamp
Packit Service fa4841
 * CryptSetAsyncParam
Packit Service fa4841
 * CryptSetKeyIdentifierProperty
Packit Service fa4841
 * CryptSetOIDFunctionValue
Packit Service fa4841
 * CryptSignAndEncodeCertificate
Packit Service fa4841
 * CryptSignAndEncryptMessage
Packit Service fa4841
 * CryptSignCertificate
Packit Service fa4841
 * CryptSignMessage
Packit Service fa4841
 * CryptSignMessageWithKey
Packit Service fa4841
 * CryptSIPAddProvider
Packit Service fa4841
 * CryptSIPCreateIndirectData
Packit Service fa4841
 * CryptSIPGetCaps
Packit Service fa4841
 * CryptSIPGetSignedDataMsg
Packit Service fa4841
 * CryptSIPLoad
Packit Service fa4841
 * CryptSIPPutSignedDataMsg
Packit Service fa4841
 * CryptSIPRemoveProvider
Packit Service fa4841
 * CryptSIPRemoveSignedDataMsg
Packit Service fa4841
 * CryptSIPRetrieveSubjectGuid
Packit Service fa4841
 * CryptSIPRetrieveSubjectGuidForCatalogFile
Packit Service fa4841
 * CryptSIPVerifyIndirectData
Packit Service fa4841
 * CryptUninstallDefaultContext
Packit Service fa4841
 * CryptUnregisterDefaultOIDFunction
Packit Service fa4841
 * CryptUnregisterOIDFunction
Packit Service fa4841
 * CryptUnregisterOIDInfo
Packit Service fa4841
 * CryptUpdateProtectedState
Packit Service fa4841
 * CryptVerifyCertificateSignature
Packit Service fa4841
 * CryptVerifyCertificateSignatureEx
Packit Service fa4841
 * CryptVerifyDetachedMessageHash
Packit Service fa4841
 * CryptVerifyDetachedMessageSignature
Packit Service fa4841
 * CryptVerifyMessageHash
Packit Service fa4841
 * CryptVerifyMessageSignature
Packit Service fa4841
 * CryptVerifyMessageSignatureWithKey
Packit Service fa4841
 * CryptVerifyTimeStampSignature
Packit Service fa4841
 * DbgInitOSS
Packit Service fa4841
 * DbgPrintf
Packit Service fa4841
 * PFXExportCertStore
Packit Service fa4841
 * PFXExportCertStore2
Packit Service fa4841
 * PFXExportCertStoreEx
Packit Service fa4841
 * PFXImportCertStore
Packit Service fa4841
 * PFXIsPFXBlob
Packit Service fa4841
 * PFXVerifyPassword
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifndef _WIN32
Packit Service fa4841
Packit Service fa4841
#include "crypto.h"
Packit Service fa4841
Packit Service fa4841
#include <winpr/crt.h>
Packit Service fa4841
#include <winpr/crypto.h>
Packit Service fa4841
#include <winpr/collections.h>
Packit Service fa4841
Packit Service fa4841
static wListDictionary* g_ProtectedMemoryBlocks = NULL;
Packit Service fa4841
Packit Service fa4841
BOOL CryptProtectMemory(LPVOID pData, DWORD cbData, DWORD dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	BYTE* pCipherText;
Packit Service fa4841
	size_t cbOut, cbFinal;
Packit Service fa4841
	WINPR_CIPHER_CTX* enc = NULL;
Packit Service fa4841
	BYTE randomKey[256];
Packit Service fa4841
	WINPR_PROTECTED_MEMORY_BLOCK* pMemBlock;
Packit Service fa4841
Packit Service fa4841
	if (dwFlags != CRYPTPROTECTMEMORY_SAME_PROCESS)
Packit Service fa4841
		return FALSE;
Packit Service fa4841
Packit Service fa4841
	if (!g_ProtectedMemoryBlocks)
Packit Service fa4841
	{
Packit Service fa4841
		g_ProtectedMemoryBlocks = ListDictionary_New(TRUE);
Packit Service fa4841
Packit Service fa4841
		if (!g_ProtectedMemoryBlocks)
Packit Service fa4841
			return FALSE;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service b1ea74
	pMemBlock = (WINPR_PROTECTED_MEMORY_BLOCK*)calloc(1, sizeof(WINPR_PROTECTED_MEMORY_BLOCK));
Packit Service fa4841
Packit Service fa4841
	if (!pMemBlock)
Packit Service fa4841
		return FALSE;
Packit Service fa4841
Packit Service fa4841
	pMemBlock->pData = pData;
Packit Service fa4841
	pMemBlock->cbData = cbData;
Packit Service fa4841
	pMemBlock->dwFlags = dwFlags;
Packit Service fa4841
Packit Service fa4841
	winpr_RAND(pMemBlock->salt, 8);
Packit Service fa4841
	winpr_RAND(randomKey, sizeof(randomKey));
Packit Service fa4841
Packit Service b1ea74
	winpr_Cipher_BytesToKey(WINPR_CIPHER_AES_256_CBC, WINPR_MD_SHA1, pMemBlock->salt, randomKey,
Packit Service b1ea74
	                        sizeof(randomKey), 4, pMemBlock->key, pMemBlock->iv);
Packit Service fa4841
Packit Service fa4841
	SecureZeroMemory(randomKey, sizeof(randomKey));
Packit Service fa4841
Packit Service fa4841
	cbOut = pMemBlock->cbData + 16 - 1;
Packit Service b1ea74
	pCipherText = (BYTE*)malloc(cbOut);
Packit Service fa4841
Packit Service fa4841
	if (!pCipherText)
Packit Service fa4841
		goto out;
Packit Service fa4841
Packit Service b1ea74
	if ((enc = winpr_Cipher_New(WINPR_CIPHER_AES_256_CBC, WINPR_ENCRYPT, pMemBlock->key,
Packit Service b1ea74
	                            pMemBlock->iv)) == NULL)
Packit Service fa4841
		goto out;
Packit Service fa4841
	if (!winpr_Cipher_Update(enc, pMemBlock->pData, pMemBlock->cbData, pCipherText, &cbOut))
Packit Service fa4841
		goto out;
Packit Service fa4841
	if (!winpr_Cipher_Final(enc, pCipherText + cbOut, &cbFinal))
Packit Service fa4841
		goto out;
Packit Service fa4841
	winpr_Cipher_Free(enc);
Packit Service fa4841
Packit Service fa4841
	CopyMemory(pMemBlock->pData, pCipherText, pMemBlock->cbData);
Packit Service fa4841
	free(pCipherText);
Packit Service fa4841
Packit Service fa4841
	return ListDictionary_Add(g_ProtectedMemoryBlocks, pData, pMemBlock);
Packit Service fa4841
out:
Packit Service b1ea74
	free(pMemBlock);
Packit Service b1ea74
	free(pCipherText);
Packit Service fa4841
	winpr_Cipher_Free(enc);
Packit Service fa4841
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL CryptUnprotectMemory(LPVOID pData, DWORD cbData, DWORD dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	BYTE* pPlainText = NULL;
Packit Service fa4841
	size_t cbOut, cbFinal;
Packit Service fa4841
	WINPR_CIPHER_CTX* dec = NULL;
Packit Service fa4841
	WINPR_PROTECTED_MEMORY_BLOCK* pMemBlock = NULL;
Packit Service fa4841
Packit Service fa4841
	if (dwFlags != CRYPTPROTECTMEMORY_SAME_PROCESS)
Packit Service fa4841
		return FALSE;
Packit Service fa4841
Packit Service fa4841
	if (!g_ProtectedMemoryBlocks)
Packit Service fa4841
		return FALSE;
Packit Service fa4841
Packit Service b1ea74
	pMemBlock =
Packit Service b1ea74
	    (WINPR_PROTECTED_MEMORY_BLOCK*)ListDictionary_GetItemValue(g_ProtectedMemoryBlocks, pData);
Packit Service fa4841
Packit Service fa4841
	if (!pMemBlock)
Packit Service fa4841
		goto out;
Packit Service fa4841
Packit Service fa4841
	cbOut = pMemBlock->cbData + 16 - 1;
Packit Service fa4841
Packit Service b1ea74
	pPlainText = (BYTE*)malloc(cbOut);
Packit Service fa4841
Packit Service fa4841
	if (!pPlainText)
Packit Service fa4841
		goto out;
Packit Service fa4841
Packit Service b1ea74
	if ((dec = winpr_Cipher_New(WINPR_CIPHER_AES_256_CBC, WINPR_DECRYPT, pMemBlock->key,
Packit Service b1ea74
	                            pMemBlock->iv)) == NULL)
Packit Service fa4841
		goto out;
Packit Service fa4841
	if (!winpr_Cipher_Update(dec, pMemBlock->pData, pMemBlock->cbData, pPlainText, &cbOut))
Packit Service fa4841
		goto out;
Packit Service fa4841
	if (!winpr_Cipher_Final(dec, pPlainText + cbOut, &cbFinal))
Packit Service fa4841
		goto out;
Packit Service fa4841
	winpr_Cipher_Free(dec);
Packit Service fa4841
Packit Service fa4841
	CopyMemory(pMemBlock->pData, pPlainText, pMemBlock->cbData);
Packit Service fa4841
	SecureZeroMemory(pPlainText, pMemBlock->cbData);
Packit Service fa4841
	free(pPlainText);
Packit Service fa4841
Packit Service fa4841
	ListDictionary_Remove(g_ProtectedMemoryBlocks, pData);
Packit Service fa4841
Packit Service fa4841
	free(pMemBlock);
Packit Service fa4841
Packit Service fa4841
	return TRUE;
Packit Service fa4841
Packit Service fa4841
out:
Packit Service fa4841
	free(pPlainText);
Packit Service fa4841
	free(pMemBlock);
Packit Service fa4841
	winpr_Cipher_Free(dec);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL CryptProtectData(DATA_BLOB* pDataIn, LPCWSTR szDataDescr, DATA_BLOB* pOptionalEntropy,
Packit Service b1ea74
                      PVOID pvReserved, CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct, DWORD dwFlags,
Packit Service b1ea74
                      DATA_BLOB* pDataOut)
Packit Service fa4841
{
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL CryptUnprotectData(DATA_BLOB* pDataIn, LPWSTR* ppszDataDescr, DATA_BLOB* pOptionalEntropy,
Packit Service b1ea74
                        PVOID pvReserved, CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct, DWORD dwFlags,
Packit Service b1ea74
                        DATA_BLOB* pDataOut)
Packit Service fa4841
{
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL CryptStringToBinaryW(LPCWSTR pszString, DWORD cchString, DWORD dwFlags, BYTE* pbBinary,
Packit Service b1ea74
                          DWORD* pcbBinary, DWORD* pdwSkip, DWORD* pdwFlags)
Packit Service fa4841
{
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL CryptStringToBinaryA(LPCSTR pszString, DWORD cchString, DWORD dwFlags, BYTE* pbBinary,
Packit Service b1ea74
                          DWORD* pcbBinary, DWORD* pdwSkip, DWORD* pdwFlags)
Packit Service fa4841
{
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service b1ea74
BOOL CryptBinaryToStringW(CONST BYTE* pbBinary, DWORD cbBinary, DWORD dwFlags, LPWSTR pszString,
Packit Service b1ea74
                          DWORD* pcchString)
Packit Service fa4841
{
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service b1ea74
BOOL CryptBinaryToStringA(CONST BYTE* pbBinary, DWORD cbBinary, DWORD dwFlags, LPSTR pszString,
Packit Service b1ea74
                          DWORD* pcchString)
Packit Service fa4841
{
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
#endif