Hex Artifact Content

Artifact 4e157658f44cb6f4fac2a8ef5ab5bece129e2ad1:


0000: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
0010: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0020: 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  dlib.h>.#include
0030: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
0040: 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 0a  lude <dlfcn.h>..
0050: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e  #include <stdio.
0060: 68 3e 0a 0a 2f 2a 0a 20 2a 20 43 72 65 61 74 65  h>../*. * Create
0070: 20 6d 69 6e 69 6d 61 6c 20 50 4b 43 53 23 31 31   minimal PKCS#11
0080: 20 6d 6f 64 75 6c 65 20 69 6e 74 65 72 66 61 63   module interfac
0090: 65 20 6e 65 65 64 65 64 20 74 6f 20 77 72 61 70  e needed to wrap
00a0: 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4b 5f  . */.#define CK_
00b0: 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
00c0: 74 79 70 65 2c 20 66 75 6e 63 29 20 74 79 70 65  type, func) type
00d0: 20 66 75 6e 63 0a 0a 23 64 65 66 69 6e 65 20 43   func..#define C
00e0: 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
00f0: 20 30 78 30 30 30 30 30 30 30 35 0a 23 64 65 66   0x00000005.#def
0100: 69 6e 65 20 43 4b 52 5f 4f 4b 20 20 20 20 20 20  ine CKR_OK      
0110: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30 30        0x00000000
0120: 0a 0a 74 79 70 65 64 65 66 20 76 6f 69 64 20 28  ..typedef void (
0130: 2a 43 4b 5f 43 52 45 41 54 45 4d 55 54 45 58 29  *CK_CREATEMUTEX)
0140: 28 29 3b 0a 74 79 70 65 64 65 66 20 76 6f 69 64  ();.typedef void
0150: 20 28 2a 43 4b 5f 44 45 53 54 52 4f 59 4d 55 54   (*CK_DESTROYMUT
0160: 45 58 29 28 29 3b 0a 74 79 70 65 64 65 66 20 76  EX)();.typedef v
0170: 6f 69 64 20 28 2a 43 4b 5f 4c 4f 43 4b 4d 55 54  oid (*CK_LOCKMUT
0180: 45 58 29 28 29 3b 0a 74 79 70 65 64 65 66 20 76  EX)();.typedef v
0190: 6f 69 64 20 28 2a 43 4b 5f 55 4e 4c 4f 43 4b 4d  oid (*CK_UNLOCKM
01a0: 55 54 45 58 29 28 29 3b 0a 74 79 70 65 64 65 66  UTEX)();.typedef
01b0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 43   unsigned long C
01c0: 4b 5f 46 4c 41 47 53 3b 0a 74 79 70 65 64 65 66  K_FLAGS;.typedef
01d0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 43   unsigned long C
01e0: 4b 5f 52 56 3b 0a 74 79 70 65 64 65 66 20 76 6f  K_RV;.typedef vo
01f0: 69 64 20 2a 20 43 4b 5f 56 4f 49 44 5f 50 54 52  id * CK_VOID_PTR
0200: 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
0210: 74 20 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a  t CK_C_INITIALIZ
0220: 45 5f 41 52 47 53 20 7b 0a 09 43 4b 5f 43 52 45  E_ARGS {..CK_CRE
0230: 41 54 45 4d 55 54 45 58 20 43 72 65 61 74 65 4d  ATEMUTEX CreateM
0240: 75 74 65 78 3b 0a 09 43 4b 5f 44 45 53 54 52 4f  utex;..CK_DESTRO
0250: 59 4d 55 54 45 58 20 44 65 73 74 72 6f 79 4d 75  YMUTEX DestroyMu
0260: 74 65 78 3b 0a 09 43 4b 5f 4c 4f 43 4b 4d 55 54  tex;..CK_LOCKMUT
0270: 45 58 20 4c 6f 63 6b 4d 75 74 65 78 3b 0a 09 43  EX LockMutex;..C
0280: 4b 5f 55 4e 4c 4f 43 4b 4d 55 54 45 58 20 55 6e  K_UNLOCKMUTEX Un
0290: 6c 6f 63 6b 4d 75 74 65 78 3b 0a 09 43 4b 5f 46  lockMutex;..CK_F
02a0: 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 4b 5f  LAGS flags;..CK_
02b0: 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76  VOID_PTR pReserv
02c0: 65 64 3b 0a 7d 20 43 4b 5f 43 5f 49 4e 49 54 49  ed;.} CK_C_INITI
02d0: 41 4c 49 5a 45 5f 41 52 47 53 3b 0a 0a 74 79 70  ALIZE_ARGS;..typ
02e0: 65 64 65 66 20 73 74 72 75 63 74 20 7b 0a 09 75  edef struct {..u
02f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 6a  nsigned char maj
0300: 6f 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  or;..unsigned ch
0310: 61 72 20 6d 69 6e 6f 72 3b 0a 7d 20 43 4b 5f 56  ar minor;.} CK_V
0320: 45 52 53 49 4f 4e 3b 0a 0a 74 79 70 65 64 65 66  ERSION;..typedef
0330: 20 73 74 72 75 63 74 20 7b 0a 09 43 4b 5f 56 45   struct {..CK_VE
0340: 52 53 49 4f 4e 20 76 65 72 73 69 6f 6e 3b 0a 09  RSION version;..
0350: 43 4b 5f 52 56 20 28 2a 43 5f 49 6e 69 74 69 61  CK_RV (*C_Initia
0360: 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54  lize)(CK_VOID_PT
0370: 52 29 3b 0a 09 43 4b 5f 52 56 20 28 2a 43 5f 46  R);..CK_RV (*C_F
0380: 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  inalize)(CK_VOID
0390: 5f 50 54 52 29 3b 0a 7d 20 43 4b 5f 46 55 4e 43  _PTR);.} CK_FUNC
03a0: 54 49 4f 4e 5f 4c 49 53 54 3b 0a 0a 74 79 70 65  TION_LIST;..type
03b0: 64 65 66 20 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f  def CK_FUNCTION_
03c0: 4c 49 53 54 2a 20 43 4b 5f 46 55 4e 43 54 49 4f  LIST* CK_FUNCTIO
03d0: 4e 5f 4c 49 53 54 5f 50 54 52 3b 0a 74 79 70 65  N_LIST_PTR;.type
03e0: 64 65 66 20 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f  def CK_FUNCTION_
03f0: 4c 49 53 54 2a 2a 20 43 4b 5f 46 55 4e 43 54 49  LIST** CK_FUNCTI
0400: 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 3b  ON_LIST_PTR_PTR;
0410: 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 69 73 20  ../*. * This is 
0420: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
0430: 66 75 6c 6c 20 50 4b 43 53 23 31 31 20 66 75 6e  full PKCS#11 fun
0440: 63 74 69 6f 6e 20 6c 69 73 74 20 73 74 72 75 63  ction list struc
0450: 74 75 72 65 0a 20 2a 20 28 43 4b 5f 46 55 4e 43  ture. * (CK_FUNC
0460: 54 49 4f 4e 5f 4c 49 53 54 29 2e 20 20 57 65 20  TION_LIST).  We 
0470: 6f 6e 6c 79 20 61 63 74 75 61 6c 6c 79 20 63 61  only actually ca
0480: 72 65 20 61 62 6f 75 74 20 77 72 61 70 70 69 6e  re about wrappin
0490: 67 20 74 68 65 0a 20 2a 20 69 6e 69 74 69 61 6c  g the. * initial
04a0: 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
04b0: 2c 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  , so we have to 
04c0: 63 6f 6d 70 75 74 65 20 74 68 65 20 66 75 6c 6c  compute the full
04d0: 20 73 69 7a 65 0a 20 2a 0a 20 2a 20 53 69 7a 65   size. *. * Size
04e0: 20 69 73 20 73 69 7a 65 4f 66 28 6f 75 72 46 75   is sizeOf(ourFu
04f0: 6e 63 74 69 6f 6e 4c 69 73 74 53 74 72 75 63 74  nctionListStruct
0500: 29 20 2b 20 28 6e 75 6d 62 65 72 4f 66 46 75 6e  ) + (numberOfFun
0510: 63 74 69 6f 6e 73 2d 32 20 2a 20 66 75 6e 63 74  ctions-2 * funct
0520: 69 6f 6e 50 6f 69 6e 74 65 72 53 69 7a 65 29 0a  ionPointerSize).
0530: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 49 5a 45   */.#define SIZE
0540: 5f 4f 46 5f 50 4b 43 53 31 31 5f 46 55 4e 43 54  _OF_PKCS11_FUNCT
0550: 49 4f 4e 5f 4c 49 53 54 20 28 73 69 7a 65 6f 66  ION_LIST (sizeof
0560: 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53  (CK_FUNCTION_LIS
0570: 54 29 20 2b 20 28 36 37 20 2a 20 73 69 7a 65 6f  T) + (67 * sizeo
0580: 66 28 76 6f 69 64 20 2a 29 29 29 0a 0a 2f 2a 0a  f(void *)))../*.
0590: 20 2a 20 52 65 61 6c 20 43 5f 49 6e 69 74 69 61   * Real C_Initia
05a0: 6c 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  lize() function 
05b0: 66 6f 72 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a  for this module.
05c0: 20 2a 2f 0a 73 74 61 74 69 63 20 43 4b 5f 52 56   */.static CK_RV
05d0: 20 28 2a 52 65 61 6c 5f 43 5f 49 6e 69 74 69 61   (*Real_C_Initia
05e0: 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54  lize)(CK_VOID_PT
05f0: 52 29 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74  R) = NULL;..stat
0600: 69 63 20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  ic CK_DEFINE_FUN
0610: 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 50 72 6f  CTION(CK_RV, Pro
0620: 78 79 5f 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29  xy_C_Initialize)
0630: 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e  (CK_VOID_PTR pIn
0640: 69 74 41 72 67 73 29 20 7b 0a 09 63 68 61 72 20  itArgs) {..char 
0650: 6e 73 73 43 6f 6e 66 69 67 5b 31 30 32 34 5d 3b  nssConfig[1024];
0660: 0a 09 63 68 61 72 20 2a 6e 73 73 44 42 44 69 72  ..char *nssDBDir
0670: 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 43 5f 49   = NULL;..CK_C_I
0680: 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 2a  NITIALIZE_ARGS *
0690: 49 6e 69 74 41 72 67 73 20 3d 20 4e 55 4c 4c 3b  InitArgs = NULL;
06a0: 0a 0a 09 49 6e 69 74 41 72 67 73 20 3d 20 70 49  ...InitArgs = pI
06b0: 6e 69 74 41 72 67 73 3b 0a 0a 09 69 66 20 28 49  nitArgs;...if (I
06c0: 6e 69 74 41 72 67 73 20 3d 3d 20 4e 55 4c 4c 29  nitArgs == NULL)
06d0: 20 7b 0a 09 09 49 6e 69 74 41 72 67 73 20 3d 20   {...InitArgs = 
06e0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 49  malloc(sizeof(*I
06f0: 6e 69 74 41 72 67 73 29 29 3b 0a 0a 09 09 49 6e  nitArgs));....In
0700: 69 74 41 72 67 73 2d 3e 43 72 65 61 74 65 4d 75  itArgs->CreateMu
0710: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 49 6e  tex = NULL;...In
0720: 69 74 41 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d  itArgs->DestroyM
0730: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 49  utex = NULL;...I
0740: 6e 69 74 41 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74  nitArgs->LockMut
0750: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 49 6e 69  ex = NULL;...Ini
0760: 74 41 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74  tArgs->UnlockMut
0770: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 49 6e 69  ex = NULL;...Ini
0780: 74 41 72 67 73 2d 3e 66 6c 61 67 73 20 3d 20 30  tArgs->flags = 0
0790: 3b 0a 09 09 49 6e 69 74 41 72 67 73 2d 3e 70 52  ;...InitArgs->pR
07a0: 65 73 65 72 76 65 64 20 3d 20 4e 55 4c 4c 3b 0a  eserved = NULL;.
07b0: 09 7d 0a 0a 09 69 66 20 28 49 6e 69 74 41 72 67  .}...if (InitArg
07c0: 73 2d 3e 70 52 65 73 65 72 76 65 64 20 3d 3d 20  s->pReserved == 
07d0: 4e 55 4c 4c 29 20 7b 0a 09 09 6e 73 73 44 42 44  NULL) {...nssDBD
07e0: 69 72 20 3d 20 67 65 74 65 6e 76 28 22 53 4f 46  ir = getenv("SOF
07f0: 54 4f 4b 4e 33 5f 4e 53 53 5f 44 49 52 22 29 3b  TOKN3_NSS_DIR");
0800: 0a 0a 09 09 69 66 20 28 6e 73 73 44 42 44 69 72  ....if (nssDBDir
0810: 29 20 7b 0a 09 09 09 73 6e 70 72 69 6e 74 66 28  ) {....snprintf(
0820: 6e 73 73 43 6f 6e 66 69 67 2c 20 73 69 7a 65 6f  nssConfig, sizeo
0830: 66 28 6e 73 73 43 6f 6e 66 69 67 29 2c 0a 09 09  f(nssConfig),...
0840: 09 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 69  .         "confi
0850: 67 64 69 72 3d 27 25 73 27 20 63 65 72 74 50 72  gdir='%s' certPr
0860: 65 66 69 78 3d 27 27 20 6b 65 79 50 72 65 66 69  efix='' keyPrefi
0870: 78 3d 27 27 20 73 65 63 6d 6f 64 3d 27 73 65 63  x='' secmod='sec
0880: 6d 6f 64 2e 64 62 27 20 66 6c 61 67 73 3d 72 65  mod.db' flags=re
0890: 61 64 4f 6e 6c 79 22 2c 0a 09 09 09 09 20 6e 73  adOnly",..... ns
08a0: 73 44 42 44 69 72 0a 09 09 09 29 3b 0a 0a 09 09  sDBDir....);....
08b0: 09 49 6e 69 74 41 72 67 73 2d 3e 70 52 65 73 65  .InitArgs->pRese
08c0: 72 76 65 64 20 3d 20 28 76 6f 69 64 20 2a 29 20  rved = (void *) 
08d0: 6e 73 73 43 6f 6e 66 69 67 3b 0a 09 09 7d 0a 09  nssConfig;...}..
08e0: 7d 0a 0a 09 69 66 20 28 52 65 61 6c 5f 43 5f 49  }...if (Real_C_I
08f0: 6e 69 74 69 61 6c 69 7a 65 20 3d 3d 20 4e 55 4c  nitialize == NUL
0900: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b  L) {...return(CK
0910: 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
0920: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 52 65  ;..}...return(Re
0930: 61 6c 5f 43 5f 49 6e 69 74 69 61 6c 69 7a 65 28  al_C_Initialize(
0940: 49 6e 69 74 41 72 67 73 29 29 3b 0a 7d 0a 0a 43  InitArgs));.}..C
0950: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
0960: 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75  N(CK_RV, C_GetFu
0970: 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46  nctionList)(CK_F
0980: 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
0990: 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c  _PTR ppFunctionL
09a0: 69 73 74 29 20 7b 0a 09 43 4b 5f 52 56 20 28 2a  ist) {..CK_RV (*
09b0: 52 65 61 6c 5f 43 5f 47 65 74 46 75 6e 63 74 69  Real_C_GetFuncti
09c0: 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54  onList)(CK_FUNCT
09d0: 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52  ION_LIST_PTR_PTR
09e0: 29 3b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f  );..CK_FUNCTION_
09f0: 4c 49 53 54 5f 50 54 52 20 63 6f 70 79 46 75 6e  LIST_PTR copyFun
0a00: 63 74 69 6f 6e 4c 69 73 74 3b 0a 09 76 6f 69 64  ctionList;..void
0a10: 20 2a 68 61 6e 64 6c 65 3b 0a 09 43 4b 5f 52 56   *handle;..CK_RV
0a20: 20 72 65 74 76 61 6c 3b 0a 09 63 68 61 72 20 2a   retval;..char *
0a30: 6d 6f 64 75 6c 65 3b 0a 0a 09 6d 6f 64 75 6c 65  module;...module
0a40: 20 3d 20 67 65 74 65 6e 76 28 22 53 4f 46 54 4f   = getenv("SOFTO
0a50: 4b 4e 33 5f 4d 4f 44 55 4c 45 22 29 3b 0a 09 69  KN3_MODULE");..i
0a60: 66 20 28 21 6d 6f 64 75 6c 65 29 20 7b 0a 09 09  f (!module) {...
0a70: 6d 6f 64 75 6c 65 20 3d 20 22 2f 75 73 72 2f 6c  module = "/usr/l
0a80: 69 62 36 34 2f 6c 69 62 73 6f 66 74 6f 6b 6e 33  ib64/libsoftokn3
0a90: 2e 73 6f 22 3b 0a 09 7d 0a 0a 09 2f 2a 20 68 61  .so";..}.../* ha
0aa0: 6e 64 6c 65 20 3d 20 64 6c 6d 6f 70 65 6e 28 4c  ndle = dlmopen(L
0ab0: 4d 5f 49 44 5f 4e 45 57 4c 4d 2c 20 6d 6f 64 75  M_ID_NEWLM, modu
0ac0: 6c 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  le, RTLD_NOW | R
0ad0: 54 4c 44 5f 4c 4f 43 41 4c 29 3b 20 2a 2f 0a 09  TLD_LOCAL); */..
0ae0: 68 61 6e 64 6c 65 20 3d 20 64 6c 6f 70 65 6e 28  handle = dlopen(
0af0: 6d 6f 64 75 6c 65 2c 20 52 54 4c 44 5f 4e 4f 57  module, RTLD_NOW
0b00: 20 7c 20 52 54 4c 44 5f 4c 4f 43 41 4c 29 3b 0a   | RTLD_LOCAL);.
0b10: 09 69 66 20 28 68 61 6e 64 6c 65 20 3d 3d 20 4e  .if (handle == N
0b20: 55 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  ULL) {...fprintf
0b30: 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65  (stderr, "Unable
0b40: 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73 5c 22 3a   to open \"%s\":
0b50: 20 25 73 5c 6e 22 2c 20 6d 6f 64 75 6c 65 2c 20   %s\n", module, 
0b60: 64 6c 65 72 72 6f 72 28 29 29 3b 0a 0a 09 09 72  dlerror());....r
0b70: 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
0b80: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 52  L_ERROR);..}...R
0b90: 65 61 6c 5f 43 5f 47 65 74 46 75 6e 63 74 69 6f  eal_C_GetFunctio
0ba0: 6e 4c 69 73 74 20 3d 20 64 6c 73 79 6d 28 68 61  nList = dlsym(ha
0bb0: 6e 64 6c 65 2c 20 22 43 5f 47 65 74 46 75 6e 63  ndle, "C_GetFunc
0bc0: 74 69 6f 6e 4c 69 73 74 22 29 3b 0a 0a 09 69 66  tionList");...if
0bd0: 20 28 52 65 61 6c 5f 43 5f 47 65 74 46 75 6e 63   (Real_C_GetFunc
0be0: 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c  tionList == NULL
0bf0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ) {...return(CKR
0c00: 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
0c10: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 52  ..}...retval = R
0c20: 65 61 6c 5f 43 5f 47 65 74 46 75 6e 63 74 69 6f  eal_C_GetFunctio
0c30: 6e 4c 69 73 74 28 70 70 46 75 6e 63 74 69 6f 6e  nList(ppFunction
0c40: 4c 69 73 74 29 3b 0a 0a 09 69 66 20 28 72 65 74  List);...if (ret
0c50: 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
0c60: 0a 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
0c70: 29 3b 0a 09 7d 0a 0a 20 20 20 20 20 20 20 20 63  );..}..        c
0c80: 6f 70 79 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  opyFunctionList 
0c90: 3d 20 6d 61 6c 6c 6f 63 28 53 49 5a 45 5f 4f 46  = malloc(SIZE_OF
0ca0: 5f 50 4b 43 53 31 31 5f 46 55 4e 43 54 49 4f 4e  _PKCS11_FUNCTION
0cb0: 5f 4c 49 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _LIST);.        
0cc0: 6d 65 6d 63 70 79 28 63 6f 70 79 46 75 6e 63 74  memcpy(copyFunct
0cd0: 69 6f 6e 4c 69 73 74 2c 20 2a 70 70 46 75 6e 63  ionList, *ppFunc
0ce0: 74 69 6f 6e 4c 69 73 74 2c 20 53 49 5a 45 5f 4f  tionList, SIZE_O
0cf0: 46 5f 50 4b 43 53 31 31 5f 46 55 4e 43 54 49 4f  F_PKCS11_FUNCTIO
0d00: 4e 5f 4c 49 53 54 29 3b 0a 20 20 20 20 20 20 20  N_LIST);.       
0d10: 20 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74   *ppFunctionList
0d20: 20 3d 20 63 6f 70 79 46 75 6e 63 74 69 6f 6e 4c   = copyFunctionL
0d30: 69 73 74 3b 0a 0a 09 52 65 61 6c 5f 43 5f 49 6e  ist;...Real_C_In
0d40: 69 74 69 61 6c 69 7a 65 20 3d 20 28 2a 70 70 46  itialize = (*ppF
0d50: 75 6e 63 74 69 6f 6e 4c 69 73 74 29 2d 3e 43 5f  unctionList)->C_
0d60: 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 28 2a 70  Initialize;..(*p
0d70: 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 2d 3e  pFunctionList)->
0d80: 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 50  C_Initialize = P
0d90: 72 6f 78 79 5f 43 5f 49 6e 69 74 69 61 6c 69 7a  roxy_C_Initializ
0da0: 65 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  e;...return(retv
0db0: 61 6c 29 3b 0a 7d 0a                             al);.}.