From f9c674b43ccc5e5f67b8f53460bae0e217beddad Mon Sep 17 00:00:00 2001 From: The Wine Synchronizer Date: Mon, 14 Jan 2008 16:27:48 +0000 Subject: [PATCH] Autosyncing with Wine HEAD svn path=/trunk/; revision=31793 --- reactos/dll/win32/rsaenh/rsaenh.c | 45 +++++++++++++++++++++----- reactos/dll/win32/rsaenh/rsaenh.rbuild | 2 ++ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/reactos/dll/win32/rsaenh/rsaenh.c b/reactos/dll/win32/rsaenh/rsaenh.c index b9d104f0384..2e5fd21cc84 100644 --- a/reactos/dll/win32/rsaenh/rsaenh.c +++ b/reactos/dll/win32/rsaenh/rsaenh.c @@ -2798,6 +2798,14 @@ BOOL WINAPI RSAENH_CPSetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam } switch (dwParam) { + case KP_PADDING: + /* The MS providers only support PKCS5_PADDING */ + if (*(DWORD *)pbData != PKCS5_PADDING) { + SetLastError(NTE_BAD_DATA); + return FALSE; + } + return TRUE; + case KP_MODE: pCryptKey->dwMode = *(DWORD*)pbData; return TRUE; @@ -2815,6 +2823,23 @@ BOOL WINAPI RSAENH_CPSetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam setup_key(pCryptKey); return TRUE; + case KP_SALT_EX: + { + CRYPT_INTEGER_BLOB *blob = (CRYPT_INTEGER_BLOB *)pbData; + + /* salt length can't be greater than 128 bits = 16 bytes */ + if (blob->cbData > 16) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + memcpy(pCryptKey->abKeyValue + pCryptKey->dwKeyLen, blob->pbData, + blob->cbData); + pCryptKey->dwSaltLen = blob->cbData; + setup_key(pCryptKey); + return TRUE; + } + case KP_EFFECTIVE_KEYLEN: switch (pCryptKey->aiAlgid) { case CALG_RC2: @@ -2901,7 +2926,7 @@ BOOL WINAPI RSAENH_CPGetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam DWORD *pdwDataLen, DWORD dwFlags) { CRYPTKEY *pCryptKey; - DWORD dwBitLen; + DWORD dwValue; TRACE("(hProv=%08lx, hKey=%08lx, dwParam=%08x, pbData=%p, pdwDataLen=%p dwFlags=%08x)\n", hProv, hKey, dwParam, pbData, pdwDataLen, dwFlags); @@ -2933,20 +2958,24 @@ BOOL WINAPI RSAENH_CPGetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam return copy_param(pbData, pdwDataLen, (CONST BYTE*)&pCryptKey->abKeyValue[pCryptKey->dwKeyLen], pCryptKey->dwSaltLen); + case KP_PADDING: + dwValue = PKCS5_PADDING; + return copy_param(pbData, pdwDataLen, (CONST BYTE*)&dwValue, sizeof(DWORD)); + case KP_KEYLEN: - dwBitLen = pCryptKey->dwKeyLen << 3; - return copy_param(pbData, pdwDataLen, (CONST BYTE*)&dwBitLen, sizeof(DWORD)); + dwValue = pCryptKey->dwKeyLen << 3; + return copy_param(pbData, pdwDataLen, (CONST BYTE*)&dwValue, sizeof(DWORD)); case KP_EFFECTIVE_KEYLEN: if (pCryptKey->dwEffectiveKeyLen) - dwBitLen = pCryptKey->dwEffectiveKeyLen; + dwValue = pCryptKey->dwEffectiveKeyLen; else - dwBitLen = pCryptKey->dwKeyLen << 3; - return copy_param(pbData, pdwDataLen, (CONST BYTE*)&dwBitLen, sizeof(DWORD)); + dwValue = pCryptKey->dwKeyLen << 3; + return copy_param(pbData, pdwDataLen, (CONST BYTE*)&dwValue, sizeof(DWORD)); case KP_BLOCKLEN: - dwBitLen = pCryptKey->dwBlockLen << 3; - return copy_param(pbData, pdwDataLen, (CONST BYTE*)&dwBitLen, sizeof(DWORD)); + dwValue = pCryptKey->dwBlockLen << 3; + return copy_param(pbData, pdwDataLen, (CONST BYTE*)&dwValue, sizeof(DWORD)); case KP_MODE: return copy_param(pbData, pdwDataLen, (CONST BYTE*)&pCryptKey->dwMode, sizeof(DWORD)); diff --git a/reactos/dll/win32/rsaenh/rsaenh.rbuild b/reactos/dll/win32/rsaenh/rsaenh.rbuild index 3fcff120892..0cf33901c34 100644 --- a/reactos/dll/win32/rsaenh/rsaenh.rbuild +++ b/reactos/dll/win32/rsaenh/rsaenh.rbuild @@ -1,5 +1,6 @@ + @@ -26,3 +27,4 @@ version.rc rsaenh.spec +