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;.}.