Hex Artifact Content

Artifact eb71775c471a477745c5d2fac4b261da431864a8:


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 2f 2a 20 49 6e 63 6c 75 64 65 20 74 68 65  ../* Include the
5c30: 20 43 41 43 4b 65 79 20 73 6f 75 72 63 65 20 2a   CACKey source *
5c40: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 63 6b  /.#include "cack
5c50: 65 79 2e 63 22 0a 0a 2f 2a 20 46 61 6b 65 20 61  ey.c"../* Fake a
5c60: 20 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a 73 74   smartcard */.st
5c70: 61 74 69 63 20 69 6e 74 20 73 63 61 72 64 5f 69  atic int scard_i
5c80: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 30  nTransaction = 0
5c90: 3b 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 73 63  ;.static LONG sc
5ca0: 61 72 64 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 50  ard_protocol;..P
5cb0: 43 53 43 5f 41 50 49 20 4c 4f 4e 47 20 53 43 61  CSC_API LONG SCa
5cc0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
5cd0: 78 74 28 44 57 4f 52 44 20 64 77 53 63 6f 70 65  xt(DWORD dwScope
5ce0: 2c 20 4c 50 43 56 4f 49 44 20 70 76 52 65 73 65  , LPCVOID pvRese
5cf0: 72 76 65 64 31 2c 20 4c 50 43 56 4f 49 44 20 70  rved1, LPCVOID p
5d00: 76 52 65 73 65 72 76 65 64 32 2c 20 4c 50 53 43  vReserved2, LPSC
5d10: 41 52 44 43 4f 4e 54 45 58 54 20 70 68 43 6f 6e  ARDCONTEXT phCon
5d20: 74 65 78 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  text) {..CACKEY_
5d30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
5d40: 6c 6c 65 64 22 29 3b 0a 0a 09 2a 70 68 43 6f 6e  lled");...*phCon
5d50: 74 65 78 74 20 3d 20 34 32 3b 0a 0a 09 72 65 74  text = 42;...ret
5d60: 75 72 6e 28 53 43 41 52 44 5f 53 5f 53 55 43 43  urn(SCARD_S_SUCC
5d70: 45 53 53 29 3b 0a 7d 0a 0a 50 43 53 43 5f 41 50  ESS);.}..PCSC_AP
5d80: 49 20 4c 4f 4e 47 20 53 43 61 72 64 49 73 56 61  I LONG SCardIsVa
5d90: 6c 69 64 43 6f 6e 74 65 78 74 28 53 43 41 52 44  lidContext(SCARD
5da0: 43 4f 4e 54 45 58 54 20 68 43 6f 6e 74 65 78 74  CONTEXT hContext
5db0: 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
5dc0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
5dd0: 22 29 3b 0a 0a 09 69 66 20 28 68 43 6f 6e 74 65  ");...if (hConte
5de0: 78 74 20 21 3d 20 34 32 29 20 7b 0a 09 09 72 65  xt != 42) {...re
5df0: 74 75 72 6e 28 53 43 41 52 44 5f 45 5f 49 4e 56  turn(SCARD_E_INV
5e00: 41 4c 49 44 5f 48 41 4e 44 4c 45 29 3b 0a 09 7d  ALID_HANDLE);..}
5e10: 0a 0a 09 72 65 74 75 72 6e 28 53 43 41 52 44 5f  ...return(SCARD_
5e20: 53 5f 53 55 43 43 45 53 53 29 3b 0a 7d 0a 0a 50  S_SUCCESS);.}..P
5e30: 43 53 43 5f 41 50 49 20 4c 4f 4e 47 20 53 43 61  CSC_API LONG SCa
5e40: 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 53 43  rdListReaders(SC
5e50: 41 52 44 43 4f 4e 54 45 58 54 20 68 43 6f 6e 74  ARDCONTEXT hCont
5e60: 65 78 74 2c 20 4c 50 43 53 54 52 20 6d 73 7a 47  ext, LPCSTR mszG
5e70: 72 6f 75 70 73 2c 20 4c 50 53 54 52 20 6d 73 7a  roups, LPSTR msz
5e80: 52 65 61 64 65 72 73 2c 20 4c 50 44 57 4f 52 44  Readers, LPDWORD
5e90: 20 70 63 63 68 52 65 61 64 65 72 73 29 20 7b 0a   pcchReaders) {.
5ea0: 09 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65  .static char *re
5eb0: 61 64 65 72 73 20 3d 20 22 52 45 41 44 45 52 30  aders = "READER0
5ec0: 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ";...CACKEY_DEBU
5ed0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
5ee0: 22 29 3b 0a 0a 09 69 66 20 28 68 43 6f 6e 74 65  ");...if (hConte
5ef0: 78 74 20 21 3d 20 34 32 29 20 7b 0a 09 09 72 65  xt != 42) {...re
5f00: 74 75 72 6e 28 53 43 41 52 44 5f 45 5f 49 4e 56  turn(SCARD_E_INV
5f10: 41 4c 49 44 5f 48 41 4e 44 4c 45 29 3b 0a 09 7d  ALID_HANDLE);..}
5f20: 0a 0a 09 2a 70 63 63 68 52 65 61 64 65 72 73 20  ...*pcchReaders 
5f30: 3d 20 73 74 72 6c 65 6e 28 72 65 61 64 65 72 73  = strlen(readers
5f40: 29 20 2b 20 31 3b 0a 0a 09 69 66 20 28 6d 73 7a  ) + 1;...if (msz
5f50: 52 65 61 64 65 72 73 20 3d 3d 20 4e 55 4c 4c 29  Readers == NULL)
5f60: 20 7b 0a 09 09 72 65 74 75 72 6e 28 53 43 41 52   {...return(SCAR
5f70: 44 5f 53 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d  D_S_SUCCESS);..}
5f80: 0a 0a 09 6d 65 6d 63 70 79 28 6d 73 7a 52 65 61  ...memcpy(mszRea
5f90: 64 65 72 73 2c 20 72 65 61 64 65 72 73 2c 20 2a  ders, readers, *
5fa0: 70 63 63 68 52 65 61 64 65 72 73 29 3b 0a 0a 09  pcchReaders);...
5fb0: 72 65 74 75 72 6e 28 53 43 41 52 44 5f 53 5f 53  return(SCARD_S_S
5fc0: 55 43 43 45 53 53 29 3b 0a 7d 0a 0a 50 43 53 43  UCCESS);.}..PCSC
5fd0: 5f 41 50 49 20 4c 4f 4e 47 20 53 43 61 72 64 42  _API LONG SCardB
5fe0: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
5ff0: 53 43 41 52 44 48 41 4e 44 4c 45 20 68 43 61 72  SCARDHANDLE hCar
6000: 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  d) {..CACKEY_DEB
6010: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
6020: 64 22 29 3b 0a 0a 09 69 66 20 28 68 43 61 72 64  d");...if (hCard
6030: 20 21 3d 20 39 39 29 20 7b 0a 09 09 72 65 74 75   != 99) {...retu
6040: 72 6e 28 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  rn(SCARD_E_INVAL
6050: 49 44 5f 48 41 4e 44 4c 45 29 3b 0a 09 7d 0a 0a  ID_HANDLE);..}..
6060: 09 69 66 20 28 73 63 61 72 64 5f 69 6e 54 72 61  .if (scard_inTra
6070: 6e 73 61 63 74 69 6f 6e 29 20 7b 0a 09 09 72 65  nsaction) {...re
6080: 74 75 72 6e 28 53 43 41 52 44 5f 45 5f 53 48 41  turn(SCARD_E_SHA
6090: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29 3b  RING_VIOLATION);
60a0: 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 69 6e 54 72  ..}...scard_inTr
60b0: 61 6e 73 61 63 74 69 6f 6e 20 3d 20 31 3b 0a 0a  ansaction = 1;..
60c0: 09 72 65 74 75 72 6e 28 53 43 41 52 44 5f 53 5f  .return(SCARD_S_
60d0: 53 55 43 43 45 53 53 29 3b 0a 7d 0a 50 43 53 43  SUCCESS);.}.PCSC
60e0: 5f 41 50 49 20 4c 4f 4e 47 20 53 43 61 72 64 45  _API LONG SCardE
60f0: 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 53 43  ndTransaction(SC
6100: 41 52 44 48 41 4e 44 4c 45 20 68 43 61 72 64 2c  ARDHANDLE hCard,
6110: 20 44 57 4f 52 44 20 64 77 44 69 73 70 6f 73 69   DWORD dwDisposi
6120: 74 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tion) {..CACKEY_
6130: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6140: 6c 6c 65 64 22 29 3b 0a 0a 09 69 66 20 28 68 43  lled");...if (hC
6150: 61 72 64 20 21 3d 20 39 39 29 20 7b 0a 09 09 72  ard != 99) {...r
6160: 65 74 75 72 6e 28 53 43 41 52 44 5f 45 5f 49 4e  eturn(SCARD_E_IN
6170: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 3b 0a 09  VALID_HANDLE);..
6180: 7d 0a 0a 09 73 63 61 72 64 5f 69 6e 54 72 61 6e  }...scard_inTran
6190: 73 61 63 74 69 6f 6e 20 3d 20 30 3b 0a 0a 09 72  saction = 0;...r
61a0: 65 74 75 72 6e 28 53 43 41 52 44 5f 53 5f 53 55  eturn(SCARD_S_SU
61b0: 43 43 45 53 53 29 3b 0a 7d 0a 0a 50 43 53 43 5f  CCESS);.}..PCSC_
61c0: 41 50 49 20 4c 4f 4e 47 20 53 43 61 72 64 53 74  API LONG SCardSt
61d0: 61 74 75 73 28 53 43 41 52 44 48 41 4e 44 4c 45  atus(SCARDHANDLE
61e0: 20 68 43 61 72 64 2c 20 4c 50 53 54 52 20 6d 73   hCard, LPSTR ms
61f0: 7a 52 65 61 64 65 72 4e 61 6d 65 2c 20 4c 50 44  zReaderName, LPD
6200: 57 4f 52 44 20 70 63 63 68 52 65 61 64 65 72 4c  WORD pcchReaderL
6210: 65 6e 2c 20 4c 50 44 57 4f 52 44 20 70 64 77 53  en, LPDWORD pdwS
6220: 74 61 74 65 2c 20 4c 50 44 57 4f 52 44 20 70 64  tate, LPDWORD pd
6230: 77 50 72 6f 74 6f 63 6f 6c 2c 20 4c 50 42 59 54  wProtocol, LPBYT
6240: 45 20 70 62 41 74 72 2c 20 4c 50 44 57 4f 52 44  E pbAtr, LPDWORD
6250: 20 70 63 62 41 74 72 4c 65 6e 29 20 7b 0a 09 4c   pcbAtrLen) {..L
6260: 4f 4e 47 20 73 63 61 72 64 6c 69 73 74 72 65 61  ONG scardlistrea
6270: 64 65 72 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  ders_ret;...CACK
6280: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6290: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 09 69 66 20  "Called");...if 
62a0: 28 68 43 61 72 64 20 21 3d 20 39 39 29 20 7b 0a  (hCard != 99) {.
62b0: 09 09 72 65 74 75 72 6e 28 53 43 41 52 44 5f 45  ..return(SCARD_E
62c0: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29  _INVALID_HANDLE)
62d0: 3b 0a 09 7d 0a 0a 09 2a 70 64 77 53 74 61 74 65  ;..}...*pdwState
62e0: 20 3d 20 30 3b 0a 09 73 63 61 72 64 6c 69 73 74   = 0;..scardlist
62f0: 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
6300: 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 34  ardListReaders(4
6310: 32 2c 20 4e 55 4c 4c 2c 20 6d 73 7a 52 65 61 64  2, NULL, mszRead
6320: 65 72 4e 61 6d 65 2c 20 70 63 63 68 52 65 61 64  erName, pcchRead
6330: 65 72 4c 65 6e 29 3b 0a 09 69 66 20 28 73 63 61  erLen);..if (sca
6340: 72 64 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  rdlistreaders_re
6350: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
6360: 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e  CESS) {...return
6370: 28 73 63 61 72 64 6c 69 73 74 72 65 61 64 65 72  (scardlistreader
6380: 73 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 64  s_ret);..}...*pd
6390: 77 50 72 6f 74 6f 63 6f 6c 20 3d 20 73 63 61 72  wProtocol = scar
63a0: 64 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 72 65  d_protocol;...re
63b0: 74 75 72 6e 28 53 43 41 52 44 5f 53 5f 53 55 43  turn(SCARD_S_SUC
63c0: 43 45 53 53 29 3b 0a 7d 0a 0a 50 43 53 43 5f 41  CESS);.}..PCSC_A
63d0: 50 49 20 4c 4f 4e 47 20 53 43 61 72 64 43 6f 6e  PI LONG SCardCon
63e0: 6e 65 63 74 28 53 43 41 52 44 43 4f 4e 54 45 58  nect(SCARDCONTEX
63f0: 54 20 68 43 6f 6e 74 65 78 74 2c 20 4c 50 43 53  T hContext, LPCS
6400: 54 52 20 73 7a 52 65 61 64 65 72 2c 20 44 57 4f  TR szReader, DWO
6410: 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20  RD dwShareMode, 
6420: 44 57 4f 52 44 20 64 77 50 72 65 66 65 72 72 65  DWORD dwPreferre
6430: 64 50 72 6f 74 6f 63 6f 6c 73 2c 20 4c 50 53 43  dProtocols, LPSC
6440: 41 52 44 48 41 4e 44 4c 45 20 70 68 43 61 72 64  ARDHANDLE phCard
6450: 2c 20 4c 50 44 57 4f 52 44 20 70 64 77 41 63 74  , LPDWORD pdwAct
6460: 69 76 65 50 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09  iveProtocol) {..
6470: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6480: 4e 54 46 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  NTF("Called");..
6490: 09 69 66 20 28 68 43 6f 6e 74 65 78 74 20 21 3d  .if (hContext !=
64a0: 20 34 32 29 20 7b 0a 09 09 72 65 74 75 72 6e 28   42) {...return(
64b0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
64c0: 48 41 4e 44 4c 45 29 3b 0a 09 7d 0a 0a 09 69 66  HANDLE);..}...if
64d0: 20 28 28 64 77 50 72 65 66 65 72 72 65 64 50 72   ((dwPreferredPr
64e0: 6f 74 6f 63 6f 6c 73 20 26 20 53 43 41 52 44 5f  otocols & SCARD_
64f0: 50 52 4f 54 4f 43 4f 4c 5f 54 30 29 20 3d 3d 20  PROTOCOL_T0) == 
6500: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
6510: 30 29 20 7b 0a 09 09 2a 70 64 77 41 63 74 69 76  0) {...*pdwActiv
6520: 65 50 72 6f 74 6f 63 6f 6c 20 3d 20 53 43 41 52  eProtocol = SCAR
6530: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3b 0a 09  D_PROTOCOL_T0;..
6540: 7d 20 65 6c 73 65 20 7b 0a 09 09 2a 70 64 77 41  } else {...*pdwA
6550: 63 74 69 76 65 50 72 6f 74 6f 63 6f 6c 20 3d 20  ctiveProtocol = 
6560: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
6570: 31 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 70 72  1;..}...scard_pr
6580: 6f 74 6f 63 6f 6c 20 3d 20 2a 70 64 77 41 63 74  otocol = *pdwAct
6590: 69 76 65 50 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 2a  iveProtocol;...*
65a0: 70 68 43 61 72 64 20 3d 20 39 39 3b 0a 0a 09 72  phCard = 99;...r
65b0: 65 74 75 72 6e 28 53 43 41 52 44 5f 53 5f 53 55  eturn(SCARD_S_SU
65c0: 43 43 45 53 53 29 3b 0a 7d 0a 0a 50 43 53 43 5f  CCESS);.}..PCSC_
65d0: 41 50 49 20 4c 4f 4e 47 20 53 43 61 72 64 44 69  API LONG SCardDi
65e0: 73 63 6f 6e 6e 65 63 74 28 53 43 41 52 44 48 41  sconnect(SCARDHA
65f0: 4e 44 4c 45 20 68 43 61 72 64 2c 20 44 57 4f 52  NDLE hCard, DWOR
6600: 44 20 64 77 44 69 73 70 6f 73 69 74 69 6f 6e 29  D dwDisposition)
6610: 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
6620: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 22  _PRINTF("Called"
6630: 29 3b 0a 0a 09 69 66 20 28 68 43 61 72 64 20 21  );...if (hCard !
6640: 3d 20 39 39 29 20 7b 0a 09 09 72 65 74 75 72 6e  = 99) {...return
6650: 28 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  (SCARD_E_INVALID
6660: 5f 48 41 4e 44 4c 45 29 3b 0a 09 7d 0a 0a 09 72  _HANDLE);..}...r
6670: 65 74 75 72 6e 28 53 43 41 52 44 5f 53 5f 53 55  eturn(SCARD_S_SU
6680: 43 43 45 53 53 29 3b 0a 7d 0a 0a 50 43 53 43 5f  CCESS);.}..PCSC_
6690: 41 50 49 20 4c 4f 4e 47 20 53 43 61 72 64 52 65  API LONG SCardRe
66a0: 63 6f 6e 6e 65 63 74 28 53 43 41 52 44 48 41 4e  connect(SCARDHAN
66b0: 44 4c 45 20 68 43 61 72 64 2c 20 44 57 4f 52 44  DLE hCard, DWORD
66c0: 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 44 57   dwShareMode, DW
66d0: 4f 52 44 20 64 77 50 72 65 66 65 72 72 65 64 50  ORD dwPreferredP
66e0: 72 6f 74 6f 63 6f 6c 73 2c 20 44 57 4f 52 44 20  rotocols, DWORD 
66f0: 64 77 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  dwInitialization
6700: 2c 20 4c 50 44 57 4f 52 44 20 70 64 77 41 63 74  , LPDWORD pdwAct
6710: 69 76 65 50 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09  iveProtocol) {..
6720: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6730: 4e 54 46 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  NTF("Called");..
6740: 09 69 66 20 28 68 43 61 72 64 20 21 3d 20 39 39  .if (hCard != 99
6750: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 53 43 41  ) {...return(SCA
6760: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
6770: 44 4c 45 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  DLE);..}...retur
6780: 6e 28 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 34  n(SCardConnect(4
6790: 32 2c 20 4e 55 4c 4c 2c 20 64 77 53 68 61 72 65  2, NULL, dwShare
67a0: 4d 6f 64 65 2c 20 64 77 50 72 65 66 65 72 72 65  Mode, dwPreferre
67b0: 64 50 72 6f 74 6f 63 6f 6c 73 2c 20 4e 55 4c 4c  dProtocols, NULL
67c0: 2c 20 70 64 77 41 63 74 69 76 65 50 72 6f 74 6f  , pdwActiveProto
67d0: 63 6f 6c 29 29 3b 0a 7d 0a 0a 50 43 53 43 5f 41  col));.}..PCSC_A
67e0: 50 49 20 4c 4f 4e 47 20 53 43 61 72 64 52 65 6c  PI LONG SCardRel
67f0: 65 61 73 65 43 6f 6e 74 65 78 74 28 53 43 41 52  easeContext(SCAR
6800: 44 43 4f 4e 54 45 58 54 20 68 43 6f 6e 74 65 78  DCONTEXT hContex
6810: 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
6820: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
6830: 64 22 29 3b 0a 0a 09 69 66 20 28 68 43 6f 6e 74  d");...if (hCont
6840: 65 78 74 20 21 3d 20 34 32 29 20 7b 0a 09 09 72  ext != 42) {...r
6850: 65 74 75 72 6e 28 53 43 41 52 44 5f 45 5f 49 4e  eturn(SCARD_E_IN
6860: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 3b 0a 09  VALID_HANDLE);..
6870: 7d 0a 0a 09 72 65 74 75 72 6e 28 53 43 41 52 44  }...return(SCARD
6880: 5f 53 5f 53 55 43 43 45 53 53 29 3b 0a 7d 0a 0a  _S_SUCCESS);.}..
6890: 50 43 53 43 5f 41 50 49 20 4c 4f 4e 47 20 53 43  PCSC_API LONG SC
68a0: 61 72 64 54 72 61 6e 73 6d 69 74 28 53 43 41 52  ardTransmit(SCAR
68b0: 44 48 41 4e 44 4c 45 20 68 43 61 72 64 2c 20 63  DHANDLE hCard, c
68c0: 6f 6e 73 74 20 53 43 41 52 44 5f 49 4f 5f 52 45  onst SCARD_IO_RE
68d0: 51 55 45 53 54 20 2a 70 69 6f 53 65 6e 64 50 63  QUEST *pioSendPc
68e0: 69 2c 20 4c 50 43 42 59 54 45 20 70 62 53 65 6e  i, LPCBYTE pbSen
68f0: 64 42 75 66 66 65 72 2c 20 44 57 4f 52 44 20 63  dBuffer, DWORD c
6900: 62 53 65 6e 64 4c 65 6e 67 74 68 2c 20 53 43 41  bSendLength, SCA
6910: 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 2a 70  RD_IO_REQUEST *p
6920: 69 6f 52 65 63 76 50 63 69 2c 20 4c 50 42 59 54  ioRecvPci, LPBYT
6930: 45 20 70 62 52 65 63 76 42 75 66 66 65 72 2c 20  E pbRecvBuffer, 
6940: 4c 50 44 57 4f 52 44 20 70 63 62 52 65 63 76 4c  LPDWORD pcbRecvL
6950: 65 6e 67 74 68 29 20 7b 0a 09 43 41 43 4b 45 59  ength) {..CACKEY
6960: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6970: 61 6c 6c 65 64 22 29 3b 0a 0a 09 69 66 20 28 68  alled");...if (h
6980: 43 61 72 64 20 21 3d 20 39 39 29 20 7b 0a 09 09  Card != 99) {...
6990: 72 65 74 75 72 6e 28 53 43 41 52 44 5f 45 5f 49  return(SCARD_E_I
69a0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 3b 0a  NVALID_HANDLE);.
69b0: 09 7d 0a 0a 09 70 62 52 65 63 76 42 75 66 66 65  .}...pbRecvBuffe
69c0: 72 5b 30 5d 20 3d 20 30 78 39 30 3b 0a 09 70 62  r[0] = 0x90;..pb
69d0: 52 65 63 76 42 75 66 66 65 72 5b 31 5d 20 3d 20  RecvBuffer[1] = 
69e0: 30 78 30 30 3b 0a 0a 09 2a 70 63 62 52 65 63 76  0x00;...*pcbRecv
69f0: 4c 65 6e 67 74 68 20 3d 20 32 3b 0a 0a 09 72 65  Length = 2;...re
6a00: 74 75 72 6e 28 53 43 41 52 44 5f 53 5f 53 55 43  turn(SCARD_S_SUC
6a10: 43 45 53 53 29 3b 0a 7d 0a 0a 2f 2a 20 41 6d 65  CESS);.}../* Ame
6a20: 72 69 63 61 6e 20 46 75 7a 7a 79 20 4c 6f 70 20  rican Fuzzy Lop 
6a30: 74 65 73 74 69 6e 67 20 70 72 6f 67 72 61 6d 20  testing program 
6a40: 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20  */.int main(int 
6a50: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
6a60: 76 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f  v) {..CK_FUNCTIO
6a70: 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63  N_LIST_PTR pFunc
6a80: 74 69 6f 6e 4c 69 73 74 3b 0a 09 43 4b 5f 52 56  tionList;..CK_RV
6a90: 20 28 2a 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f   (*C_CloseSessio
6aa0: 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
6ab0: 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 3d  NDLE hSession) =
6ac0: 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28 2a   NULL;..CK_RV (*
6ad0: 43 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56  C_Finalize)(CK_V
6ae0: 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65  OID_PTR pReserve
6af0: 64 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52  d) = NULL;..CK_R
6b00: 56 20 28 2a 43 5f 46 69 6e 64 4f 62 6a 65 63 74  V (*C_FindObject
6b10: 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  s)(CK_SESSION_HA
6b20: 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
6b30: 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
6b40: 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b  PTR phObject, CK
6b50: 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65  _ULONG ulMaxObje
6b60: 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e  ctCount, CK_ULON
6b70: 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43  G_PTR pulObjectC
6b80: 6f 75 6e 74 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43  ount) = NULL;..C
6b90: 4b 5f 52 56 20 28 2a 43 5f 46 69 6e 64 4f 62 6a  K_RV (*C_FindObj
6ba0: 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ectsFinal)(CK_SE
6bb0: 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
6bc0: 73 73 69 6f 6e 29 20 3d 20 4e 55 4c 4c 3b 0a 09  ssion) = NULL;..
6bd0: 43 4b 5f 52 56 20 28 2a 43 5f 46 69 6e 64 4f 62  CK_RV (*C_FindOb
6be0: 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53 45  jectsInit)(CK_SE
6bf0: 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
6c00: 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
6c10: 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
6c20: 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
6c30: 75 6e 74 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b  unt) = NULL;..CK
6c40: 5f 52 56 20 28 2a 43 5f 47 65 74 41 74 74 72 69  _RV (*C_GetAttri
6c50: 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45  buteValue)(CK_SE
6c60: 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
6c70: 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
6c80: 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
6c90: 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
6ca0: 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
6cb0: 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 3d  ULONG ulCount) =
6cc0: 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28 2a   NULL;..CK_RV (*
6cd0: 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 29 28 43  C_GetSlotList)(C
6ce0: 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65  K_BBOOL tokenPre
6cf0: 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44  sent, CK_SLOT_ID
6d00: 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20  _PTR pSlotList, 
6d10: 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
6d20: 43 6f 75 6e 74 29 20 3d 20 4e 55 4c 4c 3b 0a 09  Count) = NULL;..
6d30: 43 4b 5f 52 56 20 28 2a 43 5f 47 65 74 54 6f 6b  CK_RV (*C_GetTok
6d40: 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f  enInfo)(CK_SLOT_
6d50: 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f  ID slotID, CK_TO
6d60: 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  KEN_INFO_PTR pIn
6d70: 66 6f 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f  fo) = NULL;..CK_
6d80: 52 56 20 28 2a 43 5f 49 6e 69 74 69 61 6c 69 7a  RV (*C_Initializ
6d90: 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
6da0: 49 6e 69 74 41 72 67 73 29 20 3d 20 4e 55 4c 4c  InitArgs) = NULL
6db0: 3b 0a 09 43 4b 5f 52 56 20 28 2a 43 5f 4c 6f 67  ;..CK_RV (*C_Log
6dc0: 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  in)(CK_SESSION_H
6dd0: 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
6de0: 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65  CK_USER_TYPE use
6df0: 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48  rType, CK_UTF8CH
6e00: 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
6e10: 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20  ULONG ulPinLen) 
6e20: 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28  = NULL;..CK_RV (
6e30: 2a 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28  *C_OpenSession)(
6e40: 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
6e50: 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  D, CK_FLAGS flag
6e60: 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  s, CK_VOID_PTR p
6e70: 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f  Application, CK_
6e80: 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43  NOTIFY notify, C
6e90: 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
6ea0: 5f 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20  _PTR phSession) 
6eb0: 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56 20 28  = NULL;..CK_RV (
6ec0: 2a 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53  *C_Sign)(CK_SESS
6ed0: 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
6ee0: 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
6ef0: 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
6f00: 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
6f10: 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
6f20: 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
6f30: 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
6f40: 29 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 52 56  ) = NULL;..CK_RV
6f50: 20 28 2a 43 5f 53 69 67 6e 49 6e 69 74 29 28 43   (*C_SignInit)(C
6f60: 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
6f70: 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
6f80: 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
6f90: 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
6fa0: 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 3d  T_HANDLE hKey) =
6fb0: 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 43 5f 49 4e 49   NULL;..CK_C_INI
6fc0: 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 69 6e 69  TIALIZE_ARGS ini
6fd0: 74 61 72 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  targs;..CK_ULONG
6fe0: 20 6e 75 6d 53 6c 6f 74 73 3b 0a 09 43 4b 5f 53   numSlots;..CK_S
6ff0: 4c 4f 54 5f 49 44 5f 50 54 52 20 73 6c 6f 74 73  LOT_ID_PTR slots
7000: 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 54 4f 4b   = NULL;..CK_TOK
7010: 45 4e 5f 49 4e 46 4f 20 74 6f 6b 65 6e 49 6e 66  EN_INFO tokenInf
7020: 6f 3b 0a 09 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  o;..CK_SESSION_H
7030: 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 3b 0a  ANDLE hSession;.
7040: 09 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  .CK_OBJECT_HANDL
7050: 45 20 68 4f 62 6a 65 63 74 2c 20 2a 70 72 69 76  E hObject, *priv
7060: 61 74 65 4b 65 79 4f 62 6a 65 63 74 73 5f 72 6f  ateKeyObjects_ro
7070: 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 70 72 69 76  ot = NULL, *priv
7080: 61 74 65 4b 65 79 4f 62 6a 65 63 74 73 2c 20 2a  ateKeyObjects, *
7090: 63 75 72 72 50 72 69 76 4b 65 79 3b 0a 09 43 4b  currPrivKey;..CK
70a0: 5f 55 4c 4f 4e 47 20 75 6c 4f 62 6a 65 63 74 43  _ULONG ulObjectC
70b0: 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42  ount;..CK_ATTRIB
70c0: 55 54 45 20 74 65 6d 70 6c 61 74 65 5b 5d 20 3d  UTE template[] =
70d0: 20 7b 0a 09 20 20 20 20 20 20 20 20 20 20 20 20   {..            
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
70f0: 43 4b 41 5f 43 4c 41 53 53 2c 20 4e 55 4c 4c 2c  CKA_CLASS, NULL,
7100: 20 30 7d 2c 0a 09 20 20 20 20 20 20 20 20 20 20   0},..          
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7120: 20 7b 43 4b 41 5f 54 4f 4b 45 4e 2c 20 4e 55 4c   {CKA_TOKEN, NUL
7130: 4c 2c 20 30 7d 2c 0a 09 20 20 20 20 20 20 20 20  L, 0},..        
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 20 7b 43 4b 41 5f 4c 41 42 45 4c 2c 20 4e     {CKA_LABEL, N
7160: 55 4c 4c 2c 20 30 7d 2c 0a 09 20 20 20 20 20 20  ULL, 0},..      
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 20 20 20 20 20 7b 43 4b 41 5f 50 52 49 56 41 54       {CKA_PRIVAT
7190: 45 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 20 20  E, NULL, 0},..  
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71b0: 20 20 20 20 20 20 20 20 20 7b 43 4b 41 5f 49 44           {CKA_ID
71c0: 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 20 20 20  , NULL, 0},..   
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 20 20 20 20 20 20 20 7b 43 4b 41 5f 53 45 52          {CKA_SER
71f0: 49 41 4c 5f 4e 55 4d 42 45 52 2c 20 4e 55 4c 4c  IAL_NUMBER, NULL
7200: 2c 20 30 7d 2c 0a 09 20 20 20 20 20 20 20 20 20  , 0},..         
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 20 7b 43 4b 41 5f 53 55 42 4a 45 43 54 2c 20    {CKA_SUBJECT, 
7230: 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 20 20 20 20 20  NULL, 0},..     
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7250: 20 20 20 20 20 20 7b 43 4b 41 5f 49 53 53 55 45        {CKA_ISSUE
7260: 52 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 20 20  R, NULL, 0},..  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 20 20 20 20 20 20 20 7b 43 4b 41 5f 43 45           {CKA_CE
7290: 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 2c 20  RTIFICATE_TYPE, 
72a0: 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 20 20 20 20 20  NULL, 0},..     
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72c0: 20 20 20 20 20 20 7b 43 4b 41 5f 4b 45 59 5f 54        {CKA_KEY_T
72d0: 59 50 45 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09  YPE, NULL, 0},..
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72f0: 20 20 20 20 20 20 20 20 20 20 20 7b 43 4b 41 5f             {CKA_
7300: 53 49 47 4e 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a  SIGN, NULL, 0},.
7310: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7320: 20 20 20 20 20 20 20 20 20 20 20 20 7b 43 4b 41              {CKA
7330: 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 20 30 7d  _VALUE, NULL, 0}
7340: 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41 5f 43 45  ,.....   {CKA_CE
7350: 52 54 5f 4d 44 35 5f 48 41 53 48 2c 20 4e 55 4c  RT_MD5_HASH, NUL
7360: 4c 2c 20 30 7d 2c 0a 09 09 09 09 20 20 20 7b 43  L, 0},.....   {C
7370: 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53  KA_CERT_SHA1_HAS
7380: 48 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09 09  H, NULL, 0},....
7390: 09 20 20 20 7b 43 4b 41 5f 54 52 55 53 54 45 44  .   {CKA_TRUSTED
73a0: 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09 09 09  , NULL, 0},.....
73b0: 20 20 20 7b 43 4b 41 5f 54 52 55 53 54 5f 43 4c     {CKA_TRUST_CL
73c0: 49 45 4e 54 5f 41 55 54 48 2c 20 4e 55 4c 4c 2c  IENT_AUTH, NULL,
73d0: 20 30 7d 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41   0},.....   {CKA
73e0: 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
73f0: 49 4e 47 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09  ING, NULL, 0},..
7400: 09 09 09 20 20 20 7b 43 4b 41 5f 54 52 55 53 54  ...   {CKA_TRUST
7410: 5f 43 52 4c 5f 53 49 47 4e 2c 20 4e 55 4c 4c 2c  _CRL_SIGN, NULL,
7420: 20 30 7d 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41   0},.....   {CKA
7430: 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49  _TRUST_DATA_ENCI
7440: 50 48 45 52 4d 45 4e 54 2c 20 4e 55 4c 4c 2c 20  PHERMENT, NULL, 
7450: 30 7d 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41 5f  0},.....   {CKA_
7460: 54 52 55 53 54 5f 44 49 47 49 54 41 4c 5f 53 49  TRUST_DIGITAL_SI
7470: 47 4e 41 54 55 52 45 2c 20 4e 55 4c 4c 2c 20 30  GNATURE, NULL, 0
7480: 7d 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41 5f 54  },.....   {CKA_T
7490: 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45  RUST_EMAIL_PROTE
74a0: 43 54 49 4f 4e 2c 20 4e 55 4c 4c 2c 20 30 7d 2c  CTION, NULL, 0},
74b0: 0a 09 09 09 09 20 20 20 7b 43 4b 41 5f 54 52 55  .....   {CKA_TRU
74c0: 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54  ST_KEY_AGREEMENT
74d0: 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 09 09 09  , NULL, 0},.....
74e0: 20 20 20 7b 43 4b 41 5f 54 52 55 53 54 5f 4b 45     {CKA_TRUST_KE
74f0: 59 5f 43 45 52 54 5f 53 49 47 4e 2c 20 4e 55 4c  Y_CERT_SIGN, NUL
7500: 4c 2c 20 30 7d 2c 0a 09 09 09 09 20 20 20 7b 43  L, 0},.....   {C
7510: 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e 43  KA_TRUST_KEY_ENC
7520: 49 50 48 45 52 4d 45 4e 54 2c 20 4e 55 4c 4c 2c  IPHERMENT, NULL,
7530: 20 30 7d 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41   0},.....   {CKA
7540: 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44  _TRUST_NON_REPUD
7550: 49 41 54 49 4f 4e 2c 20 4e 55 4c 4c 2c 20 30 7d  IATION, NULL, 0}
7560: 2c 0a 09 09 09 09 20 20 20 7b 43 4b 41 5f 54 52  ,.....   {CKA_TR
7570: 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 2c  UST_SERVER_AUTH,
7580: 20 4e 55 4c 4c 2c 20 30 7d 0a 09 20 20 20 20 20   NULL, 0}..     
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 20 20 20 20 20 7d 2c 20 2a 63 75 72 72 5f 61 74       }, *curr_at
75b0: 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75  tr;..CK_ULONG cu
75c0: 72 72 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b  rr_attr_idx;..CK
75d0: 5f 55 4c 4f 4e 47 20 62 79 74 65 5f 69 64 78 3b  _ULONG byte_idx;
75e0: 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53  ..CK_OBJECT_CLAS
75f0: 53 20 6f 62 6a 65 63 74 43 6c 61 73 73 3b 0a 09  S objectClass;..
7600: 43 4b 5f 42 59 54 45 20 73 69 67 6e 61 74 75 72  CK_BYTE signatur
7610: 65 5b 31 30 32 34 5d 3b 0a 09 43 4b 5f 55 4c 4f  e[1024];..CK_ULO
7620: 4e 47 20 73 69 67 6e 61 74 75 72 65 5f 6c 65 6e  NG signature_len
7630: 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 20  ;..CK_MECHANISM 
7640: 6d 65 63 68 61 6e 69 73 6d 20 3d 20 7b 43 4b 4d  mechanism = {CKM
7650: 5f 52 53 41 5f 50 4b 43 53 2c 20 4e 55 4c 4c 2c  _RSA_PKCS, NULL,
7660: 20 30 7d 3b 0a 09 43 4b 5f 52 56 20 63 68 6b 5f   0};..CK_RV chk_
7670: 72 76 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61  rv;..ssize_t rea
7680: 64 5f 72 65 74 3b 0a 09 63 68 61 72 20 64 61 74  d_ret;..char dat
7690: 61 5b 38 31 39 32 5d 2c 20 2a 66 69 6c 65 4e 61  a[8192], *fileNa
76a0: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69  me = NULL;..unsi
76b0: 67 6e 65 64 20 6c 6f 6e 67 20 64 61 74 61 5f 6c  gned long data_l
76c0: 65 6e 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 69 6e  en;..int fd;..in
76d0: 74 20 69 3b 0a 09 69 6e 74 20 69 6e 69 74 69 61  t i;..int initia
76e0: 6c 69 7a 65 64 20 3d 20 30 3b 0a 09 69 6e 74 20  lized = 0;..int 
76f0: 72 65 74 76 61 6c 20 3d 20 31 3b 0a 0a 09 66 69  retval = 1;...fi
7700: 6c 65 4e 61 6d 65 20 3d 20 61 72 67 76 5b 31 5d  leName = argv[1]
7710: 3b 0a 09 69 66 20 28 66 69 6c 65 4e 61 6d 65 20  ;..if (fileName 
7720: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 67 6f 74  == NULL) {...got
7730: 6f 20 63 6c 65 61 6e 75 70 3b 0a 09 7d 0a 0a 09  o cleanup;..}...
7740: 66 64 20 3d 20 6f 70 65 6e 28 66 69 6c 65 4e 61  fd = open(fileNa
7750: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09  me, O_RDONLY);..
7760: 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09  if (fd < 0) {...
7770: 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 09 7d  goto cleanup;..}
7780: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 72 65  ...read_ret = re
7790: 61 64 28 66 64 2c 20 64 61 74 61 2c 20 73 69 7a  ad(fd, data, siz
77a0: 65 6f 66 28 64 61 74 61 29 29 3b 0a 09 69 66 20  eof(data));..if 
77b0: 28 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  (read_ret < 0) {
77c0: 0a 09 09 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b  ...goto cleanup;
77d0: 0a 09 7d 0a 0a 09 64 61 74 61 5f 6c 65 6e 20 3d  ..}...data_len =
77e0: 20 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 6c 6f   read_ret;...clo
77f0: 73 65 28 66 64 29 3b 0a 0a 09 63 68 6b 5f 72 76  se(fd);...chk_rv
7800: 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e   = C_GetFunction
7810: 4c 69 73 74 28 26 70 46 75 6e 63 74 69 6f 6e 4c  List(&pFunctionL
7820: 69 73 74 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72  ist);..if (chk_r
7830: 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  v != CKR_OK) {..
7840: 09 70 72 69 6e 74 66 28 22 43 5f 47 65 74 46 75  .printf("C_GetFu
7850: 6e 63 74 69 6f 6e 4c 69 73 74 28 29 20 66 61 69  nctionList() fai
7860: 6c 65 64 2e 22 29 3b 0a 0a 09 09 67 6f 74 6f 20  led.");....goto 
7870: 63 6c 65 61 6e 75 70 3b 0a 09 7d 0a 0a 09 43 5f  cleanup;..}...C_
7880: 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20 70  CloseSession = p
7890: 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
78a0: 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09 43  CloseSession;..C
78b0: 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 70 46 75 6e  _Finalize = pFun
78c0: 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
78d0: 61 6c 69 7a 65 3b 0a 09 43 5f 46 69 6e 64 4f 62  alize;..C_FindOb
78e0: 6a 65 63 74 73 20 3d 20 70 46 75 6e 63 74 69 6f  jects = pFunctio
78f0: 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
7900: 65 63 74 73 3b 0a 09 43 5f 46 69 6e 64 4f 62 6a  ects;..C_FindObj
7910: 65 63 74 73 46 69 6e 61 6c 20 3d 20 70 46 75 6e  ectsFinal = pFun
7920: 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
7930: 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09  dObjectsFinal;..
7940: 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
7950: 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t = pFunctionLis
7960: 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
7970: 49 6e 69 74 3b 0a 09 43 5f 47 65 74 41 74 74 72  Init;..C_GetAttr
7980: 69 62 75 74 65 56 61 6c 75 65 20 3d 20 70 46 75  ibuteValue = pFu
7990: 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
79a0: 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b  tAttributeValue;
79b0: 0a 09 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20  ..C_GetSlotList 
79c0: 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  = pFunctionList-
79d0: 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a  >C_GetSlotList;.
79e0: 09 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20  .C_GetTokenInfo 
79f0: 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  = pFunctionList-
7a00: 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b  >C_GetTokenInfo;
7a10: 0a 09 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d  ..C_Initialize =
7a20: 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e   pFunctionList->
7a30: 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 43  C_Initialize;..C
7a40: 5f 4c 6f 67 69 6e 20 3d 20 70 46 75 6e 63 74 69  _Login = pFuncti
7a50: 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 3b  onList->C_Login;
7a60: 0a 09 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20  ..C_OpenSession 
7a70: 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  = pFunctionList-
7a80: 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a  >C_OpenSession;.
7a90: 09 43 5f 53 69 67 6e 20 3d 20 70 46 75 6e 63 74  .C_Sign = pFunct
7aa0: 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 3b  ionList->C_Sign;
7ab0: 0a 09 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 70  ..C_SignInit = p
7ac0: 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
7ad0: 53 69 67 6e 49 6e 69 74 3b 0a 0a 09 70 72 69 76  SignInit;...priv
7ae0: 61 74 65 4b 65 79 4f 62 6a 65 63 74 73 20 3d 20  ateKeyObjects = 
7af0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
7b00: 72 69 76 61 74 65 4b 65 79 4f 62 6a 65 63 74 73  rivateKeyObjects
7b10: 29 20 2a 20 31 30 32 34 29 3b 0a 09 70 72 69 76  ) * 1024);..priv
7b20: 61 74 65 4b 65 79 4f 62 6a 65 63 74 73 5f 72 6f  ateKeyObjects_ro
7b30: 6f 74 20 3d 20 70 72 69 76 61 74 65 4b 65 79 4f  ot = privateKeyO
7b40: 62 6a 65 63 74 73 3b 0a 09 66 6f 72 20 28 69 20  bjects;..for (i 
7b50: 3d 20 30 3b 20 69 20 3c 20 31 30 32 34 3b 20 69  = 0; i < 1024; i
7b60: 2b 2b 29 20 7b 0a 09 09 70 72 69 76 61 74 65 4b  ++) {...privateK
7b70: 65 79 4f 62 6a 65 63 74 73 5b 69 5d 20 3d 20 43  eyObjects[i] = C
7b80: 4b 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  K_INVALID_HANDLE
7b90: 3b 0a 09 7d 0a 0a 09 69 6e 69 74 61 72 67 73 2e  ;..}...initargs.
7ba0: 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55  CreateMutex = NU
7bb0: 4c 4c 3b 0a 09 69 6e 69 74 61 72 67 73 2e 44 65  LL;..initargs.De
7bc0: 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c  stroyMutex = NUL
7bd0: 4c 3b 0a 09 69 6e 69 74 61 72 67 73 2e 4c 6f 63  L;..initargs.Loc
7be0: 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  kMutex = NULL;..
7bf0: 69 6e 69 74 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  initargs.UnlockM
7c00: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e  utex = NULL;..in
7c10: 69 74 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 43  itargs.flags = C
7c20: 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
7c30: 3b 0a 09 69 6e 69 74 61 72 67 73 2e 70 52 65 73  ;..initargs.pRes
7c40: 65 72 76 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  erved = NULL;...
7c50: 63 68 6b 5f 72 76 20 3d 20 43 5f 49 6e 69 74 69  chk_rv = C_Initi
7c60: 61 6c 69 7a 65 28 26 69 6e 69 74 61 72 67 73 29  alize(&initargs)
7c70: 3b 0a 09 69 66 20 28 63 68 6b 5f 72 76 20 21 3d  ;..if (chk_rv !=
7c80: 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 6e 69   CKR_OK) {...ini
7c90: 74 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  targs.CreateMute
7ca0: 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 6e 69 74  x = NULL;...init
7cb0: 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65  args.DestroyMute
7cc0: 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 6e 69 74  x = NULL;...init
7cd0: 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d  args.LockMutex =
7ce0: 20 4e 55 4c 4c 3b 0a 09 09 69 6e 69 74 61 72 67   NULL;...initarg
7cf0: 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20  s.UnlockMutex = 
7d00: 4e 55 4c 4c 3b 0a 09 09 69 6e 69 74 61 72 67 73  NULL;...initargs
7d10: 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 69 6e  .flags = 0;...in
7d20: 69 74 61 72 67 73 2e 70 52 65 73 65 72 76 65 64  itargs.pReserved
7d30: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 63 68 6b 5f   = NULL;....chk_
7d40: 72 76 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a  rv = C_Initializ
7d50: 65 28 26 69 6e 69 74 61 72 67 73 29 3b 0a 09 09  e(&initargs);...
7d60: 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b  if (chk_rv != CK
7d70: 52 5f 4f 4b 29 20 7b 0a 09 09 09 70 72 69 6e 74  R_OK) {....print
7d80: 66 28 22 43 5f 49 6e 69 74 69 61 6c 69 7a 65 28  f("C_Initialize(
7d90: 29 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  ) failed.");....
7da0: 09 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 09  .goto cleanup;..
7db0: 09 7d 0a 09 7d 0a 0a 09 69 6e 69 74 69 61 6c 69  .}..}...initiali
7dc0: 7a 65 64 20 3d 20 31 3b 0a 0a 09 63 68 6b 5f 72  zed = 1;...chk_r
7dd0: 76 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73  v = C_GetSlotLis
7de0: 74 28 46 41 4c 53 45 2c 20 4e 55 4c 4c 2c 20 26  t(FALSE, NULL, &
7df0: 6e 75 6d 53 6c 6f 74 73 29 3b 0a 09 69 66 20 28  numSlots);..if (
7e00: 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b  chk_rv != CKR_OK
7e10: 29 20 7b 0a 09 09 67 6f 74 6f 20 63 6c 65 61 6e  ) {...goto clean
7e20: 75 70 3b 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d  up;..}...if (num
7e30: 53 6c 6f 74 73 20 3d 3d 20 30 29 20 7b 0a 09 09  Slots == 0) {...
7e40: 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 09 7d  goto cleanup;..}
7e50: 0a 0a 09 73 6c 6f 74 73 20 3d 20 6d 61 6c 6c 6f  ...slots = mallo
7e60: 63 28 73 69 7a 65 6f 66 28 2a 73 6c 6f 74 73 29  c(sizeof(*slots)
7e70: 20 2a 20 6e 75 6d 53 6c 6f 74 73 29 3b 0a 0a 09   * numSlots);...
7e80: 69 66 20 28 73 6c 6f 74 73 20 3d 3d 20 4e 55 4c  if (slots == NUL
7e90: 4c 29 20 7b 0a 09 09 67 6f 74 6f 20 63 6c 65 61  L) {...goto clea
7ea0: 6e 75 70 3b 0a 09 7d 0a 0a 09 63 68 6b 5f 72 76  nup;..}...chk_rv
7eb0: 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74   = C_GetSlotList
7ec0: 28 46 41 4c 53 45 2c 20 73 6c 6f 74 73 2c 20 26  (FALSE, slots, &
7ed0: 6e 75 6d 53 6c 6f 74 73 29 3b 0a 09 69 66 20 28  numSlots);..if (
7ee0: 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b  chk_rv != CKR_OK
7ef0: 29 20 7b 0a 09 09 67 6f 74 6f 20 63 6c 65 61 6e  ) {...goto clean
7f00: 75 70 3b 0a 09 7d 0a 0a 09 63 68 6b 5f 72 76 20  up;..}...chk_rv 
7f10: 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 28  = C_OpenSession(
7f20: 73 6c 6f 74 73 5b 30 5d 2c 20 43 4b 46 5f 53 45  slots[0], CKF_SE
7f30: 52 49 41 4c 5f 53 45 53 53 49 4f 4e 2c 20 4e 55  RIAL_SESSION, NU
7f40: 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 68 53 65 73 73  LL, NULL, &hSess
7f50: 69 6f 6e 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72  ion);..if (chk_r
7f60: 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  v != CKR_OK) {..
7f70: 09 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 09  .goto cleanup;..
7f80: 7d 0a 0a 09 63 68 6b 5f 72 76 20 3d 20 43 5f 47  }...chk_rv = C_G
7f90: 65 74 54 6f 6b 65 6e 49 6e 66 6f 28 73 6c 6f 74  etTokenInfo(slot
7fa0: 73 5b 30 5d 2c 20 26 74 6f 6b 65 6e 49 6e 66 6f  s[0], &tokenInfo
7fb0: 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72 76 20 21  );..if (chk_rv !
7fc0: 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 67 6f  = CKR_OK) {...go
7fd0: 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 09 7d 0a 0a  to cleanup;..}..
7fe0: 09 69 66 20 28 28 74 6f 6b 65 6e 49 6e 66 6f 2e  .if ((tokenInfo.
7ff0: 66 6c 61 67 73 20 26 20 43 4b 46 5f 4c 4f 47 49  flags & CKF_LOGI
8000: 4e 5f 52 45 51 55 49 52 45 44 29 20 3d 3d 20 43  N_REQUIRED) == C
8010: 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
8020: 44 20 26 26 20 28 74 6f 6b 65 6e 49 6e 66 6f 2e  D && (tokenInfo.
8030: 66 6c 61 67 73 20 26 20 43 4b 46 5f 50 52 4f 54  flags & CKF_PROT
8040: 45 43 54 45 44 5f 41 55 54 48 45 4e 54 49 43 41  ECTED_AUTHENTICA
8050: 54 49 4f 4e 5f 50 41 54 48 29 20 3d 3d 20 30 29  TION_PATH) == 0)
8060: 20 7b 0a 09 09 70 72 69 6e 74 66 28 22 55 6e 61   {...printf("Una
8070: 62 6c 65 20 74 6f 20 6c 6f 67 69 6e 20 74 6f 20  ble to login to 
8080: 63 61 72 64 2e 5c 6e 22 29 3b 0a 0a 09 09 67 6f  card.\n");....go
8090: 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 09 7d 0a 0a  to cleanup;..}..
80a0: 09 63 68 6b 5f 72 76 20 3d 20 43 5f 4c 6f 67 69  .chk_rv = C_Logi
80b0: 6e 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f  n(hSession, CKU_
80c0: 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  USER, NULL, 0);.
80d0: 09 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43  .if (chk_rv != C
80e0: 4b 52 5f 4f 4b 29 20 7b 0a 09 09 70 72 69 6e 74  KR_OK) {...print
80f0: 66 28 22 4c 6f 67 69 6e 20 74 6f 20 64 65 76 69  f("Login to devi
8100: 63 65 20 66 61 69 6c 65 64 2e 5c 6e 22 29 3b 0a  ce failed.\n");.
8110: 0a 09 09 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b  ...goto cleanup;
8120: 0a 09 7d 0a 0a 09 63 68 6b 5f 72 76 20 3d 20 43  ..}...chk_rv = C
8130: 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
8140: 28 68 53 65 73 73 69 6f 6e 2c 20 4e 55 4c 4c 2c  (hSession, NULL,
8150: 20 30 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72 76   0);..if (chk_rv
8160: 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
8170: 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 09 7d  goto cleanup;..}
8180: 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09  ...while (1) {..
8190: 09 63 68 6b 5f 72 76 20 3d 20 43 5f 46 69 6e 64  .chk_rv = C_Find
81a0: 4f 62 6a 65 63 74 73 28 68 53 65 73 73 69 6f 6e  Objects(hSession
81b0: 2c 20 26 68 4f 62 6a 65 63 74 2c 20 31 2c 20 26  , &hObject, 1, &
81c0: 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a  ulObjectCount);.
81d0: 09 09 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20  ..if (chk_rv != 
81e0: 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 70 72 69  CKR_OK) {....pri
81f0: 6e 74 66 28 22 46 69 6e 64 4f 62 6a 65 63 74 73  ntf("FindObjects
8200: 28 29 20 66 61 69 6c 65 64 2e 5c 6e 22 29 3b 0a  () failed.\n");.
8210: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
8220: 09 69 66 20 28 75 6c 4f 62 6a 65 63 74 43 6f 75  .if (ulObjectCou
8230: 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 62 72  nt == 0) {....br
8240: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  eak;...}....if (
8250: 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 21 3d  ulObjectCount !=
8260: 20 31 29 20 7b 0a 09 09 09 70 72 69 6e 74 66 28   1) {....printf(
8270: 22 46 69 6e 64 4f 62 6a 65 63 74 73 28 29 20 72  "FindObjects() r
8280: 65 74 75 72 6e 65 64 20 61 20 77 65 69 72 64 20  eturned a weird 
8290: 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  number of object
82a0: 73 2e 20 20 41 73 6b 65 64 20 66 6f 72 20 31 2c  s.  Asked for 1,
82b0: 20 67 6f 74 20 25 6c 75 2e 5c 6e 22 2c 20 75 6c   got %lu.\n", ul
82c0: 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 09 09  ObjectCount);...
82d0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66  .break;...}....f
82e0: 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64  or (curr_attr_id
82f0: 78 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72  x = 0; curr_attr
8300: 5f 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 74  _idx < (sizeof(t
8310: 65 6d 70 6c 61 74 65 29 20 2f 20 73 69 7a 65 6f  emplate) / sizeo
8320: 66 28 74 65 6d 70 6c 61 74 65 5b 30 5d 29 29 3b  f(template[0]));
8330: 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b   curr_attr_idx++
8340: 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72  ) {....curr_attr
8350: 20 3d 20 26 74 65 6d 70 6c 61 74 65 5b 63 75 72   = &template[cur
8360: 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 09 09 09  r_attr_idx];....
8370: 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  if (curr_attr->p
8380: 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65  Value) {.....fre
8390: 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  e(curr_attr->pVa
83a0: 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  lue);....}.....c
83b0: 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
83c0: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09   = NULL;...}....
83d0: 63 68 6b 5f 72 76 20 3d 20 43 5f 47 65 74 41 74  chk_rv = C_GetAt
83e0: 74 72 69 62 75 74 65 56 61 6c 75 65 28 68 53 65  tributeValue(hSe
83f0: 73 73 69 6f 6e 2c 20 68 4f 62 6a 65 63 74 2c 20  ssion, hObject, 
8400: 26 74 65 6d 70 6c 61 74 65 5b 30 5d 2c 20 73 69  &template[0], si
8410: 7a 65 6f 66 28 74 65 6d 70 6c 61 74 65 29 20 2f  zeof(template) /
8420: 20 73 69 7a 65 6f 66 28 74 65 6d 70 6c 61 74 65   sizeof(template
8430: 5b 30 5d 29 29 3b 0a 09 09 69 66 20 28 63 68 6b  [0]));...if (chk
8440: 5f 72 76 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49  _rv == CKR_ATTRI
8450: 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
8460: 44 20 7c 7c 20 63 68 6b 5f 72 76 20 3d 3d 20 43  D || chk_rv == C
8470: 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 53 45 4e  KR_ATTRIBUTE_SEN
8480: 53 49 54 49 56 45 20 7c 7c 20 63 68 6b 5f 72 76  SITIVE || chk_rv
8490: 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   == CKR_BUFFER_T
84a0: 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 63  OO_SMALL) {....c
84b0: 68 6b 5f 72 76 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  hk_rv = CKR_OK;.
84c0: 09 09 7d 0a 0a 09 09 69 66 20 28 63 68 6b 5f 72  ..}....if (chk_r
84d0: 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  v != CKR_OK) {..
84e0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
84f0: 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
8500: 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f  r_idx = 0; curr_
8510: 61 74 74 72 5f 69 64 78 20 3c 20 28 73 69 7a 65  attr_idx < (size
8520: 6f 66 28 74 65 6d 70 6c 61 74 65 29 20 2f 20 73  of(template) / s
8530: 69 7a 65 6f 66 28 74 65 6d 70 6c 61 74 65 5b 30  izeof(template[0
8540: 5d 29 29 3b 20 63 75 72 72 5f 61 74 74 72 5f 69  ])); curr_attr_i
8550: 64 78 2b 2b 29 20 7b 0a 09 09 09 63 75 72 72 5f  dx++) {....curr_
8560: 61 74 74 72 20 3d 20 26 74 65 6d 70 6c 61 74 65  attr = &template
8570: 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b  [curr_attr_idx];
8580: 0a 0a 09 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f  .....if (((CK_LO
8590: 4e 47 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 75  NG) curr_attr->u
85a0: 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28  lValueLen) != ((
85b0: 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a  CK_LONG) -1)) {.
85c0: 09 09 09 09 63 75 72 72 5f 61 74 74 72 2d 3e 70  ....curr_attr->p
85d0: 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63  Value = malloc(c
85e0: 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
85f0: 65 4c 65 6e 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  eLen);....}...}.
8600: 0a 09 09 63 68 6b 5f 72 76 20 3d 20 43 5f 47 65  ...chk_rv = C_Ge
8610: 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 28  tAttributeValue(
8620: 68 53 65 73 73 69 6f 6e 2c 20 68 4f 62 6a 65 63  hSession, hObjec
8630: 74 2c 20 26 74 65 6d 70 6c 61 74 65 5b 30 5d 2c  t, &template[0],
8640: 20 73 69 7a 65 6f 66 28 74 65 6d 70 6c 61 74 65   sizeof(template
8650: 29 20 2f 20 73 69 7a 65 6f 66 28 74 65 6d 70 6c  ) / sizeof(templ
8660: 61 74 65 5b 30 5d 29 29 3b 0a 09 09 69 66 20 28  ate[0]));...if (
8670: 63 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 4f 4b  chk_rv == CKR_OK
8680: 20 7c 7c 20 63 68 6b 5f 72 76 20 3d 3d 20 43 4b   || chk_rv == CK
8690: 52 5f 41 54 54 52 49 42 55 54 45 5f 53 45 4e 53  R_ATTRIBUTE_SENS
86a0: 49 54 49 56 45 20 7c 7c 20 63 68 6b 5f 72 76 20  ITIVE || chk_rv 
86b0: 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45  == CKR_ATTRIBUTE
86c0: 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 7c 7c  _TYPE_INVALID ||
86d0: 20 63 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 42   chk_rv == CKR_B
86e0: 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
86f0: 20 7b 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f   {....for (curr_
8700: 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75  attr_idx = 0; cu
8710: 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 28 73  rr_attr_idx < (s
8720: 69 7a 65 6f 66 28 74 65 6d 70 6c 61 74 65 29 20  izeof(template) 
8730: 2f 20 73 69 7a 65 6f 66 28 74 65 6d 70 6c 61 74  / sizeof(templat
8740: 65 5b 30 5d 29 29 3b 20 63 75 72 72 5f 61 74 74  e[0])); curr_att
8750: 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63  r_idx++) {.....c
8760: 75 72 72 5f 61 74 74 72 20 3d 20 26 74 65 6d 70  urr_attr = &temp
8770: 6c 61 74 65 5b 63 75 72 72 5f 61 74 74 72 5f 69  late[curr_attr_i
8780: 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75  dx];......if (cu
8790: 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29  rr_attr->pValue)
87a0: 20 7b 0a 09 09 09 09 09 73 77 69 74 63 68 20 28   {......switch (
87b0: 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29  curr_attr->type)
87c0: 20 7b 0a 09 09 09 09 09 09 63 61 73 65 20 43 4b   {.......case CK
87d0: 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 09 09 09  A_CLASS:........
87e0: 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 2a 28  objectClass = *(
87f0: 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53  (CK_OBJECT_CLASS
8800: 20 2a 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 70   *) curr_attr->p
8810: 56 61 6c 75 65 29 3b 0a 0a 09 09 09 09 09 09 09  Value);.........
8820: 69 66 20 28 6f 62 6a 65 63 74 43 6c 61 73 73 20  if (objectClass 
8830: 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
8840: 45 59 29 20 7b 0a 09 09 09 09 09 09 09 09 2a 70  EY) {.........*p
8850: 72 69 76 61 74 65 4b 65 79 4f 62 6a 65 63 74 73  rivateKeyObjects
8860: 20 3d 20 68 4f 62 6a 65 63 74 3b 0a 09 09 09 09   = hObject;.....
8870: 09 09 09 09 70 72 69 76 61 74 65 4b 65 79 4f 62  ....privateKeyOb
8880: 6a 65 63 74 73 2b 2b 3b 0a 09 09 09 09 09 09 09  jects++;........
8890: 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 20 65  }......}.....} e
88a0: 6c 73 65 20 7b 0a 09 09 09 09 09 66 72 65 65 28  lse {......free(
88b0: 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
88c0: 65 29 3b 0a 09 09 09 09 09 63 75 72 72 5f 61 74  e);......curr_at
88d0: 74 72 2d 3e 70 56 61 6c 75 65 20 3d 20 4e 55 4c  tr->pValue = NUL
88e0: 4c 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09  L;.....}....}...
88f0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 70 72 69 6e  } else {....prin
8900: 74 66 28 22 47 65 74 41 74 74 72 69 62 75 74 65  tf("GetAttribute
8910: 56 61 6c 75 65 28 68 4f 62 6a 65 63 74 3d 25 6c  Value(hObject=%l
8920: 75 29 2f 31 20 66 61 69 6c 65 64 20 28 72 76 20  u)/1 failed (rv 
8930: 3d 20 25 6c 75 29 2e 5c 6e 22 2c 20 28 75 6e 73  = %lu).\n", (uns
8940: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4f 62 6a  igned long) hObj
8950: 65 63 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ect, (unsigned l
8960: 6f 6e 67 29 20 63 68 6b 5f 72 76 29 3b 0a 09 09  ong) chk_rv);...
8970: 7d 0a 0a 09 7d 0a 0a 09 63 68 6b 5f 72 76 20 3d  }...}...chk_rv =
8980: 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69   C_FindObjectsFi
8990: 6e 61 6c 28 68 53 65 73 73 69 6f 6e 29 3b 0a 09  nal(hSession);..
89a0: 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b  if (chk_rv != CK
89b0: 52 5f 4f 4b 29 20 7b 0a 09 09 70 72 69 6e 74 66  R_OK) {...printf
89c0: 28 22 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  ("FindObjectsFin
89d0: 61 6c 28 29 20 66 61 69 6c 65 64 2e 5c 6e 22 29  al() failed.\n")
89e0: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72  ;..}...for (curr
89f0: 50 72 69 76 4b 65 79 20 3d 20 70 72 69 76 61 74  PrivKey = privat
8a00: 65 4b 65 79 4f 62 6a 65 63 74 73 5f 72 6f 6f 74  eKeyObjects_root
8a10: 3b 20 2a 63 75 72 72 50 72 69 76 4b 65 79 20 21  ; *currPrivKey !
8a20: 3d 20 43 4b 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  = CK_INVALID_HAN
8a30: 44 4c 45 3b 20 63 75 72 72 50 72 69 76 4b 65 79  DLE; currPrivKey
8a40: 2b 2b 29 20 7b 0a 09 09 63 68 6b 5f 72 76 20 3d  ++) {...chk_rv =
8a50: 20 43 5f 53 69 67 6e 49 6e 69 74 28 68 53 65 73   C_SignInit(hSes
8a60: 73 69 6f 6e 2c 20 26 6d 65 63 68 61 6e 69 73 6d  sion, &mechanism
8a70: 2c 20 2a 63 75 72 72 50 72 69 76 4b 65 79 29 3b  , *currPrivKey);
8a80: 0a 09 09 69 66 20 28 63 68 6b 5f 72 76 20 3d 3d  ...if (chk_rv ==
8a90: 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 73 69   CKR_OK) {....si
8aa0: 67 6e 61 74 75 72 65 5f 6c 65 6e 20 3d 20 73 69  gnature_len = si
8ab0: 7a 65 6f 66 28 73 69 67 6e 61 74 75 72 65 29 3b  zeof(signature);
8ac0: 0a 0a 09 09 09 63 68 6b 5f 72 76 20 3d 20 43 5f  .....chk_rv = C_
8ad0: 53 69 67 6e 28 68 53 65 73 73 69 6f 6e 2c 20 28  Sign(hSession, (
8ae0: 43 4b 5f 42 59 54 45 5f 50 54 52 29 20 64 61 74  CK_BYTE_PTR) dat
8af0: 61 2c 20 64 61 74 61 5f 6c 65 6e 2c 20 28 43 4b  a, data_len, (CK
8b00: 5f 42 59 54 45 5f 50 54 52 29 20 26 73 69 67 6e  _BYTE_PTR) &sign
8b10: 61 74 75 72 65 2c 20 26 73 69 67 6e 61 74 75 72  ature, &signatur
8b20: 65 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 63  e_len);....if (c
8b30: 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 4f 4b 29  hk_rv == CKR_OK)
8b40: 20 7b 0a 09 09 09 09 70 72 69 6e 74 66 28 22 5b   {.....printf("[
8b50: 25 30 34 6c 75 2f 25 30 32 6c 78 5d 20 53 69 67  %04lu/%02lx] Sig
8b60: 6e 61 74 75 72 65 3a 20 22 2c 20 28 75 6e 73 69  nature: ", (unsi
8b70: 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 63 75 72 72  gned long) *curr
8b80: 50 72 69 76 4b 65 79 2c 20 28 75 6e 73 69 67 6e  PrivKey, (unsign
8b90: 65 64 20 6c 6f 6e 67 29 20 6d 65 63 68 61 6e 69  ed long) mechani
8ba0: 73 6d 2e 6d 65 63 68 61 6e 69 73 6d 29 3b 0a 0a  sm.mechanism);..
8bb0: 09 09 09 09 66 6f 72 20 28 62 79 74 65 5f 69 64  ....for (byte_id
8bc0: 78 20 3d 20 30 3b 20 62 79 74 65 5f 69 64 78 20  x = 0; byte_idx 
8bd0: 3c 20 73 69 67 6e 61 74 75 72 65 5f 6c 65 6e 3b  < signature_len;
8be0: 20 62 79 74 65 5f 69 64 78 2b 2b 29 20 7b 0a 09   byte_idx++) {..
8bf0: 09 09 09 09 70 72 69 6e 74 66 28 22 25 30 32 78  ....printf("%02x
8c00: 20 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e   ", (unsigned in
8c10: 74 29 20 73 69 67 6e 61 74 75 72 65 5b 62 79 74  t) signature[byt
8c20: 65 5f 69 64 78 5d 29 3b 0a 09 09 09 09 7d 0a 0a  e_idx]);.....}..
8c30: 09 09 09 09 70 72 69 6e 74 66 28 22 5c 6e 22 29  ....printf("\n")
8c40: 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
8c50: 09 09 70 72 69 6e 74 66 28 22 53 69 67 6e 28 29  ..printf("Sign()
8c60: 20 66 61 69 6c 65 64 2e 5c 6e 22 29 3b 0a 09 09   failed.\n");...
8c70: 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
8c80: 09 70 72 69 6e 74 66 28 22 53 69 67 6e 49 6e 69  .printf("SignIni
8c90: 74 28 29 20 66 61 69 6c 65 64 2e 5c 6e 22 29 3b  t() failed.\n");
8ca0: 0a 09 09 7d 0a 09 7d 0a 0a 09 63 68 6b 5f 72 76  ...}..}...chk_rv
8cb0: 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f   = C_CloseSessio
8cc0: 6e 28 68 53 65 73 73 69 6f 6e 29 3b 0a 09 69 66  n(hSession);..if
8cd0: 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f   (chk_rv != CKR_
8ce0: 4f 4b 29 20 7b 0a 09 09 70 72 69 6e 74 66 28 22  OK) {...printf("
8cf0: 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 66 61 69  CloseSession fai
8d00: 6c 65 64 2e 5c 6e 22 29 3b 0a 09 7d 0a 0a 09 72  led.\n");..}...r
8d10: 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 63 6c 65 61  etval = 0;..clea
8d20: 6e 75 70 3a 0a 09 69 66 20 28 69 6e 69 74 69 61  nup:..if (initia
8d30: 6c 69 7a 65 64 29 20 7b 0a 09 09 43 5f 46 69 6e  lized) {...C_Fin
8d40: 61 6c 69 7a 65 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  alize(NULL);..}.
8d50: 0a 09 69 66 20 28 73 6c 6f 74 73 29 20 7b 0a 09  ..if (slots) {..
8d60: 09 66 72 65 65 28 73 6c 6f 74 73 29 3b 0a 09 7d  .free(slots);..}
8d70: 0a 0a 09 69 66 20 28 70 72 69 76 61 74 65 4b 65  ...if (privateKe
8d80: 79 4f 62 6a 65 63 74 73 5f 72 6f 6f 74 29 20 7b  yObjects_root) {
8d90: 0a 09 09 66 72 65 65 28 70 72 69 76 61 74 65 4b  ...free(privateK
8da0: 65 79 4f 62 6a 65 63 74 73 5f 72 6f 6f 74 29 3b  eyObjects_root);
8db0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ..}...return(ret
8dc0: 76 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a     val);.}.#endif.