Browse Source

Merge pull request #5824 from SparkiDev/pkcs11_init_rv

PKCS#11: add initialization API that returns PKCS#11 return value
David Garske 1 year ago
parent
commit
7aa796bdbd
2 changed files with 30 additions and 2 deletions
  1. 28 2
      wolfcrypt/src/wc_pkcs11.c
  2. 2 0
      wolfssl/wolfcrypt/wc_pkcs11.h

+ 28 - 2
wolfcrypt/src/wc_pkcs11.c

@@ -409,6 +409,7 @@ static void pkcs11_val(const char* op, CK_ULONG val)
  *
  * @param  [in]  dev      Device object.
  * @param  [in]  library  Library name including path.
+ * @param  [in]  heap     Heap hint.
  * @return  BAD_FUNC_ARG when dev or library are NULL pointers.
  * @return  BAD_PATH_ERROR when dynamic library cannot be opened.
  * @return  WC_INIT_E when the initialization PKCS#11 fails.
@@ -416,9 +417,29 @@ static void pkcs11_val(const char* op, CK_ULONG val)
  * @return  0 on success.
  */
 int wc_Pkcs11_Initialize(Pkcs11Dev* dev, const char* library, void* heap)
+{
+    return wc_Pkcs11_Initialize_ex(dev, library, heap, NULL);
+}
+
+/**
+ * Load library, get function list and initialize PKCS#11.
+ *
+ * @param  [in]   dev      Device object.
+ * @param  [in]   library  Library name including path.
+ * @param  [in]   heap     Heap hint.
+ * @param  [out]  rvp      PKCS#11 return value. Last return value seen.
+ *                         May be NULL.
+ * @return  BAD_FUNC_ARG when dev or library are NULL pointers.
+ * @return  BAD_PATH_ERROR when dynamic library cannot be opened.
+ * @return  WC_INIT_E when the initialization PKCS#11 fails.
+ * @return  WC_HW_E when unable to get PKCS#11 function list.
+ * @return  0 on success.
+ */
+int wc_Pkcs11_Initialize_ex(Pkcs11Dev* dev, const char* library, void* heap,
+                            CK_RV* rvp)
 {
     int                  ret = 0;
-    CK_RV                rv;
+    CK_RV                rv = CKR_OK;
 #ifndef HAVE_PKCS11_STATIC
     void*                func;
 #endif
@@ -466,8 +487,13 @@ int wc_Pkcs11_Initialize(Pkcs11Dev* dev, const char* library, void* heap)
         }
     }
 
-    if (ret != 0)
+    if (rvp != NULL) {
+        *rvp = rv;
+    }
+
+    if (ret != 0) {
         wc_Pkcs11_Finalize(dev);
+    }
 
     return ret;
 }

+ 2 - 0
wolfssl/wolfcrypt/wc_pkcs11.h

@@ -72,6 +72,8 @@ enum Pkcs11KeyType {
 
 WOLFSSL_API int wc_Pkcs11_Initialize(Pkcs11Dev* dev, const char* library,
                                      void* heap);
+WOLFSSL_API int wc_Pkcs11_Initialize_ex(Pkcs11Dev* dev, const char* library,
+                                        void* heap, CK_RV* rvp);
 WOLFSSL_API void wc_Pkcs11_Finalize(Pkcs11Dev* dev);
 
 WOLFSSL_API int wc_Pkcs11Token_Init(Pkcs11Token* token, Pkcs11Dev* dev,