Hex Artifact Content

Artifact 7dfc56607f26dc38ef1e548967377bf617df16ec:


0000: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79  #include <sys/ty
0010: 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  pes.h>.#include 
0020: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0030: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0040: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0050: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0060: 69 6f 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20 43  io.h>..#ifndef C
0070: 41 43 4b 45 59 5f 54 45 53 54 5f 41 46 4c 0a 23  ACKEY_TEST_AFL.#
0080: 69 6e 63 6c 75 64 65 20 22 6d 79 70 6b 63 73 31  include "mypkcs1
0090: 31 2e 68 22 0a 0a 73 74 61 74 69 63 20 63 68 61  1.h"..static cha
00a0: 72 20 2a 70 6b 63 73 31 31 5f 61 74 74 72 69 62  r *pkcs11_attrib
00b0: 75 74 65 5f 74 6f 5f 6e 61 6d 65 28 43 4b 5f 41  ute_to_name(CK_A
00c0: 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 61 74  TTRIBUTE_TYPE at
00d0: 74 72 69 62 29 20 7b 0a 09 73 74 61 74 69 63 20  trib) {..static 
00e0: 63 68 61 72 20 72 65 74 62 75 66 5b 31 30 32 34  char retbuf[1024
00f0: 5d 3b 0a 0a 09 73 77 69 74 63 68 20 28 61 74 74  ];...switch (att
0100: 72 69 62 29 20 7b 0a 09 09 63 61 73 65 20 30 78  rib) {...case 0x
0110: 30 30 30 30 30 30 30 30 3a 20 72 65 74 75 72 6e  00000000: return
0120: 20 22 43 4b 41 5f 43 4c 41 53 53 22 3b 0a 09 09   "CKA_CLASS";...
0130: 63 61 73 65 20 30 78 30 30 30 30 30 30 30 31 3a  case 0x00000001:
0140: 20 72 65 74 75 72 6e 20 22 43 4b 41 5f 54 4f 4b   return "CKA_TOK
0150: 45 4e 22 3b 0a 09 09 63 61 73 65 20 30 78 30 30  EN";...case 0x00
0160: 30 30 30 30 30 32 3a 20 72 65 74 75 72 6e 20 22  000002: return "
0170: 43 4b 41 5f 50 52 49 56 41 54 45 22 3b 0a 09 09  CKA_PRIVATE";...
0180: 63 61 73 65 20 30 78 30 30 30 30 30 30 30 33 3a  case 0x00000003:
0190: 20 72 65 74 75 72 6e 20 22 43 4b 41 5f 4c 41 42   return "CKA_LAB
01a0: 45 4c 22 3b 0a 09 09 63 61 73 65 20 30 78 30 30  EL";...case 0x00
01b0: 30 30 30 30 31 30 3a 20 72 65 74 75 72 6e 20 22  000010: return "
01c0: 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e 22  CKA_APPLICATION"
01d0: 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30 30 30  ;...case 0x00000
01e0: 30 31 31 3a 20 72 65 74 75 72 6e 20 22 43 4b 41  011: return "CKA
01f0: 5f 56 41 4c 55 45 22 3b 0a 09 09 63 61 73 65 20  _VALUE";...case 
0200: 30 78 30 30 30 30 30 30 31 32 3a 20 72 65 74 75  0x00000012: retu
0210: 72 6e 20 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49  rn "CKA_OBJECT_I
0220: 44 22 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30  D";...case 0x000
0230: 30 30 30 38 30 3a 20 72 65 74 75 72 6e 20 22 43  00080: return "C
0240: 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  KA_CERTIFICATE_T
0250: 59 50 45 22 3b 0a 09 09 63 61 73 65 20 30 78 30  YPE";...case 0x0
0260: 30 30 30 30 30 38 31 3a 20 72 65 74 75 72 6e 20  0000081: return 
0270: 22 43 4b 41 5f 49 53 53 55 45 52 22 3b 0a 09 09  "CKA_ISSUER";...
0280: 63 61 73 65 20 30 78 30 30 30 30 30 30 38 32 3a  case 0x00000082:
0290: 20 72 65 74 75 72 6e 20 22 43 4b 41 5f 53 45 52   return "CKA_SER
02a0: 49 41 4c 5f 4e 55 4d 42 45 52 22 3b 0a 09 09 63  IAL_NUMBER";...c
02b0: 61 73 65 20 30 78 30 30 30 30 30 30 38 33 3a 20  ase 0x00000083: 
02c0: 72 65 74 75 72 6e 20 22 43 4b 41 5f 41 43 5f 49  return "CKA_AC_I
02d0: 53 53 55 45 52 22 3b 0a 09 09 63 61 73 65 20 30  SSUER";...case 0
02e0: 78 30 30 30 30 30 30 38 34 3a 20 72 65 74 75 72  x00000084: retur
02f0: 6e 20 22 43 4b 41 5f 4f 57 4e 45 52 22 3b 0a 09  n "CKA_OWNER";..
0300: 09 63 61 73 65 20 30 78 30 30 30 30 30 30 38 35  .case 0x00000085
0310: 3a 20 72 65 74 75 72 6e 20 22 43 4b 41 5f 41 54  : return "CKA_AT
0320: 54 52 5f 54 59 50 45 53 22 3b 0a 09 09 63 61 73  TR_TYPES";...cas
0330: 65 20 30 78 30 30 30 30 30 30 38 36 3a 20 72 65  e 0x00000086: re
0340: 74 75 72 6e 20 22 43 4b 41 5f 54 52 55 53 54 45  turn "CKA_TRUSTE
0350: 44 22 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30  D";...case 0x000
0360: 30 30 31 30 30 3a 20 72 65 74 75 72 6e 20 22 43  00100: return "C
0370: 4b 41 5f 4b 45 59 5f 54 59 50 45 22 3b 0a 09 09  KA_KEY_TYPE";...
0380: 63 61 73 65 20 30 78 30 30 30 30 30 31 30 31 3a  case 0x00000101:
0390: 20 72 65 74 75 72 6e 20 22 43 4b 41 5f 53 55 42   return "CKA_SUB
03a0: 4a 45 43 54 22 3b 0a 09 09 63 61 73 65 20 30 78  JECT";...case 0x
03b0: 30 30 30 30 30 31 30 32 3a 20 72 65 74 75 72 6e  00000102: return
03c0: 20 22 43 4b 41 5f 49 44 22 3b 0a 09 09 63 61 73   "CKA_ID";...cas
03d0: 65 20 30 78 30 30 30 30 30 31 30 33 3a 20 72 65  e 0x00000103: re
03e0: 74 75 72 6e 20 22 43 4b 41 5f 53 45 4e 53 49 54  turn "CKA_SENSIT
03f0: 49 56 45 22 3b 0a 09 09 63 61 73 65 20 30 78 30  IVE";...case 0x0
0400: 30 30 30 30 31 30 34 3a 20 72 65 74 75 72 6e 20  0000104: return 
0410: 22 43 4b 41 5f 45 4e 43 52 59 50 54 22 3b 0a 09  "CKA_ENCRYPT";..
0420: 09 63 61 73 65 20 30 78 30 30 30 30 30 31 30 35  .case 0x00000105
0430: 3a 20 72 65 74 75 72 6e 20 22 43 4b 41 5f 44 45  : return "CKA_DE
0440: 43 52 59 50 54 22 3b 0a 09 09 63 61 73 65 20 30  CRYPT";...case 0
0450: 78 30 30 30 30 30 31 30 36 3a 20 72 65 74 75 72  x00000106: retur
0460: 6e 20 22 43 4b 41 5f 57 52 41 50 22 3b 0a 09 09  n "CKA_WRAP";...
0470: 63 61 73 65 20 30 78 30 30 30 30 30 31 30 37 3a  case 0x00000107:
0480: 20 72 65 74 75 72 6e 20 22 43 4b 41 5f 55 4e 57   return "CKA_UNW
0490: 52 41 50 22 3b 0a 09 09 63 61 73 65 20 30 78 30  RAP";...case 0x0
04a0: 30 30 30 30 31 30 38 3a 20 72 65 74 75 72 6e 20  0000108: return 
04b0: 22 43 4b 41 5f 53 49 47 4e 22 3b 0a 09 09 63 61  "CKA_SIGN";...ca
04c0: 73 65 20 30 78 30 30 30 30 30 31 30 39 3a 20 72  se 0x00000109: r
04d0: 65 74 75 72 6e 20 22 43 4b 41 5f 53 49 47 4e 5f  eturn "CKA_SIGN_
04e0: 52 45 43 4f 56 45 52 22 3b 0a 09 09 63 61 73 65  RECOVER";...case
04f0: 20 30 78 30 30 30 30 30 31 30 41 3a 20 72 65 74   0x0000010A: ret
0500: 75 72 6e 20 22 43 4b 41 5f 56 45 52 49 46 59 22  urn "CKA_VERIFY"
0510: 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30 30 30  ;...case 0x00000
0520: 31 30 42 3a 20 72 65 74 75 72 6e 20 22 43 4b 41  10B: return "CKA
0530: 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 22  _VERIFY_RECOVER"
0540: 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30 30 30  ;...case 0x00000
0550: 31 30 43 3a 20 72 65 74 75 72 6e 20 22 43 4b 41  10C: return "CKA
0560: 5f 44 45 52 49 56 45 22 3b 0a 09 09 63 61 73 65  _DERIVE";...case
0570: 20 30 78 30 30 30 30 30 31 31 30 3a 20 72 65 74   0x00000110: ret
0580: 75 72 6e 20 22 43 4b 41 5f 53 54 41 52 54 5f 44  urn "CKA_START_D
0590: 41 54 45 22 3b 0a 09 09 63 61 73 65 20 30 78 30  ATE";...case 0x0
05a0: 30 30 30 30 31 31 31 3a 20 72 65 74 75 72 6e 20  0000111: return 
05b0: 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 3b 0a  "CKA_END_DATE";.
05c0: 09 09 63 61 73 65 20 30 78 30 30 30 30 30 31 32  ..case 0x0000012
05d0: 30 3a 20 72 65 74 75 72 6e 20 22 43 4b 41 5f 4d  0: return "CKA_M
05e0: 4f 44 55 4c 55 53 22 3b 0a 09 09 63 61 73 65 20  ODULUS";...case 
05f0: 30 78 30 30 30 30 30 31 32 31 3a 20 72 65 74 75  0x00000121: retu
0600: 72 6e 20 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f  rn "CKA_MODULUS_
0610: 42 49 54 53 22 3b 0a 09 09 63 61 73 65 20 30 78  BITS";...case 0x
0620: 30 30 30 30 30 31 32 32 3a 20 72 65 74 75 72 6e  00000122: return
0630: 20 22 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50   "CKA_PUBLIC_EXP
0640: 4f 4e 45 4e 54 22 3b 0a 09 09 63 61 73 65 20 30  ONENT";...case 0
0650: 78 30 30 30 30 30 31 32 33 3a 20 72 65 74 75 72  x00000123: retur
0660: 6e 20 22 43 4b 41 5f 50 52 49 56 41 54 45 5f 45  n "CKA_PRIVATE_E
0670: 58 50 4f 4e 45 4e 54 22 3b 0a 09 09 63 61 73 65  XPONENT";...case
0680: 20 30 78 30 30 30 30 30 31 32 34 3a 20 72 65 74   0x00000124: ret
0690: 75 72 6e 20 22 43 4b 41 5f 50 52 49 4d 45 5f 31  urn "CKA_PRIME_1
06a0: 22 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30 30  ";...case 0x0000
06b0: 30 31 32 35 3a 20 72 65 74 75 72 6e 20 22 43 4b  0125: return "CK
06c0: 41 5f 50 52 49 4d 45 5f 32 22 3b 0a 09 09 63 61  A_PRIME_2";...ca
06d0: 73 65 20 30 78 30 30 30 30 30 31 32 36 3a 20 72  se 0x00000126: r
06e0: 65 74 75 72 6e 20 22 43 4b 41 5f 45 58 50 4f 4e  eturn "CKA_EXPON
06f0: 45 4e 54 5f 31 22 3b 0a 09 09 63 61 73 65 20 30  ENT_1";...case 0
0700: 78 30 30 30 30 30 31 32 37 3a 20 72 65 74 75 72  x00000127: retur
0710: 6e 20 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f  n "CKA_EXPONENT_
0720: 32 22 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30  2";...case 0x000
0730: 30 30 31 32 38 3a 20 72 65 74 75 72 6e 20 22 43  00128: return "C
0740: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 3b  KA_COEFFICIENT";
0750: 0a 09 09 63 61 73 65 20 30 78 30 30 30 30 30 31  ...case 0x000001
0760: 33 30 3a 20 72 65 74 75 72 6e 20 22 43 4b 41 5f  30: return "CKA_
0770: 50 52 49 4d 45 22 3b 0a 09 09 63 61 73 65 20 30  PRIME";...case 0
0780: 78 30 30 30 30 30 31 33 31 3a 20 72 65 74 75 72  x00000131: retur
0790: 6e 20 22 43 4b 41 5f 53 55 42 50 52 49 4d 45 22  n "CKA_SUBPRIME"
07a0: 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30 30 30  ;...case 0x00000
07b0: 31 33 32 3a 20 72 65 74 75 72 6e 20 22 43 4b 41  132: return "CKA
07c0: 5f 42 41 53 45 22 3b 0a 09 09 63 61 73 65 20 30  _BASE";...case 0
07d0: 78 30 30 30 30 30 31 33 33 3a 20 72 65 74 75 72  x00000133: retur
07e0: 6e 20 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54  n "CKA_PRIME_BIT
07f0: 53 22 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30  S";...case 0x000
0800: 30 30 31 33 34 3a 20 72 65 74 75 72 6e 20 22 43  00134: return "C
0810: 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54  KA_SUB_PRIME_BIT
0820: 53 22 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30  S";...case 0x000
0830: 30 30 31 36 30 3a 20 72 65 74 75 72 6e 20 22 43  00160: return "C
0840: 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53 22 3b 0a  KA_VALUE_BITS";.
0850: 09 09 63 61 73 65 20 30 78 30 30 30 30 30 31 36  ..case 0x0000016
0860: 31 3a 20 72 65 74 75 72 6e 20 22 43 4b 41 5f 56  1: return "CKA_V
0870: 41 4c 55 45 5f 4c 45 4e 22 3b 0a 09 09 63 61 73  ALUE_LEN";...cas
0880: 65 20 30 78 30 30 30 30 30 31 36 32 3a 20 72 65  e 0x00000162: re
0890: 74 75 72 6e 20 22 43 4b 41 5f 45 58 54 52 41 43  turn "CKA_EXTRAC
08a0: 54 41 42 4c 45 22 3b 0a 09 09 63 61 73 65 20 30  TABLE";...case 0
08b0: 78 30 30 30 30 30 31 36 33 3a 20 72 65 74 75 72  x00000163: retur
08c0: 6e 20 22 43 4b 41 5f 4c 4f 43 41 4c 22 3b 0a 09  n "CKA_LOCAL";..
08d0: 09 63 61 73 65 20 30 78 30 30 30 30 30 31 36 34  .case 0x00000164
08e0: 3a 20 72 65 74 75 72 6e 20 22 43 4b 41 5f 4e 45  : return "CKA_NE
08f0: 56 45 52 5f 45 58 54 52 41 43 54 41 42 4c 45 22  VER_EXTRACTABLE"
0900: 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30 30 30  ;...case 0x00000
0910: 31 36 35 3a 20 72 65 74 75 72 6e 20 22 43 4b 41  165: return "CKA
0920: 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54 49 56  _ALWAYS_SENSITIV
0930: 45 22 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30  E";...case 0x000
0940: 30 30 31 36 36 3a 20 72 65 74 75 72 6e 20 22 43  00166: return "C
0950: 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41  KA_KEY_GEN_MECHA
0960: 4e 49 53 4d 22 3b 0a 09 09 63 61 73 65 20 30 78  NISM";...case 0x
0970: 30 30 30 30 30 31 37 30 3a 20 72 65 74 75 72 6e  00000170: return
0980: 20 22 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45   "CKA_MODIFIABLE
0990: 22 3b 0a 09 09 63 61 73 65 20 30 78 30 30 30 30  ";...case 0x0000
09a0: 30 31 38 30 3a 20 72 65 74 75 72 6e 20 22 43 4b  0180: return "CK
09b0: 41 5f 45 43 5f 50 41 52 41 4d 53 22 3b 0a 09 09  A_EC_PARAMS";...
09c0: 63 61 73 65 20 30 78 30 30 30 30 30 31 38 31 3a  case 0x00000181:
09d0: 20 72 65 74 75 72 6e 20 22 43 4b 41 5f 45 43 5f   return "CKA_EC_
09e0: 50 4f 49 4e 54 22 3b 0a 09 09 63 61 73 65 20 30  POINT";...case 0
09f0: 78 30 30 30 30 30 32 30 30 3a 20 72 65 74 75 72  x00000200: retur
0a00: 6e 20 22 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59  n "CKA_SECONDARY
0a10: 5f 41 55 54 48 22 3b 0a 09 09 63 61 73 65 20 30  _AUTH";...case 0
0a20: 78 30 30 30 30 30 32 30 31 3a 20 72 65 74 75 72  x00000201: retur
0a30: 6e 20 22 43 4b 41 5f 41 55 54 48 5f 50 49 4e 5f  n "CKA_AUTH_PIN_
0a40: 46 4c 41 47 53 22 3b 0a 09 09 63 61 73 65 20 30  FLAGS";...case 0
0a50: 78 30 30 30 30 30 33 30 30 3a 20 72 65 74 75 72  x00000300: retur
0a60: 6e 20 22 43 4b 41 5f 48 57 5f 46 45 41 54 55 52  n "CKA_HW_FEATUR
0a70: 45 5f 54 59 50 45 22 3b 0a 09 09 63 61 73 65 20  E_TYPE";...case 
0a80: 30 78 30 30 30 30 30 33 30 31 3a 20 72 65 74 75  0x00000301: retu
0a90: 72 6e 20 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e  rn "CKA_RESET_ON
0aa0: 5f 49 4e 49 54 22 3b 0a 09 09 63 61 73 65 20 30  _INIT";...case 0
0ab0: 78 30 30 30 30 30 33 30 32 3a 20 72 65 74 75 72  x00000302: retur
0ac0: 6e 20 22 43 4b 41 5f 48 41 53 5f 52 45 53 45 54  n "CKA_HAS_RESET
0ad0: 22 3b 0a 09 09 63 61 73 65 20 30 78 63 65 35 33  ";...case 0xce53
0ae0: 36 33 62 34 3a 20 72 65 74 75 72 6e 20 22 43 4b  63b4: return "CK
0af0: 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48  A_CERT_SHA1_HASH
0b00: 22 3b 0a 09 09 63 61 73 65 20 30 78 63 65 35 33  ";...case 0xce53
0b10: 36 33 62 35 3a 20 72 65 74 75 72 6e 20 22 43 4b  63b5: return "CK
0b20: 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 22  A_CERT_MD5_HASH"
0b30: 3b 0a 09 7d 0a 0a 09 73 6e 70 72 69 6e 74 66 28  ;..}...snprintf(
0b40: 72 65 74 62 75 66 2c 20 73 69 7a 65 6f 66 28 72  retbuf, sizeof(r
0b50: 65 74 62 75 66 29 2c 20 22 30 78 25 30 38 6c 78  etbuf), "0x%08lx
0b60: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
0b70: 67 29 20 61 74 74 72 69 62 29 3b 0a 09 72 65 74  g) attrib);..ret
0b80: 62 75 66 5b 73 69 7a 65 6f 66 28 72 65 74 62 75  buf[sizeof(retbu
0b90: 66 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a  f) - 1] = '\0';.
0ba0: 0a 09 72 65 74 75 72 6e 28 72 65 74 62 75 66 29  ..return(retbuf)
0bb0: 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 5f 70 6b  ;.}..int main_pk
0bc0: 63 73 31 31 28 76 6f 69 64 29 20 7b 0a 09 43 4b  cs11(void) {..CK
0bd0: 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50  _FUNCTION_LIST_P
0be0: 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  TR pFunctionList
0bf0: 3b 0a 09 43 4b 5f 52 56 20 28 2a 43 5f 43 6c 6f  ;..CK_RV (*C_Clo
0c00: 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45  seSession)(CK_SE
0c10: 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
0c20: 73 73 69 6f 6e 29 20 3d 20 4e 55 4c 4c 3b 0a 09  ssion) = NULL;..
0c30: 43 4b 5f 52 56 20 28 2a 43 5f 44 65 63 72 79 70  CK_RV (*C_Decryp
0c40: 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
0c50: 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
0c60: 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
0c70: 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c  yptedData, CK_UL
0c80: 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 44  ONG ulEncryptedD
0c90: 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
0ca0: 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
0cb0: 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c  ONG_PTR pulDataL
0cc0: 65 6e 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f  en) = NULL;..CK_
0cd0: 52 56 20 28 2a 43 5f 44 65 63 72 79 70 74 49 6e  RV (*C_DecryptIn
0ce0: 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
0cf0: 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
0d00: 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
0d10: 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
0d20: 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
0d30: 65 79 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f  ey) = NULL;..CK_
0d40: 52 56 20 28 2a 43 5f 45 6e 63 72 79 70 74 29 28  RV (*C_Encrypt)(
0d50: 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
0d60: 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
0d70: 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
0d80: 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
0d90: 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
0da0: 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43  EncryptedData, C
0db0: 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
0dc0: 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29  ncryptedDataLen)
0dd0: 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20   = NULL;..CK_RV 
0de0: 28 2a 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 29  (*C_EncryptInit)
0df0: 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
0e00: 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
0e10: 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
0e20: 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
0e30: 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
0e40: 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20   = NULL;..CK_RV 
0e50: 28 2a 43 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b  (*C_Finalize)(CK
0e60: 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72  _VOID_PTR pReser
0e70: 76 65 64 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b  ved) = NULL;..CK
0e80: 5f 52 56 20 28 2a 43 5f 46 69 6e 64 4f 62 6a 65  _RV (*C_FindObje
0e90: 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  cts)(CK_SESSION_
0ea0: 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
0eb0: 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
0ec0: 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20  E_PTR phObject, 
0ed0: 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62  CK_ULONG ulMaxOb
0ee0: 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c  jectCount, CK_UL
0ef0: 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63  ONG_PTR pulObjec
0f00: 74 43 6f 75 6e 74 29 20 3d 20 4e 55 4c 4c 3b 0a  tCount) = NULL;.
0f10: 09 43 4b 5f 52 56 20 28 2a 43 5f 46 69 6e 64 4f  .CK_RV (*C_FindO
0f20: 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f  bjectsFinal)(CK_
0f30: 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
0f40: 53 65 73 73 69 6f 6e 29 20 3d 20 4e 55 4c 4c 3b  Session) = NULL;
0f50: 0a 09 43 4b 5f 52 56 20 28 2a 43 5f 46 69 6e 64  ..CK_RV (*C_Find
0f60: 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f  ObjectsInit)(CK_
0f70: 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
0f80: 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52  Session, CK_ATTR
0f90: 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
0fa0: 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
0fb0: 43 6f 75 6e 74 29 20 3d 20 4e 55 4c 4c 3b 0a 09  Count) = NULL;..
0fc0: 43 4b 5f 52 56 20 28 2a 43 5f 47 65 74 41 74 74  CK_RV (*C_GetAtt
0fd0: 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f  ributeValue)(CK_
0fe0: 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
0ff0: 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
1000: 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
1010: 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
1020: 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
1030: 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29  K_ULONG ulCount)
1040: 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20   = NULL;..CK_RV 
1050: 28 2a 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f  (*C_GetInfo)(CK_
1060: 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
1070: 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28  = NULL;..CK_RV (
1080: 2a 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66  *C_GetSessionInf
1090: 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  o)(CK_SESSION_HA
10a0: 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
10b0: 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50  K_SESSION_INFO_P
10c0: 54 52 20 70 49 6e 66 6f 29 20 3d 20 4e 55 4c 4c  TR pInfo) = NULL
10d0: 3b 0a 09 43 4b 5f 52 56 20 28 2a 43 5f 47 65 74  ;..CK_RV (*C_Get
10e0: 53 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f  SlotInfo)(CK_SLO
10f0: 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
1100: 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49  SLOT_INFO_PTR pI
1110: 6e 66 6f 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b  nfo) = NULL;..CK
1120: 5f 52 56 20 28 2a 43 5f 47 65 74 53 6c 6f 74 4c  _RV (*C_GetSlotL
1130: 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f  ist)(CK_BBOOL to
1140: 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53  kenPresent, CK_S
1150: 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74  LOT_ID_PTR pSlot
1160: 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  List, CK_ULONG_P
1170: 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 3d 20 4e  TR pulCount) = N
1180: 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28 2a 43 5f  ULL;..CK_RV (*C_
1190: 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b  GetTokenInfo)(CK
11a0: 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
11b0: 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50   CK_TOKEN_INFO_P
11c0: 54 52 20 70 49 6e 66 6f 29 20 3d 20 4e 55 4c 4c  TR pInfo) = NULL
11d0: 3b 0a 09 43 4b 5f 52 56 20 28 2a 43 5f 49 6e 69  ;..CK_RV (*C_Ini
11e0: 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  tialize)(CK_VOID
11f0: 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73 29 20  _PTR pInitArgs) 
1200: 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28  = NULL;..CK_RV (
1210: 2a 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53  *C_Login)(CK_SES
1220: 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1230: 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59  sion, CK_USER_TY
1240: 50 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f  PE userType, CK_
1250: 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
1260: 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
1270: 6e 4c 65 6e 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43  nLen) = NULL;..C
1280: 4b 5f 52 56 20 28 2a 43 5f 4f 70 65 6e 53 65 73  K_RV (*C_OpenSes
1290: 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  sion)(CK_SLOT_ID
12a0: 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47   slotID, CK_FLAG
12b0: 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44  S flags, CK_VOID
12c0: 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f  _PTR pApplicatio
12d0: 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74  n, CK_NOTIFY not
12e0: 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f  ify, CK_SESSION_
12f0: 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73  HANDLE_PTR phSes
1300: 73 69 6f 6e 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43  sion) = NULL;..C
1310: 4b 5f 52 56 20 28 2a 43 5f 53 69 67 6e 29 28 43  K_RV (*C_Sign)(C
1320: 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1330: 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1340: 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
1350: 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
1360: 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
1370: 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
1380: 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74  NG_PTR pulSignat
1390: 75 72 65 4c 65 6e 29 20 3d 20 4e 55 4c 4c 3b 0a  ureLen) = NULL;.
13a0: 09 43 4b 5f 52 56 20 28 2a 43 5f 53 69 67 6e 49  .CK_RV (*C_SignI
13b0: 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
13c0: 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
13d0: 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
13e0: 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
13f0: 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
1400: 4b 65 79 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b  Key) = NULL;..CK
1410: 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52  _C_INITIALIZE_AR
1420: 47 53 20 69 6e 69 74 61 72 67 73 3b 0a 09 43 4b  GS initargs;..CK
1430: 5f 49 4e 46 4f 20 63 6c 69 65 6e 74 69 6e 66 6f  _INFO clientinfo
1440: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 53  ;..CK_ULONG numS
1450: 6c 6f 74 73 2c 20 63 75 72 72 53 6c 6f 74 3b 0a  lots, currSlot;.
1460: 09 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20  .CK_SLOT_ID_PTR 
1470: 73 6c 6f 74 73 3b 0a 09 43 4b 5f 53 4c 4f 54 5f  slots;..CK_SLOT_
1480: 49 4e 46 4f 20 73 6c 6f 74 49 6e 66 6f 3b 0a 09  INFO slotInfo;..
1490: 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 20 74 6f  CK_TOKEN_INFO to
14a0: 6b 65 6e 49 6e 66 6f 3b 0a 09 43 4b 5f 53 45 53  kenInfo;..CK_SES
14b0: 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
14c0: 73 69 6f 6e 3b 0a 09 43 4b 5f 53 45 53 53 49 4f  sion;..CK_SESSIO
14d0: 4e 5f 49 4e 46 4f 20 73 65 73 73 69 6f 6e 49 6e  N_INFO sessionIn
14e0: 66 6f 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 48  fo;..CK_OBJECT_H
14f0: 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 2a  ANDLE hObject, *
1500: 70 72 69 76 61 74 65 4b 65 79 4f 62 6a 65 63 74  privateKeyObject
1510: 73 5f 72 6f 6f 74 2c 20 2a 70 72 69 76 61 74 65  s_root, *private
1520: 4b 65 79 4f 62 6a 65 63 74 73 2c 20 2a 63 75 72  KeyObjects, *cur
1530: 72 50 72 69 76 4b 65 79 3b 0a 09 43 4b 5f 55 4c  rPrivKey;..CK_UL
1540: 4f 4e 47 20 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  ONG ulObjectCoun
1550: 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  t;..CK_ATTRIBUTE
1560: 20 74 65 6d 70 6c 61 74 65 5b 5d 20 3d 20 7b 0a   template[] = {.
1570: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1580: 20 20 20 20 20 20 20 20 20 20 20 20 7b 43 4b 41              {CKA
1590: 5f 43 4c 41 53 53 2c 20 4e 55 4c 4c 2c 20 30 7d  _CLASS, NULL, 0}
15a0: 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 43                {C
15c0: 4b 41 5f 54 4f 4b 45 4e 2c 20 4e 55 4c 4c 2c 20  KA_TOKEN, NULL, 
15d0: 30 7d 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  0},..           
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 7b 43 4b 41 5f 4c 41 42 45 4c 2c 20 4e 55 4c 4c  {CKA_LABEL, NULL
1600: 2c 20 30 7d 2c 0a 09 20 20 20 20 20 20 20 20 20  , 0},..         
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 7b 43 4b 41 5f 50 52 49 56 41 54 45 2c 20    {CKA_PRIVATE, 
1630: 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 20 20 20 20 20  NULL, 0},..     
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 20 20 20 7b 43 4b 41 5f 49 44 2c 20 4e        {CKA_ID, N
1660: 55 4c 4c 2c 20 30 7d 2c 0a 09 20 20 20 20 20 20  ULL, 0},..      
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 7b 43 4b 41 5f 53 45 52 49 41 4c       {CKA_SERIAL
1690: 5f 4e 55 4d 42 45 52 2c 20 4e 55 4c 4c 2c 20 30  _NUMBER, NULL, 0
16a0: 7d 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20  },..            
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
16c0: 43 4b 41 5f 53 55 42 4a 45 43 54 2c 20 4e 55 4c  CKA_SUBJECT, NUL
16d0: 4c 2c 20 30 7d 2c 0a 09 20 20 20 20 20 20 20 20  L, 0},..        
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 7b 43 4b 41 5f 49 53 53 55 45 52 2c 20     {CKA_ISSUER, 
1700: 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 20 20 20 20 20  NULL, 0},..     
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 20 20 20 20 20 7b 43 4b 41 5f 43 45 52 54 49        {CKA_CERTI
1730: 46 49 43 41 54 45 5f 54 59 50 45 2c 20 4e 55 4c  FICATE_TYPE, NUL
1740: 4c 2c 20 30 7d 2c 0a 09 20 20 20 20 20 20 20 20  L, 0},..        
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 20 7b 43 4b 41 5f 4b 45 59 5f 54 59 50 45     {CKA_KEY_TYPE
1770: 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 20 20 20  , NULL, 0},..   
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 20 20 20 20 20 20 20 20 7b 43 4b 41 5f 53 49 47          {CKA_SIG
17a0: 4e 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 20 20  N, NULL, 0},..  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 20 20 20 20 20 20 20 7b 43 4b 41 5f 56 41           {CKA_VA
17d0: 4c 55 45 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09  LUE, NULL, 0},..
17e0: 09 09 09 20 20 20 7b 43 4b 41 5f 43 45 52 54 5f  ...   {CKA_CERT_
17f0: 4d 44 35 5f 48 41 53 48 2c 20 4e 55 4c 4c 2c 20  MD5_HASH, NULL, 
1800: 30 7d 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41 5f  0},.....   {CKA_
1810: 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48 2c 20  CERT_SHA1_HASH, 
1820: 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09 09 09 20 20  NULL, 0},.....  
1830: 20 7b 43 4b 41 5f 54 52 55 53 54 45 44 2c 20 4e   {CKA_TRUSTED, N
1840: 55 4c 4c 2c 20 30 7d 2c 0a 09 09 09 09 20 20 20  ULL, 0},.....   
1850: 7b 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e  {CKA_TRUST_CLIEN
1860: 54 5f 41 55 54 48 2c 20 4e 55 4c 4c 2c 20 30 7d  T_AUTH, NULL, 0}
1870: 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41 5f 54 52  ,.....   {CKA_TR
1880: 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47  UST_CODE_SIGNING
1890: 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09 09 09  , NULL, 0},.....
18a0: 20 20 20 7b 43 4b 41 5f 54 52 55 53 54 5f 43 52     {CKA_TRUST_CR
18b0: 4c 5f 53 49 47 4e 2c 20 4e 55 4c 4c 2c 20 30 7d  L_SIGN, NULL, 0}
18c0: 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41 5f 54 52  ,.....   {CKA_TR
18d0: 55 53 54 5f 44 41 54 41 5f 45 4e 43 49 50 48 45  UST_DATA_ENCIPHE
18e0: 52 4d 45 4e 54 2c 20 4e 55 4c 4c 2c 20 30 7d 2c  RMENT, NULL, 0},
18f0: 0a 09 09 09 09 20 20 20 7b 43 4b 41 5f 54 52 55  .....   {CKA_TRU
1900: 53 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41  ST_DIGITAL_SIGNA
1910: 54 55 52 45 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a  TURE, NULL, 0},.
1920: 09 09 09 09 20 20 20 7b 43 4b 41 5f 54 52 55 53  ....   {CKA_TRUS
1930: 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49  T_EMAIL_PROTECTI
1940: 4f 4e 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09  ON, NULL, 0},...
1950: 09 09 20 20 20 7b 43 4b 41 5f 54 52 55 53 54 5f  ..   {CKA_TRUST_
1960: 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 2c 20 4e  KEY_AGREEMENT, N
1970: 55 4c 4c 2c 20 30 7d 2c 0a 09 09 09 09 20 20 20  ULL, 0},.....   
1980: 7b 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 43  {CKA_TRUST_KEY_C
1990: 45 52 54 5f 53 49 47 4e 2c 20 4e 55 4c 4c 2c 20  ERT_SIGN, NULL, 
19a0: 30 7d 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41 5f  0},.....   {CKA_
19b0: 54 52 55 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48  TRUST_KEY_ENCIPH
19c0: 45 52 4d 45 4e 54 2c 20 4e 55 4c 4c 2c 20 30 7d  ERMENT, NULL, 0}
19d0: 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41 5f 54 52  ,.....   {CKA_TR
19e0: 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 54  UST_NON_REPUDIAT
19f0: 49 4f 4e 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09  ION, NULL, 0},..
1a00: 09 09 09 20 20 20 7b 43 4b 41 5f 54 52 55 53 54  ...   {CKA_TRUST
1a10: 5f 53 45 52 56 45 52 5f 41 55 54 48 2c 20 4e 55  _SERVER_AUTH, NU
1a20: 4c 4c 2c 20 30 7d 0a 09 20 20 20 20 20 20 20 20  LL, 0}..        
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 7d 2c 20 2a 63 75 72 72 5f 61 74 74 72 3b    }, *curr_attr;
1a50: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f  ..CK_ULONG curr_
1a60: 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c  attr_idx;..CK_UL
1a70: 4f 4e 47 20 62 79 74 65 5f 69 64 78 3b 0a 09 43  ONG byte_idx;..C
1a80: 4b 5f 55 54 46 38 43 48 41 52 20 75 73 65 72 5f  K_UTF8CHAR user_
1a90: 70 69 6e 5b 31 30 32 34 5d 2c 20 2a 70 75 63 56  pin[1024], *pucV
1aa0: 61 6c 75 65 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54  alue;..CK_OBJECT
1ab0: 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 43 6c 61  _CLASS objectCla
1ac0: 73 73 3b 0a 09 43 4b 5f 42 59 54 45 20 73 69 67  ss;..CK_BYTE sig
1ad0: 6e 61 74 75 72 65 5b 31 30 32 34 5d 2c 20 65 6e  nature[1024], en
1ae0: 63 72 79 70 74 65 64 5f 62 75 66 5b 31 36 33 38  crypted_buf[1638
1af0: 34 5d 2c 20 64 65 63 72 79 70 74 65 64 5f 62 75  4], decrypted_bu
1b00: 66 5b 31 36 33 38 34 5d 3b 0a 09 43 4b 5f 55 4c  f[16384];..CK_UL
1b10: 4f 4e 47 20 73 69 67 6e 61 74 75 72 65 5f 6c 65  ONG signature_le
1b20: 6e 2c 20 65 6e 63 72 79 70 74 65 64 5f 62 75 66  n, encrypted_buf
1b30: 6c 65 6e 2c 20 64 65 63 72 79 70 74 65 64 5f 62  len, decrypted_b
1b40: 75 66 6c 65 6e 3b 0a 09 43 4b 5f 4d 45 43 48 41  uflen;..CK_MECHA
1b50: 4e 49 53 4d 20 6d 65 63 68 61 6e 69 73 6d 20 3d  NISM mechanism =
1b60: 20 7b 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 2c 20   {CKM_RSA_PKCS, 
1b70: 4e 55 4c 4c 2c 20 30 7d 3b 0a 09 43 4b 5f 52 56  NULL, 0};..CK_RV
1b80: 20 63 68 6b 5f 72 76 3b 0a 09 63 68 61 72 20 2a   chk_rv;..char *
1b90: 66 67 65 74 73 5f 72 65 74 3b 0a 09 69 6e 74 20  fgets_ret;..int 
1ba0: 69 3b 0a 0a 09 63 68 6b 5f 72 76 20 3d 20 43 5f  i;...chk_rv = C_
1bb0: 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 28  GetFunctionList(
1bc0: 26 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 3b  &pFunctionList);
1bd0: 0a 09 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20  ..if (chk_rv != 
1be0: 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 70 72 69 6e  CKR_OK) {...prin
1bf0: 74 66 28 22 43 5f 47 65 74 46 75 6e 63 74 69 6f  tf("C_GetFunctio
1c00: 6e 4c 69 73 74 28 29 20 66 61 69 6c 65 64 2e 22  nList() failed."
1c10: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
1c20: 0a 09 7d 0a 0a 09 43 5f 43 6c 6f 73 65 53 65 73  ..}...C_CloseSes
1c30: 73 69 6f 6e 20 3d 20 70 46 75 6e 63 74 69 6f 6e  sion = pFunction
1c40: 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73  List->C_CloseSes
1c50: 73 69 6f 6e 3b 0a 09 43 5f 44 65 63 72 79 70 74  sion;..C_Decrypt
1c60: 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74   = pFunctionList
1c70: 2d 3e 43 5f 44 65 63 72 79 70 74 3b 0a 09 43 5f  ->C_Decrypt;..C_
1c80: 44 65 63 72 79 70 74 49 6e 69 74 20 3d 20 70 46  DecryptInit = pF
1c90: 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
1ca0: 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 43 5f 45  ecryptInit;..C_E
1cb0: 6e 63 72 79 70 74 20 3d 20 70 46 75 6e 63 74 69  ncrypt = pFuncti
1cc0: 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70  onList->C_Encryp
1cd0: 74 3b 0a 09 43 5f 45 6e 63 72 79 70 74 49 6e 69  t;..C_EncryptIni
1ce0: 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t = pFunctionLis
1cf0: 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69 74  t->C_EncryptInit
1d00: 3b 0a 09 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20  ;..C_Finalize = 
1d10: 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1d20: 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 43 5f 46 69  _Finalize;..C_Fi
1d30: 6e 64 4f 62 6a 65 63 74 73 20 3d 20 70 46 75 6e  ndObjects = pFun
1d40: 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
1d50: 64 4f 62 6a 65 63 74 73 3b 0a 09 43 5f 46 69 6e  dObjects;..C_Fin
1d60: 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20  dObjectsFinal = 
1d70: 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1d80: 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61  _FindObjectsFina
1d90: 6c 3b 0a 09 43 5f 46 69 6e 64 4f 62 6a 65 63 74  l;..C_FindObject
1da0: 73 49 6e 69 74 20 3d 20 70 46 75 6e 63 74 69 6f  sInit = pFunctio
1db0: 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
1dc0: 65 63 74 73 49 6e 69 74 3b 0a 09 43 5f 47 65 74  ectsInit;..C_Get
1dd0: 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d  AttributeValue =
1de0: 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e   pFunctionList->
1df0: 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61  C_GetAttributeVa
1e00: 6c 75 65 3b 0a 09 43 5f 47 65 74 49 6e 66 6f 20  lue;..C_GetInfo 
1e10: 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  = pFunctionList-
1e20: 3e 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 43 5f 47  >C_GetInfo;..C_G
1e30: 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20  etSessionInfo = 
1e40: 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1e50: 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b  _GetSessionInfo;
1e60: 0a 09 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20  ..C_GetSlotInfo 
1e70: 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  = pFunctionList-
1e80: 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a  >C_GetSlotInfo;.
1e90: 09 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d  .C_GetSlotList =
1ea0: 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e   pFunctionList->
1eb0: 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09  C_GetSlotList;..
1ec0: 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d  C_GetTokenInfo =
1ed0: 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e   pFunctionList->
1ee0: 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a  C_GetTokenInfo;.
1ef0: 09 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20  .C_Initialize = 
1f00: 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1f10: 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 43 5f  _Initialize;..C_
1f20: 4c 6f 67 69 6e 20 3d 20 70 46 75 6e 63 74 69 6f  Login = pFunctio
1f30: 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 3b 0a  nList->C_Login;.
1f40: 09 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d  .C_OpenSession =
1f50: 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e   pFunctionList->
1f60: 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09  C_OpenSession;..
1f70: 43 5f 53 69 67 6e 20 3d 20 70 46 75 6e 63 74 69  C_Sign = pFuncti
1f80: 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 3b 0a  onList->C_Sign;.
1f90: 09 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 70 46  .C_SignInit = pF
1fa0: 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
1fb0: 69 67 6e 49 6e 69 74 3b 0a 0a 09 70 72 69 76 61  ignInit;...priva
1fc0: 74 65 4b 65 79 4f 62 6a 65 63 74 73 20 3d 20 6d  teKeyObjects = m
1fd0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 72  alloc(sizeof(*pr
1fe0: 69 76 61 74 65 4b 65 79 4f 62 6a 65 63 74 73 29  ivateKeyObjects)
1ff0: 20 2a 20 31 30 32 34 29 3b 0a 09 70 72 69 76 61   * 1024);..priva
2000: 74 65 4b 65 79 4f 62 6a 65 63 74 73 5f 72 6f 6f  teKeyObjects_roo
2010: 74 20 3d 20 70 72 69 76 61 74 65 4b 65 79 4f 62  t = privateKeyOb
2020: 6a 65 63 74 73 3b 0a 09 66 6f 72 20 28 69 20 3d  jects;..for (i =
2030: 20 30 3b 20 69 20 3c 20 31 30 32 34 3b 20 69 2b   0; i < 1024; i+
2040: 2b 29 20 7b 0a 09 09 70 72 69 76 61 74 65 4b 65  +) {...privateKe
2050: 79 4f 62 6a 65 63 74 73 5b 69 5d 20 3d 20 43 4b  yObjects[i] = CK
2060: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3b  _INVALID_HANDLE;
2070: 0a 09 7d 0a 0a 09 69 6e 69 74 61 72 67 73 2e 43  ..}...initargs.C
2080: 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c  reateMutex = NUL
2090: 4c 3b 0a 09 69 6e 69 74 61 72 67 73 2e 44 65 73  L;..initargs.Des
20a0: 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  troyMutex = NULL
20b0: 3b 0a 09 69 6e 69 74 61 72 67 73 2e 4c 6f 63 6b  ;..initargs.Lock
20c0: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 69  Mutex = NULL;..i
20d0: 6e 69 74 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  nitargs.UnlockMu
20e0: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 69  tex = NULL;..ini
20f0: 74 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 43 4b  targs.flags = CK
2100: 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 3b  F_OS_LOCKING_OK;
2110: 0a 09 69 6e 69 74 61 72 67 73 2e 70 52 65 73 65  ..initargs.pRese
2120: 72 76 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 63  rved = NULL;...c
2130: 68 6b 5f 72 76 20 3d 20 43 5f 49 6e 69 74 69 61  hk_rv = C_Initia
2140: 6c 69 7a 65 28 26 69 6e 69 74 61 72 67 73 29 3b  lize(&initargs);
2150: 0a 09 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20  ..if (chk_rv != 
2160: 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 6e 69 74  CKR_OK) {...init
2170: 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
2180: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 6e 69 74 61   = NULL;...inita
2190: 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78  rgs.DestroyMutex
21a0: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 6e 69 74 61   = NULL;...inita
21b0: 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20  rgs.LockMutex = 
21c0: 4e 55 4c 4c 3b 0a 09 09 69 6e 69 74 61 72 67 73  NULL;...initargs
21d0: 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e  .UnlockMutex = N
21e0: 55 4c 4c 3b 0a 09 09 69 6e 69 74 61 72 67 73 2e  ULL;...initargs.
21f0: 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 69 6e 69  flags = 0;...ini
2200: 74 61 72 67 73 2e 70 52 65 73 65 72 76 65 64 20  targs.pReserved 
2210: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 63 68 6b 5f 72  = NULL;....chk_r
2220: 76 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65  v = C_Initialize
2230: 28 26 69 6e 69 74 61 72 67 73 29 3b 0a 09 09 69  (&initargs);...i
2240: 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52  f (chk_rv != CKR
2250: 5f 4f 4b 29 20 7b 0a 09 09 09 70 72 69 6e 74 66  _OK) {....printf
2260: 28 22 43 5f 49 6e 69 74 69 61 6c 69 7a 65 28 29  ("C_Initialize()
2270: 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
2280: 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 09  return(1);...}..
2290: 7d 0a 0a 09 63 68 6b 5f 72 76 20 3d 20 43 5f 47  }...chk_rv = C_G
22a0: 65 74 49 6e 66 6f 28 26 63 6c 69 65 6e 74 69 6e  etInfo(&clientin
22b0: 66 6f 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72 76  fo);..if (chk_rv
22c0: 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
22d0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
22e0: 70 72 69 6e 74 66 28 22 50 4b 43 53 23 31 31 20  printf("PKCS#11 
22f0: 43 6c 69 65 6e 74 20 56 65 72 73 69 6f 6e 3a 20  Client Version: 
2300: 25 69 2e 25 69 2c 20 4c 69 62 72 61 72 79 20 56  %i.%i, Library V
2310: 65 72 73 69 6f 6e 20 25 69 2e 25 69 5c 6e 22 2c  ersion %i.%i\n",
2320: 20 63 6c 69 65 6e 74 69 6e 66 6f 2e 63 72 79 70   clientinfo.cryp
2330: 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  tokiVersion.majo
2340: 72 2c 20 63 6c 69 65 6e 74 69 6e 66 6f 2e 63 72  r, clientinfo.cr
2350: 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69  yptokiVersion.mi
2360: 6e 6f 72 2c 20 63 6c 69 65 6e 74 69 6e 66 6f 2e  nor, clientinfo.
2370: 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d  libraryVersion.m
2380: 61 6a 6f 72 2c 20 63 6c 69 65 6e 74 69 6e 66 6f  ajor, clientinfo
2390: 2e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e  .libraryVersion.
23a0: 6d 69 6e 6f 72 29 3b 0a 09 70 72 69 6e 74 66 28  minor);..printf(
23b0: 22 50 4b 43 53 23 31 31 20 4d 61 6e 75 66 49 44  "PKCS#11 ManufID
23c0: 3a 20 25 2e 2a 73 2c 20 4c 69 62 72 61 72 79 44  : %.*s, LibraryD
23d0: 65 73 63 3a 20 25 2e 2a 73 5c 6e 22 2c 20 33 32  esc: %.*s\n", 32
23e0: 2c 20 63 6c 69 65 6e 74 69 6e 66 6f 2e 6d 61 6e  , clientinfo.man
23f0: 75 66 61 63 74 75 72 65 72 49 44 2c 20 33 32 2c  ufacturerID, 32,
2400: 20 63 6c 69 65 6e 74 69 6e 66 6f 2e 6c 69 62 72   clientinfo.libr
2410: 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 3b  aryDescription);
2420: 0a 0a 09 63 68 6b 5f 72 76 20 3d 20 43 5f 47 65  ...chk_rv = C_Ge
2430: 74 53 6c 6f 74 4c 69 73 74 28 46 41 4c 53 45 2c  tSlotList(FALSE,
2440: 20 4e 55 4c 4c 2c 20 26 6e 75 6d 53 6c 6f 74 73   NULL, &numSlots
2450: 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72 76 20 21  );..if (chk_rv !
2460: 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 72 65  = CKR_OK) {...re
2470: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 70 72  turn(1);..}...pr
2480: 69 6e 74 66 28 22 4e 75 6d 62 65 72 20 6f 66 20  intf("Number of 
2490: 53 6c 6f 74 73 3a 20 25 6c 75 5c 6e 22 2c 20 6e  Slots: %lu\n", n
24a0: 75 6d 53 6c 6f 74 73 29 3b 0a 0a 09 73 6c 6f 74  umSlots);...slot
24b0: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
24c0: 66 28 2a 73 6c 6f 74 73 29 20 2a 20 6e 75 6d 53  f(*slots) * numS
24d0: 6c 6f 74 73 29 3b 0a 0a 09 63 68 6b 5f 72 76 20  lots);...chk_rv 
24e0: 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 28  = C_GetSlotList(
24f0: 46 41 4c 53 45 2c 20 73 6c 6f 74 73 2c 20 26 6e  FALSE, slots, &n
2500: 75 6d 53 6c 6f 74 73 29 3b 0a 09 69 66 20 28 63  umSlots);..if (c
2510: 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29  hk_rv != CKR_OK)
2520: 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a   {...return(1);.
2530: 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 53 6c  .}...for (currSl
2540: 6f 74 20 3d 20 30 3b 20 63 75 72 72 53 6c 6f 74  ot = 0; currSlot
2550: 20 3c 20 6e 75 6d 53 6c 6f 74 73 3b 20 63 75 72   < numSlots; cur
2560: 72 53 6c 6f 74 2b 2b 29 20 7b 0a 09 09 70 72 69  rSlot++) {...pri
2570: 6e 74 66 28 22 20 20 53 6c 6f 74 20 25 6c 75 3a  ntf("  Slot %lu:
2580: 5c 6e 22 2c 20 63 75 72 72 53 6c 6f 74 29 3b 0a  \n", currSlot);.
2590: 0a 09 09 63 68 6b 5f 72 76 20 3d 20 43 5f 47 65  ...chk_rv = C_Ge
25a0: 74 53 6c 6f 74 49 6e 66 6f 28 73 6c 6f 74 73 5b  tSlotInfo(slots[
25b0: 63 75 72 72 53 6c 6f 74 5d 2c 20 26 73 6c 6f 74  currSlot], &slot
25c0: 49 6e 66 6f 29 3b 0a 09 09 69 66 20 28 63 68 6b  Info);...if (chk
25d0: 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  _rv != CKR_OK) {
25e0: 0a 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
25f0: 09 7d 0a 0a 09 09 70 72 69 6e 74 66 28 22 20 20  .}....printf("  
2600: 20 20 49 64 20 20 20 20 20 3a 20 25 6c 75 5c 6e    Id     : %lu\n
2610: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2620: 67 29 20 73 6c 6f 74 73 5b 63 75 72 72 53 6c 6f  g) slots[currSlo
2630: 74 5d 29 3b 0a 09 09 70 72 69 6e 74 66 28 22 20  t]);...printf(" 
2640: 20 20 20 44 65 73 63 20 20 20 3a 20 25 2e 2a 73     Desc   : %.*s
2650: 5c 6e 22 2c 20 33 32 2c 20 73 6c 6f 74 49 6e 66  \n", 32, slotInf
2660: 6f 2e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  o.slotDescriptio
2670: 6e 29 3b 0a 09 09 70 72 69 6e 74 66 28 22 20 20  n);...printf("  
2680: 20 20 4d 61 6e 75 66 49 44 3a 20 25 2e 2a 73 5c    ManufID: %.*s\
2690: 6e 22 2c 20 33 32 2c 20 73 6c 6f 74 49 6e 66 6f  n", 32, slotInfo
26a0: 2e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  .manufacturerID)
26b0: 3b 0a 09 09 70 72 69 6e 74 66 28 22 20 20 20 20  ;...printf("    
26c0: 48 57 56 65 72 73 20 3a 20 25 69 2e 25 69 5c 6e  HWVers : %i.%i\n
26d0: 22 2c 20 73 6c 6f 74 49 6e 66 6f 2e 68 61 72 64  ", slotInfo.hard
26e0: 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
26f0: 72 2c 20 73 6c 6f 74 49 6e 66 6f 2e 68 61 72 64  r, slotInfo.hard
2700: 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
2710: 72 29 3b 0a 09 09 70 72 69 6e 74 66 28 22 20 20  r);...printf("  
2720: 20 20 46 57 56 65 72 73 20 3a 20 25 69 2e 25 69    FWVers : %i.%i
2730: 5c 6e 22 2c 20 73 6c 6f 74 49 6e 66 6f 2e 66 69  \n", slotInfo.fi
2740: 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61  rmwareVersion.ma
2750: 6a 6f 72 2c 20 73 6c 6f 74 49 6e 66 6f 2e 66 69  jor, slotInfo.fi
2760: 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
2770: 6e 6f 72 29 3b 0a 09 09 70 72 69 6e 74 66 28 22  nor);...printf("
2780: 20 20 20 20 46 6c 61 67 73 20 20 3a 20 22 29 3b      Flags  : ");
2790: 0a 09 09 69 66 20 28 28 73 6c 6f 74 49 6e 66 6f  ...if ((slotInfo
27a0: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 54 4f 4b  .flags & CKF_TOK
27b0: 45 4e 5f 50 52 45 53 45 4e 54 29 20 3d 3d 20 43  EN_PRESENT) == C
27c0: 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54  KF_TOKEN_PRESENT
27d0: 29 20 7b 0a 09 09 09 70 72 69 6e 74 66 28 22 43  ) {....printf("C
27e0: 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54  KF_TOKEN_PRESENT
27f0: 20 22 29 3b 0a 09 09 7d 0a 09 09 69 66 20 28 28   ");...}...if ((
2800: 73 6c 6f 74 49 6e 66 6f 2e 66 6c 61 67 73 20 26  slotInfo.flags &
2810: 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44   CKF_REMOVABLE_D
2820: 45 56 49 43 45 29 20 3d 3d 20 43 4b 46 5f 52 45  EVICE) == CKF_RE
2830: 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 29 20  MOVABLE_DEVICE) 
2840: 7b 0a 09 09 09 70 72 69 6e 74 66 28 22 43 4b 46  {....printf("CKF
2850: 5f 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43  _REMOVABLE_DEVIC
2860: 45 20 22 29 3b 0a 09 09 7d 0a 09 09 69 66 20 28  E ");...}...if (
2870: 28 73 6c 6f 74 49 6e 66 6f 2e 66 6c 61 67 73 20  (slotInfo.flags 
2880: 26 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 29 20 3d  & CKF_HW_SLOT) =
2890: 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 29 20 7b  = CKF_HW_SLOT) {
28a0: 0a 09 09 09 70 72 69 6e 74 66 28 22 43 4b 46 5f  ....printf("CKF_
28b0: 48 57 5f 53 4c 4f 54 20 22 29 3b 0a 09 09 7d 0a  HW_SLOT ");...}.
28c0: 09 09 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ..printf("\n");.
28d0: 0a 09 09 69 66 20 28 28 73 6c 6f 74 49 6e 66 6f  ...if ((slotInfo
28e0: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 54 4f 4b  .flags & CKF_TOK
28f0: 45 4e 5f 50 52 45 53 45 4e 54 29 20 3d 3d 20 43  EN_PRESENT) == C
2900: 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54  KF_TOKEN_PRESENT
2910: 29 20 7b 0a 09 09 09 70 72 69 6e 74 66 28 22 20  ) {....printf(" 
2920: 20 20 20 54 6f 6b 65 6e 3a 5c 6e 22 29 3b 0a 0a     Token:\n");..
2930: 09 09 09 63 68 6b 5f 72 76 20 3d 20 43 5f 47 65  ...chk_rv = C_Ge
2940: 74 54 6f 6b 65 6e 49 6e 66 6f 28 73 6c 6f 74 73  tTokenInfo(slots
2950: 5b 63 75 72 72 53 6c 6f 74 5d 2c 20 26 74 6f 6b  [currSlot], &tok
2960: 65 6e 49 6e 66 6f 29 3b 0a 09 09 09 69 66 20 28  enInfo);....if (
2970: 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b  chk_rv != CKR_OK
2980: 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 31  ) {.....return(1
2990: 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 70 72 69 6e  );....}.....prin
29a0: 74 66 28 22 20 20 20 20 20 20 4c 61 62 65 6c 20  tf("      Label 
29b0: 20 3a 20 25 2e 2a 73 5c 6e 22 2c 20 33 32 2c 20   : %.*s\n", 32, 
29c0: 74 6f 6b 65 6e 49 6e 66 6f 2e 6c 61 62 65 6c 29  tokenInfo.label)
29d0: 3b 0a 09 09 09 70 72 69 6e 74 66 28 22 20 20 20  ;....printf("   
29e0: 20 20 20 4d 61 6e 75 66 49 44 3a 20 25 2e 2a 73     ManufID: %.*s
29f0: 5c 6e 22 2c 20 33 32 2c 20 74 6f 6b 65 6e 49 6e  \n", 32, tokenIn
2a00: 66 6f 2e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  fo.manufacturerI
2a10: 44 29 3b 0a 09 09 09 70 72 69 6e 74 66 28 22 20  D);....printf(" 
2a20: 20 20 20 20 20 4d 6f 64 65 6c 20 20 3a 20 25 2e       Model  : %.
2a30: 2a 73 5c 6e 22 2c 20 31 36 2c 20 74 6f 6b 65 6e  *s\n", 16, token
2a40: 49 6e 66 6f 2e 6d 6f 64 65 6c 29 3b 0a 09 09 09  Info.model);....
2a50: 70 72 69 6e 74 66 28 22 20 20 20 20 20 20 53 65  printf("      Se
2a60: 72 4e 6f 20 20 3a 20 25 2e 2a 73 5c 6e 22 2c 20  rNo  : %.*s\n", 
2a70: 31 36 2c 20 74 6f 6b 65 6e 49 6e 66 6f 2e 73 65  16, tokenInfo.se
2a80: 72 69 61 6c 4e 75 6d 62 65 72 29 3b 0a 09 09 09  rialNumber);....
2a90: 70 72 69 6e 74 66 28 22 20 20 20 20 20 20 48 57  printf("      HW
2aa0: 56 65 72 73 20 3a 20 25 69 2e 25 69 5c 6e 22 2c  Vers : %i.%i\n",
2ab0: 20 74 6f 6b 65 6e 49 6e 66 6f 2e 68 61 72 64 77   tokenInfo.hardw
2ac0: 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
2ad0: 2c 20 74 6f 6b 65 6e 49 6e 66 6f 2e 68 61 72 64  , tokenInfo.hard
2ae0: 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
2af0: 72 29 3b 0a 09 09 09 70 72 69 6e 74 66 28 22 20  r);....printf(" 
2b00: 20 20 20 20 20 46 57 56 65 72 73 20 3a 20 25 69       FWVers : %i
2b10: 2e 25 69 5c 6e 22 2c 20 74 6f 6b 65 6e 49 6e 66  .%i\n", tokenInf
2b20: 6f 2e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  o.firmwareVersio
2b30: 6e 2e 6d 61 6a 6f 72 2c 20 74 6f 6b 65 6e 49 6e  n.major, tokenIn
2b40: 66 6f 2e 66 69 72 6d 77 61 72 65 56 65 72 73 69  fo.firmwareVersi
2b50: 6f 6e 2e 6d 69 6e 6f 72 29 3b 0a 09 09 09 70 72  on.minor);....pr
2b60: 69 6e 74 66 28 22 20 20 20 20 20 20 46 6c 61 67  intf("      Flag
2b70: 73 20 20 3a 20 22 29 3b 0a 09 09 09 69 66 20 28  s  : ");....if (
2b80: 28 74 6f 6b 65 6e 49 6e 66 6f 2e 66 6c 61 67 73  (tokenInfo.flags
2b90: 20 26 20 43 4b 46 5f 52 4e 47 29 20 3d 3d 20 43   & CKF_RNG) == C
2ba0: 4b 46 5f 52 4e 47 29 20 7b 0a 09 09 09 09 70 72  KF_RNG) {.....pr
2bb0: 69 6e 74 66 28 22 43 4b 46 5f 52 4e 47 20 22 29  intf("CKF_RNG ")
2bc0: 3b 0a 09 09 09 7d 0a 09 09 09 69 66 20 28 28 74  ;....}....if ((t
2bd0: 6f 6b 65 6e 49 6e 66 6f 2e 66 6c 61 67 73 20 26  okenInfo.flags &
2be0: 20 43 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54 45   CKF_WRITE_PROTE
2bf0: 43 54 45 44 29 20 3d 3d 20 43 4b 46 5f 57 52 49  CTED) == CKF_WRI
2c00: 54 45 5f 50 52 4f 54 45 43 54 45 44 29 20 7b 0a  TE_PROTECTED) {.
2c10: 09 09 09 09 70 72 69 6e 74 66 28 22 43 4b 46 5f  ....printf("CKF_
2c20: 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20  WRITE_PROTECTED 
2c30: 22 29 3b 0a 09 09 09 7d 0a 09 09 09 69 66 20 28  ");....}....if (
2c40: 28 74 6f 6b 65 6e 49 6e 66 6f 2e 66 6c 61 67 73  (tokenInfo.flags
2c50: 20 26 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   & CKF_LOGIN_REQ
2c60: 55 49 52 45 44 29 20 3d 3d 20 43 4b 46 5f 4c 4f  UIRED) == CKF_LO
2c70: 47 49 4e 5f 52 45 51 55 49 52 45 44 29 20 7b 0a  GIN_REQUIRED) {.
2c80: 09 09 09 09 70 72 69 6e 74 66 28 22 43 4b 46 5f  ....printf("CKF_
2c90: 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 22  LOGIN_REQUIRED "
2ca0: 29 3b 0a 09 09 09 7d 0a 09 09 09 69 66 20 28 28  );....}....if ((
2cb0: 74 6f 6b 65 6e 49 6e 66 6f 2e 66 6c 61 67 73 20  tokenInfo.flags 
2cc0: 26 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49  & CKF_USER_PIN_I
2cd0: 4e 49 54 49 41 4c 49 5a 45 44 29 20 3d 3d 20 43  NITIALIZED) == C
2ce0: 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54  KF_USER_PIN_INIT
2cf0: 49 41 4c 49 5a 45 44 29 20 7b 0a 09 09 09 09 70  IALIZED) {.....p
2d00: 72 69 6e 74 66 28 22 43 4b 46 5f 55 53 45 52 5f  rintf("CKF_USER_
2d10: 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20  PIN_INITIALIZED 
2d20: 22 29 3b 0a 09 09 09 7d 0a 09 09 09 69 66 20 28  ");....}....if (
2d30: 28 74 6f 6b 65 6e 49 6e 66 6f 2e 66 6c 61 67 73  (tokenInfo.flags
2d40: 20 26 20 43 4b 46 5f 52 45 53 54 4f 52 45 5f 4b   & CKF_RESTORE_K
2d50: 45 59 5f 4e 4f 54 5f 4e 45 45 44 45 44 29 20 3d  EY_NOT_NEEDED) =
2d60: 3d 20 43 4b 46 5f 52 45 53 54 4f 52 45 5f 4b 45  = CKF_RESTORE_KE
2d70: 59 5f 4e 4f 54 5f 4e 45 45 44 45 44 29 20 7b 0a  Y_NOT_NEEDED) {.
2d80: 09 09 09 09 70 72 69 6e 74 66 28 22 43 4b 46 5f  ....printf("CKF_
2d90: 52 45 53 54 4f 52 45 5f 4b 45 59 5f 4e 4f 54 5f  RESTORE_KEY_NOT_
2da0: 4e 45 45 44 45 44 20 22 29 3b 0a 09 09 09 7d 0a  NEEDED ");....}.
2db0: 09 09 09 69 66 20 28 28 74 6f 6b 65 6e 49 6e 66  ...if ((tokenInf
2dc0: 6f 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 43 4c  o.flags & CKF_CL
2dd0: 4f 43 4b 5f 4f 4e 5f 54 4f 4b 45 4e 29 20 3d 3d  OCK_ON_TOKEN) ==
2de0: 20 43 4b 46 5f 43 4c 4f 43 4b 5f 4f 4e 5f 54 4f   CKF_CLOCK_ON_TO
2df0: 4b 45 4e 29 20 7b 0a 09 09 09 09 70 72 69 6e 74  KEN) {.....print
2e00: 66 28 22 43 4b 46 5f 43 4c 4f 43 4b 5f 4f 4e 5f  f("CKF_CLOCK_ON_
2e10: 54 4f 4b 45 4e 20 22 29 3b 0a 09 09 09 7d 0a 09  TOKEN ");....}..
2e20: 09 09 69 66 20 28 28 74 6f 6b 65 6e 49 6e 66 6f  ..if ((tokenInfo
2e30: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 50 52 4f  .flags & CKF_PRO
2e40: 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54 49 43  TECTED_AUTHENTIC
2e50: 41 54 49 4f 4e 5f 50 41 54 48 29 20 3d 3d 20 43  ATION_PATH) == C
2e60: 4b 46 5f 50 52 4f 54 45 43 54 45 44 5f 41 55 54  KF_PROTECTED_AUT
2e70: 48 45 4e 54 49 43 41 54 49 4f 4e 5f 50 41 54 48  HENTICATION_PATH
2e80: 29 20 7b 0a 09 09 09 09 70 72 69 6e 74 66 28 22  ) {.....printf("
2e90: 43 4b 46 5f 50 52 4f 54 45 43 54 45 44 5f 41 55  CKF_PROTECTED_AU
2ea0: 54 48 45 4e 54 49 43 41 54 49 4f 4e 5f 50 41 54  THENTICATION_PAT
2eb0: 48 20 22 29 3b 0a 09 09 09 7d 0a 09 09 09 69 66  H ");....}....if
2ec0: 20 28 28 74 6f 6b 65 6e 49 6e 66 6f 2e 66 6c 61   ((tokenInfo.fla
2ed0: 67 73 20 26 20 43 4b 46 5f 44 55 41 4c 5f 43 52  gs & CKF_DUAL_CR
2ee0: 59 50 54 4f 5f 4f 50 45 52 41 54 49 4f 4e 53 29  YPTO_OPERATIONS)
2ef0: 20 3d 3d 20 43 4b 46 5f 44 55 41 4c 5f 43 52 59   == CKF_DUAL_CRY
2f00: 50 54 4f 5f 4f 50 45 52 41 54 49 4f 4e 53 29 20  PTO_OPERATIONS) 
2f10: 7b 0a 09 09 09 09 70 72 69 6e 74 66 28 22 43 4b  {.....printf("CK
2f20: 46 5f 44 55 41 4c 5f 43 52 59 50 54 4f 5f 4f 50  F_DUAL_CRYPTO_OP
2f30: 45 52 41 54 49 4f 4e 53 20 22 29 3b 0a 09 09 09  ERATIONS ");....
2f40: 7d 0a 09 09 09 69 66 20 28 28 74 6f 6b 65 6e 49  }....if ((tokenI
2f50: 6e 66 6f 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  nfo.flags & CKF_
2f60: 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45  TOKEN_INITIALIZE
2f70: 44 29 20 3d 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f  D) == CKF_TOKEN_
2f80: 49 4e 49 54 49 41 4c 49 5a 45 44 29 20 7b 0a 09  INITIALIZED) {..
2f90: 09 09 09 70 72 69 6e 74 66 28 22 43 4b 46 5f 54  ...printf("CKF_T
2fa0: 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44  OKEN_INITIALIZED
2fb0: 20 22 29 3b 0a 09 09 09 7d 0a 09 09 09 69 66 20   ");....}....if 
2fc0: 28 28 74 6f 6b 65 6e 49 6e 66 6f 2e 66 6c 61 67  ((tokenInfo.flag
2fd0: 73 20 26 20 43 4b 46 5f 53 45 43 4f 4e 44 41 52  s & CKF_SECONDAR
2fe0: 59 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  Y_AUTHENTICATION
2ff0: 29 20 3d 3d 20 43 4b 46 5f 53 45 43 4f 4e 44 41  ) == CKF_SECONDA
3000: 52 59 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  RY_AUTHENTICATIO
3010: 4e 29 20 7b 0a 09 09 09 09 70 72 69 6e 74 66 28  N) {.....printf(
3020: 22 43 4b 46 5f 53 45 43 4f 4e 44 41 52 59 5f 41  "CKF_SECONDARY_A
3030: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 22 29  UTHENTICATION ")
3040: 3b 0a 09 09 09 7d 0a 09 09 09 69 66 20 28 28 74  ;....}....if ((t
3050: 6f 6b 65 6e 49 6e 66 6f 2e 66 6c 61 67 73 20 26  okenInfo.flags &
3060: 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f   CKF_USER_PIN_CO
3070: 55 4e 54 5f 4c 4f 57 29 20 3d 3d 20 43 4b 46 5f  UNT_LOW) == CKF_
3080: 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c  USER_PIN_COUNT_L
3090: 4f 57 29 20 7b 0a 09 09 09 09 70 72 69 6e 74 66  OW) {.....printf
30a0: 28 22 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43  ("CKF_USER_PIN_C
30b0: 4f 55 4e 54 5f 4c 4f 57 20 22 29 3b 0a 09 09 09  OUNT_LOW ");....
30c0: 7d 0a 09 09 09 69 66 20 28 28 74 6f 6b 65 6e 49  }....if ((tokenI
30d0: 6e 66 6f 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  nfo.flags & CKF_
30e0: 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54  USER_PIN_FINAL_T
30f0: 52 59 29 20 3d 3d 20 43 4b 46 5f 55 53 45 52 5f  RY) == CKF_USER_
3100: 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29 20 7b  PIN_FINAL_TRY) {
3110: 0a 09 09 09 09 70 72 69 6e 74 66 28 22 43 4b 46  .....printf("CKF
3120: 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f  _USER_PIN_FINAL_
3130: 54 52 59 20 22 29 3b 0a 09 09 09 7d 0a 09 09 09  TRY ");....}....
3140: 69 66 20 28 28 74 6f 6b 65 6e 49 6e 66 6f 2e 66  if ((tokenInfo.f
3150: 6c 61 67 73 20 26 20 43 4b 46 5f 55 53 45 52 5f  lags & CKF_USER_
3160: 50 49 4e 5f 4c 4f 43 4b 45 44 29 20 3d 3d 20 43  PIN_LOCKED) == C
3170: 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b  KF_USER_PIN_LOCK
3180: 45 44 29 20 7b 0a 09 09 09 09 70 72 69 6e 74 66  ED) {.....printf
3190: 28 22 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c  ("CKF_USER_PIN_L
31a0: 4f 43 4b 45 44 20 22 29 3b 0a 09 09 09 7d 0a 09  OCKED ");....}..
31b0: 09 09 69 66 20 28 28 74 6f 6b 65 6e 49 6e 66 6f  ..if ((tokenInfo
31c0: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 55 53 45  .flags & CKF_USE
31d0: 52 5f 50 49 4e 5f 54 4f 5f 42 45 5f 43 48 41 4e  R_PIN_TO_BE_CHAN
31e0: 47 45 44 29 20 3d 3d 20 43 4b 46 5f 55 53 45 52  GED) == CKF_USER
31f0: 5f 50 49 4e 5f 54 4f 5f 42 45 5f 43 48 41 4e 47  _PIN_TO_BE_CHANG
3200: 45 44 29 20 7b 0a 09 09 09 09 70 72 69 6e 74 66  ED) {.....printf
3210: 28 22 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 54  ("CKF_USER_PIN_T
3220: 4f 5f 42 45 5f 43 48 41 4e 47 45 44 20 22 29 3b  O_BE_CHANGED ");
3230: 0a 09 09 09 7d 0a 09 09 09 69 66 20 28 28 74 6f  ....}....if ((to
3240: 6b 65 6e 49 6e 66 6f 2e 66 6c 61 67 73 20 26 20  kenInfo.flags & 
3250: 43 4b 46 5f 53 4f 5f 50 49 4e 5f 43 4f 55 4e 54  CKF_SO_PIN_COUNT
3260: 5f 4c 4f 57 29 20 3d 3d 20 43 4b 46 5f 53 4f 5f  _LOW) == CKF_SO_
3270: 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 29 20 7b  PIN_COUNT_LOW) {
3280: 0a 09 09 09 09 70 72 69 6e 74 66 28 22 43 4b 46  .....printf("CKF
3290: 5f 53 4f 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  _SO_PIN_COUNT_LO
32a0: 57 20 22 29 3b 0a 09 09 09 7d 0a 09 09 09 69 66  W ");....}....if
32b0: 20 28 28 74 6f 6b 65 6e 49 6e 66 6f 2e 66 6c 61   ((tokenInfo.fla
32c0: 67 73 20 26 20 43 4b 46 5f 53 4f 5f 50 49 4e 5f  gs & CKF_SO_PIN_
32d0: 46 49 4e 41 4c 5f 54 52 59 29 20 3d 3d 20 43 4b  FINAL_TRY) == CK
32e0: 46 5f 53 4f 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54  F_SO_PIN_FINAL_T
32f0: 52 59 29 20 7b 0a 09 09 09 09 70 72 69 6e 74 66  RY) {.....printf
3300: 28 22 43 4b 46 5f 53 4f 5f 50 49 4e 5f 46 49 4e  ("CKF_SO_PIN_FIN
3310: 41 4c 5f 54 52 59 20 22 29 3b 0a 09 09 09 7d 0a  AL_TRY ");....}.
3320: 09 09 09 69 66 20 28 28 74 6f 6b 65 6e 49 6e 66  ...if ((tokenInf
3330: 6f 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 4f  o.flags & CKF_SO
3340: 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 20 3d 3d 20  _PIN_LOCKED) == 
3350: 43 4b 46 5f 53 4f 5f 50 49 4e 5f 4c 4f 43 4b 45  CKF_SO_PIN_LOCKE
3360: 44 29 20 7b 0a 09 09 09 09 70 72 69 6e 74 66 28  D) {.....printf(
3370: 22 43 4b 46 5f 53 4f 5f 50 49 4e 5f 4c 4f 43 4b  "CKF_SO_PIN_LOCK
3380: 45 44 20 22 29 3b 0a 09 09 09 7d 0a 09 09 09 69  ED ");....}....i
3390: 66 20 28 28 74 6f 6b 65 6e 49 6e 66 6f 2e 66 6c  f ((tokenInfo.fl
33a0: 61 67 73 20 26 20 43 4b 46 5f 53 4f 5f 50 49 4e  ags & CKF_SO_PIN
33b0: 5f 54 4f 5f 42 45 5f 43 48 41 4e 47 45 44 29 20  _TO_BE_CHANGED) 
33c0: 3d 3d 20 43 4b 46 5f 53 4f 5f 50 49 4e 5f 54 4f  == CKF_SO_PIN_TO
33d0: 5f 42 45 5f 43 48 41 4e 47 45 44 29 20 7b 0a 09  _BE_CHANGED) {..
33e0: 09 09 09 70 72 69 6e 74 66 28 22 43 4b 46 5f 53  ...printf("CKF_S
33f0: 4f 5f 50 49 4e 5f 54 4f 5f 42 45 5f 43 48 41 4e  O_PIN_TO_BE_CHAN
3400: 47 45 44 20 22 29 3b 0a 09 09 09 7d 0a 09 09 09  GED ");....}....
3410: 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 09 09  printf("\n");...
3420: 7d 0a 09 7d 0a 0a 09 63 68 6b 5f 72 76 20 3d 20  }..}...chk_rv = 
3430: 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 28 73 6c  C_OpenSession(sl
3440: 6f 74 73 5b 30 5d 2c 20 43 4b 46 5f 53 45 52 49  ots[0], CKF_SERI
3450: 41 4c 5f 53 45 53 53 49 4f 4e 2c 20 4e 55 4c 4c  AL_SESSION, NULL
3460: 2c 20 4e 55 4c 4c 2c 20 26 68 53 65 73 73 69 6f  , NULL, &hSessio
3470: 6e 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72 76 20  n);..if (chk_rv 
3480: 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 63  == CKR_OK) {...c
3490: 68 6b 5f 72 76 20 3d 20 43 5f 47 65 74 54 6f 6b  hk_rv = C_GetTok
34a0: 65 6e 49 6e 66 6f 28 73 6c 6f 74 73 5b 30 5d 2c  enInfo(slots[0],
34b0: 20 26 74 6f 6b 65 6e 49 6e 66 6f 29 3b 0a 09 09   &tokenInfo);...
34c0: 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b  if (chk_rv != CK
34d0: 52 5f 4f 4b 29 20 7b 0a 09 09 09 72 65 74 75 72  R_OK) {....retur
34e0: 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  n(1);...}....if 
34f0: 28 28 74 6f 6b 65 6e 49 6e 66 6f 2e 66 6c 61 67  ((tokenInfo.flag
3500: 73 20 26 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  s & CKF_LOGIN_RE
3510: 51 55 49 52 45 44 29 20 3d 3d 20 43 4b 46 5f 4c  QUIRED) == CKF_L
3520: 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 26 26  OGIN_REQUIRED &&
3530: 20 28 74 6f 6b 65 6e 49 6e 66 6f 2e 66 6c 61 67   (tokenInfo.flag
3540: 73 20 26 20 43 4b 46 5f 50 52 4f 54 45 43 54 45  s & CKF_PROTECTE
3550: 44 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  D_AUTHENTICATION
3560: 5f 50 41 54 48 29 20 3d 3d 20 30 29 20 7b 0a 09  _PATH) == 0) {..
3570: 09 09 66 67 65 74 73 5f 72 65 74 20 3d 20 4e 55  ..fgets_ret = NU
3580: 4c 4c 3b 0a 0a 09 09 09 77 68 69 6c 65 20 28 66  LL;.....while (f
3590: 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c  gets_ret == NULL
35a0: 29 20 7b 0a 09 09 09 09 70 72 69 6e 74 66 28 22  ) {.....printf("
35b0: 2a 2a 20 45 4e 54 45 52 20 50 49 4e 3a 20 22 29  ** ENTER PIN: ")
35c0: 3b 0a 09 09 09 09 66 66 6c 75 73 68 28 73 74 64  ;.....fflush(std
35d0: 6f 75 74 29 3b 0a 0a 09 09 09 09 66 67 65 74 73  out);......fgets
35e0: 5f 72 65 74 20 3d 20 66 67 65 74 73 28 28 63 68  _ret = fgets((ch
35f0: 61 72 20 2a 29 20 75 73 65 72 5f 70 69 6e 2c 20  ar *) user_pin, 
3600: 73 69 7a 65 6f 66 28 75 73 65 72 5f 70 69 6e 29  sizeof(user_pin)
3610: 2c 20 73 74 64 69 6e 29 3b 0a 09 09 09 7d 0a 0a  , stdin);....}..
3620: 09 09 09 69 66 20 28 73 74 72 6c 65 6e 28 28 63  ...if (strlen((c
3630: 68 61 72 20 2a 29 20 75 73 65 72 5f 70 69 6e 29  har *) user_pin)
3640: 20 3e 3d 20 31 29 20 7b 0a 09 09 09 09 77 68 69   >= 1) {.....whi
3650: 6c 65 20 28 75 73 65 72 5f 70 69 6e 5b 73 74 72  le (user_pin[str
3660: 6c 65 6e 28 28 63 68 61 72 20 2a 29 20 75 73 65  len((char *) use
3670: 72 5f 70 69 6e 29 20 2d 20 31 5d 20 3c 20 27 20  r_pin) - 1] < ' 
3680: 27 29 20 7b 0a 09 09 09 09 09 75 73 65 72 5f 70  ') {......user_p
3690: 69 6e 5b 73 74 72 6c 65 6e 28 28 63 68 61 72 20  in[strlen((char 
36a0: 2a 29 20 75 73 65 72 5f 70 69 6e 29 20 2d 20 31  *) user_pin) - 1
36b0: 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 09 09 7d 0a  ] = '\0';.....}.
36c0: 09 09 09 7d 0a 0a 09 09 09 63 68 6b 5f 72 76 20  ...}.....chk_rv 
36d0: 3d 20 43 5f 4c 6f 67 69 6e 28 68 53 65 73 73 69  = C_Login(hSessi
36e0: 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 75 73  on, CKU_USER, us
36f0: 65 72 5f 70 69 6e 2c 20 73 74 72 6c 65 6e 28 28  er_pin, strlen((
3700: 63 68 61 72 20 2a 29 20 75 73 65 72 5f 70 69 6e  char *) user_pin
3710: 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ));...} else {..
3720: 09 09 63 68 6b 5f 72 76 20 3d 20 43 5f 4c 6f 67  ..chk_rv = C_Log
3730: 69 6e 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55  in(hSession, CKU
3740: 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 29 3b  _USER, NULL, 0);
3750: 0a 09 09 7d 0a 09 09 69 66 20 28 63 68 6b 5f 72  ...}...if (chk_r
3760: 76 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  v == CKR_OK) {..
3770: 09 09 70 72 69 6e 74 66 28 22 4c 6f 67 69 6e 20  ..printf("Login 
3780: 74 6f 20 64 65 76 69 63 65 20 73 75 63 63 65 65  to device succee
3790: 64 2e 5c 6e 22 29 3b 0a 09 09 7d 20 65 6c 73 65  d.\n");...} else
37a0: 20 7b 0a 09 09 09 70 72 69 6e 74 66 28 22 4c 6f   {....printf("Lo
37b0: 67 69 6e 20 74 6f 20 64 65 76 69 63 65 20 66 61  gin to device fa
37c0: 69 6c 65 64 2e 5c 6e 22 29 3b 0a 09 09 7d 0a 0a  iled.\n");...}..
37d0: 09 09 63 68 6b 5f 72 76 20 3d 20 43 5f 47 65 74  ..chk_rv = C_Get
37e0: 53 65 73 73 69 6f 6e 49 6e 66 6f 28 68 53 65 73  SessionInfo(hSes
37f0: 73 69 6f 6e 2c 20 26 73 65 73 73 69 6f 6e 49 6e  sion, &sessionIn
3800: 66 6f 29 3b 0a 09 09 69 66 20 28 63 68 6b 5f 72  fo);...if (chk_r
3810: 76 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  v == CKR_OK) {..
3820: 09 09 70 72 69 6e 74 66 28 22 53 65 73 73 69 6f  ..printf("Sessio
3830: 6e 20 49 6e 66 6f 3a 5c 6e 22 29 3b 0a 09 09 09  n Info:\n");....
3840: 70 72 69 6e 74 66 28 22 20 20 53 6c 6f 74 20 49  printf("  Slot I
3850: 44 3a 20 25 6c 75 5c 6e 22 2c 20 28 75 6e 73 69  D: %lu\n", (unsi
3860: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 65 73 73 69  gned long) sessi
3870: 6f 6e 49 6e 66 6f 2e 73 6c 6f 74 49 44 29 3b 0a  onInfo.slotID);.
3880: 09 09 09 70 72 69 6e 74 66 28 22 20 20 44 65 76  ...printf("  Dev
3890: 20 45 72 72 3a 20 25 6c 75 5c 6e 22 2c 20 28 75   Err: %lu\n", (u
38a0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 65  nsigned long) se
38b0: 73 73 69 6f 6e 49 6e 66 6f 2e 75 6c 44 65 76 69  ssionInfo.ulDevi
38c0: 63 65 45 72 72 6f 72 29 3b 0a 0a 09 09 09 70 72  ceError);.....pr
38d0: 69 6e 74 66 28 22 20 20 53 74 61 74 65 20 20 3a  intf("  State  :
38e0: 20 22 29 3b 0a 09 09 09 69 66 20 28 73 65 73 73   ");....if (sess
38f0: 69 6f 6e 49 6e 66 6f 2e 73 74 61 74 65 20 3d 3d  ionInfo.state ==
3900: 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53   CKS_RO_PUBLIC_S
3910: 45 53 53 49 4f 4e 29 20 7b 0a 09 09 09 09 70 72  ESSION) {.....pr
3920: 69 6e 74 66 28 22 43 4b 53 5f 52 4f 5f 50 55 42  intf("CKS_RO_PUB
3930: 4c 49 43 5f 53 45 53 53 49 4f 4e 5c 6e 22 29 3b  LIC_SESSION\n");
3940: 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73  ....} else if (s
3950: 65 73 73 69 6f 6e 49 6e 66 6f 2e 73 74 61 74 65  essionInfo.state
3960: 20 3d 3d 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f   == CKS_RO_USER_
3970: 46 55 4e 43 54 49 4f 4e 53 29 20 7b 0a 09 09 09  FUNCTIONS) {....
3980: 09 70 72 69 6e 74 66 28 22 43 4b 53 5f 52 4f 5f  .printf("CKS_RO_
3990: 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 5c 6e  USER_FUNCTIONS\n
39a0: 22 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69 66  ");....} else if
39b0: 20 28 73 65 73 73 69 6f 6e 49 6e 66 6f 2e 73 74   (sessionInfo.st
39c0: 61 74 65 20 3d 3d 20 43 4b 53 5f 52 57 5f 50 55  ate == CKS_RW_PU
39d0: 42 4c 49 43 5f 53 45 53 53 49 4f 4e 29 20 7b 0a  BLIC_SESSION) {.
39e0: 09 09 09 09 70 72 69 6e 74 66 28 22 43 4b 53 5f  ....printf("CKS_
39f0: 52 57 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f  RW_PUBLIC_SESSIO
3a00: 4e 5c 6e 22 29 3b 0a 09 09 09 7d 20 65 6c 73 65  N\n");....} else
3a10: 20 69 66 20 28 73 65 73 73 69 6f 6e 49 6e 66 6f   if (sessionInfo
3a20: 2e 73 74 61 74 65 20 3d 3d 20 43 4b 53 5f 52 57  .state == CKS_RW
3a30: 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 29  _USER_FUNCTIONS)
3a40: 20 7b 0a 09 09 09 09 70 72 69 6e 74 66 28 22 43   {.....printf("C
3a50: 4b 53 5f 52 57 5f 55 53 45 52 5f 46 55 4e 43 54  KS_RW_USER_FUNCT
3a60: 49 4f 4e 53 5c 6e 22 29 3b 0a 09 09 09 7d 20 65  IONS\n");....} e
3a70: 6c 73 65 20 69 66 20 28 73 65 73 73 69 6f 6e 49  lse if (sessionI
3a80: 6e 66 6f 2e 73 74 61 74 65 20 3d 3d 20 43 4b 53  nfo.state == CKS
3a90: 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49  _RO_PUBLIC_SESSI
3aa0: 4f 4e 29 20 7b 0a 09 09 09 09 70 72 69 6e 74 66  ON) {.....printf
3ab0: 28 22 43 4b 53 5f 52 57 5f 53 4f 5f 46 55 4e 43  ("CKS_RW_SO_FUNC
3ac0: 54 49 4f 4e 53 5c 6e 22 29 3b 0a 09 09 09 7d 20  TIONS\n");....} 
3ad0: 65 6c 73 65 20 7b 0a 09 09 09 09 70 72 69 6e 74  else {.....print
3ae0: 66 28 22 55 6e 6b 6e 6f 77 6e 20 28 25 6c 75 29  f("Unknown (%lu)
3af0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
3b00: 67 29 20 73 65 73 73 69 6f 6e 49 6e 66 6f 2e 73  g) sessionInfo.s
3b10: 74 61 74 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  tate);....}.....
3b20: 70 72 69 6e 74 66 28 22 20 20 46 6c 61 67 73 20  printf("  Flags 
3b30: 20 3a 20 22 29 3b 0a 09 09 09 69 66 20 28 28 73   : ");....if ((s
3b40: 65 73 73 69 6f 6e 49 6e 66 6f 2e 66 6c 61 67 73  essionInfo.flags
3b50: 20 26 20 43 4b 46 5f 52 57 5f 53 45 53 53 49 4f   & CKF_RW_SESSIO
3b60: 4e 29 20 3d 3d 20 43 4b 46 5f 52 57 5f 53 45 53  N) == CKF_RW_SES
3b70: 53 49 4f 4e 29 20 7b 0a 09 09 09 09 70 72 69 6e  SION) {.....prin
3b80: 74 66 28 22 43 4b 46 5f 52 57 5f 53 45 53 53 49  tf("CKF_RW_SESSI
3b90: 4f 4e 20 22 29 3b 0a 09 09 09 7d 0a 09 09 09 69  ON ");....}....i
3ba0: 66 20 28 28 73 65 73 73 69 6f 6e 49 6e 66 6f 2e  f ((sessionInfo.
3bb0: 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49  flags & CKF_SERI
3bc0: 41 4c 5f 53 45 53 53 49 4f 4e 29 20 3d 3d 20 43  AL_SESSION) == C
3bd0: 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f  KF_SERIAL_SESSIO
3be0: 4e 29 20 7b 0a 09 09 09 09 70 72 69 6e 74 66 28  N) {.....printf(
3bf0: 22 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53  "CKF_SERIAL_SESS
3c00: 49 4f 4e 20 22 29 3b 0a 09 09 09 7d 0a 09 09 09  ION ");....}....
3c10: 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 09 09  printf("\n");...
3c20: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 70 72 69 6e  } else {....prin
3c30: 74 66 28 22 47 65 74 53 65 73 73 69 6f 6e 49 6e  tf("GetSessionIn
3c40: 66 6f 28 29 20 66 61 69 6c 65 64 2e 5c 6e 22 29  fo() failed.\n")
3c50: 3b 0a 09 09 7d 0a 0a 09 09 63 68 6b 5f 72 76 20  ;...}....chk_rv 
3c60: 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  = C_FindObjectsI
3c70: 6e 69 74 28 68 53 65 73 73 69 6f 6e 2c 20 4e 55  nit(hSession, NU
3c80: 4c 4c 2c 20 30 29 3b 0a 09 09 69 66 20 28 63 68  LL, 0);...if (ch
3c90: 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20  k_rv == CKR_OK) 
3ca0: 7b 0a 09 09 09 77 68 69 6c 65 20 28 31 29 20 7b  {....while (1) {
3cb0: 0a 09 09 09 09 63 68 6b 5f 72 76 20 3d 20 43 5f  .....chk_rv = C_
3cc0: 46 69 6e 64 4f 62 6a 65 63 74 73 28 68 53 65 73  FindObjects(hSes
3cd0: 73 69 6f 6e 2c 20 26 68 4f 62 6a 65 63 74 2c 20  sion, &hObject, 
3ce0: 31 2c 20 26 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  1, &ulObjectCoun
3cf0: 74 29 3b 0a 09 09 09 09 69 66 20 28 63 68 6b 5f  t);.....if (chk_
3d00: 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  rv != CKR_OK) {.
3d10: 09 09 09 09 09 70 72 69 6e 74 66 28 22 46 69 6e  .....printf("Fin
3d20: 64 4f 62 6a 65 63 74 73 28 29 20 66 61 69 6c 65  dObjects() faile
3d30: 64 2e 5c 6e 22 29 3b 0a 09 09 09 09 09 62 72 65  d.\n");......bre
3d40: 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
3d50: 66 20 28 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  f (ulObjectCount
3d60: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72   == 0) {......br
3d70: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
3d80: 69 66 20 28 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  if (ulObjectCoun
3d90: 74 20 21 3d 20 31 29 20 7b 0a 09 09 09 09 09 70  t != 1) {......p
3da0: 72 69 6e 74 66 28 22 46 69 6e 64 4f 62 6a 65 63  rintf("FindObjec
3db0: 74 73 28 29 20 72 65 74 75 72 6e 65 64 20 61 20  ts() returned a 
3dc0: 77 65 69 72 64 20 6e 75 6d 62 65 72 20 6f 66 20  weird number of 
3dd0: 6f 62 6a 65 63 74 73 2e 20 20 41 73 6b 65 64 20  objects.  Asked 
3de0: 66 6f 72 20 31 2c 20 67 6f 74 20 25 6c 75 2e 5c  for 1, got %lu.\
3df0: 6e 22 2c 20 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  n", ulObjectCoun
3e00: 74 29 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  t);......break;.
3e10: 09 09 09 09 7d 0a 0a 09 09 09 09 70 72 69 6e 74  ....}......print
3e20: 66 28 22 20 20 4f 62 6a 65 63 74 20 49 6e 66 6f  f("  Object Info
3e30: 20 28 6f 62 6a 65 63 74 20 25 6c 75 29 3a 5c 6e   (object %lu):\n
3e40: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
3e50: 67 29 20 68 4f 62 6a 65 63 74 29 3b 0a 0a 09 09  g) hObject);....
3e60: 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72  ..for (curr_attr
3e70: 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f 61  _idx = 0; curr_a
3e80: 74 74 72 5f 69 64 78 20 3c 20 28 73 69 7a 65 6f  ttr_idx < (sizeo
3e90: 66 28 74 65 6d 70 6c 61 74 65 29 20 2f 20 73 69  f(template) / si
3ea0: 7a 65 6f 66 28 74 65 6d 70 6c 61 74 65 5b 30 5d  zeof(template[0]
3eb0: 29 29 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64  )); curr_attr_id
3ec0: 78 2b 2b 29 20 7b 0a 09 09 09 09 09 63 75 72 72  x++) {......curr
3ed0: 5f 61 74 74 72 20 3d 20 26 74 65 6d 70 6c 61 74  _attr = &templat
3ee0: 65 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d  e[curr_attr_idx]
3ef0: 3b 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f  ;......if (curr_
3f00: 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a  attr->pValue) {.
3f10: 09 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f  ......free(curr_
3f20: 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09  attr->pValue);..
3f30: 09 09 09 09 7d 0a 0a 09 09 09 09 09 63 75 72 72  ....}.......curr
3f40: 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 3d 20  _attr->pValue = 
3f50: 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  NULL;.....}.....
3f60: 09 63 68 6b 5f 72 76 20 3d 20 43 5f 47 65 74 41  .chk_rv = C_GetA
3f70: 74 74 72 69 62 75 74 65 56 61 6c 75 65 28 68 53  ttributeValue(hS
3f80: 65 73 73 69 6f 6e 2c 20 68 4f 62 6a 65 63 74 2c  ession, hObject,
3f90: 20 26 74 65 6d 70 6c 61 74 65 5b 30 5d 2c 20 73   &template[0], s
3fa0: 69 7a 65 6f 66 28 74 65 6d 70 6c 61 74 65 29 20  izeof(template) 
3fb0: 2f 20 73 69 7a 65 6f 66 28 74 65 6d 70 6c 61 74  / sizeof(templat
3fc0: 65 5b 30 5d 29 29 3b 0a 09 09 09 09 69 66 20 28  e[0]));.....if (
3fd0: 63 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 41 54  chk_rv == CKR_AT
3fe0: 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56  TRIBUTE_TYPE_INV
3ff0: 41 4c 49 44 20 7c 7c 20 63 68 6b 5f 72 76 20 3d  ALID || chk_rv =
4000: 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f  = CKR_ATTRIBUTE_
4010: 53 45 4e 53 49 54 49 56 45 20 7c 7c 20 63 68 6b  SENSITIVE || chk
4020: 5f 72 76 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  _rv == CKR_BUFFE
4030: 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
4040: 09 09 09 09 63 68 6b 5f 72 76 20 3d 20 43 4b 52  ....chk_rv = CKR
4050: 5f 4f 4b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  _OK;.....}......
4060: 69 66 20 28 63 68 6b 5f 72 76 20 3d 3d 20 43 4b  if (chk_rv == CK
4070: 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 66 6f 72  R_OK) {......for
4080: 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20   (curr_attr_idx 
4090: 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69  = 0; curr_attr_i
40a0: 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 74 65 6d  dx < (sizeof(tem
40b0: 70 6c 61 74 65 29 20 2f 20 73 69 7a 65 6f 66 28  plate) / sizeof(
40c0: 74 65 6d 70 6c 61 74 65 5b 30 5d 29 29 3b 20 63  template[0])); c
40d0: 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20  urr_attr_idx++) 
40e0: 7b 0a 09 09 09 09 09 09 63 75 72 72 5f 61 74 74  {.......curr_att
40f0: 72 20 3d 20 26 74 65 6d 70 6c 61 74 65 5b 63 75  r = &template[cu
4100: 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09  rr_attr_idx];...
4110: 09 09 09 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f  .....if (((CK_LO
4120: 4e 47 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 75  NG) curr_attr->u
4130: 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28  lValueLen) != ((
4140: 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a  CK_LONG) -1)) {.
4150: 09 09 09 09 09 09 09 63 75 72 72 5f 61 74 74 72  .......curr_attr
4160: 2d 3e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f  ->pValue = mallo
4170: 63 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56  c(curr_attr->ulV
4180: 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 09 09  alueLen);.......
4190: 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 63  }......}.......c
41a0: 68 6b 5f 72 76 20 3d 20 43 5f 47 65 74 41 74 74  hk_rv = C_GetAtt
41b0: 72 69 62 75 74 65 56 61 6c 75 65 28 68 53 65 73  ributeValue(hSes
41c0: 73 69 6f 6e 2c 20 68 4f 62 6a 65 63 74 2c 20 26  sion, hObject, &
41d0: 74 65 6d 70 6c 61 74 65 5b 30 5d 2c 20 73 69 7a  template[0], siz
41e0: 65 6f 66 28 74 65 6d 70 6c 61 74 65 29 20 2f 20  eof(template) / 
41f0: 73 69 7a 65 6f 66 28 74 65 6d 70 6c 61 74 65 5b  sizeof(template[
4200: 30 5d 29 29 3b 0a 09 09 09 09 09 69 66 20 28 63  0]));......if (c
4210: 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 4f 4b 20  hk_rv == CKR_OK 
4220: 7c 7c 20 63 68 6b 5f 72 76 20 3d 3d 20 43 4b 52  || chk_rv == CKR
4230: 5f 41 54 54 52 49 42 55 54 45 5f 53 45 4e 53 49  _ATTRIBUTE_SENSI
4240: 54 49 56 45 20 7c 7c 20 63 68 6b 5f 72 76 20 3d  TIVE || chk_rv =
4250: 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f  = CKR_ATTRIBUTE_
4260: 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  TYPE_INVALID || 
4270: 63 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 42 55  chk_rv == CKR_BU
4280: 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
4290: 7b 0a 09 09 09 09 09 09 66 6f 72 20 28 63 75 72  {.......for (cur
42a0: 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20  r_attr_idx = 0; 
42b0: 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20  curr_attr_idx < 
42c0: 28 73 69 7a 65 6f 66 28 74 65 6d 70 6c 61 74 65  (sizeof(template
42d0: 29 20 2f 20 73 69 7a 65 6f 66 28 74 65 6d 70 6c  ) / sizeof(templ
42e0: 61 74 65 5b 30 5d 29 29 3b 20 63 75 72 72 5f 61  ate[0])); curr_a
42f0: 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
4300: 09 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  ....curr_attr = 
4310: 26 74 65 6d 70 6c 61 74 65 5b 63 75 72 72 5f 61  &template[curr_a
4320: 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 09  ttr_idx];.......
4330: 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
4340: 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  >pValue) {......
4350: 09 09 09 73 77 69 74 63 68 20 28 63 75 72 72 5f  ...switch (curr_
4360: 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09  attr->type) {...
4370: 09 09 09 09 09 09 09 63 61 73 65 20 43 4b 41 5f  .......case CKA_
4380: 4c 41 42 45 4c 3a 0a 09 09 09 09 09 09 09 09 09  LABEL:..........
4390: 09 70 72 69 6e 74 66 28 22 20 20 20 20 5b 25 6c  .printf("    [%l
43a0: 75 5d 20 25 32 30 73 3a 20 25 2e 2a 73 5c 6e 22  u] %20s: %.*s\n"
43b0: 2c 20 68 4f 62 6a 65 63 74 2c 20 70 6b 63 73 31  , hObject, pkcs1
43c0: 31 5f 61 74 74 72 69 62 75 74 65 5f 74 6f 5f 6e  1_attribute_to_n
43d0: 61 6d 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 74  ame(curr_attr->t
43e0: 79 70 65 29 2c 20 28 69 6e 74 29 20 63 75 72 72  ype), (int) curr
43f0: 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
4400: 6e 2c 20 28 63 68 61 72 20 2a 29 20 63 75 72 72  n, (char *) curr
4410: 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a  _attr->pValue);.
4420: 09 09 09 09 09 09 09 09 09 09 62 72 65 61 6b 3b  ..........break;
4430: 0a 09 09 09 09 09 09 09 09 09 63 61 73 65 20 43  ..........case C
4440: 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 09 09  KA_CLASS:.......
4450: 09 09 09 09 6f 62 6a 65 63 74 43 6c 61 73 73 20  ....objectClass 
4460: 3d 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  = *((CK_OBJECT_C
4470: 4c 41 53 53 20 2a 29 20 63 75 72 72 5f 61 74 74  LASS *) curr_att
4480: 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 0a 09 09 09  r->pValue);.....
4490: 09 09 09 09 09 09 09 69 66 20 28 6f 62 6a 65 63  .......if (objec
44a0: 74 43 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tClass == CKO_PR
44b0: 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
44c0: 09 09 09 09 09 09 09 09 2a 70 72 69 76 61 74 65  ........*private
44d0: 4b 65 79 4f 62 6a 65 63 74 73 20 3d 20 68 4f 62  KeyObjects = hOb
44e0: 6a 65 63 74 3b 0a 09 09 09 09 09 09 09 09 09 09  ject;...........
44f0: 09 70 72 69 76 61 74 65 4b 65 79 4f 62 6a 65 63  .privateKeyObjec
4500: 74 73 2b 2b 3b 0a 09 09 09 09 09 09 09 09 09 09  ts++;...........
4510: 7d 0a 09 09 09 09 09 09 09 09 09 63 61 73 65 20  }..........case 
4520: 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 09  CKA_TOKEN:......
4530: 09 09 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a  ....case CKA_ID:
4540: 0a 09 09 09 09 09 09 09 09 09 63 61 73 65 20 43  ..........case C
4550: 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
4560: 3a 0a 09 09 09 09 09 09 09 09 09 63 61 73 65 20  :..........case 
4570: 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09  CKA_PRIVATE:....
4580: 09 09 09 09 09 09 63 61 73 65 20 43 4b 41 5f 43  ......case CKA_C
4590: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
45a0: 0a 09 09 09 09 09 09 09 09 09 63 61 73 65 20 43  ..........case C
45b0: 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09  KA_KEY_TYPE:....
45c0: 09 09 09 09 09 09 63 61 73 65 20 43 4b 41 5f 53  ......case CKA_S
45d0: 49 47 4e 3a 0a 09 09 09 09 09 09 09 09 09 63 61  IGN:..........ca
45e0: 73 65 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a  se CKA_DECRYPT:.
45f0: 09 09 09 09 09 09 09 09 09 63 61 73 65 20 43 4b  .........case CK
4600: 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09 09  A_TRUSTED:......
4610: 09 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ....case CKA_CER
4620: 54 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09  T_MD5_HASH:.....
4630: 09 09 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45  .....case CKA_CE
4640: 52 54 5f 53 48 41 31 5f 48 41 53 48 3a 0a 0a 09  RT_SHA1_HASH:...
4650: 09 09 09 09 09 09 09 09 09 70 75 63 56 61 6c 75  .........pucValu
4660: 65 20 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 70  e = curr_attr->p
4670: 56 61 6c 75 65 3b 0a 0a 09 09 09 09 09 09 09 09  Value;..........
4680: 09 09 70 72 69 6e 74 66 28 22 20 20 20 20 5b 25  ..printf("    [%
4690: 6c 75 5d 20 25 32 30 73 3a 20 22 2c 20 68 4f 62  lu] %20s: ", hOb
46a0: 6a 65 63 74 2c 20 70 6b 63 73 31 31 5f 61 74 74  ject, pkcs11_att
46b0: 72 69 62 75 74 65 5f 74 6f 5f 6e 61 6d 65 28 63  ribute_to_name(c
46c0: 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 29  urr_attr->type))
46d0: 3b 0a 0a 09 09 09 09 09 09 09 09 09 09 66 6f 72  ;............for
46e0: 20 28 62 79 74 65 5f 69 64 78 20 3d 20 30 3b 20   (byte_idx = 0; 
46f0: 62 79 74 65 5f 69 64 78 20 3c 20 63 75 72 72 5f  byte_idx < curr_
4700: 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
4710: 3b 20 62 79 74 65 5f 69 64 78 2b 2b 29 20 7b 0a  ; byte_idx++) {.
4720: 09 09 09 09 09 09 09 09 09 09 09 70 72 69 6e 74  ...........print
4730: 66 28 22 25 30 32 78 20 22 2c 20 28 75 6e 73 69  f("%02x ", (unsi
4740: 67 6e 65 64 20 69 6e 74 29 20 70 75 63 56 61 6c  gned int) pucVal
4750: 75 65 5b 62 79 74 65 5f 69 64 78 5d 29 3b 0a 09  ue[byte_idx]);..
4760: 09 09 09 09 09 09 09 09 09 7d 0a 0a 09 09 09 09  .........}......
4770: 09 09 09 09 09 09 70 72 69 6e 74 66 28 22 3b 3b  ......printf(";;
4780: 20 25 70 2f 25 6c 75 5c 6e 22 2c 20 63 75 72 72   %p/%lu\n", curr
4790: 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63  _attr->pValue, c
47a0: 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
47b0: 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 09 09 09 09  eLen);..........
47c0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 09  ..break;........
47d0: 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45  ..case CKA_SUBJE
47e0: 43 54 3a 0a 09 09 09 09 09 09 09 09 09 63 61 73  CT:..........cas
47f0: 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09  e CKA_ISSUER:...
4800: 09 09 09 09 09 09 09 09 70 75 63 56 61 6c 75 65  ........pucValue
4810: 20 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56   = curr_attr->pV
4820: 61 6c 75 65 3b 0a 0a 09 09 09 09 09 09 09 09 09  alue;...........
4830: 09 70 72 69 6e 74 66 28 22 20 20 20 20 5b 25 6c  .printf("    [%l
4840: 75 5d 20 25 32 30 73 3a 20 22 2c 20 68 4f 62 6a  u] %20s: ", hObj
4850: 65 63 74 2c 20 70 6b 63 73 31 31 5f 61 74 74 72  ect, pkcs11_attr
4860: 69 62 75 74 65 5f 74 6f 5f 6e 61 6d 65 28 63 75  ibute_to_name(cu
4870: 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 29 3b  rr_attr->type));
4880: 0a 0a 09 09 09 09 09 09 09 09 09 09 66 6f 72 20  ............for 
4890: 28 62 79 74 65 5f 69 64 78 20 3d 20 30 3b 20 62  (byte_idx = 0; b
48a0: 79 74 65 5f 69 64 78 20 3c 20 63 75 72 72 5f 61  yte_idx < curr_a
48b0: 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b  ttr->ulValueLen;
48c0: 20 62 79 74 65 5f 69 64 78 2b 2b 29 20 7b 0a 09   byte_idx++) {..
48d0: 09 09 09 09 09 09 09 09 09 09 70 72 69 6e 74 66  ..........printf
48e0: 28 22 5c 5c 78 25 30 32 78 22 2c 20 28 75 6e 73  ("\\x%02x", (uns
48f0: 69 67 6e 65 64 20 69 6e 74 29 20 70 75 63 56 61  igned int) pucVa
4900: 6c 75 65 5b 62 79 74 65 5f 69 64 78 5d 29 3b 0a  lue[byte_idx]);.
4910: 09 09 09 09 09 09 09 09 09 09 7d 0a 0a 09 09 09  ..........}.....
4920: 09 09 09 09 09 09 09 70 72 69 6e 74 66 28 22 20  .......printf(" 
4930: 3b 3b 20 25 70 2f 25 6c 75 5c 6e 22 2c 20 63 75  ;; %p/%lu\n", cu
4940: 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
4950: 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61   curr_attr->ulVa
4960: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 09 09  lueLen);........
4970: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
4980: 09 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
4990: 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a  ST_CLIENT_AUTH:.
49a0: 09 09 09 09 09 09 09 09 09 63 61 73 65 20 43 4b  .........case CK
49b0: 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
49c0: 4e 49 4e 47 3a 0a 09 09 09 09 09 09 09 09 09 63  NING:..........c
49d0: 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52  ase CKA_TRUST_CR
49e0: 4c 5f 53 49 47 4e 3a 0a 09 09 09 09 09 09 09 09  L_SIGN:.........
49f0: 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
4a00: 44 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e  DATA_ENCIPHERMEN
4a10: 54 3a 0a 09 09 09 09 09 09 09 09 09 63 61 73 65  T:..........case
4a20: 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54   CKA_TRUST_DIGIT
4a30: 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09  AL_SIGNATURE:...
4a40: 09 09 09 09 09 09 09 63 61 73 65 20 43 4b 41 5f  .......case CKA_
4a50: 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54  TRUST_EMAIL_PROT
4a60: 45 43 54 49 4f 4e 3a 0a 09 09 09 09 09 09 09 09  ECTION:.........
4a70: 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
4a80: 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 3a 0a 09  KEY_AGREEMENT:..
4a90: 09 09 09 09 09 09 09 09 63 61 73 65 20 43 4b 41  ........case CKA
4aa0: 5f 54 52 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f  _TRUST_KEY_CERT_
4ab0: 53 49 47 4e 3a 0a 09 09 09 09 09 09 09 09 09 63  SIGN:..........c
4ac0: 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45  ase CKA_TRUST_KE
4ad0: 59 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a  Y_ENCIPHERMENT:.
4ae0: 09 09 09 09 09 09 09 09 09 63 61 73 65 20 43 4b  .........case CK
4af0: 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55  A_TRUST_NON_REPU
4b00: 44 49 41 54 49 4f 4e 3a 0a 09 09 09 09 09 09 09  DIATION:........
4b10: 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
4b20: 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09  _SERVER_AUTH:...
4b30: 09 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
4b40: 09 09 09 09 09 09 09 09 64 65 66 61 75 6c 74 3a  ........default:
4b50: 0a 09 09 09 09 09 09 09 09 09 09 70 72 69 6e 74  ...........print
4b60: 66 28 22 20 20 20 20 5b 25 6c 75 5d 20 25 32 30  f("    [%lu] %20
4b70: 73 3a 20 25 70 2f 25 6c 75 5c 6e 22 2c 20 68 4f  s: %p/%lu\n", hO
4b80: 62 6a 65 63 74 2c 20 70 6b 63 73 31 31 5f 61 74  bject, pkcs11_at
4b90: 74 72 69 62 75 74 65 5f 74 6f 5f 6e 61 6d 65 28  tribute_to_name(
4ba0: 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29  curr_attr->type)
4bb0: 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  , curr_attr->pVa
4bc0: 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e  lue, curr_attr->
4bd0: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
4be0: 09 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
4bf0: 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 09  .......}........
4c00: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09  } else {........
4c10: 09 70 72 69 6e 74 66 28 22 20 20 20 20 5b 25 6c  .printf("    [%l
4c20: 75 5d 20 25 32 30 73 3a 20 28 6e 6f 74 20 66 6f  u] %20s: (not fo
4c30: 75 6e 64 29 5c 6e 22 2c 20 68 4f 62 6a 65 63 74  und)\n", hObject
4c40: 2c 20 70 6b 63 73 31 31 5f 61 74 74 72 69 62 75  , pkcs11_attribu
4c50: 74 65 5f 74 6f 5f 6e 61 6d 65 28 63 75 72 72 5f  te_to_name(curr_
4c60: 61 74 74 72 2d 3e 74 79 70 65 29 29 3b 0a 09 09  attr->type));...
4c70: 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 09 66  .....}.........f
4c80: 72 65 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  ree(curr_attr->p
4c90: 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 09 09 63  Value);........c
4ca0: 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
4cb0: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 7d   = NULL;.......}
4cc0: 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
4cd0: 09 09 09 09 09 70 72 69 6e 74 66 28 22 47 65 74  .....printf("Get
4ce0: 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 28 29  AttributeValue()
4cf0: 2f 32 20 66 61 69 6c 65 64 2e 5c 6e 22 29 3b 0a  /2 failed.\n");.
4d00: 09 09 09 09 09 7d 0a 09 09 09 09 7d 20 65 6c 73  .....}.....} els
4d10: 65 20 7b 0a 09 09 09 09 09 70 72 69 6e 74 66 28  e {......printf(
4d20: 22 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  "GetAttributeVal
4d30: 75 65 28 68 4f 62 6a 65 63 74 3d 25 6c 75 29 2f  ue(hObject=%lu)/
4d40: 31 20 66 61 69 6c 65 64 20 28 72 76 20 3d 20 25  1 failed (rv = %
4d50: 6c 75 29 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e  lu).\n", (unsign
4d60: 65 64 20 6c 6f 6e 67 29 20 68 4f 62 6a 65 63 74  ed long) hObject
4d70: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
4d80: 29 20 63 68 6b 5f 72 76 29 3b 0a 09 09 09 09 7d  ) chk_rv);.....}
4d90: 0a 0a 09 09 09 7d 0a 0a 09 09 09 63 68 6b 5f 72  .....}.....chk_r
4da0: 76 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  v = C_FindObject
4db0: 73 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 29  sFinal(hSession)
4dc0: 3b 0a 09 09 09 69 66 20 28 63 68 6b 5f 72 76 20  ;....if (chk_rv 
4dd0: 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09  != CKR_OK) {....
4de0: 09 70 72 69 6e 74 66 28 22 46 69 6e 64 4f 62 6a  .printf("FindObj
4df0: 65 63 74 73 46 69 6e 61 6c 28 29 20 66 61 69 6c  ectsFinal() fail
4e00: 65 64 2e 5c 6e 22 29 3b 0a 09 09 09 7d 0a 09 09  ed.\n");....}...
4e10: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 70 72 69 6e  } else {....prin
4e20: 74 66 28 22 46 69 6e 64 4f 62 6a 65 63 74 73 49  tf("FindObjectsI
4e30: 6e 69 74 28 29 20 66 61 69 6c 65 64 2e 5c 6e 22  nit() failed.\n"
4e40: 29 3b 0a 09 09 7d 0a 0a 09 09 70 72 69 6e 74 66  );...}....printf
4e50: 28 22 2d 2d 2d 20 4f 70 65 72 61 74 69 6f 6e 73  ("--- Operations
4e60: 20 2d 2d 2d 5c 6e 22 29 3b 0a 0a 09 09 66 6f 72   ---\n");....for
4e70: 20 28 63 75 72 72 50 72 69 76 4b 65 79 20 3d 20   (currPrivKey = 
4e80: 70 72 69 76 61 74 65 4b 65 79 4f 62 6a 65 63 74  privateKeyObject
4e90: 73 5f 72 6f 6f 74 3b 20 2a 63 75 72 72 50 72 69  s_root; *currPri
4ea0: 76 4b 65 79 20 21 3d 20 43 4b 5f 49 4e 56 41 4c  vKey != CK_INVAL
4eb0: 49 44 5f 48 41 4e 44 4c 45 3b 20 63 75 72 72 50  ID_HANDLE; currP
4ec0: 72 69 76 4b 65 79 2b 2b 29 20 7b 0a 09 09 09 63  rivKey++) {....c
4ed0: 68 6b 5f 72 76 20 3d 20 43 5f 53 69 67 6e 49 6e  hk_rv = C_SignIn
4ee0: 69 74 28 68 53 65 73 73 69 6f 6e 2c 20 26 6d 65  it(hSession, &me
4ef0: 63 68 61 6e 69 73 6d 2c 20 2a 63 75 72 72 50 72  chanism, *currPr
4f00: 69 76 4b 65 79 29 3b 0a 09 09 09 69 66 20 28 63  ivKey);....if (c
4f10: 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 4f 4b 29  hk_rv == CKR_OK)
4f20: 20 7b 0a 09 09 09 09 73 69 67 6e 61 74 75 72 65   {.....signature
4f30: 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 73 69  _len = sizeof(si
4f40: 67 6e 61 74 75 72 65 29 3b 0a 0a 09 09 09 09 63  gnature);......c
4f50: 68 6b 5f 72 76 20 3d 20 43 5f 53 69 67 6e 28 68  hk_rv = C_Sign(h
4f60: 53 65 73 73 69 6f 6e 2c 20 28 43 4b 5f 42 59 54  Session, (CK_BYT
4f70: 45 5f 50 54 52 29 20 22 54 65 73 74 22 2c 20 73  E_PTR) "Test", s
4f80: 74 72 6c 65 6e 28 22 54 65 73 74 22 29 2c 20 28  trlen("Test"), (
4f90: 43 4b 5f 42 59 54 45 5f 50 54 52 29 20 26 73 69  CK_BYTE_PTR) &si
4fa0: 67 6e 61 74 75 72 65 2c 20 26 73 69 67 6e 61 74  gnature, &signat
4fb0: 75 72 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66  ure_len);.....if
4fc0: 20 28 63 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f   (chk_rv == CKR_
4fd0: 4f 4b 29 20 7b 0a 09 09 09 09 09 70 72 69 6e 74  OK) {......print
4fe0: 66 28 22 5b 25 30 34 6c 75 2f 25 30 32 6c 78 5d  f("[%04lu/%02lx]
4ff0: 20 53 69 67 6e 61 74 75 72 65 3a 20 22 2c 20 28   Signature: ", (
5000: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
5010: 63 75 72 72 50 72 69 76 4b 65 79 2c 20 28 75 6e  currPrivKey, (un
5020: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6d 65 63  signed long) mec
5030: 68 61 6e 69 73 6d 2e 6d 65 63 68 61 6e 69 73 6d  hanism.mechanism
5040: 29 3b 0a 0a 09 09 09 09 09 66 6f 72 20 28 62 79  );.......for (by
5050: 74 65 5f 69 64 78 20 3d 20 30 3b 20 62 79 74 65  te_idx = 0; byte
5060: 5f 69 64 78 20 3c 20 73 69 67 6e 61 74 75 72 65  _idx < signature
5070: 5f 6c 65 6e 3b 20 62 79 74 65 5f 69 64 78 2b 2b  _len; byte_idx++
5080: 29 20 7b 0a 09 09 09 09 09 09 70 72 69 6e 74 66  ) {.......printf
5090: 28 22 25 30 32 78 20 22 2c 20 28 75 6e 73 69 67  ("%02x ", (unsig
50a0: 6e 65 64 20 69 6e 74 29 20 73 69 67 6e 61 74 75  ned int) signatu
50b0: 72 65 5b 62 79 74 65 5f 69 64 78 5d 29 3b 0a 09  re[byte_idx]);..
50c0: 09 09 09 09 7d 0a 0a 09 09 09 09 09 70 72 69 6e  ....}.......prin
50d0: 74 66 28 22 5c 6e 22 29 3b 0a 09 09 09 09 7d 20  tf("\n");.....} 
50e0: 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 72 69 6e  else {......prin
50f0: 74 66 28 22 53 69 67 6e 28 29 20 66 61 69 6c 65  tf("Sign() faile
5100: 64 2e 5c 6e 22 29 3b 0a 09 09 09 09 7d 0a 09 09  d.\n");.....}...
5110: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 70 72  .} else {.....pr
5120: 69 6e 74 66 28 22 53 69 67 6e 49 6e 69 74 28 29  intf("SignInit()
5130: 20 66 61 69 6c 65 64 2e 5c 6e 22 29 3b 0a 09 09   failed.\n");...
5140: 09 7d 0a 09 09 7d 0a 0a 09 09 66 6f 72 20 28 63  .}...}....for (c
5150: 75 72 72 50 72 69 76 4b 65 79 20 3d 20 70 72 69  urrPrivKey = pri
5160: 76 61 74 65 4b 65 79 4f 62 6a 65 63 74 73 5f 72  vateKeyObjects_r
5170: 6f 6f 74 3b 20 2a 63 75 72 72 50 72 69 76 4b 65  oot; *currPrivKe
5180: 79 20 21 3d 20 43 4b 5f 49 4e 56 41 4c 49 44 5f  y != CK_INVALID_
5190: 48 41 4e 44 4c 45 3b 20 63 75 72 72 50 72 69 76  HANDLE; currPriv
51a0: 4b 65 79 2b 2b 29 20 7b 0a 09 09 09 63 68 6b 5f  Key++) {....chk_
51b0: 72 76 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e  rv = C_EncryptIn
51c0: 69 74 28 68 53 65 73 73 69 6f 6e 2c 20 26 6d 65  it(hSession, &me
51d0: 63 68 61 6e 69 73 6d 2c 20 2a 63 75 72 72 50 72  chanism, *currPr
51e0: 69 76 4b 65 79 29 3b 0a 09 09 09 69 66 20 28 63  ivKey);....if (c
51f0: 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 4f 4b 29  hk_rv == CKR_OK)
5200: 20 7b 0a 09 09 09 09 65 6e 63 72 79 70 74 65 64   {.....encrypted
5210: 5f 62 75 66 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  _buflen = sizeof
5220: 28 65 6e 63 72 79 70 74 65 64 5f 62 75 66 29 3b  (encrypted_buf);
5230: 0a 0a 09 09 09 09 63 68 6b 5f 72 76 20 3d 20 43  ......chk_rv = C
5240: 5f 45 6e 63 72 79 70 74 28 68 53 65 73 73 69 6f  _Encrypt(hSessio
5250: 6e 2c 20 28 43 4b 5f 42 59 54 45 5f 50 54 52 29  n, (CK_BYTE_PTR)
5260: 20 22 54 65 73 74 22 2c 20 73 74 72 6c 65 6e 28   "Test", strlen(
5270: 22 54 65 73 74 22 29 2c 20 65 6e 63 72 79 70 74  "Test"), encrypt
5280: 65 64 5f 62 75 66 2c 20 26 65 6e 63 72 79 70 74  ed_buf, &encrypt
5290: 65 64 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  ed_buflen);.....
52a0: 69 66 20 28 63 68 6b 5f 72 76 20 3d 3d 20 43 4b  if (chk_rv == CK
52b0: 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 70 72 69  R_OK) {......pri
52c0: 6e 74 66 28 22 5b 25 30 34 6c 75 2f 25 30 32 6c  ntf("[%04lu/%02l
52d0: 78 5d 20 45 6e 63 72 79 70 74 65 64 28 54 65 73  x] Encrypted(Tes
52e0: 74 29 3a 20 22 2c 20 28 75 6e 73 69 67 6e 65 64  t): ", (unsigned
52f0: 20 6c 6f 6e 67 29 20 2a 63 75 72 72 50 72 69 76   long) *currPriv
5300: 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  Key, (unsigned l
5310: 6f 6e 67 29 20 6d 65 63 68 61 6e 69 73 6d 2e 6d  ong) mechanism.m
5320: 65 63 68 61 6e 69 73 6d 29 3b 0a 0a 09 09 09 09  echanism);......
5330: 09 66 6f 72 20 28 62 79 74 65 5f 69 64 78 20 3d  .for (byte_idx =
5340: 20 30 3b 20 62 79 74 65 5f 69 64 78 20 3c 20 65   0; byte_idx < e
5350: 6e 63 72 79 70 74 65 64 5f 62 75 66 6c 65 6e 3b  ncrypted_buflen;
5360: 20 62 79 74 65 5f 69 64 78 2b 2b 29 20 7b 0a 09   byte_idx++) {..
5370: 09 09 09 09 09 70 72 69 6e 74 66 28 22 25 30 32  .....printf("%02
5380: 78 20 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  x ", (unsigned i
5390: 6e 74 29 20 65 6e 63 72 79 70 74 65 64 5f 62 75  nt) encrypted_bu
53a0: 66 5b 62 79 74 65 5f 69 64 78 5d 29 3b 0a 09 09  f[byte_idx]);...
53b0: 09 09 09 7d 0a 0a 09 09 09 09 09 70 72 69 6e 74  ...}.......print
53c0: 66 28 22 5c 6e 22 29 3b 0a 09 09 09 09 7d 20 65  f("\n");.....} e
53d0: 6c 73 65 20 7b 0a 09 09 09 09 09 70 72 69 6e 74  lse {......print
53e0: 66 28 22 45 6e 63 72 79 70 74 28 29 20 66 61 69  f("Encrypt() fai
53f0: 6c 65 64 2e 5c 6e 22 29 3b 0a 09 09 09 09 7d 0a  led.\n");.....}.
5400: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
5410: 70 72 69 6e 74 66 28 22 45 6e 63 72 79 70 74 49  printf("EncryptI
5420: 6e 69 74 28 29 20 66 61 69 6c 65 64 2e 5c 6e 22  nit() failed.\n"
5430: 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 66  );....}...}....f
5440: 6f 72 20 28 63 75 72 72 50 72 69 76 4b 65 79 20  or (currPrivKey 
5450: 3d 20 70 72 69 76 61 74 65 4b 65 79 4f 62 6a 65  = privateKeyObje
5460: 63 74 73 5f 72 6f 6f 74 3b 20 2a 63 75 72 72 50  cts_root; *currP
5470: 72 69 76 4b 65 79 20 21 3d 20 43 4b 5f 49 4e 56  rivKey != CK_INV
5480: 41 4c 49 44 5f 48 41 4e 44 4c 45 3b 20 63 75 72  ALID_HANDLE; cur
5490: 72 50 72 69 76 4b 65 79 2b 2b 29 20 7b 0a 09 09  rPrivKey++) {...
54a0: 09 63 68 6b 5f 72 76 20 3d 20 43 5f 44 65 63 72  .chk_rv = C_Decr
54b0: 79 70 74 49 6e 69 74 28 68 53 65 73 73 69 6f 6e  yptInit(hSession
54c0: 2c 20 26 6d 65 63 68 61 6e 69 73 6d 2c 20 2a 63  , &mechanism, *c
54d0: 75 72 72 50 72 69 76 4b 65 79 29 3b 0a 09 09 09  urrPrivKey);....
54e0: 69 66 20 28 63 68 6b 5f 72 76 20 3d 3d 20 43 4b  if (chk_rv == CK
54f0: 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 64 65 63 72  R_OK) {.....decr
5500: 79 70 74 65 64 5f 62 75 66 6c 65 6e 20 3d 20 73  ypted_buflen = s
5510: 69 7a 65 6f 66 28 64 65 63 72 79 70 74 65 64 5f  izeof(decrypted_
5520: 62 75 66 29 3b 0a 0a 09 09 09 09 63 68 6b 5f 72  buf);......chk_r
5530: 76 20 3d 20 43 5f 44 65 63 72 79 70 74 28 68 53  v = C_Decrypt(hS
5540: 65 73 73 69 6f 6e 2c 20 28 43 4b 5f 42 59 54 45  ession, (CK_BYTE
5550: 5f 50 54 52 29 20 22 5c 78 34 63 5c 78 33 36 5c  _PTR) "\x4c\x36\
5560: 78 30 66 5c 78 38 36 5c 78 32 64 5c 78 62 37 5c  x0f\x86\x2d\xb7\
5570: 78 62 32 5c 78 34 36 5c 78 39 32 5c 78 31 31 5c  xb2\x46\x92\x11\
5580: 78 37 65 5c 78 35 66 5c 78 64 31 5c 78 65 62 5c  x7e\x5f\xd1\xeb\
5590: 78 32 63 5c 78 62 30 5c 78 64 62 5c 78 33 34 5c  x2c\xb0\xdb\x34\
55a0: 78 36 30 5c 78 62 38 5c 78 30 63 5c 78 66 38 5c  x60\xb8\x0c\xf8\
55b0: 78 32 37 5c 78 62 35 5c 78 66 62 5c 78 63 65 5c  x27\xb5\xfb\xce\
55c0: 78 64 31 5c 78 66 34 5c 78 35 38 5c 78 61 33 5c  xd1\xf4\x58\xa3\
55d0: 78 32 30 5c 78 35 32 5c 78 39 64 5c 78 39 37 5c  x20\x52\x9d\x97\
55e0: 78 30 38 5c 78 64 38 5c 78 32 62 5c 78 35 65 5c  x08\xd8\x2b\x5e\
55f0: 78 62 32 5c 78 33 37 5c 78 34 36 5c 78 37 32 5c  xb2\x37\x46\x72\
5600: 78 34 35 5c 78 37 63 5c 78 36 36 5c 78 32 33 5c  x45\x7c\x66\x23\
5610: 78 35 33 5c 78 62 35 5c 78 61 35 5c 78 31 36 5c  x53\xb5\xa5\x16\
5620: 78 36 31 5c 78 39 36 5c 78 62 63 5c 78 35 63 5c  x61\x96\xbc\x5c\
5630: 78 38 64 5c 78 38 35 5c 78 31 38 5c 78 32 34 5c  x8d\x85\x18\x24\
5640: 78 63 66 5c 78 37 34 5c 78 37 66 5c 78 63 32 5c  xcf\x74\x7f\xc2\
5650: 78 32 33 5c 78 31 35 5c 78 64 36 5c 78 34 32 5c  x23\x15\xd6\x42\
5660: 78 37 32 5c 78 61 35 5c 78 32 62 5c 78 32 39 5c  x72\xa5\x2b\x29\
5670: 78 32 39 5c 78 31 64 5c 78 61 36 5c 78 65 61 5c  x29\x1d\xa6\xea\
5680: 78 32 62 5c 78 63 62 5c 78 35 37 5c 78 35 39 5c  x2b\xcb\x57\x59\
5690: 78 62 33 5c 78 35 66 5c 78 65 32 5c 78 66 38 5c  xb3\x5f\xe2\xf8\
56a0: 78 33 30 5c 78 31 32 5c 78 32 66 5c 78 31 62 5c  x30\x12\x2f\x1b\
56b0: 78 66 61 5c 78 62 64 5c 78 61 39 5c 78 31 39 5c  xfa\xbd\xa9\x19\
56c0: 78 65 66 5c 78 35 63 5c 78 62 62 5c 78 34 38 5c  xef\x5c\xbb\x48\
56d0: 78 64 63 5c 78 32 38 5c 78 34 32 5c 78 64 64 5c  xdc\x28\x42\xdd\
56e0: 78 39 30 5c 78 62 65 5c 78 36 33 5c 78 65 62 5c  x90\xbe\x63\xeb\
56f0: 78 35 39 5c 78 30 63 5c 78 61 66 5c 78 35 39 5c  x59\x0c\xaf\x59\
5700: 78 63 62 5c 78 65 34 5c 78 36 61 5c 78 66 32 5c  xcb\xe4\x6a\xf2\
5710: 78 35 36 5c 78 32 34 5c 78 34 31 5c 78 63 32 5c  x56\x24\x41\xc2\
5720: 78 37 37 5c 78 37 62 5c 78 63 39 5c 78 66 38 5c  x77\x7b\xc9\xf8\
5730: 78 30 32 5c 78 30 66 5c 78 36 37 5c 78 33 64 5c  x02\x0f\x67\x3d\
5740: 78 32 61 5c 78 39 38 5c 78 39 31 5c 78 31 34 5c  x2a\x98\x91\x14\
5750: 78 61 32 5c 78 35 37 22 2c 20 31 32 38 2c 20 64  xa2\x57", 128, d
5760: 65 63 72 79 70 74 65 64 5f 62 75 66 2c 20 26 64  ecrypted_buf, &d
5770: 65 63 72 79 70 74 65 64 5f 62 75 66 6c 65 6e 29  ecrypted_buflen)
5780: 3b 0a 09 09 09 09 69 66 20 28 63 68 6b 5f 72 76  ;.....if (chk_rv
5790: 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   == CKR_OK) {...
57a0: 09 09 09 70 72 69 6e 74 66 28 22 5b 25 30 34 6c  ...printf("[%04l
57b0: 75 2f 25 30 32 6c 78 5d 20 44 65 63 72 79 70 74  u/%02lx] Decrypt
57c0: 65 64 28 49 74 20 77 6f 72 6b 73 21 29 3a 20 22  ed(It works!): "
57d0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
57e0: 29 20 2a 63 75 72 72 50 72 69 76 4b 65 79 2c 20  ) *currPrivKey, 
57f0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
5800: 6d 65 63 68 61 6e 69 73 6d 2e 6d 65 63 68 61 6e  mechanism.mechan
5810: 69 73 6d 29 3b 0a 0a 09 09 09 09 09 66 6f 72 20  ism);.......for 
5820: 28 62 79 74 65 5f 69 64 78 20 3d 20 30 3b 20 62  (byte_idx = 0; b
5830: 79 74 65 5f 69 64 78 20 3c 20 64 65 63 72 79 70  yte_idx < decryp
5840: 74 65 64 5f 62 75 66 6c 65 6e 3b 20 62 79 74 65  ted_buflen; byte
5850: 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 09 09  _idx++) {.......
5860: 70 72 69 6e 74 66 28 22 25 30 32 78 20 22 2c 20  printf("%02x ", 
5870: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 64  (unsigned int) d
5880: 65 63 72 79 70 74 65 64 5f 62 75 66 5b 62 79 74  ecrypted_buf[byt
5890: 65 5f 69 64 78 5d 29 3b 0a 09 09 09 09 09 7d 0a  e_idx]);......}.
58a0: 0a 09 09 09 09 09 70 72 69 6e 74 66 28 22 5c 6e  ......printf("\n
58b0: 22 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  ");.....} else {
58c0: 0a 09 09 09 09 09 70 72 69 6e 74 66 28 22 44 65  ......printf("De
58d0: 63 72 79 70 74 28 29 20 66 61 69 6c 65 64 2e 5c  crypt() failed.\
58e0: 6e 22 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  n");.....}....} 
58f0: 65 6c 73 65 20 7b 0a 09 09 09 09 70 72 69 6e 74  else {.....print
5900: 66 28 22 44 65 63 72 79 70 74 49 6e 69 74 28 29  f("DecryptInit()
5910: 20 66 61 69 6c 65 64 2e 5c 6e 22 29 3b 0a 09 09   failed.\n");...
5920: 09 7d 0a 09 09 7d 0a 0a 09 09 63 68 6b 5f 72 76  .}...}....chk_rv
5930: 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f   = C_CloseSessio
5940: 6e 28 68 53 65 73 73 69 6f 6e 29 3b 0a 09 09 69  n(hSession);...i
5950: 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52  f (chk_rv != CKR
5960: 5f 4f 4b 29 20 7b 0a 09 09 09 70 72 69 6e 74 66  _OK) {....printf
5970: 28 22 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 66  ("CloseSession f
5980: 61 69 6c 65 64 2e 5c 6e 22 29 3b 0a 09 09 7d 0a  ailed.\n");...}.
5990: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70 72 69 6e  .} else {...prin
59a0: 74 66 28 22 4f 70 65 6e 53 65 73 73 69 6f 6e 20  tf("OpenSession 
59b0: 66 61 69 6c 65 64 2e 5c 6e 22 29 3b 0a 09 7d 0a  failed.\n");..}.
59c0: 0a 09 43 5f 46 69 6e 61 6c 69 7a 65 28 4e 55 4c  ..C_Finalize(NUL
59d0: 4c 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 73 29  L);...if (slots)
59e0: 20 7b 0a 09 09 66 72 65 65 28 73 6c 6f 74 73 29   {...free(slots)
59f0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 72 69 76 61  ;..}...if (priva
5a00: 74 65 4b 65 79 4f 62 6a 65 63 74 73 5f 72 6f 6f  teKeyObjects_roo
5a10: 74 29 20 7b 0a 09 09 66 72 65 65 28 70 72 69 76  t) {...free(priv
5a20: 61 74 65 4b 65 79 4f 62 6a 65 63 74 73 5f 72 6f  ateKeyObjects_ro
5a30: 6f 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ot);..}...return
5a40: 28 30 29 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e  (0);.}..int main
5a50: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
5a60: 2a 2a 61 72 67 76 29 20 7b 0a 09 69 6e 74 20 72  **argv) {..int r
5a70: 65 74 76 61 6c 20 3d 20 30 2c 20 63 6b 5f 72 65  etval = 0, ck_re
5a80: 74 76 61 6c 3b 0a 0a 09 70 72 69 6e 74 66 28 22  tval;...printf("
5a90: 54 65 73 74 69 6e 67 20 6c 69 62 63 61 63 6b 65  Testing libcacke
5aa0: 79 2e 2e 2e 5c 6e 22 29 3b 0a 0a 09 63 6b 5f 72  y...\n");...ck_r
5ab0: 65 74 76 61 6c 20 3d 20 6d 61 69 6e 5f 70 6b 63  etval = main_pkc
5ac0: 73 31 31 28 29 3b 0a 0a 09 69 66 20 28 63 6b 5f  s11();...if (ck_
5ad0: 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
5ae0: 09 72 65 74 76 61 6c 20 3d 20 63 6b 5f 72 65 74  .retval = ck_ret
5af0: 76 61 6c 3b 0a 09 7d 0a 0a 09 70 72 69 6e 74 66  val;..}...printf
5b00: 28 22 54 65 73 74 69 6e 67 20 6c 69 62 63 61 63  ("Testing libcac
5b10: 6b 65 79 2e 2e 2e 20 44 4f 4e 45 2e 20 53 74 61  key... DONE. Sta
5b20: 74 75 73 20 3d 20 25 69 5c 6e 22 2c 20 63 6b 5f  tus = %i\n", ck_
5b30: 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
5b40: 6e 28 72 65 74 76 61 6c 29 3b 0a 0a 09 2f 2a 20  n(retval);.../* 
5b50: 55 4e 52 45 41 43 48 45 44 3a 20 54 68 69 73 20  UNREACHED: This 
5b60: 69 73 20 6a 75 73 74 20 74 6f 20 73 75 70 72 65  is just to supre
5b70: 73 73 20 61 20 77 61 72 6e 69 6e 67 20 61 62 6f  ss a warning abo
5b80: 75 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  ut arguments to 
5b90: 6d 61 69 6e 20 77 65 20 64 6f 20 6e 6f 74 20 75  main we do not u
5ba0: 73 65 2e 20 2a 2f 0a 09 61 72 67 63 20 3d 20 61  se. */..argc = a
5bb0: 72 67 63 3b 0a 09 61 72 67 76 20 3d 20 61 72 67  rgc;..argv = arg
5bc0: 76 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 43 41  v;.}.#else /* CA
5bd0: 43 4b 45 59 5f 54 45 53 54 5f 41 46 4c 20 2a 2f  CKEY_TEST_AFL */
5be0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
5bf0: 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  tat.h>.#include 
5c00: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
5c10: 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e  nclude <fcntl.h>
5c20: 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  ..static unsigne
5c30: 64 20 63 68 61 72 20 2a 69 6e 70 75 74 44 61 74  d char *inputDat
5c40: 61 3b 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  a;.static unsign
5c50: 65 64 20 6c 6f 6e 67 20 69 6e 70 75 74 44 61 74  ed long inputDat
5c60: 61 4c 65 6e 3b 0a 0a 2f 2a 20 49 6e 63 6c 75 64  aLen;../* Includ
5c70: 65 20 74 68 65 20 43 41 43 4b 65 79 20 73 6f 75  e the CACKey sou
5c80: 72 63 65 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  rce */.#include 
5c90: 22 63 61 63 6b 65 79 2e 63 22 0a 0a 23 75 6e 64  "cackey.c"..#und
5ca0: 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ef CACKEY_DEBUG_
5cb0: 50 52 49 4e 54 46 0a 23 64 65 66 69 6e 65 20 43  PRINTF.#define C
5cc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5cd0: 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 75  TF(x...) /**/.#u
5ce0: 6e 64 65 66 20 6d 61 6c 6c 6f 63 0a 23 75 6e 64  ndef malloc.#und
5cf0: 65 66 20 72 65 61 6c 6c 6f 63 0a 23 75 6e 64 65  ef realloc.#unde
5d00: 66 20 73 74 72 64 75 70 0a 0a 2f 2a 20 46 61 6b  f strdup../* Fak
5d10: 65 20 61 20 73 6d 61 72 74 63 61 72 64 20 2a 2f  e a smartcard */
5d20: 0a 63 6f 6e 73 74 20 53 43 41 52 44 5f 49 4f 5f  .const SCARD_IO_
5d30: 52 45 51 55 45 53 54 20 67 5f 72 67 53 43 61 72  REQUEST g_rgSCar
5d40: 64 54 30 50 63 69 2c 20 67 5f 72 67 53 43 61 72  dT0Pci, g_rgSCar
5d50: 64 54 31 50 63 69 3b 0a 73 74 61 74 69 63 20 69  dT1Pci;.static i
5d60: 6e 74 20 73 63 61 72 64 5f 69 6e 54 72 61 6e 73  nt scard_inTrans
5d70: 61 63 74 69 6f 6e 20 3d 20 30 3b 0a 73 74 61 74  action = 0;.stat
5d80: 69 63 20 4c 4f 4e 47 20 73 63 61 72 64 5f 70 72  ic LONG scard_pr
5d90: 6f 74 6f 63 6f 6c 3b 0a 0a 0a 50 43 53 43 5f 41  otocol;...PCSC_A
5da0: 50 49 20 4c 4f 4e 47 20 53 43 61 72 64 45 73 74  PI LONG SCardEst
5db0: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 44 57  ablishContext(DW
5dc0: 4f 52 44 20 64 77 53 63 6f 70 65 2c 20 4c 50 43  ORD dwScope, LPC
5dd0: 56 4f 49 44 20 70 76 52 65 73 65 72 76 65 64 31  VOID pvReserved1
5de0: 2c 20 4c 50 43 56 4f 49 44 20 70 76 52 65 73 65  , LPCVOID pvRese
5df0: 72 76 65 64 32 2c 20 4c 50 53 43 41 52 44 43 4f  rved2, LPSCARDCO
5e00: 4e 54 45 58 54 20 70 68 43 6f 6e 74 65 78 74 29  NTEXT phContext)
5e10: 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
5e20: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 22  _PRINTF("Called"
5e30: 29 3b 0a 0a 09 2a 70 68 43 6f 6e 74 65 78 74 20  );...*phContext 
5e40: 3d 20 34 32 3b 0a 0a 09 72 65 74 75 72 6e 28 53  = 42;...return(S
5e50: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 3b  CARD_S_SUCCESS);
5e60: 0a 7d 0a 0a 50 43 53 43 5f 41 50 49 20 4c 4f 4e  .}..PCSC_API LON
5e70: 47 20 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f  G SCardIsValidCo
5e80: 6e 74 65 78 74 28 53 43 41 52 44 43 4f 4e 54 45  ntext(SCARDCONTE
5e90: 58 54 20 68 43 6f 6e 74 65 78 74 29 20 7b 0a 09  XT hContext) {..
5ea0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5eb0: 4e 54 46 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  NTF("Called");..
5ec0: 09 69 66 20 28 68 43 6f 6e 74 65 78 74 20 21 3d  .if (hContext !=
5ed0: 20 34 32 29 20 7b 0a 09 09 72 65 74 75 72 6e 28   42) {...return(
5ee0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
5ef0: 48 41 4e 44 4c 45 29 3b 0a 09 7d 0a 0a 09 72 65  HANDLE);..}...re
5f00: 74 75 72 6e 28 53 43 41 52 44 5f 53 5f 53 55 43  turn(SCARD_S_SUC
5f10: 43 45 53 53 29 3b 0a 7d 0a 0a 50 43 53 43 5f 41  CESS);.}..PCSC_A
5f20: 50 49 20 4c 4f 4e 47 20 53 43 61 72 64 4c 69 73  PI LONG SCardLis
5f30: 74 52 65 61 64 65 72 73 28 53 43 41 52 44 43 4f  tReaders(SCARDCO
5f40: 4e 54 45 58 54 20 68 43 6f 6e 74 65 78 74 2c 20  NTEXT hContext, 
5f50: 4c 50 43 53 54 52 20 6d 73 7a 47 72 6f 75 70 73  LPCSTR mszGroups
5f60: 2c 20 4c 50 53 54 52 20 6d 73 7a 52 65 61 64 65  , LPSTR mszReade
5f70: 72 73 2c 20 4c 50 44 57 4f 52 44 20 70 63 63 68  rs, LPDWORD pcch
5f80: 52 65 61 64 65 72 73 29 20 7b 0a 09 73 74 61 74  Readers) {..stat
5f90: 69 63 20 63 68 61 72 20 2a 72 65 61 64 65 72 73  ic char *readers
5fa0: 20 3d 20 22 52 45 41 44 45 52 30 22 3b 0a 0a 09   = "READER0";...
5fb0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5fc0: 4e 54 46 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  NTF("Called");..
5fd0: 09 69 66 20 28 68 43 6f 6e 74 65 78 74 20 21 3d  .if (hContext !=
5fe0: 20 34 32 29 20 7b 0a 09 09 72 65 74 75 72 6e 28   42) {...return(
5ff0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
6000: 48 41 4e 44 4c 45 29 3b 0a 09 7d 0a 0a 09 2a 70  HANDLE);..}...*p
6010: 63 63 68 52 65 61 64 65 72 73 20 3d 20 73 74 72  cchReaders = str
6020: 6c 65 6e 28 72 65 61 64 65 72 73 29 20 2b 20 31  len(readers) + 1
6030: 3b 0a 0a 09 69 66 20 28 6d 73 7a 52 65 61 64 65  ;...if (mszReade
6040: 72 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rs == NULL) {...
6050: 72 65 74 75 72 6e 28 53 43 41 52 44 5f 53 5f 53  return(SCARD_S_S
6060: 55 43 43 45 53 53 29 3b 0a 09 7d 0a 0a 09 6d 65  UCCESS);..}...me
6070: 6d 63 70 79 28 6d 73 7a 52 65 61 64 65 72 73 2c  mcpy(mszReaders,
6080: 20 72 65 61 64 65 72 73 2c 20 2a 70 63 63 68 52   readers, *pcchR
6090: 65 61 64 65 72 73 29 3b 0a 0a 09 72 65 74 75 72  eaders);...retur
60a0: 6e 28 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  n(SCARD_S_SUCCES
60b0: 53 29 3b 0a 7d 0a 0a 50 43 53 43 5f 41 50 49 20  S);.}..PCSC_API 
60c0: 4c 4f 4e 47 20 53 43 61 72 64 42 65 67 69 6e 54  LONG SCardBeginT
60d0: 72 61 6e 73 61 63 74 69 6f 6e 28 53 43 41 52 44  ransaction(SCARD
60e0: 48 41 4e 44 4c 45 20 68 43 61 72 64 29 20 7b 0a  HANDLE hCard) {.
60f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6100: 49 4e 54 46 28 22 43 61 6c 6c 65 64 22 29 3b 0a  INTF("Called");.
6110: 0a 09 69 66 20 28 68 43 61 72 64 20 21 3d 20 39  ..if (hCard != 9
6120: 39 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 53 43  9) {...return(SC
6130: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41  ARD_E_INVALID_HA
6140: 4e 44 4c 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NDLE);..}...if (
6150: 73 63 61 72 64 5f 69 6e 54 72 61 6e 73 61 63 74  scard_inTransact
6160: 69 6f 6e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ion) {...return(
6170: 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f  SCARD_E_SHARING_
6180: 56 49 4f 4c 41 54 49 4f 4e 29 3b 0a 09 7d 0a 0a  VIOLATION);..}..
6190: 09 73 63 61 72 64 5f 69 6e 54 72 61 6e 73 61 63  .scard_inTransac
61a0: 74 69 6f 6e 20 3d 20 31 3b 0a 0a 09 72 65 74 75  tion = 1;...retu
61b0: 72 6e 28 53 43 41 52 44 5f 53 5f 53 55 43 43 45  rn(SCARD_S_SUCCE
61c0: 53 53 29 3b 0a 7d 0a 50 43 53 43 5f 41 50 49 20  SS);.}.PCSC_API 
61d0: 4c 4f 4e 47 20 53 43 61 72 64 45 6e 64 54 72 61  LONG SCardEndTra
61e0: 6e 73 61 63 74 69 6f 6e 28 53 43 41 52 44 48 41  nsaction(SCARDHA
61f0: 4e 44 4c 45 20 68 43 61 72 64 2c 20 44 57 4f 52  NDLE hCard, DWOR
6200: 44 20 64 77 44 69 73 70 6f 73 69 74 69 6f 6e 29  D dwDisposition)
6210: 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
6220: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 22  _PRINTF("Called"
6230: 29 3b 0a 0a 09 69 66 20 28 68 43 61 72 64 20 21  );...if (hCard !
6240: 3d 20 39 39 29 20 7b 0a 09 09 72 65 74 75 72 6e  = 99) {...return
6250: 28 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  (SCARD_E_INVALID
6260: 5f 48 41 4e 44 4c 45 29 3b 0a 09 7d 0a 0a 09 73  _HANDLE);..}...s
6270: 63 61 72 64 5f 69 6e 54 72 61 6e 73 61 63 74 69  card_inTransacti
6280: 6f 6e 20 3d 20 30 3b 0a 0a 09 72 65 74 75 72 6e  on = 0;...return
6290: 28 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53  (SCARD_S_SUCCESS
62a0: 29 3b 0a 7d 0a 0a 50 43 53 43 5f 41 50 49 20 4c  );.}..PCSC_API L
62b0: 4f 4e 47 20 53 43 61 72 64 53 74 61 74 75 73 28  ONG SCardStatus(
62c0: 53 43 41 52 44 48 41 4e 44 4c 45 20 68 43 61 72  SCARDHANDLE hCar
62d0: 64 2c 20 4c 50 53 54 52 20 6d 73 7a 52 65 61 64  d, LPSTR mszRead
62e0: 65 72 4e 61 6d 65 2c 20 4c 50 44 57 4f 52 44 20  erName, LPDWORD 
62f0: 70 63 63 68 52 65 61 64 65 72 4c 65 6e 2c 20 4c  pcchReaderLen, L
6300: 50 44 57 4f 52 44 20 70 64 77 53 74 61 74 65 2c  PDWORD pdwState,
6310: 20 4c 50 44 57 4f 52 44 20 70 64 77 50 72 6f 74   LPDWORD pdwProt
6320: 6f 63 6f 6c 2c 20 4c 50 42 59 54 45 20 70 62 41  ocol, LPBYTE pbA
6330: 74 72 2c 20 4c 50 44 57 4f 52 44 20 70 63 62 41  tr, LPDWORD pcbA
6340: 74 72 4c 65 6e 29 20 7b 0a 09 4c 4f 4e 47 20 73  trLen) {..LONG s
6350: 63 61 72 64 6c 69 73 74 72 65 61 64 65 72 73 5f  cardlistreaders_
6360: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
6370: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6380: 65 64 22 29 3b 0a 0a 09 69 66 20 28 68 43 61 72  ed");...if (hCar
6390: 64 20 21 3d 20 39 39 29 20 7b 0a 09 09 72 65 74  d != 99) {...ret
63a0: 75 72 6e 28 53 43 41 52 44 5f 45 5f 49 4e 56 41  urn(SCARD_E_INVA
63b0: 4c 49 44 5f 48 41 4e 44 4c 45 29 3b 0a 09 7d 0a  LID_HANDLE);..}.
63c0: 0a 09 2a 70 64 77 53 74 61 74 65 20 3d 20 30 3b  ..*pdwState = 0;
63d0: 0a 09 73 63 61 72 64 6c 69 73 74 72 65 61 64 65  ..scardlistreade
63e0: 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69  rs_ret = SCardLi
63f0: 73 74 52 65 61 64 65 72 73 28 34 32 2c 20 4e 55  stReaders(42, NU
6400: 4c 4c 2c 20 6d 73 7a 52 65 61 64 65 72 4e 61 6d  LL, mszReaderNam
6410: 65 2c 20 70 63 63 68 52 65 61 64 65 72 4c 65 6e  e, pcchReaderLen
6420: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 6c 69 73  );..if (scardlis
6430: 74 72 65 61 64 65 72 73 5f 72 65 74 20 21 3d 20  treaders_ret != 
6440: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
6450: 20 7b 0a 09 09 72 65 74 75 72 6e 28 73 63 61 72   {...return(scar
6460: 64 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  dlistreaders_ret
6470: 29 3b 0a 09 7d 0a 0a 09 2a 70 64 77 50 72 6f 74  );..}...*pdwProt
6480: 6f 63 6f 6c 20 3d 20 73 63 61 72 64 5f 70 72 6f  ocol = scard_pro
6490: 74 6f 63 6f 6c 3b 0a 0a 09 72 65 74 75 72 6e 28  tocol;...return(
64a0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
64b0: 3b 0a 7d 0a 0a 50 43 53 43 5f 41 50 49 20 4c 4f  ;.}..PCSC_API LO
64c0: 4e 47 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  NG SCardConnect(
64d0: 53 43 41 52 44 43 4f 4e 54 45 58 54 20 68 43 6f  SCARDCONTEXT hCo
64e0: 6e 74 65 78 74 2c 20 4c 50 43 53 54 52 20 73 7a  ntext, LPCSTR sz
64f0: 52 65 61 64 65 72 2c 20 44 57 4f 52 44 20 64 77  Reader, DWORD dw
6500: 53 68 61 72 65 4d 6f 64 65 2c 20 44 57 4f 52 44  ShareMode, DWORD
6510: 20 64 77 50 72 65 66 65 72 72 65 64 50 72 6f 74   dwPreferredProt
6520: 6f 63 6f 6c 73 2c 20 4c 50 53 43 41 52 44 48 41  ocols, LPSCARDHA
6530: 4e 44 4c 45 20 70 68 43 61 72 64 2c 20 4c 50 44  NDLE phCard, LPD
6540: 57 4f 52 44 20 70 64 77 41 63 74 69 76 65 50 72  WORD pdwActivePr
6550: 6f 74 6f 63 6f 6c 29 20 7b 0a 09 43 41 43 4b 45  otocol) {..CACKE
6560: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6570: 43 61 6c 6c 65 64 22 29 3b 0a 0a 09 69 66 20 28  Called");...if (
6580: 68 43 6f 6e 74 65 78 74 20 21 3d 20 34 32 29 20  hContext != 42) 
6590: 7b 0a 09 09 72 65 74 75 72 6e 28 53 43 41 52 44  {...return(SCARD
65a0: 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  _E_INVALID_HANDL
65b0: 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 28 64 77  E);..}...if ((dw
65c0: 50 72 65 66 65 72 72 65 64 50 72 6f 74 6f 63 6f  PreferredProtoco
65d0: 6c 73 20 26 20 53 43 41 52 44 5f 50 52 4f 54 4f  ls & SCARD_PROTO
65e0: 43 4f 4c 5f 54 30 29 20 3d 3d 20 53 43 41 52 44  COL_T0) == SCARD
65f0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 29 20 7b 0a  _PROTOCOL_T0) {.
6600: 09 09 2a 70 64 77 41 63 74 69 76 65 50 72 6f 74  ..*pdwActiveProt
6610: 6f 63 6f 6c 20 3d 20 53 43 41 52 44 5f 50 52 4f  ocol = SCARD_PRO
6620: 54 4f 43 4f 4c 5f 54 30 3b 0a 09 7d 20 65 6c 73  TOCOL_T0;..} els
6630: 65 20 7b 0a 09 09 2a 70 64 77 41 63 74 69 76 65  e {...*pdwActive
6640: 50 72 6f 74 6f 63 6f 6c 20 3d 20 53 43 41 52 44  Protocol = SCARD
6650: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3b 0a 09 7d  _PROTOCOL_T1;..}
6660: 0a 0a 09 73 63 61 72 64 5f 70 72 6f 74 6f 63 6f  ...scard_protoco
6670: 6c 20 3d 20 2a 70 64 77 41 63 74 69 76 65 50 72  l = *pdwActivePr
6680: 6f 74 6f 63 6f 6c 3b 0a 0a 09 2a 70 68 43 61 72  otocol;...*phCar
6690: 64 20 3d 20 39 39 3b 0a 0a 09 72 65 74 75 72 6e  d = 99;...return
66a0: 28 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53  (SCARD_S_SUCCESS
66b0: 29 3b 0a 7d 0a 0a 50 43 53 43 5f 41 50 49 20 4c  );.}..PCSC_API L
66c0: 4f 4e 47 20 53 43 61 72 64 44 69 73 63 6f 6e 6e  ONG SCardDisconn
66d0: 65 63 74 28 53 43 41 52 44 48 41 4e 44 4c 45 20  ect(SCARDHANDLE 
66e0: 68 43 61 72 64 2c 20 44 57 4f 52 44 20 64 77 44  hCard, DWORD dwD
66f0: 69 73 70 6f 73 69 74 69 6f 6e 29 20 7b 0a 09 43  isposition) {..C
6700: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6710: 54 46 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 09  TF("Called");...
6720: 69 66 20 28 68 43 61 72 64 20 21 3d 20 39 39 29  if (hCard != 99)
6730: 20 7b 0a 09 09 72 65 74 75 72 6e 28 53 43 41 52   {...return(SCAR
6740: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44  D_E_INVALID_HAND
6750: 4c 45 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  LE);..}...return
6760: 28 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53  (SCARD_S_SUCCESS
6770: 29 3b 0a 7d 0a 0a 50 43 53 43 5f 41 50 49 20 4c  );.}..PCSC_API L
6780: 4f 4e 47 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  ONG SCardReconne
6790: 63 74 28 53 43 41 52 44 48 41 4e 44 4c 45 20 68  ct(SCARDHANDLE h
67a0: 43 61 72 64 2c 20 44 57 4f 52 44 20 64 77 53 68  Card, DWORD dwSh
67b0: 61 72 65 4d 6f 64 65 2c 20 44 57 4f 52 44 20 64  areMode, DWORD d
67c0: 77 50 72 65 66 65 72 72 65 64 50 72 6f 74 6f 63  wPreferredProtoc
67d0: 6f 6c 73 2c 20 44 57 4f 52 44 20 64 77 49 6e 69  ols, DWORD dwIni
67e0: 74 69 61 6c 69 7a 61 74 69 6f 6e 2c 20 4c 50 44  tialization, LPD
67f0: 57 4f 52 44 20 70 64 77 41 63 74 69 76 65 50 72  WORD pdwActivePr
6800: 6f 74 6f 63 6f 6c 29 20 7b 0a 09 43 41 43 4b 45  otocol) {..CACKE
6810: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6820: 43 61 6c 6c 65 64 22 29 3b 0a 0a 09 69 66 20 28  Called");...if (
6830: 68 43 61 72 64 20 21 3d 20 39 39 29 20 7b 0a 09  hCard != 99) {..
6840: 09 72 65 74 75 72 6e 28 53 43 41 52 44 5f 45 5f  .return(SCARD_E_
6850: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 3b  INVALID_HANDLE);
6860: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 53 43 61  ..}...return(SCa
6870: 72 64 43 6f 6e 6e 65 63 74 28 34 32 2c 20 4e 55  rdConnect(42, NU
6880: 4c 4c 2c 20 64 77 53 68 61 72 65 4d 6f 64 65 2c  LL, dwShareMode,
6890: 20 64 77 50 72 65 66 65 72 72 65 64 50 72 6f 74   dwPreferredProt
68a0: 6f 63 6f 6c 73 2c 20 4e 55 4c 4c 2c 20 70 64 77  ocols, NULL, pdw
68b0: 41 63 74 69 76 65 50 72 6f 74 6f 63 6f 6c 29 29  ActiveProtocol))
68c0: 3b 0a 7d 0a 0a 50 43 53 43 5f 41 50 49 20 4c 4f  ;.}..PCSC_API LO
68d0: 4e 47 20 53 43 61 72 64 52 65 6c 65 61 73 65 43  NG SCardReleaseC
68e0: 6f 6e 74 65 78 74 28 53 43 41 52 44 43 4f 4e 54  ontext(SCARDCONT
68f0: 45 58 54 20 68 43 6f 6e 74 65 78 74 29 20 7b 0a  EXT hContext) {.
6900: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6910: 49 4e 54 46 28 22 43 61 6c 6c 65 64 22 29 3b 0a  INTF("Called");.
6920: 0a 09 69 66 20 28 68 43 6f 6e 74 65 78 74 20 21  ..if (hContext !
6930: 3d 20 34 32 29 20 7b 0a 09 09 72 65 74 75 72 6e  = 42) {...return
6940: 28 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  (SCARD_E_INVALID
6950: 5f 48 41 4e 44 4c 45 29 3b 0a 09 7d 0a 0a 09 72  _HANDLE);..}...r
6960: 65 74 75 72 6e 28 53 43 41 52 44 5f 53 5f 53 55  eturn(SCARD_S_SU
6970: 43 43 45 53 53 29 3b 0a 7d 0a 0a 50 43 53 43 5f  CCESS);.}..PCSC_
6980: 41 50 49 20 4c 4f 4e 47 20 53 43 61 72 64 54 72  API LONG SCardTr
6990: 61 6e 73 6d 69 74 28 53 43 41 52 44 48 41 4e 44  ansmit(SCARDHAND
69a0: 4c 45 20 68 43 61 72 64 2c 20 63 6f 6e 73 74 20  LE hCard, const 
69b0: 53 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54  SCARD_IO_REQUEST
69c0: 20 2a 70 69 6f 53 65 6e 64 50 63 69 2c 20 4c 50   *pioSendPci, LP
69d0: 43 42 59 54 45 20 70 62 53 65 6e 64 42 75 66 66  CBYTE pbSendBuff
69e0: 65 72 2c 20 44 57 4f 52 44 20 63 62 53 65 6e 64  er, DWORD cbSend
69f0: 4c 65 6e 67 74 68 2c 20 53 43 41 52 44 5f 49 4f  Length, SCARD_IO
6a00: 5f 52 45 51 55 45 53 54 20 2a 70 69 6f 52 65 63  _REQUEST *pioRec
6a10: 76 50 63 69 2c 20 4c 50 42 59 54 45 20 70 62 52  vPci, LPBYTE pbR
6a20: 65 63 76 42 75 66 66 65 72 2c 20 4c 50 44 57 4f  ecvBuffer, LPDWO
6a30: 52 44 20 70 63 62 52 65 63 76 4c 65 6e 67 74 68  RD pcbRecvLength
6a40: 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
6a50: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
6a60: 22 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  ");..unsigned in
6a70: 74 20 62 79 74 65 73 54 6f 52 65 61 64 3b 0a 0a  t bytesToRead;..
6a80: 09 69 66 20 28 68 43 61 72 64 20 21 3d 20 39 39  .if (hCard != 99
6a90: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 53 43 41  ) {...return(SCA
6aa0: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
6ab0: 44 4c 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69  DLE);..}...if (i
6ac0: 6e 70 75 74 44 61 74 61 4c 65 6e 20 3c 3d 20 31  nputDataLen <= 1
6ad0: 29 20 7b 0a 09 09 2a 70 63 62 52 65 63 76 4c 65  ) {...*pcbRecvLe
6ae0: 6e 67 74 68 20 3d 20 30 3b 0a 0a 09 09 72 65 74  ngth = 0;....ret
6af0: 75 72 6e 28 53 43 41 52 44 5f 53 5f 53 55 43 43  urn(SCARD_S_SUCC
6b00: 45 53 53 29 3b 0a 09 7d 0a 0a 09 62 79 74 65 73  ESS);..}...bytes
6b10: 54 6f 52 65 61 64 20 3d 20 28 69 6e 70 75 74 44  ToRead = (inputD
6b20: 61 74 61 5b 30 5d 20 3c 3c 20 38 29 20 7c 20 69  ata[0] << 8) | i
6b30: 6e 70 75 74 44 61 74 61 5b 31 5d 3b 0a 0a 09 69  nputData[1];...i
6b40: 6e 70 75 74 44 61 74 61 20 20 20 20 2b 3d 20 32  nputData    += 2
6b50: 3b 0a 09 69 6e 70 75 74 44 61 74 61 4c 65 6e 20  ;..inputDataLen 
6b60: 2d 3d 20 32 3b 0a 0a 09 69 66 20 28 62 79 74 65  -= 2;...if (byte
6b70: 73 54 6f 52 65 61 64 20 3e 20 69 6e 70 75 74 44  sToRead > inputD
6b80: 61 74 61 4c 65 6e 29 20 7b 0a 09 09 62 79 74 65  ataLen) {...byte
6b90: 73 54 6f 52 65 61 64 20 3d 20 69 6e 70 75 74 44  sToRead = inputD
6ba0: 61 74 61 4c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20  ataLen;..}...if 
6bb0: 28 62 79 74 65 73 54 6f 52 65 61 64 20 3e 20 2a  (bytesToRead > *
6bc0: 70 63 62 52 65 63 76 4c 65 6e 67 74 68 29 20 7b  pcbRecvLength) {
6bd0: 0a 09 09 72 65 74 75 72 6e 28 53 43 41 52 44 5f  ...return(SCARD_
6be0: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
6bf0: 55 46 46 45 52 29 3b 0a 09 7d 0a 0a 09 2a 70 63  UFFER);..}...*pc
6c00: 62 52 65 63 76 4c 65 6e 67 74 68 20 3d 20 62 79  bRecvLength = by
6c10: 74 65 73 54 6f 52 65 61 64 3b 0a 0a 09 6d 65 6d  tesToRead;...mem
6c20: 63 70 79 28 70 62 52 65 63 76 42 75 66 66 65 72  cpy(pbRecvBuffer
6c30: 2c 20 69 6e 70 75 74 44 61 74 61 2c 20 62 79 74  , inputData, byt
6c40: 65 73 54 6f 52 65 61 64 29 3b 0a 0a 09 69 6e 70  esToRead);...inp
6c50: 75 74 44 61 74 61 20 2b 3d 20 62 79 74 65 73 54  utData += bytesT
6c60: 6f 52 65 61 64 3b 0a 09 69 6e 70 75 74 44 61 74  oRead;..inputDat
6c70: 61 4c 65 6e 20 2d 3d 20 62 79 74 65 73 54 6f 52  aLen -= bytesToR
6c80: 65 61 64 3b 0a 0a 09 72 65 74 75 72 6e 28 53 43  ead;...return(SC
6c90: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 3b 0a  ARD_S_SUCCESS);.
6ca0: 7d 0a 0a 2f 2a 20 41 6d 65 72 69 63 61 6e 20 46  }../* American F
6cb0: 75 7a 7a 79 20 4c 6f 70 20 74 65 73 74 69 6e 67  uzzy Lop testing
6cc0: 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 69 6e 74 20   program */.int 
6cd0: 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
6ce0: 68 61 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09 43  har **argv) {..C
6cf0: 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f  K_FUNCTION_LIST_
6d00: 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73  PTR pFunctionLis
6d10: 74 3b 0a 09 43 4b 5f 52 56 20 28 2a 43 5f 43 6c  t;..CK_RV (*C_Cl
6d20: 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  oseSession)(CK_S
6d30: 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
6d40: 65 73 73 69 6f 6e 29 20 3d 20 4e 55 4c 4c 3b 0a  ession) = NULL;.
6d50: 09 43 4b 5f 52 56 20 28 2a 43 5f 46 69 6e 61 6c  .CK_RV (*C_Final
6d60: 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52  ize)(CK_VOID_PTR
6d70: 20 70 52 65 73 65 72 76 65 64 29 20 3d 20 4e 55   pReserved) = NU
6d80: 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28 2a 43 5f 46  LL;..CK_RV (*C_F
6d90: 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53  indObjects)(CK_S
6da0: 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
6db0: 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
6dc0: 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f  T_HANDLE_PTR phO
6dd0: 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  bject, CK_ULONG 
6de0: 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
6df0: 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
6e00: 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 3d  ulObjectCount) =
6e10: 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28 2a   NULL;..CK_RV (*
6e20: 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  C_FindObjectsFin
6e30: 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
6e40: 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
6e50: 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28  = NULL;..CK_RV (
6e60: 2a 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e  *C_FindObjectsIn
6e70: 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
6e80: 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
6e90: 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
6ea0: 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
6eb0: 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 3d 20  LONG ulCount) = 
6ec0: 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28 2a 43  NULL;..CK_RV (*C
6ed0: 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
6ee0: 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ue)(CK_SESSION_H
6ef0: 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
6f00: 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
6f10: 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
6f20: 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
6f30: 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
6f40: 6c 43 6f 75 6e 74 29 20 3d 20 4e 55 4c 4c 3b 0a  lCount) = NULL;.
6f50: 09 43 4b 5f 52 56 20 28 2a 43 5f 47 65 74 53 6c  .CK_RV (*C_GetSl
6f60: 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c  otList)(CK_BBOOL
6f70: 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43   tokenPresent, C
6f80: 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53  K_SLOT_ID_PTR pS
6f90: 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e  lotList, CK_ULON
6fa0: 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
6fb0: 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28  = NULL;..CK_RV (
6fc0: 2a 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29  *C_GetTokenInfo)
6fd0: 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
6fe0: 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46  ID, CK_TOKEN_INF
6ff0: 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 3d 20 4e  O_PTR pInfo) = N
7000: 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28 2a 43 5f  ULL;..CK_RV (*C_
7010: 49 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56  Initialize)(CK_V
7020: 4f 49 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67  OID_PTR pInitArg
7030: 73 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52  s) = NULL;..CK_R
7040: 56 20 28 2a 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f  V (*C_Login)(CK_
7050: 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
7060: 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52  Session, CK_USER
7070: 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c 20  _TYPE userType, 
7080: 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
7090: 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
70a0: 6c 50 69 6e 4c 65 6e 29 20 3d 20 4e 55 4c 4c 3b  lPinLen) = NULL;
70b0: 0a 09 43 4b 5f 52 56 20 28 2a 43 5f 4f 70 65 6e  ..CK_RV (*C_Open
70c0: 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54  Session)(CK_SLOT
70d0: 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46  _ID slotID, CK_F
70e0: 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56  LAGS flags, CK_V
70f0: 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61  OID_PTR pApplica
7100: 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20  tion, CK_NOTIFY 
7110: 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49  notify, CK_SESSI
7120: 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  ON_HANDLE_PTR ph
7130: 53 65 73 73 69 6f 6e 29 20 3d 20 4e 55 4c 4c 3b  Session) = NULL;
7140: 0a 09 43 4b 5f 52 56 20 28 2a 43 5f 53 69 67 6e  ..CK_RV (*C_Sign
7150: 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
7160: 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
7170: 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
7180: 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
7190: 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
71a0: 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
71b0: 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67  ULONG_PTR pulSig
71c0: 6e 61 74 75 72 65 4c 65 6e 29 20 3d 20 4e 55 4c  natureLen) = NUL
71d0: 4c 3b 0a 09 43 4b 5f 52 56 20 28 2a 43 5f 53 69  L;..CK_RV (*C_Si
71e0: 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  gnInit)(CK_SESSI
71f0: 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
7200: 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
7210: 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
7220: 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
7230: 45 20 68 4b 65 79 29 20 3d 20 4e 55 4c 4c 3b 0a  E hKey) = NULL;.
7240: 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45  .CK_C_INITIALIZE
7250: 5f 41 52 47 53 20 69 6e 69 74 61 72 67 73 3b 0a  _ARGS initargs;.
7260: 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 53 6c 6f  .CK_ULONG numSlo
7270: 74 73 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 5f  ts;..CK_SLOT_ID_
7280: 50 54 52 20 73 6c 6f 74 73 20 3d 20 4e 55 4c 4c  PTR slots = NULL
7290: 3b 0a 09 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f  ;..CK_TOKEN_INFO
72a0: 20 74 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 43 4b 5f   tokenInfo;..CK_
72b0: 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
72c0: 53 65 73 73 69 6f 6e 3b 0a 09 43 4b 5f 4f 42 4a  Session;..CK_OBJ
72d0: 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
72e0: 63 74 2c 20 2a 70 72 69 76 61 74 65 4b 65 79 4f  ct, *privateKeyO
72f0: 62 6a 65 63 74 73 5f 72 6f 6f 74 20 3d 20 4e 55  bjects_root = NU
7300: 4c 4c 2c 20 2a 70 72 69 76 61 74 65 4b 65 79 4f  LL, *privateKeyO
7310: 62 6a 65 63 74 73 2c 20 2a 63 75 72 72 50 72 69  bjects, *currPri
7320: 76 4b 65 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  vKey;..CK_ULONG 
7330: 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 0a 09  ulObjectCount;..
7340: 43 4b 5f 41 54 54 52 49 42 55 54 45 20 74 65 6d  CK_ATTRIBUTE tem
7350: 70 6c 61 74 65 5b 5d 20 3d 20 7b 0a 09 20 20 20  plate[] = {..   
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 20 20 20 20 20 20 20 20 7b 43 4b 41 5f 43 4c 41          {CKA_CLA
7380: 53 53 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 20  SS, NULL, 0},.. 
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 20 20 20 7b 43 4b 41 5f 54            {CKA_T
73b0: 4f 4b 45 4e 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a  OKEN, NULL, 0},.
73c0: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 43 4b 41              {CKA
73e0: 5f 4c 41 42 45 4c 2c 20 4e 55 4c 4c 2c 20 30 7d  _LABEL, NULL, 0}
73f0: 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 43                {C
7410: 4b 41 5f 50 52 49 56 41 54 45 2c 20 4e 55 4c 4c  KA_PRIVATE, NULL
7420: 2c 20 30 7d 2c 0a 09 20 20 20 20 20 20 20 20 20  , 0},..         
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 7b 43 4b 41 5f 49 44 2c 20 4e 55 4c 4c 2c    {CKA_ID, NULL,
7450: 20 30 7d 2c 0a 09 20 20 20 20 20 20 20 20 20 20   0},..          
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7470: 20 7b 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d   {CKA_SERIAL_NUM
7480: 42 45 52 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09  BER, NULL, 0},..
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 20 20 20 20 20 20 20 20 20 7b 43 4b 41 5f             {CKA_
74b0: 53 55 42 4a 45 43 54 2c 20 4e 55 4c 4c 2c 20 30  SUBJECT, NULL, 0
74c0: 7d 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20  },..            
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
74e0: 43 4b 41 5f 49 53 53 55 45 52 2c 20 4e 55 4c 4c  CKA_ISSUER, NULL
74f0: 2c 20 30 7d 2c 0a 09 20 20 20 20 20 20 20 20 20  , 0},..         
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 20 7b 43 4b 41 5f 43 45 52 54 49 46 49 43 41    {CKA_CERTIFICA
7520: 54 45 5f 54 59 50 45 2c 20 4e 55 4c 4c 2c 20 30  TE_TYPE, NULL, 0
7530: 7d 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20  },..            
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
7550: 43 4b 41 5f 4b 45 59 5f 54 59 50 45 2c 20 4e 55  CKA_KEY_TYPE, NU
7560: 4c 4c 2c 20 30 7d 2c 0a 09 20 20 20 20 20 20 20  LL, 0},..       
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 20 20 20 20 7b 43 4b 41 5f 53 49 47 4e 2c 20 4e      {CKA_SIGN, N
7590: 55 4c 4c 2c 20 30 7d 2c 0a 09 20 20 20 20 20 20  ULL, 0},..      
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 20 20 20 7b 43 4b 41 5f 56 41 4c 55 45 2c       {CKA_VALUE,
75c0: 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09 09 09 20   NULL, 0},..... 
75d0: 20 20 7b 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f    {CKA_CERT_MD5_
75e0: 48 41 53 48 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a  HASH, NULL, 0},.
75f0: 09 09 09 09 20 20 20 7b 43 4b 41 5f 43 45 52 54  ....   {CKA_CERT
7600: 5f 53 48 41 31 5f 48 41 53 48 2c 20 4e 55 4c 4c  _SHA1_HASH, NULL
7610: 2c 20 30 7d 2c 0a 09 09 09 09 20 20 20 7b 43 4b  , 0},.....   {CK
7620: 41 5f 54 52 55 53 54 45 44 2c 20 4e 55 4c 4c 2c  A_TRUSTED, NULL,
7630: 20 30 7d 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41   0},.....   {CKA
7640: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
7650: 54 48 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09  TH, NULL, 0},...
7660: 09 09 20 20 20 7b 43 4b 41 5f 54 52 55 53 54 5f  ..   {CKA_TRUST_
7670: 43 4f 44 45 5f 53 49 47 4e 49 4e 47 2c 20 4e 55  CODE_SIGNING, NU
7680: 4c 4c 2c 20 30 7d 2c 0a 09 09 09 09 20 20 20 7b  LL, 0},.....   {
7690: 43 4b 41 5f 54 52 55 53 54 5f 43 52 4c 5f 53 49  CKA_TRUST_CRL_SI
76a0: 47 4e 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09  GN, NULL, 0},...
76b0: 09 09 20 20 20 7b 43 4b 41 5f 54 52 55 53 54 5f  ..   {CKA_TRUST_
76c0: 44 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e  DATA_ENCIPHERMEN
76d0: 54 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09 09  T, NULL, 0},....
76e0: 09 20 20 20 7b 43 4b 41 5f 54 52 55 53 54 5f 44  .   {CKA_TRUST_D
76f0: 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55 52 45  IGITAL_SIGNATURE
7700: 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09 09 09  , NULL, 0},.....
7710: 20 20 20 7b 43 4b 41 5f 54 52 55 53 54 5f 45 4d     {CKA_TRUST_EM
7720: 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 2c 20  AIL_PROTECTION, 
7730: 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09 09 09 20 20  NULL, 0},.....  
7740: 20 7b 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f   {CKA_TRUST_KEY_
7750: 41 47 52 45 45 4d 45 4e 54 2c 20 4e 55 4c 4c 2c  AGREEMENT, NULL,
7760: 20 30 7d 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41   0},.....   {CKA
7770: 5f 54 52 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f  _TRUST_KEY_CERT_
7780: 53 49 47 4e 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a  SIGN, NULL, 0},.
7790: 09 09 09 09 20 20 20 7b 43 4b 41 5f 54 52 55 53  ....   {CKA_TRUS
77a0: 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d 45  T_KEY_ENCIPHERME
77b0: 4e 54 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09  NT, NULL, 0},...
77c0: 09 09 20 20 20 7b 43 4b 41 5f 54 52 55 53 54 5f  ..   {CKA_TRUST_
77d0: 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 2c  NON_REPUDIATION,
77e0: 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09 09 09 20   NULL, 0},..... 
77f0: 20 20 7b 43 4b 41 5f 54 52 55 53 54 5f 53 45 52    {CKA_TRUST_SER
7800: 56 45 52 5f 41 55 54 48 2c 20 4e 55 4c 4c 2c 20  VER_AUTH, NULL, 
7810: 30 7d 0a 09 20 20 20 20 20 20 20 20 20 20 20 20  0}..            
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7830: 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b   *curr_attr;..CK
7840: 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 61 74 74 72  _ULONG curr_attr
7850: 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  _idx;..CK_ULONG 
7860: 62 79 74 65 5f 69 64 78 3b 0a 09 43 4b 5f 4f 42  byte_idx;..CK_OB
7870: 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63  JECT_CLASS objec
7880: 74 43 6c 61 73 73 3b 0a 09 43 4b 5f 42 59 54 45  tClass;..CK_BYTE
7890: 20 73 69 67 6e 61 74 75 72 65 5b 31 30 32 34 5d   signature[1024]
78a0: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 69 67 6e  ;..CK_ULONG sign
78b0: 61 74 75 72 65 5f 6c 65 6e 3b 0a 09 43 4b 5f 4d  ature_len;..CK_M
78c0: 45 43 48 41 4e 49 53 4d 20 6d 65 63 68 61 6e 69  ECHANISM mechani
78d0: 73 6d 20 3d 20 7b 43 4b 4d 5f 52 53 41 5f 50 4b  sm = {CKM_RSA_PK
78e0: 43 53 2c 20 4e 55 4c 4c 2c 20 30 7d 3b 0a 09 43  CS, NULL, 0};..C
78f0: 4b 5f 52 56 20 63 68 6b 5f 72 76 3b 0a 09 73 73  K_RV chk_rv;..ss
7900: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a  ize_t read_ret;.
7910: 09 63 68 61 72 20 2a 66 69 6c 65 4e 61 6d 65 20  .char *fileName 
7920: 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 66 64 3b  = NULL;..int fd;
7930: 0a 09 69 6e 74 20 69 3b 0a 09 69 6e 74 20 69 6e  ..int i;..int in
7940: 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 09  itialized = 0;..
7950: 69 6e 74 20 72 65 74 76 61 6c 20 3d 20 31 3b 0a  int retval = 1;.
7960: 0a 09 66 69 6c 65 4e 61 6d 65 20 3d 20 61 72 67  ..fileName = arg
7970: 76 5b 31 5d 3b 0a 09 69 66 20 28 66 69 6c 65 4e  v[1];..if (fileN
7980: 61 6d 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ame == NULL) {..
7990: 09 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 09  .goto cleanup;..
79a0: 7d 0a 0a 09 66 64 20 3d 20 6f 70 65 6e 28 66 69  }...fd = open(fi
79b0: 6c 65 4e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  leName, O_RDONLY
79c0: 29 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20  );..if (fd < 0) 
79d0: 7b 0a 09 09 67 6f 74 6f 20 63 6c 65 61 6e 75 70  {...goto cleanup
79e0: 3b 0a 09 7d 0a 0a 09 69 6e 70 75 74 44 61 74 61  ;..}...inputData
79f0: 4c 65 6e 20 3d 20 31 36 33 38 34 3b 0a 09 69 6e  Len = 16384;..in
7a00: 70 75 74 44 61 74 61 20 3d 20 6d 61 6c 6c 6f 63  putData = malloc
7a10: 28 69 6e 70 75 74 44 61 74 61 4c 65 6e 29 3b 0a  (inputDataLen);.
7a20: 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 72 65 61  ..read_ret = rea
7a30: 64 28 66 64 2c 20 69 6e 70 75 74 44 61 74 61 2c  d(fd, inputData,
7a40: 20 69 6e 70 75 74 44 61 74 61 4c 65 6e 29 3b 0a   inputDataLen);.
7a50: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 20  .if (read_ret < 
7a60: 30 29 20 7b 0a 09 09 67 6f 74 6f 20 63 6c 65 61  0) {...goto clea
7a70: 6e 75 70 3b 0a 09 7d 0a 0a 09 69 6e 70 75 74 44  nup;..}...inputD
7a80: 61 74 61 4c 65 6e 20 3d 20 72 65 61 64 5f 72 65  ataLen = read_re
7a90: 74 3b 0a 09 69 6e 70 75 74 44 61 74 61 20 3d 20  t;..inputData = 
7aa0: 72 65 61 6c 6c 6f 63 28 69 6e 70 75 74 44 61 74  realloc(inputDat
7ab0: 61 2c 20 69 6e 70 75 74 44 61 74 61 4c 65 6e 29  a, inputDataLen)
7ac0: 3b 0a 0a 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a  ;...close(fd);..
7ad0: 09 63 68 6b 5f 72 76 20 3d 20 43 5f 47 65 74 46  .chk_rv = C_GetF
7ae0: 75 6e 63 74 69 6f 6e 4c 69 73 74 28 26 70 46 75  unctionList(&pFu
7af0: 6e 63 74 69 6f 6e 4c 69 73 74 29 3b 0a 09 69 66  nctionList);..if
7b00: 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f   (chk_rv != CKR_
7b10: 4f 4b 29 20 7b 0a 09 09 70 72 69 6e 74 66 28 22  OK) {...printf("
7b20: 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73  C_GetFunctionLis
7b30: 74 28 29 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  t() failed.");..
7b40: 09 09 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a  ..goto cleanup;.
7b50: 09 7d 0a 0a 09 43 5f 43 6c 6f 73 65 53 65 73 73  .}...C_CloseSess
7b60: 69 6f 6e 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c  ion = pFunctionL
7b70: 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73  ist->C_CloseSess
7b80: 69 6f 6e 3b 0a 09 43 5f 46 69 6e 61 6c 69 7a 65  ion;..C_Finalize
7b90: 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74   = pFunctionList
7ba0: 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 43  ->C_Finalize;..C
7bb0: 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 70  _FindObjects = p
7bc0: 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
7bd0: 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 43 5f  FindObjects;..C_
7be0: 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c  FindObjectsFinal
7bf0: 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74   = pFunctionList
7c00: 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46  ->C_FindObjectsF
7c10: 69 6e 61 6c 3b 0a 09 43 5f 46 69 6e 64 4f 62 6a  inal;..C_FindObj
7c20: 65 63 74 73 49 6e 69 74 20 3d 20 70 46 75 6e 63  ectsInit = pFunc
7c30: 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64  tionList->C_Find
7c40: 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 43 5f  ObjectsInit;..C_
7c50: 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
7c60: 65 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e = pFunctionLis
7c70: 74 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 75 74  t->C_GetAttribut
7c80: 65 56 61 6c 75 65 3b 0a 09 43 5f 47 65 74 53 6c  eValue;..C_GetSl
7c90: 6f 74 4c 69 73 74 20 3d 20 70 46 75 6e 63 74 69  otList = pFuncti
7ca0: 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
7cb0: 74 4c 69 73 74 3b 0a 09 43 5f 47 65 74 54 6f 6b  tList;..C_GetTok
7cc0: 65 6e 49 6e 66 6f 20 3d 20 70 46 75 6e 63 74 69  enInfo = pFuncti
7cd0: 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b  onList->C_GetTok
7ce0: 65 6e 49 6e 66 6f 3b 0a 09 43 5f 49 6e 69 74 69  enInfo;..C_Initi
7cf0: 61 6c 69 7a 65 20 3d 20 70 46 75 6e 63 74 69 6f  alize = pFunctio
7d00: 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c  nList->C_Initial
7d10: 69 7a 65 3b 0a 09 43 5f 4c 6f 67 69 6e 20 3d 20  ize;..C_Login = 
7d20: 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
7d30: 5f 4c 6f 67 69 6e 3b 0a 09 43 5f 4f 70 65 6e 53  _Login;..C_OpenS
7d40: 65 73 73 69 6f 6e 20 3d 20 70 46 75 6e 63 74 69  ession = pFuncti
7d50: 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65  onList->C_OpenSe
7d60: 73 73 69 6f 6e 3b 0a 09 43 5f 53 69 67 6e 20 3d  ssion;..C_Sign =
7d70: 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e   pFunctionList->
7d80: 43 5f 53 69 67 6e 3b 0a 09 43 5f 53 69 67 6e 49  C_Sign;..C_SignI
7d90: 6e 69 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c  nit = pFunctionL
7da0: 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 3b  ist->C_SignInit;
7db0: 0a 0a 09 70 72 69 76 61 74 65 4b 65 79 4f 62 6a  ...privateKeyObj
7dc0: 65 63 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  ects = malloc(si
7dd0: 7a 65 6f 66 28 2a 70 72 69 76 61 74 65 4b 65 79  zeof(*privateKey
7de0: 4f 62 6a 65 63 74 73 29 20 2a 20 31 30 32 34 29  Objects) * 1024)
7df0: 3b 0a 09 70 72 69 76 61 74 65 4b 65 79 4f 62 6a  ;..privateKeyObj
7e00: 65 63 74 73 5f 72 6f 6f 74 20 3d 20 70 72 69 76  ects_root = priv
7e10: 61 74 65 4b 65 79 4f 62 6a 65 63 74 73 3b 0a 09  ateKeyObjects;..
7e20: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
7e30: 31 30 32 34 3b 20 69 2b 2b 29 20 7b 0a 09 09 70  1024; i++) {...p
7e40: 72 69 76 61 74 65 4b 65 79 4f 62 6a 65 63 74 73  rivateKeyObjects
7e50: 5b 69 5d 20 3d 20 43 4b 5f 49 4e 56 41 4c 49 44  [i] = CK_INVALID
7e60: 5f 48 41 4e 44 4c 45 3b 0a 09 7d 0a 0a 09 69 6e  _HANDLE;..}...in
7e70: 69 74 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  itargs.CreateMut
7e80: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 69 74  ex = NULL;..init
7e90: 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65  args.DestroyMute
7ea0: 78 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 69 74 61  x = NULL;..inita
7eb0: 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20  rgs.LockMutex = 
7ec0: 4e 55 4c 4c 3b 0a 09 69 6e 69 74 61 72 67 73 2e  NULL;..initargs.
7ed0: 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55  UnlockMutex = NU
7ee0: 4c 4c 3b 0a 09 69 6e 69 74 61 72 67 73 2e 66 6c  LL;..initargs.fl
7ef0: 61 67 73 20 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43  ags = CKF_OS_LOC
7f00: 4b 49 4e 47 5f 4f 4b 3b 0a 09 69 6e 69 74 61 72  KING_OK;..initar
7f10: 67 73 2e 70 52 65 73 65 72 76 65 64 20 3d 20 4e  gs.pReserved = N
7f20: 55 4c 4c 3b 0a 0a 09 63 68 6b 5f 72 76 20 3d 20  ULL;...chk_rv = 
7f30: 43 5f 49 6e 69 74 69 61 6c 69 7a 65 28 26 69 6e  C_Initialize(&in
7f40: 69 74 61 72 67 73 29 3b 0a 09 69 66 20 28 63 68  itargs);..if (ch
7f50: 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  k_rv != CKR_OK) 
7f60: 7b 0a 09 09 69 6e 69 74 61 72 67 73 2e 43 72 65  {...initargs.Cre
7f70: 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ateMutex = NULL;
7f80: 0a 09 09 69 6e 69 74 61 72 67 73 2e 44 65 73 74  ...initargs.Dest
7f90: 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  royMutex = NULL;
7fa0: 0a 09 09 69 6e 69 74 61 72 67 73 2e 4c 6f 63 6b  ...initargs.Lock
7fb0: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
7fc0: 69 6e 69 74 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  initargs.UnlockM
7fd0: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69  utex = NULL;...i
7fe0: 6e 69 74 61 72 67 73 2e 66 6c 61 67 73 20 3d 20  nitargs.flags = 
7ff0: 30 3b 0a 09 09 69 6e 69 74 61 72 67 73 2e 70 52  0;...initargs.pR
8000: 65 73 65 72 76 65 64 20 3d 20 4e 55 4c 4c 3b 0a  eserved = NULL;.
8010: 0a 09 09 63 68 6b 5f 72 76 20 3d 20 43 5f 49 6e  ...chk_rv = C_In
8020: 69 74 69 61 6c 69 7a 65 28 26 69 6e 69 74 61 72  itialize(&initar
8030: 67 73 29 3b 0a 09 09 69 66 20 28 63 68 6b 5f 72  gs);...if (chk_r
8040: 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  v != CKR_OK) {..
8050: 09 09 70 72 69 6e 74 66 28 22 43 5f 49 6e 69 74  ..printf("C_Init
8060: 69 61 6c 69 7a 65 28 29 20 66 61 69 6c 65 64 2e  ialize() failed.
8070: 22 29 3b 0a 0a 09 09 09 67 6f 74 6f 20 63 6c 65  ");.....goto cle
8080: 61 6e 75 70 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  anup;...}..}...i
8090: 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a  nitialized = 1;.
80a0: 0a 09 63 68 6b 5f 72 76 20 3d 20 43 5f 47 65 74  ..chk_rv = C_Get
80b0: 53 6c 6f 74 4c 69 73 74 28 46 41 4c 53 45 2c 20  SlotList(FALSE, 
80c0: 4e 55 4c 4c 2c 20 26 6e 75 6d 53 6c 6f 74 73 29  NULL, &numSlots)
80d0: 3b 0a 09 69 66 20 28 63 68 6b 5f 72 76 20 21 3d  ;..if (chk_rv !=
80e0: 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 67 6f 74   CKR_OK) {...got
80f0: 6f 20 63 6c 65 61 6e 75 70 3b 0a 09 7d 0a 0a 09  o cleanup;..}...
8100: 69 66 20 28 6e 75 6d 53 6c 6f 74 73 20 3d 3d 20  if (numSlots == 
8110: 30 29 20 7b 0a 09 09 67 6f 74 6f 20 63 6c 65 61  0) {...goto clea
8120: 6e 75 70 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 73 20  nup;..}...slots 
8130: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
8140: 2a 73 6c 6f 74 73 29 20 2a 20 6e 75 6d 53 6c 6f  *slots) * numSlo
8150: 74 73 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 73  ts);...if (slots
8160: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 67 6f   == NULL) {...go
8170: 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 09 7d 0a 0a  to cleanup;..}..
8180: 09 63 68 6b 5f 72 76 20 3d 20 43 5f 47 65 74 53  .chk_rv = C_GetS
8190: 6c 6f 74 4c 69 73 74 28 46 41 4c 53 45 2c 20 73  lotList(FALSE, s
81a0: 6c 6f 74 73 2c 20 26 6e 75 6d 53 6c 6f 74 73 29  lots, &numSlots)
81b0: 3b 0a 09 69 66 20 28 63 68 6b 5f 72 76 20 21 3d  ;..if (chk_rv !=
81c0: 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 67 6f 74   CKR_OK) {...got
81d0: 6f 20 63 6c 65 61 6e 75 70 3b 0a 09 7d 0a 0a 09  o cleanup;..}...
81e0: 63 68 6b 5f 72 76 20 3d 20 43 5f 4f 70 65 6e 53  chk_rv = C_OpenS
81f0: 65 73 73 69 6f 6e 28 73 6c 6f 74 73 5b 30 5d 2c  ession(slots[0],
8200: 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53   CKF_SERIAL_SESS
8210: 49 4f 4e 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  ION, NULL, NULL,
8220: 20 26 68 53 65 73 73 69 6f 6e 29 3b 0a 09 69 66   &hSession);..if
8230: 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f   (chk_rv != CKR_
8240: 4f 4b 29 20 7b 0a 09 09 67 6f 74 6f 20 63 6c 65  OK) {...goto cle
8250: 61 6e 75 70 3b 0a 09 7d 0a 0a 09 63 68 6b 5f 72  anup;..}...chk_r
8260: 76 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e  v = C_GetTokenIn
8270: 66 6f 28 73 6c 6f 74 73 5b 30 5d 2c 20 26 74 6f  fo(slots[0], &to
8280: 6b 65 6e 49 6e 66 6f 29 3b 0a 09 69 66 20 28 63  kenInfo);..if (c
8290: 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29  hk_rv != CKR_OK)
82a0: 20 7b 0a 09 09 67 6f 74 6f 20 63 6c 65 61 6e 75   {...goto cleanu
82b0: 70 3b 0a 09 7d 0a 0a 09 69 66 20 28 28 74 6f 6b  p;..}...if ((tok
82c0: 65 6e 49 6e 66 6f 2e 66 6c 61 67 73 20 26 20 43  enInfo.flags & C
82d0: 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
82e0: 44 29 20 3d 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  D) == CKF_LOGIN_
82f0: 52 45 51 55 49 52 45 44 20 26 26 20 28 74 6f 6b  REQUIRED && (tok
8300: 65 6e 49 6e 66 6f 2e 66 6c 61 67 73 20 26 20 43  enInfo.flags & C
8310: 4b 46 5f 50 52 4f 54 45 43 54 45 44 5f 41 55 54  KF_PROTECTED_AUT
8320: 48 45 4e 54 49 43 41 54 49 4f 4e 5f 50 41 54 48  HENTICATION_PATH
8330: 29 20 3d 3d 20 30 29 20 7b 0a 09 09 70 72 69 6e  ) == 0) {...prin
8340: 74 66 28 22 55 6e 61 62 6c 65 20 74 6f 20 6c 6f  tf("Unable to lo
8350: 67 69 6e 20 74 6f 20 63 61 72 64 2e 5c 6e 22 29  gin to card.\n")
8360: 3b 0a 0a 09 09 67 6f 74 6f 20 63 6c 65 61 6e 75  ;....goto cleanu
8370: 70 3b 0a 09 7d 0a 0a 09 63 68 6b 5f 72 76 20 3d  p;..}...chk_rv =
8380: 20 43 5f 4c 6f 67 69 6e 28 68 53 65 73 73 69 6f   C_Login(hSessio
8390: 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c  n, CKU_USER, NUL
83a0: 4c 2c 20 30 29 3b 0a 09 69 66 20 28 63 68 6b 5f  L, 0);..if (chk_
83b0: 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  rv != CKR_OK) {.
83c0: 09 09 70 72 69 6e 74 66 28 22 4c 6f 67 69 6e 20  ..printf("Login 
83d0: 74 6f 20 64 65 76 69 63 65 20 66 61 69 6c 65 64  to device failed
83e0: 2e 5c 6e 22 29 3b 0a 0a 09 09 67 6f 74 6f 20 63  .\n");....goto c
83f0: 6c 65 61 6e 75 70 3b 0a 09 7d 0a 0a 09 63 68 6b  leanup;..}...chk
8400: 5f 72 76 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  _rv = C_FindObje
8410: 63 74 73 49 6e 69 74 28 68 53 65 73 73 69 6f 6e  ctsInit(hSession
8420: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 69 66 20  , NULL, 0);..if 
8430: 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f  (chk_rv != CKR_O
8440: 4b 29 20 7b 0a 09 09 67 6f 74 6f 20 63 6c 65 61  K) {...goto clea
8450: 6e 75 70 3b 0a 09 7d 0a 0a 09 77 68 69 6c 65 20  nup;..}...while 
8460: 28 31 29 20 7b 0a 09 09 63 68 6b 5f 72 76 20 3d  (1) {...chk_rv =
8470: 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 28 68   C_FindObjects(h
8480: 53 65 73 73 69 6f 6e 2c 20 26 68 4f 62 6a 65 63  Session, &hObjec
8490: 74 2c 20 31 2c 20 26 75 6c 4f 62 6a 65 63 74 43  t, 1, &ulObjectC
84a0: 6f 75 6e 74 29 3b 0a 09 09 69 66 20 28 63 68 6b  ount);...if (chk
84b0: 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  _rv != CKR_OK) {
84c0: 0a 09 09 09 70 72 69 6e 74 66 28 22 46 69 6e 64  ....printf("Find
84d0: 4f 62 6a 65 63 74 73 28 29 20 66 61 69 6c 65 64  Objects() failed
84e0: 2e 5c 6e 22 29 3b 0a 09 09 09 62 72 65 61 6b 3b  .\n");....break;
84f0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6c 4f 62  ...}....if (ulOb
8500: 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
8510: 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  {....break;...}.
8520: 0a 09 09 69 66 20 28 75 6c 4f 62 6a 65 63 74 43  ...if (ulObjectC
8530: 6f 75 6e 74 20 21 3d 20 31 29 20 7b 0a 09 09 09  ount != 1) {....
8540: 70 72 69 6e 74 66 28 22 46 69 6e 64 4f 62 6a 65  printf("FindObje
8550: 63 74 73 28 29 20 72 65 74 75 72 6e 65 64 20 61  cts() returned a
8560: 20 77 65 69 72 64 20 6e 75 6d 62 65 72 20 6f 66   weird number of
8570: 20 6f 62 6a 65 63 74 73 2e 20 20 41 73 6b 65 64   objects.  Asked
8580: 20 66 6f 72 20 31 2c 20 67 6f 74 20 25 6c 75 2e   for 1, got %lu.
8590: 5c 6e 22 2c 20 75 6c 4f 62 6a 65 63 74 43 6f 75  \n", ulObjectCou
85a0: 6e 74 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  nt);....break;..
85b0: 09 7d 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f  .}....for (curr_
85c0: 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75  attr_idx = 0; cu
85d0: 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 28 73  rr_attr_idx < (s
85e0: 69 7a 65 6f 66 28 74 65 6d 70 6c 61 74 65 29 20  izeof(template) 
85f0: 2f 20 73 69 7a 65 6f 66 28 74 65 6d 70 6c 61 74  / sizeof(templat
8600: 65 5b 30 5d 29 29 3b 20 63 75 72 72 5f 61 74 74  e[0])); curr_att
8610: 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 63 75  r_idx++) {....cu
8620: 72 72 5f 61 74 74 72 20 3d 20 26 74 65 6d 70 6c  rr_attr = &templ
8630: 61 74 65 5b 63 75 72 72 5f 61 74 74 72 5f 69 64  ate[curr_attr_id
8640: 78 5d 3b 0a 09 09 09 69 66 20 28 63 75 72 72 5f  x];....if (curr_
8650: 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a  attr->pValue) {.
8660: 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74  ....free(curr_at
8670: 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09  tr->pValue);....
8680: 7d 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2d  }.....curr_attr-
8690: 3e 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  >pValue = NULL;.
86a0: 09 09 7d 0a 0a 09 09 63 68 6b 5f 72 76 20 3d 20  ..}....chk_rv = 
86b0: 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61  C_GetAttributeVa
86c0: 6c 75 65 28 68 53 65 73 73 69 6f 6e 2c 20 68 4f  lue(hSession, hO
86d0: 62 6a 65 63 74 2c 20 26 74 65 6d 70 6c 61 74 65  bject, &template
86e0: 5b 30 5d 2c 20 73 69 7a 65 6f 66 28 74 65 6d 70  [0], sizeof(temp
86f0: 6c 61 74 65 29 20 2f 20 73 69 7a 65 6f 66 28 74  late) / sizeof(t
8700: 65 6d 70 6c 61 74 65 5b 30 5d 29 29 3b 0a 09 09  emplate[0]));...
8710: 69 66 20 28 63 68 6b 5f 72 76 20 3d 3d 20 43 4b  if (chk_rv == CK
8720: 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  R_ATTRIBUTE_TYPE
8730: 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 63 68 6b 5f  _INVALID || chk_
8740: 72 76 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42  rv == CKR_ATTRIB
8750: 55 54 45 5f 53 45 4e 53 49 54 49 56 45 20 7c 7c  UTE_SENSITIVE ||
8760: 20 63 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 42   chk_rv == CKR_B
8770: 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
8780: 20 7b 0a 09 09 09 63 68 6b 5f 72 76 20 3d 20 43   {....chk_rv = C
8790: 4b 52 5f 4f 4b 3b 0a 09 09 7d 0a 0a 09 09 69 66  KR_OK;...}....if
87a0: 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f   (chk_rv != CKR_
87b0: 4f 4b 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75  OK) {....continu
87c0: 65 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72 20 28 63  e;...}....for (c
87d0: 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  urr_attr_idx = 0
87e0: 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20  ; curr_attr_idx 
87f0: 3c 20 28 73 69 7a 65 6f 66 28 74 65 6d 70 6c 61  < (sizeof(templa
8800: 74 65 29 20 2f 20 73 69 7a 65 6f 66 28 74 65 6d  te) / sizeof(tem
8810: 70 6c 61 74 65 5b 30 5d 29 29 3b 20 63 75 72 72  plate[0])); curr
8820: 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
8830: 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 74  ..curr_attr = &t
8840: 65 6d 70 6c 61 74 65 5b 63 75 72 72 5f 61 74 74  emplate[curr_att
8850: 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 69 66 20 28  r_idx];.....if (
8860: 28 28 43 4b 5f 4c 4f 4e 47 29 20 63 75 72 72 5f  ((CK_LONG) curr_
8870: 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
8880: 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20  ) != ((CK_LONG) 
8890: 2d 31 29 29 20 7b 0a 09 09 09 09 63 75 72 72 5f  -1)) {.....curr_
88a0: 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 3d 20 6d  attr->pValue = m
88b0: 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2d  alloc(curr_attr-
88c0: 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  >ulValueLen);...
88d0: 09 7d 0a 09 09 7d 0a 0a 09 09 63 68 6b 5f 72 76  .}...}....chk_rv
88e0: 20 3d 20 43 5f 47 65 74 41 74 74 72 69 62 75 74   = C_GetAttribut
88f0: 65 56 61 6c 75 65 28 68 53 65 73 73 69 6f 6e 2c  eValue(hSession,
8900: 20 68 4f 62 6a 65 63 74 2c 20 26 74 65 6d 70 6c   hObject, &templ
8910: 61 74 65 5b 30 5d 2c 20 73 69 7a 65 6f 66 28 74  ate[0], sizeof(t
8920: 65 6d 70 6c 61 74 65 29 20 2f 20 73 69 7a 65 6f  emplate) / sizeo
8930: 66 28 74 65 6d 70 6c 61 74 65 5b 30 5d 29 29 3b  f(template[0]));
8940: 0a 09 09 69 66 20 28 63 68 6b 5f 72 76 20 3d 3d  ...if (chk_rv ==
8950: 20 43 4b 52 5f 4f 4b 20 7c 7c 20 63 68 6b 5f 72   CKR_OK || chk_r
8960: 76 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55  v == CKR_ATTRIBU
8970: 54 45 5f 53 45 4e 53 49 54 49 56 45 20 7c 7c 20  TE_SENSITIVE || 
8980: 63 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 41 54  chk_rv == CKR_AT
8990: 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56  TRIBUTE_TYPE_INV
89a0: 41 4c 49 44 20 7c 7c 20 63 68 6b 5f 72 76 20 3d  ALID || chk_rv =
89b0: 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
89c0: 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 66 6f 72  _SMALL) {....for
89d0: 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20   (curr_attr_idx 
89e0: 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69  = 0; curr_attr_i
89f0: 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 74 65 6d  dx < (sizeof(tem
8a00: 70 6c 61 74 65 29 20 2f 20 73 69 7a 65 6f 66 28  plate) / sizeof(
8a10: 74 65 6d 70 6c 61 74 65 5b 30 5d 29 29 3b 20 63  template[0])); c
8a20: 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20  urr_attr_idx++) 
8a30: 7b 0a 09 09 09 09 63 75 72 72 5f 61 74 74 72 20  {.....curr_attr 
8a40: 3d 20 26 74 65 6d 70 6c 61 74 65 5b 63 75 72 72  = &template[curr
8a50: 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09  _attr_idx];.....
8a60: 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e  .if (curr_attr->
8a70: 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 73  pValue) {......s
8a80: 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72  witch (curr_attr
8a90: 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 09 09  ->type) {.......
8aa0: 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a  case CKA_CLASS:.
8ab0: 09 09 09 09 09 09 09 6f 62 6a 65 63 74 43 6c 61  .......objectCla
8ac0: 73 73 20 3d 20 2a 28 28 43 4b 5f 4f 42 4a 45 43  ss = *((CK_OBJEC
8ad0: 54 5f 43 4c 41 53 53 20 2a 29 20 63 75 72 72 5f  T_CLASS *) curr_
8ae0: 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 0a  attr->pValue);..
8af0: 09 09 09 09 09 09 09 69 66 20 28 6f 62 6a 65 63  .......if (objec
8b00: 74 43 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tClass == CKO_PR
8b10: 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
8b20: 09 09 09 09 09 2a 70 72 69 76 61 74 65 4b 65 79  .....*privateKey
8b30: 4f 62 6a 65 63 74 73 20 3d 20 68 4f 62 6a 65 63  Objects = hObjec
8b40: 74 3b 0a 09 09 09 09 09 09 09 09 70 72 69 76 61  t;.........priva
8b50: 74 65 4b 65 79 4f 62 6a 65 63 74 73 2b 2b 3b 0a  teKeyObjects++;.
8b60: 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a  .......}......}.
8b70: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
8b80: 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 74 72  ..free(curr_attr
8b90: 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09  ->pValue);......
8ba0: 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
8bb0: 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a  e = NULL;.....}.
8bc0: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
8bd0: 09 09 09 70 72 69 6e 74 66 28 22 47 65 74 41 74  ...printf("GetAt
8be0: 74 72 69 62 75 74 65 56 61 6c 75 65 28 68 4f 62  tributeValue(hOb
8bf0: 6a 65 63 74 3d 25 6c 75 29 2f 31 20 66 61 69 6c  ject=%lu)/1 fail
8c00: 65 64 20 28 72 76 20 3d 20 25 6c 75 29 2e 5c 6e  ed (rv = %lu).\n
8c10: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
8c20: 67 29 20 68 4f 62 6a 65 63 74 2c 20 28 75 6e 73  g) hObject, (uns
8c30: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 68 6b 5f  igned long) chk_
8c40: 72 76 29 3b 0a 09 09 7d 0a 0a 09 7d 0a 0a 09 63  rv);...}...}...c
8c50: 68 6b 5f 72 76 20 3d 20 43 5f 46 69 6e 64 4f 62  hk_rv = C_FindOb
8c60: 6a 65 63 74 73 46 69 6e 61 6c 28 68 53 65 73 73  jectsFinal(hSess
8c70: 69 6f 6e 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72  ion);..if (chk_r
8c80: 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  v != CKR_OK) {..
8c90: 09 70 72 69 6e 74 66 28 22 46 69 6e 64 4f 62 6a  .printf("FindObj
8ca0: 65 63 74 73 46 69 6e 61 6c 28 29 20 66 61 69 6c  ectsFinal() fail
8cb0: 65 64 2e 5c 6e 22 29 3b 0a 09 7d 0a 0a 09 66 6f  ed.\n");..}...fo
8cc0: 72 20 28 63 75 72 72 50 72 69 76 4b 65 79 20 3d  r (currPrivKey =
8cd0: 20 70 72 69 76 61 74 65 4b 65 79 4f 62 6a 65 63   privateKeyObjec
8ce0: 74 73 5f 72 6f 6f 74 3b 20 2a 63 75 72 72 50 72  ts_root; *currPr
8cf0: 69 76 4b 65 79 20 21 3d 20 43 4b 5f 49 4e 56 41  ivKey != CK_INVA
8d00: 4c 49 44 5f 48 41 4e 44 4c 45 3b 20 63 75 72 72  LID_HANDLE; curr
8d10: 50 72 69 76 4b 65 79 2b 2b 29 20 7b 0a 09 09 63  PrivKey++) {...c
8d20: 68 6b 5f 72 76 20 3d 20 43 5f 53 69 67 6e 49 6e  hk_rv = C_SignIn
8d30: 69 74 28 68 53 65 73 73 69 6f 6e 2c 20 26 6d 65  it(hSession, &me
8d40: 63 68 61 6e 69 73 6d 2c 20 2a 63 75 72 72 50 72  chanism, *currPr
8d50: 69 76 4b 65 79 29 3b 0a 09 09 69 66 20 28 63 68  ivKey);...if (ch
8d60: 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20  k_rv == CKR_OK) 
8d70: 7b 0a 09 09 09 73 69 67 6e 61 74 75 72 65 5f 6c  {....signature_l
8d80: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 73 69 67 6e  en = sizeof(sign
8d90: 61 74 75 72 65 29 3b 0a 0a 09 09 09 63 68 6b 5f  ature);.....chk_
8da0: 72 76 20 3d 20 43 5f 53 69 67 6e 28 68 53 65 73  rv = C_Sign(hSes
8db0: 73 69 6f 6e 2c 20 28 43 4b 5f 42 59 54 45 5f 50  sion, (CK_BYTE_P
8dc0: 54 52 29 20 22 54 65 73 74 22 2c 20 34 2c 20 28  TR) "Test", 4, (
8dd0: 43 4b 5f 42 59 54 45 5f 50 54 52 29 20 26 73 69  CK_BYTE_PTR) &si
8de0: 67 6e 61 74 75 72 65 2c 20 26 73 69 67 6e 61 74  gnature, &signat
8df0: 75 72 65 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20  ure_len);....if 
8e00: 28 63 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 4f  (chk_rv == CKR_O
8e10: 4b 29 20 7b 0a 09 09 09 09 70 72 69 6e 74 66 28  K) {.....printf(
8e20: 22 5b 25 30 34 6c 75 2f 25 30 32 6c 78 5d 20 53  "[%04lu/%02lx] S
8e30: 69 67 6e 61 74 75 72 65 3a 20 22 2c 20 28 75 6e  ignature: ", (un
8e40: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 63 75  signed long) *cu
8e50: 72 72 50 72 69 76 4b 65 79 2c 20 28 75 6e 73 69  rrPrivKey, (unsi
8e60: 67 6e 65 64 20 6c 6f 6e 67 29 20 6d 65 63 68 61  gned long) mecha
8e70: 6e 69 73 6d 2e 6d 65 63 68 61 6e 69 73 6d 29 3b  nism.mechanism);
8e80: 0a 0a 09 09 09 09 66 6f 72 20 28 62 79 74 65 5f  ......for (byte_
8e90: 69 64 78 20 3d 20 30 3b 20 62 79 74 65 5f 69 64  idx = 0; byte_id
8ea0: 78 20 3c 20 73 69 67 6e 61 74 75 72 65 5f 6c 65  x < signature_le
8eb0: 6e 3b 20 62 79 74 65 5f 69 64 78 2b 2b 29 20 7b  n; byte_idx++) {
8ec0: 0a 09 09 09 09 09 70 72 69 6e 74 66 28 22 25 30  ......printf("%0
8ed0: 32 78 20 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  2x ", (unsigned 
8ee0: 69 6e 74 29 20 73 69 67 6e 61 74 75 72 65 5b 62  int) signature[b
8ef0: 79 74 65 5f 69 64 78 5d 29 3b 0a 09 09 09 09 7d  yte_idx]);.....}
8f00: 0a 0a 09 09 09 09 70 72 69 6e 74 66 28 22 5c 6e  ......printf("\n
8f10: 22 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ");....} else {.
8f20: 09 09 09 09 70 72 69 6e 74 66 28 22 53 69 67 6e  ....printf("Sign
8f30: 28 29 20 66 61 69 6c 65 64 2e 5c 6e 22 29 3b 0a  () failed.\n");.
8f40: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
8f50: 09 09 09 70 72 69 6e 74 66 28 22 53 69 67 6e 49  ...printf("SignI
8f60: 6e 69 74 28 29 20 66 61 69 6c 65 64 2e 5c 6e 22  nit() failed.\n"
8f70: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 68 6b 5f  );...}..}...chk_
8f80: 72 76 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73  rv = C_CloseSess
8f90: 69 6f 6e 28 68 53 65 73 73 69 6f 6e 29 3b 0a 09  ion(hSession);..
8fa0: 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b  if (chk_rv != CK
8fb0: 52 5f 4f 4b 29 20 7b 0a 09 09 70 72 69 6e 74 66  R_OK) {...printf
8fc0: 28 22 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 66  ("CloseSession f
8fd0: 61 69 6c 65 64 2e 5c 6e 22 29 3b 0a 09 7d 0a 0a  ailed.\n");..}..
8fe0: 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 63 6c  .retval = 0;..cl
8ff0: 65 61 6e 75 70 3a 0a 09 69 66 20 28 69 6e 69 74  eanup:..if (init
9000: 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 5f 46  ialized) {...C_F
9010: 69 6e 61 6c 69 7a 65 28 4e 55 4c 4c 29 3b 0a 09  inalize(NULL);..
9020: 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 73 29 20 7b  }...if (slots) {
9030: 0a 09 09 66 72 65 65 28 73 6c 6f 74 73 29 3b 0a  ...free(slots);.
9040: 09 7d 0a 0a 09 69 66 20 28 70 72 69 76 61 74 65  .}...if (private
9050: 4b 65 79 4f 62 6a 65 63 74 73 5f 72 6f 6f 74 29  KeyObjects_root)
9060: 20 7b 0a 09 09 66 72 65 65 28 70 72 69 76 61 74   {...free(privat
9070: 65 4b 65 79 4f 62 6a 65 63 74 73 5f 72 6f 6f 74  eKeyObjects_root
9080: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72  );..}...return(r
9090: 65 74 76 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  etval);.}.#endif
90a0: 0a                                               .