b4a3df
From cfe1f7fdd12e202fa2d056c7fd731cfeee378a98 Mon Sep 17 00:00:00 2001
b4a3df
From: Jakub Jelen <jjelen@redhat.com>
b4a3df
Date: Wed, 15 Jul 2020 18:12:32 +0200
b4a3df
Subject: [PATCH] Unbreak negative mechanism lists in slots.mechanisms +
b4a3df
 testcase
b4a3df
b4a3df
Previously, when the list for slots.mechanisms was prefixed with
b4a3df
minus sign "-", the first mechanism was skipped as invalid and
b4a3df
therefore the tool was presenting wrong list of algorithms.
b4a3df
b4a3df
This fixes the initial index for selection of first algorithm
b4a3df
and adds unit test for this scenario.
b4a3df
---
b4a3df
 .gitignore                                    |  1 +
b4a3df
 configure.ac                                  |  1 +
b4a3df
 src/lib/SoftHSM.cpp                           |  9 ++-
b4a3df
 src/lib/test/InfoTests.cpp                    | 70 ++++++++++++++++++-
b4a3df
 src/lib/test/InfoTests.h                      |  2 +
b4a3df
 src/lib/test/Makefile.am                      |  1 +
b4a3df
 src/lib/test/softhsm2-negative-mech.conf.in   |  8 +++
b4a3df
 .../test/softhsm2-negative-mech.conf.win32    |  7 ++
b4a3df
 win32/p11test/p11test.vcxproj.in              |  2 +
b4a3df
 9 files changed, 97 insertions(+), 4 deletions(-)
b4a3df
 create mode 100644 src/lib/test/softhsm2-negative-mech.conf.in
b4a3df
 create mode 100644 src/lib/test/softhsm2-negative-mech.conf.win32
