Hex Artifact Content

Artifact 4c95cbc88b8623ee43554d313a3a5faa2663444c:


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 73 74  11/pkcs11.h"..st
01e0: 61 74 69 63 20 76 6f 69 64 20 2a 6c 69 62 63 61  atic void *libca
01f0: 63 6b 65 79 5f 77 72 61 70 5f 68 61 6e 64 6c 65  ckey_wrap_handle
0200: 20 3d 20 4e 55 4c 4c 5f 50 54 52 3b 0a 0a 73 74   = NULL_PTR;..st
0210: 61 74 69 63 20 76 6f 69 64 20 6c 69 62 63 61 63  atic void libcac
0220: 6b 65 79 5f 77 72 61 70 5f 69 6e 69 74 28 76 6f  key_wrap_init(vo
0230: 69 64 29 20 7b 0a 09 44 6c 5f 69 6e 66 6f 20 6c  id) {..Dl_info l
0240: 69 62 69 6e 66 6f 3b 0a 09 69 6e 74 20 64 6c 61  ibinfo;..int dla
0250: 64 64 72 5f 72 65 74 3b 0a 09 63 68 61 72 20 2a  ddr_ret;..char *
0260: 6c 69 62 72 61 72 79 2c 20 2a 6c 69 62 72 61 72  library, *librar
0270: 79 44 69 72 2c 20 2a 6c 69 62 72 61 72 79 44 69  yDir, *libraryDi
0280: 72 4c 61 73 74 53 6c 61 73 68 3b 0a 0a 09 69 66  rLastSlash;...if
0290: 20 28 6c 69 62 63 61 63 6b 65 79 5f 77 72 61 70   (libcackey_wrap
02a0: 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09 72 65 74  _handle) {...ret
02b0: 75 72 6e 3b 0a 09 7d 0a 0a 09 64 6c 61 64 64 72  urn;..}...dladdr
02c0: 5f 72 65 74 20 3d 20 64 6c 61 64 64 72 28 6c 69  _ret = dladdr(li
02d0: 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 69 6e 69  bcackey_wrap_ini
02e0: 74 2c 20 26 6c 69 62 69 6e 66 6f 29 3b 0a 09 69  t, &libinfo);..i
02f0: 66 20 28 64 6c 61 64 64 72 5f 72 65 74 20 3d 3d  f (dladdr_ret ==
0300: 20 30 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28   0) {...fprintf(
0310: 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20  stderr, "Unable 
0320: 74 6f 20 72 65 73 6f 6c 76 65 20 70 61 74 68 3a  to resolve path:
0330: 20 25 73 5c 6e 22 2c 20 64 6c 65 72 72 6f 72 28   %s\n", dlerror(
0340: 29 29 3b 0a 0a 09 09 61 62 6f 72 74 28 29 3b 0a  ));....abort();.
0350: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
0360: 69 66 20 28 21 6c 69 62 69 6e 66 6f 2e 64 6c 69  if (!libinfo.dli
0370: 5f 66 6e 61 6d 65 29 20 7b 0a 09 09 66 70 72 69  _fname) {...fpri
0380: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61  ntf(stderr, "Una
0390: 62 6c 65 20 74 6f 20 6c 6f 6f 6b 75 70 20 66 69  ble to lookup fi
03a0: 6c 65 6e 61 6d 65 5c 6e 22 29 3b 0a 0a 09 09 61  lename\n");....a
03b0: 62 6f 72 74 28 29 3b 0a 0a 09 09 72 65 74 75 72  bort();....retur
03c0: 6e 3b 0a 09 7d 0a 0a 09 6c 69 62 72 61 72 79 44  n;..}...libraryD
03d0: 69 72 20 3d 20 73 74 72 64 75 70 28 6c 69 62 69  ir = strdup(libi
03e0: 6e 66 6f 2e 64 6c 69 5f 66 6e 61 6d 65 29 3b 0a  nfo.dli_fname);.
03f0: 09 6c 69 62 72 61 72 79 44 69 72 4c 61 73 74 53  .libraryDirLastS
0400: 6c 61 73 68 20 3d 20 73 74 72 72 63 68 72 28 6c  lash = strrchr(l
0410: 69 62 72 61 72 79 44 69 72 2c 20 27 2f 27 29 3b  ibraryDir, '/');
0420: 0a 09 69 66 20 28 21 6c 69 62 72 61 72 79 44 69  ..if (!libraryDi
0430: 72 4c 61 73 74 53 6c 61 73 68 29 20 7b 0a 09 09  rLastSlash) {...
0440: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
0450: 22 46 69 6c 65 20 6e 61 6d 65 20 72 65 74 75 72  "File name retur
0460: 6e 65 64 20 69 73 20 6e 6f 74 20 61 6e 20 61 62  ned is not an ab
0470: 73 6f 6c 75 74 65 20 70 61 74 68 3a 20 25 73 5c  solute path: %s\
0480: 6e 22 2c 20 6c 69 62 72 61 72 79 44 69 72 29 3b  n", libraryDir);
0490: 0a 0a 09 09 61 62 6f 72 74 28 29 3b 0a 0a 09 09  ....abort();....
04a0: 72 65 74 75 72 6e 3b 0a 09 7d 0a 09 2a 6c 69 62  return;..}..*lib
04b0: 72 61 72 79 44 69 72 4c 61 73 74 53 6c 61 73 68  raryDirLastSlash
04c0: 20 3d 20 27 5c 30 27 3b 0a 0a 09 61 73 70 72 69   = '\0';...aspri
04d0: 6e 74 66 28 26 6c 69 62 72 61 72 79 2c 20 22 25  ntf(&library, "%
04e0: 73 2f 6c 69 62 63 61 63 6b 65 79 2e 73 6f 22 2c  s/libcackey.so",
04f0: 20 6c 69 62 72 61 72 79 44 69 72 29 3b 0a 0a 09   libraryDir);...
0500: 6c 69 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 68  libcackey_wrap_h
0510: 61 6e 64 6c 65 20 3d 20 64 6c 6d 6f 70 65 6e 28  andle = dlmopen(
0520: 4c 4d 5f 49 44 5f 4e 45 57 4c 4d 2c 20 6c 69 62  LM_ID_NEWLM, lib
0530: 72 61 72 79 2c 20 52 54 4c 44 5f 4c 4f 43 41 4c  rary, RTLD_LOCAL
0540: 20 7c 20 52 54 4c 44 5f 4e 4f 57 29 3b 0a 0a 09   | RTLD_NOW);...
0550: 69 66 20 28 21 6c 69 62 63 61 63 6b 65 79 5f 77  if (!libcackey_w
0560: 72 61 70 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09  rap_handle) {...
0570: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
0580: 22 55 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20  "Unable to load 
0590: 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 20 6c  \"%s\": %s\n", l
05a0: 69 62 72 61 72 79 2c 20 64 6c 65 72 72 6f 72 28  ibrary, dlerror(
05b0: 29 29 3b 0a 0a 09 09 61 62 6f 72 74 28 29 3b 0a  ));....abort();.
05c0: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
05d0: 66 72 65 65 28 6c 69 62 72 61 72 79 29 3b 0a 0a  free(library);..
05e0: 09 72 65 74 75 72 6e 3b 0a 7d 0a                 .return;.}.