Juan Lang : rsaenh: Test and fix CryptEncrypt with NULL buffer.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Aug 8 13:21:33 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: e64999426273366d3e4ff3d18290c4d5640c875f
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=e64999426273366d3e4ff3d18290c4d5640c875f

Author: Juan Lang <juan_lang at yahoo.com>
Date:   Tue Aug  8 09:47:32 2006 -0700

rsaenh: Test and fix CryptEncrypt with NULL buffer.

---

 dlls/rsaenh/rsaenh.c       |    8 ++++++++
 dlls/rsaenh/tests/rsaenh.c |   17 +++++++++++++++++
 2 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index 02e3e6e..eafc92c 100644
--- a/dlls/rsaenh/rsaenh.c
+++ b/dlls/rsaenh/rsaenh.c
@@ -1940,12 +1940,20 @@ BOOL WINAPI RSAENH_CPEncrypt(HCRYPTPROV 
             memcpy(in, out, pCryptKey->dwBlockLen); 
         }
     } else if (GET_ALG_TYPE(pCryptKey->aiAlgid) == ALG_TYPE_STREAM) {
+        if (pbData == NULL) {
+            *pdwDataLen = dwBufLen;
+            return TRUE;
+        }
         encrypt_stream_impl(pCryptKey->aiAlgid, &pCryptKey->context, pbData, *pdwDataLen);
     } else if (GET_ALG_TYPE(pCryptKey->aiAlgid) == ALG_TYPE_RSA) {
         if (pCryptKey->aiAlgid == CALG_RSA_SIGN) {
             SetLastError(NTE_BAD_KEY);
             return FALSE;
         }
+        if (!pbData) {
+            *pdwDataLen = pCryptKey->dwBlockLen;
+            return TRUE;
+        }
         if (dwBufLen < pCryptKey->dwBlockLen) {
             SetLastError(ERROR_MORE_DATA);
             return FALSE;
diff --git a/dlls/rsaenh/tests/rsaenh.c b/dlls/rsaenh/tests/rsaenh.c
index 01cbb0c..90caeb4 100644
--- a/dlls/rsaenh/tests/rsaenh.c
+++ b/dlls/rsaenh/tests/rsaenh.c
@@ -303,6 +303,11 @@ static void test_block_cipher_modes(void
     result = CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, 0);
     ok(result, "%08lx\n", GetLastError());
 
+    dwLen = 23;
+    result = CryptEncrypt(hKey, (HCRYPTHASH)NULL, TRUE, 0, NULL, &dwLen, 24);
+    ok(result, "CryptEncrypt failed: %08lx\n", GetLastError());
+    ok(dwLen == 24, "Unexpected length %ld\n", dwLen);
+
     SetLastError(ERROR_SUCCESS);
     dwLen = 23;
     result = CryptEncrypt(hKey, (HCRYPTHASH)NULL, TRUE, 0, abData, &dwLen, 24);
@@ -318,6 +323,11 @@ static void test_block_cipher_modes(void
     ok(result, "%08lx\n", GetLastError());
     
     dwLen = 23;
+    result = CryptEncrypt(hKey, (HCRYPTHASH)NULL, TRUE, 0, NULL, &dwLen, 24);
+    ok(result, "CryptEncrypt failed: %08lx\n", GetLastError());
+    ok(dwLen == 24, "Unexpected length %ld\n", dwLen);
+
+    dwLen = 23;
     result = CryptEncrypt(hKey, (HCRYPTHASH)NULL, TRUE, 0, abData, &dwLen, 24);
     ok(result && dwLen == 24 && !memcmp(cbc, abData, sizeof(cbc)), 
        "%08lx, dwLen: %ld\n", GetLastError(), dwLen);
@@ -596,6 +606,9 @@ static void test_rc4(void)
         ok(result, "%08lx\n", GetLastError());
 
         dwDataLen = 16;
+        result = CryptEncrypt(hKey, (HCRYPTHASH)NULL, TRUE, 0, NULL, &dwDataLen, 24);
+        ok(result, "%08lx\n", GetLastError());
+        dwDataLen = 16;
         result = CryptEncrypt(hKey, (HCRYPTHASH)NULL, TRUE, 0, pbData, &dwDataLen, 24);
         ok(result, "%08lx\n", GetLastError());
 
@@ -1105,6 +1118,10 @@ static void test_rsa_encrypt(void)
     if (!result) return;
 
     dwLen = 12;
+    result = CryptEncrypt(hRSAKey, 0, TRUE, 0, NULL, &dwLen, (DWORD)sizeof(abData));
+    ok(result, "CryptEncrypt failed: %08lx\n", GetLastError());
+    ok(dwLen == 128, "Unexpected length %ld\n", dwLen);
+    dwLen = 12;
     result = CryptEncrypt(hRSAKey, 0, TRUE, 0, abData, &dwLen, (DWORD)sizeof(abData));
     ok (result, "%08lx\n", GetLastError());
     if (!result) return;




More information about the wine-cvs mailing list