ADVAPI32: if a crypto provider has no signature, load it anyway

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




Hi,


Since we have our own rsabase.dll, and it has no signature data in the registry, we should load it anyway until we figure out how to sign builtin dlls...

Mike


ChangeLog: * if a crypto provider has no signature, load it anyway * check return codes of all registry access functions
Index: dlls/advapi32/crypt.c
===================================================================
RCS file: /home/wine/wine/dlls/advapi32/crypt.c,v
retrieving revision 1.29
diff -u -r1.29 crypt.c
--- dlls/advapi32/crypt.c	22 Oct 2003 03:04:30 -0000	1.29
+++ dlls/advapi32/crypt.c	10 Nov 2003 12:10:55 -0000
@@ -258,6 +258,7 @@
 	PSTR imagepath = NULL, keyname = NULL, provname = NULL, temp = NULL;
 	BYTE* signature;
 	DWORD keytype, type, len;
+	ULONG r;
 
 	TRACE("(%p, %s, %s, %ld, %08lx)\n", phProv, pszContainer,
 		pszProvider, dwProvType, dwFlags);
@@ -300,9 +301,10 @@
 			}
 		}
 		CRYPT_Free(keyname);
-		RegQueryValueExA(key, "Name", NULL, &keytype, NULL, &len);
-		if (!len || keytype != REG_SZ)
+		r = RegQueryValueExA(key, "Name", NULL, &keytype, NULL, &len);
+		if( r != ERROR_SUCCESS || !len || keytype != REG_SZ)
 		{
+			TRACE("error %ld at line %d\n", r, __LINE__);
 			RegCloseKey(key);
 			SetLastError(NTE_PROV_TYPE_ENTRY_BAD);
 			goto error;
@@ -313,7 +315,14 @@
 			SetLastError(ERROR_NOT_ENOUGH_MEMORY);
 			goto error;
 		}
-		RegQueryValueExA(key, "Name", NULL, NULL, provname, &len);
+		r = RegQueryValueExA(key, "Name", NULL, NULL, provname, &len);
+		if( r != ERROR_SUCCESS )
+		{
+			TRACE("error %ld at line %d\n", r, __LINE__);
+			RegCloseKey(key);
+			SetLastError(NTE_PROV_TYPE_ENTRY_BAD);
+			goto error;
+		}
 		RegCloseKey(key);
 	} else {
 		if ( !(provname = CRYPT_Alloc(strlen(pszProvider) +1)) )
@@ -328,17 +337,18 @@
 	if (RegOpenKeyA(HKEY_LOCAL_MACHINE, keyname, &key)) goto error;
 	CRYPT_Free(keyname);
 	len = sizeof(DWORD);
-	RegQueryValueExA(key, "Type", NULL, NULL, (BYTE*)&type, &len);
-	if (type != dwProvType)
+	r = RegQueryValueExA(key, "Type", NULL, NULL, (BYTE*)&type, &len);
+	if (r != ERROR_SUCCESS || type != dwProvType)
 	{
 		FIXME("Crypto provider has wrong type (%ld vs expected %ld).\n", type, dwProvType);
 		SetLastError(NTE_BAD_PROV_TYPE);
 		goto error;
 	}
 
-	RegQueryValueExA(key, "Image Path", NULL, &keytype, NULL, &len);
-	if (keytype != REG_SZ)
+	r = RegQueryValueExA(key, "Image Path", NULL, &keytype, NULL, &len);
+	if ( r != ERROR_SUCCESS || keytype != REG_SZ)
 	{
+		TRACE("error %ld at line %d\n", r, __LINE__);
 		RegCloseKey(key);
 		SetLastError(NTE_PROV_TYPE_ENTRY_BAD);
 		goto error;
@@ -349,22 +359,45 @@
 		SetLastError(ERROR_NOT_ENOUGH_MEMORY);
 		goto error;
 	}
-	RegQueryValueExA(key, "Image Path", NULL, NULL, temp, &len);
-
-	RegQueryValueExA(key, "Signature", NULL, &keytype, NULL, &len);
-	if (keytype != REG_BINARY)
+	r = RegQueryValueExA(key, "Image Path", NULL, NULL, temp, &len);
+	if( r != ERROR_SUCCESS )
 	{
+		TRACE("error %ld at line %d\n", r, __LINE__);
 		RegCloseKey(key);
 		SetLastError(NTE_PROV_TYPE_ENTRY_BAD);
 		goto error;
 	}
-	if (!(signature = CRYPT_Alloc(len)))
+
+	r = RegQueryValueExA(key, "Signature", NULL, &keytype, NULL, &len);
+	if ( r == ERROR_SUCCESS )
 	{
-		RegCloseKey(key);
-		SetLastError(ERROR_NOT_ENOUGH_MEMORY);
-		goto error;
+		if ( r != ERROR_SUCCESS || keytype != REG_BINARY)
+		{
+			TRACE("error %ld at line %d\n", r, __LINE__);
+			RegCloseKey(key);
+			SetLastError(NTE_PROV_TYPE_ENTRY_BAD);
+			goto error;
+		}
+		if (!(signature = CRYPT_Alloc(len)))
+		{
+			RegCloseKey(key);
+			SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+			goto error;
+		}
+		r = RegQueryValueExA(key, "Signature", NULL, NULL, signature, &len);
+		if ( r != ERROR_SUCCESS )
+		{
+			TRACE("error %ld at line %d\n", r, __LINE__);
+			RegCloseKey(key);
+			SetLastError(NTE_PROV_TYPE_ENTRY_BAD);
+			goto error;
+		}
+	}
+	else
+	{
+		FIXME("Crypto provider has no signature... probably a builtin\n");
+		signature = NULL;
 	}
-	RegQueryValueExA(key, "Signature", NULL, NULL, signature, &len);
 
 	RegCloseKey(key);
 	len = ExpandEnvironmentStringsA(temp, NULL, 0);
@@ -381,7 +414,7 @@
 		goto error;
 	}
 
-	if (!CRYPT_VerifyImage(imagepath, signature))
+	if (signature && !CRYPT_VerifyImage(imagepath, signature))
 	{
 		CRYPT_Free(signature);
 		SetLastError(NTE_SIGNATURE_FILE_BAD);
@@ -390,7 +423,8 @@
 	pProv = CRYPT_LoadProvider(imagepath);
 	CRYPT_Free(temp);
 	CRYPT_Free(imagepath);
-	CRYPT_Free(signature);
+	if( signature )
+		CRYPT_Free(signature);
 	if (!pProv) {
 		FIXME("Could not load crypto provider from DLL %s\n", debugstr_a(imagepath));
 		/* CRYPT_LoadProvider calls SetLastError */

[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux