diff options
Diffstat (limited to 'SoftHSMv2/src/lib/test/TestsNoPINInitBase.cpp')
-rw-r--r-- | SoftHSMv2/src/lib/test/TestsNoPINInitBase.cpp | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/SoftHSMv2/src/lib/test/TestsNoPINInitBase.cpp b/SoftHSMv2/src/lib/test/TestsNoPINInitBase.cpp new file mode 100644 index 0000000..f5bb066 --- /dev/null +++ b/SoftHSMv2/src/lib/test/TestsNoPINInitBase.cpp @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2010 .SE (The Internet Infrastructure Foundation) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/***************************************************************************** + TestsNoPINInitBase.cpp + + Base class for test classes. Used when there is no need for user login. + *****************************************************************************/ + +#include "TestsNoPINInitBase.h" +#include <cstring> +#include <cppunit/extensions/HelperMacros.h> +#include <vector> +#include <sstream> + +#ifdef P11M +#ifdef _WIN32 +CK_FUNCTION_LIST_PTR FunctionList::getFunctionListPtr(const char*const libName, HINSTANCE__* p11Library, const char*getFunctionList) { +#else +#include <dlfcn.h> + +static CK_FUNCTION_LIST_PTR getFunctionListPtr(const char*const libName, void *const p11Library, const char*getFunctionList) { +#endif //_WIN32 + CPPUNIT_ASSERT_MESSAGE(libName, p11Library); +#ifdef _WIN32 + const CK_C_GetFunctionList pGFL( (CK_C_GetFunctionList)GetProcAddress( + p11Library, + getFunctionList.c_str() + ) ); +#else + const CK_C_GetFunctionList pGFL( (CK_C_GetFunctionList)dlsym( + p11Library, + getFunctionList + ) ); +#endif //_WIN32 + CPPUNIT_ASSERT_MESSAGE(libName, pGFL); + CK_FUNCTION_LIST_PTR ptr(NULL_PTR); + const CK_RV retCode( pGFL(&ptr) ); + if ( !ptr && (retCode)!=CKR_OK) { + std::ostringstream oss; + oss << "C_GetFunctionList failed...error no = 0x" << std::hex << retCode << " libName '" << libName << "'."; + CPPUNIT_ASSERT_MESSAGE(oss.str(), false); + } + return ptr; +} +#endif //P11M +void TestsNoPINInitBase::getSlotIDs() { + bool hasFoundFree(false); + bool hasFoundInitialized(false); + CK_ULONG nrOfSlots; + CPPUNIT_ASSERT( CRYPTOKI_F_PTR( C_GetSlotList(CK_TRUE, NULL_PTR, &nrOfSlots)==CKR_OK ) ); + std::vector<CK_SLOT_ID> slotIDs(nrOfSlots); + CPPUNIT_ASSERT( CRYPTOKI_F_PTR( C_GetSlotList(CK_TRUE, &slotIDs.front(), &nrOfSlots)==CKR_OK ) ); + for ( std::vector<CK_SLOT_ID>::iterator i=slotIDs.begin(); i!=slotIDs.end(); i++ ) { + CK_TOKEN_INFO tokenInfo; + CPPUNIT_ASSERT( CRYPTOKI_F_PTR( C_GetTokenInfo(*i, &tokenInfo)==CKR_OK ) ); + if ( tokenInfo.flags&CKF_TOKEN_INITIALIZED ) { + if ( !hasFoundInitialized ) { + hasFoundInitialized = true; + m_initializedTokenSlotID = *i; + } + } else { + if ( !hasFoundFree ) { + hasFoundFree = true; + m_notInitializedTokenSlotID = *i; + } + } + } + if ( !hasFoundInitialized ) { + m_initializedTokenSlotID = m_notInitializedTokenSlotID; + } +} + +TestsNoPINInitBase::TestsNoPINInitBase() : +#ifdef P11M +#ifdef _WIN32 + p11Library( LoadLibrary(libName.c_str()) ), +#else + p11Library( dlopen(P11M, RTLD_LAZY) ), +#endif + m_ptr(getFunctionListPtr(P11M, p11Library, "C_GetFunctionList")), +#endif + m_invalidSlotID(((CK_SLOT_ID)1<<31)), + m_initializedTokenSlotID(m_invalidSlotID), + m_notInitializedTokenSlotID(m_invalidSlotID), + m_soPin1((CK_UTF8CHAR_PTR)"12345678"), + m_soPin1Length(strlen((char*)m_soPin1)), + m_userPin1((CK_UTF8CHAR_PTR)"1234"), + m_userPin1Length(strlen((char*)m_userPin1)) {}; + +void TestsNoPINInitBase::setUp() { + CK_UTF8CHAR label[32]; + memset(label, ' ', 32); + memcpy(label, "token1", strlen("token1")); + + // initialize cryptoki + CPPUNIT_ASSERT_EQUAL( (CK_RV)CKR_OK, CRYPTOKI_F_PTR( C_Initialize(NULL_PTR) ) ); + // update slot IDs to initialized and not initialized token. + getSlotIDs(); + // (Re)initialize the token + CPPUNIT_ASSERT_EQUAL( (CK_RV)CKR_OK, CRYPTOKI_F_PTR( C_InitToken(m_initializedTokenSlotID, m_soPin1, m_soPin1Length, label) ) ); + // Reset cryptoki to get new slot IDs. + CPPUNIT_ASSERT_EQUAL( (CK_RV)CKR_OK, CRYPTOKI_F_PTR( C_Finalize(NULL_PTR) ) ); + CPPUNIT_ASSERT_EQUAL( (CK_RV)CKR_OK, CRYPTOKI_F_PTR( C_Initialize(NULL_PTR) ) ); + // slot IDs must be updated since the ID of the initialized token has changed. + getSlotIDs(); +} + +void TestsNoPINInitBase::tearDown() { + const CK_RV result(CRYPTOKI_F_PTR( C_Finalize(NULL_PTR) ) ); + if ( result==CKR_OK||result==CKR_CRYPTOKI_NOT_INITIALIZED ) { + return; + } + std::ostringstream oss; + oss << "C_Finalize failed with CK_RV: " << std::hex << result; + CPPUNIT_ASSERT_MESSAGE(oss.str(), false); +} + +#ifdef P11M +TestsNoPINInitBase::~TestsNoPINInitBase() { + if ( !p11Library ) { + return; + } +#ifdef _WIN32 + FreeLibrary(p11Library); +#else + dlclose(p11Library); +#endif // _WIN32 +} + +void softHSMLog(const int, const char*, const char*, const int, const char*, ...) +{ + +} +#else +TestsNoPINInitBase::~TestsNoPINInitBase() {} +#endif // P11M |