Author: cwittich Date: Sun Oct 25 22:16:15 2009 New Revision: 43755
URL: http://svn.reactos.org/svn/reactos?rev=43755&view=rev Log: -sync rsaenh with wine 1.1.32
Modified: trunk/reactos/dll/win32/rsaenh/rsaenh.c trunk/reactos/include/psdk/wincrypt.h
Modified: trunk/reactos/dll/win32/rsaenh/rsaenh.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rsaenh/rsaenh.c?r... ============================================================================== --- trunk/reactos/dll/win32/rsaenh/rsaenh.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rsaenh/rsaenh.c [iso-8859-1] Sun Oct 25 22:16:15 2009 @@ -777,6 +777,8 @@ peaAlgidInfo = get_algid_info(hProv, aiAlgid); if (!peaAlgidInfo) return (HCRYPTKEY)INVALID_HANDLE_VALUE;
+ TRACE("alg = %s, dwKeyLen = %d\n", debugstr_a(peaAlgidInfo->szName), + dwKeyLen); /* * Assume the default key length, if none is specified explicitly */ @@ -822,7 +824,9 @@ dwKeyLen > peaAlgidInfo->dwMaxLen || dwKeyLen < peaAlgidInfo->dwMinLen) { - SetLastError(NTE_BAD_FLAGS); + TRACE("key len %d out of bounds (%d, %d)\n", dwKeyLen, + peaAlgidInfo->dwMinLen, peaAlgidInfo->dwMaxLen); + SetLastError(NTE_BAD_DATA); return (HCRYPTKEY)INVALID_HANDLE_VALUE; } } @@ -2481,6 +2485,33 @@ return TRUE; }
+static BOOL crypt_export_plaintext_key(CRYPTKEY *pCryptKey, BYTE *pbData, + DWORD *pdwDataLen) +{ + BLOBHEADER *pBlobHeader = (BLOBHEADER*)pbData; + DWORD *pKeyLen = (DWORD*)(pBlobHeader+1); + BYTE *pbKey = (BYTE*)(pKeyLen+1); + DWORD dwDataLen; + + dwDataLen = sizeof(BLOBHEADER) + sizeof(DWORD) + pCryptKey->dwKeyLen; + if (pbData) { + if (*pdwDataLen < dwDataLen) { + SetLastError(ERROR_MORE_DATA); + *pdwDataLen = dwDataLen; + return FALSE; + } + + pBlobHeader->bType = PLAINTEXTKEYBLOB; + pBlobHeader->bVersion = CUR_BLOB_VERSION; + pBlobHeader->reserved = 0; + pBlobHeader->aiKeyAlg = pCryptKey->aiAlgid; + + *pKeyLen = pCryptKey->dwKeyLen; + memcpy(pbKey, &pCryptKey->abKeyValue, pCryptKey->dwKeyLen); + } + *pdwDataLen = dwDataLen; + return TRUE; +} /****************************************************************************** * crypt_export_key [Internal] * @@ -2535,6 +2566,9 @@
case PRIVATEKEYBLOB: return crypt_export_private_key(pCryptKey, force, pbData, pdwDataLen); + + case PLAINTEXTKEYBLOB: + return crypt_export_plaintext_key(pCryptKey, pbData, pdwDataLen);
default: SetLastError(NTE_BAD_TYPE); /* FIXME: error code? */ @@ -2834,6 +2868,53 @@ }
/****************************************************************************** + * import_plaintext_key [Internal] + * + * Import a plaintext key into a key container. + * + * PARAMS + * hProv [I] Key container into which the symmetric key is to be imported. + * pbData [I] Pointer to a buffer which holds the plaintext key BLOB. + * dwDataLen [I] Length of data in buffer at pbData. + * dwFlags [I] One of: + * CRYPT_EXPORTABLE: the imported key is marked exportable + * phKey [O] Handle to the imported key. + * + * + * NOTES + * Assumes the caller has already checked the BLOBHEADER at pbData to ensure + * it's a PLAINTEXTKEYBLOB. + * + * RETURNS + * Success: TRUE. + * Failure: FALSE. + */ +static BOOL import_plaintext_key(HCRYPTPROV hProv, CONST BYTE *pbData, + DWORD dwDataLen, DWORD dwFlags, + HCRYPTKEY *phKey) +{ + CRYPTKEY *pCryptKey; + CONST BLOBHEADER *pBlobHeader = (CONST BLOBHEADER*)pbData; + CONST DWORD *pKeyLen = (CONST DWORD *)(pBlobHeader + 1); + CONST BYTE *pbKeyStream = (CONST BYTE*)(pKeyLen + 1); + + if (dwDataLen < sizeof(BLOBHEADER)+sizeof(DWORD)+*pKeyLen) + { + SetLastError(NTE_BAD_DATA); /* FIXME: error code */ + return FALSE; + } + + *phKey = new_key(hProv, pBlobHeader->aiKeyAlg, *pKeyLen<<19, &pCryptKey); + if (*phKey == (HCRYPTKEY)INVALID_HANDLE_VALUE) + return FALSE; + memcpy(pCryptKey->abKeyValue, pbKeyStream, *pKeyLen); + setup_key(pCryptKey); + if (dwFlags & CRYPT_EXPORTABLE) + pCryptKey->dwPermissions |= CRYPT_EXPORT; + return TRUE; +} + +/****************************************************************************** * import_key [Internal] * * Import a BLOB'ed key into a key container, optionally storing the key's @@ -2871,6 +2952,8 @@ pBlobHeader->bVersion != CUR_BLOB_VERSION || pBlobHeader->reserved != 0) { + TRACE("bVersion = %d, reserved = %d\n", pBlobHeader->bVersion, + pBlobHeader->reserved); SetLastError(NTE_BAD_DATA); return FALSE; } @@ -2879,6 +2962,7 @@ * fStoreKey's original value. */ fStoreKey = fStoreKey && !(dwFlags & CRYPT_VERIFYCONTEXT); + TRACE("blob type: %x\n", pBlobHeader->bType); switch (pBlobHeader->bType) { case PRIVATEKEYBLOB: @@ -2893,6 +2977,10 @@ return import_symmetric_key(hProv, pbData, dwDataLen, hPubKey, dwFlags, phKey);
+ case PLAINTEXTKEYBLOB: + return import_plaintext_key(hProv, pbData, dwDataLen, dwFlags, + phKey); + default: SetLastError(NTE_BAD_TYPE); /* FIXME: error code? */ return FALSE; @@ -2923,6 +3011,12 @@ TRACE("(hProv=%08lx, pbData=%p, dwDataLen=%d, hPubKey=%08lx, dwFlags=%08x, phKey=%p)\n", hProv, pbData, dwDataLen, hPubKey, dwFlags, phKey);
+ if (dwFlags & CRYPT_IPSEC_HMAC_KEY) + { + FIXME("unimplemented for CRYPT_IPSEC_HMAC_KEY\n"); + SetLastError(NTE_BAD_FLAGS); + return FALSE; + } return import_key(hProv, pbData, dwDataLen, hPubKey, dwFlags, TRUE, phKey); }
@@ -2971,11 +3065,9 @@ if (pCryptKey) { new_key_impl(pCryptKey->aiAlgid, &pCryptKey->context, pCryptKey->dwKeyLen); setup_key(pCryptKey); - if (Algid == AT_SIGNATURE) { - RSAENH_CPDestroyKey(hProv, pKeyContainer->hSignatureKeyPair); - copy_handle(&handle_table, *phKey, RSAENH_MAGIC_KEY, - &pKeyContainer->hSignatureKeyPair); - } + RSAENH_CPDestroyKey(hProv, pKeyContainer->hSignatureKeyPair); + copy_handle(&handle_table, *phKey, RSAENH_MAGIC_KEY, + &pKeyContainer->hSignatureKeyPair); } break;
@@ -2985,11 +3077,9 @@ if (pCryptKey) { new_key_impl(pCryptKey->aiAlgid, &pCryptKey->context, pCryptKey->dwKeyLen); setup_key(pCryptKey); - if (Algid == AT_KEYEXCHANGE) { - RSAENH_CPDestroyKey(hProv, pKeyContainer->hKeyExchangeKeyPair); - copy_handle(&handle_table, *phKey, RSAENH_MAGIC_KEY, - &pKeyContainer->hKeyExchangeKeyPair); - } + RSAENH_CPDestroyKey(hProv, pKeyContainer->hKeyExchangeKeyPair); + copy_handle(&handle_table, *phKey, RSAENH_MAGIC_KEY, + &pKeyContainer->hKeyExchangeKeyPair); } break;
@@ -4371,7 +4461,8 @@ { static const WCHAR szName[] = { 'N','a','m','e',0 }; static const WCHAR szRSAName[3][54] = { - { 'M','i','c','r','o','s','o','f','t',' ', 'B','a','s','e',' ', + { 'M','i','c','r','o','s','o','f','t',' ', + 'E','n','h','a','n','c','e','d',' ', 'C','r','y','p','t','o','g','r','a','p','h','i','c',' ', 'P','r','o','v','i','d','e','r',' ','v','1','.','0',0 }, { 'M','i','c','r','o','s','o','f','t',' ','R','S','A',' ',
Modified: trunk/reactos/include/psdk/wincrypt.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/wincrypt.h?rev... ============================================================================== --- trunk/reactos/include/psdk/wincrypt.h [iso-8859-1] (original) +++ trunk/reactos/include/psdk/wincrypt.h [iso-8859-1] Sun Oct 25 22:16:15 2009 @@ -84,6 +84,9 @@ DWORD dwFlags; DWORD dwReserved; } SCHANNEL_ALG, *PSCHANNEL_ALG; + + +#define CRYPT_IPSEC_HMAC_KEY 0x0100
typedef struct _HMAC_INFO { ALG_ID HashAlgid;