Michael Karcher : crypt32: Pass on aiKeyAlg on RSA key import.

Alexandre Julliard julliard at winehq.org
Mon May 26 13:12:41 CDT 2008


Module: wine
Branch: master
Commit: 8fa3b6871fa477e762ff614a50486df671853f8a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8fa3b6871fa477e762ff614a50486df671853f8a

Author: Michael Karcher <wine at mkarcher.dialup.fu-berlin.de>
Date:   Sun May 25 20:16:14 2008 +0200

crypt32: Pass on aiKeyAlg on RSA key import.

---

 dlls/crypt32/encode.c       |    4 ++++
 dlls/crypt32/tests/encode.c |   30 ++++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/dlls/crypt32/encode.c b/dlls/crypt32/encode.c
index 80f30ae..ee42a3d 100644
--- a/dlls/crypt32/encode.c
+++ b/dlls/crypt32/encode.c
@@ -3918,8 +3918,12 @@ static BOOL WINAPI CRYPT_ImportRsaPublicKeyInfoEx(HCRYPTPROV hCryptProv,
              pInfo->PublicKey.pbData, pInfo->PublicKey.cbData, 0, pubKey,
              &pubKeySize);
             if (ret)
+            {
+                if(aiKeyAlg)
+                  ((BLOBHEADER*)pubKey)->aiKeyAlg = aiKeyAlg;
                 ret = CryptImportKey(hCryptProv, pubKey, pubKeySize, 0, 0,
                  phKey);
+            }
             CryptMemFree(pubKey);
         }
         else
diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c
index 8e75689..49e4955 100644
--- a/dlls/crypt32/tests/encode.c
+++ b/dlls/crypt32/tests/encode.c
@@ -5802,6 +5802,8 @@ static void testImportPublicKey(HCRYPTPROV csp, PCERT_PUBLIC_KEY_INFO info)
     BOOL ret;
     HCRYPTKEY key;
     PCCERT_CONTEXT context;
+    DWORD dwSize;
+    ALG_ID ai;
 
     /* These crash
     ret = CryptImportPublicKeyInfoEx(0, 0, NULL, 0, 0, NULL, NULL);
@@ -5820,9 +5822,37 @@ static void testImportPublicKey(HCRYPTPROV csp, PCERT_PUBLIC_KEY_INFO info)
      &key);
     ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
      "Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError());
+
+    /* Export key with standard algorithm (CALG_RSA_KEYX) */
     ret = CryptImportPublicKeyInfoEx(csp, X509_ASN_ENCODING, info, 0, 0, NULL,
      &key);
     ok(ret, "CryptImportPublicKeyInfoEx failed: %08x\n", GetLastError());
+
+    dwSize = sizeof(ai);
+    CryptGetKeyParam(key, KP_ALGID, (LPVOID)&ai, &dwSize, 0);
+    ok(ret, "CryptGetKeyParam failed: %08x\n", GetLastError());
+    if(ret)
+    {
+      ok(dwSize == sizeof(ai), "CryptGetKeyParam returned size %d\n",dwSize);
+      ok(ai == CALG_RSA_KEYX, "Default ALG_ID is %04x (expected CALG_RSA_KEYX)\n", ai);
+    }
+
+    CryptDestroyKey(key);
+
+    /* Repeat with forced algorithm */
+    ret = CryptImportPublicKeyInfoEx(csp, X509_ASN_ENCODING, info, CALG_RSA_SIGN, 0, NULL,
+     &key);
+    ok(ret, "CryptImportPublicKeyInfoEx failed: %08x\n", GetLastError());
+
+    dwSize = sizeof(ai);
+    CryptGetKeyParam(key, KP_ALGID, (LPVOID)&ai, &dwSize, 0);
+    ok(ret, "CryptGetKeyParam failed: %08x\n", GetLastError());
+    if(ret)
+    {
+      ok(dwSize == sizeof(ai), "CryptGetKeyParam returned size %d\n",dwSize);
+      ok(ai == CALG_RSA_SIGN, "ALG_ID is %04x (expected CALG_RSA_SIGN)\n", ai);
+    }
+
     CryptDestroyKey(key);
 
     /* Test importing a public key from a certificate context */




More information about the wine-cvs mailing list