LCOV - code coverage report
Current view: top level - pkcs11/gkm - gkm-module-ep.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 29.3 % 648 190
Test Date: 2024-04-08 13:24:42 Functions: 32.4 % 68 22

            Line data    Source code
       1              : /*
       2              :  * gnome-keyring
       3              :  *
       4              :  * Copyright (C) 2008 Stefan Walter
       5              :  *
       6              :  * This program is free software; you can redistribute it and/or modify
       7              :  * it under the terms of the GNU Lesser General Public License as
       8              :  * published by the Free Software Foundation; either version 2.1 of
       9              :  * the License, or (at your option) any later version.
      10              :  *
      11              :  * This program is distributed in the hope that it will be useful, but
      12              :  * WITHOUT ANY WARRANTY; without even the implied warranty of
      13              :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14              :  * Lesser General Public License for more details.
      15              :  *
      16              :  * You should have received a copy of the GNU Lesser General Public
      17              :  * License along with this program; if not, see
      18              :  * <http://www.gnu.org/licenses/>.
      19              :  */
      20              : 
      21              : #include "gkm-crypto.h"
      22              : #include "gkm-module.h"
      23              : #include "gkm-session.h"
      24              : 
      25              : #include "pkcs11/pkcs11.h"
      26              : 
      27              : #include <unistd.h>
      28              : 
      29              : /* Forward declaration, this must be defined manually or using GKM_DEFINE_MODULE */
      30              : static GkmModule* gkm_module_instantiate (CK_C_INITIALIZE_ARGS_PTR args, GMutex *mutex);
      31              : 
      32              : static GkmModule *pkcs11_module = NULL;
      33              : static pid_t pkcs11_module_pid = 0;
      34              : static GMutex pkcs11_module_mutex = { 0, };
      35              : 
      36              : static CK_FUNCTION_LIST gkm_module_function_list;
      37              : 
      38              : static CK_RV
      39          287 : gkm_C_Initialize (CK_VOID_PTR init_args)
      40              : {
      41          287 :         CK_C_INITIALIZE_ARGS_PTR args = (CK_C_INITIALIZE_ARGS_PTR)init_args;
      42          287 :         CK_RV rv = CKR_OK;
      43          287 :         pid_t pid = getpid ();
      44              :         gboolean supplied_ok;
      45              : 
      46          287 :         if (args) {
      47              : 
      48              :                 /* ALL supplied function pointers need to have the value either NULL or non-NULL. */
      49          223 :                 supplied_ok = (args->CreateMutex == NULL && args->DestroyMutex == NULL &&
      50          446 :                                args->LockMutex == NULL && args->UnlockMutex == NULL) ||
      51            0 :                               (args->CreateMutex != NULL && args->DestroyMutex != NULL &&
      52            0 :                                args->LockMutex != NULL && args->UnlockMutex != NULL);
      53              : 
      54          223 :                 if (!supplied_ok) {
      55            0 :                         g_message ("invalid set of mutex calls supplied");
      56            0 :                         return CKR_ARGUMENTS_BAD;
      57              :                 }
      58              : 
      59          223 :                 if (!(args->flags & CKF_OS_LOCKING_OK)) {
      60            0 :                         g_message ("must be able to use our own locking and multi-thread primitives");
      61            0 :                         return CKR_CANT_LOCK;
      62              :                 }
      63              :         }
      64              : 
      65          287 :         gkm_crypto_initialize ();
      66              : 
      67          287 :         g_mutex_lock (&pkcs11_module_mutex);
      68              : 
      69          287 :                 if (pkcs11_module != NULL) {
      70            0 :                         if (pkcs11_module_pid == pid)
      71            0 :                                 rv = CKR_CRYPTOKI_ALREADY_INITIALIZED;
      72              :                         else
      73            0 :                                 pkcs11_module_pid = pid;
      74              :                 } else {
      75          287 :                         pkcs11_module = gkm_module_instantiate (args, &pkcs11_module_mutex);
      76          287 :                         if (!pkcs11_module) {
      77            0 :                                 g_warning ("module could not be instantiated");
      78            0 :                                 rv = CKR_GENERAL_ERROR;
      79              :                         } else {
      80          287 :                                 pkcs11_module_pid = pid;
      81              :                         }
      82              :                 }
      83              : 
      84          287 :         g_mutex_unlock (&pkcs11_module_mutex);
      85              : 
      86          287 :         return rv;
      87              : }
      88              : 
      89              : static CK_RV
      90          287 : gkm_C_Finalize (CK_VOID_PTR reserved)
      91              : {
      92          287 :         CK_RV rv = CKR_OK;
      93              : 
      94          287 :         if (reserved)
      95            0 :                 return CKR_ARGUMENTS_BAD;
      96              : 
      97          287 :         g_mutex_lock (&pkcs11_module_mutex);
      98              : 
      99          287 :                 if (pkcs11_module == NULL) {
     100            0 :                         rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     101              :                 } else {
     102          287 :                         g_object_run_dispose (G_OBJECT (pkcs11_module));
     103          287 :                         g_object_unref (pkcs11_module);
     104          287 :                         pkcs11_module = NULL;
     105          287 :                         pkcs11_module_pid = 0;
     106              :                 }
     107              : 
     108          287 :         g_mutex_unlock (&pkcs11_module_mutex);
     109              : 
     110          287 :         return rv;
     111              : }
     112              : 
     113              : static CK_RV
     114            2 : gkm_C_GetInfo (CK_INFO_PTR info)
     115              : {
     116            2 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     117              : 
     118            2 :         g_mutex_lock (&pkcs11_module_mutex);
     119              : 
     120            2 :                 if (pkcs11_module != NULL)
     121            2 :                         rv = gkm_module_C_GetInfo (pkcs11_module, info);
     122              : 
     123            2 :         g_mutex_unlock (&pkcs11_module_mutex);
     124              : 
     125            2 :         return rv;
     126              : }
     127              : 
     128              : static CK_RV
     129            0 : gkm_C_GetFunctionList (CK_FUNCTION_LIST_PTR_PTR list)
     130              : {
     131            0 :         if (!list)
     132            0 :                 return CKR_ARGUMENTS_BAD;
     133            0 :         *list = &gkm_module_function_list;
     134            0 :         return CKR_OK;
     135              : }
     136              : 
     137              : static CK_RV
     138          218 : gkm_C_GetSlotList (CK_BBOOL token_present, CK_SLOT_ID_PTR slot_list, CK_ULONG_PTR count)
     139              : {
     140          218 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     141              : 
     142          218 :         g_mutex_lock (&pkcs11_module_mutex);
     143              : 
     144          218 :                 if (pkcs11_module != NULL)
     145          218 :                         rv = gkm_module_C_GetSlotList (pkcs11_module, token_present, slot_list, count);
     146              : 
     147          218 :         g_mutex_unlock (&pkcs11_module_mutex);
     148              : 
     149          218 :         return rv;
     150              : }
     151              : 
     152              : static CK_RV
     153          264 : gkm_C_GetSlotInfo (CK_SLOT_ID id, CK_SLOT_INFO_PTR info)
     154              : {
     155          264 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     156              : 
     157          264 :         g_mutex_lock (&pkcs11_module_mutex);
     158              : 
     159          264 :                 if (pkcs11_module != NULL)
     160          264 :                         rv = gkm_module_C_GetSlotInfo (pkcs11_module, id, info);
     161              : 
     162          264 :         g_mutex_unlock (&pkcs11_module_mutex);
     163              : 
     164          264 :         return rv;
     165              : }
     166              : 
     167              : static CK_RV
     168          107 : gkm_C_GetTokenInfo (CK_SLOT_ID id, CK_TOKEN_INFO_PTR info)
     169              : {
     170          107 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     171              : 
     172          107 :         g_mutex_lock (&pkcs11_module_mutex);
     173              : 
     174          107 :                 if (pkcs11_module != NULL)
     175          107 :                         rv = gkm_module_C_GetTokenInfo (pkcs11_module, id, info);
     176              : 
     177          107 :         g_mutex_unlock (&pkcs11_module_mutex);
     178              : 
     179          107 :         return rv;
     180              : }
     181              : 
     182              : static CK_RV
     183            0 : gkm_C_GetMechanismList (CK_SLOT_ID id, CK_MECHANISM_TYPE_PTR mechanism_list, CK_ULONG_PTR count)
     184              : {
     185            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     186              : 
     187            0 :         g_mutex_lock (&pkcs11_module_mutex);
     188              : 
     189            0 :                 if (pkcs11_module != NULL)
     190            0 :                         rv = gkm_module_C_GetMechanismList (pkcs11_module, id, mechanism_list, count);
     191              : 
     192            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     193              : 
     194            0 :         return rv;
     195              : }
     196              : 
     197              : static CK_RV
     198            0 : gkm_C_GetMechanismInfo (CK_SLOT_ID id, CK_MECHANISM_TYPE type, CK_MECHANISM_INFO_PTR info)
     199              : {
     200            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     201              : 
     202            0 :         g_mutex_lock (&pkcs11_module_mutex);
     203              : 
     204            0 :                 if (pkcs11_module != NULL)
     205            0 :                         rv = gkm_module_C_GetMechanismInfo (pkcs11_module, id, type, info);
     206              : 
     207            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     208              : 
     209            0 :         return rv;
     210              : }
     211              : 
     212              : static CK_RV
     213            0 : gkm_C_InitToken (CK_SLOT_ID id, CK_UTF8CHAR_PTR pin, CK_ULONG pin_len, CK_UTF8CHAR_PTR label)
     214              : {
     215            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     216              : 
     217            0 :         g_mutex_lock (&pkcs11_module_mutex);
     218              : 
     219            0 :                 if (pkcs11_module != NULL)
     220            0 :                         rv = gkm_module_C_InitToken (pkcs11_module, id, pin, pin_len, label);
     221              : 
     222            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     223              : 
     224            0 :         return rv;
     225              : }
     226              : 
     227              : static CK_RV
     228            0 : gkm_C_WaitForSlotEvent (CK_FLAGS flags, CK_SLOT_ID_PTR slot, CK_VOID_PTR reserved)
     229              : {
     230              :         /*
     231              :          * PKCS#11 GRAY AREA: What happens when we know we'll *never*
     232              :          * have any slot events, and someone calls us without CKR_DONT_BLOCK?
     233              :          * In case there's a thread dedicated to calling this function in a
     234              :          * loop, we wait 5 seconds when called without CKR_DONT_BLOCK.
     235              :          */
     236              : 
     237            0 :         if (!(flags & CKF_DONT_BLOCK))
     238            0 :                 sleep (5);
     239              : 
     240            0 :         return CKR_NO_EVENT;
     241              : }
     242              : 
     243              : static CK_RV
     244           65 : gkm_C_OpenSession (CK_SLOT_ID id, CK_FLAGS flags, CK_VOID_PTR user_data, CK_NOTIFY callback, CK_SESSION_HANDLE_PTR handle)
     245              : {
     246           65 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     247              : 
     248           65 :         g_mutex_lock (&pkcs11_module_mutex);
     249              : 
     250           65 :                 if (pkcs11_module != NULL)
     251           65 :                         rv = gkm_module_C_OpenSession (pkcs11_module, id, flags, user_data, callback, handle);
     252              : 
     253           65 :         g_mutex_unlock (&pkcs11_module_mutex);
     254              : 
     255           65 :         return rv;
     256              : }
     257              : 
     258              : static CK_RV
     259           61 : gkm_C_CloseSession (CK_SESSION_HANDLE handle)
     260              : {
     261           61 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     262              : 
     263           61 :         g_mutex_lock (&pkcs11_module_mutex);
     264              : 
     265           61 :                 if (pkcs11_module != NULL)
     266           61 :                         rv = gkm_module_C_CloseSession (pkcs11_module, handle);
     267              : 
     268           61 :         g_mutex_unlock (&pkcs11_module_mutex);
     269              : 
     270           61 :         return rv;
     271              : }
     272              : 
     273              : static CK_RV
     274            0 : gkm_C_CloseAllSessions (CK_SLOT_ID id)
     275              : {
     276            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     277              : 
     278            0 :         g_mutex_lock (&pkcs11_module_mutex);
     279              : 
     280            0 :                 if (pkcs11_module != NULL)
     281            0 :                         rv = gkm_module_C_CloseAllSessions (pkcs11_module, id);
     282              : 
     283            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     284              : 
     285            0 :         return rv;
     286              : }
     287              : 
     288              : static CK_RV
     289            0 : gkm_C_GetFunctionStatus (CK_SESSION_HANDLE handle)
     290              : {
     291            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     292              :         GkmSession *session;
     293              : 
     294            0 :         g_mutex_lock (&pkcs11_module_mutex);
     295              : 
     296            0 :                 if (pkcs11_module != NULL) {
     297            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     298            0 :                         if (session != NULL)
     299            0 :                                 rv = gkm_session_C_GetFunctionStatus (session);
     300              :                         else
     301            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     302              :                 }
     303              : 
     304            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     305              : 
     306            0 :         return rv;
     307              : }
     308              : 
     309              : static CK_RV
     310            0 : gkm_C_CancelFunction (CK_SESSION_HANDLE handle)
     311              : {
     312            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     313              :         GkmSession *session;
     314              : 
     315            0 :         g_mutex_lock (&pkcs11_module_mutex);
     316              : 
     317            0 :                 if (pkcs11_module != NULL) {
     318            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     319            0 :                         if (session != NULL)
     320            0 :                                 rv = gkm_session_C_CancelFunction (session);
     321              :                         else
     322            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     323              :                 }
     324              : 
     325            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     326              : 
     327            0 :         return rv;
     328              : }
     329              : 
     330              : static CK_RV
     331           58 : gkm_C_GetSessionInfo (CK_SESSION_HANDLE handle, CK_SESSION_INFO_PTR info)
     332              : {
     333           58 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     334              :         GkmSession *session;
     335              : 
     336           58 :         g_mutex_lock (&pkcs11_module_mutex);
     337              : 
     338           58 :                 if (pkcs11_module != NULL) {
     339           58 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     340           58 :                         if (session != NULL)
     341           58 :                                 rv = gkm_session_C_GetSessionInfo (session,
     342              :                                                                    info);
     343              :                         else
     344            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     345              :                 }
     346              : 
     347           58 :         g_mutex_unlock (&pkcs11_module_mutex);
     348              : 
     349           58 :         return rv;
     350              : }
     351              : 
     352              : static CK_RV
     353            4 : gkm_C_InitPIN (CK_SESSION_HANDLE handle, CK_UTF8CHAR_PTR pin, CK_ULONG pin_len)
     354              : {
     355            4 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     356              : 
     357            4 :         g_mutex_lock (&pkcs11_module_mutex);
     358              : 
     359            4 :                 if (pkcs11_module != NULL)
     360            4 :                         rv = gkm_module_C_InitPIN (pkcs11_module, handle, pin, pin_len);
     361              : 
     362            4 :         g_mutex_unlock (&pkcs11_module_mutex);
     363              : 
     364            4 :         return rv;
     365              : }
     366              : 
     367              : static CK_RV
     368            1 : gkm_C_SetPIN (CK_SESSION_HANDLE handle, CK_UTF8CHAR_PTR old_pin, CK_ULONG old_pin_len, CK_UTF8CHAR_PTR new_pin, CK_ULONG new_pin_len)
     369              : {
     370            1 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     371              : 
     372            1 :         g_mutex_lock (&pkcs11_module_mutex);
     373              : 
     374            1 :                 if (pkcs11_module != NULL)
     375            1 :                         rv = gkm_module_C_SetPIN (pkcs11_module, handle, old_pin, old_pin_len, new_pin, new_pin_len);
     376              : 
     377            1 :         g_mutex_unlock (&pkcs11_module_mutex);
     378              : 
     379            1 :         return rv;
     380              : }
     381              : 
     382              : static CK_RV
     383            0 : gkm_C_GetOperationState (CK_SESSION_HANDLE handle, CK_BYTE_PTR operation_state, CK_ULONG_PTR operation_state_len)
     384              : {
     385            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     386              :         GkmSession *session;
     387              : 
     388            0 :         g_mutex_lock (&pkcs11_module_mutex);
     389              : 
     390            0 :                 if (pkcs11_module != NULL) {
     391            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     392            0 :                         if (session != NULL)
     393            0 :                                 rv = gkm_session_C_GetOperationState (session,
     394              :                                                                       operation_state, operation_state_len);
     395              :                         else
     396            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     397              :                 }
     398              : 
     399            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     400              : 
     401            0 :         return rv;
     402              : }
     403              : 
     404              : static CK_RV
     405            0 : gkm_C_SetOperationState (CK_SESSION_HANDLE handle, CK_BYTE_PTR operation_state,
     406              :                          CK_ULONG operation_state_len, CK_OBJECT_HANDLE encryption_key,
     407              :                          CK_OBJECT_HANDLE authentication_key)
     408              : {
     409            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     410              :         GkmSession *session;
     411              : 
     412            0 :         g_mutex_lock (&pkcs11_module_mutex);
     413              : 
     414            0 :                 if (pkcs11_module != NULL) {
     415            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     416            0 :                         if (session != NULL)
     417            0 :                                 rv = gkm_session_C_SetOperationState (session,
     418              :                                                                       operation_state, operation_state_len, encryption_key, authentication_key);
     419              :                         else
     420            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     421              :                 }
     422              : 
     423            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     424              : 
     425            0 :         return rv;
     426              : }
     427              : 
     428              : static CK_RV
     429           60 : gkm_C_Login (CK_SESSION_HANDLE handle, CK_USER_TYPE user_type,
     430              :              CK_UTF8CHAR_PTR pin, CK_ULONG pin_len)
     431              : {
     432           60 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     433              : 
     434           60 :         g_mutex_lock (&pkcs11_module_mutex);
     435              : 
     436           60 :                 if (pkcs11_module != NULL)
     437           60 :                         rv = gkm_module_C_Login (pkcs11_module, handle, user_type, pin, pin_len);
     438              : 
     439           60 :         g_mutex_unlock (&pkcs11_module_mutex);
     440              : 
     441           60 :         return rv;
     442              : }
     443              : 
     444              : static CK_RV
     445            0 : gkm_C_Logout (CK_SESSION_HANDLE handle)
     446              : {
     447            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     448              : 
     449            0 :         g_mutex_lock (&pkcs11_module_mutex);
     450              : 
     451            0 :                 if (pkcs11_module != NULL)
     452            0 :                         rv = gkm_module_C_Logout (pkcs11_module, handle);
     453              : 
     454            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     455              : 
     456            0 :         return rv;
     457              : }
     458              : 
     459              : static CK_RV
     460           40 : gkm_C_CreateObject (CK_SESSION_HANDLE handle, CK_ATTRIBUTE_PTR template,
     461              :                     CK_ULONG count, CK_OBJECT_HANDLE_PTR new_object)
     462              : {
     463           40 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     464              :         GkmSession *session;
     465              : 
     466           40 :         g_mutex_lock (&pkcs11_module_mutex);
     467              : 
     468           40 :                 if (pkcs11_module != NULL) {
     469           40 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     470           40 :                         if (session != NULL)
     471           40 :                                 rv = gkm_session_C_CreateObject (session,
     472              :                                                                  template, count, new_object);
     473              :                         else
     474            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     475              :                 }
     476              : 
     477           40 :         g_mutex_unlock (&pkcs11_module_mutex);
     478              : 
     479           40 :         return rv;
     480              : }
     481              : 
     482              : static CK_RV
     483            0 : gkm_C_CopyObject (CK_SESSION_HANDLE handle, CK_OBJECT_HANDLE object,
     484              :                   CK_ATTRIBUTE_PTR template, CK_ULONG count,
     485              :                   CK_OBJECT_HANDLE_PTR new_object)
     486              : {
     487            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     488              :         GkmSession *session;
     489              : 
     490            0 :         g_mutex_lock (&pkcs11_module_mutex);
     491              : 
     492            0 :                 if (pkcs11_module != NULL) {
     493            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     494            0 :                         if (session != NULL)
     495            0 :                                 rv = gkm_session_C_CopyObject (session,
     496              :                                                                object, template, count, new_object);
     497              :                         else
     498            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     499              :                 }
     500              : 
     501            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     502              : 
     503            0 :         return rv;
     504              : }
     505              : 
     506              : 
     507              : static CK_RV
     508           14 : gkm_C_DestroyObject (CK_SESSION_HANDLE handle, CK_OBJECT_HANDLE object)
     509              : {
     510           14 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     511              :         GkmSession *session;
     512              : 
     513           14 :         g_mutex_lock (&pkcs11_module_mutex);
     514              : 
     515           14 :                 if (pkcs11_module != NULL) {
     516           14 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     517           14 :                         if (session != NULL)
     518           14 :                                 rv = gkm_session_C_DestroyObject (session, object);
     519              :                         else
     520            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     521              :                 }
     522              : 
     523           14 :         g_mutex_unlock (&pkcs11_module_mutex);
     524              : 
     525           14 :         return rv;
     526              : }
     527              : 
     528              : static CK_RV
     529            0 : gkm_C_GetObjectSize (CK_SESSION_HANDLE handle, CK_OBJECT_HANDLE object,
     530              :                      CK_ULONG_PTR size)
     531              : {
     532            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     533              :         GkmSession *session;
     534              : 
     535            0 :         g_mutex_lock (&pkcs11_module_mutex);
     536              : 
     537            0 :                 if (pkcs11_module != NULL) {
     538            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     539            0 :                         if (session != NULL)
     540            0 :                                 rv = gkm_session_C_GetObjectSize (session, object, size);
     541              :                         else
     542            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     543              :                 }
     544              : 
     545            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     546              : 
     547            0 :         return rv;
     548              : }
     549              : 
     550              : static CK_RV
     551          530 : gkm_C_GetAttributeValue (CK_SESSION_HANDLE handle, CK_OBJECT_HANDLE object,
     552              :                          CK_ATTRIBUTE_PTR template, CK_ULONG count)
     553              : {
     554          530 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     555              :         GkmSession *session;
     556              : 
     557          530 :         g_mutex_lock (&pkcs11_module_mutex);
     558              : 
     559          530 :                 if (pkcs11_module != NULL) {
     560          530 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     561          530 :                         if (session != NULL)
     562          530 :                                 rv = gkm_session_C_GetAttributeValue (session, object, template, count);
     563              :                         else
     564            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     565              :                 }
     566              : 
     567          530 :         g_mutex_unlock (&pkcs11_module_mutex);
     568              : 
     569          530 :         return rv;
     570              : }
     571              : 
     572              : static CK_RV
     573            4 : gkm_C_SetAttributeValue (CK_SESSION_HANDLE handle, CK_OBJECT_HANDLE object,
     574              :                          CK_ATTRIBUTE_PTR template, CK_ULONG count)
     575              : {
     576            4 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     577              :         GkmSession *session;
     578              : 
     579            4 :         g_mutex_lock (&pkcs11_module_mutex);
     580              : 
     581            4 :                 if (pkcs11_module != NULL) {
     582            4 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     583            4 :                         if (session != NULL)
     584            4 :                                 rv = gkm_session_C_SetAttributeValue (session, object, template, count);
     585              :                         else
     586            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     587              :                 }
     588              : 
     589            4 :         g_mutex_unlock (&pkcs11_module_mutex);
     590              : 
     591            4 :         return rv;
     592              : }
     593              : 
     594              : static CK_RV
     595          167 : gkm_C_FindObjectsInit (CK_SESSION_HANDLE handle, CK_ATTRIBUTE_PTR template,
     596              :                        CK_ULONG count)
     597              : {
     598          167 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     599              :         GkmSession *session;
     600              : 
     601          167 :         g_mutex_lock (&pkcs11_module_mutex);
     602              : 
     603          167 :                 if (pkcs11_module != NULL) {
     604          167 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     605          167 :                         if (session != NULL)
     606          167 :                                 rv = gkm_session_C_FindObjectsInit (session, template, count);
     607              :                         else
     608            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     609              :                 }
     610              : 
     611          167 :         g_mutex_unlock (&pkcs11_module_mutex);
     612              : 
     613          167 :         return rv;
     614              : }
     615              : 
     616              : static CK_RV
     617          287 : gkm_C_FindObjects (CK_SESSION_HANDLE handle, CK_OBJECT_HANDLE_PTR objects,
     618              :                    CK_ULONG max_count, CK_ULONG_PTR count)
     619              : {
     620          287 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     621              :         GkmSession *session;
     622              : 
     623          287 :         g_mutex_lock (&pkcs11_module_mutex);
     624              : 
     625          287 :                 if (pkcs11_module != NULL) {
     626          287 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     627          287 :                         if (session != NULL)
     628          287 :                                 rv = gkm_session_C_FindObjects (session, objects, max_count, count);
     629              :                         else
     630            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     631              :                 }
     632              : 
     633          287 :         g_mutex_unlock (&pkcs11_module_mutex);
     634              : 
     635          287 :         return rv;
     636              : }
     637              : 
     638              : static CK_RV
     639          167 : gkm_C_FindObjectsFinal (CK_SESSION_HANDLE handle)
     640              : {
     641          167 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     642              :         GkmSession *session;
     643              : 
     644          167 :         g_mutex_lock (&pkcs11_module_mutex);
     645              : 
     646          167 :                 if (pkcs11_module != NULL) {
     647          167 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     648          167 :                         if (session != NULL)
     649          167 :                                 rv = gkm_session_C_FindObjectsFinal (session);
     650              :                         else
     651            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     652              :                 }
     653              : 
     654          167 :         g_mutex_unlock (&pkcs11_module_mutex);
     655              : 
     656          167 :         return rv;
     657              : }
     658              : 
     659              : static CK_RV
     660            0 : gkm_C_EncryptInit (CK_SESSION_HANDLE handle, CK_MECHANISM_PTR mechanism,
     661              :                    CK_OBJECT_HANDLE key)
     662              : {
     663            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     664              :         GkmSession *session;
     665              : 
     666            0 :         g_mutex_lock (&pkcs11_module_mutex);
     667              : 
     668            0 :                 if (pkcs11_module != NULL) {
     669            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     670            0 :                         if (session != NULL)
     671            0 :                                 rv = gkm_session_C_EncryptInit (session, mechanism, key);
     672              :                         else
     673            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     674              :                 }
     675              : 
     676            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     677              : 
     678            0 :         return rv;
     679              : }
     680              : 
     681              : static CK_RV
     682            0 : gkm_C_Encrypt (CK_SESSION_HANDLE handle, CK_BYTE_PTR data, CK_ULONG data_len,
     683              :                CK_BYTE_PTR encrypted_data, CK_ULONG_PTR encrypted_data_len)
     684              : {
     685            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     686              :         GkmSession *session;
     687              : 
     688            0 :         g_mutex_lock (&pkcs11_module_mutex);
     689              : 
     690            0 :                 if (pkcs11_module != NULL) {
     691            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     692            0 :                         if (session != NULL)
     693            0 :                                 rv = gkm_session_C_Encrypt (session, data, data_len, encrypted_data, encrypted_data_len);
     694              :                         else
     695            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     696              :                 }
     697              : 
     698            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     699              : 
     700            0 :         return rv;
     701              : }
     702              : 
     703              : static CK_RV
     704            0 : gkm_C_EncryptUpdate (CK_SESSION_HANDLE handle, CK_BYTE_PTR part,
     705              :                      CK_ULONG part_len, CK_BYTE_PTR encrypted_part,
     706              :                      CK_ULONG_PTR encrypted_part_len)
     707              : {
     708            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     709              :         GkmSession *session;
     710              : 
     711            0 :         g_mutex_lock (&pkcs11_module_mutex);
     712              : 
     713            0 :                 if (pkcs11_module != NULL) {
     714            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     715            0 :                         if (session != NULL)
     716            0 :                                 rv = gkm_session_C_EncryptUpdate (session, part, part_len, encrypted_part, encrypted_part_len);
     717              :                         else
     718            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     719              :                 }
     720              : 
     721            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     722              : 
     723            0 :         return rv;
     724              : }
     725              : 
     726              : static CK_RV
     727            0 : gkm_C_EncryptFinal (CK_SESSION_HANDLE handle, CK_BYTE_PTR last_part,
     728              :                     CK_ULONG_PTR last_part_len)
     729              : {
     730            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     731              :         GkmSession *session;
     732              : 
     733            0 :         g_mutex_lock (&pkcs11_module_mutex);
     734              : 
     735            0 :                 if (pkcs11_module != NULL) {
     736            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     737            0 :                         if (session != NULL)
     738            0 :                                 rv = gkm_session_C_EncryptFinal (session, last_part, last_part_len);
     739              :                         else
     740            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     741              :                 }
     742              : 
     743            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     744              : 
     745            0 :         return rv;
     746              : }
     747              : 
     748              : static CK_RV
     749            0 : gkm_C_DecryptInit (CK_SESSION_HANDLE handle, CK_MECHANISM_PTR mechanism,
     750              :                    CK_OBJECT_HANDLE key)
     751              : {
     752            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     753              :         GkmSession *session;
     754              : 
     755            0 :         g_mutex_lock (&pkcs11_module_mutex);
     756              : 
     757            0 :                 if (pkcs11_module != NULL) {
     758            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     759            0 :                         if (session != NULL)
     760            0 :                                 rv = gkm_session_C_DecryptInit (session, mechanism, key);
     761              :                         else
     762            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     763              :                 }
     764              : 
     765            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     766              : 
     767            0 :         return rv;
     768              : }
     769              : 
     770              : static CK_RV
     771            0 : gkm_C_Decrypt (CK_SESSION_HANDLE handle, CK_BYTE_PTR enc_data,
     772              :                CK_ULONG enc_data_len, CK_BYTE_PTR data, CK_ULONG_PTR data_len)
     773              : {
     774            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     775              :         GkmSession *session;
     776              : 
     777            0 :         g_mutex_lock (&pkcs11_module_mutex);
     778              : 
     779            0 :                 if (pkcs11_module != NULL) {
     780            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     781            0 :                         if (session != NULL)
     782            0 :                                 rv = gkm_session_C_Decrypt (session, enc_data, enc_data_len, data, data_len);
     783              :                         else
     784            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     785              :                 }
     786              : 
     787            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     788              : 
     789            0 :         return rv;
     790              : }
     791              : 
     792              : static CK_RV
     793            0 : gkm_C_DecryptUpdate (CK_SESSION_HANDLE handle, CK_BYTE_PTR enc_part,
     794              :                      CK_ULONG enc_part_len, CK_BYTE_PTR part, CK_ULONG_PTR part_len)
     795              : {
     796            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     797              :         GkmSession *session;
     798              : 
     799            0 :         g_mutex_lock (&pkcs11_module_mutex);
     800              : 
     801            0 :                 if (pkcs11_module != NULL) {
     802            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     803            0 :                         if (session != NULL)
     804            0 :                                 rv = gkm_session_C_DecryptUpdate (session, enc_part, enc_part_len, part, part_len);
     805              :                         else
     806            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     807              :                 }
     808              : 
     809            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     810              : 
     811            0 :         return rv;
     812              : }
     813              : 
     814              : static CK_RV
     815            0 : gkm_C_DecryptFinal (CK_SESSION_HANDLE handle, CK_BYTE_PTR last_part,
     816              :                     CK_ULONG_PTR last_part_len)
     817              : {
     818            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     819              :         GkmSession *session;
     820              : 
     821            0 :         g_mutex_lock (&pkcs11_module_mutex);
     822              : 
     823            0 :                 if (pkcs11_module != NULL) {
     824            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     825            0 :                         if (session != NULL)
     826            0 :                                 rv = gkm_session_C_DecryptFinal (session, last_part, last_part_len);
     827              :                         else
     828            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     829              :                 }
     830              : 
     831            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     832              : 
     833            0 :         return rv;
     834              : }
     835              : 
     836              : static CK_RV
     837            0 : gkm_C_DigestInit (CK_SESSION_HANDLE handle, CK_MECHANISM_PTR mechanism)
     838              : {
     839            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     840              :         GkmSession *session;
     841              : 
     842            0 :         g_mutex_lock (&pkcs11_module_mutex);
     843              : 
     844            0 :                 if (pkcs11_module != NULL) {
     845            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     846            0 :                         if (session != NULL)
     847            0 :                                 rv = gkm_session_C_DigestInit (session, mechanism);
     848              :                         else
     849            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     850              :                 }
     851              : 
     852            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     853              : 
     854            0 :         return rv;
     855              : }
     856              : 
     857              : static CK_RV
     858            0 : gkm_C_Digest (CK_SESSION_HANDLE handle, CK_BYTE_PTR data, CK_ULONG data_len,
     859              :               CK_BYTE_PTR digest, CK_ULONG_PTR digest_len)
     860              : {
     861            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     862              :         GkmSession *session;
     863              : 
     864            0 :         g_mutex_lock (&pkcs11_module_mutex);
     865              : 
     866            0 :                 if (pkcs11_module != NULL) {
     867            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     868            0 :                         if (session != NULL)
     869            0 :                                 rv = gkm_session_C_Digest (session, data, data_len, digest, digest_len);
     870              :                         else
     871            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     872              :                 }
     873              : 
     874            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     875              : 
     876            0 :         return rv;
     877              : }
     878              : 
     879              : static CK_RV
     880            0 : gkm_C_DigestUpdate (CK_SESSION_HANDLE handle, CK_BYTE_PTR part, CK_ULONG part_len)
     881              : {
     882            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     883              :         GkmSession *session;
     884              : 
     885            0 :         g_mutex_lock (&pkcs11_module_mutex);
     886              : 
     887            0 :                 if (pkcs11_module != NULL) {
     888            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     889            0 :                         if (session != NULL)
     890            0 :                                 rv = gkm_session_C_DigestUpdate (session, part, part_len);
     891              :                         else
     892            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     893              :                 }
     894              : 
     895            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     896              : 
     897            0 :         return rv;
     898              : }
     899              : 
     900              : static CK_RV
     901            0 : gkm_C_DigestKey (CK_SESSION_HANDLE handle, CK_OBJECT_HANDLE key)
     902              : {
     903            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     904              :         GkmSession *session;
     905              : 
     906            0 :         g_mutex_lock (&pkcs11_module_mutex);
     907              : 
     908            0 :                 if (pkcs11_module != NULL) {
     909            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     910            0 :                         if (session != NULL)
     911            0 :                                 rv = gkm_session_C_DigestKey (session, key);
     912              :                         else
     913            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     914              :                 }
     915              : 
     916            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     917              : 
     918            0 :         return rv;
     919              : }
     920              : 
     921              : static CK_RV
     922            0 : gkm_C_DigestFinal (CK_SESSION_HANDLE handle, CK_BYTE_PTR digest,
     923              :                    CK_ULONG_PTR digest_len)
     924              : {
     925            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     926              :         GkmSession *session;
     927              : 
     928            0 :         g_mutex_lock (&pkcs11_module_mutex);
     929              : 
     930            0 :                 if (pkcs11_module != NULL) {
     931            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     932            0 :                         if (session != NULL)
     933            0 :                                 rv = gkm_session_C_DigestFinal (session, digest, digest_len);
     934              :                         else
     935            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     936              :                 }
     937              : 
     938            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     939              : 
     940            0 :         return rv;
     941              : }
     942              : 
     943              : static CK_RV
     944            0 : gkm_C_SignInit (CK_SESSION_HANDLE handle, CK_MECHANISM_PTR mechanism,
     945              :                 CK_OBJECT_HANDLE key)
     946              : {
     947            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     948              :         GkmSession *session;
     949              : 
     950            0 :         g_mutex_lock (&pkcs11_module_mutex);
     951              : 
     952            0 :                 if (pkcs11_module != NULL) {
     953            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     954            0 :                         if (session != NULL)
     955            0 :                                 rv = gkm_session_C_SignInit (session, mechanism, key);
     956              :                         else
     957            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     958              :                 }
     959              : 
     960            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     961              : 
     962            0 :         return rv;
     963              : }
     964              : 
     965              : static CK_RV
     966            0 : gkm_C_Sign (CK_SESSION_HANDLE handle, CK_BYTE_PTR data, CK_ULONG data_len,
     967              :             CK_BYTE_PTR signature, CK_ULONG_PTR signature_len)
     968              : {
     969            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     970              :         GkmSession *session;
     971              : 
     972            0 :         g_mutex_lock (&pkcs11_module_mutex);
     973              : 
     974            0 :                 if (pkcs11_module != NULL) {
     975            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     976            0 :                         if (session != NULL)
     977            0 :                                 rv = gkm_session_C_Sign (session, data, data_len, signature, signature_len);
     978              :                         else
     979            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
     980              :                 }
     981              : 
     982            0 :         g_mutex_unlock (&pkcs11_module_mutex);
     983              : 
     984            0 :         return rv;
     985              : }
     986              : 
     987              : static CK_RV
     988            0 : gkm_C_SignUpdate (CK_SESSION_HANDLE handle, CK_BYTE_PTR part, CK_ULONG part_len)
     989              : {
     990            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
     991              :         GkmSession *session;
     992              : 
     993            0 :         g_mutex_lock (&pkcs11_module_mutex);
     994              : 
     995            0 :                 if (pkcs11_module != NULL) {
     996            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
     997            0 :                         if (session != NULL)
     998            0 :                                 rv = gkm_session_C_SignUpdate (session, part, part_len);
     999              :                         else
    1000            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1001              :                 }
    1002              : 
    1003            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1004              : 
    1005            0 :         return rv;
    1006              : }
    1007              : 
    1008              : static CK_RV
    1009            0 : gkm_C_SignFinal (CK_SESSION_HANDLE handle, CK_BYTE_PTR signature,
    1010              :                  CK_ULONG_PTR signature_len)
    1011              : {
    1012            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1013              :         GkmSession *session;
    1014              : 
    1015            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1016              : 
    1017            0 :                 if (pkcs11_module != NULL) {
    1018            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1019            0 :                         if (session != NULL)
    1020            0 :                                 rv = gkm_session_C_SignFinal (session, signature, signature_len);
    1021              :                         else
    1022            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1023              :                 }
    1024              : 
    1025            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1026              : 
    1027            0 :         return rv;
    1028              : }
    1029              : 
    1030              : static CK_RV
    1031            0 : gkm_C_SignRecoverInit (CK_SESSION_HANDLE handle, CK_MECHANISM_PTR mechanism,
    1032              :                        CK_OBJECT_HANDLE key)
    1033              : {
    1034            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1035              :         GkmSession *session;
    1036              : 
    1037            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1038              : 
    1039            0 :                 if (pkcs11_module != NULL) {
    1040            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1041            0 :                         if (session != NULL)
    1042            0 :                                 rv = gkm_session_C_SignRecoverInit (session, mechanism, key);
    1043              :                         else
    1044            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1045              :                 }
    1046              : 
    1047            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1048              : 
    1049            0 :         return rv;
    1050              : }
    1051              : 
    1052              : static CK_RV
    1053            0 : gkm_C_SignRecover (CK_SESSION_HANDLE handle, CK_BYTE_PTR data, CK_ULONG data_len,
    1054              :                    CK_BYTE_PTR signature, CK_ULONG_PTR signature_len)
    1055              : {
    1056            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1057              :         GkmSession *session;
    1058              : 
    1059            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1060              : 
    1061            0 :                 if (pkcs11_module != NULL) {
    1062            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1063            0 :                         if (session != NULL)
    1064            0 :                                 rv = gkm_session_C_SignRecover (session, data, data_len, signature, signature_len);
    1065              :                         else
    1066            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1067              :                 }
    1068              : 
    1069            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1070              : 
    1071            0 :         return rv;
    1072              : }
    1073              : 
    1074              : static CK_RV
    1075            0 : gkm_C_VerifyInit (CK_SESSION_HANDLE handle, CK_MECHANISM_PTR mechanism,
    1076              :                   CK_OBJECT_HANDLE key)
    1077              : {
    1078            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1079              :         GkmSession *session;
    1080              : 
    1081            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1082              : 
    1083            0 :                 if (pkcs11_module != NULL) {
    1084            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1085            0 :                         if (session != NULL)
    1086            0 :                                 rv = gkm_session_C_VerifyInit (session, mechanism, key);
    1087              :                         else
    1088            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1089              :                 }
    1090              : 
    1091            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1092              : 
    1093            0 :         return rv;
    1094              : }
    1095              : 
    1096              : static CK_RV
    1097            0 : gkm_C_Verify (CK_SESSION_HANDLE handle, CK_BYTE_PTR data, CK_ULONG data_len,
    1098              :               CK_BYTE_PTR signature, CK_ULONG signature_len)
    1099              : {
    1100            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1101              :         GkmSession *session;
    1102              : 
    1103            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1104              : 
    1105            0 :                 if (pkcs11_module != NULL) {
    1106            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1107            0 :                         if (session != NULL)
    1108            0 :                                 rv = gkm_session_C_Verify (session, data, data_len, signature, signature_len);
    1109              :                         else
    1110            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1111              :                 }
    1112              : 
    1113            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1114              : 
    1115            0 :         return rv;
    1116              : }
    1117              : 
    1118              : static CK_RV
    1119            0 : gkm_C_VerifyUpdate (CK_SESSION_HANDLE handle, CK_BYTE_PTR part, CK_ULONG part_len)
    1120              : {
    1121            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1122              :         GkmSession *session;
    1123              : 
    1124            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1125              : 
    1126            0 :                 if (pkcs11_module != NULL) {
    1127            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1128            0 :                         if (session != NULL)
    1129            0 :                                 rv = gkm_session_C_VerifyUpdate (session, part, part_len);
    1130              :                         else
    1131            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1132              :                 }
    1133              : 
    1134            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1135              : 
    1136            0 :         return rv;
    1137              : }
    1138              : 
    1139              : static CK_RV
    1140            0 : gkm_C_VerifyFinal (CK_SESSION_HANDLE handle, CK_BYTE_PTR signature,
    1141              :                    CK_ULONG signature_len)
    1142              : {
    1143            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1144              :         GkmSession *session;
    1145              : 
    1146            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1147              : 
    1148            0 :                 if (pkcs11_module != NULL) {
    1149            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1150            0 :                         if (session != NULL)
    1151            0 :                                 rv = gkm_session_C_VerifyFinal (session, signature, signature_len);
    1152              :                         else
    1153            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1154              :                 }
    1155              : 
    1156            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1157              : 
    1158            0 :         return rv;
    1159              : }
    1160              : 
    1161              : static CK_RV
    1162            0 : gkm_C_VerifyRecoverInit (CK_SESSION_HANDLE handle, CK_MECHANISM_PTR mechanism,
    1163              :                          CK_OBJECT_HANDLE key)
    1164              : {
    1165            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1166              :         GkmSession *session;
    1167              : 
    1168            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1169              : 
    1170            0 :                 if (pkcs11_module != NULL) {
    1171            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1172            0 :                         if (session != NULL)
    1173            0 :                                 rv = gkm_session_C_VerifyRecoverInit (session, mechanism, key);
    1174              :                         else
    1175            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1176              :                 }
    1177              : 
    1178            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1179              : 
    1180            0 :         return rv;
    1181              : }
    1182              : 
    1183              : static CK_RV
    1184            0 : gkm_C_VerifyRecover (CK_SESSION_HANDLE handle, CK_BYTE_PTR signature,
    1185              :                      CK_ULONG signature_len, CK_BYTE_PTR data, CK_ULONG_PTR data_len)
    1186              : {
    1187            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1188              :         GkmSession *session;
    1189              : 
    1190            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1191              : 
    1192            0 :                 if (pkcs11_module != NULL) {
    1193            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1194            0 :                         if (session != NULL)
    1195            0 :                                 rv = gkm_session_C_VerifyRecover (session, signature, signature_len, data, data_len);
    1196              :                         else
    1197            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1198              :                 }
    1199              : 
    1200            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1201              : 
    1202            0 :         return rv;
    1203              : }
    1204              : 
    1205              : static CK_RV
    1206            0 : gkm_C_DigestEncryptUpdate (CK_SESSION_HANDLE handle, CK_BYTE_PTR part,
    1207              :                            CK_ULONG part_len, CK_BYTE_PTR enc_part,
    1208              :                            CK_ULONG_PTR enc_part_len)
    1209              : {
    1210            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1211              :         GkmSession *session;
    1212              : 
    1213            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1214              : 
    1215            0 :                 if (pkcs11_module != NULL) {
    1216            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1217            0 :                         if (session != NULL)
    1218            0 :                                 rv = gkm_session_C_DigestEncryptUpdate (session, part, part_len, enc_part, enc_part_len);
    1219              :                         else
    1220            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1221              :                 }
    1222              : 
    1223            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1224              : 
    1225            0 :         return rv;
    1226              : }
    1227              : 
    1228              : static CK_RV
    1229            0 : gkm_C_DecryptDigestUpdate (CK_SESSION_HANDLE handle, CK_BYTE_PTR enc_part,
    1230              :                            CK_ULONG enc_part_len, CK_BYTE_PTR part,
    1231              :                            CK_ULONG_PTR part_len)
    1232              : {
    1233            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1234              :         GkmSession *session;
    1235              : 
    1236            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1237              : 
    1238            0 :                 if (pkcs11_module != NULL) {
    1239            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1240            0 :                         if (session != NULL)
    1241            0 :                                 rv = gkm_session_C_DecryptDigestUpdate (session, enc_part, enc_part_len, part, part_len);
    1242              :                         else
    1243            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1244              :                 }
    1245              : 
    1246            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1247              : 
    1248            0 :         return rv;
    1249              : }
    1250              : 
    1251              : static CK_RV
    1252            0 : gkm_C_SignEncryptUpdate (CK_SESSION_HANDLE handle, CK_BYTE_PTR part,
    1253              :                          CK_ULONG part_len, CK_BYTE_PTR enc_part,
    1254              :                          CK_ULONG_PTR enc_part_len)
    1255              : {
    1256            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1257              :         GkmSession *session;
    1258              : 
    1259            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1260              : 
    1261            0 :                 if (pkcs11_module != NULL) {
    1262            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1263            0 :                         if (session != NULL)
    1264            0 :                                 rv = gkm_session_C_SignEncryptUpdate (session, part, part_len, enc_part, enc_part_len);
    1265              :                         else
    1266            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1267              :                 }
    1268              : 
    1269            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1270              : 
    1271            0 :         return rv;
    1272              : }
    1273              : 
    1274              : static CK_RV
    1275            0 : gkm_C_DecryptVerifyUpdate (CK_SESSION_HANDLE handle, CK_BYTE_PTR enc_part,
    1276              :                            CK_ULONG enc_part_len, CK_BYTE_PTR part,
    1277              :                            CK_ULONG_PTR part_len)
    1278              : {
    1279            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1280              :         GkmSession *session;
    1281              : 
    1282            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1283              : 
    1284            0 :                 if (pkcs11_module != NULL) {
    1285            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1286            0 :                         if (session != NULL)
    1287            0 :                                 rv = gkm_session_C_DecryptVerifyUpdate (session, enc_part, enc_part_len, part, part_len);
    1288              :                         else
    1289            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1290              :                 }
    1291              : 
    1292            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1293              : 
    1294            0 :         return rv;
    1295              : }
    1296              : 
    1297              : static CK_RV
    1298            0 : gkm_C_GenerateKey (CK_SESSION_HANDLE handle, CK_MECHANISM_PTR mechanism,
    1299              :                    CK_ATTRIBUTE_PTR template, CK_ULONG count,
    1300              :                    CK_OBJECT_HANDLE_PTR key)
    1301              : {
    1302            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1303              :         GkmSession *session;
    1304              : 
    1305            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1306              : 
    1307            0 :                 if (pkcs11_module != NULL) {
    1308            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1309            0 :                         if (session != NULL)
    1310            0 :                                 rv = gkm_session_C_GenerateKey (session, mechanism, template, count, key);
    1311              :                         else
    1312            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1313              :                 }
    1314              : 
    1315            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1316              : 
    1317            0 :         return rv;
    1318              : }
    1319              : 
    1320              : static CK_RV
    1321            1 : gkm_C_GenerateKeyPair (CK_SESSION_HANDLE handle, CK_MECHANISM_PTR mechanism,
    1322              :                        CK_ATTRIBUTE_PTR pub_template, CK_ULONG pub_count,
    1323              :                        CK_ATTRIBUTE_PTR priv_template, CK_ULONG priv_count,
    1324              :                        CK_OBJECT_HANDLE_PTR pub_key, CK_OBJECT_HANDLE_PTR priv_key)
    1325              : {
    1326            1 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1327              :         GkmSession *session;
    1328              : 
    1329            1 :         g_mutex_lock (&pkcs11_module_mutex);
    1330              : 
    1331            1 :                 if (pkcs11_module != NULL) {
    1332            1 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1333            1 :                         if (session != NULL)
    1334            1 :                                 rv = gkm_session_C_GenerateKeyPair (session, mechanism, pub_template, pub_count, priv_template, priv_count, pub_key, priv_key);
    1335              :                         else
    1336            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1337              :                 }
    1338              : 
    1339            1 :         g_mutex_unlock (&pkcs11_module_mutex);
    1340              : 
    1341            1 :         return rv;
    1342              : }
    1343              : 
    1344              : static CK_RV
    1345            0 : gkm_C_WrapKey (CK_SESSION_HANDLE handle, CK_MECHANISM_PTR mechanism,
    1346              :                CK_OBJECT_HANDLE wrapping_key, CK_OBJECT_HANDLE key,
    1347              :                CK_BYTE_PTR wrapped_key, CK_ULONG_PTR wrapped_key_len)
    1348              : {
    1349            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1350              :         GkmSession *session;
    1351              : 
    1352            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1353              : 
    1354            0 :                 if (pkcs11_module != NULL) {
    1355            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1356            0 :                         if (session != NULL)
    1357            0 :                                 rv = gkm_session_C_WrapKey (session, mechanism, wrapping_key, key, wrapped_key, wrapped_key_len);
    1358              :                         else
    1359            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1360              :                 }
    1361              : 
    1362            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1363              : 
    1364            0 :         return rv;
    1365              : }
    1366              : 
    1367              : static CK_RV
    1368           19 : gkm_C_UnwrapKey (CK_SESSION_HANDLE handle, CK_MECHANISM_PTR mechanism,
    1369              :                  CK_OBJECT_HANDLE unwrapping_key, CK_BYTE_PTR wrapped_key,
    1370              :                  CK_ULONG wrapped_key_len, CK_ATTRIBUTE_PTR template,
    1371              :                  CK_ULONG count, CK_OBJECT_HANDLE_PTR key)
    1372              : {
    1373           19 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1374              :         GkmSession *session;
    1375              : 
    1376           19 :         g_mutex_lock (&pkcs11_module_mutex);
    1377              : 
    1378           19 :                 if (pkcs11_module != NULL) {
    1379           19 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1380           19 :                         if (session != NULL)
    1381           19 :                                 rv = gkm_session_C_UnwrapKey (session, mechanism, unwrapping_key, wrapped_key, wrapped_key_len, template, count, key);
    1382              :                         else
    1383            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1384              :                 }
    1385              : 
    1386           19 :         g_mutex_unlock (&pkcs11_module_mutex);
    1387              : 
    1388           19 :         return rv;
    1389              : }
    1390              : 
    1391              : static CK_RV
    1392            2 : gkm_C_DeriveKey (CK_SESSION_HANDLE handle, CK_MECHANISM_PTR mechanism,
    1393              :                  CK_OBJECT_HANDLE base_key, CK_ATTRIBUTE_PTR template,
    1394              :                  CK_ULONG count, CK_OBJECT_HANDLE_PTR key)
    1395              : {
    1396            2 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1397              :         GkmSession *session;
    1398              : 
    1399            2 :         g_mutex_lock (&pkcs11_module_mutex);
    1400              : 
    1401            2 :                 if (pkcs11_module != NULL) {
    1402            2 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1403            2 :                         if (session != NULL)
    1404            2 :                                 rv = gkm_session_C_DeriveKey (session, mechanism, base_key, template, count, key);
    1405              :                         else
    1406            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1407              :                 }
    1408              : 
    1409            2 :         g_mutex_unlock (&pkcs11_module_mutex);
    1410              : 
    1411            2 :         return rv;
    1412              : }
    1413              : 
    1414              : static CK_RV
    1415            0 : gkm_C_SeedRandom (CK_SESSION_HANDLE handle, CK_BYTE_PTR seed, CK_ULONG seed_len)
    1416              : {
    1417            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1418              :         GkmSession *session;
    1419              : 
    1420            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1421              : 
    1422            0 :                 if (pkcs11_module != NULL) {
    1423            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1424            0 :                         if (session != NULL)
    1425            0 :                                 rv = gkm_session_C_SeedRandom (session, seed, seed_len);
    1426              :                         else
    1427            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1428              :                 }
    1429              : 
    1430            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1431              : 
    1432            0 :         return rv;
    1433              : }
    1434              : 
    1435              : static CK_RV
    1436            0 : gkm_C_GenerateRandom (CK_SESSION_HANDLE handle, CK_BYTE_PTR random_data,
    1437              :                       CK_ULONG random_len)
    1438              : {
    1439            0 :         CK_RV rv = CKR_CRYPTOKI_NOT_INITIALIZED;
    1440              :         GkmSession *session;
    1441              : 
    1442            0 :         g_mutex_lock (&pkcs11_module_mutex);
    1443              : 
    1444            0 :                 if (pkcs11_module != NULL) {
    1445            0 :                         session = gkm_module_lookup_session (pkcs11_module, handle);
    1446            0 :                         if (session != NULL)
    1447            0 :                                 rv = gkm_session_C_GenerateRandom (session, random_data, random_len);
    1448              :                         else
    1449            0 :                                 rv = CKR_SESSION_HANDLE_INVALID;
    1450              :                 }
    1451              : 
    1452            0 :         g_mutex_unlock (&pkcs11_module_mutex);
    1453              : 
    1454            0 :         return rv;
    1455              : }
    1456              : 
    1457              : /* --------------------------------------------------------------------
    1458              :  * MODULE ENTRY POINT
    1459              :  */
    1460              : 
    1461              : /*
    1462              :  * PKCS#11 is broken here. It states that Unix compilers automatically byte
    1463              :  * pack structures. This is wrong. GCC on Linux aligns to 4 by default.
    1464              :  *
    1465              :  * This results in incompatibilities. Where this structure's first version
    1466              :  * members take up too much or too little space depending on how this module
    1467              :  * is compiled.
    1468              :  */
    1469              : 
    1470              : static CK_FUNCTION_LIST gkm_module_function_list = {
    1471              :         { CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR },  /* version */
    1472              :         gkm_C_Initialize,
    1473              :         gkm_C_Finalize,
    1474              :         gkm_C_GetInfo,
    1475              :         gkm_C_GetFunctionList,
    1476              :         gkm_C_GetSlotList,
    1477              :         gkm_C_GetSlotInfo,
    1478              :         gkm_C_GetTokenInfo,
    1479              :         gkm_C_GetMechanismList,
    1480              :         gkm_C_GetMechanismInfo,
    1481              :         gkm_C_InitToken,
    1482              :         gkm_C_InitPIN,
    1483              :         gkm_C_SetPIN,
    1484              :         gkm_C_OpenSession,
    1485              :         gkm_C_CloseSession,
    1486              :         gkm_C_CloseAllSessions,
    1487              :         gkm_C_GetSessionInfo,
    1488              :         gkm_C_GetOperationState,
    1489              :         gkm_C_SetOperationState,
    1490              :         gkm_C_Login,
    1491              :         gkm_C_Logout,
    1492              :         gkm_C_CreateObject,
    1493              :         gkm_C_CopyObject,
    1494              :         gkm_C_DestroyObject,
    1495              :         gkm_C_GetObjectSize,
    1496              :         gkm_C_GetAttributeValue,
    1497              :         gkm_C_SetAttributeValue,
    1498              :         gkm_C_FindObjectsInit,
    1499              :         gkm_C_FindObjects,
    1500              :         gkm_C_FindObjectsFinal,
    1501              :         gkm_C_EncryptInit,
    1502              :         gkm_C_Encrypt,
    1503              :         gkm_C_EncryptUpdate,
    1504              :         gkm_C_EncryptFinal,
    1505              :         gkm_C_DecryptInit,
    1506              :         gkm_C_Decrypt,
    1507              :         gkm_C_DecryptUpdate,
    1508              :         gkm_C_DecryptFinal,
    1509              :         gkm_C_DigestInit,
    1510              :         gkm_C_Digest,
    1511              :         gkm_C_DigestUpdate,
    1512              :         gkm_C_DigestKey,
    1513              :         gkm_C_DigestFinal,
    1514              :         gkm_C_SignInit,
    1515              :         gkm_C_Sign,
    1516              :         gkm_C_SignUpdate,
    1517              :         gkm_C_SignFinal,
    1518              :         gkm_C_SignRecoverInit,
    1519              :         gkm_C_SignRecover,
    1520              :         gkm_C_VerifyInit,
    1521              :         gkm_C_Verify,
    1522              :         gkm_C_VerifyUpdate,
    1523              :         gkm_C_VerifyFinal,
    1524              :         gkm_C_VerifyRecoverInit,
    1525              :         gkm_C_VerifyRecover,
    1526              :         gkm_C_DigestEncryptUpdate,
    1527              :         gkm_C_DecryptDigestUpdate,
    1528              :         gkm_C_SignEncryptUpdate,
    1529              :         gkm_C_DecryptVerifyUpdate,
    1530              :         gkm_C_GenerateKey,
    1531              :         gkm_C_GenerateKeyPair,
    1532              :         gkm_C_WrapKey,
    1533              :         gkm_C_UnwrapKey,
    1534              :         gkm_C_DeriveKey,
    1535              :         gkm_C_SeedRandom,
    1536              :         gkm_C_GenerateRandom,
    1537              :         gkm_C_GetFunctionStatus,
    1538              :         gkm_C_CancelFunction,
    1539              :         gkm_C_WaitForSlotEvent
    1540              : };
        

Generated by: LCOV version 2.0-1