diff options
-rw-r--r-- | compat.c | 231 | ||||
-rw-r--r-- | compat.h | 19 | ||||
-rw-r--r-- | p11-tests.sln | 20 | ||||
-rw-r--r-- | p11-tests.vcproj | 254 | ||||
-rw-r--r-- | src/check.c | 2 | ||||
-rw-r--r-- | src/config.c | 2 | ||||
-rw-r--r-- | src/key.c | 2 | ||||
-rw-r--r-- | src/module.c | 219 | ||||
-rw-r--r-- | src/msg.c | 48 | ||||
-rw-r--r-- | src/object.c | 2 | ||||
-rw-r--r-- | src/p11-tests.c | 2 | ||||
-rw-r--r-- | src/p11-tests.h | 10 | ||||
-rw-r--r-- | src/rsa.c | 30 | ||||
-rw-r--r-- | src/session.c | 4 | ||||
-rw-r--r-- | src/slot.c | 11 | ||||
-rw-r--r-- | src/test-data.c | 6 |
16 files changed, 777 insertions, 85 deletions
diff --git a/compat.c b/compat.c new file mode 100644 index 0000000..13794b4 --- /dev/null +++ b/compat.c @@ -0,0 +1,231 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000-2002 The Apache Software 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. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * nor may "Apache" appear in their name, without prior written + * permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS 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. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * <http://www.apache.org/>. + * + * Portions of this software are based upon public domain software + * originally written at the National Center for Supercomputing Applications, + * University of Illinois, Urbana-Champaign. + */ + +#ifdef _WIN32 + +#include <stdio.h> +#include <string.h> +#include <assert.h> +#include <stdlib.h> + +#define OPTERRCOLON (1) +#define OPTERRNF (2) +#define OPTERRARG (3) + +char *optarg; +int optreset = 0; +int optind = 1; +int opterr = 1; +int optopt; + +static int +optiserr(int argc, char * const *argv, int oint, const char *optstr, + int optchr, int err) +{ + if(opterr) + { + fprintf(stderr, "Error in argument %d, char %d: ", oint, optchr+1); + switch(err) + { + case OPTERRCOLON: + fprintf(stderr, ": in flags\n"); + break; + case OPTERRNF: + fprintf(stderr, "option not found %c\n", argv[oint][optchr]); + break; + case OPTERRARG: + fprintf(stderr, "no argument for option %c\n", argv[oint][optchr]); + break; + default: + fprintf(stderr, "unknown\n"); + break; + } + } + optopt = argv[oint][optchr]; + return('?'); +} + + + +int +getopt(int argc, char* const *argv, const char *optstr) +{ + static int optchr = 0; + static int dash = 0; /* have already seen the - */ + + char *cp; + + if (optreset) + optreset = optchr = dash = 0; + if(optind >= argc) + return(EOF); + if(!dash && (argv[optind][0] != '-')) + return(EOF); + if(!dash && (argv[optind][0] == '-') && !argv[optind][1]) + { + /* + * use to specify stdin. Need to let pgm process this and + * the following args + */ + return(EOF); + } + if((argv[optind][0] == '-') && (argv[optind][1] == '-')) + { + /* -- indicates end of args */ + optind++; + return(EOF); + } + if(!dash) + { + assert((argv[optind][0] == '-') && argv[optind][1]); + dash = 1; + optchr = 1; + } + + /* Check if the guy tries to do a -: kind of flag */ + assert(dash); + if(argv[optind][optchr] == ':') + { + dash = 0; + optind++; + return(optiserr(argc, argv, optind-1, optstr, optchr, OPTERRCOLON)); + } + if(!(cp = strchr(optstr, argv[optind][optchr]))) + { + int errind = optind; + int errchr = optchr; + + if(!argv[optind][optchr+1]) + { + dash = 0; + optind++; + } + else + optchr++; + return(optiserr(argc, argv, errind, optstr, errchr, OPTERRNF)); + } + if(cp[1] == ':') + { + dash = 0; + optind++; + if(optind == argc) + return(optiserr(argc, argv, optind-1, optstr, optchr, OPTERRARG)); + optarg = argv[optind++]; + return(*cp); + } + else + { + if(!argv[optind][optchr+1]) + { + dash = 0; + optind++; + } + else + optchr++; + return(*cp); + } + assert(0); + return(0); +} + +#ifdef TESTGETOPT +int + main (int argc, char **argv) + { + int c; + extern char *optarg; + extern int optind; + int aflg = 0; + int bflg = 0; + int errflg = 0; + char *ofile = NULL; + + while ((c = getopt(argc, argv, "abo:")) != EOF) + switch (c) { + case 'a': + if (bflg) + errflg++; + else + aflg++; + break; + case 'b': + if (aflg) + errflg++; + else + bflg++; + break; + case 'o': + ofile = optarg; + (void)printf("ofile = %s\n", ofile); + break; + case '?': + errflg++; + } + if (errflg) { + (void)fprintf(stderr, + "usage: cmd [-a|-b] [-o <filename>] files...\n"); + exit (2); + } + for ( ; optind < argc; optind++) + (void)printf("%s\n", argv[optind]); + return 0; + } + +#endif /* TESTGETOPT */ + +#endif /* WIN32 */ diff --git a/compat.h b/compat.h new file mode 100644 index 0000000..02ad831 --- /dev/null +++ b/compat.h @@ -0,0 +1,19 @@ + +#ifndef _COMPAT_H_ +#define _COMPAT_H_ + +#ifdef _WIN32 + +int getopt(int argc, char* const *argv, const char *optstr); +extern char *optarg; +extern int optreset; +extern int optind; +extern int opterr; + +#else + +#include <unistd.h> + +#endif + +#endif /* _COMPAT_H_ */ diff --git a/p11-tests.sln b/p11-tests.sln new file mode 100644 index 0000000..286b709 --- /dev/null +++ b/p11-tests.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual C++ Express 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p11-tests", "p11-tests.vcproj", "{9F45CE89-9B52-442A-82ED-929391ECF072}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9F45CE89-9B52-442A-82ED-929391ECF072}.Debug|Win32.ActiveCfg = Debug|Win32 + {9F45CE89-9B52-442A-82ED-929391ECF072}.Debug|Win32.Build.0 = Debug|Win32 + {9F45CE89-9B52-442A-82ED-929391ECF072}.Release|Win32.ActiveCfg = Release|Win32 + {9F45CE89-9B52-442A-82ED-929391ECF072}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/p11-tests.vcproj b/p11-tests.vcproj new file mode 100644 index 0000000..de29a8e --- /dev/null +++ b/p11-tests.vcproj @@ -0,0 +1,254 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="p11-tests" + ProjectGUID="{9F45CE89-9B52-442A-82ED-929391ECF072}" + RootNamespace="p11-tests" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="$(ProjectDir)" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="libeay32MTd.lib" + LinkIncremental="2" + GenerateDebugInformation="true" + SubSystem="1" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="Release" + ConfigurationType="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="$(ProjectDir)" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;" + RuntimeLibrary="2" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="libeay32MT.lib" + LinkIncremental="2" + GenerateDebugInformation="true" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath=".\src\p11-tests.h" + > + </File> + <File + RelativePath=".\pkcs11\pkcs11.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\src\check.c" + > + </File> + <File + RelativePath=".\compat.c" + > + </File> + <File + RelativePath=".\compat.h" + > + </File> + <File + RelativePath=".\src\config.c" + > + </File> + <File + RelativePath=".\src\key.c" + > + </File> + <File + RelativePath=".\src\module.c" + > + </File> + <File + RelativePath=".\src\msg.c" + > + </File> + <File + RelativePath=".\src\object.c" + > + </File> + <File + RelativePath=".\src\p11-tests.c" + > + </File> + <File + RelativePath=".\src\rsa.c" + > + </File> + <File + RelativePath=".\src\session.c" + > + </File> + <File + RelativePath=".\src\slot.c" + > + </File> + <File + RelativePath=".\src\test-data.c" + > + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/src/check.c b/src/check.c index 334a9e7..d76f0e9 100644 --- a/src/check.c +++ b/src/check.c @@ -1,6 +1,4 @@ -#include "config.h" - #include "p11-tests.h" #include <ctype.h> diff --git a/src/config.c b/src/config.c index 9ca3bb0..48b4151 100644 --- a/src/config.c +++ b/src/config.c @@ -1,6 +1,4 @@ -#include "config.h" - #include "p11-tests.h" #include <ctype.h> @@ -1,6 +1,4 @@ -#include "config.h" - #include "p11-tests.h" CK_OBJECT_HANDLE diff --git a/src/module.c b/src/module.c index e47ba38..cda07a2 100644 --- a/src/module.c +++ b/src/module.c @@ -1,15 +1,27 @@ -#include "config.h" +#ifdef _WIN32 -#include "p11-tests.h" +#define WIN32_LEAN_AND_MEAN +#define _WIN32_WINNT 0x400 +#include <windows.h> + +static HMODULE module = NULL; + +#else /* !_WIN32 */ #include <dlfcn.h> -#include <errno.h> #include <pthread.h> + +static void *module = NULL; + +#endif /* !_WIN32 */ + +#include "p11-tests.h" + +#include <errno.h> #include <stdlib.h> #include <string.h> -static void *module = NULL; CK_FUNCTION_LIST_PTR p11t_module_funcs = NULL; static const char *init_string = NULL; @@ -27,127 +39,221 @@ p11t_module_config(const char *name, const char *value) static CK_RV create_mutex(void **mutex) { - pthread_mutex_t *mut; - if(!mutex) { p11t_msg_print("CreateMutex: null mutex passed"); return CKR_ARGUMENTS_BAD; } - mut = malloc(sizeof(pthread_mutex_t)); - assert(mut); +#ifdef _WIN32 + + *mutex = CreateMutex(NULL, FALSE, NULL); + assert(*mutex != NULL); + +#else /* !_WIN32 */ + + { + pthread_mutex_t *mut; + mut = malloc(sizeof(pthread_mutex_t)); + assert(mut); + + if(pthread_mutex_init(mut, NULL) != 0) + assert(0); + *mutex = mut; + } + +#endif /* !_WIN32 */ - if(pthread_mutex_init(mut, NULL) != 0) - assert(0); - *mutex = mut; return CKR_OK; } static CK_RV destroy_mutex (void *mutex) { - int res; - if(!mutex) { p11t_msg_print("DestroyMutex: null mutex"); return CKR_MUTEX_BAD; } - res = pthread_mutex_destroy(mutex); - if(res != 0) +#ifdef _WIN32 + + if(!CloseHandle((HANDLE)mutex)) { - if(res == EBUSY) - { - p11t_msg_print("DestroyMutex: mutex is locked"); - return CKR_GENERAL_ERROR; - } - else if(res == EINVAL) + DWORD error = GetLastError(); + if(error == ERROR_INVALID_HANDLE) { p11t_msg_print("DestroyMutex: mutex is invalid"); return CKR_MUTEX_BAD; } else { - p11t_msg_print("DestroyMutex: failed: %d", res); + p11t_msg_print("DestroyMutex: failed: %d", GetLastError()); return CKR_GENERAL_ERROR; + } + } + +#else /* !_WIN32 */ + + { + int res = pthread_mutex_destroy(mutex); + if(res != 0) + { + if(res == EBUSY) + { + p11t_msg_print("DestroyMutex: mutex is locked"); + return CKR_GENERAL_ERROR; + } + else if(res == EINVAL) + { + p11t_msg_print("DestroyMutex: mutex is invalid"); + return CKR_MUTEX_BAD; + } + else + { + p11t_msg_print("DestroyMutex: failed: %d", res); + return CKR_GENERAL_ERROR; + + } } } +#endif /* !_WIN32 */ + return CKR_OK; } static CK_RV lock_mutex (void *mutex) { - int res; - if (!mutex) + if(!mutex) { p11t_msg_print("LockMutex: null mutex"); return CKR_MUTEX_BAD; } - res = pthread_mutex_lock(mutex); - if(res != 0) +#ifdef _WIN32 + { - if(res == EDEADLK) + DWORD result = WaitForSingleObject((HANDLE)mutex, INFINITE); + if(result == WAIT_ABANDONED) { - p11t_msg_print("LockMutex: would deadlock"); + p11t_msg_print("LockMutex: thread exited without releasing mutex"); return CKR_CANT_LOCK; } - else if(res == EINVAL) + else if(result == WAIT_FAILED) { - p11t_msg_print("LockMutex: invalid mutex used"); - return CKR_MUTEX_BAD; + DWORD error = GetLastError(); + if(error == ERROR_INVALID_HANDLE) + { + p11t_msg_print("LockMutex: invalid handle"); + return CKR_MUTEX_BAD; + } + else + { + p11t_msg_print("LockMutex: failed: %d", error); + return CKR_GENERAL_ERROR; + } } - else + else if(result != WAIT_OBJECT_0) { - p11t_msg_print("LockMutex: failed: %d", res); - return CKR_GENERAL_ERROR; + p11t_msg_print("LockMutex: couldn't lock"); + return CKR_CANT_LOCK; + } + } +#else /* !_WIN32 */ + + int res = pthread_mutex_lock(mutex); + if(res != 0) + { + if(res == EDEADLK) + { + p11t_msg_print("LockMutex: would deadlock"); + return CKR_CANT_LOCK; + } + else if(res == EINVAL) + { + p11t_msg_print("LockMutex: invalid mutex used"); + return CKR_MUTEX_BAD; + } + else + { + p11t_msg_print("LockMutex: failed: %d", res); + return CKR_GENERAL_ERROR; + + } } } +#endif /* !_WIN32 */ + return CKR_OK; } static CK_RV unlock_mutex (void *mutex) { - int res; - if (!mutex) + if(!mutex) { p11t_msg_print("UnlockMutex: null mutex"); return CKR_MUTEX_BAD; } - res = pthread_mutex_lock(mutex); - if(res != 0) +#ifdef _WIN32 + + if(!ReleaseMutex((HANDLE)mutex)) { - if(res == EPERM) + DWORD error = GetLastError(); + if(error == ERROR_NOT_OWNER) { p11t_msg_print("UnlockMutex: mutex not locked"); return CKR_MUTEX_NOT_LOCKED; } - else if(res == EINVAL) + else if(error == ERROR_INVALID_HANDLE) { p11t_msg_print("UnlockMutex: invalid mutex used"); return CKR_MUTEX_BAD; } else { - p11t_msg_print("UnlockMutex: failed: %d", res); + p11t_msg_print("UnlockMutex: failed: %d", error); return CKR_GENERAL_ERROR; - } } - else + +#else /* !_WIN32 */ + { - free(mutex); + int res = pthread_mutex_lock(mutex); + if(res != 0) + { + if(res == EPERM) + { + p11t_msg_print("UnlockMutex: mutex not locked"); + return CKR_MUTEX_NOT_LOCKED; + } + else if(res == EINVAL) + { + p11t_msg_print("UnlockMutex: invalid mutex used"); + return CKR_MUTEX_BAD; + } + else + { + p11t_msg_print("UnlockMutex: failed: %d", res); + return CKR_GENERAL_ERROR; + + } + } + else + { + free(mutex); + } } +#endif /* !_WIN32 */ + return CKR_OK; } @@ -158,6 +264,20 @@ p11t_module_load(const char *filename) CK_C_GetFunctionList get_function_list; CK_RV rv; +#ifdef _WIN32 + + module = LoadLibrary(filename); + if(!module) + p11t_msg_fatal("couldn't load library: %s: %s", filename, p11t_msg_lasterr()); + + /* Lookup the appropriate function in the library */ + get_function_list = (CK_C_GetFunctionList)GetProcAddress(module, "C_GetFunctionList"); + if(!get_function_list) + p11t_msg_fatal("C_GetFunctionList: couldn't find function in library: %s: %s", + filename, p11t_msg_lasterr()); + +#else /* !_WIN32 */ + module = dlopen(filename, RTLD_NOW); if(!module) p11t_msg_fatal("couldn't open library: %s: %s", filename, dlerror()); @@ -165,7 +285,10 @@ p11t_module_load(const char *filename) /* Lookup the appropriate function in library */ get_function_list = (CK_C_GetFunctionList)dlsym (module, "C_GetFunctionList"); if(!get_function_list) - p11t_msg_fatal("C_GetFunctionList: couldn't find function in library: %s: %s", filename, dlerror()); + p11t_msg_fatal("C_GetFunctionList: couldn't find function in library: %s: %s", + filename, dlerror()); + +#endif /* !_WIN32 */ /* Get the function list */ rv = (get_function_list)(&p11t_module_funcs); @@ -345,6 +468,12 @@ void p11t_module_unload(void) { if(module) + { +#ifdef _WIN32 + FreeLibrary(module); +#else dlclose(module); +#endif + } module = NULL; } @@ -1,12 +1,18 @@ -#include "config.h" - #include "p11-tests.h" #include <stdio.h> #include <stdlib.h> #include <string.h> +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#define _WIN32_WINNT 0x400 +#include <windows.h> +#else +#include <errno.h> +#endif + static const char *the_prefix = NULL; const char* @@ -107,10 +113,46 @@ p11t_msg_rv(CK_RV rv) } } +#ifdef _WIN32 + +static char last_error[1024]; + +const char* +p11t_msg_lasterr(void) +{ + LPVOID lpMsgBuf; + DWORD error = GetLastError(); + DWORD dwRet = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, error, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, 0, NULL); + if(dwRet && lpMsgBuf) + { + strncpy(last_error, lpMsgBuf, 1024); + LocalFree(lpMsgBuf); + } + else + { + _snprintf(last_error, 1024, "unknown error: 0x%08x", (int)error); + } + + return last_error; +} + +#else /* _WIN32 */ + +const char* +p11t_msg_lasterr(void) +{ + return strerror(errno); +} + +#endif /* _WIN32 */ + void p11t_msg_va(const char *message, va_list va) { - int len; + size_t len; if(the_prefix) fprintf(stdout, "%s: ", the_prefix); diff --git a/src/object.c b/src/object.c index fe4e801..bce527c 100644 --- a/src/object.c +++ b/src/object.c @@ -1,6 +1,4 @@ -#include "config.h" - #include "p11-tests.h" #include <stdlib.h> diff --git a/src/p11-tests.c b/src/p11-tests.c index 58d547a..58f0413 100644 --- a/src/p11-tests.c +++ b/src/p11-tests.c @@ -1,10 +1,10 @@ #include "p11-tests.h" +#include "compat.h" #include <stdio.h> #include <stdlib.h> -#include <unistd.h> int p11t_test_unexpected = 1; diff --git a/src/p11-tests.h b/src/p11-tests.h index c4a2e25..9be69da 100644 --- a/src/p11-tests.h +++ b/src/p11-tests.h @@ -1,6 +1,14 @@ #ifndef P11TESTST_H_ #define P11TESTST_H_ +#ifndef _WIN32 +#include "config.h" +#endif + +#ifdef _MSC_VER +#pragma warning(disable : 4996) +#endif + #include "pkcs11/pkcs11.h" #include <assert.h> @@ -17,6 +25,7 @@ extern int p11t_test_unexpected; */ const char* p11t_msg_rv(CK_RV rv); +const char* p11t_msg_lasterr(void); void p11t_msg_va(const char *message, va_list va); void p11t_msg_print(const char *message, ...); @@ -139,6 +148,7 @@ void p11t_slot_for_each_mech(CK_MECHANISM_TYPE mech_type, P11tSlotMechCallback c * test-data.c */ +#define P11T_BLOCK 1024 extern const CK_BYTE p11t_test_data[]; extern const CK_ULONG p11t_test_data_size; extern const CK_ULONG p11t_test_data_bits; @@ -1,6 +1,4 @@ -#include "config.h" - #include "p11-tests.h" #include <stdio.h> @@ -17,8 +15,8 @@ static void test_rsa_decrypt(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key, CK_MECHANISM_TYPE mech_type, RSA* rsa) { - CK_BYTE encrypted[p11t_test_data_size]; - CK_BYTE decrypted[p11t_test_data_size]; + CK_BYTE encrypted[P11T_BLOCK]; + CK_BYTE decrypted[P11T_BLOCK]; CK_MECHANISM mech; const CK_BYTE* data; CK_ULONG n_data, n_decrypted; @@ -34,7 +32,7 @@ test_rsa_decrypt(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key, assert(size); assert(size < sizeof(encrypted)); assert(size < sizeof(decrypted)); - assert(size < n_data); + assert(size < (int)n_data); switch(mech_type) { @@ -113,7 +111,7 @@ hash_for_rsa_pkcs_sign(int algo, int wrap, const CK_BYTE* data, if(!wrap) { assert(*n_output >= n_hash); - *n_output = n_hash; + *n_output = (CK_ULONG)n_hash; memcpy(output, hash, n_hash); return; } @@ -127,10 +125,10 @@ hash_for_rsa_pkcs_sign(int algo, int wrap, const CK_BYTE* data, sig.algor->parameter = ¶meter; sig.digest = &digest; sig.digest->data = hash; - sig.digest->length = n_hash; + sig.digest->length = (int)n_hash; val = i2d_X509_SIG(&sig, &output); - assert(*n_output >= val); + assert(*n_output >= (CK_ULONG)val); *n_output = val; } @@ -138,8 +136,8 @@ static void test_rsa_pkcs_sign_hash(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key, RSA* rsa, int algo) { - CK_BYTE hash[p11t_test_data_size]; - CK_BYTE sig[p11t_test_data_size]; + CK_BYTE hash[P11T_BLOCK]; + CK_BYTE sig[P11T_BLOCK]; CK_MECHANISM mech; CK_ULONG n_hash, n_sig; CK_RV rv; @@ -174,8 +172,8 @@ static void test_rsa_x509_sign(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key, RSA* rsa) { const CK_BYTE* data; - CK_BYTE sig[p11t_test_data_size]; - CK_BYTE check[p11t_test_data_size]; + CK_BYTE sig[P11T_BLOCK]; + CK_BYTE check[P11T_BLOCK]; CK_MECHANISM mech; CK_ULONG n_data, n_sig; CK_RV rv; @@ -202,7 +200,7 @@ test_rsa_x509_sign(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key, RSA* rsa) if(res < 0) p11t_check_fail("C_Sign: rsa x509 signature was invalid"); - assert(res > n_data); + assert(res > (int)n_data); if(memcmp(check + (res - n_data), data, n_data) != 0) p11t_check_fail("C_Sign: rsa x509 signature did not verify"); } @@ -267,8 +265,8 @@ static void test_rsa_encrypt(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key, CK_MECHANISM_TYPE mech_type, RSA* rsa) { - CK_BYTE encrypted[p11t_test_data_size]; - CK_BYTE check[p11t_test_data_size]; + CK_BYTE encrypted[P11T_BLOCK]; + CK_BYTE check[P11T_BLOCK]; CK_OBJECT_HANDLE privkey; CK_MECHANISM mech; const CK_BYTE* data; @@ -285,7 +283,7 @@ test_rsa_encrypt(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key, assert(size); assert(size < sizeof(encrypted)); assert(size < sizeof(check)); - assert(size < n_data); + assert(size < (int)n_data); switch(mech_type) { diff --git a/src/session.c b/src/session.c index 3db9b37..356fd8e 100644 --- a/src/session.c +++ b/src/session.c @@ -1,6 +1,4 @@ -#include "config.h" - #include "p11-tests.h" #include <string.h> @@ -79,7 +77,7 @@ calculate_pin(CK_SLOT_ID slot, CK_USER_TYPE user, CK_ULONG_PTR n_pin) pin = NULL; if(pin) - *n_pin = strlen(pin); + *n_pin = (CK_ULONG)strlen(pin); return (CK_UTF8CHAR_PTR)pin; } @@ -1,6 +1,4 @@ -#include "config.h" - #include "p11-tests.h" #include <stdlib.h> @@ -43,7 +41,7 @@ test_slot_global(void) /** - Normal call */ rv = (p11t_module_funcs->C_GetInfo)(&slot_global); - if(p11t_check_returns("C_GetInfo", rv, CKR_OK)) + if(!p11t_check_returns("C_GetInfo", rv, CKR_OK)) { memset(&slot_global, 0, sizeof(CK_INFO)); return; @@ -307,6 +305,9 @@ test_slot_mechanisms(void) rv = (p11t_module_funcs->C_GetMechanismList)(slot_id, NULL, &mech_count); p11t_check_returns("C_GetMechanismList: without buffer", rv, CKR_OK); + mech_list = NULL; + mech_info = NULL; + if(mech_count > 0) { mech_list = calloc(mech_count + 5, sizeof(CK_MECHANISM_TYPE)); @@ -377,9 +378,9 @@ test_slot_mechanisms(void) p11t_check_nflag("CK_MECHANISM_INFO.flags", mech_info[i].flags, CKF_EXTENSION); } - slot_mech_info[i] = mech_info; } + slot_mech_info[i] = mech_info; slot_mech_type[i] = mech_list; slot_mech_count[i] = mech_count; } @@ -424,7 +425,7 @@ get_slot_index(CK_SLOT_ID slot) CK_SLOT_ID p11t_slot_get_id(int index) { - if(index >= p11t_slot_count) + if(index >= (int)p11t_slot_count) return CK_INVALID; return slot_ids[index]; } diff --git a/src/test-data.c b/src/test-data.c index 6d94e74..4a05230 100644 --- a/src/test-data.c +++ b/src/test-data.c @@ -1,6 +1,4 @@ -#include "config.h" - #include "p11-tests.h" const CK_BYTE p11t_test_data[] = @@ -65,6 +63,6 @@ const CK_BYTE p11t_test_data[] = "0123456789ABCD E" \ "0123456789ABCD F"; -const CK_ULONG p11t_test_data_size = 1024; -const CK_ULONG p11t_test_data_bits = 1024 * 8; +const CK_ULONG p11t_test_data_size = P11T_BLOCK; +const CK_ULONG p11t_test_data_bits = P11T_BLOCK * 8; |