Hex Artifact Content

Artifact 98f3aad3ae9c36df3d812114d929fe2c83d7c117:


0000: 23 64 65 66 69 6e 65 20 5f 47 4e 55 5f 53 4f 55  #define _GNU_SOU
0010: 52 43 45 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c  RCE.#include <dl
0020: 66 63 6e 2e 68 3e 0a 0a 23 69 6e 63 6c 75 64 65  fcn.h>..#include
0030: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 0a 23 69 6e   "config.h"..#in
0040: 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e  clude <stdlib.h>
0050: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0060: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  g.h>.#include <s
0070: 74 64 69 6f 2e 68 3e 0a 0a 23 64 65 66 69 6e 65  tdio.h>..#define
0080: 20 43 4b 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e   CK_PTR *.#defin
0090: 65 20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  e CK_DEFINE_FUNC
00a0: 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70 65 2c  TION(returnType,
00b0: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70   name) returnTyp
00c0: 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65 20 43  e name.#define C
00d0: 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43 54 49  K_DECLARE_FUNCTI
00e0: 4f 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e  ON(returnType, n
00f0: 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20  ame) returnType 
0100: 6e 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f  name.#define CK_
0110: 44 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e  DECLARE_FUNCTION
0120: 5f 50 4f 49 4e 54 45 52 28 72 65 74 75 72 6e 54  _POINTER(returnT
0130: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
0140: 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23  nType (* name).#
0150: 64 65 66 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41  define CK_CALLBA
0160: 43 4b 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75  CK_FUNCTION(retu
0170: 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65  rnType, name) re
0180: 74 75 72 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65  turnType (* name
0190: 29 0a 23 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50  ).#ifndef NULL_P
01a0: 54 52 0a 23 20 20 64 65 66 69 6e 65 20 4e 55 4c  TR.#  define NUL
01b0: 4c 5f 50 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a  L_PTR 0.#endif..
01c0: 23 69 6e 63 6c 75 64 65 20 22 2e 2f 70 6b 63 73  #include "./pkcs
01d0: 31 31 2f 70 6b 63 73 31 31 2e 68 22 0a 0a 23 69  11/pkcs11.h"..#i
01e0: 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 4c 49 42  fndef CACKEY_LIB
01f0: 52 41 52 59 5f 46 49 4c 45 0a 23 64 65 66 69 6e  RARY_FILE.#defin
0200: 65 20 43 41 43 4b 45 59 5f 4c 49 42 52 41 52 59  e CACKEY_LIBRARY
0210: 5f 46 49 4c 45 20 22 6c 69 62 63 61 63 6b 65 79  _FILE "libcackey
0220: 5f 67 2e 73 6f 22 0a 23 65 6e 64 69 66 0a 0a 73  _g.so".#endif..s
0230: 74 61 74 69 63 20 76 6f 69 64 20 2a 6c 69 62 63  tatic void *libc
0240: 61 63 6b 65 79 5f 77 72 61 70 5f 68 61 6e 64 6c  ackey_wrap_handl
0250: 65 20 3d 20 4e 55 4c 4c 5f 50 54 52 3b 0a 0a 73  e = NULL_PTR;..s
0260: 74 61 74 69 63 20 76 6f 69 64 20 6c 69 62 63 61  tatic void libca
0270: 63 6b 65 79 5f 77 72 61 70 5f 69 6e 69 74 28 76  ckey_wrap_init(v
0280: 6f 69 64 29 3b 0a 0a 73 74 61 74 69 63 20 43 4b  oid);..static CK
0290: 5f 52 56 20 6c 69 62 63 61 63 6b 65 79 5f 77 72  _RV libcackey_wr
02a0: 61 70 5f 63 72 65 61 74 65 6d 75 74 65 78 28 43  ap_createmutex(C
02b0: 4b 5f 56 4f 49 44 5f 50 54 52 5f 50 54 52 20 70  K_VOID_PTR_PTR p
02c0: 70 4d 75 74 65 78 29 20 7b 0a 09 69 6e 74 20 28  pMutex) {..int (
02d0: 2a 63 72 65 61 74 65 5f 6d 75 74 65 78 29 28 70  *create_mutex)(p
02e0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a  thread_mutex_t *
02f0: 72 65 73 74 72 69 63 74 20 6d 75 74 65 78 2c 20  restrict mutex, 
0300: 63 6f 6e 73 74 20 70 74 68 72 65 61 64 5f 6d 75  const pthread_mu
0310: 74 65 78 61 74 74 72 5f 74 20 2a 72 65 73 74 72  texattr_t *restr
0320: 69 63 74 20 61 74 74 72 29 3b 0a 09 70 74 68 72  ict attr);..pthr
0330: 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68  ead_mutex_t *pth
0340: 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74  read_mutex;..int
0350: 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b   pthread_retval;
0360: 0a 0a 09 6c 69 62 63 61 63 6b 65 79 5f 77 72 61  ...libcackey_wra
0370: 70 5f 69 6e 69 74 28 29 3b 0a 0a 09 70 74 68 72  p_init();...pthr
0380: 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c  ead_mutex = mall
0390: 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 72 65  oc(sizeof(*pthre
03a0: 61 64 5f 6d 75 74 65 78 29 29 3b 0a 0a 09 63 72  ad_mutex));...cr
03b0: 65 61 74 65 5f 6d 75 74 65 78 20 3d 20 64 6c 73  eate_mutex = dls
03c0: 79 6d 28 6c 69 62 63 61 63 6b 65 79 5f 77 72 61  ym(libcackey_wra
03d0: 70 5f 68 61 6e 64 6c 65 2c 20 22 70 74 68 72 65  p_handle, "pthre
03e0: 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 22 29 3b  ad_mutex_init");
03f0: 0a 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
0400: 20 3d 20 63 72 65 61 74 65 5f 6d 75 74 65 78 28   = create_mutex(
0410: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e  pthread_mutex, N
0420: 55 4c 4c 29 3b 0a 09 69 66 20 28 70 74 68 72 65  ULL);..if (pthre
0430: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
0440: 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  {...return(CKR_G
0450: 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
0460: 7d 0a 0a 09 2a 70 70 4d 75 74 65 78 20 3d 20 70  }...*ppMutex = p
0470: 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 0a 09  thread_mutex;...
0480: 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
0490: 7d 0a 0a 23 64 65 66 69 6e 65 20 6c 69 62 63 61  }..#define libca
04a0: 63 6b 65 79 5f 77 72 61 70 5f 67 65 6e 65 72 69  ckey_wrap_generi
04b0: 63 6d 75 74 65 78 66 75 6e 63 28 66 75 6e 63 4e  cmutexfunc(funcN
04c0: 61 6d 65 2c 20 70 74 68 72 65 61 64 4e 61 6d 65  ame, pthreadName
04d0: 29 20 5c 0a 09 73 74 61 74 69 63 20 43 4b 5f 52  ) \..static CK_R
04e0: 56 20 66 75 6e 63 4e 61 6d 65 28 43 4b 5f 56 4f  V funcName(CK_VO
04f0: 49 44 5f 50 54 52 20 70 4d 75 74 65 78 29 20 7b  ID_PTR pMutex) {
0500: 20 5c 0a 09 09 69 6e 74 20 28 2a 66 75 6e 63 29   \...int (*func)
0510: 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  (pthread_mutex_t
0520: 20 2a 6d 75 74 65 78 29 3b 20 5c 0a 09 09 70 74   *mutex); \...pt
0530: 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70  hread_mutex_t *p
0540: 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 20 5c 0a  thread_mutex; \.
0550: 09 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
0560: 74 76 61 6c 3b 20 5c 0a 09 09 6c 69 62 63 61 63  tval; \...libcac
0570: 6b 65 79 5f 77 72 61 70 5f 69 6e 69 74 28 29 3b  key_wrap_init();
0580: 20 5c 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74   \...pthread_mut
0590: 65 78 20 3d 20 70 4d 75 74 65 78 3b 20 5c 0a 09  ex = pMutex; \..
05a0: 09 66 75 6e 63 20 3d 20 64 6c 73 79 6d 28 6c 69  .func = dlsym(li
05b0: 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 68 61 6e  bcackey_wrap_han
05c0: 64 6c 65 2c 20 70 74 68 72 65 61 64 4e 61 6d 65  dle, pthreadName
05d0: 29 3b 20 5c 0a 09 09 70 74 68 72 65 61 64 5f 72  ); \...pthread_r
05e0: 65 74 76 61 6c 20 3d 20 66 75 6e 63 28 70 74 68  etval = func(pth
05f0: 72 65 61 64 5f 6d 75 74 65 78 29 3b 20 5c 0a 09  read_mutex); \..
0600: 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
0610: 76 61 6c 20 21 3d 20 30 29 20 7b 20 5c 0a 09 09  val != 0) { \...
0620: 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
0630: 52 41 4c 5f 45 52 52 4f 52 29 3b 20 5c 0a 09 09  RAL_ERROR); \...
0640: 7d 20 5c 0a 09 09 69 66 20 28 73 74 72 63 6d 70  } \...if (strcmp
0650: 28 70 74 68 72 65 61 64 4e 61 6d 65 2c 20 22 70  (pthreadName, "p
0660: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 64 65 73  thread_mutex_des
0670: 74 72 6f 79 22 29 20 3d 3d 20 30 29 20 7b 20 5c  troy") == 0) { \
0680: 0a 09 09 09 66 72 65 65 28 70 74 68 72 65 61 64  ....free(pthread
0690: 5f 6d 75 74 65 78 29 3b 20 5c 0a 09 09 7d 20 5c  _mutex); \...} \
06a0: 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
06b0: 29 3b 20 5c 0a 09 7d 0a 0a 6c 69 62 63 61 63 6b  ); \..}..libcack
06c0: 65 79 5f 77 72 61 70 5f 67 65 6e 65 72 69 63 6d  ey_wrap_genericm
06d0: 75 74 65 78 66 75 6e 63 28 6c 69 62 63 61 63 6b  utexfunc(libcack
06e0: 65 79 5f 77 72 61 70 5f 64 65 73 74 72 6f 79 6d  ey_wrap_destroym
06f0: 75 74 65 78 2c 20 22 70 74 68 72 65 61 64 5f 6d  utex, "pthread_m
0700: 75 74 65 78 5f 64 65 73 74 72 6f 79 22 29 0a 6c  utex_destroy").l
0710: 69 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 67 65  ibcackey_wrap_ge
0720: 6e 65 72 69 63 6d 75 74 65 78 66 75 6e 63 28 6c  nericmutexfunc(l
0730: 69 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 6c 6f  ibcackey_wrap_lo
0740: 63 6b 6d 75 74 65 78 2c 20 22 70 74 68 72 65 61  ckmutex, "pthrea
0750: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 22 29 0a 6c  d_mutex_lock").l
0760: 69 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 67 65  ibcackey_wrap_ge
0770: 6e 65 72 69 63 6d 75 74 65 78 66 75 6e 63 28 6c  nericmutexfunc(l
0780: 69 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 75 6e  ibcackey_wrap_un
0790: 6c 6f 63 6b 6d 75 74 65 78 2c 20 22 70 74 68 72  lockmutex, "pthr
07a0: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
07b0: 22 29 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ")..static void 
07c0: 6c 69 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 69  libcackey_wrap_i
07d0: 6e 69 74 28 76 6f 69 64 29 20 7b 0a 09 44 6c 5f  nit(void) {..Dl_
07e0: 69 6e 66 6f 20 6c 69 62 69 6e 66 6f 3b 0a 09 69  info libinfo;..i
07f0: 6e 74 20 64 6c 61 64 64 72 5f 72 65 74 3b 0a 09  nt dladdr_ret;..
0800: 63 68 61 72 20 2a 6c 69 62 72 61 72 79 2c 20 2a  char *library, *
0810: 6c 69 62 72 61 72 79 44 69 72 2c 20 2a 6c 69 62  libraryDir, *lib
0820: 72 61 72 79 44 69 72 4c 61 73 74 53 6c 61 73 68  raryDirLastSlash
0830: 3b 0a 0a 09 69 66 20 28 6c 69 62 63 61 63 6b 65  ;...if (libcacke
0840: 79 5f 77 72 61 70 5f 68 61 6e 64 6c 65 29 20 7b  y_wrap_handle) {
0850: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
0860: 64 6c 61 64 64 72 5f 72 65 74 20 3d 20 64 6c 61  dladdr_ret = dla
0870: 64 64 72 28 6c 69 62 63 61 63 6b 65 79 5f 77 72  ddr(libcackey_wr
0880: 61 70 5f 69 6e 69 74 2c 20 26 6c 69 62 69 6e 66  ap_init, &libinf
0890: 6f 29 3b 0a 09 69 66 20 28 64 6c 61 64 64 72 5f  o);..if (dladdr_
08a0: 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09 09 66 70  ret == 0) {...fp
08b0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
08c0: 6e 61 62 6c 65 20 74 6f 20 72 65 73 6f 6c 76 65  nable to resolve
08d0: 20 70 61 74 68 3a 20 25 73 5c 6e 22 2c 20 64 6c   path: %s\n", dl
08e0: 65 72 72 6f 72 28 29 29 3b 0a 0a 09 09 61 62 6f  error());....abo
08f0: 72 74 28 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b  rt();....return;
0900: 0a 09 7d 0a 0a 09 69 66 20 28 21 6c 69 62 69 6e  ..}...if (!libin
0910: 66 6f 2e 64 6c 69 5f 66 6e 61 6d 65 29 20 7b 0a  fo.dli_fname) {.
0920: 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
0930: 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 6c 6f 6f  , "Unable to loo
0940: 6b 75 70 20 66 69 6c 65 6e 61 6d 65 5c 6e 22 29  kup filename\n")
0950: 3b 0a 0a 09 09 61 62 6f 72 74 28 29 3b 0a 0a 09  ;....abort();...
0960: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 6c 69  .return;..}...li
0970: 62 72 61 72 79 44 69 72 20 3d 20 73 74 72 64 75  braryDir = strdu
0980: 70 28 6c 69 62 69 6e 66 6f 2e 64 6c 69 5f 66 6e  p(libinfo.dli_fn
0990: 61 6d 65 29 3b 0a 09 6c 69 62 72 61 72 79 44 69  ame);..libraryDi
09a0: 72 4c 61 73 74 53 6c 61 73 68 20 3d 20 73 74 72  rLastSlash = str
09b0: 72 63 68 72 28 6c 69 62 72 61 72 79 44 69 72 2c  rchr(libraryDir,
09c0: 20 27 2f 27 29 3b 0a 09 69 66 20 28 21 6c 69 62   '/');..if (!lib
09d0: 72 61 72 79 44 69 72 4c 61 73 74 53 6c 61 73 68  raryDirLastSlash
09e0: 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74  ) {...fprintf(st
09f0: 64 65 72 72 2c 20 22 46 69 6c 65 20 6e 61 6d 65  derr, "File name
0a00: 20 72 65 74 75 72 6e 65 64 20 69 73 20 6e 6f 74   returned is not
0a10: 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74   an absolute pat
0a20: 68 3a 20 25 73 5c 6e 22 2c 20 6c 69 62 72 61 72  h: %s\n", librar
0a30: 79 44 69 72 29 3b 0a 0a 09 09 61 62 6f 72 74 28  yDir);....abort(
0a40: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  );....return;..}
0a50: 0a 09 2a 6c 69 62 72 61 72 79 44 69 72 4c 61 73  ..*libraryDirLas
0a60: 74 53 6c 61 73 68 20 3d 20 27 5c 30 27 3b 0a 0a  tSlash = '\0';..
0a70: 09 61 73 70 72 69 6e 74 66 28 26 6c 69 62 72 61  .asprintf(&libra
0a80: 72 79 2c 20 22 25 73 2f 22 20 43 41 43 4b 45 59  ry, "%s/" CACKEY
0a90: 5f 4c 49 42 52 41 52 59 5f 46 49 4c 45 2c 20 6c  _LIBRARY_FILE, l
0aa0: 69 62 72 61 72 79 44 69 72 29 3b 0a 0a 09 6c 69  ibraryDir);...li
0ab0: 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 68 61 6e  bcackey_wrap_han
0ac0: 64 6c 65 20 3d 20 64 6c 6d 6f 70 65 6e 28 4c 4d  dle = dlmopen(LM
0ad0: 5f 49 44 5f 4e 45 57 4c 4d 2c 20 6c 69 62 72 61  _ID_NEWLM, libra
0ae0: 72 79 2c 20 52 54 4c 44 5f 4c 4f 43 41 4c 20 7c  ry, RTLD_LOCAL |
0af0: 20 52 54 4c 44 5f 4e 4f 57 29 3b 0a 0a 09 69 66   RTLD_NOW);...if
0b00: 20 28 21 6c 69 62 63 61 63 6b 65 79 5f 77 72 61   (!libcackey_wra
0b10: 70 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 70  p_handle) {...fp
0b20: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
0b30: 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 5c 22  nable to load \"
0b40: 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 20 6c 69 62  %s\": %s\n", lib
0b50: 72 61 72 79 2c 20 64 6c 65 72 72 6f 72 28 29 29  rary, dlerror())
0b60: 3b 0a 0a 09 09 61 62 6f 72 74 28 29 3b 0a 0a 09  ;....abort();...
0b70: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 72  .return;..}...fr
0b80: 65 65 28 6c 69 62 72 61 72 79 29 3b 0a 0a 09 72  ee(library);...r
0b90: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
0ba0: 20 76 6f 69 64 20 6c 69 62 63 61 63 6b 65 79 5f   void libcackey_
0bb0: 77 72 61 70 5f 66 69 6e 69 28 76 6f 69 64 29 20  wrap_fini(void) 
0bc0: 7b 0a 09 69 66 20 28 21 6c 69 62 63 61 63 6b 65  {..if (!libcacke
0bd0: 79 5f 77 72 61 70 5f 68 61 6e 64 6c 65 29 20 7b  y_wrap_handle) {
0be0: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
0bf0: 64 6c 63 6c 6f 73 65 28 6c 69 62 63 61 63 6b 65  dlclose(libcacke
0c00: 79 5f 77 72 61 70 5f 68 61 6e 64 6c 65 29 3b 0a  y_wrap_handle);.
0c10: 0a 09 6c 69 62 63 61 63 6b 65 79 5f 77 72 61 70  ..libcackey_wrap
0c20: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 5f 50  _handle = NULL_P
0c30: 54 52 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  TR;...return;.}.