b4a3df
b4a3df
diff --git a/configure.ac b/configure.ac
b4a3df
index d4dad435..c6a51c7a 100644
b4a3df
--- a/configure.ac
b4a3df
+++ b/configure.ac
b4a3df
@@ -217,6 +217,7 @@ AC_CONFIG_FILES([
b4a3df
 	src/lib/test/softhsm2-alt.conf
b4a3df
 	src/lib/test/softhsm2-reset-on-fork.conf
b4a3df
 	src/lib/test/softhsm2-mech.conf
b4a3df
+	src/lib/test/softhsm2-negative-mech.conf
b4a3df
 	src/lib/test/tokens/dummy
b4a3df
 	src/bin/Makefile
b4a3df
 	src/bin/common/Makefile
b4a3df
diff --git a/src/lib/SoftHSM.cpp b/src/lib/SoftHSM.cpp
b4a3df
index 0a0c32cc..cac724e6 100644
b4a3df
--- a/src/lib/SoftHSM.cpp
b4a3df
+++ b/src/lib/SoftHSM.cpp
b4a3df
@@ -791,12 +791,17 @@ void SoftHSM::prepareSupportedMecahnisms(std::map
b4a3df
 	if (mechs != "ALL")
b4a3df
 	{
b4a3df
 		bool negative = (mechs[0] == '-');
b4a3df
-		if (!negative)
b4a3df
+		size_t pos = 0, prev = 0;
b4a3df
+		if (negative)
b4a3df
+		{
b4a3df
+			/* Skip the minus sign */
b4a3df
+			prev = 1;
b4a3df
+		}
b4a3df
+		else
b4a3df
 		{
b4a3df
 			/* For positive list, we remove everything */
b4a3df
 			supportedMechanisms.clear();
b4a3df
 		}
b4a3df
-		size_t pos = 0, prev = 0;
b4a3df
 		std::string token;
b4a3df
 		do
b4a3df
 		{
b4a3df
diff --git a/src/lib/test/InfoTests.cpp b/src/lib/test/InfoTests.cpp
b4a3df
index a07956fb..d2218e34 100644
b4a3df
--- a/src/lib/test/InfoTests.cpp
b4a3df
+++ b/src/lib/test/InfoTests.cpp
b4a3df
@@ -328,9 +328,9 @@ void InfoTests::testGetMechanismListConfig()
b4a3df
 	CK_MECHANISM_TYPE_PTR pMechanismList;
b4a3df
 
b4a3df
 #ifndef _WIN32
b4a3df
-    setenv("SOFTHSM2_CONF", "./softhsm2-mech.conf", 1);
b4a3df
+	setenv("SOFTHSM2_CONF", "./softhsm2-mech.conf", 1);
b4a3df
 #else
b4a3df
-    setenv("SOFTHSM2_CONF", ".\\softhsm2-mech.conf", 1);
b4a3df
+	setenv("SOFTHSM2_CONF", ".\\softhsm2-mech.conf", 1);
b4a3df
 #endif
b4a3df
 
b4a3df
 	// Just make sure that we finalize any previous failed tests
b4a3df
@@ -363,6 +363,72 @@ void InfoTests::testGetMechanismListConfig()
b4a3df
 #endif
b4a3df
 }
b4a3df
 
b4a3df
+void InfoTests::testGetMechanismNegativeListConfig()
b4a3df
+{
b4a3df
+	CK_RV rv;
b4a3df
+	CK_ULONG ulMechCount = 0;
b4a3df
+	CK_MECHANISM_TYPE_PTR pMechanismList;
b4a3df
+	CK_ULONG allMechsCount = 0;
b4a3df
+
b4a3df
+	// Just make sure that we finalize any previous failed tests
b4a3df
+	CRYPTOKI_F_PTR( C_Finalize(NULL_PTR) );
b4a3df
+
b4a3df
+	// First of all, try to get the default list
b4a3df
+	rv = CRYPTOKI_F_PTR( C_GetMechanismList(m_initializedTokenSlotID, NULL_PTR, &ulMechCount) );
b4a3df
+	CPPUNIT_ASSERT(rv == CKR_CRYPTOKI_NOT_INITIALIZED);
b4a3df
+
b4a3df
+	rv = CRYPTOKI_F_PTR( C_Initialize(NULL_PTR) );
b4a3df
+	CPPUNIT_ASSERT(rv == CKR_OK);
b4a3df
+
b4a3df
+	// Get the size of the buffer
b4a3df
+	rv = CRYPTOKI_F_PTR( C_GetMechanismList(m_initializedTokenSlotID, NULL_PTR, &ulMechCount) );
b4a3df
+	CPPUNIT_ASSERT(rv == CKR_OK);
b4a3df
+	pMechanismList = (CK_MECHANISM_TYPE_PTR)malloc(ulMechCount * sizeof(CK_MECHANISM_TYPE_PTR));
b4a3df
+	/* Remember how many mechanisms are supported */
b4a3df
+	allMechsCount = ulMechCount;
b4a3df
+
b4a3df
+	// Get the mechanism list
b4a3df
+	rv = CRYPTOKI_F_PTR( C_GetMechanismList(m_initializedTokenSlotID, pMechanismList, &ulMechCount) );
b4a3df
+	CPPUNIT_ASSERT(rv == CKR_OK);
b4a3df
+	CPPUNIT_ASSERT_EQUAL(allMechsCount, ulMechCount);
b4a3df
+	free(pMechanismList);
b4a3df
+
b4a3df
+	CRYPTOKI_F_PTR( C_Finalize(NULL_PTR) );
b4a3df
+	/* Now try with configuration having negative list */
b4a3df
+#ifndef _WIN32
b4a3df
+	setenv("SOFTHSM2_CONF", "./softhsm2-negative-mech.conf", 1);
b4a3df
+#else
b4a3df
+	setenv("SOFTHSM2_CONF", ".\\softhsm2-negative-mech.conf", 1);
b4a3df
+#endif
b4a3df
+
b4a3df
+	rv = CRYPTOKI_F_PTR( C_Initialize(NULL_PTR) );
b4a3df
+	CPPUNIT_ASSERT(rv == CKR_OK);
b4a3df
+
b4a3df
+	// Get the size of the buffer
b4a3df
+	rv = CRYPTOKI_F_PTR( C_GetMechanismList(m_initializedTokenSlotID, NULL_PTR, &ulMechCount) );
b4a3df
+	CPPUNIT_ASSERT(rv == CKR_OK);
b4a3df
+	/* We should get 2 shorter */
b4a3df
+	//CPPUNIT_ASSERT_EQUAL(allMechsCount - 2, ulMechCount);
b4a3df
+	pMechanismList = (CK_MECHANISM_TYPE_PTR)malloc(ulMechCount * sizeof(CK_MECHANISM_TYPE_PTR));
b4a3df
+
b4a3df
+	// Get the mechanism list
b4a3df
+	rv = CRYPTOKI_F_PTR( C_GetMechanismList(m_initializedTokenSlotID, pMechanismList, &ulMechCount) );
b4a3df
+	CPPUNIT_ASSERT(rv == CKR_OK);
b4a3df
+	//CPPUNIT_ASSERT_EQUAL(allMechsCount - 2, ulMechCount);
b4a3df
+	for (unsigned long i = 0; i < ulMechCount; i++) {
b4a3df
+		CPPUNIT_ASSERT(pMechanismList[i] != CKM_RSA_X_509);
b4a3df
+		CPPUNIT_ASSERT(pMechanismList[i] != CKM_RSA_PKCS);
b4a3df
+	}
b4a3df
+	free(pMechanismList);
b4a3df
+
b4a3df
+	CRYPTOKI_F_PTR( C_Finalize(NULL_PTR) );
b4a3df
+#ifndef _WIN32
b4a3df
+	setenv("SOFTHSM2_CONF", "./softhsm2.conf", 1);
b4a3df
+#else
b4a3df
+	setenv("SOFTHSM2_CONF", ".\\softhsm2.conf", 1);
b4a3df
+#endif
b4a3df
+}
b4a3df
+
b4a3df
 void InfoTests::testWaitForSlotEvent()
b4a3df
 {
b4a3df
 	CK_RV rv;
b4a3df
diff --git a/src/lib/test/InfoTests.h b/src/lib/test/InfoTests.h
b4a3df
index dfd02953..1cc99ccb 100644
b4a3df
--- a/src/lib/test/InfoTests.h
b4a3df
+++ b/src/lib/test/InfoTests.h
b4a3df
@@ -49,6 +49,7 @@ class InfoTests : public TestsNoPINInitBase
b4a3df
 	CPPUNIT_TEST(testGetMechanismInfo);
b4a3df
 	CPPUNIT_TEST(testGetSlotInfoAlt);
b4a3df
 	CPPUNIT_TEST(testGetMechanismListConfig);
b4a3df
+	CPPUNIT_TEST(testGetMechanismNegativeListConfig);
b4a3df
 	CPPUNIT_TEST(testWaitForSlotEvent);
b4a3df
 	CPPUNIT_TEST_SUITE_END();
b4a3df
 
b4a3df
@@ -62,6 +63,7 @@ class InfoTests : public TestsNoPINInitBase
b4a3df
 	void testGetMechanismInfo();
b4a3df
 	void testGetSlotInfoAlt();
b4a3df
 	void testGetMechanismListConfig();
b4a3df
+	void testGetMechanismNegativeListConfig();
b4a3df
 	void testWaitForSlotEvent();
b4a3df
 };
b4a3df
 
b4a3df
diff --git a/src/lib/test/Makefile.am b/src/lib/test/Makefile.am
b4a3df
index 17887dd4..a22ce668 100644
b4a3df
--- a/src/lib/test/Makefile.am
b4a3df
+++ b/src/lib/test/Makefile.am
b4a3df
@@ -39,6 +39,7 @@ EXTRA_DIST =			$(srcdir)/CMakeLists.txt \
b4a3df
 				$(srcdir)/*.h \
b4a3df
 				$(srcdir)/softhsm2-alt.conf.win32 \
b4a3df
 				$(srcdir)/softhsm2-reset-on-fork.conf.win32 \
b4a3df
+				$(srcdir)/softhsm2-negative-mech.conf.win32 \
b4a3df
 				$(srcdir)/softhsm2-mech.conf.win32 \
b4a3df
 				$(srcdir)/softhsm2.conf.win32 \
b4a3df
 				$(srcdir)/tokens/dummy.in
b4a3df
diff --git a/src/lib/test/softhsm2-negative-mech.conf.in b/src/lib/test/softhsm2-negative-mech.conf.in
b4a3df
new file mode 100644
b4a3df
index 00000000..51f7e6ac
b4a3df
--- /dev/null
b4a3df
+++ b/src/lib/test/softhsm2-negative-mech.conf.in
b4a3df
@@ -0,0 +1,8 @@
b4a3df
+# SoftHSM v2 configuration file
b4a3df
+
b4a3df
+directories.tokendir = @builddir@/tokens
b4a3df
+objectstore.backend = file
b4a3df
+log.level = INFO
b4a3df
+slots.removable = false
b4a3df
+slots.mechanisms = -CKM_RSA_X_509,CKM_RSA_PKCS
b4a3df
+
b4a3df
diff --git a/src/lib/test/softhsm2-negative-mech.conf.win32 b/src/lib/test/softhsm2-negative-mech.conf.win32
b4a3df
new file mode 100644
b4a3df
index 00000000..a3aefb96
b4a3df
--- /dev/null
b4a3df
+++ b/src/lib/test/softhsm2-negative-mech.conf.win32
b4a3df
@@ -0,0 +1,7 @@
b4a3df
+# SoftHSM v2 configuration file
b4a3df
+
b4a3df
+directories.tokendir = .\tokens
b4a3df
+objectstore.backend = file
b4a3df
+log.level = INFO
b4a3df
+slots.removable = false
b4a3df
+slots.mechanisms = -CKM_RSA_X_509,CKM_RSA_PKCS
b4a3df
diff --git a/win32/p11test/p11test.vcxproj.in b/win32/p11test/p11test.vcxproj.in
b4a3df
index 55dfb087..88859bca 100644
b4a3df
--- a/win32/p11test/p11test.vcxproj.in
b4a3df
+++ b/win32/p11test/p11test.vcxproj.in
b4a3df
@@ -67,6 +67,7 @@ copy ..\..\src\lib\test\softhsm2.conf.win32 "$(TargetDir)\softhsm2.conf"
b4a3df
 copy ..\..\src\lib\test\softhsm2-alt.conf.win32 "$(TargetDir)\softhsm2-alt.conf"
b4a3df
 copy ..\..\src\lib\test\softhsm2-reset-on-fork.conf.win32 "$(TargetDir)\softhsm2-reset-on-fork.conf"
b4a3df
 copy ..\..\src\lib\test\softhsm2-mech.conf.win32 "$(TargetDir)\softhsm2-mech.conf"
b4a3df
+copy ..\..\src\lib\test\softhsm2-negative-mech.conf.win32 "$(TargetDir)\softhsm2-negative-mech.conf"
b4a3df
 mkdir "$(TargetDir)\tokens" 2> nul
b4a3df
 copy ..\..\src\lib\test\tokens\dummy.in "$(TargetDir)\tokens\dummy"
b4a3df
       </Command>
b4a3df
@@ -99,6 +100,7 @@ copy ..\..\src\lib\test\softhsm2.conf.win32 "$(TargetDir)\softhsm2.conf"
b4a3df
 copy ..\..\src\lib\test\softhsm2-alt.conf.win32 "$(TargetDir)\softhsm2-alt.conf"
b4a3df
 copy ..\..\src\lib\test\softhsm2-reset-on-fork.conf.win32 "$(TargetDir)\softhsm2-reset-on-fork.conf"
b4a3df
 copy ..\..\src\lib\test\softhsm2-mech.conf.win32 "$(TargetDir)\softhsm2-mech.conf"
b4a3df
+copy ..\..\src\lib\test\softhsm2-negative-mech.conf.win32 "$(TargetDir)\softhsm2-negative-mech.conf"
b4a3df
 mkdir "$(TargetDir)\tokens" 2> nul
b4a3df
 copy ..\..\src\lib\test\tokens\dummy.in "$(TargetDir)\tokens\dummy"
b4a3df
       </Command>