Hex Artifact Content

Artifact 47e7747ccc0ff0ef80e5495c962baa7a74c48720:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 48  #endif.#define H
0270: 41 56 45 5f 45 52 52 4e 4f 5f 48 20 31 0a 23 69  AVE_ERRNO_H 1.#i
0280: 66 64 65 66 20 48 41 56 45 5f 45 52 52 4e 4f 5f  fdef HAVE_ERRNO_
0290: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72  H.#  include <er
02a0: 72 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  rno.h>.#endif.#i
02b0: 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f 48  fdef HAVE_ZLIB_H
02c0: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 4c  .#  ifdef HAVE_L
02d0: 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  IBZ.#    include
02e0: 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e 64   <zlib.h>.#  end
02f0: 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64 65  if.#else.#  ifde
0300: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 20  f HAVE_LIBZ.#   
0310: 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42 5a   undef HAVE_LIBZ
0320: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
0330: 0a 23 69 66 6e 64 65 66 20 5f 54 48 52 45 41 44  .#ifndef _THREAD
0340: 5f 45 4d 55 4c 41 54 49 4f 4e 0a 23 20 20 69 66  _EMULATION.#  if
0350: 64 65 66 20 48 41 56 45 5f 44 4c 46 43 4e 5f 48  def HAVE_DLFCN_H
0360: 0a 23 20 20 20 20 69 66 64 65 66 20 48 41 56 45  .#    ifdef HAVE
0370: 5f 44 4c 53 59 4d 0a 23 20 20 20 20 20 20 69 6e  _DLSYM.#      in
0380: 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a  clude <dlfcn.h>.
0390: 23 20 20 20 20 20 20 64 65 66 69 6e 65 20 48 41  #      define HA
03a0: 56 45 5f 43 41 43 4b 45 59 5f 4d 55 54 45 58 5f  VE_CACKEY_MUTEX_
03b0: 50 54 48 52 45 41 44 5f 46 55 4e 43 53 20 31 0a  PTHREAD_FUNCS 1.
03c0: 23 20 20 20 20 65 6e 64 69 66 0a 23 20 20 65 6e  #    endif.#  en
03d0: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  dif.#endif.#ifde
03e0: 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53  f CACKEY_DEBUG_S
03f0: 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a  EARCH_SPEEDTEST.
0400: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  #  include <sys/
0410: 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  time.h>.#endif..
0420: 23 64 65 66 69 6e 65 20 43 4b 5f 50 54 52 20 2a  #define CK_PTR *
0430: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 46 49  .#define CK_DEFI
0440: 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75  NE_FUNCTION(retu
0450: 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65  rnType, name) re
0460: 74 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64  turnType name.#d
0470: 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45  efine CK_DECLARE
0480: 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e  _FUNCTION(return
0490: 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75  Type, name) retu
04a0: 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 66  rnType name.#def
04b0: 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46  ine CK_DECLARE_F
04c0: 55 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54 45 52 28  UNCTION_POINTER(
04d0: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65  returnType, name
04e0: 29 20 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20  ) returnType (* 
04f0: 6e 61 6d 65 29 0a 23 64 65 66 69 6e 65 20 43 4b  name).#define CK
0500: 5f 43 41 4c 4c 42 41 43 4b 5f 46 55 4e 43 54 49  _CALLBACK_FUNCTI
0510: 4f 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e  ON(returnType, n
0520: 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20  ame) returnType 
0530: 28 2a 20 6e 61 6d 65 29 0a 23 69 66 6e 64 65 66  (* name).#ifndef
0540: 20 4e 55 4c 4c 5f 50 54 52 0a 23 20 20 64 65 66   NULL_PTR.#  def
0550: 69 6e 65 20 4e 55 4c 4c 5f 50 54 52 20 30 0a 23  ine NULL_PTR 0.#
0560: 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20  endif..#include 
0570: 22 70 6b 63 73 31 31 2e 68 22 0a 23 69 6e 63 6c  "pkcs11.h".#incl
0580: 75 64 65 20 22 70 6b 63 73 31 31 6e 2e 68 22 0a  ude "pkcs11n.h".
0590: 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78  #include "asn1-x
05a0: 35 30 39 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  509.h".#include 
05b0: 22 73 68 61 31 2e 68 22 0a 23 69 6e 63 6c 75 64  "sha1.h".#includ
05c0: 65 20 22 6d 64 35 2e 68 22 0a 0a 23 69 66 6e 64  e "md5.h"..#ifnd
05d0: 65 66 20 43 41 43 4b 45 59 5f 43 52 59 50 54 4f  ef CACKEY_CRYPTO
05e0: 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 0a  KI_VERSION_CODE.
05f0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
0600: 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
0610: 4e 5f 43 4f 44 45 20 30 78 30 32 31 65 30 30 0a  N_CODE 0x021e00.
0620: 23 65 6e 64 69 66 0a 0a 2f 2a 20 47 53 43 2d 49  #endif../* GSC-I
0630: 53 20 76 32 2e 31 20 44 65 66 69 6e 69 74 69 6f  S v2.1 Definitio
0640: 6e 73 20 2a 2f 0a 2f 2a 2a 20 43 6c 61 73 73 65  ns */./** Classe
0650: 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53  s **/.#define GS
0660: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
0670: 36 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30  6           0x00
0680: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43  .#define GSCIS_C
0690: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
06a0: 46 4f 52 4d 20 20 20 30 78 38 30 0a 0a 2f 2a 2a  FORM   0x80../**
06b0: 20 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2a   Instructions **
06c0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
06d0: 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e  INSTR_GET_RESPON
06e0: 53 45 20 20 20 20 20 20 30 78 43 30 0a 23 64 65  SE      0xC0.#de
06f0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0700: 5f 52 45 41 44 5f 42 49 4e 41 52 59 20 20 20 20  _READ_BINARY    
0710: 20 20 20 30 78 42 30 0a 23 64 65 66 69 6e 65 20     0xB0.#define 
0720: 47 53 43 49 53 5f 49 4e 53 54 52 5f 55 50 44 41  GSCIS_INSTR_UPDA
0730: 54 45 5f 42 49 4e 41 52 59 20 20 20 20 20 30 78  TE_BINARY     0x
0740: 44 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  D6.#define GSCIS
0750: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 20 20 20  _INSTR_SELECT   
0760: 20 20 20 20 20 20 20 20 20 30 78 41 34 0a 23 64           0xA4.#d
0770: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0780: 52 5f 45 58 54 45 52 4e 41 4c 5f 41 55 54 48 20  R_EXTERNAL_AUTH 
0790: 20 20 20 20 30 78 38 32 0a 23 64 65 66 69 6e 65      0x82.#define
07a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54   GSCIS_INSTR_GET
07b0: 5f 43 48 41 4c 4c 45 4e 47 45 20 20 20 20 20 30  _CHALLENGE     0
07c0: 78 38 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x84.#define GSCI
07d0: 53 5f 49 4e 53 54 52 5f 49 4e 54 45 52 4e 41 4c  S_INSTR_INTERNAL
07e0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 38 0a 23  _AUTH     0x88.#
07f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0800: 54 52 5f 56 45 52 49 46 59 20 20 20 20 20 20 20  TR_VERIFY       
0810: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e       0x20.#defin
0820: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43 48  e GSCIS_INSTR_CH
0830: 41 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 20 20  ANGE_REFERENCE  
0840: 30 78 32 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x24.#define GSC
0850: 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 20 20 20  IS_INSTR_SIGN   
0860: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 41 0a             0x2A.
0870: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0880: 53 54 52 5f 47 45 54 5f 50 52 4f 50 20 20 20 20  STR_GET_PROP    
0890: 20 20 20 20 20 20 30 78 35 36 0a 23 64 65 66 69        0x56.#defi
08a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47  ne GSCIS_INSTR_G
08b0: 45 54 5f 41 43 52 20 20 20 20 20 20 20 20 20 20  ET_ACR          
08c0: 20 30 78 34 43 0a 23 64 65 66 69 6e 65 20 47 53   0x4C.#define GS
08d0: 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42  CIS_INSTR_READ_B
08e0: 55 46 46 45 52 20 20 20 20 20 20 20 30 78 35 32  UFFER       0x52
08f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
0900: 4e 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54  NSTR_SIGNDECRYPT
0910: 20 20 20 20 20 20 20 30 78 34 32 0a 0a 23 64 65         0x42..#de
0920: 66 69 6e 65 20 47 53 43 49 53 5f 50 41 52 41 4d  fine GSCIS_PARAM
0930: 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 20 20  _SELECT_APPLET  
0940: 20 20 20 30 78 30 34 0a 0a 2f 2a 2a 20 54 61 67     0x04../** Tag
0950: 73 20 2a 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20 54  s **/./*** CCC T
0960: 61 67 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  ags ***/.#define
0970: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49   GSCIS_TAG_CARDI
0980: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  D              0
0990: 78 46 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF0.#define GSCI
09a0: 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 20 20 20  S_TAG_CCC_VER   
09b0: 20 20 20 20 20 20 20 20 20 20 30 78 46 31 0a 23            0xF1.#
09c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09d0: 5f 43 43 47 5f 56 45 52 20 20 20 20 20 20 20 20  _CCG_VER        
09e0: 20 20 20 20 20 30 78 46 32 0a 23 64 65 66 69 6e       0xF2.#defin
09f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
0a00: 55 52 4c 20 20 20 20 20 20 20 20 20 20 20 20 20  URL             
0a10: 30 78 46 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF3.#define GSC
0a20: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 20 20 20  IS_TAG_PKCS15   
0a30: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 34 0a             0xF4.
0a40: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a50: 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c  G_REG_DATA_MODEL
0a60: 20 20 20 20 20 20 30 78 46 35 0a 23 64 65 66 69        0xF5.#defi
0a70: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52  ne GSCIS_TAG_ACR
0a80: 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20  _TABLE          
0a90: 20 30 78 46 36 0a 23 64 65 66 69 6e 65 20 47 53   0xF6.#define GS
0aa0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
0ab0: 55 20 20 20 20 20 20 20 20 20 20 20 30 78 46 37  U           0xF7
0ac0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ad0: 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 20 20  AG_REDIRECTION  
0ae0: 20 20 20 20 20 20 20 30 78 46 41 0a 23 64 65 66         0xFA.#def
0af0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54  ine GSCIS_TAG_CT
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b10: 20 20 30 78 46 42 0a 23 64 65 66 69 6e 65 20 47    0xFB.#define G
0b20: 53 43 49 53 5f 54 41 47 5f 53 54 20 20 20 20 20  SCIS_TAG_ST     
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46               0xF
0b40: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  C.#define GSCIS_
0b50: 54 41 47 5f 4e 45 58 54 43 43 43 20 20 20 20 20  TAG_NEXTCCC     
0b60: 20 20 20 20 20 20 20 20 30 78 46 44 0a 0a 2f 2a          0xFD../*
0b70: 2a 2a 20 47 65 6e 65 72 61 6c 20 2d 20 45 46 20  ** General - EF 
0b80: 32 32 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  2200 ***/.#defin
0b90: 65 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d  e GSCIS_TAG_FNAM
0ba0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0bb0: 30 78 30 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0x01.#define GSC
0bc0: 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 20 20 20 20  IS_TAG_MNAME    
0bd0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 32 0a             0x02.
0be0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0bf0: 47 5f 4c 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_LNAME         
0c00: 20 20 20 20 20 20 30 78 30 33 0a 23 64 65 66 69        0x03.#defi
0c10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46  ne GSCIS_TAG_SUF
0c20: 46 49 58 20 20 20 20 20 20 20 20 20 20 20 20 20  FIX             
0c30: 20 30 78 30 34 0a 23 64 65 66 69 6e 65 20 47 53   0x04.#define GS
0c40: 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45  CIS_TAG_GOVT_AGE
0c50: 4e 43 59 20 20 20 20 20 20 20 20 20 30 78 30 35  NCY         0x05
0c60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c70: 41 47 5f 42 55 52 45 41 55 20 20 20 20 20 20 20  AG_BUREAU       
0c80: 20 20 20 20 20 20 20 30 78 30 36 0a 23 64 65 66         0x06.#def
0c90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ine GSCIS_TAG_BU
0ca0: 52 45 41 55 5f 43 4f 44 45 20 20 20 20 20 20 20  REAU_CODE       
0cb0: 20 20 30 78 30 37 0a 23 64 65 66 69 6e 65 20 47    0x07.#define G
0cc0: 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f  SCIS_TAG_DEPT_CO
0cd0: 44 45 20 20 20 20 20 20 20 20 20 20 20 30 78 30  DE           0x0
0ce0: 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  8.#define GSCIS_
0cf0: 54 41 47 5f 54 49 54 4c 45 20 20 20 20 20 20 20  TAG_TITLE       
0d00: 20 20 20 20 20 20 20 20 30 78 30 39 0a 23 64 65          0x09.#de
0d10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42  fine GSCIS_TAG_B
0d20: 55 49 4c 44 49 4e 47 20 20 20 20 20 20 20 20 20  UILDING         
0d30: 20 20 20 30 78 31 30 0a 23 64 65 66 69 6e 65 20     0x10.#define 
0d40: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d50: 5f 41 44 44 52 31 20 20 20 20 20 20 20 20 30 78  _ADDR1        0x
0d60: 31 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  11.#define GSCIS
0d70: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
0d80: 32 20 20 20 20 20 20 20 20 30 78 31 32 0a 23 64  2        0x12.#d
0d90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0da0: 4f 46 46 49 43 45 5f 43 49 54 59 20 20 20 20 20  OFFICE_CITY     
0db0: 20 20 20 20 30 78 31 33 0a 23 64 65 66 69 6e 65      0x13.#define
0dc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0dd0: 45 5f 53 54 41 54 45 20 20 20 20 20 20 20 20 30  E_STATE        0
0de0: 78 31 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x14.#define GSCI
0df0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50  S_TAG_OFFICE_ZIP
0e00: 20 20 20 20 20 20 20 20 20 20 30 78 31 35 0a 23            0x15.#
0e10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e20: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 20  _OFFICE_COUNTRY 
0e30: 20 20 20 20 20 30 78 31 36 0a 23 64 65 66 69 6e       0x16.#defin
0e40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e50: 43 45 5f 50 48 4f 4e 45 20 20 20 20 20 20 20 20  CE_PHONE        
0e60: 30 78 31 37 0a 23 64 65 66 69 6e 65 20 47 53 43  0x17.#define GSC
0e70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
0e80: 4f 4e 45 5f 45 58 54 20 20 20 20 30 78 31 38 0a  ONE_EXT    0x18.
0e90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0ea0: 47 5f 4f 46 46 49 43 45 5f 46 41 58 20 20 20 20  G_OFFICE_FAX    
0eb0: 20 20 20 20 20 20 30 78 31 39 0a 23 64 65 66 69        0x19.#defi
0ec0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0ed0: 49 43 45 5f 45 4d 41 49 4c 20 20 20 20 20 20 20  ICE_EMAIL       
0ee0: 20 30 78 31 41 0a 23 64 65 66 69 6e 65 20 47 53   0x1A.#define GS
0ef0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
0f00: 4f 4f 4d 20 20 20 20 20 20 20 20 20 30 78 31 42  OOM         0x1B
0f10: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f20: 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59  AG_NONGOV_AGENCY
0f30: 20 20 20 20 20 20 20 30 78 31 43 0a 23 64 65 66         0x1C.#def
0f40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53  ine GSCIS_TAG_SS
0f50: 4e 5f 44 45 53 49 47 4e 41 54 4f 52 20 20 20 20  N_DESIGNATOR    
0f60: 20 20 30 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49 49    0x1D../*** PII
0f70: 20 2d 20 45 46 20 32 31 30 30 20 2a 2a 2a 2f 0a   - EF 2100 ***/.
0f80: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0f90: 47 5f 53 53 4e 20 20 20 20 20 20 20 20 20 20 20  G_SSN           
0fa0: 20 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69        0x20.#defi
0fb0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42  ne GSCIS_TAG_DOB
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 20 30 78 32 31 0a 23 64 65 66 69 6e 65 20 47 53   0x21.#define GS
0fe0: 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 20 20  CIS_TAG_GENDER  
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 32              0x22
1000: 0a 0a 2f 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e 66  ../*** Login Inf
1010: 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 34 30  ormation - EF 40
1020: 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  00 ***/.#define 
1030: 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44  GSCIS_TAG_USERID
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
1050: 34 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  40.#define GSCIS
1060: 5f 54 41 47 5f 44 4f 4d 41 49 4e 20 20 20 20 20  _TAG_DOMAIN     
1070: 20 20 20 20 20 20 20 20 20 30 78 34 31 0a 23 64           0x41.#d
1080: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
1090: 50 41 53 53 57 4f 52 44 20 20 20 20 20 20 20 20  PASSWORD        
10a0: 20 20 20 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20 43      0x42../*** C
10b0: 61 72 64 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  ard Information 
10c0: 2d 20 45 46 20 35 30 30 30 20 2a 2a 2a 2f 0a 23  - EF 5000 ***/.#
10d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10e0: 5f 49 53 53 55 45 52 49 44 20 20 20 20 20 20 20  _ISSUERID       
10f0: 20 20 20 20 20 30 78 35 30 0a 23 64 65 66 69 6e       0x50.#defin
1100: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  e GSCIS_TAG_SERN
1110: 4f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  O               
1120: 30 78 35 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0x51.#define GSC
1130: 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54  IS_TAG_ISSUE_DAT
1140: 45 20 20 20 20 20 20 20 20 20 20 30 78 35 32 0a  E          0x52.
1150: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1160: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20 20  G_EXPIRE_DATE   
1170: 20 20 20 20 20 20 30 78 35 33 0a 23 64 65 66 69        0x53.#defi
1180: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
1190: 44 5f 54 59 50 45 20 20 20 20 20 20 20 20 20 20  D_TYPE          
11a0: 20 30 78 35 34 0a 23 64 65 66 69 6e 65 20 47 53   0x54.#define GS
11b0: 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59  CIS_TAG_SECURITY
11c0: 5f 43 4f 44 45 20 20 20 20 20 20 20 30 78 35 37  _CODE       0x57
11d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
11e0: 41 47 5f 43 41 52 44 49 44 5f 41 49 44 20 20 20  AG_CARDID_AID   
11f0: 20 20 20 20 20 20 20 30 78 35 38 0a 0a 2f 2a 2a         0x58../**
1200: 2a 20 50 49 56 20 43 6f 64 65 73 20 2a 2a 2a 2f  * PIV Codes ***/
1210: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38  .#define NISTSP8
1220: 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45  00_73_3_INSTR_GE
1230: 54 5f 44 41 54 41 20 30 78 43 42 0a 23 64 65 66  T_DATA 0xCB.#def
1240: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1250: 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54 48  _3_INSTR_GENAUTH
1260: 20 20 30 78 38 37 0a 0a 2f 2a 2a 2a 20 50 4b 49    0x87../*** PKI
1270: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45   Information - E
1280: 46 20 37 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66  F 7000 ***/.#def
1290: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
12a0: 52 54 49 46 49 43 41 54 45 20 20 20 20 20 20 20  RTIFICATE       
12b0: 20 20 30 78 37 30 0a 23 64 65 66 69 6e 65 20 47    0x70.#define G
12c0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53  SCIS_TAG_CERT_IS
12d0: 53 55 45 5f 44 41 54 45 20 20 20 20 20 30 78 37  SUE_DATE     0x7
12e0: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  1.#define GSCIS_
12f0: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f  TAG_CERT_EXPIRE_
1300: 44 41 54 45 20 20 20 20 30 78 37 32 0a 0a 2f 2a  DATE    0x72../*
1310: 2a 20 41 70 70 6c 65 74 20 49 44 73 20 2a 2a 2f  * Applet IDs **/
1320: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 41  .#define GSCIS_A
1330: 49 44 5f 43 43 43 20 20 20 20 20 20 20 20 20 20  ID_CCC          
1340: 20 20 20 20 20 20 20 30 78 41 30 2c 20 30 78 30         0xA0, 0x0
1350: 30 2c 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30  0, 0x00, 0x01, 0
1360: 78 31 36 2c 20 30 78 44 42 2c 20 30 78 30 30 0a  x16, 0xDB, 0x00.
1370: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 41 49  #define GSCIS_AI
1380: 44 5f 49 44 30 20 20 20 20 20 20 20 20 20 20 20  D_ID0           
1390: 20 20 20 20 20 20 30 78 41 30 2c 20 30 78 30 30        0xA0, 0x00
13a0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
13b0: 37 39 2c 20 30 78 30 31 2c 20 30 78 30 30 0a 23  79, 0x01, 0x00.#
13c0: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
13d0: 5f 37 33 5f 33 5f 50 49 56 5f 41 49 44 20 20 20  _73_3_PIV_AID   
13e0: 20 20 20 20 20 30 78 41 30 2c 20 30 78 30 30 2c       0xA0, 0x00,
13f0: 20 30 78 30 30 2c 20 30 78 30 33 2c 20 30 78 30   0x00, 0x03, 0x0
1400: 38 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  8, 0x00, 0x00, 0
1410: 78 31 30 2c 20 30 78 30 30 2c 20 30 78 30 31 2c  x10, 0x00, 0x01,
1420: 20 30 78 30 30 0a 0a 2f 2a 20 50 49 56 20 49 44   0x00../* PIV ID
1430: 73 20 2a 2f 0a 2f 2a 2a 20 4b 65 79 20 49 64 65  s */./** Key Ide
1440: 6e 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53  ntifiers (NIST S
1450: 50 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c  P 800-78-3, Tabl
1460: 65 20 36 2d 31 20 2a 2a 2f 0a 23 64 65 66 69 6e  e 6-1 **/.#defin
1470: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  e NISTSP800_78_3
1480: 5f 4b 45 59 5f 50 49 56 41 55 54 48 20 20 20 30  _KEY_PIVAUTH   0
1490: 78 39 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x9A.#define NIST
14a0: 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 53  SP800_78_3_KEY_S
14b0: 49 47 4e 41 54 55 52 45 20 30 78 39 43 0a 23 64  IGNATURE 0x9C.#d
14c0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
14d0: 37 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 20  78_3_KEY_KEYMGT 
14e0: 20 20 20 30 78 39 44 0a 23 64 65 66 69 6e 65 20     0x9D.#define 
14f0: 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b  NISTSP800_78_3_K
1500: 45 59 5f 43 41 52 44 41 55 54 48 20 20 30 78 39  EY_CARDAUTH  0x9
1510: 45 0a 0a 2f 2a 2a 20 41 6c 67 6f 72 69 74 68 6d  E../** Algorithm
1520: 20 49 64 65 6e 74 69 66 69 65 72 73 20 28 4e 49   Identifiers (NI
1530: 53 54 20 53 50 20 38 30 30 2d 37 38 2d 33 2c 20  ST SP 800-78-3, 
1540: 54 61 62 6c 65 20 36 2d 32 20 2a 2a 2f 0a 23 64  Table 6-2 **/.#d
1550: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1560: 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 31 30 32  78_3_ALGO_RSA102
1570: 34 20 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20  4  0x06.#define 
1580: 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 41  NISTSP800_78_3_A
1590: 4c 47 4f 5f 52 53 41 32 30 34 38 20 20 30 78 30  LGO_RSA2048  0x0
15a0: 37 0a 0a 2f 2a 2a 20 4f 62 6a 65 63 74 20 49 64  7../** Object Id
15b0: 65 6e 74 69 66 69 65 72 73 20 28 4e 49 53 54 20  entifiers (NIST 
15c0: 53 50 20 38 30 30 2d 37 33 2d 33 20 50 61 72 74  SP 800-73-3 Part
15d0: 20 31 2c 20 54 61 62 6c 65 20 32 29 20 2a 2a 2f   1, Table 2) **/
15e0: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38  .#define NISTSP8
15f0: 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 50 49 56 41  00_73_3_OID_PIVA
1600: 55 54 48 20 20 20 30 78 35 46 2c 20 30 78 43 31  UTH   0x5F, 0xC1
1610: 2c 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 4e  , 0x05.#define N
1620: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49  ISTSP800_73_3_OI
1630: 44 5f 53 49 47 4e 41 54 55 52 45 20 30 78 35 46  D_SIGNATURE 0x5F
1640: 2c 20 30 78 43 31 2c 20 30 78 30 41 0a 23 64 65  , 0xC1, 0x0A.#de
1650: 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37  fine NISTSP800_7
1660: 33 5f 33 5f 4f 49 44 5f 4b 45 59 4d 47 54 20 20  3_3_OID_KEYMGT  
1670: 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78    0x5F, 0xC1, 0x
1680: 30 42 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  0B.#define NISTS
1690: 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 43 41  P800_73_3_OID_CA
16a0: 52 44 41 55 54 48 20 20 30 78 35 46 2c 20 30 78  RDAUTH  0x5F, 0x
16b0: 43 31 2c 20 30 78 30 31 0a 0a 2f 2a 20 4d 61 78  C1, 0x01../* Max
16c0: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 64 61 74  imum size of dat
16d0: 61 20 70 6f 72 74 69 6f 6e 20 6f 66 20 41 50 44  a portion of APD
16e0: 55 73 20 2a 2f 0a 2f 2a 2a 20 44 6f 20 6e 6f 74  Us */./** Do not
16f0: 20 73 65 74 20 74 68 69 73 20 61 62 6f 76 65 20   set this above 
1700: 32 35 30 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  250 **/.#define 
1710: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 20  CACKEY_APDU_MTU 
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 35                25
1730: 30 0a 0a 2f 2a 20 41 54 52 20 49 66 20 6e 6f 74  0../* ATR If not
1740: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 23 69   available */.#i
1750: 66 6e 64 65 66 20 4d 41 58 5f 41 54 52 5f 53 49  fndef MAX_ATR_SI
1760: 5a 45 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 41  ZE.#define MAX_A
1770: 54 52 5f 53 49 5a 45 20 31 30 32 34 0a 23 65 6e  TR_SIZE 1024.#en
1780: 64 69 66 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  dif..#ifdef CACK
1790: 45 59 5f 44 45 42 55 47 0a 23 20 20 69 66 64 65  EY_DEBUG.#  ifde
17a0: 66 20 48 41 56 45 5f 54 49 4d 45 5f 48 0a 23 20  f HAVE_TIME_H.# 
17b0: 20 20 20 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65     include <time
17c0: 2e 68 3e 0a 73 74 61 74 69 63 20 74 69 6d 65 5f  .h>.static time_
17d0: 74 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73  t cackey_debug_s
17e0: 74 61 72 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 73  tart_time = 0;.s
17f0: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c  tatic unsigned l
1800: 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ong CACKEY_DEBUG
1810: 5f 47 45 54 54 49 4d 45 28 76 6f 69 64 29 20 7b  _GETTIME(void) {
1820: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 64 65 62  ..if (cackey_deb
1830: 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 20 3d 3d  ug_start_time ==
1840: 20 30 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 64   0) {...cackey_d
1850: 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 20  ebug_start_time 
1860: 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a 09 7d  = time(NULL);..}
1870: 0a 0a 09 72 65 74 75 72 6e 28 74 69 6d 65 28 4e  ...return(time(N
1880: 55 4c 4c 29 20 2d 20 63 61 63 6b 65 79 5f 64 65  ULL) - cackey_de
1890: 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 29 3b  bug_start_time);
18a0: 0a 7d 0a 23 20 20 65 6c 73 65 0a 73 74 61 74 69  .}.#  else.stati
18b0: 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  c unsigned long 
18c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54  CACKEY_DEBUG_GET
18d0: 54 49 4d 45 28 76 6f 69 64 29 20 7b 0a 09 72 65  TIME(void) {..re
18e0: 74 75 72 6e 28 30 29 3b 0a 7d 0a 23 20 20 65 6e  turn(0);.}.#  en
18f0: 64 69 66 0a 0a 23 20 20 64 65 66 69 6e 65 20 43  dif..#  define C
1900: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1910: 54 46 28 78 2e 2e 2e 29 20 7b 20 5c 0a 09 73 74  TF(x...) { \..st
1920: 61 74 69 63 20 63 68 61 72 20 62 75 66 5f 75 73  atic char buf_us
1930: 65 72 5b 34 30 39 36 5d 20 3d 20 7b 30 7d 3b 20  er[4096] = {0}; 
1940: 5c 0a 09 73 6e 70 72 69 6e 74 66 28 62 75 66 5f  \..snprintf(buf_
1950: 75 73 65 72 2c 20 73 69 7a 65 6f 66 28 62 75 66  user, sizeof(buf
1960: 5f 75 73 65 72 29 2c 20 78 29 3b 20 5c 0a 09 62  _user), x); \..b
1970: 75 66 5f 75 73 65 72 5b 73 69 7a 65 6f 66 28 62  uf_user[sizeof(b
1980: 75 66 5f 75 73 65 72 29 20 2d 20 31 5d 20 3d 20  uf_user) - 1] = 
1990: 27 5c 30 27 3b 20 5c 0a 09 66 70 72 69 6e 74 66  '\0'; \..fprintf
19a0: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
19b0: 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29  (), "[%lu]: %s()
19c0: 3a 25 69 3a 20 25 73 5c 6e 22 2c 20 43 41 43 4b  :%i: %s\n", CACK
19d0: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45  EY_DEBUG_GETTIME
19e0: 28 29 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f  (), __func__, __
19f0: 4c 49 4e 45 5f 5f 2c 20 62 75 66 5f 75 73 65 72  LINE__, buf_user
1a00: 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63 61 63  ); \..fflush(cac
1a10: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b  key_debug_fd());
1a20: 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65 20 43   \.}.#  define C
1a30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a40: 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 7b 20  TBUF(f, x, y) { 
1a50: 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72 20 62  \..static char b
1a60: 75 66 5f 75 73 65 72 5b 38 31 39 32 5d 20 3d 20  uf_user[8192] = 
1a70: 7b 30 7d 2c 20 2a 62 75 66 5f 75 73 65 72 5f 70  {0}, *buf_user_p
1a80: 2c 20 2a 62 75 66 5f 75 73 65 72 5f 70 72 69 6e  , *buf_user_prin
1a90: 74 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 6c  t; \..unsigned l
1aa0: 6f 6e 67 20 62 75 66 5f 75 73 65 72 5f 73 69 7a  ong buf_user_siz
1ab0: 65 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 63  e; \..unsigned c
1ac0: 68 61 72 20 2a 54 4d 50 42 55 46 3b 20 5c 0a 09  har *TMPBUF; \..
1ad0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
1ae0: 78 3b 20 5c 0a 09 69 6e 74 20 73 6e 70 72 69 6e  x; \..int snprin
1af0: 74 66 5f 72 65 74 3b 20 5c 0a 09 54 4d 50 42 55  tf_ret; \..TMPBU
1b00: 46 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  F = (unsigned ch
1b10: 61 72 20 2a 29 20 28 78 29 3b 20 5c 0a 09 62 75  ar *) (x); \..bu
1b20: 66 5f 75 73 65 72 5b 30 5d 20 3d 20 30 3b 20 5c  f_user[0] = 0; \
1b30: 0a 09 62 75 66 5f 75 73 65 72 5b 32 5d 20 3d 20  ..buf_user[2] = 
1b40: 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f 70  0; \..buf_user_p
1b50: 20 3d 20 62 75 66 5f 75 73 65 72 3b 20 5c 0a 09   = buf_user; \..
1b60: 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 3d 20  buf_user_size = 
1b70: 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29  sizeof(buf_user)
1b80: 3b 20 5c 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  ; \..for (idx = 
1b90: 30 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69 64  0; idx < (y); id
1ba0: 78 2b 2b 29 20 7b 20 5c 0a 09 09 69 66 20 28 62  x++) { \...if (b
1bb0: 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 3c 3d 20  uf_user_size <= 
1bc0: 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61 6b 3b  0) { \....break;
1bd0: 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 73 6e 70 72   \...}; \...snpr
1be0: 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70 72 69  intf_ret = snpri
1bf0: 6e 74 66 28 62 75 66 5f 75 73 65 72 5f 70 2c 20  ntf(buf_user_p, 
1c00: 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 2c 20 22  buf_user_size, "
1c10: 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55 46 5b  , %02x", TMPBUF[
1c20: 69 64 78 5d 29 3b 20 5c 0a 09 09 69 66 20 28 73  idx]); \...if (s
1c30: 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 3d 20 30  nprintf_ret <= 0
1c40: 29 20 7b 20 5c 0a 09 09 09 62 72 65 61 6b 3b 20  ) { \....break; 
1c50: 5c 0a 09 09 7d 3b 20 5c 0a 09 09 62 75 66 5f 75  \...}; \...buf_u
1c60: 73 65 72 5f 70 20 2b 3d 20 73 6e 70 72 69 6e 74  ser_p += snprint
1c70: 66 5f 72 65 74 3b 20 5c 0a 09 09 62 75 66 5f 75  f_ret; \...buf_u
1c80: 73 65 72 5f 73 69 7a 65 20 2d 3d 20 73 6e 70 72  ser_size -= snpr
1c90: 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 7d 3b 20  intf_ret; \..}; 
1ca0: 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69 7a 65  \..buf_user[size
1cb0: 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d 20 31  of(buf_user) - 1
1cc0: 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 62 75 66  ] = '\0'; \..buf
1cd0: 5f 75 73 65 72 5f 70 72 69 6e 74 20 3d 20 62 75  _user_print = bu
1ce0: 66 5f 75 73 65 72 20 2b 20 32 3b 20 5c 0a 09 66  f_user + 2; \..f
1cf0: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1d00: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
1d10: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 20 20 28  : %s():%i: %s  (
1d20: 25 73 2f 25 6c 75 20 3d 20 7b 25 73 7d 29 5c 6e  %s/%lu = {%s})\n
1d30: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
1d40: 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e  GETTIME(), __fun
1d50: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66  c__, __LINE__, f
1d60: 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 64 20  , #x, (unsigned 
1d70: 6c 6f 6e 67 29 20 28 79 29 2c 20 62 75 66 5f 75  long) (y), buf_u
1d80: 73 65 72 5f 70 72 69 6e 74 29 3b 20 5c 0a 09 66  ser_print); \..f
1d90: 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62  flush(cackey_deb
1da0: 75 67 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20  ug_fd()); \.}.# 
1db0: 20 64 65 66 69 6e 65 20 66 72 65 65 28 78 29 20   define free(x) 
1dc0: 7b 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  { CACKEY_DEBUG_P
1dd0: 52 49 4e 54 46 28 22 46 52 45 45 28 25 70 29 20  RINTF("FREE(%p) 
1de0: 28 25 73 29 22 2c 20 28 76 6f 69 64 20 2a 29 20  (%s)", (void *) 
1df0: 78 2c 20 23 78 29 3b 20 66 72 65 65 28 78 29 3b  x, #x); free(x);
1e00: 20 7d 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20   }..static FILE 
1e10: 2a 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  *cackey_debug_fd
1e20: 28 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63  (void) {..static
1e30: 20 46 49 4c 45 20 2a 66 64 20 3d 20 4e 55 4c 4c   FILE *fd = NULL
1e40: 3b 0a 09 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65  ;..char *logfile
1e50: 3b 0a 0a 09 69 66 20 28 66 64 20 21 3d 20 4e 55  ;...if (fd != NU
1e60: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 66  LL) {...return(f
1e70: 64 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  d);..}.../*.. * 
1e80: 4c 6f 67 20 74 6f 20 73 74 64 65 72 72 20 69 6e  Log to stderr in
1e90: 69 74 69 61 6c 6c 79 20 73 6f 20 77 65 20 63 61  itially so we ca
1ea0: 6e 20 75 73 65 20 64 65 62 75 67 67 69 6e 67 20  n use debugging 
1eb0: 77 69 74 68 69 6e 0a 09 20 2a 20 74 68 69 73 20  within.. * this 
1ec0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74  function without
1ed0: 20 67 65 74 74 69 6e 67 20 69 6e 74 6f 20 61 6e   getting into an
1ee0: 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 0a 09   infinite loop..
1ef0: 20 2a 2f 0a 09 66 64 20 3d 20 73 74 64 65 72 72   */..fd = stderr
1f00: 3b 0a 0a 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65  ;...logfile = ge
1f10: 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 45 42  tenv("CACKEY_DEB
1f20: 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 69  UG_LOGFILE");..i
1f30: 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55  f (logfile != NU
1f40: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1f50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
1f60: 6e 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  nd environment v
1f70: 61 72 69 61 62 6c 65 3a 20 25 73 22 2c 20 6c 6f  ariable: %s", lo
1f80: 67 66 69 6c 65 29 3b 0a 0a 09 09 6c 6f 67 66 69  gfile);....logfi
1f90: 6c 65 20 3d 20 73 74 72 63 68 72 28 6c 6f 67 66  le = strchr(logf
1fa0: 69 6c 65 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20  ile, '=');...if 
1fb0: 28 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c  (logfile == NULL
1fc0: 29 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 20 3d  ) {....logfile =
1fd0: 20 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f   getenv("CACKEY_
1fe0: 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b  DEBUG_LOGFILE");
1ff0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c  ...} else {....l
2000: 6f 67 66 69 6c 65 2b 2b 3b 0a 09 09 7d 0a 09 7d  ogfile++;...}..}
2010: 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
2020: 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 0a 09 69  DEBUG_LOGFILE..i
2030: 66 20 28 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55  f (logfile == NU
2040: 4c 4c 29 20 7b 0a 09 09 6c 6f 67 66 69 6c 65 20  LL) {...logfile 
2050: 3d 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  = CACKEY_DEBUG_L
2060: 4f 47 46 49 4c 45 3b 0a 09 7d 0a 23 65 6e 64 69  OGFILE;..}.#endi
2070: 66 0a 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20  f...if (logfile 
2080: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
2090: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20a0: 28 22 46 6f 75 6e 64 20 6c 6f 67 20 66 69 6c 65  ("Found log file
20b0: 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b  : %s", logfile);
20c0: 0a 0a 09 09 66 64 20 3d 20 66 6f 70 65 6e 28 6c  ....fd = fopen(l
20d0: 6f 67 66 69 6c 65 2c 20 22 61 22 29 3b 0a 09 7d  ogfile, "a");..}
20e0: 0a 0a 09 69 66 20 28 66 64 20 3d 3d 20 4e 55 4c  ...if (fd == NUL
20f0: 4c 29 20 7b 0a 09 09 66 64 20 3d 20 73 74 64 65  L) {...fd = stde
2100: 72 72 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20  rr;..}...if (fd 
2110: 3d 3d 20 73 74 64 65 72 72 29 20 7b 0a 09 09 43  == stderr) {...C
2120: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2130: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 74  TF("Returning st
2140: 64 65 72 72 22 29 3b 0a 09 7d 20 65 6c 73 65 20  derr");..} else 
2150: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2160: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2170: 6e 67 20 25 70 22 2c 20 28 76 6f 69 64 20 2a 29  ng %p", (void *)
2180: 20 66 64 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72   fd);..}...retur
2190: 6e 28 66 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  n(fd);.}..static
21a0: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45   void *CACKEY_DE
21b0: 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28  BUG_FUNC_MALLOC(
21c0: 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e  size_t size, con
21d0: 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69  st char *func, i
21e0: 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64  nt line) {..void
21f0: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76   *retval;...retv
2200: 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  al = malloc(size
2210: 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28 63 61 63  );...fprintf(cac
2220: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
2230: 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a  "[%lu]: %s():%i:
2240: 20 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 5c 6e   MALLOC() = %p\n
2250: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
2260: 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63 2c  GETTIME(), func,
2270: 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29 3b 0a   line, retval);.
2280: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
2290: 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65  ebug_fd());...re
22a0: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
22b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41  .static void *CA
22c0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
22d0: 52 45 41 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74  REALLOC(void *pt
22e0: 72 2c 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  r, size_t size, 
22f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63  const char *func
2300: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76  , int line) {..v
2310: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
2320: 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28  etval = realloc(
2330: 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66  ptr, size);...if
2340: 20 28 72 65 74 76 61 6c 20 21 3d 20 70 74 72 29   (retval != ptr)
2350: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 63 61 63   {...fprintf(cac
2360: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
2370: 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a  "[%lu]: %s():%i:
2380: 20 52 45 41 4c 4c 4f 43 28 25 70 29 20 3d 20 25   REALLOC(%p) = %
2390: 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  p\n", CACKEY_DEB
23a0: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75  UG_GETTIME(), fu
23b0: 6e 63 2c 20 6c 69 6e 65 2c 20 70 74 72 2c 20 72  nc, line, ptr, r
23c0: 65 74 76 61 6c 29 3b 0a 09 09 66 66 6c 75 73 68  etval);...fflush
23d0: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
23e0: 28 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  ());..}...if (re
23f0: 74 76 61 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tval == NULL) {.
2400: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2410: 52 49 4e 54 46 28 22 20 2a 2a 2a 20 45 52 52 4f  RINTF(" *** ERRO
2420: 52 20 2a 2a 2a 20 72 65 61 6c 6c 6f 63 20 72 65  R *** realloc re
2430: 74 75 72 6e 65 64 20 4e 55 4c 4c 20 28 73 69 7a  turned NULL (siz
2440: 65 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  e = %lu)", (unsi
2450: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29  gned long) size)
2460: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
2470: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
2480: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
2490: 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28  BUG_FUNC_STRDUP(
24a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 74 72 2c  const char *ptr,
24b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e   const char *fun
24c0: 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09  c, int line) {..
24d0: 63 68 61 72 20 2a 72 65 74 76 61 6c 3b 0a 0a 09  char *retval;...
24e0: 72 65 74 76 61 6c 20 3d 20 73 74 72 64 75 70 28  retval = strdup(
24f0: 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ptr);...fprintf(
2500: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2510: 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a  ), "[%lu]: %s():
2520: 25 69 3a 20 53 54 52 44 55 50 5f 4d 41 4c 4c 4f  %i: STRDUP_MALLO
2530: 43 28 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43  C() = %p\n", CAC
2540: 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d  KEY_DEBUG_GETTIM
2550: 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c  E(), func, line,
2560: 20 72 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73   retval);..fflus
2570: 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  h(cackey_debug_f
2580: 64 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  d());...return(r
2590: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
25a0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
25b0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
25c0: 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67  TAG_TO_STR(unsig
25d0: 6e 65 64 20 63 68 61 72 20 74 61 67 29 20 7b 0a  ned char tag) {.
25e0: 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a  .switch (tag) {.
25f0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2600: 5f 43 41 52 44 49 44 3a 0a 09 09 09 72 65 74 75  _CARDID:....retu
2610: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2620: 52 44 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47  RDID");...case G
2630: 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52  SCIS_TAG_CCC_VER
2640: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2650: 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 22 29  IS_TAG_CCC_VER")
2660: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2670: 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09 09 09 72  AG_CCG_VER:....r
2680: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2690: 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09 09 63 61  _CCG_VER");...ca
26a0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
26b0: 44 55 52 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  DURL:....return(
26c0: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55  "GSCIS_TAG_CARDU
26d0: 52 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  RL");...case GSC
26e0: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09  IS_TAG_PKCS15:..
26f0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2700: 54 41 47 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09  TAG_PKCS15");...
2710: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52  case GSCIS_TAG_R
2720: 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09  EG_DATA_MODEL:..
2730: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2740: 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44  TAG_REG_DATA_MOD
2750: 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  EL");...case GSC
2760: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
2770: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2780: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
2790: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
27a0: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a  _TAG_CARD_APDU:.
27b0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
27c0: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 22 29  _TAG_CARD_APDU")
27d0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
27e0: 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a  AG_REDIRECTION:.
27f0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2800: 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e  _TAG_REDIRECTION
2810: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2820: 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72 65 74 75  _TAG_CT:....retu
2830: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 54  rn("GSCIS_TAG_CT
2840: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2850: 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72 65 74 75  _TAG_ST:....retu
2860: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 54  rn("GSCIS_TAG_ST
2870: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2880: 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09  _TAG_NEXTCCC:...
2890: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
28a0: 41 47 5f 4e 45 58 54 43 43 43 22 29 3b 0a 09 09  AG_NEXTCCC");...
28b0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 46  case GSCIS_TAG_F
28c0: 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  NAME:....return(
28d0: 22 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45  "GSCIS_TAG_FNAME
28e0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
28f0: 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72  _TAG_MNAME:....r
2900: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2910: 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65  _MNAME");...case
2920: 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45   GSCIS_TAG_LNAME
2930: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2940: 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a  IS_TAG_LNAME");.
2950: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2960: 5f 53 55 46 46 49 58 3a 0a 09 09 09 72 65 74 75  _SUFFIX:....retu
2970: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 55  rn("GSCIS_TAG_SU
2980: 46 46 49 58 22 29 3b 0a 09 09 63 61 73 65 20 47  FFIX");...case G
2990: 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47  SCIS_TAG_GOVT_AG
29a0: 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  ENCY:....return(
29b0: 22 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f  "GSCIS_TAG_GOVT_
29c0: 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65  AGENCY");...case
29d0: 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41   GSCIS_TAG_BUREA
29e0: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  U:....return("GS
29f0: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 22 29  CIS_TAG_BUREAU")
2a00: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2a10: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a  AG_BUREAU_CODE:.
2a20: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2a30: 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45  _TAG_BUREAU_CODE
2a40: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2a50: 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a  _TAG_DEPT_CODE:.
2a60: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2a70: 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 22 29  _TAG_DEPT_CODE")
2a80: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2a90: 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09 72 65 74  AG_TITLE:....ret
2aa0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 54  urn("GSCIS_TAG_T
2ab0: 49 54 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47  ITLE");...case G
2ac0: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
2ad0: 47 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  G:....return("GS
2ae0: 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47  CIS_TAG_BUILDING
2af0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2b00: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
2b10: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  1:....return("GS
2b20: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
2b30: 44 44 52 31 22 29 3b 0a 09 09 63 61 73 65 20 47  DDR1");...case G
2b40: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2b50: 41 44 44 52 32 3a 0a 09 09 09 72 65 74 75 72 6e  ADDR2:....return
2b60: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2b70: 43 45 5f 41 44 44 52 32 22 29 3b 0a 09 09 63 61  CE_ADDR2");...ca
2b80: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2b90: 49 43 45 5f 43 49 54 59 3a 0a 09 09 09 72 65 74  ICE_CITY:....ret
2ba0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2bb0: 46 46 49 43 45 5f 43 49 54 59 22 29 3b 0a 09 09  FFICE_CITY");...
2bc0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2bd0: 46 46 49 43 45 5f 53 54 41 54 45 3a 0a 09 09 09  FFICE_STATE:....
2be0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2bf0: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 22 29  G_OFFICE_STATE")
2c00: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2c10: 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09  AG_OFFICE_ZIP:..
2c20: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2c30: 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29  TAG_OFFICE_ZIP")
2c40: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2c50: 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52  AG_OFFICE_COUNTR
2c60: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2c70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2c80: 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63 61 73 65  OUNTRY");...case
2c90: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2ca0: 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75  E_PHONE:....retu
2cb0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2cc0: 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09  FICE_PHONE");...
2cd0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2ce0: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a  FFICE_PHONE_EXT:
2cf0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2d00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
2d10: 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63 61 73 65  NE_EXT");...case
2d20: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2d30: 45 5f 46 41 58 3a 0a 09 09 09 72 65 74 75 72 6e  E_FAX:....return
2d40: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2d50: 43 45 5f 46 41 58 22 29 3b 0a 09 09 63 61 73 65  CE_FAX");...case
2d60: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2d70: 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75  E_EMAIL:....retu
2d80: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2d90: 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09  FICE_EMAIL");...
2da0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2db0: 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72  FFICE_ROOM:....r
2dc0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2dd0: 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a  _OFFICE_ROOM");.
2de0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2df0: 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a  _NONGOV_AGENCY:.
2e00: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2e10: 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e  _TAG_NONGOV_AGEN
2e20: 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  CY");...case GSC
2e30: 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47  IS_TAG_SSN_DESIG
2e40: 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e  NATOR:....return
2e50: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f  ("GSCIS_TAG_SSN_
2e60: 44 45 53 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09  DESIGNATOR");...
2e70: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
2e80: 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  SN:....return("G
2e90: 53 43 49 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a  SCIS_TAG_SSN");.
2ea0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2eb0: 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75 72 6e 28  _DOB:....return(
2ec0: 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 22 29  "GSCIS_TAG_DOB")
2ed0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2ee0: 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09 09 72 65  AG_GENDER:....re
2ef0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2f00: 47 45 4e 44 45 52 22 29 3b 0a 09 09 63 61 73 65  GENDER");...case
2f10: 20 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49   GSCIS_TAG_USERI
2f20: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
2f30: 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 22 29  CIS_TAG_USERID")
2f40: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2f50: 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65  AG_DOMAIN:....re
2f60: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2f70: 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63 61 73 65  DOMAIN");...case
2f80: 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57   GSCIS_TAG_PASSW
2f90: 4f 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ORD:....return("
2fa0: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
2fb0: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  RD");...case GSC
2fc0: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 3a  IS_TAG_ISSUERID:
2fd0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2fe0: 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 22 29  S_TAG_ISSUERID")
2ff0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
3000: 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74  AG_SERNO:....ret
3010: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
3020: 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73 65 20 47  ERNO");...case G
3030: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44  SCIS_TAG_ISSUE_D
3040: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
3050: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f  GSCIS_TAG_ISSUE_
3060: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  DATE");...case G
3070: 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f  SCIS_TAG_EXPIRE_
3080: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
3090: 22 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52  "GSCIS_TAG_EXPIR
30a0: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65  E_DATE");...case
30b0: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f   GSCIS_TAG_CARD_
30c0: 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TYPE:....return(
30d0: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f  "GSCIS_TAG_CARD_
30e0: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 47  TYPE");...case G
30f0: 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54  SCIS_TAG_SECURIT
3100: 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72  Y_CODE:....retur
3110: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 43  n("GSCIS_TAG_SEC
3120: 55 52 49 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09  URITY_CODE");...
3130: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
3140: 41 52 44 49 44 5f 41 49 44 3a 0a 09 09 09 72 65  ARDID_AID:....re
3150: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
3160: 43 41 52 44 49 44 5f 41 49 44 22 29 3b 0a 09 09  CARDID_AID");...
3170: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
3180: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 72  ERTIFICATE:....r
3190: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
31a0: 5f 43 45 52 54 49 46 49 43 41 54 45 22 29 3b 0a  _CERTIFICATE");.
31b0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
31c0: 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45  _CERT_ISSUE_DATE
31d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
31e0: 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55  IS_TAG_CERT_ISSU
31f0: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65  E_DATE");...case
3200: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f   GSCIS_TAG_CERT_
3210: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09  EXPIRE_DATE:....
3220: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
3230: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41  G_CERT_EXPIRE_DA
3240: 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  TE");..}...retur
3250: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
3260: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3270: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
3280: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
3290: 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f  O_STR(LONG retco
32a0: 64 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 72  de) {..switch (r
32b0: 65 74 63 6f 64 65 29 20 7b 0a 09 09 63 61 73 65  etcode) {...case
32c0: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
32d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
32e0: 52 44 5f 53 5f 53 55 43 43 45 53 53 22 29 3b 0a  RD_S_SUCCESS");.
32f0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43  ..case SCARD_E_C
3300: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74  ANCELLED:....ret
3310: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e  urn("SCARD_E_CAN
3320: 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65  CELLED");...case
3330: 20 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49   SCARD_E_CANT_DI
3340: 53 50 4f 53 45 3a 0a 09 09 09 72 65 74 75 72 6e  SPOSE:....return
3350: 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44  ("SCARD_E_CANT_D
3360: 49 53 50 4f 53 45 22 29 3b 0a 09 09 63 61 73 65  ISPOSE");...case
3370: 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49   SCARD_E_INSUFFI
3380: 43 49 45 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09  CIENT_BUFFER:...
3390: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
33a0: 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55  _INSUFFICIENT_BU
33b0: 46 46 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53  FFER");...case S
33c0: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41  CARD_E_INVALID_A
33d0: 54 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  TR:....return("S
33e0: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41  CARD_E_INVALID_A
33f0: 54 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  TR");...case SCA
3400: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
3410: 44 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DLE:....return("
3420: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
3430: 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63 61 73 65  HANDLE");...case
3440: 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
3450: 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09 09 09 72  _PARAMETER:....r
3460: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
3470: 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52  NVALID_PARAMETER
3480: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3490: 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45  _E_INVALID_TARGE
34a0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  T:....return("SC
34b0: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41  ARD_E_INVALID_TA
34c0: 52 47 45 54 22 29 3b 0a 09 09 63 61 73 65 20 53  RGET");...case S
34d0: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56  CARD_E_INVALID_V
34e0: 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ALUE:....return(
34f0: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
3500: 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65  _VALUE");...case
3510: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f   SCARD_E_NO_MEMO
3520: 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RY:....return("S
3530: 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59  CARD_E_NO_MEMORY
3540: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3550: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45  _E_UNKNOWN_READE
3560: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
3570: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45  ARD_E_UNKNOWN_RE
3580: 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53  ADER");...case S
3590: 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a  CARD_E_TIMEOUT:.
35a0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
35b0: 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09  _E_TIMEOUT");...
35c0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 48 41  case SCARD_E_SHA
35d0: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a  RING_VIOLATION:.
35e0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
35f0: 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41  _E_SHARING_VIOLA
3600: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 53  TION");...case S
3610: 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43  CARD_E_NO_SMARTC
3620: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
3630: 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54  SCARD_E_NO_SMART
3640: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
3650: 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43  CARD_E_UNKNOWN_C
3660: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
3670: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f  SCARD_E_UNKNOWN_
3680: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
3690: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
36a0: 4d 41 54 43 48 3a 0a 09 09 09 72 65 74 75 72 6e  MATCH:....return
36b0: 28 22 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  ("SCARD_E_PROTO_
36c0: 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09 09 63 61  MISMATCH");...ca
36d0: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52  se SCARD_E_NOT_R
36e0: 45 41 44 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  EADY:....return(
36f0: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41  "SCARD_E_NOT_REA
3700: 44 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  DY");...case SCA
3710: 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43  RD_E_SYSTEM_CANC
3720: 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ELLED:....return
3730: 28 22 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d  ("SCARD_E_SYSTEM
3740: 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09  _CANCELLED");...
3750: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54  case SCARD_E_NOT
3760: 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a 09 09 09  _TRANSACTED:....
3770: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3780: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 22 29  NOT_TRANSACTED")
3790: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
37a0: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
37b0: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
37c0: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
37d0: 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09  NAVAILABLE");...
37e0: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 53  case SCARD_W_UNS
37f0: 55 50 50 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09  UPPORTED_CARD:..
3800: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3810: 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41  W_UNSUPPORTED_CA
3820: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
3830: 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56  RD_W_UNRESPONSIV
3840: 45 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  E_CARD:....retur
3850: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 52 45 53  n("SCARD_W_UNRES
3860: 50 4f 4e 53 49 56 45 5f 43 41 52 44 22 29 3b 0a  PONSIVE_CARD");.
3870: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55  ..case SCARD_W_U
3880: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 3a 0a 09  NPOWERED_CARD:..
3890: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
38a0: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
38b0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
38c0: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 3a 0a 09  _W_RESET_CARD:..
38d0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
38e0: 57 5f 52 45 53 45 54 5f 43 41 52 44 22 29 3b 0a  W_RESET_CARD");.
38f0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52  ..case SCARD_W_R
3900: 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a 09 09 09  EMOVED_CARD:....
3910: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
3920: 52 45 4d 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a  REMOVED_CARD");.
3930: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50  ..case SCARD_E_P
3940: 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09  CI_TOO_SMALL:...
3950: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3960: 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29  _PCI_TOO_SMALL")
3970: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3980: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
3990: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
39a0: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
39b0: 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09  NSUPPORTED");...
39c0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 44 55 50  case SCARD_E_DUP
39d0: 4c 49 43 41 54 45 5f 52 45 41 44 45 52 3a 0a 09  LICATE_READER:..
39e0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
39f0: 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44  E_DUPLICATE_READ
3a00: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ER");...case SCA
3a10: 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50  RD_E_CARD_UNSUPP
3a20: 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ORTED:....return
3a30: 28 22 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55  ("SCARD_E_CARD_U
3a40: 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09  NSUPPORTED");...
3a50: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f  case SCARD_E_NO_
3a60: 53 45 52 56 49 43 45 3a 0a 09 09 09 72 65 74 75  SERVICE:....retu
3a70: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53  rn("SCARD_E_NO_S
3a80: 45 52 56 49 43 45 22 29 3b 0a 09 09 63 61 73 65  ERVICE");...case
3a90: 20 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45   SCARD_E_SERVICE
3aa0: 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09 72 65 74  _STOPPED:....ret
3ab0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 45 52  urn("SCARD_E_SER
3ac0: 56 49 43 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a  VICE_STOPPED");.
3ad0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55  ..case SCARD_E_U
3ae0: 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55  NSUPPORTED_FEATU
3af0: 52 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RE:....return("S
3b00: 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54  CARD_E_UNSUPPORT
3b10: 45 44 5f 46 45 41 54 55 52 45 22 29 3b 0a 23 69  ED_FEATURE");.#i
3b20: 66 64 65 66 20 53 43 41 52 44 5f 57 5f 49 4e 53  fdef SCARD_W_INS
3b30: 45 52 54 45 44 5f 43 41 52 44 0a 09 09 63 61 73  ERTED_CARD...cas
3b40: 65 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54  e SCARD_W_INSERT
3b50: 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ED_CARD:....retu
3b60: 72 6e 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45  rn("SCARD_W_INSE
3b70: 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 23 65 6e  RTED_CARD");.#en
3b80: 64 69 66 0a 23 69 66 64 65 66 20 53 43 41 52 44  dif.#ifdef SCARD
3b90: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56  _E_NO_READERS_AV
3ba0: 41 49 4c 41 42 4c 45 0a 09 09 63 61 73 65 20 53  AILABLE...case S
3bb0: 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52  CARD_E_NO_READER
3bc0: 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09  S_AVAILABLE:....
3bd0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3be0: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c  NO_READERS_AVAIL
3bf0: 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69 66 0a 09  ABLE");.#endif..
3c00: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
3c10: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
3c20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
3c30: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f  KEY_DEBUG_FUNC_O
3c40: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75 69 6e 74  BJID_TO_STR(uint
3c50: 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b 0a 09 73  16_t objid) {..s
3c60: 77 69 74 63 68 20 28 6f 62 6a 69 64 29 20 7b 0a  witch (objid) {.
3c70: 09 09 63 61 73 65 20 30 78 32 30 30 30 3a 0a 09  ..case 0x2000:..
3c80: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3c90: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52  _TLV_OBJID_GENER
3ca0: 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65  ALINFO");...case
3cb0: 20 30 78 32 31 30 30 3a 0a 09 09 09 72 65 74 75   0x2100:....retu
3cc0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3cd0: 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c  BJID_PROPERSONAL
3ce0: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
3cf0: 78 33 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x3000:....return
3d00: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3d10: 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c  ID_ACCESSCONTROL
3d20: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 34 30 30  ");...case 0x400
3d30: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3d40: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c  CKEY_TLV_OBJID_L
3d50: 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 30  OGIN");...case 0
3d60: 78 35 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x5000:....return
3d70: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3d80: 49 44 5f 43 41 52 44 49 4e 46 4f 22 29 3b 0a 09  ID_CARDINFO");..
3d90: 09 63 61 73 65 20 30 78 36 30 30 30 3a 0a 09 09  .case 0x6000:...
3da0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3db0: 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54  TLV_OBJID_BIOMET
3dc0: 52 49 43 53 22 29 3b 0a 09 09 63 61 73 65 20 30  RICS");...case 0
3dd0: 78 37 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x7000:....return
3de0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3df0: 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52  ID_DIGITALSIGCER
3e00: 54 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  T");...case 0x02
3e10: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3e20: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3e30: 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 09  CAC_PERSON");...
3e40: 63 61 73 65 20 30 78 30 32 30 32 3a 0a 09 09 09  case 0x0202:....
3e50: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3e60: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e  LV_OBJID_CAC_BEN
3e70: 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  EFITS");...case 
3e80: 30 78 30 32 30 33 3a 0a 09 09 09 72 65 74 75 72  0x0203:....retur
3e90: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3ea0: 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e  JID_CAC_OTHERBEN
3eb0: 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  EFITS");...case 
3ec0: 30 78 30 32 30 31 3a 0a 09 09 09 72 65 74 75 72  0x0201:....retur
3ed0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3ee0: 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45  JID_CAC_PERSONNE
3ef0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  L");...case 0x02
3f00: 46 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  FE:....return("C
3f10: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3f20: 43 41 43 5f 50 4b 49 43 45 52 54 22 29 3b 0a 09  CAC_PKICERT");..
3f30: 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b  }....return("UNK
3f40: 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69  NOWN");.}..stati
3f50: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
3f60: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
3f70: 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 75  APPTYPE_TO_STR(u
3f80: 69 6e 74 38 5f 74 20 61 70 70 74 79 70 65 29 20  int8_t apptype) 
3f90: 7b 0a 09 73 77 69 74 63 68 20 28 61 70 70 74 79  {..switch (appty
3fa0: 70 65 29 20 7b 0a 09 09 63 61 73 65 20 30 78 30  pe) {...case 0x0
3fb0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 4e 4f  0:....return("NO
3fc0: 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  NE");...case 0x0
3fd0: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  1:....return("CA
3fe0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
3ff0: 45 52 49 43 22 29 3b 0a 09 09 63 61 73 65 20 30  ERIC");...case 0
4000: 78 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x02:....return("
4010: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
4020: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
4030: 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  3:....return("CA
4040: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
4050: 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c  ERIC | CACKEY_TL
4060: 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63  V_APP_SKI");...c
4070: 61 73 65 20 30 78 30 34 3a 0a 09 09 09 72 65 74  ase 0x04:....ret
4080: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
4090: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73  APP_PKI");...cas
40a0: 65 20 30 78 30 35 3a 0a 09 09 09 72 65 74 75 72  e 0x05:....retur
40b0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
40c0: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b  P_GENERIC | CACK
40d0: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29  EY_TLV_APP_PKI")
40e0: 3b 0a 09 09 63 61 73 65 20 30 78 30 36 3a 0a 09  ;...case 0x06:..
40f0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
4100: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43  _TLV_APP_SKI | C
4110: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
4120: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 37  I");...case 0x07
4130: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
4140: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45  KEY_TLV_APP_GENE
4150: 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  RIC | CACKEY_TLV
4160: 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45  _APP_SKI | CACKE
4170: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b  Y_TLV_APP_PKI");
4180: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 49 4e  ..}...return("IN
4190: 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 73 74 61 74  VALID");.}..stat
41a0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43  ic const char *C
41b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
41c0: 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54  _ATTRIBUTE_TO_ST
41d0: 52 28 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 54  R(CK_ATTRIBUTE_T
41e0: 59 50 45 20 61 74 74 72 29 20 7b 0a 09 73 77 69  YPE attr) {..swi
41f0: 74 63 68 20 28 61 74 74 72 29 20 7b 0a 09 09 63  tch (attr) {...c
4200: 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09  ase CKA_CLASS:..
4210: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 4c  ..return("CKA_CL
4220: 41 53 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ASS");...case CK
4230: 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 72 65 74 75  A_TOKEN:....retu
4240: 72 6e 28 22 43 4b 41 5f 54 4f 4b 45 4e 22 29 3b  rn("CKA_TOKEN");
4250: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56  ...case CKA_PRIV
4260: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
4270: 43 4b 41 5f 50 52 49 56 41 54 45 22 29 3b 0a 09  CKA_PRIVATE");..
4280: 09 63 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a  .case CKA_LABEL:
4290: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
42a0: 4c 41 42 45 4c 22 29 3b 0a 09 09 63 61 73 65 20  LABEL");...case 
42b0: 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e 3a  CKA_APPLICATION:
42c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
42d0: 41 50 50 4c 49 43 41 54 49 4f 4e 22 29 3b 0a 09  APPLICATION");..
42e0: 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a  .case CKA_VALUE:
42f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4300: 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20  VALUE");...case 
4310: 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 3a 0a 09  CKA_OBJECT_ID:..
4320: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 42  ..return("CKA_OB
4330: 4a 45 43 54 5f 49 44 22 29 3b 0a 09 09 63 61 73  JECT_ID");...cas
4340: 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54  e CKA_CERTIFICAT
4350: 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72  E_TYPE:....retur
4360: 6e 28 22 43 4b 41 5f 43 45 52 54 49 46 49 43 41  n("CKA_CERTIFICA
4370: 54 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73  TE_TYPE");...cas
4380: 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09  e CKA_ISSUER:...
4390: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 49 53 53  .return("CKA_ISS
43a0: 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  UER");...case CK
43b0: 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a  A_SERIAL_NUMBER:
43c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
43d0: 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 22 29 3b  SERIAL_NUMBER");
43e0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 43 5f 49  ...case CKA_AC_I
43f0: 53 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  SSUER:....return
4400: 28 22 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 22  ("CKA_AC_ISSUER"
4410: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 57  );...case CKA_OW
4420: 4e 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  NER:....return("
4430: 43 4b 41 5f 4f 57 4e 45 52 22 29 3b 0a 09 09 63  CKA_OWNER");...c
4440: 61 73 65 20 43 4b 41 5f 41 54 54 52 5f 54 59 50  ase CKA_ATTR_TYP
4450: 45 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ES:....return("C
4460: 4b 41 5f 41 54 54 52 5f 54 59 50 45 53 22 29 3b  KA_ATTR_TYPES");
4470: 0a 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
4480: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
4490: 43 4b 41 5f 54 52 55 53 54 45 44 22 29 3b 0a 09  CKA_TRUSTED");..
44a0: 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59  .case CKA_KEY_TY
44b0: 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  PE:....return("C
44c0: 4b 41 5f 4b 45 59 5f 54 59 50 45 22 29 3b 0a 09  KA_KEY_TYPE");..
44d0: 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43  .case CKA_SUBJEC
44e0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
44f0: 41 5f 53 55 42 4a 45 43 54 22 29 3b 0a 09 09 63  A_SUBJECT");...c
4500: 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 72  ase CKA_ID:....r
4510: 65 74 75 72 6e 28 22 43 4b 41 5f 49 44 22 29 3b  eturn("CKA_ID");
4520: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53  ...case CKA_SENS
4530: 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ITIVE:....return
4540: 28 22 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 22  ("CKA_SENSITIVE"
4550: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e  );...case CKA_EN
4560: 43 52 59 50 54 3a 0a 09 09 09 72 65 74 75 72 6e  CRYPT:....return
4570: 28 22 43 4b 41 5f 45 4e 43 52 59 50 54 22 29 3b  ("CKA_ENCRYPT");
4580: 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52  ...case CKA_DECR
4590: 59 50 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  YPT:....return("
45a0: 43 4b 41 5f 44 45 43 52 59 50 54 22 29 3b 0a 09  CKA_DECRYPT");..
45b0: 09 63 61 73 65 20 43 4b 41 5f 57 52 41 50 3a 0a  .case CKA_WRAP:.
45c0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 57  ...return("CKA_W
45d0: 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  RAP");...case CK
45e0: 41 5f 55 4e 57 52 41 50 3a 0a 09 09 09 72 65 74  A_UNWRAP:....ret
45f0: 75 72 6e 28 22 43 4b 41 5f 55 4e 57 52 41 50 22  urn("CKA_UNWRAP"
4600: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49  );...case CKA_SI
4610: 47 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  GN:....return("C
4620: 4b 41 5f 53 49 47 4e 22 29 3b 0a 09 09 63 61 73  KA_SIGN");...cas
4630: 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56  e CKA_SIGN_RECOV
4640: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ER:....return("C
4650: 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 22  KA_SIGN_RECOVER"
4660: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45  );...case CKA_VE
4670: 52 49 46 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  RIFY:....return(
4680: 22 43 4b 41 5f 56 45 52 49 46 59 22 29 3b 0a 09  "CKA_VERIFY");..
4690: 09 63 61 73 65 20 43 4b 41 5f 56 45 52 49 46 59  .case CKA_VERIFY
46a0: 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74  _RECOVER:....ret
46b0: 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59 5f  urn("CKA_VERIFY_
46c0: 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73  RECOVER");...cas
46d0: 65 20 43 4b 41 5f 44 45 52 49 56 45 3a 0a 09 09  e CKA_DERIVE:...
46e0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 52  .return("CKA_DER
46f0: 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  IVE");...case CK
4700: 41 5f 53 54 41 52 54 5f 44 41 54 45 3a 0a 09 09  A_START_DATE:...
4710: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 54 41  .return("CKA_STA
4720: 52 54 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  RT_DATE");...cas
4730: 65 20 43 4b 41 5f 45 4e 44 5f 44 41 54 45 3a 0a  e CKA_END_DATE:.
4740: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4750: 4e 44 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  ND_DATE");...cas
4760: 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09  e CKA_MODULUS:..
4770: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f  ..return("CKA_MO
4780: 44 55 4c 55 53 22 29 3b 0a 09 09 63 61 73 65 20  DULUS");...case 
4790: 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53  CKA_MODULUS_BITS
47a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
47b0: 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53 22 29 3b  _MODULUS_BITS");
47c0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c  ...case CKA_PUBL
47d0: 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09  IC_EXPONENT:....
47e0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 55 42 4c  return("CKA_PUBL
47f0: 49 43 5f 45 58 50 4f 4e 45 4e 54 22 29 3b 0a 09  IC_EXPONENT");..
4800: 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54  .case CKA_PRIVAT
4810: 45 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 72  E_EXPONENT:....r
4820: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41  eturn("CKA_PRIVA
4830: 54 45 5f 45 58 50 4f 4e 45 4e 54 22 29 3b 0a 09  TE_EXPONENT");..
4840: 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f  .case CKA_PRIME_
4850: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  1:....return("CK
4860: 41 5f 50 52 49 4d 45 5f 31 22 29 3b 0a 09 09 63  A_PRIME_1");...c
4870: 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f 32 3a  ase CKA_PRIME_2:
4880: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4890: 50 52 49 4d 45 5f 32 22 29 3b 0a 09 09 63 61 73  PRIME_2");...cas
48a0: 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31  e CKA_EXPONENT_1
48b0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
48c0: 5f 45 58 50 4f 4e 45 4e 54 5f 31 22 29 3b 0a 09  _EXPONENT_1");..
48d0: 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e 45  .case CKA_EXPONE
48e0: 4e 54 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  NT_2:....return(
48f0: 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 22  "CKA_EXPONENT_2"
4900: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4f  );...case CKA_CO
4910: 45 46 46 49 43 49 45 4e 54 3a 0a 09 09 09 72 65  EFFICIENT:....re
4920: 74 75 72 6e 28 22 43 4b 41 5f 43 4f 45 46 46 49  turn("CKA_COEFFI
4930: 43 49 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20  CIENT");...case 
4940: 43 4b 41 5f 50 52 49 4d 45 3a 0a 09 09 09 72 65  CKA_PRIME:....re
4950: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 22  turn("CKA_PRIME"
4960: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55  );...case CKA_SU
4970: 42 50 52 49 4d 45 3a 0a 09 09 09 72 65 74 75 72  BPRIME:....retur
4980: 6e 28 22 43 4b 41 5f 53 55 42 50 52 49 4d 45 22  n("CKA_SUBPRIME"
4990: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 42 41  );...case CKA_BA
49a0: 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  SE:....return("C
49b0: 4b 41 5f 42 41 53 45 22 29 3b 0a 09 09 63 61 73  KA_BASE");...cas
49c0: 65 20 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53  e CKA_PRIME_BITS
49d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
49e0: 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a 09  _PRIME_BITS");..
49f0: 09 63 61 73 65 20 43 4b 41 5f 53 55 42 5f 50 52  .case CKA_SUB_PR
4a00: 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74  IME_BITS:....ret
4a10: 75 72 6e 28 22 43 4b 41 5f 53 55 42 5f 50 52 49  urn("CKA_SUB_PRI
4a20: 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73  ME_BITS");...cas
4a30: 65 20 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53  e CKA_VALUE_BITS
4a40: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4a50: 5f 56 41 4c 55 45 5f 42 49 54 53 22 29 3b 0a 09  _VALUE_BITS");..
4a60: 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 5f  .case CKA_VALUE_
4a70: 4c 45 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  LEN:....return("
4a80: 43 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 22 29 3b  CKA_VALUE_LEN");
4a90: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 54 52  ...case CKA_EXTR
4aa0: 41 43 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  ACTABLE:....retu
4ab0: 72 6e 28 22 43 4b 41 5f 45 58 54 52 41 43 54 41  rn("CKA_EXTRACTA
4ac0: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  BLE");...case CK
4ad0: 41 5f 4c 4f 43 41 4c 3a 0a 09 09 09 72 65 74 75  A_LOCAL:....retu
4ae0: 72 6e 28 22 43 4b 41 5f 4c 4f 43 41 4c 22 29 3b  rn("CKA_LOCAL");
4af0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4e 45 56 45  ...case CKA_NEVE
4b00: 52 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09  R_EXTRACTABLE:..
4b10: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4e 45  ..return("CKA_NE
4b20: 56 45 52 5f 45 58 54 52 41 43 54 41 42 4c 45 22  VER_EXTRACTABLE"
4b30: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 4c  );...case CKA_AL
4b40: 57 41 59 53 5f 53 45 4e 53 49 54 49 56 45 3a 0a  WAYS_SENSITIVE:.
4b50: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
4b60: 4c 57 41 59 53 5f 53 45 4e 53 49 54 49 56 45 22  LWAYS_SENSITIVE"
4b70: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b 45  );...case CKA_KE
4b80: 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49 53 4d 3a  Y_GEN_MECHANISM:
4b90: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4ba0: 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49 53  KEY_GEN_MECHANIS
4bb0: 4d 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  M");...case CKA_
4bc0: 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 72  MODIFIABLE:....r
4bd0: 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 49 46  eturn("CKA_MODIF
4be0: 49 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20  IABLE");...case 
4bf0: 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41 4d 53  CKA_ECDSA_PARAMS
4c00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4c10: 5f 45 43 44 53 41 5f 50 41 52 41 4d 53 22 29 3b  _ECDSA_PARAMS");
4c20: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 5f 50  ...case CKA_EC_P
4c30: 4f 49 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  OINT:....return(
4c40: 22 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 22 29 3b  "CKA_EC_POINT");
4c50: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45 43 4f  ...case CKA_SECO
4c60: 4e 44 41 52 59 5f 41 55 54 48 3a 0a 09 09 09 72  NDARY_AUTH:....r
4c70: 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 43 4f 4e  eturn("CKA_SECON
4c80: 44 41 52 59 5f 41 55 54 48 22 29 3b 0a 09 09 63  DARY_AUTH");...c
4c90: 61 73 65 20 43 4b 41 5f 41 55 54 48 5f 50 49 4e  ase CKA_AUTH_PIN
4ca0: 5f 46 4c 41 47 53 3a 0a 09 09 09 72 65 74 75 72  _FLAGS:....retur
4cb0: 6e 28 22 43 4b 41 5f 41 55 54 48 5f 50 49 4e 5f  n("CKA_AUTH_PIN_
4cc0: 46 4c 41 47 53 22 29 3b 0a 09 09 63 61 73 65 20  FLAGS");...case 
4cd0: 43 4b 41 5f 48 57 5f 46 45 41 54 55 52 45 5f 54  CKA_HW_FEATURE_T
4ce0: 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  YPE:....return("
4cf0: 43 4b 41 5f 48 57 5f 46 45 41 54 55 52 45 5f 54  CKA_HW_FEATURE_T
4d00: 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  YPE");...case CK
4d10: 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54 3a  A_RESET_ON_INIT:
4d20: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4d30: 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54 22 29 3b  RESET_ON_INIT");
4d40: 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 41 53 5f  ...case CKA_HAS_
4d50: 52 45 53 45 54 3a 0a 09 09 09 72 65 74 75 72 6e  RESET:....return
4d60: 28 22 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 22  ("CKA_HAS_RESET"
4d70: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45  );...case CKA_VE
4d80: 4e 44 4f 52 5f 44 45 46 49 4e 45 44 3a 0a 09 09  NDOR_DEFINED:...
4d90: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 4e  .return("CKA_VEN
4da0: 44 4f 52 5f 44 45 46 49 4e 45 44 22 29 3b 0a 09  DOR_DEFINED");..
4db0: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
4dc0: 4f 57 4e 22 29 3b 0a 7d 0a 0a 23 20 20 64 65 66  OWN");.}..#  def
4dd0: 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29 20 43 41  ine malloc(x) CA
4de0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4df0: 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e 63  MALLOC(x, __func
4e00: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20  __, __LINE__).# 
4e10: 20 64 65 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28   define realloc(
4e20: 78 2c 20 79 29 20 43 41 43 4b 45 59 5f 44 45 42  x, y) CACKEY_DEB
4e30: 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28  UG_FUNC_REALLOC(
4e40: 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  x, y, __func__, 
4e50: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 69 66 64  __LINE__).#  ifd
4e60: 65 66 20 73 74 72 64 75 70 0a 23 20 20 20 20 75  ef strdup.#    u
4e70: 6e 64 65 66 20 73 74 72 64 75 70 0a 23 20 20 65  ndef strdup.#  e
4e80: 6e 64 69 66 0a 23 20 20 64 65 66 69 6e 65 20 73  ndif.#  define s
4e90: 74 72 64 75 70 28 78 29 20 43 41 43 4b 45 59 5f  trdup(x) CACKEY_
4ea0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55  DEBUG_FUNC_STRDU
4eb0: 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f  P(x, __func__, _
4ec0: 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23  _LINE__).#else.#
4ed0: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4ee0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e  DEBUG_PRINTF(x..
4ef0: 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  .) /**/.#  defin
4f00: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
4f10: 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29  RINTBUF(f, x, y)
4f20: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20   /**/.#  define 
4f30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4f40: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 78 29 20  C_TAG_TO_STR(x) 
4f50: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22  "DEBUG_DISABLED"
4f60: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4f70: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
4f80: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 78 29 20  RDERR_TO_STR(x) 
4f90: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22  "DEBUG_DISABLED"
4fa0: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4fb0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a  Y_DEBUG_FUNC_OBJ
4fc0: 49 44 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45  ID_TO_STR(x) "DE
4fd0: 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20  BUG_DISABLED".# 
4fe0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
4ff0: 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
5000: 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42  E_TO_STR(x) "DEB
5010: 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20  UG_DISABLED".#  
5020: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
5030: 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55  BUG_FUNC_ATTRIBU
5040: 54 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45  TE_TO_STR(x) "DE
5050: 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 65  BUG_DISABLED".#e
5060: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 6e 63 6c  ndif../*. * Incl
5070: 75 64 65 20 74 68 65 73 65 20 73 6f 75 72 63 65  ude these source
5080: 20 66 69 6c 65 73 20 69 6e 20 74 68 69 73 20 74   files in this t
5090: 72 61 6e 73 6c 61 74 69 6f 6e 20 75 6e 69 74 20  ranslation unit 
50a0: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 62  so that we can b
50b0: 69 6e 64 20 74 6f 0a 20 2a 20 66 75 6e 63 74 69  ind to. * functi
50c0: 6f 6e 73 20 61 6e 64 20 6e 6f 74 20 69 6e 63 6c  ons and not incl
50d0: 75 64 65 20 61 6e 79 20 73 79 6d 62 6f 6c 73 20  ude any symbols 
50e0: 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  in the output sh
50f0: 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 2a 2f  ared object.. */
5100: 0a 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d  .#include "asn1-
5110: 78 35 30 39 2e 63 22 0a 23 69 6e 63 6c 75 64 65  x509.c".#include
5120: 20 22 73 68 61 31 2e 63 22 0a 23 69 6e 63 6c 75   "sha1.c".#inclu
5130: 64 65 20 22 6d 64 35 2e 63 22 0a 0a 74 79 70 65  de "md5.c"..type
5140: 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b  def enum {..CACK
5150: 45 59 5f 49 44 5f 54 59 50 45 5f 45 52 52 4f 52  EY_ID_TYPE_ERROR
5160: 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  ,..CACKEY_ID_TYP
5170: 45 5f 55 4e 4b 4e 4f 57 4e 2c 0a 09 43 41 43 4b  E_UNKNOWN,..CACK
5180: 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 2c 0a  EY_ID_TYPE_CAC,.
5190: 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f  .CACKEY_ID_TYPE_
51a0: 50 49 56 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f  PIV,..CACKEY_ID_
51b0: 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 0a 7d  TYPE_CERT_ONLY.}
51c0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f   cackey_pcsc_id_
51d0: 74 79 70 65 3b 0a 0a 73 74 72 75 63 74 20 63 61  type;..struct ca
51e0: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
51f0: 74 79 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73  ty {..cackey_pcs
5200: 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79 70  c_id_type id_typ
5210: 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 65 72 74  e;...size_t cert
5220: 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e  ificate_len;..un
5230: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
5240: 74 69 66 69 63 61 74 65 3b 0a 0a 09 73 73 69 7a  tificate;...ssiz
5250: 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a 0a 09 75  e_t keysize;...u
5260: 6e 69 6f 6e 20 7b 0a 09 09 73 74 72 75 63 74 20  nion {...struct 
5270: 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64 20 63 68  {....unsigned ch
5280: 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a 09 09  ar applet[7];...
5290: 09 75 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b 0a  .uint16_t file;.
52a0: 09 09 7d 20 63 61 63 3b 0a 0a 09 09 73 74 72 75  ..} cac;....stru
52b0: 63 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64  ct {....unsigned
52c0: 20 63 68 61 72 20 6b 65 79 5f 69 64 3b 0a 09 09   char key_id;...
52d0: 09 63 68 61 72 20 6c 61 62 65 6c 5b 33 32 5d 3b  .char label[32];
52e0: 0a 09 09 7d 20 70 69 76 3b 0a 09 7d 20 63 61 72  ...} piv;..} car
52f0: 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  d;.};..struct ca
5300: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a  ckey_identity {.
5310: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
5320: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63  csc_identity *pc
5330: 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43  sc_identity;...C
5340: 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61 74 74  K_ATTRIBUTE *att
5350: 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f  ributes;..CK_ULO
5360: 4e 47 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f  NG attributes_co
5370: 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  unt;.};..struct 
5380: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b  cackey_session {
5390: 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09  ..int active;...
53a0: 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
53b0: 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74  D;...CK_STATE st
53c0: 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66  ate;..CK_FLAGS f
53d0: 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  lags;..CK_ULONG 
53e0: 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09  ulDeviceError;..
53f0: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70  CK_VOID_PTR pApp
5400: 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f  lication;..CK_NO
5410: 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73  TIFY Notify;...s
5420: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
5430: 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
5440: 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
5450: 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  g identities_cou
5460: 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68  nt;...int search
5470: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54  _active;..CK_ATT
5480: 52 49 42 55 54 45 5f 50 54 52 20 73 65 61 72 63  RIBUTE_PTR searc
5490: 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f  h_query;..CK_ULO
54a0: 4e 47 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f  NG search_query_
54b0: 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64  count;..unsigned
54c0: 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72   long search_cur
54d0: 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e  r_id;...int sign
54e0: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43  _active;..CK_MEC
54f0: 48 41 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e  HANISM_TYPE sign
5500: 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f  _mechanism;..CK_
5510: 42 59 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75  BYTE_PTR sign_bu
5520: 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  f;..unsigned lon
5530: 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09  g sign_buflen;..
5540: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69  unsigned long si
5550: 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72  gn_bufused;..str
5560: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
5570: 69 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69  ity *sign_identi
5580: 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70  ty;...int decryp
5590: 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45  t_active;..CK_ME
55a0: 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63  CHANISM_TYPE dec
55b0: 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a  rypt_mechanism;.
55c0: 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63  .CK_VOID_PTR dec
55d0: 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a  rypt_mech_parm;.
55e0: 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70  .CK_ULONG decryp
55f0: 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a  t_mech_parmlen;.
5600: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
5610: 64 65 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74  dentity *decrypt
5620: 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73  _identity;.};..s
5630: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
5640: 74 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b  t {..int active;
5650: 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61 6c 3b 0a  ..int internal;.
5660: 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
5670: 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f  der;...int pcsc_
5680: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a  card_connected;.
5690: 09 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73  .SCARDHANDLE pcs
56a0: 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72  c_card;...int tr
56b0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b  ansaction_depth;
56c0: 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ..int transactio
56d0: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a  n_need_hw_lock;.
56e0: 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74  ..int slot_reset
56f0: 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b  ;...CK_FLAGS tok
5700: 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69  en_flags;...unsi
5710: 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c  gned char *label
5720: 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  ;...DWORD protoc
5730: 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69  ol;...unsigned i
5740: 6e 74 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f  nt cached_certs_
5750: 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63 74 20 63  count;..struct c
5760: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
5770: 69 74 79 20 2a 63 61 63 68 65 64 5f 63 65 72 74  ity *cached_cert
5780: 73 3b 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  s;...cackey_pcsc
5790: 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79 70 65  _id_type id_type
57a0: 5f 68 69 6e 74 3b 0a 7d 3b 0a 0a 74 79 70 65 64  _hint;.};..typed
57b0: 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45  ef enum {..CACKE
57c0: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49  Y_TLV_APP_GENERI
57d0: 43 20 3d 20 30 78 30 31 2c 0a 09 43 41 43 4b 45  C = 0x01,..CACKE
57e0: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20  Y_TLV_APP_SKI   
57f0: 20 20 3d 20 30 78 30 32 2c 0a 09 43 41 43 4b 45    = 0x02,..CACKE
5800: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20  Y_TLV_APP_PKI   
5810: 20 20 3d 20 30 78 30 34 0a 7d 20 63 61 63 6b 65    = 0x04.} cacke
5820: 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a  y_tlv_apptype;..
5830: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09  typedef enum {..
5840: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5850: 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20  _GENERALINFO    
5860: 20 20 20 3d 20 30 78 32 30 30 30 2c 0a 09 43 41     = 0x2000,..CA
5870: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50  CKEY_TLV_OBJID_P
5880: 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20  ROPERSONALINFO  
5890: 20 3d 20 30 78 32 31 30 30 2c 0a 09 43 41 43 4b   = 0x2100,..CACK
58a0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43  EY_TLV_OBJID_ACC
58b0: 45 53 53 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d  ESSCONTROL     =
58c0: 20 30 78 33 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x3000,..CACKEY
58d0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e  _TLV_OBJID_LOGIN
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30               = 0
58f0: 78 34 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x4000,..CACKEY_T
5900: 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46  LV_OBJID_CARDINF
5910: 4f 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 35  O          = 0x5
5920: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
5930: 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43  _OBJID_BIOMETRIC
5940: 53 20 20 20 20 20 20 20 20 3d 20 30 78 36 30 30  S        = 0x600
5950: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
5960: 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43  BJID_DIGITALSIGC
5970: 45 52 54 20 20 20 20 3d 20 30 78 37 30 30 30 2c  ERT    = 0x7000,
5980: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5990: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 20 20 20  ID_CAC_PERSON   
59a0: 20 20 20 20 20 3d 20 30 78 30 32 30 30 2c 0a 09       = 0x0200,..
59b0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
59c0: 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 20 20 20  _CAC_BENEFITS   
59d0: 20 20 20 3d 20 30 78 30 32 30 32 2c 0a 09 43 41     = 0x0202,..CA
59e0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
59f0: 41 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53  AC_OTHERBENEFITS
5a00: 20 3d 20 30 78 30 32 30 33 2c 0a 09 43 41 43 4b   = 0x0203,..CACK
5a10: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
5a20: 5f 50 45 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d  _PERSONNEL     =
5a30: 20 30 78 30 32 30 31 2c 0a 09 43 41 43 4b 45 59   0x0201,..CACKEY
5a40: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50  _TLV_OBJID_CAC_P
5a50: 4b 49 43 45 52 54 20 20 20 20 20 20 20 3d 20 30  KICERT       = 0
5a60: 78 30 32 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74  x02FE.} cackey_t
5a70: 6c 76 5f 6f 62 6a 65 63 74 69 64 3b 0a 0a 74 79  lv_objectid;..ty
5a80: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41  pedef enum {..CA
5a90: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
5aa0: 4e 50 52 45 53 45 4e 54 20 20 20 20 3d 20 31 2c  NPRESENT    = 1,
5ab0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  ..CACKEY_PCSC_S_
5ac0: 4f 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OK              
5ad0: 3d 20 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53  = 0,..CACKEY_PCS
5ae0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20  C_E_GENERIC     
5af0: 20 20 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45      = -1,..CACKE
5b00: 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20  Y_PCSC_E_BADPIN 
5b10: 20 20 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09           = -2,..
5b20: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
5b30: 43 4b 45 44 20 20 20 20 20 20 20 20 20 20 3d 20  CKED          = 
5b40: 2d 33 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -3,..CACKEY_PCSC
5b50: 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 20 20 20  _E_NEEDLOGIN    
5b60: 20 20 20 3d 20 2d 34 2c 0a 09 43 41 43 4b 45 59     = -4,..CACKEY
5b70: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
5b80: 45 4e 54 20 20 20 20 20 3d 20 2d 36 2c 0a 09 43  ENT     = -6,..C
5b90: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
5ba0: 52 59 20 20 20 20 20 20 20 20 20 20 20 3d 20 2d  RY           = -
5bb0: 37 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  7,..CACKEY_PCSC_
5bc0: 45 5f 4e 4f 44 41 54 41 20 20 20 20 20 20 20 20  E_NODATA        
5bd0: 20 20 3d 20 2d 38 0a 7d 20 63 61 63 6b 65 79 5f    = -8.} cackey_
5be0: 72 65 74 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ret;..struct cac
5bf0: 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20  key_tlv_cardurl 
5c00: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
5c10: 20 20 20 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a          rid[5];.
5c20: 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74  .cackey_tlv_appt
5c30: 79 70 65 20 20 20 61 70 70 74 79 70 65 3b 0a 09  ype   apptype;..
5c40: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
5c50: 74 69 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09  tid  objectid;..
5c60: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
5c70: 74 69 64 20 20 61 70 70 69 64 3b 0a 09 75 6e 73  tid  appid;..uns
5c80: 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20  igned char      
5c90: 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72    pinid;.};..str
5ca0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
5cb0: 6e 74 69 74 79 3b 0a 73 74 72 75 63 74 20 63 61  ntity;.struct ca
5cc0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
5cd0: 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a  {..uint8_t tag;.
5ce0: 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a  .size_t length;.
5cf0: 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64  ..union {...void
5d00: 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72 75 63   *value;...struc
5d10: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72  t cackey_tlv_car
5d20: 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64  durl *value_card
5d30: 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76  url;...uint8_t v
5d40: 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a  alue_byte;..};..
5d50: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
5d60: 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74  lv_entity *_next
5d70: 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20  ;.};../* CACKEY 
5d80: 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a  Global Handles *
5d90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
5da0: 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20  ackey_biglock = 
5db0: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74 72  NULL;.static str
5dc0: 75 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69  uct cackey_sessi
5dd0: 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  on cackey_sessio
5de0: 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20  ns[128];.static 
5df0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5e00: 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ot cackey_slots[
5e10: 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74  128];.static int
5e20: 20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69   cackey_initiali
5e30: 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  zed = 0;.static 
5e40: 69 6e 74 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f  int cackey_biglo
5e50: 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f  ck_init = 0;.CK_
5e60: 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47  C_INITIALIZE_ARG
5e70: 53 20 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a  S cackey_args;..
5e80: 2f 2a 2a 20 45 78 74 72 61 20 63 65 72 74 69 66  /** Extra certif
5e90: 69 63 61 74 65 73 20 74 6f 20 69 6e 63 6c 75 64  icates to includ
5ea0: 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73  e in token **/.s
5eb0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
5ec0: 63 5f 69 64 65 6e 74 69 74 79 20 65 78 74 72 61  c_identity extra
5ed0: 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e  _certs[] = {.#in
5ee0: 63 6c 75 64 65 20 22 63 61 63 6b 65 79 5f 62 75  clude "cackey_bu
5ef0: 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d  iltin_certs.h".}
5f00: 3b 0a 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  ;..#define CACKE
5f10: 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f  Y_MACRO_DEFAULT_
5f20: 58 53 54 52 28 73 74 72 29 20 43 41 43 4b 45 59  XSTR(str) CACKEY
5f30: 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 53  _MACRO_DEFAULT_S
5f40: 54 52 28 73 74 72 29 0a 23 64 65 66 69 6e 65 20  TR(str).#define 
5f50: 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46  CACKEY_MACRO_DEF
5f60: 41 55 4c 54 5f 53 54 52 28 73 74 72 29 20 23 73  AULT_STR(str) #s
5f70: 74 72 0a 0a 2f 2a 20 50 72 6f 74 65 63 74 65 64  tr../* Protected
5f80: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   Authentication 
5f90: 50 61 74 68 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  Path command */.
5fa0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63  static char *cac
5fb0: 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
5fc0: 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 52 65 61 64  = NULL;../* Read
5fd0: 65 72 20 45 78 63 6c 75 73 69 6f 6e 20 6f 72 20  er Exclusion or 
5fe0: 49 6e 63 6c 75 64 65 2d 6f 6e 6c 79 20 2a 2f 0a  Include-only */.
5ff0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63  static char *cac
6000: 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
6010: 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b  ude_only = NULL;
6020: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61  .static char *ca
6030: 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
6040: 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a  lude = NULL;../*
6050: 20 50 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e   PCSC Global Han
6060: 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c  dles */.static L
6070: 50 53 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61  PSCARDCONTEXT ca
6080: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6090: 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63   = NULL;..static
60a0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63   unsigned long c
60b0: 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
60c0: 28 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63  (void) {..static
60d0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72   unsigned long r
60e0: 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e  etval = 255;..un
60f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f  signed long majo
6100: 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64  r = 0;..unsigned
6110: 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b   long minor = 0;
6120: 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74  ..char *major_st
6130: 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20  r = NULL;..char 
6140: 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c  *minor_str = NUL
6150: 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  L;...CACKEY_DEBU
6160: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
6170: 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  .");...if (retva
6180: 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41  l != 255) {...CA
6190: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
61a0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25  F("Returning 0x%
61b0: 6c 78 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72  lx (cached).", r
61c0: 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72  etval);....retur
61d0: 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09  n(retval);..}...
61e0: 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66  retval = 0;..#if
61f0: 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53  def PACKAGE_VERS
6200: 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f  ION.        majo
6210: 72 5f 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f  r_str = PACKAGE_
6220: 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61  VERSION;..if (ma
6230: 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20  jor_str) {..    
6240: 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74      major = strt
6250: 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26  oul(major_str, &
6260: 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a  minor_str, 10);.
6270: 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72  ...if (minor_str
6280: 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73  ) {....minor = s
6290: 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72  trtoul(minor_str
62a0: 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b   + 1, NULL, 10);
62b0: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c  ...}..}...retval
62c0: 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29   = (major << 16)
62d0: 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b   | (minor << 8);
62e0: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
62f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
6300: 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c  eturning 0x%lx",
6310: 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
6320: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f  rn(retval);.}../
6330: 2a 20 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20  * PC/SC Related 
6340: 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a  Functions */./*.
6350: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
6360: 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73     void cackey_s
6370: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
6380: 61 6c 6c 28 69 6e 74 20 75 6e 69 74 69 61 6c 69  all(int unitiali
6390: 7a 65 5f 61 6c 6c 5f 72 65 61 64 65 72 73 29 3b  ze_all_readers);
63a0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
63b0: 0a 20 2a 20 20 20 20 20 69 6e 74 20 75 6e 69 74  . *     int unit
63c0: 69 61 6c 69 7a 65 5f 61 6c 6c 5f 72 65 61 64 65  ialize_all_reade
63d0: 72 73 20 20 20 20 20 20 46 72 65 65 20 74 68 65  rs      Free the
63e0: 20 22 70 63 73 63 5f 72 65 61 64 65 72 22 20 6f   "pcsc_reader" o
63f0: 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
6400: 20 77 69 74 68 0a 20 2a 20 20 20 20 20 20 20 20   with. *        
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6420: 20 20 20 65 61 63 68 20 73 6c 6f 74 20 28 62 6f     each slot (bo
6430: 6f 6c 65 61 6e 29 0a 20 2a 0a 20 2a 20 52 45 54  olean). *. * RET
6440: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
6450: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
6460: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
6470: 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63  nction disconnec
6480: 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64  ts from all card
6490: 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  s.. *. */.static
64a0: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f   void cackey_slo
64b0: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
64c0: 6c 28 69 6e 74 20 75 6e 69 74 69 61 6c 69 7a 65  l(int unitialize
64d0: 5f 61 6c 6c 5f 72 65 61 64 65 72 73 29 20 7b 0a  _all_readers) {.
64e0: 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a  .uint32_t idx;..
64f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6500: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
6510: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
6520: 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
6530: 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
6540: 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
6550: 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ts[0])); idx++) 
6560: 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
6570: 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e  lots[idx].intern
6580: 61 6c 29 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70  al) {..../* Skip
6590: 20 69 6e 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20   internal slots 
65a0: 2a 2f 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  */....continue;.
65b0: 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ..}....if (cacke
65c0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
65d0: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
65e0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
65f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
6600: 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29  dDisconnect(%lu)
6610: 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67   called", (unsig
6620: 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a  ned long) idx);.
6630: 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e  ....SCardDisconn
6640: 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ect(cackey_slots
6650: 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c  [idx].pcsc_card,
6660: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
6670: 44 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63  D);...}....if (c
6680: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6690: 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 66 72 65  .label) {....fre
66a0: 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  e(cackey_slots[i
66b0: 64 78 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09  dx].label);.....
66c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
66d0: 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
66e0: 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 69 74 69  ..}....if (uniti
66f0: 61 6c 69 7a 65 5f 61 6c 6c 5f 72 65 61 64 65 72  alize_all_reader
6700: 73 20 7c 7c 20 21 63 61 63 6b 65 79 5f 73 6c 6f  s || !cackey_slo
6710: 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20  ts[idx].active) 
6720: 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  {....if (cackey_
6730: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
6740: 72 65 61 64 65 72 29 20 7b 0a 09 09 09 09 66 72  reader) {.....fr
6750: 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
6760: 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  idx].pcsc_reader
6770: 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  );......cackey_s
6780: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72  lots[idx].pcsc_r
6790: 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09  eader = NULL;...
67a0: 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  .}.....cackey_sl
67b0: 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
67c0: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
67d0: 6b 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79  k = 0;....cackey
67e0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
67f0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
6800: 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  0;....cackey_slo
6810: 74 73 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 5f  ts[idx].id_type_
6820: 68 69 6e 74 20 3d 20 43 41 43 4b 45 59 5f 49 44  hint = CACKEY_ID
6830: 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 3b 0a 09  _TYPE_UNKNOWN;..
6840: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 66 20  .} else {....if 
6850: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
6860: 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  x].transaction_d
6870: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09  epth > 0) {.....
6880: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6890: 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ].transaction_ne
68a0: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a  ed_hw_lock = 1;.
68b0: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ...}...}....cack
68c0: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
68d0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
68e0: 64 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63 61  d = 0;....if (ca
68f0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
6900: 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 41 43  active) {....CAC
6910: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6920: 28 22 4d 61 72 6b 69 6e 67 20 61 63 74 69 76 65  ("Marking active
6930: 20 73 6c 6f 74 20 25 6c 75 20 61 73 20 62 65 69   slot %lu as bei
6940: 6e 67 20 72 65 73 65 74 22 2c 20 28 75 6e 73 69  ng reset", (unsi
6950: 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b  gned long) idx);
6960: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
6970: 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65  s[idx].slot_rese
6980: 74 20 3d 20 31 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  t = 1;...}..}...
6990: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
69a0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 22 29  NTF("Returning")
69b0: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
69c0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
69d0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
69e0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
69f0: 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a  ect(void);. *. *
6a00: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
6a10: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
6a20: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
6a30: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
6a40: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
6a50: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
6a60: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6a70: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
6a80: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
6a90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
6aa0: 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 65 20 50  onnects to the P
6ab0: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  C/SC Connection 
6ac0: 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61  Manager and upda
6ad0: 74 65 73 20 74 68 65 0a 20 2a 20 20 20 20 20 67  tes the. *     g
6ae0: 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a  lobal handle.. *
6af0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
6b00: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
6b10: 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29  sc_connect(void)
6b20: 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65   {..LONG scard_e
6b30: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a  st_context_ret;.
6b40: 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52  #ifdef HAVE_SCAR
6b50: 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a  DISVALIDCONTEXT.
6b60: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73 76 61  .LONG scard_isva
6b70: 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a  lid_ret;.#endif.
6b80: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6b90: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
6ba0: 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
6bb0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55  csc_handle == NU
6bc0: 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70  LL) {...cackey_p
6bd0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c  csc_handle = mal
6be0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b  loc(sizeof(*cack
6bf0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 29  ey_pcsc_handle))
6c00: 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
6c10: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55  csc_handle == NU
6c20: 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
6c30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6c40: 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66  ll to malloc() f
6c50: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
6c60: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
6c70: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
6c80: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 30  disconnect_all(0
6c90: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
6ca0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
6cb0: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  RIC);...}....CAC
6cc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6cd0: 28 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  ("SCardEstablish
6ce0: 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64  Context() called
6cf0: 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f  ");...scard_est_
6d00: 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43  context_ret = SC
6d10: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6d20: 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f  ext(SCARD_SCOPE_
6d30: 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55  SYSTEM, NULL, NU
6d40: 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  LL, cackey_pcsc_
6d50: 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73  handle);...if (s
6d60: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
6d70: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
6d80: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41  SUCCESS) {....CA
6d90: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6da0: 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64  F("Call to SCard
6db0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
6dc0: 20 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65   failed (returne
6dd0: 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72  d %s/%li), retur
6de0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
6df0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
6e00: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
6e10: 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  STR(scard_est_co
6e20: 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e  ntext_ret), (lon
6e30: 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  g) scard_est_con
6e40: 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66  text_ret);.....f
6e50: 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  ree(cackey_pcsc_
6e60: 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b  handle);....cack
6e70: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
6e80: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65   NULL;.....cacke
6e90: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
6ea0: 63 74 5f 61 6c 6c 28 30 29 3b 0a 0a 09 09 09 72  ct_all(0);.....r
6eb0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
6ec0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
6ed0: 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56  }..}..#ifdef HAV
6ee0: 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f  E_SCARDISVALIDCO
6ef0: 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 45  NTEXT..CACKEY_DE
6f00: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
6f10: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28  dIsValidContext(
6f20: 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61  ) called");..sca
6f30: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 3d  rd_isvalid_ret =
6f40: 20 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e   SCardIsValidCon
6f50: 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  text(*cackey_pcs
6f60: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28  c_handle);..if (
6f70: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
6f80: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
6f90: 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  CESS) {...CACKEY
6fa0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48  _DEBUG_PRINTF("H
6fb0: 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f 6d 65  andle has become
6fc0: 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64 49   invalid (SCardI
6fd0: 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20  sValidContext = 
6fe0: 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 20  %s/%li), trying 
6ff0: 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 2e  to re-establish.
7000: 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  ..", CACKEY_DEBU
7010: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
7020: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 73 76  TO_STR(scard_isv
7030: 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  alid_ret), (long
7040: 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  ) scard_isvalid_
7050: 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ret);....CACKEY_
7060: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
7070: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
7080: 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  ext() called");.
7090: 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ..scard_est_cont
70a0: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ext_ret = SCardE
70b0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
70c0: 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54  SCARD_SCOPE_SYST
70d0: 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  EM, NULL, NULL, 
70e0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
70f0: 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64  le);...if (scard
7100: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
7110: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
7120: 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ESS) {....CACKEY
7130: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
7140: 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61  all to SCardEsta
7150: 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69  blishContext fai
7160: 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73  led (returned %s
7170: 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67  /%li), returning
7180: 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41   in failure", CA
7190: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
71a0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
71b0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
71c0: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  t_ret), (long) s
71d0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
71e0: 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28  _ret);.....free(
71f0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
7200: 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70  le);....cackey_p
7210: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
7220: 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  L;.....cackey_sl
7230: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
7240: 6c 6c 28 30 29 3b 0a 0a 09 09 09 72 65 74 75 72  ll(0);.....retur
7250: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
7260: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09  GENERIC);...}...
7270: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7280: 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73  INTF("Handle has
7290: 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69   been re-establi
72a0: 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69  shed");..}.#endi
72b0: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
72c0: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
72d0: 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74  ully connected t
72e0: 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69  o PC/SC, returni
72f0: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b  ng in success");
7300: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
7310: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
7320: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
7330: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
7340: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73   cackey_pcsc_dis
7350: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20  connect(void);. 
7360: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
7370: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
7380: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
7390: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
73a0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
73b0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
73c0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
73d0: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
73e0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
73f0: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
7400: 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66  on disconnects f
7410: 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20 43 6f  rom the PC/SC Co
7420: 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72  nnection manager
7430: 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20 2a 20   and updates. * 
7440: 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 68      the global h
7450: 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  andle.. *. */.st
7460: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
7470: 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
7480: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09  onnect(void) {..
7490: 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f 63  LONG scard_rel_c
74a0: 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41  ontext_ret;...CA
74b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
74c0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
74d0: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  if (cackey_pcsc_
74e0: 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  handle == NULL) 
74f0: 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  {...return(CACKE
7500: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
7510: 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e  ...scard_rel_con
7520: 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64  text_ret = SCard
7530: 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 2a  ReleaseContext(*
7540: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
7550: 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  le);...if (cacke
7560: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b  y_pcsc_handle) {
7570: 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70  ...free(cackey_p
7580: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09  csc_handle);....
7590: 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  .cackey_pcsc_han
75a0: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  dle = NULL;..}..
75b0: 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c 5f 63  .if (scard_rel_c
75c0: 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43  ontext_ret != SC
75d0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
75e0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
75f0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
7600: 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c  ;..}...cackey_sl
7610: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
7620: 6c 6c 28 30 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ll(0);...return(
7630: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
7640: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
7650: 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64  OSIS. *     void
7660: 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f   cackey_mark_slo
7670: 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63  t_reset(struct c
7680: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7690: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
76a0: 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  TS. *     None. 
76b0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
76c0: 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  E. *     None. *
76d0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
76e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
76f0: 61 72 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20  arks a slot has 
7700: 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65  having been rese
7710: 74 2c 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63  t, to later be c
7720: 6c 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20  leaned up.. *   
7730: 20 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68    Cleanup only h
7740: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b  appens when a PK
7750: 43 53 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c  CS#11 client cal
7760: 6c 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  ls C_FindObjects
7770: 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  Init.. *. */.sta
7780: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
7790: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
77a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
77b0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72  ot *slot) {..str
77c0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
77d0: 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
77e0: 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69  dentities;..unsi
77f0: 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
7800: 72 74 73 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20  rts;...if (slot 
7810: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
7820: 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  urn;..}...CACKEY
7830: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
7840: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
7850: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
7860: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 53  connected) {...S
7870: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
7880: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
7890: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
78a0: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c  );..}...slot->sl
78b0: 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 73  ot_reset = 1;..s
78c0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
78d0: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 69  onnected = 0;..i
78e0: 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  f (cackey_pin_co
78f0: 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  mmand == NULL) {
7900: 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66  ...slot->token_f
7910: 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e  lags = CKF_LOGIN
7920: 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 20 65 6c  _REQUIRED;..} el
7930: 73 65 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b  se {...slot->tok
7940: 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d  en_flags = 0;..}
7950: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
7960: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
7970: 20 20 20 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f      LONG cackey_
7980: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
7990: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
79a0: 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64  t *slot, DWORD d
79b0: 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29  efault_protocol)
79c0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
79d0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
79e0: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
79f0: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
7a00: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
7a10: 2a 0a 20 2a 20 20 20 20 20 44 57 4f 52 44 20 64  *. *     DWORD d
7a20: 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a  efault_protocol.
7a30: 20 2a 20 20 20 20 20 20 20 20 20 50 72 6f 74 6f   *         Proto
7a40: 63 6f 6c 20 74 6f 20 61 74 74 65 6d 70 74 20 66  col to attempt f
7a50: 69 72 73 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52  irst. *. * RETUR
7a60: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
7a70: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
7a80: 66 72 6f 6d 20 53 43 61 72 64 52 65 63 6f 6e 6e  from SCardReconn
7a90: 65 63 74 28 29 0a 20 2a 0a 20 2a 20 4e 4f 54 45  ect(). *. * NOTE
7aa0: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
7ab0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
7ac0: 70 65 72 20 61 72 6f 75 6e 64 20 53 43 61 72 64  per around SCard
7ad0: 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20  Reconnect(). *. 
7ae0: 2a 20 20 20 20 20 54 68 65 20 53 43 61 72 64 52  *     The SCardR
7af0: 65 63 6f 6e 6e 65 63 74 28 29 20 66 75 6e 63 74  econnect() funct
7b00: 69 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65  ion call will be
7b10: 20 63 61 6c 6c 65 64 20 66 69 72 73 74 20 77 69   called first wi
7b20: 74 68 20 74 68 65 0a 20 2a 20 20 20 20 20 64 77  th the. *     dw
7b30: 50 72 65 66 65 72 72 65 64 50 72 6f 74 6f 63 6f  PreferredProtoco
7b40: 6c 73 20 6f 66 20 22 64 65 66 61 75 6c 74 5f 70  ls of "default_p
7b50: 72 6f 74 6f 63 6f 6c 22 2e 20 20 49 66 20 74 68  rotocol".  If th
7b60: 61 74 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  at call returns.
7b70: 20 2a 20 20 20 20 20 53 43 41 52 44 5f 45 5f 50   *     SCARD_E_P
7b80: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 20 74 72  ROTO_MISMATCH tr
7b90: 79 20 61 67 61 69 6e 20 77 69 74 68 20 61 20 70  y again with a p
7ba0: 72 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d 30 2c 20  rotocol of T=0, 
7bb0: 61 6e 64 20 66 61 69 6c 69 6e 67 0a 20 2a 20 20  and failing. *  
7bc0: 20 20 20 74 68 61 74 20 54 3d 31 2e 0a 20 2a 0a     that T=1.. *.
7bd0: 20 2a 2f 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20   */.static LONG 
7be0: 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
7bf0: 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63  _card(struct cac
7c00: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
7c10: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
7c20: 6f 74 6f 63 6f 6c 29 20 7b 0a 09 44 57 4f 52 44  otocol) {..DWORD
7c30: 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63   selected_protoc
7c40: 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ol;..LONG scard_
7c50: 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 73 65 6c 65  conn_ret;...sele
7c60: 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 20 3d 20  cted_protocol = 
7c70: 30 3b 0a 0a 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  0;...scard_conn_
7c80: 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e  ret = SCardRecon
7c90: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
7ca0: 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52  card, SCARD_SHAR
7cb0: 45 5f 53 48 41 52 45 44 2c 20 64 65 66 61 75 6c  E_SHARED, defaul
7cc0: 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 53 43 41 52  t_protocol, SCAR
7cd0: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73  D_RESET_CARD, &s
7ce0: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
7cf0: 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 63  );...if (scard_c
7d00: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
7d10: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
7d20: 48 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  H) {...CACKEY_DE
7d30: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
7d40: 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72 65 74  dReconnect() ret
7d50: 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52  urned SCARD_E_PR
7d60: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72  OTO_MISMATCH, tr
7d70: 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54  ying with just T
7d80: 3d 30 22 29 0a 09 09 73 63 61 72 64 5f 63 6f 6e  =0")...scard_con
7d90: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63  n_ret = SCardRec
7da0: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
7db0: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48  c_card, SCARD_SH
7dc0: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
7dd0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53  D_PROTOCOL_T0, S
7de0: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c  CARD_RESET_CARD,
7df0: 20 26 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f   &selected_proto
7e00: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
7e10: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
7e20: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7e30: 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b  MATCH) {....CACK
7e40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7e50: 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28  "SCardReconnect(
7e60: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
7e70: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
7e80: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
7e90: 75 73 74 20 54 3d 31 22 29 0a 09 09 09 73 63 61  ust T=1")....sca
7ea0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
7eb0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f  ardReconnect(slo
7ec0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
7ed0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
7ee0: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
7ef0: 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53 45 54  _T1, SCARD_RESET
7f00: 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64  _CARD, &selected
7f10: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a  _protocol);...}.
7f20: 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 63  .}...if (scard_c
7f30: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
7f40: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
7f50: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d  slot->protocol =
7f60: 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63   selected_protoc
7f70: 6f 6c 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ol;..}...return(
7f80: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b  scard_conn_ret);
7f90: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
7fa0: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
7fb0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
7fc0: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
7fd0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
7fe0: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
7ff0: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
8000: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8010: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8020: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8030: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
8040: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
8050: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
8060: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
8070: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
8080: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
8090: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
80a0: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
80b0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
80c0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
80d0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
80e0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
80f0: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
8100: 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  _ret pcsc_connec
8110: 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 70 72  t_ret;..DWORD pr
8120: 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63  otocol;..LONG sc
8130: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09  ard_conn_ret;...
8140: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8150: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
8160: 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09  ..if (!slot) {..
8170: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8180: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c  INTF("Invalid sl
8190: 6f 74 20 73 70 65 63 69 66 69 65 64 2c 20 72 65  ot specified, re
81a0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
81b0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
81c0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
81d0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73  NERIC);..}...pcs
81e0: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
81f0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
8200: 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63  ect();..if (pcsc
8210: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
8220: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8230: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
8240: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65  UG_PRINTF("Conne
8250: 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66  ction to PC/SC f
8260: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
8270: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
8280: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8290: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
82a0: 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74  ..}.../* Connect
82b0: 20 74 6f 20 72 65 61 64 65 72 2c 20 69 66 20 6e   to reader, if n
82c0: 65 65 64 65 64 20 2a 2f 0a 09 69 66 20 28 21 73  eeded */..if (!s
82d0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
82e0: 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41  onnected) {...CA
82f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8300: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
8310: 25 73 29 20 63 61 6c 6c 65 64 20 66 6f 72 20 73  %s) called for s
8320: 6c 6f 74 20 25 70 22 2c 20 73 6c 6f 74 2d 3e 70  lot %p", slot->p
8330: 63 73 63 5f 72 65 61 64 65 72 2c 20 73 6c 6f 74  csc_reader, slot
8340: 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  );...scard_conn_
8350: 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65  ret = SCardConne
8360: 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  ct(*cackey_pcsc_
8370: 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63  handle, slot->pc
8380: 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44  sc_reader, SCARD
8390: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
83a0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
83b0: 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f   | SCARD_PROTOCO
83c0: 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T1, &slot->pcs
83d0: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
83e0: 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64  l);....if (scard
83f0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
8400: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
8410: 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  TCH) {....CACKEY
8420: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
8430: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65  CardConnect() re
8440: 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50  turned SCARD_E_P
8450: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74  ROTO_MISMATCH, t
8460: 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20  rying with just 
8470: 54 3d 30 22 29 0a 09 09 09 73 63 61 72 64 5f 63  T=0")....scard_c
8480: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
8490: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
84a0: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
84b0: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
84c0: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
84d0: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
84e0: 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T0, &slot->pcs
84f0: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
8500: 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72  l);.....if (scar
8510: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
8520: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
8530: 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b  ATCH) {.....CACK
8540: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8550: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
8560: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
8570: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
8580: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
8590: 74 20 54 3d 31 22 29 0a 09 09 09 09 73 63 61 72  t T=1").....scar
85a0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
85b0: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
85c0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
85d0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
85e0: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
85f0: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
8600: 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e  OCOL_T1, &slot->
8610: 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74  pcsc_card, &prot
8620: 6f 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  ocol);....}...}.
8630: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
8640: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57  n_ret == SCARD_W
8650: 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 29  _UNPOWERED_CARD)
8660: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
8670: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
8680: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
8690: 65 64 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  ed SCARD_W_UNPOW
86a0: 45 52 45 44 5f 43 41 52 44 2c 20 74 72 79 69 6e  ERED_CARD, tryin
86b0: 67 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63 74 2e  g to re-connect.
86c0: 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f  ..");.....scard_
86d0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
86e0: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f  Connect(*cackey_
86f0: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f  pcsc_handle, slo
8700: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  t->pcsc_reader, 
8710: 53 43 41 52 44 5f 53 48 41 52 45 5f 44 49 52 45  SCARD_SHARE_DIRE
8720: 43 54 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  CT, SCARD_PROTOC
8730: 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52  OL_T0 | SCARD_PR
8740: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
8750: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
8760: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20  otocol);.....if 
8770: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
8780: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
8790: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09  _MISMATCH) {....
87a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
87b0: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
87c0: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
87d0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
87e0: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
87f0: 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09  h just T=0")....
8800: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
8810: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
8820: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
8830: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
8840: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
8850: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
8860: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73  _PROTOCOL_T0, &s
8870: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
8880: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09  &protocol);.....
8890: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
88a0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50  ret == SCARD_E_P
88b0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b  ROTO_MISMATCH) {
88c0: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
88d0: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
88e0: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
88f0: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
8900: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
8910: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22  g with just T=1"
8920: 29 0a 09 09 09 09 09 73 63 61 72 64 5f 63 6f 6e  )......scard_con
8930: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
8940: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
8950: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
8960: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
8970: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
8980: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
8990: 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T1, &slot->pcsc_
89a0: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
89b0: 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
89c0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
89d0: 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  = cackey_reconne
89e0: 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 70 72  ct_card(slot, pr
89f0: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 09  otocol);...}....
8a00: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
8a10: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f  et == SCARD_E_NO
8a20: 5f 53 45 52 56 49 43 45 29 20 7b 0a 09 09 09 43  _SERVICE) {....C
8a30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8a40: 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74  TF("SCardConnect
8a50: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
8a60: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 20 2d  D_E_NO_SERVICE -
8a70: 2d 20 77 68 69 63 68 20 63 6f 75 6c 64 20 6d 65  - which could me
8a80: 61 6e 20 6f 75 72 20 68 61 6e 64 6c 65 20 69 73  an our handle is
8a90: 20 69 6e 76 61 6c 69 64 2c 20 77 69 6c 6c 20 74   invalid, will t
8aa0: 72 79 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20  ry to reconnect 
8ab0: 74 6f 20 50 43 2f 53 43 20 73 65 72 76 69 63 65  to PC/SC service
8ac0: 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70  ");.....cackey_p
8ad0: 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29  csc_disconnect()
8ae0: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  ;.....cackey_pcs
8af0: 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09  c_connect();....
8b00: 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
8b10: 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
8b20: 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79  ...return(cackey
8b30: 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  _connect_card(sl
8b40: 6f 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  ot));...}....if 
8b50: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
8b60: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
8b70: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
8b80: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
8b90: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64  nnection to card
8ba0: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
8bb0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53  ng in failure (S
8bc0: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20  CardConnect() = 
8bd0: 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59  %s/%li)", CACKEY
8be0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
8bf0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
8c00: 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f  d_conn_ret), (lo
8c10: 6e 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ng) scard_conn_r
8c20: 65 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  et);.....return(
8c30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
8c40: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73  NERIC);...}....s
8c50: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
8c60: 6f 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09  onnected = 1;...
8c70: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8c80: 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73  n_depth = 0;...s
8c90: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8ca0: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
8cb0: 30 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f  0;...slot->proto
8cc0: 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a  col = protocol;.
8cd0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
8ce0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
8cf0: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29  ing in success")
8d00: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
8d10: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
8d20: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
8d30: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
8d40: 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  t cackey_begin_t
8d50: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
8d60: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
8d70: 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  lot);. *. * ARGU
8d80: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
8d90: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
8da0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
8db0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
8dc0: 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  to. *. * RETURN 
8dd0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
8de0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
8df0: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
8e00: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
8e10: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
8e20: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
8e30: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 65  NOTES. *     The
8e40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f   transaction sho
8e50: 75 6c 64 20 62 65 20 74 65 72 6d 69 6e 61 74 65  uld be terminate
8e60: 64 20 75 73 69 6e 67 20 22 63 61 63 6b 65 79 5f  d using "cackey_
8e70: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  end_transaction"
8e80: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
8e90: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8ea0: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
8eb0: 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  on(struct cackey
8ec0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
8ed0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8ee0: 79 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e  y_conn_ret;..LON
8ef0: 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  G scard_trans_re
8f00: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
8f10: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
8f20: 2e 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f  .");...cackey_co
8f30: 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
8f40: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
8f50: 74 29 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  t);..if (cackey_
8f60: 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b  conn_ret != CACK
8f70: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
8f80: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8f90: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
8fa0: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
8fb0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
8fc0: 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  rror");....retur
8fd0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
8fe0: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73  GENERIC);..}...s
8ff0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
9000: 5f 64 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28  _depth++;...if (
9010: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
9020: 6e 5f 64 65 70 74 68 20 3e 20 31 20 26 26 20 21  n_depth > 1 && !
9030: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
9040: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20  n_need_hw_lock) 
9050: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
9060: 5f 50 52 49 4e 54 46 28 22 41 6c 72 65 61 64 79  _PRINTF("Already
9070: 20 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f   in a transactio
9080: 6e 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f  n, performing no
9090: 20 61 63 74 69 6f 6e 20 28 6e 65 77 20 64 65 70   action (new dep
90a0: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
90b0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
90c0: 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  th);....return(C
90d0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
90e0: 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61  ;..}...slot->tra
90f0: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
9100: 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61  _lock = 0;...sca
9110: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53  rd_trans_ret = S
9120: 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61 63  CardBeginTransac
9130: 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  tion(slot->pcsc_
9140: 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61 72  card);..if (scar
9150: 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53  d_trans_ret != S
9160: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
9170: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
9180: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
9190: 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63  to begin transac
91a0: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20  tion, returning 
91b0: 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72  in error");....r
91c0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
91d0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
91e0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
91f0: 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75  PRINTF("Sucessfu
9200: 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73 61  lly began transa
9210: 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25  ction on slot (%
9220: 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  s)", slot->pcsc_
9230: 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72  reader);...retur
9240: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
9250: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
9260: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
9270: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
9280: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
9290: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
92a0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
92b0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
92c0: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
92d0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
92e0: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
92f0: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
9300: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
9310: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
9320: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
9330: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
9340: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
9350: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
9360: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
9370: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
9380: 72 65 71 75 69 72 65 73 20 22 63 61 63 6b 65 79  requires "cackey
9390: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
93a0: 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  on" to be called
93b0: 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74   first. *. */.st
93c0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
93d0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
93e0: 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61  action(struct ca
93f0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
9400: 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74   {..LONG scard_t
9410: 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  rans_ret;...CACK
9420: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9430: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
9440: 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61   (!slot->pcsc_ca
9450: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a  rd_connected) {.
9460: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9470: 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 6e  RINTF("Card is n
9480: 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e  ot connected, un
9490: 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e  able to end tran
94a0: 73 61 63 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22  saction on card"
94b0: 29 3b 0a 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e  );....if (slot->
94c0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
94d0: 68 20 3e 20 30 29 20 7b 0a 09 09 09 43 41 43 4b  h > 0) {....CACK
94e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
94f0: 22 44 65 63 72 65 61 73 69 6e 67 20 74 72 61 6e  "Decreasing tran
9500: 73 61 63 74 69 6f 6e 20 64 65 70 74 68 20 61 6e  saction depth an
9510: 64 20 61 73 6b 69 6e 67 20 66 6f 72 20 61 20 68  d asking for a h
9520: 61 72 64 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20  ardware lock on 
9530: 74 68 65 20 6e 65 78 74 20 62 65 67 69 6e 20 74  the next begin t
9540: 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72  ransaction (curr
9550: 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29 22  ent depth = %i)"
9560: 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  , slot->transact
9570: 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09  ion_depth);.....
9580: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
9590: 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69  n_depth--;.....i
95a0: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
95b0: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
95c0: 7b 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  {.....slot->tran
95d0: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
95e0: 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09  lock = 1;....}..
95f0: 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  .}....return(CAC
9600: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
9610: 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  IC);..}...if (sl
9620: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
9630: 64 65 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09  depth == 0) {...
9640: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9650: 4e 54 46 28 22 54 65 72 6d 69 6e 61 74 69 6e 67  NTF("Terminating
9660: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
9670: 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65 67 75  hat has not begu
9680: 6e 21 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  n!");....return(
9690: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
96a0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  NERIC);..}...slo
96b0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
96c0: 65 70 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c  epth--;...if (sl
96d0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
96e0: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 43  depth > 0) {...C
96f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9700: 54 46 28 22 54 72 61 6e 73 61 63 74 69 6f 6e 73  TF("Transactions
9710: 20 73 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65   still in progre
9720: 73 73 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74  ss, not terminat
9730: 69 6e 67 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e  ing on-card Tran
9740: 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74  saction (current
9750: 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73   depth = %i)", s
9760: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
9770: 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75  _depth);....retu
9780: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
9790: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64  _OK);..}...scard
97a0: 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61  _trans_ret = SCa
97b0: 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  rdEndTransaction
97c0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
97d0: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
97e0: 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f  RD);..if (scard_
97f0: 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41  trans_ret != SCA
9800: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
9810: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9820: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
9830: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
9840: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
9850: 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  rror");....retur
9860: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
9870: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
9880: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9890: 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20  TF("Sucessfully 
98a0: 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73  terminated trans
98b0: 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28  action on slot (
98c0: 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  %s)", slot->pcsc
98d0: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75  _reader);...retu
98e0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
98f0: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55  _OK);.}../* APDU
9900: 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f   Related Functio
9910: 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50  ns */./*. * SYNP
9920: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
9930: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
9940: 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63  nd_apdu(struct c
9950: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
9960: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9970: 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20  class, unsigned 
9980: 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  char instruction
9990: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
99a0: 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p1, unsigned cha
99b0: 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63  r p2, unsigned c
99c0: 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64  har lc, unsigned
99d0: 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73   char *data, uns
99e0: 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75  igned char le, u
99f0: 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64  int16_t *respcod
9a00: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
9a10: 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65   *respdata, size
9a20: 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  _t *respdata_len
9a30: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
9a40: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
9a50: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
9a60: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
9a70: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
9a80: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9a90: 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a  ed char class. *
9aa0: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 43 6c           APDU Cl
9ab0: 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53  ass (GSCIS_CLASS
9ac0: 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49  _ISO7816 or GSCI
9ad0: 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50  S_CLASS_GLOBAL_P
9ae0: 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20  LATFORM. *      
9af0: 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c     usually), (CL
9b00: 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  A). *. *     uns
9b10: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72  igned char instr
9b20: 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20  uction. *       
9b30: 20 20 41 50 44 55 20 49 6e 73 74 72 75 63 74 69    APDU Instructi
9b40: 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20  on (INS). *. *  
9b50: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9b60: 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41   p1. *         A
9b70: 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 31 20  PDU Parameter 1 
9b80: 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75  (P1). *. *     u
9b90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a  nsigned char p2.
9ba0: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
9bb0: 50 61 72 61 6d 65 74 65 72 20 32 20 28 50 32 29  Parameter 2 (P2)
9bc0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
9bd0: 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20  ned char lc. *  
9be0: 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67         APDU Leng
9bf0: 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c  th of Content (L
9c00: 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68  c) -- this is th
9c10: 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74  e length of "dat
9c20: 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61  a". *         pa
9c30: 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61  rameter.  If "da
9c40: 74 61 22 20 69 73 20 73 70 65 63 69 66 69 65 64  ta" is specified
9c50: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70   as NULL, this p
9c60: 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a  arameter will. *
9c70: 20 20 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f           be igno
9c80: 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75  red.. *. *     u
9c90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
9ca0: 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f  ta. *         Po
9cb0: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
9cc0: 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f  to send.  It sho
9cd0: 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74 65  uld be "Lc" byte
9ce0: 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20  s long.  If. *  
9cf0: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
9d00: 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77   as NULL, "Lc" w
9d10: 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c  ill not be sent,
9d20: 20 61 6e 64 20 74 68 69 73 20 62 75 66 66 65 72   and this buffer
9d30: 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20   will be. *     
9d40: 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a      ignored.. *.
9d50: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
9d60: 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20  char le. *      
9d70: 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f     APDU Length o
9d80: 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c  f Expectation (L
9d90: 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68  e) -- this is th
9da0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a  e length of the.
9db0: 20 2a 20 20 20 20 20 20 20 20 20 65 78 70 65 63   *         expec
9dc0: 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74  ted reply.  If t
9dd0: 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65 64  his is specified
9de0: 20 61 73 20 30 20 74 68 65 6e 20 69 74 20 77 69   as 0 then it wi
9df0: 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20  ll not. *       
9e00: 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a    be sent.. *. *
9e10: 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72       uint16_t *r
9e20: 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20  espcode. *      
9e30: 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72     [OUT] Pointer
9e40: 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41   to storage of A
9e50: 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64  PDU response cod
9e60: 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a 20  e.  If this is. 
9e70: 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66  *         specif
9e80: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65  ied as NULL, the
9e90: 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77   response code w
9ea0: 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65 64  ill be discarded
9eb0: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  .. *. *     unsi
9ec0: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
9ed0: 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  ata. *         [
9ee0: 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT] Pointer to 
9ef0: 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20  storage of APDU 
9f00: 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20  response data.  
9f10: 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20  If this is. *   
9f20: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
9f30: 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  as NULL, the res
9f40: 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20  ponse data will 
9f50: 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 49  be discarded.  I
9f60: 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65  f. *         the
9f70: 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20   "respdata_len" 
9f80: 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 70 65  parameter is spe
9f90: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
9fa0: 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20  this buffer. *  
9fb0: 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20         will not 
9fc0: 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20  be updated.. *. 
9fd0: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65  *     size_t *re
9fe0: 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20  spdata_len. *   
9ff0: 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20        [IN, OUT] 
a000: 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69  Pointer initiali
a010: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
a020: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72  e size of the "r
a030: 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20  espdata". *     
a040: 20 20 20 20 62 75 66 66 65 72 2e 20 20 42 65 66      buffer.  Bef
a050: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74  ore returning, t
a060: 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61  he pointed to va
a070: 6c 75 65 20 69 73 20 75 70 64 61 74 65 64 20 74  lue is updated t
a080: 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20  o the. *        
a090: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
a0a0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
a0b0: 62 75 66 66 65 72 2e 20 20 49 66 20 74 68 69 73  buffer.  If this
a0c0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
a0d0: 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  . *         NULL
a0e0: 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  , it will not be
a0f0: 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72   updated, and "r
a100: 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65  espdata" will be
a110: 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67   ignored causing
a120: 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  . *         the 
a130: 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f  response data to
a140: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
a150: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
a160: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
a170: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
a180: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
a190: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
a1a0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20  C_E_GENERIC     
a1b0: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20 20   On error. *    
a1c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54   CACKEY_PCSC_E_T
a1d0: 4f 4b 45 4e 41 42 53 45 4e 54 20 20 49 66 20 74  OKENABSENT  If t
a1e0: 68 65 20 73 65 6e 64 69 6e 67 20 66 61 69 6c 65  he sending faile
a1f0: 64 20 62 65 63 61 75 73 65 20 74 68 65 20 74 6f  d because the to
a200: 6b 65 6e 20 69 73 0a 20 2a 20 20 20 20 20 20 20  ken is. *       
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a220: 20 20 20 20 20 20 20 20 20 61 62 73 65 6e 74 0a           absent.
a230: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
a240: 53 43 5f 45 5f 52 45 54 52 59 20 20 20 20 20 20  SC_E_RETRY      
a250: 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 74    If something t
a260: 68 61 74 20 6c 6f 6f 6b 73 20 72 65 74 72 79 27  hat looks retry'
a270: 61 62 6c 65 20 77 65 6e 74 0a 20 2a 20 20 20 20  able went. *    
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e              wron
a2a0: 67 20 2d 2d 20 74 72 79 20 74 68 65 20 77 68 6f  g -- try the who
a2b0: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  le transaction o
a2c0: 76 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 20  ver. *          
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2e0: 20 20 20 20 20 20 61 67 61 69 6e 0a 20 2a 0a 20        again. *. 
a2f0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
a300: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
a310: 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65  l connect to the
a320: 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f   PC/SC Connectio
a330: 6e 20 4d 61 6e 61 67 65 72 20 76 69 61 0a 20 2a  n Manager via. *
a340: 20 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63       cackey_pcsc
a350: 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e 65  _connect() if ne
a360: 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  eded.. *. *     
a370: 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20  It will connect 
a380: 74 6f 20 74 68 65 20 63 61 72 64 20 69 6e 20 74  to the card in t
a390: 68 65 20 72 65 61 64 65 72 20 61 74 74 61 63 68  he reader attach
a3a0: 65 64 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20  ed to the slot. 
a3b0: 2a 20 20 20 20 20 73 70 65 63 69 66 69 65 64 2e  *     specified.
a3c0: 20 20 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e    It will reconn
a3d0: 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20  ect to the card 
a3e0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
a3f0: 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73 20 61 77  n. *     goes aw
a400: 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  ay.. *. */.stati
a410: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
a420: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74  key_send_apdu(st
a430: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
a440: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
a450: 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73   char class, uns
a460: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72  igned char instr
a470: 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64  uction, unsigned
a480: 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e   char p1, unsign
a490: 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69  ed char p2, unsi
a4a0: 67 6e 65 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73  gned int lc, uns
a4b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
a4c0: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c  , unsigned int l
a4d0: 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73  e, uint16_t *res
a4e0: 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20  pcode, unsigned 
a4f0: 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20  char *respdata, 
a500: 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61  size_t *respdata
a510: 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74  _len) {..uint8_t
a520: 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72   major_rc, minor
a530: 5f 72 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74  _rc;..size_t byt
a540: 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f  es_to_copy, tmp_
a550: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c  respdata_len;..L
a560: 50 43 53 43 41 52 44 5f 49 4f 5f 52 45 51 55 45  PCSCARD_IO_REQUE
a570: 53 54 20 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09  ST pioSendPci;..
a580: 53 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54  SCARD_IO_REQUEST
a590: 20 70 69 6f 52 65 63 76 50 63 69 3b 0a 09 44 57   pioRecvPci;..DW
a5a0: 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65  ORD xmit_len, re
a5b0: 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63  cv_len;..LONG sc
a5c0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63  ard_xmit_ret, sc
a5d0: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a  ard_reconn_ret;.
a5e0: 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31  .BYTE xmit_buf[1
a5f0: 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31  024], recv_buf[1
a600: 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f  024];..int pcsc_
a610: 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73  connect_ret, pcs
a620: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09  c_getresp_ret;..
a630: 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  int idx;...CACKE
a640: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a650: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
a660: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b  (!slot) {...CACK
a670: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a680: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70  "Invalid slot sp
a690: 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72  ecified.");....r
a6a0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
a6b0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
a6c0: 0a 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29  ...if (respcode)
a6d0: 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d   {...*respcode =
a6e0: 20 30 78 66 66 66 66 3b 0a 09 7d 0a 0a 09 70 63   0xffff;..}...pc
a6f0: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
a700: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
a710: 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20  card(slot);..if 
a720: 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  (pcsc_connect_re
a730: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
a740: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
a750: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a760: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
a770: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
a780: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
a790: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
a7a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
a7b0: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  IC);..}.../* Det
a7c0: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 70 72 6f  ermine which pro
a7d0: 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 75 73  tocol to send us
a7e0: 69 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68 20 28  ing */..switch (
a7f0: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20  slot->protocol) 
a800: 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  {...case SCARD_P
a810: 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 43  ROTOCOL_T0:....C
a820: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a830: 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74 6f 20  TF("Protocol to 
a840: 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20 69 73  send datagram is
a850: 20 54 3d 30 22 29 3b 0a 0a 09 09 09 70 69 6f 53   T=0");.....pioS
a860: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
a870: 43 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65 61 6b  CI_T0;.....break
a880: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  ;...case SCARD_P
a890: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 43  ROTOCOL_T1:....C
a8a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a8b0: 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74 6f 20  TF("Protocol to 
a8c0: 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20 69 73  send datagram is
a8d0: 20 54 3d 31 22 29 3b 0a 0a 09 09 09 70 69 6f 53   T=1");.....pioS
a8e0: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
a8f0: 43 49 5f 54 31 3b 0a 0a 09 09 09 62 72 65 61 6b  CI_T1;.....break
a900: 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ;...default:....
a910: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a920: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f  NTF("Invalid pro
a930: 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 61 62 6f  tocol found, abo
a940: 72 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 72 65  rting.");.....re
a950: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
a960: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
a970: 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 74 20 2a 2f  ../* Transmit */
a980: 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a  ..xmit_len = 0;.
a990: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a9a0: 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a 09  en++] = class;..
a9b0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a9c0: 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 63 74 69  n++] = instructi
a9d0: 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  on;..xmit_buf[xm
a9e0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a  it_len++] = p1;.
a9f0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
aa00: 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69 66 20  en++] = p2;..if 
aa10: 28 64 61 74 61 29 20 7b 0a 09 09 69 66 20 28 6c  (data) {...if (l
aa20: 63 20 3e 20 32 35 35 29 20 7b 0a 09 09 09 43 41  c > 255) {....CA
aa30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
aa40: 46 28 22 43 41 55 54 49 4f 4e 21 20 20 55 73 69  F("CAUTION!  Usi
aa50: 6e 67 20 61 6e 20 4c 63 20 67 72 65 61 74 65 72  ng an Lc greater
aa60: 20 74 68 61 6e 20 32 35 35 20 69 73 20 75 6e 74   than 255 is unt
aa70: 65 73 74 65 64 2e 20 20 4c 63 20 3d 20 25 75 22  ested.  Lc = %u"
aa80: 2c 20 6c 63 29 3b 0a 0a 09 09 09 78 6d 69 74 5f  , lc);.....xmit_
aa90: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
aaa0: 3d 20 30 78 38 32 3b 20 2f 2a 20 58 58 58 20 55  = 0x82; /* XXX U
aab0: 4e 54 45 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d  NTESTED */....xm
aac0: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
aad0: 2b 5d 20 3d 20 28 6c 63 20 26 20 30 78 66 66 30  +] = (lc & 0xff0
aae0: 30 29 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74  0) >> 8;....xmit
aaf0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
ab00: 20 3d 20 6c 63 20 26 20 30 78 66 66 3b 0a 09 09   = lc & 0xff;...
ab10: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74  } else {....xmit
ab20: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
ab30: 20 3d 20 6c 63 3b 0a 09 09 7d 0a 09 09 66 6f 72   = lc;...}...for
ab40: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
ab50: 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09   lc; idx++) {...
ab60: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
ab70: 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78  en++] = data[idx
ab80: 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  ];...}..}...if (
ab90: 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  le != 0x00) {...
aba0: 69 66 20 28 6c 65 20 3e 20 32 35 36 29 20 7b 0a  if (le > 256) {.
abb0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
abc0: 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e 21  PRINTF("CAUTION!
abd0: 20 20 55 73 69 6e 67 20 61 6e 20 4c 65 20 67 72    Using an Le gr
abe0: 65 61 74 65 72 20 74 68 61 6e 20 32 35 36 20 69  eater than 256 i
abf0: 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 65 20  s untested.  Le 
ac00: 3d 20 25 75 22 2c 20 6c 65 29 3b 0a 0a 09 09 09  = %u", le);.....
ac10: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
ac20: 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20  n++] = 0x82; /* 
ac30: 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a  XXX UNTESTED */.
ac40: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
ac50: 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 65 20 26 20  _len++] = (le & 
ac60: 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
ac70: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
ac80: 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26 20 30 78 66  en++] = le & 0xf
ac90: 66 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28  f;...} else if (
aca0: 6c 65 20 3d 3d 20 32 35 36 29 20 7b 0a 09 09 09  le == 256) {....
acb0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
acc0: 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 09 09 7d  n++] = 0x00;...}
acd0: 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74 5f   else {....xmit_
ace0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
acf0: 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  = le;...}..}.../
ad00: 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72  * Begin Smartcar
ad10: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
ad20: 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  ..cackey_begin_t
ad30: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
ad40: 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d 3d  ;...if (class ==
ad50: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
ad60: 37 38 31 36 20 26 26 20 28 69 6e 73 74 72 75 63  7816 && (instruc
ad70: 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e  tion == GSCIS_IN
ad80: 53 54 52 5f 56 45 52 49 46 59 20 7c 7c 20 69 6e  STR_VERIFY || in
ad90: 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43  struction == GSC
ada0: 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47 45 5f  IS_INSTR_CHANGE_
adb0: 52 45 46 45 52 45 4e 43 45 29 20 26 26 20 70 31  REFERENCE) && p1
adc0: 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41   == 0x00) {...CA
add0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ade0: 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a  F("Sending APDU:
adf0: 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b   <<censored>>");
ae00: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
ae10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
ae20: 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55  UF("Sending APDU
ae30: 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  :", xmit_buf, xm
ae40: 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65  it_len);..}...re
ae50: 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  cv_len = sizeof(
ae60: 72 65 63 76 5f 62 75 66 29 3b 0a 09 6d 65 6d 63  recv_buf);..memc
ae70: 70 79 28 26 70 69 6f 52 65 63 76 50 63 69 2c 20  py(&pioRecvPci, 
ae80: 70 69 6f 53 65 6e 64 50 63 69 2c 20 73 69 7a 65  pioSendPci, size
ae90: 6f 66 28 70 69 6f 52 65 63 76 50 63 69 29 29 3b  of(pioRecvPci));
aea0: 0a 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ..scard_xmit_ret
aeb0: 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74   = SCardTransmit
aec0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
aed0: 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d  , pioSendPci, xm
aee0: 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e  it_buf, xmit_len
aef0: 2c 20 26 70 69 6f 52 65 63 76 50 63 69 2c 20 72  , &pioRecvPci, r
af00: 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c  ecv_buf, &recv_l
af10: 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  en);...CACKEY_DE
af20: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
af30: 64 54 72 61 6e 73 6d 69 74 28 29 20 63 6f 6d 70  dTransmit() comp
af40: 6c 65 74 65 64 20 77 69 74 68 20 76 61 6c 75 65  leted with value
af50: 3a 20 25 73 2f 25 6c 78 22 2c 20 43 41 43 4b 45  : %s/%lx", CACKE
af60: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
af70: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
af80: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75  rd_xmit_ret), (u
af90: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63  nsigned long) sc
afa0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
afb0: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
afc0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e  ret == SCARD_E_N
afd0: 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 29 20 7b  OT_TRANSACTED) {
afe0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
aff0: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
b000: 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63  o send APDU to c
b010: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
b020: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20  it() = %s/%lx), 
b030: 77 69 6c 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67  will ask calling
b040: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74   function to ret
b050: 72 79 20 28 6e 6f 74 20 72 65 73 65 74 74 69 6e  ry (not resettin
b060: 67 20 63 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43  g card)...", CAC
b070: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
b080: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
b090: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
b0a0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
b0b0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
b0c0: 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
b0d0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
b0e0: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
b0f0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
b100: 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65  t);....cackey_re
b110: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
b120: 74 2c 20 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f  t, slot->protoco
b130: 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  l);....return(CA
b140: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
b150: 59 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61  Y);..}...if (sca
b160: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53  rd_xmit_ret == S
b170: 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43  CARD_E_NO_SERVIC
b180: 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  E) {...CACKEY_DE
b190: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c  BUG_PRINTF("Fail
b1a0: 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20  ed to send APDU 
b1b0: 74 6f 20 63 61 72 64 2c 20 70 6f 73 73 69 62 6c  to card, possibl
b1c0: 79 20 64 75 65 20 74 6f 20 50 43 2f 53 43 20 68  y due to PC/SC h
b1d0: 61 6e 64 6c 65 20 62 65 69 6e 67 20 69 6e 76 61  andle being inva
b1e0: 6c 69 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  lid (SCardTransm
b1f0: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20  it() = %s/%lx), 
b200: 77 69 6c 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67  will ask calling
b210: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74   function to ret
b220: 72 79 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44  ry...", CACKEY_D
b230: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
b240: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
b250: 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69  xmit_ret), (unsi
b260: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64  gned long) scard
b270: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 63  _xmit_ret);....c
b280: 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
b290: 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
b2a0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
b2b0: 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a  SC_E_RETRY);..}.
b2c0: 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
b2d0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
b2e0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
b2f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b300: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64  ("Failed to send
b310: 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53   APDU to card (S
b320: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d  CardTransmit() =
b330: 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45   %s/%lx)", CACKE
b340: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
b350: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
b360: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75  rd_xmit_ret), (u
b370: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63  nsigned long) sc
b380: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
b390: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b3a0: 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 73  RINTF("Marking s
b3b0: 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20 62 65  lot as having be
b3c0: 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 63 61  en reset");...ca
b3d0: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
b3e0: 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69  eset(slot);....i
b3f0: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
b400: 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53  t == SCARD_W_RES
b410: 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ET_CARD) {....CA
b420: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b430: 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65  F("Reset require
b440: 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e  d, please hold..
b450: 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72  .");.....scard_r
b460: 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  econn_ret = cack
b470: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
b480: 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52  d(slot, SCARD_PR
b490: 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
b4a0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29 3b 0a  D_PROTOCOL_T1);.
b4b0: 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65  ....if (scard_re
b4c0: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
b4d0: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
b4e0: 09 09 09 73 77 69 74 63 68 20 28 73 6c 6f 74 2d  ...switch (slot-
b4f0: 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 09  >protocol) {....
b500: 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f  ..case SCARD_PRO
b510: 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09 09 09  TOCOL_T0:.......
b520: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
b530: 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 09  RD_PCI_T0;......
b540: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
b550: 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  se SCARD_PROTOCO
b560: 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70 69 6f 53  L_T1:.......pioS
b570: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
b580: 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09 62 72  CI_T1;........br
b590: 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61 75 6c  eak;......defaul
b5a0: 74 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f  t:.......CACKEY_
b5b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
b5c0: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66  valid protocol f
b5d0: 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20 6c 61  ound, but too la
b5e0: 74 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  te to do anythin
b5f0: 67 20 61 62 6f 75 74 20 69 74 20 6e 6f 77 20 2d  g about it now -
b600: 2d 20 74 72 79 69 6e 67 20 61 6e 79 77 61 79 2e  - trying anyway.
b610: 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
b620: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
b630: 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
b640: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
b650: 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
b660: 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
b670: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
b680: 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
b690: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
b6a0: 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  th--;......slot-
b6b0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
b6c0: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09  d_hw_lock = 1;..
b6d0: 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  ....cackey_begin
b6e0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
b6f0: 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  t);.....}......C
b700: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b710: 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73  TF("Reset succes
b720: 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d 69 74  sful, retransmit
b730: 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72 65 63  ting");......rec
b740: 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72  v_len = sizeof(r
b750: 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09 6d 65  ecv_buf);.....me
b760: 6d 63 70 79 28 26 70 69 6f 52 65 63 76 50 63 69  mcpy(&pioRecvPci
b770: 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 73 69  , pioSendPci, si
b780: 7a 65 6f 66 28 70 69 6f 52 65 63 76 50 63 69 29  zeof(pioRecvPci)
b790: 29 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69  );.....scard_xmi
b7a0: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61  t_ret = SCardTra
b7b0: 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nsmit(slot->pcsc
b7c0: 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63  _card, pioSendPc
b7d0: 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69  i, xmit_buf, xmi
b7e0: 74 5f 6c 65 6e 2c 20 26 70 69 6f 52 65 63 76 50  t_len, &pioRecvP
b7f0: 63 69 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72  ci, recv_buf, &r
b800: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69  ecv_len);......i
b810: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
b820: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
b830: 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43  CESS) {......CAC
b840: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b850: 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61 69  ("Retransmit fai
b860: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
b870: 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65 72 20  n failure after 
b880: 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68  disconnecting th
b890: 65 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61  e card (SCardTra
b8a0: 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29 22  nsmit = %s/%li)"
b8b0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
b8c0: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
b8d0: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  STR(scard_xmit_r
b8e0: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
b8f0: 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09  d_xmit_ret);....
b900: 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  ...SCardDisconne
b910: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
b920: 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f  rd, SCARD_LEAVE_
b930: 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74  CARD);......slot
b940: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
b950: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09  ected = 0;......
b960: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
b970: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
b980: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ......slot->tran
b990: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
b9a0: 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 65  1;......cackey_e
b9b0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
b9c0: 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  lot);.......retu
b9d0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
b9e0: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
b9f0: 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ...}....} else {
ba00: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
ba10: 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e  G_PRINTF("Discon
ba20: 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a  necting card");.
ba30: 0a 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
ba40: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
ba50: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
ba60: 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 73 6c 6f  E_CARD);.....slo
ba70: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
ba80: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
ba90: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
baa0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
bab0: 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
bac0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31  action_depth = 1
bad0: 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  ;.....cackey_end
bae0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
baf0: 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  t);......CACKEY_
bb00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
bb10: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
bb20: 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75 72 6e  re");.....return
bb30: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
bb40: 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09  OKENABSENT);....
bb50: 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
bb60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bb70: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69  NTF("Disconnecti
bb80: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 53  ng card");.....S
bb90: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
bba0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
bbb0: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
bbc0: 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  );....slot->pcsc
bbd0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
bbe0: 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20  = 0;...../* End 
bbf0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
bc00: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74  ction */....slot
bc10: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
bc20: 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b  pth = 1;....cack
bc30: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
bc40: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 43 41  on(slot);.....CA
bc50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bc60: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
bc70: 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 72 65  failure");....re
bc80: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
bc90: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
bca0: 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
bcb0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
bcc0: 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75 65 3a  "Returned Value:
bcd0: 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72 65 63  ", recv_buf, rec
bce0: 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 72 65  v_len);...if (re
bcf0: 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09  cv_len < 2) {...
bd00: 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73 70 6f  /* Minimal respo
bd10: 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20 32 20  nse length is 2 
bd20: 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69 6e 67  bytes, returning
bd30: 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09   in failure */..
bd40: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bd50: 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 74  INTF("Response t
bd60: 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e  oo small, return
bd70: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28  ing in failure (
bd80: 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 29 22  recv_len = %lu)"
bd90: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
bda0: 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09  ) recv_len);....
bdb0: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
bdc0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
bdd0: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
bde0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
bdf0: 0a 09 09 2f 2a 20 53 75 70 70 6c 79 20 61 6e 20  .../* Supply an 
be00: 69 6e 76 61 6c 69 64 20 72 65 73 70 6f 6e 73 65  invalid response
be10: 20 63 6f 64 65 20 2a 2f 0a 09 09 69 66 20 28 72   code */...if (r
be20: 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 09 2a 72  espcode) {....*r
be30: 65 73 70 63 6f 64 65 20 3d 20 30 3b 0a 09 09 7d  espcode = 0;...}
be40: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
be50: 59 5f 50 43 53 43 5f 45 5f 4e 4f 44 41 54 41 29  Y_PCSC_E_NODATA)
be60: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
be70: 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ine result code 
be80: 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20 72  */..major_rc = r
be90: 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e  ecv_buf[recv_len
bea0: 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63   - 2];..minor_rc
beb0: 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76   = recv_buf[recv
bec0: 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20 28  _len - 1];..if (
bed0: 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72  respcode) {...*r
bee0: 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f 72  espcode = (major
bef0: 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f  _rc << 8) | mino
bf00: 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64  r_rc;..}.../* Ad
bf10: 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62 75 66  just message buf
bf20: 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e  fer */..recv_len
bf30: 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64 20   -= 2;.../* Add 
bf40: 62 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e 20  bytes to return 
bf50: 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72 65  value */..tmp_re
bf60: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a  spdata_len = 0;.
bf70: 09 69 66 20 28 72 65 73 70 64 61 74 61 20 26 26  .if (respdata &&
bf80: 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b   respdata_len) {
bf90: 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  ...tmp_respdata_
bfa0: 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 61 5f  len = *respdata_
bfb0: 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74 6f  len;....bytes_to
bfc0: 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 61 74  _copy = *respdat
bfd0: 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72 65  a_len;....if (re
bfe0: 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f 74  cv_len < bytes_t
bff0: 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 79 74  o_copy) {....byt
c000: 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65 63  es_to_copy = rec
c010: 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41  v_len;...}....CA
c020: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c030: 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 20 62  F("Copying %lu b
c040: 79 74 65 73 20 74 6f 20 74 68 65 20 62 75 66 66  ytes to the buff
c050: 65 72 20 28 72 65 63 76 27 64 20 25 6c 75 20 62  er (recv'd %lu b
c060: 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79 20 25  ytes, but only %
c070: 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  lu bytes left in
c080: 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c 20 28   our buffer)", (
c090: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
c0a0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 28 75  ytes_to_copy, (u
c0b0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
c0c0: 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65  cv_len, (unsigne
c0d0: 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64 61 74  d long) *respdat
c0e0: 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70  a_len);....memcp
c0f0: 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 63 76  y(respdata, recv
c100: 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63  _buf, bytes_to_c
c110: 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74 61  opy);...respdata
c120: 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70   += bytes_to_cop
c130: 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61 5f  y;....*respdata_
c140: 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63  len = bytes_to_c
c150: 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64  opy;...tmp_respd
c160: 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73  ata_len -= bytes
c170: 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73  _to_copy;..} els
c180: 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f 6c  e {...if (recv_l
c190: 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  en != 0) {....CA
c1a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c1b0: 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61 79  F("Throwing away
c1c0: 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77 68   %lu bytes, nowh
c1d0: 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d 21  ere to put them!
c1e0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
c1f0: 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09  g) recv_len);...
c200: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72  }..}...if (major
c210: 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09  _rc == 0x61) {..
c220: 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 52  ./* We need to R
c230: 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  EAD */...CACKEY_
c240: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
c250: 66 66 65 72 20 72 65 61 64 20 72 65 71 75 69 72  ffer read requir
c260: 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e  ed");....if (min
c270: 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29 20 7b  or_rc == 0x00) {
c280: 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 43  ....minor_rc = C
c290: 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a  ACKEY_APDU_MTU;.
c2a0: 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65 74 72  ..}....pcsc_getr
c2b0: 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  esp_ret = cackey
c2c0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
c2d0: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
c2e0: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
c2f0: 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20  R_GET_RESPONSE, 
c300: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e  0x00, 0x00, 0, N
c310: 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72  ULL, minor_rc, r
c320: 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 61 74  espcode, respdat
c330: 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 74 61  a, &tmp_respdata
c340: 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 70 63  _len);....if (pc
c350: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 21  sc_getresp_ret !
c360: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
c370: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
c380: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
c390: 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65 64  ffer read failed
c3a0: 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  !  Returning in 
c3b0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f  failure");...../
c3c0: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
c3d0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
c3e0: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
c3f0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
c400: 0a 09 09 09 69 66 20 28 70 63 73 63 5f 67 65 74  ....if (pcsc_get
c410: 72 65 73 70 5f 72 65 74 20 3d 3d 20 43 41 43 4b  resp_ret == CACK
c420: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
c430: 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41   {.....return(CA
c440: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
c450: 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  Y);....}.....ret
c460: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
c470: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
c480: 0a 09 09 69 66 20 28 72 65 73 70 64 61 74 61 5f  ...if (respdata_
c490: 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73 70 64  len) {....*respd
c4a0: 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72  ata_len += tmp_r
c4b0: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d  espdata_len;...}
c4c0: 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
c4d0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
c4e0: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
c4f0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
c500: 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
c510: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
c520: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
c530: 20 28 62 75 66 66 65 72 20 72 65 61 64 20 63 6f   (buffer read co
c540: 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65 74  mplete)");...ret
c550: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
c560: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45  S_OK);..}.../* E
c570: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
c580: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
c590: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
c5a0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20  ion(slot);...if 
c5b0: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39  (major_rc == 0x9
c5c0: 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73  0) {.../* Succes
c5d0: 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  s */...CACKEY_DE
c5e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
c5f0: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
c600: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39   (major_rc = 0x9
c610: 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0)");....return(
c620: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
c630: 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f  );..}....CACKEY_
c640: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50  DEBUG_PRINTF("AP
c650: 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e 20 65  DU Returned an e
c660: 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67 20  rror, returning 
c670: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
c680: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
c690: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d  SC_E_GENERIC);.}
c6a0: 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  ..static unsigne
c6b0: 64 20 63 68 61 72 20 2a 63 61 63 6b 65 79 5f 72  d char *cackey_r
c6c0: 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 75  ead_bertlv_tag(u
c6d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
c6e0: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a 62 75  ffer, size_t *bu
c6f0: 66 66 65 72 5f 6c 65 6e 5f 70 2c 20 75 6e 73 69  ffer_len_p, unsi
c700: 67 6e 65 64 20 63 68 61 72 20 74 61 67 2c 20 75  gned char tag, u
c710: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
c720: 74 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  tbuffer, size_t 
c730: 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70  *outbuffer_len_p
c740: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
c750: 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73  ar *buffer_p;..s
c760: 69 7a 65 5f 74 20 6f 75 74 62 75 66 66 65 72 5f  ize_t outbuffer_
c770: 6c 65 6e 2c 20 62 75 66 66 65 72 5f 6c 65 6e 3b  len, buffer_len;
c780: 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65 3b 0a 09  ..size_t size;..
c790: 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  int idx;...CACKE
c7a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c7b0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
c7c0: 28 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d  (buffer_len_p ==
c7d0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
c7e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c7f0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20  buffer_len_p is 
c800: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67  NULL.  Returning
c810: 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a   in failure.");.
c820: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
c830: 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66  ..}...if (outbuf
c840: 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55 4c  fer_len_p == NUL
c850: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
c860: 42 55 47 5f 50 52 49 4e 54 46 28 22 6f 75 74 62  BUG_PRINTF("outb
c870: 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20 4e  uffer_len_p is N
c880: 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ULL.  Returning 
c890: 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a  in failure.");..
c8a0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
c8b0: 09 7d 0a 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20  .}...buffer_len 
c8c0: 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  = *outbuffer_len
c8d0: 5f 70 3b 0a 09 6f 75 74 62 75 66 66 65 72 5f 6c  _p;..outbuffer_l
c8e0: 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f  en = *outbuffer_
c8f0: 6c 65 6e 5f 70 3b 0a 0a 09 69 66 20 28 62 75 66  len_p;...if (buf
c900: 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09  fer_len < 2) {..
c910: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c920: 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c 65 6e  INTF("buffer_len
c930: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 32 2c   is less than 2,
c940: 20 73 6f 20 77 65 20 63 61 6e 27 74 20 72 65 61   so we can't rea
c950: 64 20 61 6e 79 20 74 61 67 2e 20 20 52 65 74 75  d any tag.  Retu
c960: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
c970: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  .");....return(N
c980: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65  ULL);..}...buffe
c990: 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a 09 69  r_p = buffer;..i
c9a0: 66 20 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 21  f (buffer_p[0] !
c9b0: 3d 20 74 61 67 29 20 7b 0a 09 09 43 41 43 4b 45  = tag) {...CACKE
c9c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c9d0: 54 61 67 20 66 6f 75 6e 64 20 77 61 73 20 6e 6f  Tag found was no
c9e0: 74 20 74 61 67 20 65 78 70 65 63 74 65 64 2e 20  t tag expected. 
c9f0: 20 54 61 67 20 3d 20 25 30 32 78 2c 20 45 78 70   Tag = %02x, Exp
ca00: 65 63 74 65 64 20 3d 20 25 30 32 78 2e 20 20 52  ected = %02x.  R
ca10: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
ca20: 75 72 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  ure.", (unsigned
ca30: 20 69 6e 74 29 20 62 75 66 66 65 72 5f 70 5b 30   int) buffer_p[0
ca40: 5d 2c 20 74 61 67 29 3b 0a 0a 09 09 72 65 74 75  ], tag);....retu
ca50: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62  rn(NULL);..}...b
ca60: 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75 66 66  uffer_p++;..buff
ca70: 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28  er_len--;...if (
ca80: 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 26 20 30  (buffer_p[0] & 0
ca90: 78 38 30 29 20 3d 3d 20 30 78 38 30 29 20 7b 0a  x80) == 0x80) {.
caa0: 09 09 73 69 7a 65 20 3d 20 30 3b 0a 09 09 69 64  ..size = 0;...id
cab0: 78 20 3d 20 28 62 75 66 66 65 72 5f 70 5b 30 5d  x = (buffer_p[0]
cac0: 20 26 20 30 78 37 66 29 3b 0a 0a 09 09 69 66 20   & 0x7f);....if 
cad0: 28 69 64 78 20 3e 20 62 75 66 66 65 72 5f 6c 65  (idx > buffer_le
cae0: 6e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  n) {....CACKEY_D
caf0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 6c  EBUG_PRINTF("Mal
cb00: 66 6f 72 6d 65 64 20 42 45 52 20 76 61 6c 75 65  formed BER value
cb10: 20 2d 2d 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   -- not enough b
cb20: 79 74 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74  ytes available t
cb30: 6f 20 72 65 61 64 20 6c 65 6e 67 74 68 20 28 69  o read length (i
cb40: 64 78 20 3d 20 25 69 2c 20 62 75 66 66 65 72 5f  dx = %i, buffer_
cb50: 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 69 64 78  len = %lu)", idx
cb60: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
cb70: 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a  ) buffer_len);..
cb80: 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
cb90: 0a 09 09 7d 0a 0a 09 09 66 6f 72 20 28 3b 20 69  ...}....for (; i
cba0: 64 78 20 3e 20 30 3b 20 69 64 78 2d 2d 29 20 7b  dx > 0; idx--) {
cbb0: 0a 09 09 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a  ....buffer_p++;.
cbc0: 09 09 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b  ...buffer_len--;
cbd0: 0a 0a 09 09 09 73 69 7a 65 20 3c 3c 3d 20 38 3b  .....size <<= 8;
cbe0: 0a 09 09 09 73 69 7a 65 20 7c 3d 20 62 75 66 66  ....size |= buff
cbf0: 65 72 5f 70 5b 30 5d 3b 0a 09 09 7d 0a 09 7d 20  er_p[0];...}..} 
cc00: 65 6c 73 65 20 7b 0a 09 09 73 69 7a 65 20 3d 20  else {...size = 
cc10: 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 7d 0a  buffer_p[0];..}.
cc20: 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62  ..buffer_p++;..b
cc30: 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69  uffer_len--;...i
cc40: 66 20 28 73 69 7a 65 20 3e 20 6f 75 74 62 75 66  f (size > outbuf
cc50: 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 43 41 43  fer_len) {...CAC
cc60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
cc70: 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 70 79  ("Unable to copy
cc80: 20 76 61 6c 75 65 20 62 75 66 66 65 72 20 74 6f   value buffer to
cc90: 20 6f 75 74 62 75 66 66 65 72 2c 20 6e 6f 74 20   outbuffer, not 
cca0: 65 6e 6f 75 67 68 20 72 6f 6f 6d 2e 20 20 56 61  enough room.  Va
ccb0: 6c 75 65 20 62 75 66 66 65 72 20 6c 65 6e 67 74  lue buffer lengt
ccc0: 68 20 3d 20 25 6c 75 2c 20 6f 75 74 20 62 75 66  h = %lu, out buf
ccd0: 66 65 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75  fer length = %lu
cce0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
ccf0: 67 29 20 73 69 7a 65 2c 20 28 75 6e 73 69 67 6e  g) size, (unsign
cd00: 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 66  ed long) outbuff
cd10: 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  er_len);....retu
cd20: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a  rn(NULL);..}...*
cd30: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20  outbuffer_len_p 
cd40: 3d 20 73 69 7a 65 3b 0a 09 69 66 20 28 6f 75 74  = size;..if (out
cd50: 62 75 66 66 65 72 29 20 7b 0a 09 09 6d 65 6d 63  buffer) {...memc
cd60: 70 79 28 6f 75 74 62 75 66 66 65 72 2c 20 62 75  py(outbuffer, bu
cd70: 66 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 09  ffer_p, size);..
cd80: 09 62 75 66 66 65 72 5f 70 20 2b 3d 20 73 69 7a  .buffer_p += siz
cd90: 65 3b 0a 09 09 62 75 66 66 65 72 5f 6c 65 6e 20  e;...buffer_len 
cda0: 2d 3d 20 73 69 7a 65 3b 0a 0a 09 09 2a 62 75 66  -= size;....*buf
cdb0: 66 65 72 5f 6c 65 6e 5f 70 20 3d 20 62 75 66 66  fer_len_p = buff
cdc0: 65 72 5f 6c 65 6e 3b 0a 0a 09 09 43 41 43 4b 45  er_len;....CACKE
cdd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
cde0: 28 22 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74  ("BER-TLV result
cdf0: 73 3a 22 2c 20 6f 75 74 62 75 66 66 65 72 2c 20  s:", outbuffer, 
ce00: 73 69 7a 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  size);..} else {
ce10: 0a 09 09 6d 65 6d 6d 6f 76 65 28 62 75 66 66 65  ...memmove(buffe
ce20: 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73 69 7a  r, buffer_p, siz
ce30: 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70 20 3d  e);...buffer_p =
ce40: 20 62 75 66 66 65 72 3b 0a 0a 09 09 43 41 43 4b   buffer;....CACK
ce50: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
ce60: 46 28 22 42 45 52 2d 54 4c 56 20 72 65 73 75 6c  F("BER-TLV resul
ce70: 74 73 3a 22 2c 20 62 75 66 66 65 72 2c 20 73 69  ts:", buffer, si
ce80: 7a 65 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ze);..}...CACKEY
ce90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
cea0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
ceb0: 65 73 73 2e 20 20 53 69 7a 65 20 6f 66 20 63 6f  ess.  Size of co
cec0: 6e 74 65 6e 74 73 20 66 6f 72 20 74 61 67 20 25  ntents for tag %
ced0: 30 32 78 20 69 73 20 25 6c 75 22 2c 20 28 75 6e  02x is %lu", (un
cee0: 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 2c  signed int) tag,
cef0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
cf00: 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75 72 6e   size);...return
cf10: 28 62 75 66 66 65 72 5f 70 29 3b 0a 7d 0a 0a 2f  (buffer_p);.}../
cf20: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
cf30: 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63       ssize_t cac
cf40: 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 74 72  key_get_data(str
cf50: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
cf60: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
cf70: 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69  char *buffer, si
cf80: 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c  ze_t buffer_len,
cf90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f   unsigned char o
cfa0: 69 64 5b 33 5d 29 3b 0a 20 2a 0a 20 2a 20 41 52  id[3]);. *. * AR
cfb0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
cfc0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
cfd0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
cfe0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
cff0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
d000: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
d010: 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20  har *buffer. *  
d020: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66         [OUT] Buf
d030: 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  fer. *. *     si
d040: 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 0a  ze_t buffer_len.
d050: 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65   *         Numbe
d060: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74  r of bytes to at
d070: 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a  tempt to read. *
d080: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
d090: 20 63 68 61 72 20 6f 69 64 5b 33 5d 0a 20 2a 20   char oid[3]. * 
d0a0: 20 20 20 20 20 20 20 20 33 2d 62 79 74 65 20 4f          3-byte O
d0b0: 49 44 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a  ID to read. *. *
d0c0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
d0d0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
d0e0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
d0f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
d100: 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c  s actually read,
d110: 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e   or -1 on error.
d120: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
d130: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a      None. *. */.
d140: 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63  static ssize_t c
d150: 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73  ackey_get_data(s
d160: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
d170: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
d180: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
d190: 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65  size_t buffer_le
d1a0: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
d1b0: 20 6f 69 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69   oid[3]) {..unsi
d1c0: 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 5d 20  gned char cmd[] 
d1d0: 3d 20 7b 30 78 35 43 2c 20 30 78 30 33 2c 20 30  = {0x5C, 0x03, 0
d1e0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d  x00, 0x00, 0x00}
d1f0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
d200: 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a   *buffer_p;..siz
d210: 65 5f 74 20 69 6e 69 74 5f 62 75 66 66 65 72 5f  e_t init_buffer_
d220: 6c 65 6e 2c 20 73 69 7a 65 3b 0a 09 75 69 6e 74  len, size;..uint
d230: 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09  16_t respcode;..
d240: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
d250: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d260: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
d270: 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65  ..init_buffer_le
d280: 6e 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a  n = buffer_len;.
d290: 0a 09 63 6d 64 5b 32 5d 20 3d 20 6f 69 64 5b 30  ..cmd[2] = oid[0
d2a0: 5d 3b 0a 09 63 6d 64 5b 33 5d 20 3d 20 6f 69 64  ];..cmd[3] = oid
d2b0: 5b 31 5d 3b 0a 09 63 6d 64 5b 34 5d 20 3d 20 6f  [1];..cmd[4] = o
d2c0: 69 64 5b 32 5d 3b 0a 0a 09 2f 2a 20 32 35 36 20  id[2];.../* 256 
d2d0: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  to indicate the 
d2e0: 6c 61 72 67 65 73 74 20 6d 65 73 73 61 67 65 20  largest message 
d2f0: 73 69 7a 65 20 2d 2d 20 6e 6f 74 20 63 6c 65 61  size -- not clea
d300: 72 20 69 66 20 74 68 69 73 20 77 69 6c 6c 20 77  r if this will w
d310: 6f 72 6b 20 77 69 74 68 20 61 6c 6c 20 6d 65 73  ork with all mes
d320: 73 61 67 65 73 20 2a 2f 0a 09 73 65 6e 64 5f 72  sages */..send_r
d330: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
d340: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
d350: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
d360: 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f   NISTSP800_73_3_
d370: 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41 2c 20  INSTR_GET_DATA, 
d380: 30 78 33 46 2c 20 30 78 46 46 2c 20 73 69 7a 65  0x3F, 0xFF, size
d390: 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 32 35  of(cmd), cmd, 25
d3a0: 36 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75  6, &respcode, bu
d3b0: 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65  ffer, &buffer_le
d3c0: 6e 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72  n);...if (send_r
d3d0: 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
d3e0: 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43  C_E_RETRY) {...C
d3f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d400: 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67  TF("ADPU Sending
d410: 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e   failed, retryin
d420: 67 20 72 65 61 64 20 62 75 66 66 65 72 22 29 3b  g read buffer");
d430: 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
d440: 79 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c  y_get_data(slot,
d450: 20 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 62 75   buffer, init_bu
d460: 66 66 65 72 5f 6c 65 6e 2c 20 6f 69 64 29 29 3b  ffer_len, oid));
d470: 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72  ..}...if (send_r
d480: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
d490: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
d4a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d4b0: 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64  "cackey_send_apd
d4c0: 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75  u() failed, retu
d4d0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
d4e0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
d4f0: 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  );..}..#ifdef CA
d500: 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
d510: 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
d520: 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 62 75 66  IZE_MAX..if (buf
d530: 66 65 72 5f 6c 65 6e 20 3e 20 5f 50 4f 53 49 58  fer_len > _POSIX
d540: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
d550: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d560: 4e 54 46 28 22 52 65 61 64 20 62 79 74 65 73 20  NTF("Read bytes 
d570: 28 62 75 66 66 65 72 5f 6c 65 6e 29 20 65 78 63  (buffer_len) exc
d580: 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c  eeds maximum val
d590: 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ue, returning in
d5a0: 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d   failure. (max =
d5b0: 20 25 6c 69 2c 20 62 75 66 66 65 72 5f 6c 65 6e   %li, buffer_len
d5c0: 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
d5d0: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
d5e0: 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
d5f0: 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a  g) buffer_len);.
d600: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
d610: 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
d620: 66 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c  f...if (buffer_l
d630: 65 6e 20 3c 20 32 29 20 7b 0a 09 09 43 41 43 4b  en < 2) {...CACK
d640: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d650: 22 41 50 44 55 20 47 45 54 20 44 41 54 41 20 72  "APDU GET DATA r
d660: 65 74 75 72 6e 65 64 20 25 6c 75 20 62 79 74 65  eturned %lu byte
d670: 73 2c 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20  s, which is too 
d680: 73 68 6f 72 74 20 66 6f 72 20 61 20 42 45 52 2d  short for a BER-
d690: 54 4c 56 20 72 65 73 70 6f 6e 73 65 22 2c 20 28  TLV response", (
d6a0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
d6b0: 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72  uffer_len);....r
d6c0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
d6d0: 73 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 6c 65  size = buffer_le
d6e0: 6e 3b 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 63  n;..buffer_p = c
d6f0: 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c  ackey_read_bertl
d700: 76 5f 74 61 67 28 62 75 66 66 65 72 2c 20 26 62  v_tag(buffer, &b
d710: 75 66 66 65 72 5f 6c 65 6e 2c 20 30 78 35 33 2c  uffer_len, 0x53,
d720: 20 4e 55 4c 4c 2c 20 26 73 69 7a 65 29 3b 0a 0a   NULL, &size);..
d730: 09 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d  .if (buffer_p ==
d740: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
d750: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d760: 54 61 67 20 64 65 63 6f 64 69 6e 67 20 66 61 69  Tag decoding fai
d770: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
d780: 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 72  n error.");....r
d790: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
d7a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d7b0: 4e 54 42 55 46 28 22 47 45 54 20 44 41 54 41 20  NTBUF("GET DATA 
d7c0: 72 65 73 75 6c 74 22 2c 20 62 75 66 66 65 72 2c  result", buffer,
d7d0: 20 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59   size);...CACKEY
d7e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
d7f0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
d800: 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79  ess, read %lu by
d810: 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  tes", (unsigned 
d820: 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72  long) size);...r
d830: 65 74 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a 0a  eturn(size);.}..
d840: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
d850: 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61  *     ssize_t ca
d860: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
d870: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
d880: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
d890: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
d8a0: 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20  , size_t count, 
d8b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
d8c0: 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69  or_v, size_t ini
d8d0: 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a  tial_offset);. *
d8e0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
d8f0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
d900: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
d910: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
d920: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
d930: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  o. *. *     unsi
d940: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
d950: 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  r. *         [OU
d960: 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20  T] Buffer. *. * 
d970: 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74      size_t count
d980: 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62  . *         Numb
d990: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61  er of bytes to a
d9a0: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20  ttempt to read. 
d9b0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
d9c0: 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a  d char t_or_v. *
d9d0: 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
d9e0: 74 68 65 20 54 2d 62 75 66 66 65 72 20 28 30 31  the T-buffer (01
d9f0: 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30  ) or V-buffer (0
da00: 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e  2) to read from.
da10: 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a    . *. *     siz
da20: 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  e_t initial_offs
da30: 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70  et. *         Sp
da40: 65 63 69 66 79 20 74 68 65 20 6f 66 66 73 65 74  ecify the offset
da50: 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65   to begin the re
da60: 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a  ad from. *. *. *
da70: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
da80: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
da90: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  on returns the n
daa0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
dab0: 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72  ctually read, or
dac0: 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a   -1 on error.. *
dad0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
dae0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61   None. *. */.sta
daf0: 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
db00: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
db10: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
db20: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
db30: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
db40: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e  size_t count, un
db50: 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72  signed char t_or
db60: 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69  _v, size_t initi
db70: 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75 6e  al_offset) {..un
db80: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 69  signed char *ini
db90: 74 5f 62 75 66 66 65 72 3b 0a 09 73 69 7a 65 5f  t_buffer;..size_
dba0: 74 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09 73  t init_count;..s
dbb0: 69 7a 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74 69  ize_t init_initi
dbc0: 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69 7a  al_offset;...siz
dbd0: 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20  e_t offset = 0, 
dbe0: 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f  max_offset, max_
dbf0: 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64  count;..unsigned
dc00: 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75   char cmd[2];..u
dc10: 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65  int16_t respcode
dc20: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
dc30: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
dc40: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
dc50: 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72  );...init_buffer
dc60: 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 6e 69 74   = buffer;..init
dc70: 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a  _count = count;.
dc80: 09 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66  .init_initial_of
dc90: 66 73 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f 6f  fset = initial_o
dca0: 66 66 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66  ffset;...max_off
dcb0: 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61  set = count;..ma
dcc0: 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59  x_count = CACKEY
dcd0: 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20  _APDU_MTU;...if 
dce0: 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20  (t_or_v != 1 && 
dcf0: 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09  t_or_v != 2) {..
dd00: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
dd10: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20  INTF("Invalid T 
dd20: 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72 20 73  or V parameter s
dd30: 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e  pecified, return
dd40: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
dd50: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
dd60: 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74  ..}...cmd[0] = t
dd70: 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28  _or_v;...while (
dd80: 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65  1) {...if (offse
dd90: 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29  t >= max_offset)
dda0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
ddb0: 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65  UG_PRINTF("Buffe
ddc0: 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74  r too small, ret
ddd0: 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67  urning what we g
dde0: 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65  ot...");.....bre
ddf0: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74  ak;...}....count
de00: 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20   = max_offset - 
de10: 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f  offset;...if (co
de20: 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29  unt > max_count)
de30: 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61   {....count = ma
de40: 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09  x_count;...}....
de50: 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a  cmd[1] = count;.
de60: 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
de70: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
de80: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
de90: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
dea0: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45  , GSCIS_INSTR_RE
deb0: 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69  AD_BUFFER, ((ini
dec0: 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66  tial_offset + of
ded0: 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78  fset) >> 8) & 0x
dee0: 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66  ff, (initial_off
def0: 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20  set + offset) & 
df00: 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64  0xff, sizeof(cmd
df10: 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72  ), cmd, 0x00, &r
df20: 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20  espcode, buffer 
df30: 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74  + offset, &count
df40: 29 3b 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  );....if (send_r
df50: 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
df60: 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09  C_E_RETRY) {....
df70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
df80: 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e  NTF("ADPU Sendin
df90: 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69  g failed, retryi
dfa0: 6e 67 20 72 65 61 64 20 62 75 66 66 65 72 22 29  ng read buffer")
dfb0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 61 63  ;.....return(cac
dfc0: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
dfd0: 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66 65  slot, init_buffe
dfe0: 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 74  r, init_count, t
dff0: 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69 74  _or_v, init_init
e000: 69 61 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09 09  ial_offset));...
e010: 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65  }....if (send_re
e020: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
e030: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28  _S_OK) {....if (
e040: 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41  respcode == 0x6A
e050: 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61  86) {.....if (ma
e060: 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a  x_count == 1) {.
e070: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
e080: 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74  }......max_count
e090: 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32   = max_count / 2
e0a0: 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
e0b0: 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59  ....}.....CACKEY
e0c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
e0d0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
e0e0: 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  ) failed, return
e0f0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e100: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
e110: 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20  ;...}....offset 
e120: 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20  += count;....if 
e130: 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75  (count < max_cou
e140: 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  nt) {....CACKEY_
e150: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68  DEBUG_PRINTF("Sh
e160: 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e  ort read -- coun
e170: 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d  t = %i, cmd[1] =
e180: 20 25 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e   %i", (int) coun
e190: 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29  t, (int) cmd[1])
e1a0: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
e1b0: 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
e1c0: 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69  EY_PARANOID.#  i
e1d0: 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a  fdef _POSIX_SSIZ
e1e0: 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65  E_MAX..if (offse
e1f0: 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  t > _POSIX_SSIZE
e200: 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59  _MAX) {...CACKEY
e210: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
e220: 66 66 73 65 74 20 65 78 63 65 65 64 73 20 6d 61  ffset exceeds ma
e230: 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
e240: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
e250: 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f  e. (max = %li, o
e260: 66 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28  ffset = %lu)", (
e270: 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49  long) _POSIX_SSI
e280: 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65  ZE_MAX, (unsigne
e290: 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b  d long) offset);
e2a0: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
e2b0: 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .}.#  endif.#end
e2c0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
e2d0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
e2e0: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
e2f0: 72 65 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c  read %lu bytes",
e300: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
e310: 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75   offset);...retu
e320: 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  rn(offset);.}../
e330: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
e340: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
e350: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
e360: 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  plet(struct cack
e370: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
e380: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69  nsigned char *ai
e390: 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65  d, size_t aid_le
e3a0: 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  n);. *. * ARGUME
e3b0: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
e3c0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
e3d0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
e3e0: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
e3f0: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
e400: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
e410: 2a 61 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20  *aid. *         
e420: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
e430: 67 20 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73  g Applet ID to s
e440: 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20  elect. *. *     
e450: 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20  size_t aid_len. 
e460: 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  *         Number
e470: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
e480: 20 22 61 69 64 22 20 28 41 70 70 6c 65 74 20 49   "aid" (Applet I
e490: 44 29 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a  D) parameter. *.
e4a0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
e4b0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
e4c0: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
e4d0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
e4e0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
e4f0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
e500: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
e510: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
e520: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
e530: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65  _ret cackey_sele
e540: 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74  ct_applet(struct
e550: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
e560: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
e570: 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61  r *aid, size_t a
e580: 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73  id_len) {..int s
e590: 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  end_ret;...CACKE
e5a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e5b0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43  Called.");...CAC
e5c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
e5d0: 55 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70  UF("Selecting ap
e5e0: 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64  plet:", aid, aid
e5f0: 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65  _len);...send_re
e600: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
e610: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
e620: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
e630: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
e640: 43 54 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f  CT, GSCIS_PARAM_
e650: 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30  SELECT_APPLET, 0
e660: 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69  x00, aid_len, ai
e670: 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e  d, 0x00, NULL, N
e680: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66  ULL, NULL);...if
e690: 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41   (send_ret == CA
e6a0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
e6b0: 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  Y) {...CACKEY_DE
e6c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55  BUG_PRINTF("ADPU
e6d0: 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c   Sending failed,
e6e0: 20 72 65 74 72 79 69 6e 67 20 73 65 6c 65 63 74   retrying select
e6f0: 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72 65   applet");....re
e700: 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c 65  turn(cackey_sele
e710: 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20  ct_applet(slot, 
e720: 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b 0a  aid, aid_len));.
e730: 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  .}...if (send_re
e740: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
e750: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
e760: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e770: 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61  Failed to open a
e780: 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67  pplet, returning
e790: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e7a0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
e7b0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
e7c0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
e7d0: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65  UG_PRINTF("Succe
e7e0: 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64  ssfully selected
e7f0: 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72   file");...retur
e800: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
e810: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
e820: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
e830: 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70  ckey_pcsc_id_typ
e840: 65 20 63 61 63 6b 65 79 5f 64 65 74 65 63 74 5f  e cackey_detect_
e850: 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f  and_select_root_
e860: 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61  applet(struct ca
e870: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
e880: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f   cackey_pcsc_id_
e890: 74 79 70 65 20 74 79 70 65 5f 68 69 6e 74 29 3b  type type_hint);
e8a0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
e8b0: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
e8c0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
e8d0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
e8e0: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
e8f0: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 63  s to. *. *     c
e900: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
e910: 70 65 20 74 79 70 65 5f 68 69 6e 74 0a 20 2a 20  pe type_hint. * 
e920: 20 20 20 20 20 20 20 20 41 20 68 69 6e 74 20 61          A hint a
e930: 73 20 74 6f 20 77 68 69 63 68 20 74 79 70 65 20  s to which type 
e940: 6f 66 20 63 61 72 64 20 6d 69 67 68 74 20 62 65  of card might be
e950: 20 69 6e 20 74 68 69 73 20 73 6c 6f 74 20 28 43   in this slot (C
e960: 41 43 20 6f 72 20 50 49 56 29 0a 20 2a 0a 20 2a  AC or PIV). *. *
e970: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
e980: 20 20 20 20 20 43 41 43 4b 45 59 5f 49 44 5f 54       CACKEY_ID_T
e990: 59 50 45 5f 50 49 56 20 20 20 20 20 20 20 49 66  YPE_PIV       If
e9a0: 20 74 68 65 20 63 61 72 64 20 63 6f 6e 6e 65 63   the card connec
e9b0: 74 65 64 20 69 73 20 61 20 50 49 56 0a 20 2a 20  ted is a PIV. * 
e9c0: 20 20 20 20 43 41 43 4b 45 59 5f 49 44 5f 54 59      CACKEY_ID_TY
e9d0: 50 45 5f 43 41 43 20 20 20 20 20 20 20 49 66 20  PE_CAC       If 
e9e0: 74 68 65 20 63 61 72 64 20 63 6f 6e 6e 65 63 74  the card connect
e9f0: 65 64 20 69 73 20 61 20 43 41 43 20 77 69 74 68  ed is a CAC with
ea00: 20 74 68 65 20 43 43 43 0a 20 2a 20 20 20 20 20   the CCC. *     
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 20 20 20 20 20 20 20 20 61 70 70 6c 65 74 0a           applet.
ea30: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 49 44   *     CACKEY_ID
ea40: 5f 54 59 50 45 5f 45 52 52 4f 52 20 20 20 20 20  _TYPE_ERROR     
ea50: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
ea60: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
ea70: 61 74 20 74 79 70 65 20 6f 66 20 63 61 72 64 0a  at type of card.
ea80: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   *              
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaa0: 69 73 20 63 6f 6e 6e 65 63 74 65 64 0a 20 2a 0a  is connected. *.
eab0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
eac0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
ead0: 73 65 6c 65 63 74 73 20 74 68 65 20 22 72 6f 6f  selects the "roo
eae0: 74 22 20 61 70 70 6c 65 74 2c 20 61 66 74 65 72  t" applet, after
eaf0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
eb00: 73 20 63 61 6c 6c 65 64 0a 20 2a 20 20 20 20 20  s called. *     
eb10: 74 68 65 20 75 73 65 72 20 6d 61 79 20 62 65 20  the user may be 
eb20: 72 65 71 75 69 72 65 64 20 74 6f 20 6c 6f 67 69  required to logi
eb30: 6e 20 61 67 61 69 6e 0a 20 2a 0a 20 2a 2f 0a 73  n again. *. */.s
eb40: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 70 63 73  tatic cackey_pcs
eb50: 63 5f 69 64 5f 74 79 70 65 20 63 61 63 6b 65 79  c_id_type cackey
eb60: 5f 64 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65  _detect_and_sele
eb70: 63 74 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73  ct_root_applet(s
eb80: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
eb90: 74 20 2a 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f  t *slot, cackey_
eba0: 70 63 73 63 5f 69 64 5f 74 79 70 65 20 74 79 70  pcsc_id_type typ
ebb0: 65 5f 68 69 6e 74 29 20 7b 0a 09 75 6e 73 69 67  e_hint) {..unsig
ebc0: 6e 65 64 20 63 68 61 72 20 63 61 63 5f 63 63 63  ned char cac_ccc
ebd0: 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f  _aid[] = {GSCIS_
ebe0: 41 49 44 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 67  AID_CCC};..unsig
ebf0: 6e 65 64 20 63 68 61 72 20 63 61 63 5f 69 64 30  ned char cac_id0
ec00: 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f  _aid[] = {GSCIS_
ec10: 41 49 44 5f 49 44 30 7d 3b 0a 09 75 6e 73 69 67  AID_ID0};..unsig
ec20: 6e 65 64 20 63 68 61 72 20 70 69 76 5f 61 69 64  ned char piv_aid
ec30: 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f  [] = {NISTSP800_
ec40: 37 33 5f 33 5f 50 49 56 5f 41 49 44 7d 3b 0a 09  73_3_PIV_AID};..
ec50: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74  cackey_pcsc_id_t
ec60: 79 70 65 20 74 72 79 5f 74 79 70 65 73 5b 32 5d  ype try_types[2]
ec70: 2c 20 74 72 79 5f 74 79 70 65 3b 0a 09 69 6e 74  , try_type;..int
ec80: 20 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20   send_ret;..int 
ec90: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
eca0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65  BUG_PRINTF("Rese
ecb0: 6c 65 63 74 69 6e 67 20 74 68 65 20 72 6f 6f 74  lecting the root
ecc0: 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09 69 66 20   applet");...if 
ecd0: 28 74 79 70 65 5f 68 69 6e 74 20 3d 3d 20 43 41  (type_hint == CA
ece0: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b  CKEY_ID_TYPE_UNK
ecf0: 4e 4f 57 4e 29 20 7b 0a 09 09 74 79 70 65 5f 68  NOWN) {...type_h
ed00: 69 6e 74 20 3d 20 73 6c 6f 74 2d 3e 69 64 5f 74  int = slot->id_t
ed10: 79 70 65 5f 68 69 6e 74 3b 0a 09 7d 0a 0a 09 73  ype_hint;..}...s
ed20: 6c 6f 74 2d 3e 69 64 5f 74 79 70 65 5f 68 69 6e  lot->id_type_hin
ed30: 74 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  t = CACKEY_ID_TY
ed40: 50 45 5f 55 4e 4b 4e 4f 57 4e 3b 0a 0a 09 73 77  PE_UNKNOWN;...sw
ed50: 69 74 63 68 20 28 74 79 70 65 5f 68 69 6e 74 29  itch (type_hint)
ed60: 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59   {...case CACKEY
ed70: 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
ed80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ed90: 49 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f 20  INTF("Trying to 
eda0: 72 65 73 65 6c 65 63 74 20 74 68 65 20 50 49 56  reselect the PIV
edb0: 20 72 6f 6f 74 20 61 70 70 6c 65 74 20 66 69 72   root applet fir
edc0: 73 74 22 29 3b 0a 0a 09 09 09 74 72 79 5f 74 79  st");.....try_ty
edd0: 70 65 73 5b 30 5d 20 3d 20 43 41 43 4b 45 59 5f  pes[0] = CACKEY_
ede0: 49 44 5f 54 59 50 45 5f 50 49 56 3b 0a 09 09 09  ID_TYPE_PIV;....
edf0: 74 72 79 5f 74 79 70 65 73 5b 31 5d 20 3d 20 43  try_types[1] = C
ee00: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
ee10: 43 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  C;.....break;...
ee20: 64 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b  default:....CACK
ee30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ee40: 22 54 72 79 69 6e 67 20 74 6f 20 72 65 73 65 6c  "Trying to resel
ee50: 65 63 74 20 74 68 65 20 43 41 43 20 43 43 43 20  ect the CAC CCC 
ee60: 61 70 70 6c 65 74 20 66 69 72 73 74 22 29 3b 0a  applet first");.
ee70: 0a 09 09 09 74 72 79 5f 74 79 70 65 73 5b 30 5d  ....try_types[0]
ee80: 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50   = CACKEY_ID_TYP
ee90: 45 5f 43 41 43 3b 0a 09 09 09 74 72 79 5f 74 79  E_CAC;....try_ty
eea0: 70 65 73 5b 31 5d 20 3d 20 43 41 43 4b 45 59 5f  pes[1] = CACKEY_
eeb0: 49 44 5f 54 59 50 45 5f 50 49 56 3b 0a 0a 09 09  ID_TYPE_PIV;....
eec0: 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 66 6f 72  .break;..}...for
eed0: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
eee0: 20 28 73 69 7a 65 6f 66 28 74 72 79 5f 74 79 70   (sizeof(try_typ
eef0: 65 73 29 20 2f 20 73 69 7a 65 6f 66 28 74 72 79  es) / sizeof(try
ef00: 5f 74 79 70 65 73 5b 30 5d 29 29 3b 20 69 64 78  _types[0])); idx
ef10: 2b 2b 29 20 7b 0a 09 09 74 72 79 5f 74 79 70 65  ++) {...try_type
ef20: 20 3d 20 74 72 79 5f 74 79 70 65 73 5b 69 64 78   = try_types[idx
ef30: 5d 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 74 72  ];....switch (tr
ef40: 79 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73  y_type) {....cas
ef50: 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
ef60: 5f 43 41 43 3a 0a 09 09 09 09 43 41 43 4b 45 59  _CAC:.....CACKEY
ef70: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
ef80: 72 79 69 6e 67 20 74 6f 20 73 65 6c 65 63 74 20  rying to select 
ef90: 74 68 65 20 43 41 43 20 43 43 43 20 61 70 70 6c  the CAC CCC appl
efa0: 65 74 22 29 3b 0a 0a 09 09 09 09 73 65 6e 64 5f  et");......send_
efb0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
efc0: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
efd0: 20 63 61 63 5f 63 63 63 5f 61 69 64 2c 20 73 69   cac_ccc_aid, si
efe0: 7a 65 6f 66 28 63 61 63 5f 63 63 63 5f 61 69 64  zeof(cac_ccc_aid
eff0: 29 29 3b 0a 09 09 09 09 69 66 20 28 73 65 6e 64  ));.....if (send
f000: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
f010: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09  CSC_S_OK) {.....
f020: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
f030: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
f040: 28 73 6c 6f 74 2c 20 63 61 63 5f 69 64 30 5f 61  (slot, cac_id0_a
f050: 69 64 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 69  id, sizeof(cac_i
f060: 64 30 5f 61 69 64 29 29 3b 0a 09 09 09 09 7d 0a  d0_aid));.....}.
f070: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
f080: 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
f090: 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b  PE_PIV:.....CACK
f0a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f0b0: 22 54 72 79 69 6e 67 20 74 6f 20 73 65 6c 65 63  "Trying to selec
f0c0: 74 20 74 68 65 20 50 49 56 20 72 6f 6f 74 20 61  t the PIV root a
f0d0: 70 70 6c 65 74 22 29 3b 0a 0a 09 09 09 09 73 65  pplet");......se
f0e0: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
f0f0: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
f100: 6f 74 2c 20 70 69 76 5f 61 69 64 2c 20 73 69 7a  ot, piv_aid, siz
f110: 65 6f 66 28 70 69 76 5f 61 69 64 29 29 3b 0a 0a  eof(piv_aid));..
f120: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
f130: 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d  ..if (send_ret =
f140: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
f150: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
f160: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
f170: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
f180: 74 65 64 20 74 68 65 20 25 73 20 61 70 70 6c 65  ted the %s apple
f190: 74 20 2d 2d 20 73 65 74 74 69 6e 67 20 74 68 65  t -- setting the
f1a0: 20 5c 22 4c 4f 47 49 4e 20 52 45 51 55 49 52 45   \"LOGIN REQUIRE
f1b0: 44 5c 22 20 66 6c 61 67 20 6f 6e 20 74 68 65 20  D\" flag on the 
f1c0: 74 6f 6b 65 6e 22 2c 0a 09 09 09 09 74 72 79 5f  token",.....try_
f1d0: 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49  type == CACKEY_I
f1e0: 44 5f 54 59 50 45 5f 43 41 43 20 3f 20 22 43 41  D_TYPE_CAC ? "CA
f1f0: 43 22 20 3a 20 22 50 49 56 22 0a 09 09 09 29 3b  C" : "PIV"....);
f200: 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e  .....slot->token
f210: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
f220: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09  IN_REQUIRED;....
f230: 09 73 6c 6f 74 2d 3e 69 64 5f 74 79 70 65 5f 68  .slot->id_type_h
f240: 69 6e 74 20 3d 20 74 72 79 5f 74 79 70 65 3b 0a  int = try_type;.
f250: 0a 09 09 09 72 65 74 75 72 6e 28 74 72 79 5f 74  ....return(try_t
f260: 79 70 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ype);...}..}...C
f270: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f280: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65  TF("Unable to se
f290: 6c 65 63 74 20 61 6e 79 20 61 70 70 6c 65 74 2c  lect any applet,
f2a0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
f2b0: 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74 75 72  ilure");...retur
f2c0: 6e 28 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  n(CACKEY_ID_TYPE
f2d0: 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a 20  _ERROR);.}../*. 
f2e0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
f2f0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
f300: 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28  key_select_file(
f310: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
f320: 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36  ot *slot, uint16
f330: 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52  _t ef);. *. * AR
f340: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
f350: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
f360: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
f370: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
f380: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
f390: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65  *     uint16_t e
f3a0: 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65  f. *         Ele
f3b0: 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73  mental File to s
f3c0: 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55  elect. *. * RETU
f3d0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
f3e0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
f3f0: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
f400: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
f410: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
f420: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
f430: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
f440: 54 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20  This selects an 
f450: 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20  Elementary File 
f460: 28 45 46 29 20 75 6e 64 65 72 20 74 68 65 20 63  (EF) under the c
f470: 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65  urrently selecte
f480: 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61 74  d. *     Dedicat
f490: 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a  ed File (DF). *.
f4a0: 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79   *     Typically
f4b0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
f4c0: 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20  after selecting 
f4d0: 74 68 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c  the correct Appl
f4e0: 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20  et (using. *    
f4f0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
f500: 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61  pplet) for VM ca
f510: 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  rds. *. */.stati
f520: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
f530: 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28  key_select_file(
f540: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
f550: 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36  ot *slot, uint16
f560: 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e  _t ef) {..unsign
f570: 65 64 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b  ed char fid_buf[
f580: 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  2];..int send_re
f590: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
f5a0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
f5b0: 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74  .");.../* Open t
f5c0: 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69  he elementary fi
f5d0: 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30  le */..fid_buf[0
f5e0: 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20  ] = (ef >> 8) & 
f5f0: 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31  0xff;..fid_buf[1
f600: 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a  ] = ef & 0xff;..
f610: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f620: 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20  INTF("Selecting 
f630: 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75  file: %04lx", (u
f640: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66  nsigned long) ef
f650: 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20  );...send_ret = 
f660: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
f670: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
f680: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
f690: 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20  S_INSTR_SELECT, 
f6a0: 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65  0x02, 0x0C, size
f6b0: 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64  of(fid_buf), fid
f6c0: 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c  _buf, 0x00, NULL
f6d0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
f6e0: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
f6f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
f700: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
f710: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
f720: 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20  d to open file, 
f730: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
f740: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
f750: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
f760: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
f770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f780: 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79  TF("Successfully
f790: 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29   selected file")
f7a0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
f7b0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
f7c0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
f7d0: 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b   *     void cack
f7e0: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75  ey_free_tlv(stru
f7f0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
f800: 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a  tity *root);. *.
f810: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
f820: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
f830: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f  y_tlv_entity *ro
f840: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f  ot. *         Ro
f850: 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69  ot of the TLV li
f860: 73 74 20 74 6f 20 73 74 61 72 74 20 66 72 65 65  st to start free
f870: 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ing. *. * RETURN
f880: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f   VALUE. *     No
f890: 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ne. *. * NOTES. 
f8a0: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
f8b0: 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c  ion frees the TL
f8c0: 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20  V linked listed 
f8d0: 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a  returned from. *
f8e0: 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61       "cackey_rea
f8f0: 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74  d_tlv". *. */.st
f900: 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
f910: 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74  _free_tlv(struct
f920: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
f930: 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72  ty *root) {..str
f940: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
f950: 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65  ntity *curr, *ne
f960: 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d  xt;...if (root =
f970: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
f980: 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75  rn;..}...for (cu
f990: 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b  rr = root; curr;
f9a0: 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a   curr = next) {.
f9b0: 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f  ..next = curr->_
f9c0: 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20  next;....switch 
f9d0: 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09  (curr->tag) {...
f9e0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
f9f0: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61  ACR_TABLE:....ca
fa00: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  se GSCIS_TAG_CER
fa10: 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66  TIFICATE:.....if
fa20: 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b   (curr->value) {
fa30: 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d  ......free(curr-
fa40: 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09  >value);.....}..
fa50: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
fa60: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
fa70: 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72  URL:.....if (cur
fa80: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
fa90: 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
faa0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
fab0: 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  l);.....}.....br
fac0: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65  eak;...}....free
fad0: 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74  (curr);..}...ret
fae0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  urn;.}../*. * SY
faf0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
fb00: 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
fb10: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
fb20: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
fb30: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
fb40: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
fb50: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
fb60: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
fb70: 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79  v_entity *cackey
fb80: 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74  _read_tlv(struct
fb90: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
fba0: 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  ot) {..struct ca
fbb0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
fbc0: 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72  *curr_entity, *r
fbd0: 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73  oot = NULL, *las
fbe0: 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67  t = NULL;..unsig
fbf0: 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75  ned char tlen_bu
fc00: 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31  f[2], tval_buf[1
fc10: 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e  024], *tval;..un
fc20: 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e  signed char vlen
fc30: 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75  _buf[2], vval_bu
fc40: 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a  f[8192], *vval;.
fc50: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
fc60: 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65  tmpbuf;..unsigne
fc70: 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e  d long tmpbuflen
fc80: 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c  ;..ssize_t tlen,
fc90: 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20   vlen;..ssize_t 
fca0: 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f  read_ret;..size_
fcb0: 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20  t offset_t = 0, 
fcc0: 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75  offset_v = 0;..u
fcd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67  nsigned char tag
fce0: 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68  ;..size_t length
fcf0: 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49  ;.#ifdef HAVE_LI
fd00: 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65  BZ..int uncompre
fd10: 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a  ss_ret;.#endif..
fd20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
fd30: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
fd40: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61  ...read_ret = ca
fd50: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
fd60: 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c  (slot, tlen_buf,
fd70: 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66   sizeof(tlen_buf
fd80: 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b  ), 1, offset_t);
fd90: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21  ..if (read_ret !
fda0: 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75  = sizeof(tlen_bu
fdb0: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
fdc0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61  EBUG_PRINTF("Rea
fdd0: 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  d failed, return
fde0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
fdf0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
fe00: 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28  );..}...tlen = (
fe10: 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38  tlen_buf[1] << 8
fe20: 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b  ) | tlen_buf[0];
fe30: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61  ...read_ret = ca
fe40: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
fe50: 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c  (slot, vlen_buf,
fe60: 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66   sizeof(vlen_buf
fe70: 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b  ), 2, offset_v);
fe80: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21  ..if (read_ret !
fe90: 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75  = sizeof(vlen_bu
fea0: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
feb0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61  EBUG_PRINTF("Rea
fec0: 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  d failed, return
fed0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
fee0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
fef0: 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28  );..}...vlen = (
ff00: 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38  vlen_buf[1] << 8
ff10: 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b  ) | vlen_buf[0];
ff20: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ff30: 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67  PRINTF("Tag Leng
ff40: 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20  th = %lu, Value 
ff50: 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20 28  Length = %lu", (
ff60: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74  unsigned long) t
ff70: 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  len, (unsigned l
ff80: 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66  ong) vlen);...of
ff90: 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66  fset_t += 2;..of
ffa0: 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69  fset_v += 2;...i
ffb0: 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66  f (tlen > sizeof
ffc0: 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09  (tval_buf)) {...
ffd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ffe0: 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20  NTF("Tag length 
fff0: 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65  is too large, re
10000 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
10010 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
10020 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
10030 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76  vlen > sizeof(vv
10040 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  al_buf)) {...CAC
10050 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10060 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69  ("Value length i
10070 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74  s too large, ret
10080 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
10090 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
100a0 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f  ULL);..}...read_
100b0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
100c0 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74  d_buffer(slot, t
100d0 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31  val_buf, tlen, 1
100e0 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66  , offset_t);..if
100f0 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c   (read_ret != tl
10100 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  en) {...CACKEY_D
10110 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
10120 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69  ble to read enti
10130 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74  re T-buffer, ret
10140 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
10150 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
10160 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f  ULL);..}...read_
10170 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
10180 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76  d_buffer(slot, v
10190 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32  val_buf, vlen, 2
101a0 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66  , offset_v);..if
101b0 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c   (read_ret != vl
101c0 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  en) {...CACKEY_D
101d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
101e0 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69  ble to read enti
101f0 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74  re V-buffer, ret
10200 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
10210 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
10220 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20  ULL);..}...tval 
10230 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61  = tval_buf;..vva
10240 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77  l = vval_buf;..w
10250 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26  hile (tlen > 0 &
10260 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09  & vlen > 0) {...
10270 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74  tag = *tval;...t
10280 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b  val++;...tlen--;
10290 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d  ....if (*tval ==
102a0 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67   0xff) {....leng
102b0 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c  th = (tval[2] <<
102c0 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09   8) | tval[1];..
102d0 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09  ..tval += 3;....
102e0 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65  tlen -= 3;...} e
102f0 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20  lse {....length 
10300 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c  = *tval;....tval
10310 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09  ++;....tlen--;..
10320 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
10330 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20  UG_PRINTF("Tag: 
10340 25 73 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b  %s (%02x)", CACK
10350 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
10360 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28  G_TO_STR(tag), (
10370 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61  unsigned int) ta
10380 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  g);...CACKEY_DEB
10390 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c  UG_PRINTBUF("Val
103a0 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  ue:", vval, leng
103b0 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74  th);....curr_ent
103c0 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77  ity = NULL;...sw
103d0 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09  itch (tag) {....
103e0 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
103f0 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72  ARDURL:.....curr
10400 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  _entity = malloc
10410 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
10420 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72  tity));.....curr
10430 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
10440 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28  ardurl = malloc(
10450 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
10460 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
10470 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70  rl));......memcp
10480 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  y(curr_entity->v
10490 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
104a0 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09  d, vval, 5);....
104b0 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
104c0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
104d0 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a  type = vval[5];.
104e0 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
104f0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10500 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c  objectid = (vval
10510 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c  [6] << 8) | vval
10520 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  [7];.....curr_en
10530 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
10540 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76  url->appid = (vv
10550 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76  al[8] << 8) | vv
10560 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72  al[9];......curr
10570 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
10580 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
10590 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c  ity->_next = NUL
105a0 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  L;......break;..
105b0 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
105c0 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09  _ACR_TABLE:.....
105d0 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
105e0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
105f0 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09  r_entity));.....
10600 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  tmpbuf = malloc(
10610 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65  length);......me
10620 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
10630 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09  l, length);.....
10640 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61  .curr_entity->ta
10650 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72  g = tag;.....cur
10660 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68  r_entity->length
10670 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63   = length;.....c
10680 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
10690 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09  e = tmpbuf;.....
106a0 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65  curr_entity->_ne
106b0 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  xt = NULL;......
106c0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47  break;....case G
106d0 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
106e0 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65  CATE:.....curr_e
106f0 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
10700 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
10710 74 79 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41  ty));..#ifdef HA
10720 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62  VE_LIBZ.....tmpb
10730 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a  uflen = length *
10740 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d   2;.....tmpbuf =
10750 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
10760 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72  n);......uncompr
10770 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70  ess_ret = uncomp
10780 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d  ress(tmpbuf, &tm
10790 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c  pbuflen, vval, l
107a0 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28  ength);.....if (
107b0 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21  uncompress_ret !
107c0 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43  = Z_OK) {......C
107d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
107e0 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65  TF("Failed to de
107f0 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70  compress, uncomp
10800 72 65 73 73 28 29 20 72 65 74 75 72 6e 65 64 20  ress() returned 
10810 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20  %i -- resorting 
10820 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c  to direct copy",
10830 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29   uncompress_ret)
10840 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65  ;.......tmpbufle
10850 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09  n = length;.....
10860 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
10870 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09  vval, length);..
10880 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
10890 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
108a0 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f  "Decompressed to
108b0 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62  :", tmpbuf, tmpb
108c0 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09  uflen);.#else...
108d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
108e0 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a  RINTF("Missing Z
108f0 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69  LIB Support, thi
10900 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  s certificate is
10910 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e   likely useless.
10920 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75  ..");......tmpbu
10930 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09  flen = length;..
10940 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
10950 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
10960 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72  .#endif......cur
10970 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20  r_entity->tag = 
10980 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  tag;.....curr_en
10990 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74  tity->length = t
109a0 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75  mpbuflen;.....cu
109b0 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
109c0 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63   = tmpbuf;.....c
109d0 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78  urr_entity->_nex
109e0 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62  t = NULL;......b
109f0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53  reak;....case GS
10a00 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a  CIS_TAG_PKCS15:.
10a10 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20  ....curr_entity 
10a20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
10a30 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a  *curr_entity));.
10a40 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
10a50 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09  ->tag = tag;....
10a60 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
10a70 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b  lue_byte = vval[
10a80 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  0];.....curr_ent
10a90 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c  ity->_next = NUL
10aa0 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  L;......break;..
10ab0 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65  .}....vval += le
10ac0 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20  ngth;...vlen -= 
10ad0 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63  length;....if (c
10ae0 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55  urr_entity != NU
10af0 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f  LL) {....if (roo
10b00 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  t == NULL) {....
10b10 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74  .root = curr_ent
10b20 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ity;....}.....if
10b30 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20   (last != NULL) 
10b40 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78  {.....last->_nex
10b50 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b  t = curr_entity;
10b60 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d  ....}.....last =
10b70 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09   curr_entity;...
10b80 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f  }..}...return(ro
10b90 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  ot);.}../*. * SY
10ba0 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
10bb0 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
10bc0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
10bd0 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
10be0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
10bf0 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
10c00 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
10c10 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65  void cackey_free
10c20 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61  _certs(struct ca
10c30 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
10c40 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f  ty *start, size_
10c50 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65  t count, int fre
10c60 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65  e_start) {..size
10c70 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74  _t idx;...if (st
10c80 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
10c90 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f  .return;..}...fo
10ca0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
10cb0 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  < count; idx++) 
10cc0 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b 69 64  {...if (start[id
10cd0 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 20  x].certificate) 
10ce0 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72 74 5b  {....free(start[
10cf0 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
10d00 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
10d10 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09  free_start) {...
10d20 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a  free(start);..}.
10d30 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61  ..return;.}..sta
10d40 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
10d50 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
10d60 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72  *cackey_copy_cer
10d70 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  ts(struct cackey
10d80 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
10d90 64 65 73 74 2c 20 73 74 72 75 63 74 20 63 61 63  dest, struct cac
10da0 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
10db0 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74  y *start, size_t
10dc0 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f   count) {..size_
10dd0 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61  t idx;...if (sta
10de0 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
10df0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
10e00 0a 0a 09 69 66 20 28 64 65 73 74 20 3d 3d 20 4e  ...if (dest == N
10e10 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74 20 3d 20  ULL) {...dest = 
10e20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64  malloc(sizeof(*d
10e30 65 73 74 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09  est) * count);..
10e40 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
10e50 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69  ; idx < count; i
10e60 64 78 2b 2b 29 20 7b 0a 09 09 64 65 73 74 5b 69  dx++) {...dest[i
10e70 64 78 5d 2e 69 64 5f 74 79 70 65 20 3d 20 73 74  dx].id_type = st
10e80 61 72 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65  art[idx].id_type
10e90 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 64 65 73  ;....switch (des
10ea0 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 29 20  t[idx].id_type) 
10eb0 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  {....case CACKEY
10ec0 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
10ed0 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64  ..memcpy(dest[id
10ee0 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  x].card.cac.appl
10ef0 65 74 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63  et, start[idx].c
10f00 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20  ard.cac.applet, 
10f10 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 5d  sizeof(dest[idx]
10f20 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  .card.cac.applet
10f30 29 29 3b 0a 09 09 09 09 64 65 73 74 5b 69 64 78  ));.....dest[idx
10f40 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20  ].card.cac.file 
10f50 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72  = start[idx].car
10f60 64 2e 63 61 63 2e 66 69 6c 65 3b 0a 09 09 09 09  d.cac.file;.....
10f70 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
10f80 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
10f90 56 3a 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d  V:.....dest[idx]
10fa0 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64  .card.piv.key_id
10fb0 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61   = start[idx].ca
10fc0 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 3b 0a 09  rd.piv.key_id;..
10fd0 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69  ...memcpy(dest[i
10fe0 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62  dx].card.piv.lab
10ff0 65 6c 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63  el, start[idx].c
11000 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73  ard.piv.label, s
11010 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e  izeof(dest[idx].
11020 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 29 29  card.piv.label))
11030 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
11040 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
11050 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09  YPE_CERT_ONLY:..
11060 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09  ...break;...}...
11070 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  dest[idx].certif
11080 69 63 61 74 65 5f 6c 65 6e 20 3d 20 73 74 61 72  icate_len = star
11090 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
110a0 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 73 74 5b 69  te_len;...dest[i
110b0 64 78 5d 2e 6b 65 79 73 69 7a 65 20 3d 20 73 74  dx].keysize = st
110c0 61 72 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65  art[idx].keysize
110d0 3b 0a 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63  ;....dest[idx].c
110e0 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c  ertificate = mal
110f0 6c 6f 63 28 64 65 73 74 5b 69 64 78 5d 2e 63 65  loc(dest[idx].ce
11100 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
11110 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64  ..memcpy(dest[id
11120 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20  x].certificate, 
11130 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
11140 66 69 63 61 74 65 2c 20 64 65 73 74 5b 69 64 78  ficate, dest[idx
11150 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
11160 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  n);..}...return(
11170 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  dest);.}../*. * 
11180 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
11190 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
111a0 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
111b0 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
111c0 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
111d0 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
111e0 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
111f0 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
11200 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
11210 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73  ackey_read_certs
11220 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
11230 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63  lot *slot, struc
11240 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
11250 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c 20 75  entity *certs, u
11260 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f  nsigned long *co
11270 75 6e 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70  unt) {..cackey_p
11280 63 73 63 5f 69 64 5f 74 79 70 65 20 63 68 65 63  csc_id_type chec
11290 6b 5f 69 64 5f 74 79 70 65 3b 0a 09 73 74 72 75  k_id_type;..stru
112a0 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
112b0 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64  dentity *curr_id
112c0 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
112d0 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63  _tlv_entity *ccc
112e0 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c  _tlv, *ccc_curr,
112f0 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f   *app_tlv, *app_
11300 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20  curr;..unsigned 
11310 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c 20 70  char *piv_oid, p
11320 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 5b 5d  iv_oid_pivauth[]
11330 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33   = {NISTSP800_73
11340 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 7d 2c  _3_OID_PIVAUTH},
11350 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75   piv_oid_signatu
11360 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30  re[] = {NISTSP80
11370 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41  0_73_3_OID_SIGNA
11380 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b  TURE}, piv_oid_k
11390 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 54 53  eymgt[] = {NISTS
113a0 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45  P800_73_3_OID_KE
113b0 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  YMGT};..unsigned
113c0 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37   char curr_aid[7
113d0 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ];..unsigned cha
113e0 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d 2c 20  r buffer[8192], 
113f0 2a 62 75 66 66 65 72 5f 70 2c 20 2a 74 6d 70 62  *buffer_p, *tmpb
11400 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  uf;..unsigned lo
11410 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09  ng outidx = 0;..
11420 63 68 61 72 20 2a 70 69 76 5f 6c 61 62 65 6c 3b  char *piv_label;
11430 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61  ..cackey_ret tra
11440 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73  nsaction_ret;..s
11450 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b  size_t read_ret;
11460 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f  ..size_t buffer_
11470 6c 65 6e 2c 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  len, tmpbuflen;.
11480 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a  .int certs_resiz
11490 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  able;..int send_
114a0 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b  ret, select_ret;
114b0 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70  ..int piv_key, p
114c0 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 63 61 63  iv = 0;..int cac
114d0 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69 64 3b  hed_certs_valid;
114e0 0a 09 69 6e 74 20 69 64 78 3b 0a 09 63 61 63 6b  ..int idx;..cack
114f0 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20  ey_pcsc_id_type 
11500 69 64 5f 74 79 70 65 3b 0a 23 69 66 64 65 66 20  id_type;.#ifdef 
11510 48 41 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75  HAVE_LIBZ..int u
11520 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 09  ncompress_ret;..
11530 7a 5f 73 74 72 65 61 6d 20 67 7a 69 70 5f 73 74  z_stream gzip_st
11540 72 65 61 6d 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  ream;.#endif...C
11550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11560 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
11570 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55  .if (count == NU
11580 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
11590 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 6f 75  EBUG_PRINTF("cou
115a0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75  nt is NULL, retu
115b0 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
115c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
115d0 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65  LL);..}...if (ce
115e0 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts != NULL) {..
115f0 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30  .if (*count == 0
11600 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
11610 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
11620 65 73 74 65 64 20 77 65 20 72 65 74 75 72 6e 20  ested we return 
11630 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72 74  0 objects, short
11640 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 09 09  -circuit");.....
11650 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09  return(certs);..
11660 09 7d 0a 09 7d 0a 0a 09 63 61 63 68 65 64 5f 63  .}..}...cached_c
11670 65 72 74 73 5f 76 61 6c 69 64 20 3d 20 30 3b 0a  erts_valid = 0;.
11680 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74  .if (!slot->slot
11690 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20 28  _reset) {...if (
116a0 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
116b0 74 73 29 20 7b 0a 09 09 09 63 61 63 68 65 64 5f  ts) {....cached_
116c0 63 65 72 74 73 5f 76 61 6c 69 64 20 3d 20 31 3b  certs_valid = 1;
116d0 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63  .....if (slot->c
116e0 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
116f0 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 63 61 63  t > 0) {.....cac
11700 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69 64 20  hed_certs_valid 
11710 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  = 1;....}...}..}
11720 0a 0a 09 69 66 20 28 63 61 63 68 65 64 5f 63 65  ...if (cached_ce
11730 72 74 73 5f 76 61 6c 69 64 29 20 7b 0a 09 09 69  rts_valid) {...i
11740 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c  f (certs == NULL
11750 29 20 7b 0a 09 09 09 63 65 72 74 73 20 3d 20 6d  ) {....certs = m
11760 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 65  alloc(sizeof(*ce
11770 72 74 73 29 20 2a 20 73 6c 6f 74 2d 3e 63 61 63  rts) * slot->cac
11780 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 29  hed_certs_count)
11790 3b 0a 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c  ;....*count = sl
117a0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
117b0 5f 63 6f 75 6e 74 3b 0a 09 09 7d 20 65 6c 73 65  _count;...} else
117c0 20 7b 0a 09 09 09 69 66 20 28 2a 63 6f 75 6e 74   {....if (*count
117d0 20 3e 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f   > slot->cached_
117e0 63 65 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  certs_count) {..
117f0 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74  ...*count = slot
11800 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  ->cached_certs_c
11810 6f 75 6e 74 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  ount;....}...}..
11820 09 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65  ..cackey_copy_ce
11830 72 74 73 28 63 65 72 74 73 2c 20 73 6c 6f 74 2d  rts(certs, slot-
11840 3e 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 2a  >cached_certs, *
11850 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45  count);....CACKE
11860 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11870 52 65 74 75 72 6e 69 6e 67 20 63 61 63 68 65 64  Returning cached
11880 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66 6f   certificates fo
11890 72 20 74 68 69 73 20 73 6c 6f 74 20 28 63 61 72  r this slot (car
118a0 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 72  d has not been r
118b0 65 73 65 74 20 61 6e 64 20 74 68 65 72 65 20 61  eset and there a
118c0 72 65 20 63 61 63 68 65 64 20 63 65 72 74 73 20  re cached certs 
118d0 61 76 61 69 6c 61 62 6c 65 29 22 29 3b 0a 0a 09  available)");...
118e0 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a  .return(certs);.
118f0 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 63  .}...if (slot->c
11900 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09  ached_certs) {..
11910 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
11920 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f  ts(slot->cached_
11930 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63  certs, slot->cac
11940 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c  hed_certs_count,
11950 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 61   1);....slot->ca
11960 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c  ched_certs = NUL
11970 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e  L;..}.../* Begin
11980 20 61 20 53 6d 61 72 74 43 61 72 64 20 74 72 61   a SmartCard tra
11990 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61  nsaction */..tra
119a0 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63  nsaction_ret = c
119b0 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
119c0 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09  saction(slot);..
119d0 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f  if (transaction_
119e0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
119f0 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
11a00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11a10 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74  ("Unable begin t
11a20 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75  ransaction, retu
11a30 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
11a40 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
11a50 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74 79 70  LL);..}...id_typ
11a60 65 20 3d 20 63 61 63 6b 65 79 5f 64 65 74 65 63  e = cackey_detec
11a70 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f  t_and_select_roo
11a80 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 43  t_applet(slot, C
11a90 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e  ACKEY_ID_TYPE_UN
11aa0 4b 4e 4f 57 4e 29 3b 0a 0a 09 73 77 69 74 63 68  KNOWN);...switch
11ab0 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63   (id_type) {...c
11ac0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
11ad0 50 45 5f 43 41 43 3a 0a 09 09 09 70 69 76 20 3d  PE_CAC:....piv =
11ae0 20 30 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09   0;.....break;..
11af0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
11b00 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 70 69 76  TYPE_PIV:....piv
11b10 20 3d 20 31 3b 0a 0a 09 09 09 62 72 65 61 6b 3b   = 1;.....break;
11b20 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
11b30 44 5f 54 59 50 45 5f 45 52 52 4f 52 3a 0a 09 09  D_TYPE_ERROR:...
11b40 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
11b50 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
11b60 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
11b70 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
11b80 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28  (slot);.....if (
11b90 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  certs == NULL) {
11ba0 0a 09 09 09 09 2a 63 6f 75 6e 74 20 3d 20 30 3b  .....*count = 0;
11bb0 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
11bc0 28 4e 55 4c 4c 29 3b 0a 0a 09 09 09 62 72 65 61  (NULL);.....brea
11bd0 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  k;...case CACKEY
11be0 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e  _ID_TYPE_CERT_ON
11bf0 4c 59 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  LY:....CACKEY_DE
11c00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
11c10 72 2e 20 20 49 6d 70 6f 73 73 69 62 6c 65 20 63  r.  Impossible c
11c20 6f 6e 64 69 74 69 6f 6e 20 72 65 61 63 68 65 64  ondition reached
11c30 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  .");.....break;.
11c40 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d  .}...if (certs =
11c50 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74  = NULL) {...cert
11c60 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
11c70 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a  f(*certs) * 5);.
11c80 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09  ..*count = 5;...
11c90 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
11ca0 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
11cb0 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
11cc0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70   = 0;..}...if (p
11cd0 69 76 29 20 7b 0a 09 09 66 6f 72 20 28 69 64 78  iv) {...for (idx
11ce0 20 3d 20 30 3b 20 69 64 78 20 3c 20 33 3b 20 69   = 0; idx < 3; i
11cf0 64 78 2b 2b 29 20 7b 0a 09 09 09 73 77 69 74 63  dx++) {....switc
11d00 68 20 28 69 64 78 29 20 7b 0a 09 09 09 09 63 61  h (idx) {.....ca
11d10 73 65 20 30 3a 0a 09 09 09 09 09 70 69 76 5f 6f  se 0:......piv_o
11d20 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 70 69 76  id = piv_oid_piv
11d30 61 75 74 68 3b 0a 09 09 09 09 09 70 69 76 5f 6b  auth;......piv_k
11d40 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37  ey = NISTSP800_7
11d50 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55 54 48 3b  8_3_KEY_PIVAUTH;
11d60 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20  ......piv_label 
11d70 3d 20 22 41 75 74 68 65 6e 74 69 63 61 74 69 6f  = "Authenticatio
11d80 6e 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  n";......break;.
11d90 09 09 09 09 63 61 73 65 20 31 3a 0a 09 09 09 09  ....case 1:.....
11da0 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f  .piv_oid = piv_o
11db0 69 64 5f 73 69 67 6e 61 74 75 72 65 3b 0a 09 09  id_signature;...
11dc0 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53  ...piv_key = NIS
11dd0 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
11de0 53 49 47 4e 41 54 55 52 45 3b 0a 09 09 09 09 09  SIGNATURE;......
11df0 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 53 69 67  piv_label = "Sig
11e00 6e 61 74 75 72 65 22 3b 0a 09 09 09 09 09 62 72  nature";......br
11e10 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 32 3a  eak;.....case 2:
11e20 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20  ......piv_oid = 
11e30 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 3b 0a  piv_oid_keymgt;.
11e40 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e  .....piv_key = N
11e50 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45  ISTSP800_78_3_KE
11e60 59 5f 4b 45 59 4d 47 54 3b 0a 09 09 09 09 09 70  Y_KEYMGT;......p
11e70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 4b 65 79 20  iv_label = "Key 
11e80 4d 61 6e 61 67 65 6d 65 6e 74 22 3b 0a 09 09 09  Management";....
11e90 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09  ..break;....}...
11ea0 09 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63  ..read_ret = cac
11eb0 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f  key_get_data(slo
11ec0 74 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65 6f  t, buffer, sizeo
11ed0 66 28 62 75 66 66 65 72 29 2c 20 70 69 76 5f 6f  f(buffer), piv_o
11ee0 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 61  id);.....if (rea
11ef0 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09  d_ret <= 0) {...
11f00 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
11f10 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26  .....curr_id = &
11f20 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09  certs[outidx];..
11f30 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09  ..outidx++;.....
11f40 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65  curr_id->keysize
11f50 20 3d 20 2d 31 3b 0a 09 09 09 63 75 72 72 5f 69   = -1;....curr_i
11f60 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43 41 43  d->id_type = CAC
11f70 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3b  KEY_ID_TYPE_PIV;
11f80 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61 72  ....curr_id->car
11f90 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20 70  d.piv.key_id = p
11fa0 69 76 5f 6b 65 79 3b 0a 09 09 09 6d 65 6d 63 70  iv_key;....memcp
11fb0 79 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  y(curr_id->card.
11fc0 70 69 76 2e 6c 61 62 65 6c 2c 20 70 69 76 5f 6c  piv.label, piv_l
11fd0 61 62 65 6c 2c 20 73 74 72 6c 65 6e 28 70 69 76  abel, strlen(piv
11fe0 5f 6c 61 62 65 6c 29 20 2b 20 31 29 3b 0a 0a 09  _label) + 1);...
11ff0 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
12000 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 72 65 61  ficate_len = rea
12010 64 5f 72 65 74 3b 0a 09 09 09 63 75 72 72 5f 69  d_ret;....curr_i
12020 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d  d->certificate =
12030 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d   malloc(curr_id-
12040 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
12050 29 3b 0a 0a 09 09 09 62 75 66 66 65 72 5f 6c 65  );.....buffer_le
12060 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 66 65  n = sizeof(buffe
12070 72 29 3b 0a 09 09 09 62 75 66 66 65 72 5f 70 20  r);....buffer_p 
12080 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65  = cackey_read_be
12090 72 74 6c 76 5f 74 61 67 28 62 75 66 66 65 72 2c  rtlv_tag(buffer,
120a0 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c 20 30 78   &buffer_len, 0x
120b0 37 30 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72  70, curr_id->cer
120c0 74 69 66 69 63 61 74 65 2c 20 26 63 75 72 72 5f  tificate, &curr_
120d0 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
120e0 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 62 75  len);.....if (bu
120f0 66 66 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  ffer_p == NULL) 
12100 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
12110 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 69  UG_PRINTF("Readi
12120 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 66  ng certificate f
12130 72 6f 6d 20 42 45 52 2d 54 4c 56 20 72 65 73 70  rom BER-TLV resp
12140 6f 6e 73 65 20 66 61 69 6c 65 64 2c 20 73 6b 69  onse failed, ski
12150 70 70 69 6e 67 20 6b 65 79 20 25 69 22 2c 20 69  pping key %i", i
12160 64 78 29 3b 0a 0a 09 09 09 09 66 72 65 65 28 63  dx);......free(c
12170 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
12180 61 74 65 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ate);......curr_
12190 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
121a0 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 6f 75 74  = NULL;......out
121b0 69 64 78 2d 2d 3b 0a 0a 09 09 09 09 63 6f 6e 74  idx--;......cont
121c0 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  inue;....}.....i
121d0 66 20 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  f (curr_id->cert
121e0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 20 34 29  ificate_len > 4)
121f0 20 7b 0a 09 09 09 09 69 66 20 28 6d 65 6d 63 6d   {.....if (memcm
12200 70 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  p(curr_id->certi
12210 66 69 63 61 74 65 2c 20 22 5c 78 31 66 5c 78 38  ficate, "\x1f\x8
12220 62 5c 78 30 38 5c 78 30 30 22 2c 20 34 29 20 3d  b\x08\x00", 4) =
12230 3d 20 30 29 20 7b 0a 23 69 66 64 65 66 20 48 41  = 0) {.#ifdef HA
12240 56 45 5f 4c 49 42 5a 0a 09 09 09 09 09 74 6d 70  VE_LIBZ......tmp
12250 62 75 66 6c 65 6e 20 3d 20 63 75 72 72 5f 69 64  buflen = curr_id
12260 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
12270 6e 20 2a 20 32 3b 0a 09 09 09 09 09 74 6d 70 62  n * 2;......tmpb
12280 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62  uf = malloc(tmpb
12290 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 43 41  uflen);.......CA
122a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
122b0 42 55 46 28 22 41 74 74 65 6d 70 74 69 6e 67 20  BUF("Attempting 
122c0 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 3a 22 2c  to decompress:",
122d0 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
122e0 69 63 61 74 65 2c 20 63 75 72 72 5f 69 64 2d 3e  icate, curr_id->
122f0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
12300 3b 0a 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  ;.......gzip_str
12310 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d 20 4e 55 4c  eam.zalloc = NUL
12320 4c 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  L;......gzip_str
12330 65 61 6d 2e 7a 66 72 65 65 20 3d 20 4e 55 4c 4c  eam.zfree = NULL
12340 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65  ;......gzip_stre
12350 61 6d 2e 6f 70 61 71 75 65 20 3d 20 4e 55 4c 4c  am.opaque = NULL
12360 3b 0a 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  ;.......gzip_str
12370 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20 3d 20 63  eam.next_in  = c
12380 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
12390 61 74 65 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73  ate;......gzip_s
123a0 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20 3d  tream.avail_in =
123b0 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
123c0 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 09 09 09  icate_len;......
123d0 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74  gzip_stream.next
123e0 5f 6f 75 74 20 3d 20 74 6d 70 62 75 66 3b 0a 09  _out = tmpbuf;..
123f0 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e  ....gzip_stream.
12400 61 76 61 69 6c 5f 6f 75 74 20 3d 20 74 6d 70 62  avail_out = tmpb
12410 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 09 75 6e 63  uflen;.......unc
12420 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e  ompress_ret = in
12430 66 6c 61 74 65 49 6e 69 74 28 26 67 7a 69 70 5f  flateInit(&gzip_
12440 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 69 66  stream);......if
12450 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74   (uncompress_ret
12460 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09   == Z_OK) {.....
12470 09 09 2f 2a 20 54 72 79 20 61 67 61 69 6e 20 61  ../* Try again a
12480 73 20 61 20 67 7a 69 70 20 62 75 66 66 65 72 20  s a gzip buffer 
12490 2a 2f 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72  */.......uncompr
124a0 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74  ess_ret = inflat
124b0 65 45 6e 64 28 26 67 7a 69 70 5f 73 74 72 65 61  eEnd(&gzip_strea
124c0 6d 29 3b 0a 09 09 09 09 09 09 69 66 20 28 75 6e  m);.......if (un
124d0 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20  compress_ret == 
124e0 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 09 67  Z_OK) {........g
124f0 7a 69 70 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f  zip_stream.zallo
12500 63 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09  c = NULL;.......
12510 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a 66 72  .gzip_stream.zfr
12520 65 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ee = NULL;......
12530 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6f 70  ..gzip_stream.op
12540 61 71 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  aque = NULL;....
12550 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d  .....gzip_stream
12560 2e 6e 65 78 74 5f 69 6e 20 20 3d 20 63 75 72 72  .next_in  = curr
12570 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
12580 3b 0a 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74  ;........gzip_st
12590 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20 3d 20  ream.avail_in = 
125a0 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
125b0 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 09 09 09 09  cate_len;.......
125c0 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78  .gzip_stream.nex
125d0 74 5f 6f 75 74 20 3d 20 74 6d 70 62 75 66 3b 0a  t_out = tmpbuf;.
125e0 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65  .......gzip_stre
125f0 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20 74  am.avail_out = t
12600 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 09 09  mpbuflen;.......
12610 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20  .uncompress_ret 
12620 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 32 28 26  = inflateInit2(&
12630 67 7a 69 70 5f 73 74 72 65 61 6d 2c 20 33 31 29  gzip_stream, 31)
12640 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
12650 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70  ......if (uncomp
12660 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b  ress_ret == Z_OK
12670 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70  ) {.......uncomp
12680 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61  ress_ret = infla
12690 74 65 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 2c  te(&gzip_stream,
126a0 20 30 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09   0);......}.....
126b0 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f  .if (uncompress_
126c0 72 65 74 20 3d 3d 20 5a 5f 53 54 52 45 41 4d 5f  ret == Z_STREAM_
126d0 45 4e 44 29 20 7b 0a 09 09 09 09 09 09 75 6e 63  END) {.......unc
126e0 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e  ompress_ret = in
126f0 66 6c 61 74 65 45 6e 64 28 26 67 7a 69 70 5f 73  flateEnd(&gzip_s
12700 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 7d 20 65  tream);......} e
12710 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f  lse {.......unco
12720 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 5a 5f 44  mpress_ret = Z_D
12730 41 54 41 5f 45 52 52 4f 52 3b 0a 09 09 09 09 09  ATA_ERROR;......
12740 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d  }......if (uncom
12750 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f  press_ret == Z_O
12760 4b 29 20 7b 0a 09 09 09 09 09 09 74 6d 70 62 75  K) {.......tmpbu
12770 66 6c 65 6e 20 3d 20 67 7a 69 70 5f 73 74 72 65  flen = gzip_stre
12780 61 6d 2e 74 6f 74 61 6c 5f 6f 75 74 3b 0a 0a 09  am.total_out;...
12790 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
127a0 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f  G_PRINTBUF("Deco
127b0 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74  mpressed to:", t
127c0 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
127d0 29 3b 0a 0a 09 09 09 09 09 09 66 72 65 65 28 63  );........free(c
127e0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
127f0 61 74 65 29 3b 0a 0a 09 09 09 09 09 09 63 75 72  ate);........cur
12800 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
12810 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09  e = tmpbuf;.....
12820 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
12830 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 74 6d 70  ficate_len = tmp
12840 62 75 66 6c 65 6e 3b 0a 09 09 09 09 09 7d 20 65  buflen;......} e
12850 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  lse {.......CACK
12860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12870 22 44 65 63 6f 6d 70 72 65 73 73 69 6e 67 20 66  "Decompressing f
12880 61 69 6c 65 64 21 20 75 6e 63 6f 6d 70 72 65 73  ailed! uncompres
12890 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69 22  s() returned %i"
128a0 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  , uncompress_ret
128b0 29 3b 0a 0a 09 09 09 09 09 09 66 72 65 65 28 74  );........free(t
128c0 6d 70 62 75 66 29 3b 0a 09 09 09 09 09 7d 0a 23  mpbuf);......}.#
128d0 65 6c 73 65 0a 09 09 09 09 09 43 41 43 4b 45 59  else......CACKEY
128e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
128f0 72 72 6f 72 2e 20 20 57 65 20 67 6f 74 20 61 20  rror.  We got a 
12900 63 6f 6d 70 72 65 73 73 65 64 20 63 65 72 74 69  compressed certi
12910 66 69 63 61 74 65 20 62 75 74 20 77 65 20 64 6f  ficate but we do
12920 20 6e 6f 74 20 68 61 76 65 20 7a 6c 69 62 2e 20   not have zlib. 
12930 20 48 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20   Hoping for the 
12940 62 65 73 74 2e 22 29 3b 0a 23 65 6e 64 69 66 0a  best.");.#endif.
12950 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 09  ....}....}...}..
12960 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52 65  } else {.../* Re
12970 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65  ad all the apple
12980 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27  ts from the CCC'
12990 73 20 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f 74  s TLV */...ccc_t
129a0 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  lv = cackey_read
129b0 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 2f  _tlv(slot);..../
129c0 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55  * Look for CARDU
129d0 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70  RLs that cooresp
129e0 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65  ond to PKI apple
129f0 74 73 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63 63  ts */...for (ccc
12a00 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b  _curr = ccc_tlv;
12a10 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63   ccc_curr; ccc_c
12a20 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e  urr = ccc_curr->
12a30 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b  _next) {....CACK
12a40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12a50 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e  "Found tag: %s .
12a60 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  .. ", CACKEY_DEB
12a70 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
12a80 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67  TR(ccc_curr->tag
12a90 29 29 3b 0a 0a 09 09 09 69 66 20 28 63 63 63 5f  ));.....if (ccc_
12aa0 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43  curr->tag != GSC
12ab0 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20  IS_TAG_CARDURL) 
12ac0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
12ad0 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
12ae0 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65   skipping it (we
12af0 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
12b00 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09   CARDURLs)");...
12b10 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
12b20 7d 0a 0a 09 09 09 69 66 20 28 28 63 63 63 5f 63  }.....if ((ccc_c
12b30 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
12b40 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43 41  rl->apptype & CA
12b50 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
12b60 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f  ) != CACKEY_TLV_
12b70 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09 43  APP_PKI) {.....C
12b80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12b90 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69  TF("  ... skippi
12ba0 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63  ng it (we only c
12bb0 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70  are about PKI ap
12bc0 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c  plets, this appl
12bd0 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f  et supports: %s/
12be0 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44  %02x)", CACKEY_D
12bf0 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
12c00 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  E_TO_STR(ccc_cur
12c10 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
12c20 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73  ->apptype), (uns
12c30 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63  igned int) ccc_c
12c40 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
12c50 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09  rl->apptype);...
12c60 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
12c70 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  }.....CACKEY_DEB
12c80 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44  UG_PRINTBUF("RID
12c90 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  :", ccc_curr->va
12ca0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
12cb0 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72  , sizeof(ccc_cur
12cc0 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
12cd0 2d 3e 72 69 64 29 29 3b 0a 09 09 09 43 41 43 4b  ->rid));....CACK
12ce0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12cf0 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c  "AppID = %s/%04l
12d00 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
12d10 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
12d20 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
12d30 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
12d40 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
12d50 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
12d60 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
12d70 69 64 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44  id);....CACKEY_D
12d80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a  EBUG_PRINTF("Obj
12d90 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78  ectID = %s/%04lx
12da0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
12db0 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54  FUNC_OBJID_TO_ST
12dc0 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  R(ccc_curr->valu
12dd0 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
12de0 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  tid), (unsigned 
12df0 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e  long) ccc_curr->
12e00 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
12e10 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d 65  bjectid);.....me
12e20 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63  mcpy(curr_aid, c
12e30 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
12e40 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a  ardurl->rid, siz
12e50 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  eof(ccc_curr->va
12e60 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
12e70 29 29 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b  ));....curr_aid[
12e80 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
12e90 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75 72   - 2] = (ccc_cur
12ea0 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
12eb0 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26 20  ->appid >> 8) & 
12ec0 30 78 66 66 3b 0a 09 09 09 63 75 72 72 5f 61 69  0xff;....curr_ai
12ed0 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  d[sizeof(curr_ai
12ee0 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75  d) - 1] = ccc_cu
12ef0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
12f00 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b  l->appid & 0xff;
12f10 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 66  ...../* Select f
12f20 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20  ound applet ... 
12f30 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74  */....select_ret
12f40 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
12f50 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75  _applet(slot, cu
12f60 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63  rr_aid, sizeof(c
12f70 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 09 69 66  urr_aid));....if
12f80 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20   (select_ret != 
12f90 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
12fa0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
12fb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
12fc0 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70  led to select ap
12fd0 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70  plet, skipping p
12fe0 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69  rocessing of thi
12ff0 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  s object");.....
13000 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
13010 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f  ..../* ... and o
13020 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a  bject (file) */.
13030 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20  ...select_ret = 
13040 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
13050 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72  le(slot, ccc_cur
13060 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
13070 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 09  ->objectid);....
13080 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21  if (select_ret !
13090 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
130a0 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
130b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
130c0 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20  ailed to select 
130d0 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70  file, skipping p
130e0 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69  rocessing of thi
130f0 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  s object");.....
13100 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
13110 0a 09 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..../* Process t
13120 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c  his file's TLV l
13130 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69  ooking for certi
13140 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 09 61 70  ficates */....ap
13150 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72  p_tlv = cackey_r
13160 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 09  ead_tlv(slot);..
13170 0a 09 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72  ....for (app_cur
13180 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70  r = app_tlv; app
13190 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20  _curr; app_curr 
131a0 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78  = app_curr->_nex
131b0 74 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  t) {.....CACKEY_
131c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
131d0 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41  und tag: %s", CA
131e0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
131f0 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63  TAG_TO_STR(app_c
13200 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 09  urr->tag));.....
13210 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61  if (app_curr->ta
13220 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43  g != GSCIS_TAG_C
13230 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
13240 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13250 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
13260 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
13270 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 45  ly care about CE
13280 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a  RTIFICATEs)");..
13290 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
132a0 09 09 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f 69  ...}......curr_i
132b0 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64  d = &certs[outid
132c0 78 5d 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b 2b  x];.....outidx++
132d0 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e  ;......curr_id->
132e0 69 64 5f 74 79 70 65 20 3d 20 43 41 43 4b 45 59  id_type = CACKEY
132f0 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09 09  _ID_TYPE_CAC;...
13300 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64  ..memcpy(curr_id
13310 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
13320 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
13330 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72  eof(curr_id->car
13340 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a  d.cac.applet));.
13350 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61 72  ....curr_id->car
13360 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 63 63 63  d.cac.file = ccc
13370 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
13380 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a  durl->objectid;.
13390 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79  ....curr_id->key
133a0 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09 09  size = -1;......
133b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
133c0 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75 72  NTF("Filling cur
133d0 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
133e0 70 70 6c 65 74 20 28 25 70 29 20 77 69 74 68 20  pplet (%p) with 
133f0 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72  %lu bytes:", cur
13400 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
13410 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65 64  pplet, (unsigned
13420 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63 75   long) sizeof(cu
13430 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
13440 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 43 41  applet));.....CA
13450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13460 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72  BUF("VAL:", curr
13470 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  _id->card.cac.ap
13480 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 75 72  plet, sizeof(cur
13490 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
134a0 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63 75  pplet));......cu
134b0 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
134c0 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72  te_len = app_cur
134d0 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 09  r->length;......
134e0 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
134f0 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75  cate = malloc(cu
13500 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
13510 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d  te_len);.....mem
13520 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72  cpy(curr_id->cer
13530 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75  tificate, app_cu
13540 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f  rr->value, curr_
13550 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
13560 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  len);......if (o
13570 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29  utidx >= *count)
13580 20 7b 0a 09 09 09 09 09 69 66 20 28 63 65 72 74   {......if (cert
13590 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09  s_resizable) {..
135a0 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32  .....*count *= 2
135b0 3b 0a 09 09 09 09 09 09 69 66 20 28 2a 63 6f 75  ;.......if (*cou
135c0 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09  nt != 0) {......
135d0 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f  ..certs = reallo
135e0 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28  c(certs, sizeof(
135f0 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e  *certs) * (*coun
13600 74 29 29 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73  t));.......} els
13610 65 20 7b 0a 09 09 09 09 09 09 09 63 65 72 74 73  e {........certs
13620 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 7d   = NULL;.......}
13630 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
13640 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
13650 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  .}.....}....}...
13660 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c  ..cackey_free_tl
13670 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 09  v(app_tlv);.....
13680 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
13690 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61  ount) {.....brea
136a0 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  k;....}...}....c
136b0 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63  ackey_free_tlv(c
136c0 63 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09 2a 63  cc_tlv);..}...*c
136d0 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a  ount = outidx;..
136e0 09 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a  .if (certs_resiz
136f0 61 62 6c 65 29 20 7b 0a 09 09 69 66 20 28 2a 63  able) {...if (*c
13700 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  ount != 0) {....
13710 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28  certs = realloc(
13720 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63  certs, sizeof(*c
13730 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29  erts) * (*count)
13740 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
13750 09 66 72 65 65 28 63 65 72 74 73 29 3b 0a 0a 09  .free(certs);...
13760 09 09 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a  ..certs = NULL;.
13770 09 09 7d 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 63  ..}..}...slot->c
13780 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 63 61  ached_certs = ca
13790 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28  ckey_copy_certs(
137a0 4e 55 4c 4c 2c 20 63 65 72 74 73 2c 20 2a 63 6f  NULL, certs, *co
137b0 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d 3e 63 61 63  unt);..slot->cac
137c0 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 20  hed_certs_count 
137d0 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20 54  = *count;.../* T
137e0 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61  erminate SmartCa
137f0 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
13800 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  /..cackey_end_tr
13810 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
13820 0a 0a 09 72 65 74 75 72 6e 28 63 65 72 74 73 29  ...return(certs)
13830 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
13840 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
13850 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
13860 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
13870 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
13880 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
13890 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
138a0 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69  *. */.static ssi
138b0 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73 69 67 6e  ze_t cackey_sign
138c0 64 65 63 72 79 70 74 28 73 74 72 75 63 74 20 63  decrypt(struct c
138d0 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
138e0 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  , struct cackey_
138f0 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
13900 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ty, unsigned cha
13910 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 62  r *buf, size_t b
13920 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20  uflen, unsigned 
13930 63 68 61 72 20 2a 6f 75 74 62 75 66 2c 20 73 69  char *outbuf, si
13940 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e 2c 20  ze_t outbuflen, 
13950 69 6e 74 20 70 61 64 49 6e 70 75 74 2c 20 69 6e  int padInput, in
13960 74 20 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b  t unpadOutput) {
13970 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  ..cackey_pcsc_id
13980 5f 74 79 70 65 20 69 64 5f 74 79 70 65 2c 20 63  _type id_type, c
13990 68 65 63 6b 5f 69 64 5f 74 79 70 65 3b 0a 09 75  heck_id_type;..u
139a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 79 6e  nsigned char dyn
139b0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31  _auth_template[1
139c0 30 5d 2c 20 2a 64 79 6e 5f 61 75 74 68 5f 74 6d  0], *dyn_auth_tm
139d0 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  pbuf;..unsigned 
139e0 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74  char *tmpbuf, *t
139f0 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66  mpbuf_s, *outbuf
13a00 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 70 3b 0a 09  _s, *outbuf_p;..
13a10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 79  unsigned char by
13a20 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70 31 2c  tes_to_send, p1,
13a30 20 63 6c 61 73 73 3b 0a 09 75 6e 73 69 67 6e 65   class;..unsigne
13a40 64 20 63 68 61 72 20 62 6c 6f 63 6b 74 79 70 65  d char blocktype
13a50 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 73 65  ;..cackey_ret se
13a60 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74 31 36 5f  nd_ret;..uint16_
13a70 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 73 73 69  t respcode;..ssi
13a80 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d 20 30 2c  ze_t retval = 0,
13a90 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 73   unpadoffset;..s
13aa0 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65 6e 2c  ize_t tmpbuflen,
13ab0 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f 75 74 62   padlen, tmpoutb
13ac0 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66 5f 6c 65  uflen, outbuf_le
13ad0 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74 6d 70  n;..int free_tmp
13ae0 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20 6c 65  buf = 0;..int le
13af0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
13b00 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
13b10 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d  ");...if (slot =
13b20 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
13b30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13b40 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69 73  "Error.  slot is
13b50 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
13b60 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
13b70 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (buf == NULL) {.
13b80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13b90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 62  RINTF("Error.  b
13ba0 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  uf is NULL");...
13bb0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
13bc0 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d 3d 20  ..if (outbuf == 
13bd0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
13be0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
13bf0 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20 69 73  rror.  outbuf is
13c00 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
13c10 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
13c20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  (identity == NUL
13c30 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
13c40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13c50 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69 73 20  r.  identity is 
13c60 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
13c70 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
13c80 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
13c90 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29  dentity == NULL)
13ca0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13cb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13cc0 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63    identity->pcsc
13cd0 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c  _identity is NUL
13ce0 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
13cf0 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74 79 70 65  1);..}...id_type
13d00 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73   = identity->pcs
13d10 63 5f 69 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74  c_identity->id_t
13d20 79 70 65 3b 0a 09 69 66 20 28 69 64 5f 74 79 70  ype;..if (id_typ
13d30 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  e == CACKEY_ID_T
13d40 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 29 20 7b  YPE_CERT_ONLY) {
13d50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13d60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
13d70 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
13d80 64 65 6e 74 69 74 79 20 69 73 20 43 41 43 4b 45  dentity is CACKE
13d90 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
13da0 4e 4c 59 2c 20 77 68 69 63 68 20 63 61 6e 6e 6f  NLY, which canno
13db0 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 69  t be used for si
13dc0 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09  gn/decrypt");...
13dd0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
13de0 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70  ..switch (id_typ
13df0 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b  e) {...case CACK
13e00 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a  EY_ID_TYPE_PIV:.
13e10 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
13e20 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 62 72  _TYPE_CAC:....br
13e30 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a  eak;...default:.
13e40 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13e50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
13e60 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
13e70 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 61  dentity is not a
13e80 20 73 75 70 70 6f 72 74 65 64 20 76 61 6c 75 65   supported value
13e90 2e 20 54 79 70 65 20 69 73 3a 20 30 78 25 6c 78  . Type is: 0x%lx
13ea0 20 28 50 49 56 20 3d 20 30 78 25 6c 78 2c 20 43   (PIV = 0x%lx, C
13eb0 41 43 20 3d 20 30 78 25 6c 78 29 22 2c 20 28 75  AC = 0x%lx)", (u
13ec0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
13ed0 5f 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64  _type, (unsigned
13ee0 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49 44   long) CACKEY_ID
13ef0 5f 54 59 50 45 5f 50 49 56 2c 20 28 75 6e 73 69  _TYPE_PIV, (unsi
13f00 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45  gned long) CACKE
13f10 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 29 3b 0a  Y_ID_TYPE_CAC);.
13f20 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
13f30 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
13f40 65 20 69 64 65 6e 74 69 74 79 20 4b 65 79 20 73  e identity Key s
13f50 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e  ize */..if (iden
13f60 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
13f70 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 30  ity->keysize < 0
13f80 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 79 2d 3e  ) {...identity->
13f90 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
13fa0 65 79 73 69 7a 65 20 3d 20 78 35 30 39 5f 74 6f  eysize = x509_to
13fb0 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e 74 69 74  _keysize(identit
13fc0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
13fd0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 69  ->certificate, i
13fe0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
13ff0 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
14000 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f  ate_len);..}.../
14010 2a 20 50 61 64 20 6d 65 73 73 61 67 65 20 74 6f  * Pad message to
14020 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66   key size */..if
14030 20 28 70 61 64 49 6e 70 75 74 29 20 7b 0a 09 09   (padInput) {...
14040 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  if (identity->pc
14050 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
14060 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09 09 09 69  size > 0) {....i
14070 66 20 28 62 75 66 6c 65 6e 20 21 3d 20 69 64 65  f (buflen != ide
14080 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
14090 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 29 20 7b  tity->keysize) {
140a0 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
140b0 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  > (identity->pcs
140c0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
140d0 69 7a 65 20 2d 20 33 29 29 20 7b 0a 09 09 09 09  ize - 3)) {.....
140e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
140f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 65  INTF("Error.  Me
14100 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
14110 67 65 20 74 6f 20 73 69 67 6e 2f 64 65 63 72 79  ge to sign/decry
14120 70 74 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  pt");.......retu
14130 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a 09  rn(-1);.....}...
14140 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 69  ...tmpbuflen = i
14150 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
14160 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 3b  entity->keysize;
14170 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61  .....tmpbuf = ma
14180 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b  lloc(tmpbuflen);
14190 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66  .....free_tmpbuf
141a0 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61 64 6c 65   = 1;......padle
141b0 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 2d 20  n = tmpbuflen - 
141c0 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09 09  buflen - 3;.....
141d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
141e0 49 4e 54 46 28 22 4e 65 65 64 20 74 6f 20 70 61  INTF("Need to pa
141f0 64 20 74 68 65 20 62 75 66 66 65 72 20 77 69 74  d the buffer wit
14200 68 20 25 6c 6c 75 20 62 79 74 65 73 20 28 74 6d  h %llu bytes (tm
14210 70 62 75 66 6c 65 6e 20 3d 20 25 6c 6c 75 2c 20  pbuflen = %llu, 
14220 62 75 66 6c 65 6e 20 3d 20 25 6c 6c 75 29 22 2c  buflen = %llu)",
14230 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20   (unsigned long 
14240 6c 6f 6e 67 29 20 70 61 64 6c 65 6e 2c 20 28 75  long) padlen, (u
14250 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
14260 67 29 20 74 6d 70 62 75 66 6c 65 6e 2c 20 28 75  g) tmpbuflen, (u
14270 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
14280 67 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09  g) buflen);.....
14290 09 2f 2a 20 52 53 41 20 50 4b 43 53 23 31 20 45  ./* RSA PKCS#1 E
142a0 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f 35 20 50  MSA-PKCS1-v1_5 P
142b0 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09 09 74 6d  adding */.....tm
142c0 70 62 75 66 5b 30 5d 20 3d 20 30 78 30 30 3b 0a  pbuf[0] = 0x00;.
142d0 09 09 09 09 74 6d 70 62 75 66 5b 31 5d 20 3d 20  ....tmpbuf[1] = 
142e0 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d 73 65 74  0x01;.....memset
142f0 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30 78 46  (&tmpbuf[2], 0xF
14300 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09 09 09  F, padlen);.....
14310 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20  tmpbuf[padlen + 
14320 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 09 6d 65  2]= 0x00;.....me
14330 6d 63 70 79 28 26 74 6d 70 62 75 66 5b 70 61 64  mcpy(&tmpbuf[pad
14340 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62  len + 3], buf, b
14350 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 43 41 43  uflen);......CAC
14360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
14370 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20  UF("Unpadded:", 
14380 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09  buf, buflen);...
14390 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
143a0 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a  RINTBUF("Padded:
143b0 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75  ", tmpbuf, tmpbu
143c0 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65  flen);....} else
143d0 20 7b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20   {.....tmpbuf = 
143e0 62 75 66 3b 0a 09 09 09 09 74 6d 70 62 75 66 6c  buf;.....tmpbufl
143f0 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09  en = buflen;....
14400 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
14410 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 30  ;.....padlen = 0
14420 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20  ;....}...} else 
14430 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
14440 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
14450 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 6b 65   to determine ke
14460 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e 67 20 74  y size, hoping t
14470 68 65 20 6d 65 73 73 61 67 65 20 69 73 20 70 72  he message is pr
14480 6f 70 65 72 6c 79 20 70 61 64 64 65 64 21 22 29  operly padded!")
14490 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 62  ;.....tmpbuf = b
144a0 75 66 3b 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e  uf;....tmpbuflen
144b0 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72   = buflen;....fr
144c0 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09  ee_tmpbuf = 0;..
144d0 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09  ..padlen = 0;...
144e0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74 6d  }..} else {...tm
144f0 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d  pbuf = buf;...tm
14500 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e  pbuflen = buflen
14510 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ;...free_tmpbuf 
14520 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20  = 0;...padlen = 
14530 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e  0;..}.../* Begin
14540 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
14550 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72  .cackey_begin_tr
14560 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
14570 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72  .../* Select cor
14580 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09  rect applet */..
14590 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29  switch (id_type)
145a0 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59   {...case CACKEY
145b0 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
145c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
145d0 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20  INTF("Selecting 
145e0 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61 74 20  applet found at 
145f0 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 69 74  %p ...", identit
14600 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
14610 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
14620 74 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  t);....cackey_se
14630 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
14640 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
14650 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e  _identity->card.
14660 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65  cac.applet, size
14670 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  of(identity->pcs
14680 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  c_identity->card
14690 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a  .cac.applet));..
146a0 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72  .../* Select cor
146b0 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09 09 09  rect file */....
146c0 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
146d0 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74  le(slot, identit
146e0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
146f0 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 29  ->card.cac.file)
14700 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
14710 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
14720 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e 5f 61 75  E_PIV:....dyn_au
14730 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30 5d 20 3d  th_template[0] =
14740 20 30 78 37 43 3b 0a 09 09 09 64 79 6e 5f 61 75   0x7C;....dyn_au
14750 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 5d 20 3d  th_template[1] =
14760 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75   0x82;....dyn_au
14770 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32 5d 20 3d  th_template[2] =
14780 20 28 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36   ((tmpbuflen + 6
14790 29 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38  ) & 0xff00) >> 8
147a0 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
147b0 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28 74 6d 70  mplate[3] = (tmp
147c0 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20 30 78  buflen + 6) & 0x
147d0 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f 61 75 74  00ff;....dyn_aut
147e0 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d 20 3d 20  h_template[4] = 
147f0 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x82;....dyn_aut
14800 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d 20 3d 20  h_template[5] = 
14810 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x00;....dyn_aut
14820 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d 20 3d 20  h_template[6] = 
14830 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x81;....dyn_aut
14840 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d 20 3d 20  h_template[7] = 
14850 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x82;....dyn_aut
14860 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d 20 3d 20  h_template[8] = 
14870 28 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78 66  (tmpbuflen & 0xf
14880 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79  f00) >> 8;....dy
14890 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
148a0 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 26  9] = tmpbuflen &
148b0 20 30 78 30 30 66 66 3b 0a 0a 09 09 09 64 79 6e   0x00ff;.....dyn
148c0 5f 61 75 74 68 5f 74 6d 70 62 75 66 20 3d 20 6d  _auth_tmpbuf = m
148d0 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 20  alloc(tmpbuflen 
148e0 2b 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74  + sizeof(dyn_aut
148f0 68 5f 74 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09  h_template));...
14900 09 6d 65 6d 63 70 79 28 64 79 6e 5f 61 75 74 68  .memcpy(dyn_auth
14910 5f 74 6d 70 62 75 66 2c 20 64 79 6e 5f 61 75 74  _tmpbuf, dyn_aut
14920 68 5f 74 65 6d 70 6c 61 74 65 2c 20 73 69 7a 65  h_template, size
14930 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  of(dyn_auth_temp
14940 6c 61 74 65 29 29 3b 0a 09 09 09 6d 65 6d 63 70  late));....memcp
14950 79 28 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75  y(dyn_auth_tmpbu
14960 66 20 2b 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61  f + sizeof(dyn_a
14970 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 2c 20 74  uth_template), t
14980 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
14990 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65 65 5f  );.....if (free_
149a0 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 66 72  tmpbuf) {.....fr
149b0 65 65 28 74 6d 70 62 75 66 29 3b 0a 09 09 09 7d  ee(tmpbuf);....}
149c0 0a 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 2b  .....tmpbuflen +
149d0 3d 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74  = sizeof(dyn_aut
149e0 68 5f 74 65 6d 70 6c 61 74 65 29 3b 0a 09 09 09  h_template);....
149f0 74 6d 70 62 75 66 20 3d 20 64 79 6e 5f 61 75 74  tmpbuf = dyn_aut
14a00 68 5f 74 6d 70 62 75 66 3b 0a 09 09 09 66 72 65  h_tmpbuf;....fre
14a10 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09  e_tmpbuf = 1;...
14a20 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
14a30 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
14a40 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65  ERT_ONLY:....bre
14a50 61 6b 3b 0a 09 7d 0a 0a 09 74 6d 70 62 75 66 5f  ak;..}...tmpbuf_
14a60 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09 6f 75 74  s = tmpbuf;..out
14a70 62 75 66 5f 73 20 3d 20 6f 75 74 62 75 66 3b 0a  buf_s = outbuf;.
14a80 09 77 68 69 6c 65 20 28 74 6d 70 62 75 66 6c 65  .while (tmpbufle
14a90 6e 29 20 7b 0a 09 09 74 6d 70 6f 75 74 62 75 66  n) {...tmpoutbuf
14aa0 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b  len = outbuflen;
14ab0 0a 0a 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65  ....if (tmpbufle
14ac0 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  n > CACKEY_APDU_
14ad0 4d 54 55 29 20 7b 0a 09 09 09 62 79 74 65 73 5f  MTU) {....bytes_
14ae0 74 6f 5f 73 65 6e 64 20 3d 20 43 41 43 4b 45 59  to_send = CACKEY
14af0 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 20 65  _APDU_MTU;...} e
14b00 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73 5f 74  lse {....bytes_t
14b10 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c  o_send = tmpbufl
14b20 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 5f  en;...}....send_
14b30 72 65 74 20 3d 20 43 41 43 4b 45 59 5f 50 43 53  ret = CACKEY_PCS
14b40 43 5f 45 5f 47 45 4e 45 52 49 43 3b 0a 09 09 73  C_E_GENERIC;...s
14b50 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20  witch (id_type) 
14b60 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  {....case CACKEY
14b70 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
14b80 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20  ..if (tmpbuflen 
14b90 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  > CACKEY_APDU_MT
14ba0 55 29 20 7b 0a 09 09 09 09 09 70 31 20 3d 20 30  U) {......p1 = 0
14bb0 78 38 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30  x80;......le = 0
14bc0 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  x00;.....} else 
14bd0 7b 0a 09 09 09 09 09 70 31 20 3d 20 30 78 30 30  {......p1 = 0x00
14be0 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30  ;......le = 0x00
14bf0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e  ;.....}......sen
14c00 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
14c10 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
14c20 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
14c30 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49  L_PLATFORM, GSCI
14c40 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45 43 52  S_INSTR_SIGNDECR
14c50 59 50 54 2c 20 70 31 2c 20 30 78 30 30 2c 20 62  YPT, p1, 0x00, b
14c60 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d  ytes_to_send, tm
14c70 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 63  pbuf, le, &respc
14c80 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d  ode, outbuf, &tm
14c90 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 09  poutbuflen);....
14ca0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14cb0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
14cc0 49 56 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62  IV:.....if (tmpb
14cd0 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41  uflen > CACKEY_A
14ce0 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09  PDU_MTU) {......
14cf0 63 6c 61 73 73 20 3d 20 30 78 31 30 3b 0a 09 09  class = 0x10;...
14d00 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09  ...le = 0x00;...
14d10 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
14d20 63 6c 61 73 73 20 3d 20 47 53 43 49 53 5f 43 4c  class = GSCIS_CL
14d30 41 53 53 5f 49 53 4f 37 38 31 36 3b 0a 09 09 09  ASS_ISO7816;....
14d40 09 09 6c 65 20 3d 20 32 35 36 3b 0a 09 09 09 09  ..le = 256;.....
14d50 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65 74 20  }......send_ret 
14d60 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
14d70 64 75 28 73 6c 6f 74 2c 20 63 6c 61 73 73 2c 20  du(slot, class, 
14d80 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49  NISTSP800_73_3_I
14d90 4e 53 54 52 5f 47 45 4e 41 55 54 48 2c 20 4e 49  NSTR_GENAUTH, NI
14da0 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47  STSP800_78_3_ALG
14db0 4f 5f 52 53 41 32 30 34 38 2c 20 69 64 65 6e 74  O_RSA2048, ident
14dc0 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
14dd0 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79  ty->card.piv.key
14de0 5f 69 64 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65  _id, bytes_to_se
14df0 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20  nd, tmpbuf, le, 
14e00 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75  &respcode, outbu
14e10 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e  f, &tmpoutbuflen
14e20 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
14e30 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
14e40 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a  TYPE_CERT_ONLY:.
14e50 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
14e60 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
14e70 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
14e80 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 66 72 65  OK) {....if (fre
14e90 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09  e_tmpbuf) {.....
14ea0 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
14eb0 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66  .....free(tmpbuf
14ec0 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  _s);.....}....}.
14ed0 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  ..../* End trans
14ee0 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63  action */....cac
14ef0 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
14f00 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69  ion(slot);.....i
14f10 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
14f20 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
14f30 52 59 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  RY) {.....CACKEY
14f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
14f50 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c  DPU Sending Fail
14f60 65 64 20 2d 2d 20 72 65 74 72 79 69 6e 67 2e 22  ed -- retrying."
14f70 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 63  );......return(c
14f80 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
14f90 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79  t(slot, identity
14fa0 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 2c 20 6f  , buf, buflen, o
14fb0 75 74 62 75 66 2c 20 6f 75 74 62 75 66 6c 65 6e  utbuf, outbuflen
14fc0 2c 20 70 61 64 49 6e 70 75 74 2c 20 75 6e 70 61  , padInput, unpa
14fd0 64 4f 75 74 70 75 74 29 29 3b 0a 09 09 09 7d 0a  dOutput));....}.
14fe0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14ff0 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65  _PRINTF("ADPU Se
15000 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20  nding Failed -- 
15010 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
15020 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 72  or.");.....if (r
15030 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38  espcode == 0x698
15040 32 20 7c 7c 20 72 65 73 70 63 6f 64 65 20 3d 3d  2 || respcode ==
15050 20 30 78 36 65 30 30 20 7c 7c 20 72 65 73 70 63   0x6e00 || respc
15060 6f 64 65 20 3d 3d 20 30 78 36 64 30 30 29 20 7b  ode == 0x6d00) {
15070 0a 09 09 09 09 69 66 20 28 72 65 73 70 63 6f 64  .....if (respcod
15080 65 20 3d 3d 20 30 78 36 65 30 30 29 20 7b 0a 09  e == 0x6e00) {..
15090 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
150a0 5f 50 52 49 4e 54 46 28 22 47 6f 74 20 5c 22 57  _PRINTF("Got \"W
150b0 52 4f 4e 47 20 43 4c 41 53 53 5c 22 2c 20 74 68  RONG CLASS\", th
150c0 69 73 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  is means we are 
150d0 74 61 6c 6b 69 6e 67 20 74 6f 20 74 68 65 20 77  talking to the w
150e0 72 6f 6e 67 20 6f 62 6a 65 63 74 20 28 6c 69 6b  rong object (lik
150f0 65 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  ely because the 
15100 63 61 72 64 20 77 65 6e 74 20 61 77 61 79 29 20  card went away) 
15110 2d 2d 20 72 65 73 65 74 74 69 6e 67 22 29 3b 0a  -- resetting");.
15120 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 72  ....} else if (r
15130 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 64 30  espcode == 0x6d0
15140 30 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  0) {......CACKEY
15150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 47  _DEBUG_PRINTF("G
15160 6f 74 20 5c 22 49 4e 56 41 4c 49 44 20 49 4e 53  ot \"INVALID INS
15170 54 52 55 43 54 49 4f 4e 5c 22 2c 20 74 68 69 73  TRUCTION\", this
15180 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 74 61   means we are ta
15190 6c 6b 69 6e 67 20 74 6f 20 74 68 65 20 77 72 6f  lking to the wro
151a0 6e 67 20 6f 62 6a 65 63 74 20 28 6c 69 6b 65 6c  ng object (likel
151b0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  y because the ca
151c0 72 64 20 77 65 6e 74 20 61 77 61 79 29 20 2d 2d  rd went away) --
151d0 20 72 65 73 65 74 74 69 6e 67 22 29 3b 0a 09 09   resetting");...
151e0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
151f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15200 4e 54 46 28 22 53 65 63 75 72 69 74 79 20 73 74  NTF("Security st
15210 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66  atus not satisif
15220 69 65 64 20 28 72 65 73 70 63 6f 64 65 20 3d 20  ied (respcode = 
15230 30 78 25 30 34 78 29 2e 20 20 52 65 74 75 72 6e  0x%04x).  Return
15240 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22 2c 20  ing NEEDLOGIN", 
15250 28 69 6e 74 29 20 72 65 73 70 63 6f 64 65 29 3b  (int) respcode);
15260 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b  .....}......cack
15270 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
15280 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 63  et(slot);......c
15290 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61 6e 64  ackey_detect_and
152a0 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 70  _select_root_app
152b0 6c 65 74 28 73 6c 6f 74 2c 20 43 41 43 4b 45 59  let(slot, CACKEY
152c0 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e  _ID_TYPE_UNKNOWN
152d0 29 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 6f  );......slot->to
152e0 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
152f0 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
15300 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
15310 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
15320 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  GIN);....}.....i
15330 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
15340 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
15350 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09  ENABSENT) {.....
15360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15370 4e 54 46 28 22 54 6f 6b 65 6e 20 61 62 73 65 6e  NTF("Token absen
15380 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 54 4f  t.  Returning TO
15390 4b 45 4e 41 42 53 45 4e 54 22 29 3b 0a 0a 09 09  KENABSENT");....
153a0 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
153b0 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
153c0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
153d0 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
153e0 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 0a 09 09  BSENT);....}....
153f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15400 49 4e 54 46 28 22 53 6f 6d 65 74 68 69 6e 67 20  INTF("Something 
15410 77 65 6e 74 20 77 72 6f 6e 67 20 64 75 72 69 6e  went wrong durin
15420 67 20 73 69 67 6e 69 6e 67 2c 20 72 65 73 65 74  g signing, reset
15430 74 69 6e 67 20 74 68 65 20 73 6c 6f 74 20 61 6e  ting the slot an
15440 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65  d hoping for the
15450 20 62 65 73 74 2e 22 29 3b 0a 0a 09 09 09 63 61   best.");.....ca
15460 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
15470 6e 65 63 74 28 29 3b 0a 0a 09 09 09 63 61 63 6b  nect();.....cack
15480 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
15490 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 64 65  );.....cackey_de
154a0 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f  tect_and_select_
154b0 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  root_applet(slot
154c0 2c 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  , CACKEY_ID_TYPE
154d0 5f 55 4e 4b 4e 4f 57 4e 29 3b 0a 0a 09 09 09 72  _UNKNOWN);.....r
154e0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
154f0 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
15500 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b 3d 20 62  }....tmpbuf += b
15510 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09  ytes_to_send;...
15520 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 62 79 74  tmpbuflen -= byt
15530 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f  es_to_send;....o
15540 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f 75 74 62  utbuf += tmpoutb
15550 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 75 66 6c  uflen;...outbufl
15560 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 75 66 6c  en -= tmpoutbufl
15570 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20 2b 3d 20  en;...retval += 
15580 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 7d  tmpoutbuflen;..}
15590 0a 0a 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62  ...if (free_tmpb
155a0 75 66 29 20 7b 0a 09 09 69 66 20 28 74 6d 70 62  uf) {...if (tmpb
155b0 75 66 5f 73 29 20 7b 0a 09 09 09 66 72 65 65 28  uf_s) {....free(
155c0 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 7d 0a 09  tmpbuf_s);...}..
155d0 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20 6f 75 74  }...outbuf = out
155e0 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20  buf_s;.../* End 
155f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
15600 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
15610 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23  action(slot);..#
15620 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
15630 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
15640 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
15650 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e  .if (outbuflen >
15660 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
15670 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
15680 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62  BUG_PRINTF("Outb
15690 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61  uflen exceeds ma
156a0 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
156b0 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
156c0 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f  e. (max = %li, o
156d0 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22  utbuflen = %lu)"
156e0 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
156f0 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
15700 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75  gned long) outbu
15710 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  flen);....return
15720 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
15730 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 57 65  f.#endif.../* We
15740 20 6d 75 73 74 20 72 65 6d 6f 76 65 20 74 68 65   must remove the
15750 20 22 37 43 22 20 74 61 67 20 74 6f 20 67 65 74   "7C" tag to get
15760 20 74 6f 20 74 68 65 20 73 69 67 6e 61 74 75 72   to the signatur
15770 65 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64  e */..switch (id
15780 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  _type) {...case 
15790 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
157a0 49 56 3a 0a 09 09 09 6f 75 74 62 75 66 5f 6c 65  IV:....outbuf_le
157b0 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09 6f  n = retval;....o
157c0 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65 79  utbuf_p = cackey
157d0 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
157e0 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75 66  (outbuf, &outbuf
157f0 5f 6c 65 6e 2c 20 30 78 37 43 2c 20 4e 55 4c 4c  _len, 0x7C, NULL
15800 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29 3b  ,  &outbuf_len);
15810 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f 70  ....if (outbuf_p
15820 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
15830 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15840 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66 72  NTF("Response fr
15850 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45 52  om PIV for GENER
15860 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54 49  ATE AUTHENTICATI
15870 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78 37  ON was not a 0x7
15880 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67  C tag, returning
15890 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
158a0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
158b0 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20  ...}.....retval 
158c0 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09  = outbuf_len;...
158d0 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72  ..outbuf_len = r
158e0 65 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66  etval;....outbuf
158f0 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  _p = cackey_read
15900 5f 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62  _bertlv_tag(outb
15910 75 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c  uf, &outbuf_len,
15920 20 30 78 38 32 2c 20 4e 55 4c 4c 2c 20 20 26 6f   0x82, NULL,  &o
15930 75 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69  utbuf_len);....i
15940 66 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e  f (outbuf_p == N
15950 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
15960 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15970 52 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49  Response from PI
15980 56 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41  V for GENERATE A
15990 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61  UTHENTICATION wa
159a0 73 20 6e 6f 74 20 61 20 30 78 38 32 20 77 69 74  s not a 0x82 wit
159b0 68 69 6e 20 61 20 30 78 37 43 20 74 61 67 2c 20  hin a 0x7C tag, 
159c0 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
159d0 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74  lure");......ret
159e0 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09  urn(-1);....}...
159f0 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75  ..retval = outbu
15a00 66 5f 6c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b  f_len;.....break
15a10 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
15a20 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 63  ID_TYPE_CAC:...c
15a30 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
15a40 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
15a50 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20  .break;..}.../* 
15a60 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09  Unpad reply */..
15a70 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74 29  if (unpadOutput)
15a80 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c 20   {...if (retval 
15a90 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  < 3) {....CACKEY
15aa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15ab0 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c  eply is too smal
15ac0 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61 62  l, we are not ab
15ad0 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70  le to unpad -- p
15ae0 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20  assing back and 
15af0 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62  hoping for the b
15b00 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b  est!");.....CACK
15b10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15b20 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
15b30 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
15b40 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
15b50 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09  ong) retval);...
15b60 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
15b70 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75 74 62  ...}....if (outb
15b80 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29 20 7b  uf[0] != 0x00) {
15b90 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15ba0 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63 6f 67  _PRINTF("Unrecog
15bb0 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20 73 63  nized padding sc
15bc0 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e 67 20  heme -- passing 
15bd0 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20  back and hoping 
15be0 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b  for the best!");
15bf0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15c00 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
15c10 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
15c20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
15c30 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
15c40 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e  tval);....return
15c50 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
15c60 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74  .blocktype = out
15c70 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61 64 6f  buf[1];...unpado
15c80 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77  ffset = 0;....sw
15c90 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65 29  itch (blocktype)
15ca0 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30 3a   {....case 0x00:
15cb0 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
15cc0 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66 69  Scheme 1, the fi
15cd0 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  rst non-zero byt
15ce0 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  e is the start o
15cf0 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f  f data */.....fo
15d00 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  r (unpadoffset =
15d10 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20   2; unpadoffset 
15d20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f  < retval; unpado
15d30 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09  ffset++) {......
15d40 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
15d50 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30 29  offset] != 0x00)
15d60 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
15d70 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
15d80 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
15d90 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x01:...../* Pad
15da0 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20 70  ding Scheme 2, p
15db0 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78 46  ad bytes are 0xF
15dc0 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78  F followed by 0x
15dd0 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  00 */.....for (u
15de0 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
15df0 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
15e00 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
15e10 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
15e20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
15e30 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a 09  et] != 0xFF) {..
15e40 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
15e50 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20  unpadoffset] == 
15e60 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09 75  0x00) {........u
15e70 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09  npadoffset++;...
15e80 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
15e90 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
15ea0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15eb0 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
15ec0 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75  padding data fou
15ed0 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  nd, returning in
15ee0 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64   failure, should
15ef0 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30 20   have been 0x00 
15f00 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28  found 0x%02x", (
15f10 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75  unsigned int) ou
15f20 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
15f30 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74 75  ]);.........retu
15f40 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a  rn(-1);.......}.
15f50 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
15f60 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15f70 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
15f80 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f   padding data fo
15f90 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  und, returning i
15fa0 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c  n failure, shoul
15fb0 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46 46  d have been 0xFF
15fc0 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20   found 0x%02x", 
15fd0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f  (unsigned int) o
15fe0 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
15ff0 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74 75  t]);........retu
16000 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09  rn(-1);......}..
16010 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
16020 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
16030 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
16040 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65 73  eme 3, pad bytes
16050 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69   are non-zero fi
16060 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20 66 6f  rst zero byte fo
16070 75 6e 64 20 69 73 20 74 68 65 20 73 65 70 65 72  und is the seper
16080 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09 09 09  ator byte */....
16090 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
160a0 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73  t = 2; unpadoffs
160b0 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
160c0 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
160d0 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
160e0 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78  padoffset] == 0x
160f0 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e 70 61  00) {.......unpa
16100 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09  doffset++;......
16110 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
16120 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
16130 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 70 61  ...}....if (unpa
16140 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76 61 6c  doffset > retval
16150 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
16160 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73  BUG_PRINTF("Offs
16170 65 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  et greater than 
16180 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62 6f 72  reply size, abor
16190 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f 66 66  ting.  (unpadoff
161a0 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74 76 61  set = %lu, retva
161b0 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  l = %lu)", (unsi
161c0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70 61 64  gned long) unpad
161d0 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67 6e 65  offset, (unsigne
161e0 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b  d long) retval);
161f0 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
16200 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
16210 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
16220 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c  added:", outbuf,
16230 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74   retval);....ret
16240 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66 66 73  val -= unpadoffs
16250 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75  et;...memmove(ou
16260 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20 75  tbuf, outbuf + u
16270 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65 74 76  npadoffset, retv
16280 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  al);....CACKEY_D
16290 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55  EBUG_PRINTBUF("U
162a0 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75  npadded:", outbu
162b0 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  f, retval);..}..
162c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
162d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
162e0 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
162f0 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
16300 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
16310 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
16320 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  val);.}../*. * S
16330 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
16340 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
16350 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
16360 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
16370 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
16380 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
16390 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
163a0 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
163b0 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
163c0 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
163d0 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
163e0 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f  ckey_ret pcsc_co
163f0 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52  nnect_ret;..DWOR
16400 44 20 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30  D reader_len = 0
16410 2c 20 73 74 61 74 65 20 3d 20 30 2c 20 70 72 6f  , state = 0, pro
16420 74 6f 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c  tocol = 0, atr_l
16430 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41  en;..BYTE atr[MA
16440 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f  X_ATR_SIZE];..LO
16450 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73  NG status_ret, s
16460 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b  card_reconn_ret;
16470 0a 09 4c 50 53 54 52 20 2a 72 65 61 64 65 72 5f  ..LPSTR *reader_
16480 6e 61 6d 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  name;...CACKEY_D
16490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
164a0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c  led.");...if (sl
164b0 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a  ot->internal) {.
164c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
164d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
164e0 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 20 28   token present (
164f0 69 6e 74 65 72 6e 61 6c 20 74 6f 6b 65 6e 29 22  internal token)"
16500 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
16510 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
16520 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 70  PRESENT);..}...p
16530 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
16540 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
16550 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
16560 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
16570 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
16580 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
16590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
165a0 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
165b0 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
165c0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
165d0 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  nt");....return(
165e0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
165f0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a  KENABSENT);..}..
16600 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16610 49 4e 54 46 28 22 43 61 6c 6c 69 6e 67 20 53 43  INTF("Calling SC
16620 61 72 64 53 74 61 74 75 73 28 29 20 74 6f 20 64  ardStatus() to d
16630 65 74 65 72 6d 69 6e 65 20 63 61 72 64 20 73 74  etermine card st
16640 61 74 75 73 22 29 3b 0a 0a 09 61 74 72 5f 6c 65  atus");...atr_le
16650 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b  n = sizeof(atr);
16660 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53  ..status_ret = S
16670 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d  CardStatus(slot-
16680 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c  >pcsc_card, NULL
16690 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26  , &reader_len, &
166a0 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c  state, &protocol
166b0 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29  , atr, &atr_len)
166c0 3b 0a 20 0a 09 69 66 20 28 73 74 61 74 75 73 5f  ;. ..if (status_
166d0 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49  ret == SCARD_E_I
166e0 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46  NSUFFICIENT_BUFF
166f0 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ER) {...CACKEY_D
16700 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 63 61  EBUG_PRINTF("Sca
16710 72 64 53 74 61 74 75 73 28 29 20 72 65 74 75 72  rdStatus() retur
16720 6e 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 53 55  ned SCARD_E_INSU
16730 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 2c  FFICIENT_BUFFER,
16740 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69   assuming this i
16750 73 20 61 20 62 75 67 20 28 65 2e 67 2e 2c 20 47  s a bug (e.g., G
16760 6f 6f 67 6c 65 20 50 43 53 43 29 20 69 6d 70 6c  oogle PCSC) impl
16770 65 6d 65 6e 74 61 74 69 6f 6e 20 61 6e 64 20 72  ementation and r
16780 65 74 72 79 69 6e 67 22 29 3b 0a 0a 09 09 61 74  etrying");....at
16790 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61  r_len = sizeof(a
167a0 74 72 29 3b 0a 0a 09 09 72 65 61 64 65 72 5f 6c  tr);....reader_l
167b0 65 6e 20 3d 20 33 32 37 36 38 3b 0a 09 09 72 65  en = 32768;...re
167c0 61 64 65 72 5f 6e 61 6d 65 20 3d 20 6d 61 6c 6c  ader_name = mall
167d0 6f 63 28 72 65 61 64 65 72 5f 6c 65 6e 29 3b 0a  oc(reader_len);.
167e0 0a 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20  ...status_ret = 
167f0 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74  SCardStatus(slot
16800 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 72 65 61  ->pcsc_card, rea
16810 64 65 72 5f 6e 61 6d 65 2c 20 26 72 65 61 64 65  der_name, &reade
16820 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26  r_len, &state, &
16830 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26  protocol, atr, &
16840 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09 09 66 72 65  atr_len);....fre
16850 65 28 72 65 61 64 65 72 5f 6e 61 6d 65 29 3b 0a  e(reader_name);.
16860 09 7d 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f  .}...if (status_
16870 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49  ret == SCARD_E_I
16880 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b  NVALID_HANDLE) {
16890 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
168a0 50 52 49 4e 54 46 28 22 53 43 61 72 64 53 74 61  PRINTF("SCardSta
168b0 74 75 73 28 29 20 72 65 74 75 72 6e 65 64 20 53  tus() returned S
168c0 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48  CARD_E_INVALID_H
168d0 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 61  ANDLE, marking a
168e0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 63 6f  s not already co
168f0 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72 79 69  nnected and tryi
16900 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09 63 61  ng again");...ca
16910 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
16920 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70  eset(slot);....p
16930 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
16940 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
16950 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69  _card(slot);...i
16960 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
16970 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
16980 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
16990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
169a0 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  F("Unable to con
169b0 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65  nect to card, re
169c0 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
169d0 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65 74 75  sent");.....retu
169e0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
169f0 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
16a00 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
16a10 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69  UG_PRINTF("Calli
16a20 6e 67 20 53 43 61 72 64 53 74 61 74 75 73 28 29  ng SCardStatus()
16a30 20 61 67 61 69 6e 22 29 3b 0a 0a 09 09 61 74 72   again");....atr
16a40 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74  _len = sizeof(at
16a50 72 29 3b 0a 09 09 73 74 61 74 75 73 5f 72 65 74  r);...status_ret
16a60 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73   = SCardStatus(s
16a70 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
16a80 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65  NULL, &reader_le
16a90 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74  n, &state, &prot
16aa0 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f  ocol, atr, &atr_
16ab0 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  len);..}...if (s
16ac0 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41  tatus_ret != SCA
16ad0 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
16ae0 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
16af0 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
16b00 0a 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
16b10 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53  t == SCARD_W_RES
16b20 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ET_CARD) {....CA
16b30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16b40 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65  F("Reset require
16b50 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e  d, please hold..
16b60 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72  .");.....scard_r
16b70 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  econn_ret = cack
16b80 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
16b90 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52  d(slot, SCARD_PR
16ba0 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
16bb0 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29 3b 0a  D_PROTOCOL_T1);.
16bc0 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63  ...if (scard_rec
16bd0 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
16be0 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
16bf0 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73  ../* Re-establis
16c00 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  h transaction, i
16c10 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74  f it was present
16c20 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74   */.....if (slot
16c30 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
16c40 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09  pth > 0) {......
16c50 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
16c60 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09  n_depth--;......
16c70 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
16c80 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
16c90 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f   1;......cackey_
16ca0 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
16cb0 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a  n(slot);.....}..
16cc0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16cd0 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73  _PRINTF("Reset s
16ce0 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65  uccessful, reque
16cf0 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61  rying");.....sta
16d00 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53  tus_ret = SCardS
16d10 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63  tatus(slot->pcsc
16d20 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65  _card, NULL, &re
16d30 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65  ader_len, &state
16d40 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72  , &protocol, atr
16d50 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09  , &atr_len);....
16d60 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
16d70 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
16d80 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  SS) {......CACKE
16d90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16da0 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20  Still unable to 
16db0 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75  query card statu
16dc0 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  s, returning tok
16dd0 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72  en absent.  SCar
16de0 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c  dStatus() = %s",
16df0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
16e00 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
16e10 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b  TR(status_ret));
16e20 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41  .......return(CA
16e30 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
16e40 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a  NABSENT);.....}.
16e50 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
16e60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16e70 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72  NTF("Unable to r
16e80 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64  econnect to card
16e90 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
16ea0 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64  n absent.  SCard
16eb0 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73  Reconnect() = %s
16ec0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
16ed0 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
16ee0 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e  _STR(scard_recon
16ef0 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65  n_ret));......re
16f00 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
16f10 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
16f20 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
16f30 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16f40 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
16f50 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74  to query card st
16f60 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20  atus, returning 
16f70 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
16f80 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25  CardStatus() = %
16f90 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
16fa0 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
16fb0 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74  O_STR(status_ret
16fc0 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ));.....return(C
16fd0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
16fe0 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09  ENABSENT);...}..
16ff0 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20 26  }...if ((state &
17000 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d   SCARD_ABSENT) =
17010 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20  = SCARD_ABSENT) 
17020 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
17030 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73  _PRINTF("Card is
17040 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69   absent, returni
17050 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22  ng token absent"
17060 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
17070 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
17080 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41  ABSENT);..}...CA
17090 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
170a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b  F("Returning tok
170b0 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a  en present.");..
170c0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
170d0 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
170e0 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  NT);.}../*. * SY
170f0 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
17100 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
17110 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
17120 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
17130 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
17140 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
17150 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
17160 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
17170 79 5f 73 65 74 5f 70 69 6e 28 73 74 72 75 63 74  y_set_pin(struct
17180 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
17190 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
171a0 72 20 2a 6f 6c 64 5f 70 69 6e 2c 20 75 6e 73 69  r *old_pin, unsi
171b0 67 6e 65 64 20 6c 6f 6e 67 20 6f 6c 64 5f 70 69  gned long old_pi
171c0 6e 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20  n_len, unsigned 
171d0 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67  char *pin, unsig
171e0 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e  ned long pin_len
171f0 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
17200 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
17210 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   *pcsc_identitie
17220 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  s;..unsigned cha
17230 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b  r cac_pin[8] = {
17240 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
17250 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
17260 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b  FF, 0xFF, 0xFF};
17270 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
17280 6f 6c 64 5f 63 61 63 5f 70 69 6e 5b 38 5d 20 3d  old_cac_pin[8] =
17290 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78   {0xFF, 0xFF, 0x
172a0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
172b0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
172c0 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
172d0 72 20 70 69 6e 5f 75 70 64 61 74 65 5b 73 69 7a  r pin_update[siz
172e0 65 6f 66 28 63 61 63 5f 70 69 6e 29 20 2b 20 73  eof(cac_pin) + s
172f0 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69  izeof(old_cac_pi
17300 6e 29 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n)];..unsigned l
17310 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09  ong num_certs;..
17320 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73  uint16_t respons
17330 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69  e_code;..int tri
17340 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69  es_remaining;..i
17350 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e  nt send_ret;..in
17360 74 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20  t key_reference 
17370 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a 20 41 70 70  = 0x00;.../* App
17380 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e  arently, CAC PIN
17390 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20  s are *EXACTLY* 
173a0 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20  8 bytes long -- 
173b0 70 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66  pad with 0xFF if
173c0 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69   too short */..i
173d0 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29  f (pin_len >= 8)
173e0 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f   {...memcpy(cac_
173f0 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d  pin, pin, 8);..}
17400 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79   else {...memcpy
17410 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70  (cac_pin, pin, p
17420 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66  in_len);..}...if
17430 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 20 3e 3d   (old_pin_len >=
17440 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f   8) {...memcpy(o
17450 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f  ld_cac_pin, old_
17460 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65  pin, 8);..} else
17470 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 6c 64 5f   {...memcpy(old_
17480 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e  cac_pin, old_pin
17490 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 29 3b 0a  , old_pin_len);.
174a0 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 63 61 74 65 6e  .}.../* Concaten
174b0 61 74 65 20 62 6f 74 68 20 50 49 4e 73 20 74 6f  ate both PINs to
174c0 67 65 74 68 65 72 20 74 6f 20 73 65 6e 64 20 61  gether to send a
174d0 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 72  s a single instr
174e0 75 63 74 69 6f 6e 20 2a 2f 0a 09 6d 65 6d 63 70  uction */..memcp
174f0 79 28 70 69 6e 5f 75 70 64 61 74 65 2c 20 6f 6c  y(pin_update, ol
17500 64 5f 63 61 63 5f 70 69 6e 2c 20 73 69 7a 65 6f  d_cac_pin, sizeo
17510 66 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 29 3b  f(old_cac_pin));
17520 0a 09 6d 65 6d 63 70 79 28 70 69 6e 5f 75 70 64  ..memcpy(pin_upd
17530 61 74 65 20 2b 20 73 69 7a 65 6f 66 28 6f 6c 64  ate + sizeof(old
17540 5f 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70  _cac_pin), cac_p
17550 69 6e 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70  in, sizeof(cac_p
17560 69 6e 29 29 3b 0a 0a 09 2f 2a 20 52 65 6a 65 63  in));.../* Rejec
17570 74 20 50 49 4e 73 20 77 68 69 63 68 20 61 72 65  t PINs which are
17580 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69   too short */..i
17590 66 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20  f (pin_len < 5) 
175a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
175b0 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69  _PRINTF("Rejecti
175c0 6e 67 20 4e 65 77 20 50 49 4e 20 77 68 69 63 68  ng New PIN which
175d0 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 28 6c   is too short (l
175e0 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d 75 73  ength = %lu, mus
175f0 74 20 62 65 20 61 74 6c 65 61 73 74 20 35 29 22  t be atleast 5)"
17600 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72  , pin_len);....r
17610 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
17620 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a  C_E_BADPIN);..}.
17630 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65  ..if (old_pin_le
17640 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45  n < 5) {...CACKE
17650 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17660 52 65 6a 65 63 74 69 6e 67 20 4f 6c 64 20 50 49  Rejecting Old PI
17670 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73  N which is too s
17680 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d 20 25  hort (length = %
17690 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c 65  lu, must be atle
176a0 61 73 74 20 35 29 22 2c 20 6f 6c 64 5f 70 69 6e  ast 5)", old_pin
176b0 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
176c0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42  (CACKEY_PCSC_E_B
176d0 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ADPIN);..}.../* 
176e0 50 49 56 20 61 75 74 68 65 6e 74 69 63 61 74 69  PIV authenticati
176f0 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72  on uses a "key_r
17700 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38  eference" of 0x8
17710 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74  0 */..pcsc_ident
17720 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
17730 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20  ead_certs(slot, 
17740 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73  NULL, &num_certs
17750 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74  );..if (num_cert
17760 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64  s > 0 && pcsc_id
17770 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
17780 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63  ) {...switch (pc
17790 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d  sc_identities[0]
177a0 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63  .id_type) {....c
177b0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
177c0 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b  PE_PIV:.....CACK
177d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
177e0 22 57 65 20 68 61 76 65 20 50 49 56 20 63 61 72  "We have PIV car
177f0 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74  d, so we will at
17800 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74  tempt to authent
17810 69 63 61 74 65 20 75 73 69 6e 67 20 74 68 65 20  icate using the 
17820 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20  PIV Application 
17830 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b  key reference");
17840 0a 0a 09 09 09 09 6b 65 79 5f 72 65 66 65 72 65  ......key_refere
17850 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09 09 09 09  nce = 0x80;.....
17860 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c  break;....defaul
17870 74 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  t:.....break;...
17880 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65  }....cackey_free
17890 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e  _certs(pcsc_iden
178a0 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74  tities, num_cert
178b0 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49  s, 1);..}.../* I
178c0 73 73 75 65 20 61 20 53 65 74 20 50 49 4e 20 28  ssue a Set PIN (
178d0 43 48 41 4e 47 45 20 52 45 46 45 52 45 4e 43 45  CHANGE REFERENCE
178e0 29 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d  ) */..send_ret =
178f0 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
17900 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
17910 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
17920 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47 45 5f  IS_INSTR_CHANGE_
17930 52 45 46 45 52 45 4e 43 45 2c 20 30 78 30 30 2c  REFERENCE, 0x00,
17940 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20   key_reference, 
17950 73 69 7a 65 6f 66 28 70 69 6e 5f 75 70 64 61 74  sizeof(pin_updat
17960 65 29 2c 20 70 69 6e 5f 75 70 64 61 74 65 2c 20  e), pin_update, 
17970 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f  0x00, &response_
17980 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  code, NULL, NULL
17990 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
179a0 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
179b0 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28  _S_OK) {...if ((
179c0 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20  response_code & 
179d0 30 78 36 33 43 30 29 20 3d 3d 20 30 78 36 33 43  0x63C0) == 0x63C
179e0 30 29 20 7b 0a 09 09 09 74 72 69 65 73 5f 72 65  0) {....tries_re
179f0 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f  maining = (respo
17a00 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 46 29 3b  nse_code & 0xF);
17a10 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17a20 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
17a30 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65  rification faile
17a40 64 2c 20 25 69 20 74 72 69 65 73 20 72 65 6d 61  d, %i tries rema
17a50 69 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f 72 65  ining", tries_re
17a60 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 72 65  maining);.....re
17a70 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
17a80 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a  _E_BADPIN);...}.
17a90 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f  ...if (response_
17aa0 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20  code == 0x6983) 
17ab0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
17ac0 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
17ad0 20 74 6f 20 73 65 74 20 50 49 4e 2c 20 64 65 76   to set PIN, dev
17ae0 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 20 6f 72  ice is locked or
17af0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 50 49   changing the PI
17b00 4e 20 69 73 20 64 69 73 61 62 6c 65 64 22 29 3b  N is disabled");
17b10 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
17b20 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
17b30 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  );...}....return
17b40 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
17b50 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
17b60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17b70 46 28 22 50 49 4e 20 43 68 61 6e 67 65 20 73 75  F("PIN Change su
17b80 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74  cceeded");...ret
17b90 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
17ba0 53 5f 4f 4b 29 3b 0a 0a 09 2f 2a 20 44 69 73 61  S_OK);.../* Disa
17bb0 62 6c 65 20 61 20 77 61 72 6e 69 6e 67 2c 20 73  ble a warning, s
17bc0 69 6e 63 65 20 74 68 69 73 20 69 73 20 6f 6e 6c  ince this is onl
17bd0 79 20 75 73 65 64 20 69 6e 20 64 65 62 75 67 20  y used in debug 
17be0 6d 6f 64 65 20 2a 2f 0a 09 74 72 69 65 73 5f 72  mode */..tries_r
17bf0 65 6d 61 69 6e 69 6e 67 20 3d 20 74 72 69 65 73  emaining = tries
17c00 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 7d 0a 0a 2f  _remaining;.}../
17c10 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
17c20 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
17c30 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
17c40 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
17c50 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
17c60 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
17c70 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
17c80 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
17c90 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73  t cackey_login(s
17ca0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
17cb0 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
17cc0 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73  d char *pin, uns
17cd0 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c  igned long pin_l
17ce0 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72  en, int *tries_r
17cf0 65 6d 61 69 6e 69 6e 67 5f 70 2c 20 69 6e 74 20  emaining_p, int 
17d00 72 65 74 72 69 65 73 29 20 7b 0a 09 73 74 72 75  retries) {..stru
17d10 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
17d20 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
17d30 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
17d40 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e  ned char cac_pin
17d50 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46  [8] = {0xFF, 0xF
17d60 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
17d70 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
17d80 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65   0xFF};..unsigne
17d90 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
17da0 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
17db0 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20  onse_code;..int 
17dc0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b  tries_remaining;
17dd0 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
17de0 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65 6e  .int key_referen
17df0 63 65 20 3d 20 30 78 30 30 2c 20 68 61 76 65 5f  ce = 0x00, have_
17e00 70 69 76 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  piv = 0;..cackey
17e10 5f 72 65 74 20 63 6f 6e 6e 65 63 74 5f 72 65 74  _ret connect_ret
17e20 2c 20 74 6f 6b 65 6e 5f 72 65 74 3b 0a 0a 09 2f  , token_ret;.../
17e30 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
17e40 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61  we do not know a
17e50 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72  bout how many tr
17e60 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e  ies are remainin
17e70 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f  g */..if (tries_
17e80 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
17e90 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  .*tries_remainin
17ea0 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f  g_p = -1;..}.../
17eb0 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41  * Apparently, CA
17ec0 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43  C PINs are *EXAC
17ed0 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e  TLY* 8 bytes lon
17ee0 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78  g -- pad with 0x
17ef0 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20  FF if too short 
17f00 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20  */..if (pin_len 
17f10 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79  >= 8) {...memcpy
17f20 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38  (cac_pin, pin, 8
17f30 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d  );..} else {...m
17f40 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
17f50 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d  in, pin_len);..}
17f60 0a 0a 09 2f 2a 20 52 65 6a 65 63 74 20 50 49 4e  .../* Reject PIN
17f70 73 20 77 68 69 63 68 20 61 72 65 20 74 6f 6f 20  s which are too 
17f80 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69  short */..if (pi
17f90 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43  n_len < 5) {...C
17fa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17fb0 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20 50 49  TF("Rejecting PI
17fc0 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73  N which is too s
17fd0 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d 20 25  hort (length = %
17fe0 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c 65  lu, must be atle
17ff0 61 73 74 20 35 29 22 2c 20 70 69 6e 5f 6c 65 6e  ast 5)", pin_len
18000 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
18010 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
18020 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 49 56 20  N);..}.../* PIV 
18030 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 75  authentication u
18040 73 65 73 20 61 20 22 6b 65 79 5f 72 65 66 65 72  ses a "key_refer
18050 65 6e 63 65 22 20 6f 66 20 30 78 38 30 20 2a 2f  ence" of 0x80 */
18060 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  ..pcsc_identitie
18070 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
18080 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c  certs(slot, NULL
18090 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09  , &num_certs);..
180a0 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20  if (num_certs > 
180b0 30 20 26 26 20 70 63 73 63 5f 69 64 65 6e 74 69  0 && pcsc_identi
180c0 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
180d0 09 09 73 77 69 74 63 68 20 28 70 63 73 63 5f 69  ..switch (pcsc_i
180e0 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e 69 64 5f  dentities[0].id_
180f0 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
18100 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
18110 49 56 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  IV:.....CACKEY_D
18120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20  EBUG_PRINTF("We 
18130 68 61 76 65 20 50 49 56 20 63 61 72 64 2c 20 73  have PIV card, s
18140 6f 20 77 65 20 77 69 6c 6c 20 61 74 74 65 6d 70  o we will attemp
18150 74 20 74 6f 20 61 75 74 68 65 6e 74 69 63 61 74  t to authenticat
18160 65 20 75 73 69 6e 67 20 74 68 65 20 50 49 56 20  e using the PIV 
18170 41 70 70 6c 69 63 61 74 69 6f 6e 20 6b 65 79 20  Application key 
18180 72 65 66 65 72 65 6e 63 65 22 29 3b 0a 0a 09 09  reference");....
18190 09 09 68 61 76 65 5f 70 69 76 20 3d 20 31 3b 0a  ..have_piv = 1;.
181a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65  ....break;....de
181b0 66 61 75 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b  fault:.....break
181c0 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
181d0 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f  free_certs(pcsc_
181e0 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f  identities, num_
181f0 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09  certs, 1);..}...
18200 69 66 20 28 68 61 76 65 5f 70 69 76 20 3d 3d 20  if (have_piv == 
18210 31 29 20 7b 0a 09 09 6b 65 79 5f 72 65 66 65 72  1) {...key_refer
18220 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09 7d 0a  ence = 0x80;..}.
18230 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56  ../* Issue PIN V
18240 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72  erify */..send_r
18250 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
18260 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
18270 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
18280 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
18290 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72  IFY, 0x00, key_r
182a0 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66  eference, sizeof
182b0 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70  (cac_pin), cac_p
182c0 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f  in, 0x00, &respo
182d0 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20  nse_code, NULL, 
182e0 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e  NULL);...if (sen
182f0 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
18300 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69  PCSC_S_OK) {...i
18310 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  f ((response_cod
18320 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30  e & 0x63C0) == 0
18330 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65  x63C0) {....trie
18340 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72  s_remaining = (r
18350 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30  esponse_code & 0
18360 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  xF);.....CACKEY_
18370 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
18380 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
18390 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20  ailed, %i tries 
183a0 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65  remaining", trie
183b0 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09  s_remaining);...
183c0 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61  ..if (tries_rema
183d0 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a  ining_p) {.....*
183e0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
183f0 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  p = tries_remain
18400 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  ing;....}.....re
18410 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
18420 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a  _E_BADPIN);...}.
18430 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f  ...if (response_
18440 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20  code == 0x6983) 
18450 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
18460 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
18470 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65  rification faile
18480 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63  d, device is loc
18490 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ked");.....retur
184a0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
184b0 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09  LOCKED);...}....
184c0 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  if (response_cod
184d0 65 20 3d 3d 20 30 78 36 64 30 30 29 20 7b 0a 09  e == 0x6d00) {..
184e0 09 09 69 66 20 28 72 65 74 72 69 65 73 20 3e 20  ..if (retries > 
184f0 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
18500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 47 6f  DEBUG_PRINTF("Go
18510 74 20 49 53 4f 20 37 38 31 36 20 52 65 73 70 6f  t ISO 7816 Respo
18520 6e 73 65 20 5c 22 36 44 20 30 30 5c 22 20 69 6e  nse \"6D 00\" in
18530 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 56   response to a V
18540 45 52 49 46 59 20 72 65 71 75 65 73 74 2e 22 29  ERIFY request.")
18550 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
18560 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 64 69  UG_PRINTF("We di
18570 64 20 6e 6f 74 20 65 78 70 65 63 74 20 74 68 69  d not expect thi
18580 73 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  s because it is 
18590 6e 6f 74 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  not mentioned in
185a0 20 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33 2d   NIST SP 800-73-
185b0 33 20 50 61 72 74 20 32 20 53 65 63 74 69 6f 6e  3 Part 2 Section
185c0 20 33 2e 32 2e 31 20 6f 72 20 47 53 43 2d 49 53   3.2.1 or GSC-IS
185d0 20 76 32 2e 31 22 29 3b 0a 09 09 09 09 43 41 43   v2.1");.....CAC
185e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
185f0 28 22 57 65 20 61 72 65 20 67 6f 69 6e 67 20 74  ("We are going t
18600 6f 20 74 72 79 20 74 6f 20 72 65 73 65 74 20 74  o try to reset t
18610 68 65 20 63 61 72 64 20 61 6e 64 20 73 65 6c 65  he card and sele
18620 63 74 20 74 68 65 20 61 70 70 6c 65 74 20 61 67  ct the applet ag
18630 61 69 6e 2e 22 29 3b 0a 0a 09 09 09 09 69 66 20  ain.");......if 
18640 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 20 26  (num_certs > 0 &
18650 26 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  & pcsc_identitie
18660 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
18670 09 09 63 61 63 6b 65 79 5f 64 65 74 65 63 74 5f  ..cackey_detect_
18680 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f  and_select_root_
18690 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 70 63 73  applet(slot, pcs
186a0 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e  c_identities[0].
186b0 69 64 5f 74 79 70 65 29 3b 0a 09 09 09 09 7d 0a  id_type);.....}.
186c0 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  .....cackey_mark
186d0 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
186e0 29 3b 0a 0a 09 09 09 09 63 6f 6e 6e 65 63 74 5f  );......connect_
186f0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
18700 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
18710 0a 09 09 09 09 69 66 20 28 63 6f 6e 6e 65 63 74  .....if (connect
18720 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
18730 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09  CSC_S_OK) {.....
18740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18750 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
18760 72 65 63 6f 6e 6e 65 63 74 20 61 66 74 65 72 20  reconnect after 
18770 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 63 61  resetting the ca
18780 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  rd, returning in
18790 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 09   error.");......
187a0 09 72 65 74 75 72 6e 28 63 6f 6e 6e 65 63 74 5f  .return(connect_
187b0 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  ret);.....}.....
187c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
187d0 49 4e 54 46 28 22 56 65 72 69 66 79 69 6e 67 20  INTF("Verifying 
187e0 77 65 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20  we still have a 
187f0 74 6f 6b 65 6e 2e 22 29 3b 0a 09 09 09 09 74 6f  token.");.....to
18800 6b 65 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ken_ret = cackey
18810 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73  _token_present(s
18820 6c 6f 74 29 3b 0a 09 09 09 09 69 66 20 28 74 6f  lot);.....if (to
18830 6b 65 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ken_ret != CACKE
18840 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
18850 45 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 43 41  ESENT) {......CA
18860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18870 46 28 22 54 6f 6b 65 6e 20 6e 6f 74 20 70 72 65  F("Token not pre
18880 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 20  sent, returning 
18890 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09  in error.");....
188a0 09 09 09 72 65 74 75 72 6e 28 74 6f 6b 65 6e 5f  ...return(token_
188b0 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  ret);.....}.....
188c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
188d0 49 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f 20  INTF("Trying to 
188e0 6c 6f 67 69 6e 20 61 67 61 69 6e 22 29 3b 0a 09  login again");..
188f0 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79  ...return(cackey
18900 5f 6c 6f 67 69 6e 28 73 6c 6f 74 2c 20 70 69 6e  _login(slot, pin
18910 2c 20 70 69 6e 5f 6c 65 6e 2c 20 74 72 69 65 73  , pin_len, tries
18920 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c 20 72 65  _remaining_p, re
18930 74 72 69 65 73 20 2d 20 31 29 29 3b 0a 09 09 09  tries - 1));....
18940 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28  }...}....return(
18950 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
18960 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
18970 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18980 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
18990 6f 6e 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a  on succeeded");.
189a0 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
189b0 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
189c0 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
189d0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
189e0 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
189f0 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
18a00 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
18a10 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
18a20 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
18a30 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63  static ssize_t c
18a40 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
18a50 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72  ity_to_label(str
18a60 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
18a70 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
18a80 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ty, unsigned cha
18a90 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e  r *label_buf, un
18aa0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65  signed long labe
18ab0 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e  l_buf_len) {..un
18ac0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74  signed long cert
18ad0 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 76 6f  ificate_len;..vo
18ae0 69 64 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a  id *label_asn1;.
18af0 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63 61  .void *certifica
18b00 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72 65  te;..int x509_re
18b10 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69 66  ad_ret;...certif
18b20 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79  icate = identity
18b30 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  ->certificate;..
18b40 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
18b50 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
18b60 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69  ificate_len;...i
18b70 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
18b80 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  en < 0) {...retu
18b90 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30  rn(-1);..}...x50
18ba0 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
18bb0 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72  9_to_subject(cer
18bc0 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
18bd0 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64  icate_len, (void
18be0 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31   **) &label_asn1
18bf0 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61  );..if (x509_rea
18c00 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 72  d_ret < 0) {...r
18c10 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
18c20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
18c30 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e  x509_dn_to_strin
18c40 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35  g(label_asn1, x5
18c50 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68  09_read_ret, (ch
18c60 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c  ar *) label_buf,
18c70 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20   label_buf_len, 
18c80 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30 39  "CN");..if (x509
18c90 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  _read_ret <= 0) 
18ca0 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  {...x509_read_re
18cb0 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73  t = x509_dn_to_s
18cc0 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31  tring(label_asn1
18cd0 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c  , x509_read_ret,
18ce0 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f   (char *) label_
18cf0 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  buf, label_buf_l
18d00 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66  en, NULL);....if
18d10 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
18d20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72  <= 0) {....retur
18d30 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23  n(-1);...}..}..#
18d40 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
18d50 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
18d60 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
18d70 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
18d80 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  et > _POSIX_SSIZ
18d90 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
18da0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18db0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65 78  x509_read_ret ex
18dc0 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
18dd0 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
18de0 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
18df0 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61 64  = %li, x509_read
18e00 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c  _ret = %lu)", (l
18e10 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a  ong) _POSIX_SSIZ
18e20 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64  E_MAX, (unsigned
18e30 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61 64   long) x509_read
18e40 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
18e50 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
18e60 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72  f.#endif...retur
18e70 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29  n(x509_read_ret)
18e80 3b 0a 7d 0a 0a 2f 2a 20 44 79 6e 61 6d 69 63 61  ;.}../* Dynamica
18e90 6c 6c 79 20 6c 6f 61 64 20 70 74 68 72 65 61 64  lly load pthread
18ea0 73 20 66 72 6f 6d 20 74 68 65 20 72 75 6e 6e 69  s from the runni
18eb0 6e 67 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 2a  ng application *
18ec0 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f 43 41  /.#ifdef HAVE_CA
18ed0 43 4b 45 59 5f 4d 55 54 45 58 5f 50 54 48 52 45  CKEY_MUTEX_PTHRE
18ee0 41 44 5f 46 55 4e 43 53 0a 23 77 61 72 6e 69 6e  AD_FUNCS.#warnin
18ef0 67 20 62 75 69 6c 64 69 6e 67 20 77 69 74 68 20  g building with 
18f00 70 74 68 72 65 61 64 73 20 6f 70 65 6e 65 64 20  pthreads opened 
18f10 76 69 61 20 64 6c 73 79 6d 0a 73 74 72 75 63 74  via dlsym.struct
18f20 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 70 74   cackey_mutex_pt
18f30 68 72 65 61 64 5f 66 75 6e 63 73 5f 73 74 20 7b  hread_funcs_st {
18f40 0a 09 69 6e 74 20 28 2a 70 74 68 72 65 61 64 5f  ..int (*pthread_
18f50 6d 75 74 65 78 5f 69 6e 69 74 29 28 70 74 68 72  mutex_init)(pthr
18f60 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 72 65 73  ead_mutex_t *res
18f70 74 72 69 63 74 20 6d 75 74 65 78 2c 20 63 6f 6e  trict mutex, con
18f80 73 74 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  st pthread_mutex
18f90 61 74 74 72 5f 74 20 2a 72 65 73 74 72 69 63 74  attr_t *restrict
18fa0 20 61 74 74 72 29 3b 0a 09 69 6e 74 20 28 2a 70   attr);..int (*p
18fb0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
18fc0 6b 29 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78  k)(pthread_mutex
18fd0 5f 74 20 2a 6d 75 74 65 78 29 3b 0a 09 69 6e 74  _t *mutex);..int
18fe0 20 28 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78   (*pthread_mutex
18ff0 5f 75 6e 6c 6f 63 6b 29 28 70 74 68 72 65 61 64  _unlock)(pthread
19000 5f 6d 75 74 65 78 5f 74 20 2a 6d 75 74 65 78 29  _mutex_t *mutex)
19010 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 73 74 72  ;.};..static str
19020 75 63 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  uct cackey_mutex
19030 5f 70 74 68 72 65 61 64 5f 66 75 6e 63 73 5f 73  _pthread_funcs_s
19040 74 20 2a 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  t *cackey_mutex_
19050 70 74 68 72 65 61 64 5f 66 75 6e 63 73 28 76 6f  pthread_funcs(vo
19060 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 73 74  id) {..static st
19070 72 75 63 74 20 63 61 63 6b 65 79 5f 6d 75 74 65  ruct cackey_mute
19080 78 5f 70 74 68 72 65 61 64 5f 66 75 6e 63 73 5f  x_pthread_funcs_
19090 73 74 20 66 75 6e 63 73 20 3d 20 7b 30 7d 3b 0a  st funcs = {0};.
190a0 09 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74  .static int init
190b0 20 3d 20 30 3b 0a 0a 09 69 66 20 28 69 6e 69 74   = 0;...if (init
190c0 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72   != 0) {...retur
190d0 6e 28 26 66 75 6e 63 73 29 3b 0a 09 7d 0a 0a 09  n(&funcs);..}...
190e0 66 75 6e 63 73 2e 70 74 68 72 65 61 64 5f 6d 75  funcs.pthread_mu
190f0 74 65 78 5f 69 6e 69 74 20 3d 20 64 6c 73 79 6d  tex_init = dlsym
19100 28 52 54 4c 44 5f 44 45 46 41 55 4c 54 2c 20 22  (RTLD_DEFAULT, "
19110 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
19120 69 74 22 29 3b 0a 09 66 75 6e 63 73 2e 70 74 68  it");..funcs.pth
19130 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 20  read_mutex_lock 
19140 3d 20 64 6c 73 79 6d 28 52 54 4c 44 5f 44 45 46  = dlsym(RTLD_DEF
19150 41 55 4c 54 2c 20 22 70 74 68 72 65 61 64 5f 6d  AULT, "pthread_m
19160 75 74 65 78 5f 6c 6f 63 6b 22 29 3b 0a 09 66 75  utex_lock");..fu
19170 6e 63 73 2e 70 74 68 72 65 61 64 5f 6d 75 74 65  ncs.pthread_mute
19180 78 5f 75 6e 6c 6f 63 6b 20 3d 20 64 6c 73 79 6d  x_unlock = dlsym
19190 28 52 54 4c 44 5f 44 45 46 41 55 4c 54 2c 20 22  (RTLD_DEFAULT, "
191a0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
191b0 6c 6f 63 6b 22 29 3b 0a 0a 09 69 6e 69 74 20 3d  lock");...init =
191c0 20 31 3b 0a 0a 09 72 65 74 75 72 6e 28 26 66 75   1;...return(&fu
191d0 6e 63 73 29 3b 0a 7d 0a 23 64 65 66 69 6e 65 20  ncs);.}.#define 
191e0 63 61 63 6b 65 79 5f 70 74 68 72 65 61 64 5f 6d  cackey_pthread_m
191f0 75 74 65 78 5f 69 6e 69 74 20 63 61 63 6b 65 79  utex_init cackey
19200 5f 6d 75 74 65 78 5f 70 74 68 72 65 61 64 5f 66  _mutex_pthread_f
19210 75 6e 63 73 28 29 2d 3e 70 74 68 72 65 61 64 5f  uncs()->pthread_
19220 6d 75 74 65 78 5f 69 6e 69 74 0a 23 64 65 66 69  mutex_init.#defi
19230 6e 65 20 63 61 63 6b 65 79 5f 70 74 68 72 65 61  ne cackey_pthrea
19240 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 20 63 61 63  d_mutex_lock cac
19250 6b 65 79 5f 6d 75 74 65 78 5f 70 74 68 72 65 61  key_mutex_pthrea
19260 64 5f 66 75 6e 63 73 28 29 2d 3e 70 74 68 72 65  d_funcs()->pthre
19270 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 0a 23 64  ad_mutex_lock.#d
19280 65 66 69 6e 65 20 63 61 63 6b 65 79 5f 70 74 68  efine cackey_pth
19290 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
192a0 6b 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 70  k cackey_mutex_p
192b0 74 68 72 65 61 64 5f 66 75 6e 63 73 28 29 2d 3e  thread_funcs()->
192c0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
192d0 6c 6f 63 6b 0a 23 65 6c 73 65 0a 23 64 65 66 69  lock.#else.#defi
192e0 6e 65 20 63 61 63 6b 65 79 5f 70 74 68 72 65 61  ne cackey_pthrea
192f0 64 5f 6d 75 74 65 78 5f 69 6e 69 74 20 70 74 68  d_mutex_init pth
19300 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 0a  read_mutex_init.
19310 23 64 65 66 69 6e 65 20 63 61 63 6b 65 79 5f 70  #define cackey_p
19320 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
19330 6b 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  k pthread_mutex_
19340 6c 6f 63 6b 0a 23 64 65 66 69 6e 65 20 63 61 63  lock.#define cac
19350 6b 65 79 5f 70 74 68 72 65 61 64 5f 6d 75 74 65  key_pthread_mute
19360 78 5f 75 6e 6c 6f 63 6b 20 70 74 68 72 65 61 64  x_unlock pthread
19370 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 0a 23 65  _mutex_unlock.#e
19380 6e 64 69 66 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  ndif../* Returns
19390 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
193a0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
193b0 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28  ey_mutex_create(
193c0 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a  void **mutex) {.
193d0 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
193e0 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
193f0 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
19400 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
19410 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
19420 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19430 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
19440 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
19450 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
19460 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
19470 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
19480 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
19490 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  tex = malloc(siz
194a0 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74  eof(*pthread_mut
194b0 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68  ex));...if (!pth
194c0 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09  read_mutex) {...
194d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
194e0 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
194f0 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e  allocate memory.
19500 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  ");.....return(-
19510 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65  1);...}....pthre
19520 61 64 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ad_retval = cack
19530 65 79 5f 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ey_pthread_mutex
19540 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d 75  _init(pthread_mu
19550 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66  tex, NULL);...if
19560 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c   (pthread_retval
19570 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
19580 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19590 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69  "pthread_mutex_i
195a0 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64 20 65  nit() returned e
195b0 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
195c0 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
195d0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
195e0 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 74  }....*mutex = pt
195f0 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20  hread_mutex;..} 
19600 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
19610 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d  key_args.CreateM
19620 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f  utex) {....custo
19630 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  m_retval = cacke
19640 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
19650 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69  ex(mutex);.....i
19660 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  f (custom_retval
19670 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
19680 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19690 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72  RINTF("cackey_ar
196a0 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 29  gs.CreateMutex()
196b0 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
196c0 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20  (%li).", (long) 
196d0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a  custom_retval);.
196e0 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
196f0 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ....}...}..}...C
19700 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19710 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75  TF("Returning su
19720 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b  cessfully (0)");
19730 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
19740 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e  ./* Returns 0 on
19750 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74   success */.stat
19760 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75  ic int cackey_mu
19770 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d  tex_lock(void *m
19780 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64  utex) {..pthread
19790 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61  _mutex_t *pthrea
197a0 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74  d_mutex;..int pt
197b0 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43  hread_retval;..C
197c0 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76  K_RV custom_retv
197d0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
197e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
197f0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63  d.");...if ((cac
19800 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26  key_args.flags &
19810 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
19820 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  OK) == CKF_OS_LO
19830 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74  CKING_OK) {...pt
19840 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75  hread_mutex = mu
19850 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f  tex;....pthread_
19860 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
19870 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
19880 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ck(pthread_mutex
19890 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64  );...if (pthread
198a0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
198b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
198c0 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f  PRINTF("pthread_
198d0 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74  mutex_lock() ret
198e0 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29  urned error (%i)
198f0 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76  .", pthread_retv
19900 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  al);.....return(
19910 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  -1);...}..} else
19920 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
19930 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20  args.LockMutex) 
19940 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76  {....custom_retv
19950 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73  al = cackey_args
19960 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78  .LockMutex(mutex
19970 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f  );.....if (custo
19980 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f  m_retval != CKR_
19990 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
199a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
199b0 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
199c0 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20  utex() returned 
199d0 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28  error (%li).", (
199e0 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74  long) custom_ret
199f0 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  val);......retur
19a00 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  n(-1);....}...}.
19a10 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
19a20 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
19a30 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20  ing sucessfully 
19a40 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  (0)");...return(
19a50 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  0);.}../* Return
19a60 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a  s 0 on success *
19a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  /.static int cac
19a80 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
19a90 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a  (void *mutex) {.
19aa0 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
19ab0 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
19ac0 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
19ad0 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
19ae0 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
19af0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19b00 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
19b10 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
19b20 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
19b30 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
19b40 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
19b50 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
19b60 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09  tex = mutex;....
19b70 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d  pthread_retval =
19b80 20 63 61 63 6b 65 79 5f 70 74 68 72 65 61 64 5f   cackey_pthread_
19b90 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68  mutex_unlock(pth
19ba0 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69  read_mutex);...i
19bb0 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
19bc0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
19bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19be0 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
19bf0 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65  unlock() returne
19c00 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20  d error (%i).", 
19c10 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b  pthread_retval);
19c20 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
19c30 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
19c40 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73  .if (cackey_args
19c50 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a  .UnlockMutex) {.
19c60 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
19c70 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55   = cackey_args.U
19c80 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78  nlockMutex(mutex
19c90 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f  );.....if (custo
19ca0 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f  m_retval != CKR_
19cb0 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
19cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
19cd0 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
19ce0 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  kMutex() returne
19cf0 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
19d00 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
19d10 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
19d20 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
19d30 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
19d40 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
19d50 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
19d60 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
19d70 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(0);.}..static 
19d80 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
19d90 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
19da0 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54  ibutes(CK_OBJECT
19db0 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61  _CLASS objectcla
19dc0 73 73 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65  ss, struct cacke
19dd0 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
19de0 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67  *identity, unsig
19df0 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
19e00 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  y_num, CK_ULONG_
19e10 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
19e20 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c  .static CK_BBOOL
19e30 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73   ck_true = 1;..s
19e40 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63  tatic CK_BBOOL c
19e50 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74  k_false = 0;..st
19e60 61 74 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b  atic CK_TRUST ck
19e70 5f 74 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52  _trusted = CK_TR
19e80 55 53 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b  USTED_DELEGATOR;
19e90 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74  ..CK_ULONG numat
19ea0 74 72 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f  trs = 0, retval_
19eb0 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49  count;..CK_ATTRI
19ec0 42 55 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61  BUTE_TYPE curr_a
19ed0 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54  ttr_type;..CK_AT
19ee0 54 52 49 42 55 54 45 20 63 75 72 72 5f 61 74 74  TRIBUTE curr_att
19ef0 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  r, *retval;..CK_
19f00 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
19f10 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
19f20 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43  ueLen;..CK_OBJEC
19f30 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63  T_CLASS ck_objec
19f40 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52  t_class;..CK_CER
19f50 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b  TIFICATE_TYPE ck
19f60 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
19f70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20  e;..CK_KEY_TYPE 
19f80 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b  ck_key_type;..CK
19f90 5f 55 54 46 38 43 48 41 52 20 75 63 54 6d 70 42  _UTF8CHAR ucTmpB
19fa0 75 66 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43  uf[1024];..SHA1C
19fb0 6f 6e 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b  ontext sha1_ctx;
19fc0 0a 09 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74  ..MD5_CTX md5_ct
19fd0 78 3b 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31  x;..uint8_t sha1
19fe0 5f 68 61 73 68 5b 53 48 41 31 48 61 73 68 53 69  _hash[SHA1HashSi
19ff0 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64  ze];..uint8_t md
1a000 35 5f 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69  5_hash[MD5HashSi
1a010 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ze];..unsigned c
1a020 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65  har *certificate
1a030 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69  ;..ssize_t certi
1a040 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c  ficate_len = -1,
1a050 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
1a060 09 69 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65  .int pValue_free
1a070 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1a080 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20  _PRINTF("Called 
1a090 28 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25  (objectClass = %
1a0a0 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  lu, identity_num
1a0b0 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
1a0c0 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63  gned long) objec
1a0d0 74 63 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79  tclass, identity
1a0e0 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75  _num);...*pulCou
1a0f0 6e 74 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62  nt = 0;...if (ob
1a100 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
1a110 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20  _CERTIFICATE && 
1a120 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
1a130 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26  KO_PUBLIC_KEY &&
1a140 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
1a150 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
1a160 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
1a170 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
1a180 52 55 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  RUST) {...CACKEY
1a190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1a1a0 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
1a1b0 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c  ts (NULL), inval
1a1c0 69 64 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22  id object class"
1a1d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
1a1e0 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20  L);..}.../* Get 
1a1f0 43 65 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65  Cert */..if (ide
1a200 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ntity == NULL) {
1a210 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a220 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1a230 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
1a240 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e  L), invalid iden
1a250 74 69 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a  tiy provided");.
1a260 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
1a270 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74  ..}...certificat
1a280 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  e = identity->ce
1a290 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74  rtificate;..cert
1a2a0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64  ificate_len = id
1a2b0 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
1a2c0 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63  ate_len;...if (c
1a2d0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
1a2e0 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63  = -1 || certific
1a2f0 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate == NULL) {..
1a300 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a310 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1a320 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
1a330 2c 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20  , this identity 
1a340 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e  does not have an
1a350 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61   X.509 certifica
1a360 74 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  te associated wi
1a370 74 68 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e  th it and will n
1a380 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65  ot work");....re
1a390 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
1a3a0 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
1a3b0 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 41  certificate is A
1a3c0 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35  SN.1 encoded X.5
1a3d0 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  09 certificate *
1a3e0 2f 0a 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73  /..if (x509_to_s
1a3f0 65 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74  erial(certificat
1a400 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
1a410 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b  en, NULL) < 0) {
1a420 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a430 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1a440 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
1a450 4c 29 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65  L), the X.509 ce
1a460 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69  rtificate associ
1a470 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
1a480 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76  dentity is not v
1a490 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72  alid");....retur
1a4a0 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
1a4b0 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b  tval_count = 64;
1a4c0 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f  ..retval = mallo
1a4d0 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  c(retval_count *
1a4e0 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
1a4f0 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61  );...for (curr_a
1a500 74 74 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75  ttr_type = 0; cu
1a510 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30  rr_attr_type < 0
1a520 78 63 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f  xce5363bf; curr_
1a530 61 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09  attr_type++) {..
1a540 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74  .if (curr_attr_t
1a550 79 70 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a  ype == 0x800) {.
1a560 09 09 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70  ...curr_attr_typ
1a570 65 20 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a  e = 0xce536300;.
1a580 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72  ..}....pValue_fr
1a590 65 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65  ee = 0;...pValue
1a5a0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c   = NULL;...ulVal
1a5b0 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47  ueLen = (CK_LONG
1a5c0 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20  ) -1;....switch 
1a5d0 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29  (curr_attr_type)
1a5e0 20 7b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43   {....case CKA_C
1a5f0 4c 41 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59  LASS:.....CACKEY
1a600 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1a610 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1a620 75 74 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30  ute CKA_CLASS (0
1a630 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1a640 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1a650 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1a660 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c  ....ck_object_cl
1a670 61 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73  ass = objectclas
1a680 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  s;......pValue =
1a690 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73   &ck_object_clas
1a6a0 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  s;.....ulValueLe
1a6b0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62  n = sizeof(ck_ob
1a6c0 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09  ject_class);....
1a6d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a6e0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1a6f0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
1a700 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
1a710 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43  ong) *((CK_OBJEC
1a720 54 5f 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75  T_CLASS *) pValu
1a730 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1a740 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1a750 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1a760 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1a770 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b  _TOKEN:.....CACK
1a780 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a790 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1a7a0 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20  ibute CKA_TOKEN 
1a7b0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1a7c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a7d0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1a7e0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1a7f0 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
1a800 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1a810 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
1a820 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a830 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1a840 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
1a850 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1a860 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
1a870 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
1a880 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1a890 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1a8a0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1a8b0 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a  ase CKA_PRIVATE:
1a8c0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1a8d0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1a8e0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1a8f0 4b 41 5f 50 52 49 56 41 54 45 20 28 30 78 25 30  KA_PRIVATE (0x%0
1a900 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1a910 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1a920 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1a930 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1a940 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
1a950 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
1a960 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a970 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1a980 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1a990 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
1a9a0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
1a9b0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
1a9c0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
1a9d0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
1a9e0 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alse;.....ulValu
1a9f0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
1aa00 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41  _false);......CA
1aa10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1aa20 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1aa30 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
1aa40 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1aa50 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
1aa60 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
1aa70 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1aa80 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1aa90 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1aaa0 65 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09  e CKA_TRUSTED:..
1aab0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1aac0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1aad0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1aae0 5f 54 52 55 53 54 45 44 20 28 30 78 25 30 38 6c  _TRUSTED (0x%08l
1aaf0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
1ab00 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
1ab10 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
1ab20 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
1ab30 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
1ab40 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
1ab50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ab60 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1ab70 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1ab80 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
1ab90 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
1aba0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
1abb0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c  .....}......pVal
1abc0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
1abd0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1abe0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
1abf0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1ac00 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1ac10 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
1ac20 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
1ac30 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
1ac40 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
1ac50 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1ac60 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1ac70 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1ac80 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  ;....case CKA_MO
1ac90 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41  DIFIABLE:.....CA
1aca0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1acb0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1acc0 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49  tribute CKA_MODI
1acd0 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29  FIABLE (0x%08lx)
1ace0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1acf0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1ad00 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
1ad10 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
1ad20 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1ad30 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
1ad40 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
1ad50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1ad60 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
1ad70 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1ad80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1ad90 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
1ada0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1adb0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1adc0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1add0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1ade0 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b  _LABEL:.....CACK
1adf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ae00 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1ae10 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20  ibute CKA_LABEL 
1ae20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1ae30 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1ae40 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1ae50 0a 0a 09 09 09 09 69 66 20 28 69 64 65 6e 74 69  ......if (identi
1ae60 74 79 2d 3e 69 64 5f 74 79 70 65 20 3d 3d 20 43  ty->id_type == C
1ae70 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
1ae80 56 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  V) {......pValue
1ae90 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 61 72   = identity->car
1aea0 64 2e 70 69 76 2e 6c 61 62 65 6c 3b 0a 09 09 09  d.piv.label;....
1aeb0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1aec0 74 72 6c 65 6e 28 70 56 61 6c 75 65 29 3b 0a 09  trlen(pValue);..
1aed0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1aee0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e  .ulValueLen = sn
1aef0 70 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29 20  printf((char *) 
1af00 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66  ucTmpBuf, sizeof
1af10 28 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64 65  (ucTmpBuf), "Ide
1af20 6e 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75 6e  ntity #%lu", (un
1af30 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
1af40 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09  ntity_num);.....
1af50 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42  .pValue = ucTmpB
1af60 75 66 3b 0a 0a 09 09 09 09 09 69 66 20 28 75 6c  uf;.......if (ul
1af70 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65  ValueLen >= size
1af80 6f 66 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a  of(ucTmpBuf)) {.
1af90 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1afa0 20 3d 20 30 3b 0a 09 09 09 09 09 09 70 56 61 6c   = 0;.......pVal
1afb0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
1afc0 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
1afd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1afe0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1aff0 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
1b000 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1b010 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1b020 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1b030 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a  case CKA_VALUE:.
1b040 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b050 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
1b060 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1b070 41 5f 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78  A_VALUE (0x%08lx
1b080 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1b090 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1b0a0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77  r_type);......sw
1b0b0 69 74 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73  itch (objectclas
1b0c0 73 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43  s) {......case C
1b0d0 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a  KO_PRIVATE_KEY:.
1b0e0 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1b0f0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1b100 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1b110 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1b120 65 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e  e a private key.
1b130 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
1b140 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  ;......case CKO_
1b150 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 3a 0a  NETSCAPE_TRUST:.
1b160 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1b170 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1b180 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1b190 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1b1a0 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
1b1b0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
1b1c0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
1b1d0 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  case CKO_PUBLIC_
1b1e0 4b 45 59 3a 0a 09 09 09 09 09 09 69 66 20 28 63  KEY:.......if (c
1b1f0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
1b200 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09 78 35  = 0) {........x5
1b210 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
1b220 30 39 5f 74 6f 5f 70 75 62 6b 65 79 28 63 65 72  09_to_pubkey(cer
1b230 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
1b240 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
1b250 75 65 29 3b 0a 09 09 09 09 09 09 09 69 66 20 28  ue);........if (
1b260 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
1b270 30 29 20 7b 20 0a 09 09 09 09 09 09 09 09 70 56  0) { .........pV
1b280 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
1b290 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1b2a0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1b2b0 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
1b2c0 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09  ........}.......
1b2d0 7d 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  }........break;.
1b2e0 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45  .....case CKO_CE
1b2f0 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09  RTIFICATE:......
1b300 09 70 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66  .pValue = certif
1b310 69 63 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56  icate;.......ulV
1b320 61 6c 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66  alueLen = certif
1b330 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09  icate_len;......
1b340 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1b350 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b360 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1b370 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
1b380 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1b390 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1b3a0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1b3b0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53  ;....case CKA_IS
1b3c0 53 55 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59  SUER:.....CACKEY
1b3d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1b3e0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1b3f0 75 74 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28  ute CKA_ISSUER (
1b400 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1b410 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1b420 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1b430 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1b440 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
1b450 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63  IFICATE && objec
1b460 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45  tclass != CKO_NE
1b470 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1b480 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1b490 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1b4a0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1b4b0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1b4c0 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
1b4d0 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74  te or Netscape t
1b4e0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1b4f0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1b500 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
1b510 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
1b520 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
1b530 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
1b540 69 73 73 75 65 72 28 63 65 72 74 69 66 69 63 61  issuer(certifica
1b550 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
1b560 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
1b570 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
1b580 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
1b590 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
1b5a0 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
1b5b0 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1b5c0 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
1b5d0 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
1b5e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b5f0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1b600 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
1b610 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1b620 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1b630 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1b640 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45  ;....case CKA_SE
1b650 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09  RIAL_NUMBER:....
1b660 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b670 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1b680 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
1b690 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78  ERIAL_NUMBER (0x
1b6a0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1b6b0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1b6c0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1b6d0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1b6e0 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
1b6f0 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63  ICATE && objectc
1b700 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
1b710 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
1b720 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b730 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1b740 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1b750 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
1b760 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65  ot a certificate
1b770 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75   or Netscape tru
1b780 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
1b790 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
1b7a0 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
1b7b0 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
1b7c0 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
1b7d0 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65  ret = x509_to_se
1b7e0 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65  rial(certificate
1b7f0 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
1b800 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
1b810 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
1b820 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
1b830 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
1b840 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
1b850 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1b860 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
1b870 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
1b880 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b890 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1b8a0 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
1b8b0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1b8c0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1b8d0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1b8e0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55  ;....case CKA_SU
1b8f0 42 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45  BJECT:.....CACKE
1b900 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b910 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1b920 62 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54  bute CKA_SUBJECT
1b930 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1b940 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1b950 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1b960 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1b970 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
1b980 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09  RTIFICATE) {....
1b990 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b9a0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1b9b0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1b9c0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
1b9d0 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 22  t a certificate"
1b9e0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1b9f0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1ba00 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
1ba10 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
1ba20 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
1ba30 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74  _to_subject(cert
1ba40 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1ba50 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
1ba60 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
1ba70 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
1ba80 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
1ba90 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
1baa0 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
1bab0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
1bac0 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
1bad0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
1bae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1baf0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
1bb00 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
1bb10 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1bb20 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1bb30 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1bb40 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45  KA_ID:.....CACKE
1bb50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bb60 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1bb70 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25  bute CKA_ID (0x%
1bb80 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1bb90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1bba0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1bbb0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1bbc0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
1bbd0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1bbe0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bbf0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1bc00 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1bc10 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
1bc20 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1bc30 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
1bc40 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75  ak;.....}......u
1bc50 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28 69  cTmpBuf[0] = ((i
1bc60 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29  dentity_num + 1)
1bc70 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09   >> 8) & 0xff;..
1bc80 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d  ...ucTmpBuf[1] =
1bc90 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20    (identity_num 
1bca0 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a 09 09  + 1) & 0xff;....
1bcb0 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63 54 6d  ..pValue = &ucTm
1bcc0 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75  pBuf;.....ulValu
1bcd0 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43  eLen = 2;......C
1bce0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bcf0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1bd00 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
1bd10 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1bd20 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1bd30 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1bd40 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49  case CKA_CERTIFI
1bd50 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 09 43  CATE_TYPE:.....C
1bd60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bd70 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1bd80 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
1bd90 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 28 30  TIFICATE_TYPE (0
1bda0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1bdb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1bdc0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1bdd0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1bde0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
1bdf0 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
1be00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1be10 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1be20 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1be30 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
1be40 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b   certificate.");
1be50 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1be60 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f  ..}....../* We o
1be70 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20  nly support one 
1be80 63 65 72 74 69 66 69 63 61 74 65 20 74 79 70 65  certificate type
1be90 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74 69   */.....ck_certi
1bea0 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20 43 4b  ficate_type = CK
1beb0 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56  C_X_509;......pV
1bec0 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72 74 69  alue = &ck_certi
1bed0 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 09 09  ficate_type;....
1bee0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1bef0 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66 69 63  zeof(ck_certific
1bf00 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ate_type);......
1bf10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bf20 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1bf30 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20 28 25  ing CKC_X_509 (%
1bf40 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  lu) (%p/%lu)", (
1bf50 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
1bf60 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45  ((CK_CERTIFICATE
1bf70 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29  _TYPE *) pValue)
1bf80 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1bf90 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1bfa0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1bfb0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4b  k;....case CKA_K
1bfc0 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43  EY_TYPE:.....CAC
1bfd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bfe0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1bff0 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54  ribute CKA_KEY_T
1c000 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPE (0x%08lx) ..
1c010 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1c020 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1c030 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1c040 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
1c050 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20  _PRIVATE_KEY && 
1c060 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
1c070 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b  KO_PUBLIC_KEY) {
1c080 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1c090 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1c0a0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1c0b0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1c0c0 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a  e not a key.");.
1c0d0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1c0e0 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e  .}....../* We on
1c0f0 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b  ly support one k
1c100 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63  ey type */.....c
1c110 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b  k_key_type = CKK
1c120 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75  _RSA;......pValu
1c130 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65  e = &ck_key_type
1c140 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
1c150 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79   = sizeof(ck_key
1c160 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43  _type);......CAC
1c170 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c180 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1c190 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20 28   CKK_RSA (%lu) (
1c1a0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
1c1b0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
1c1c0 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
1c1d0 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
1c1e0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1c1f0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1c200 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1c210 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a  .case CKA_SIGN:.
1c220 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1c230 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
1c240 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1c250 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c 78 29  A_SIGN (0x%08lx)
1c260 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1c270 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1c280 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
1c290 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
1c2a0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
1c2b0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
1c2c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c2d0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
1c2e0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
1c2f0 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
1c300 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
1c310 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
1c320 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62  ...}......if (ob
1c330 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1c340 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a  _PRIVATE_KEY) {.
1c350 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
1c360 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56  k_true;......ulV
1c370 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1c380 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d  (ck_true);.....}
1c390 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61   else {......pVa
1c3a0 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
1c3b0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1c3c0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
1c3d0 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
1c3e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c3f0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1c400 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
1c410 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1c420 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
1c430 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
1c440 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1c450 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1c460 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1c470 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43  ase CKA_SIGN_REC
1c480 4f 56 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59  OVER:.....CACKEY
1c490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1c4a0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1c4b0 75 74 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43  ute CKA_SIGN_REC
1c4c0 4f 56 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e  OVER (0x%08lx) .
1c4d0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1c4e0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1c4f0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1c500 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1c510 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1c520 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1c530 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1c540 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1c550 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1c560 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
1c570 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
1c580 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1c590 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75  .}....../* We cu
1c5a0 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70  rrently only sup
1c5b0 70 6f 72 74 20 22 53 69 67 6e 20 77 69 74 68 20  port "Sign with 
1c5c0 41 70 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09  Appendix" */....
1c5d0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
1c5e0 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  lse;.....ulValue
1c5f0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1c600 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43  false);......CAC
1c610 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c620 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1c630 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1c640 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1c650 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
1c660 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1c670 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1c680 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1c690 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1c6a0 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09   CKA_DECRYPT:...
1c6b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c6c0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1c6d0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1c6e0 44 45 43 52 59 50 54 20 28 30 78 25 30 38 6c 78  DECRYPT (0x%08lx
1c6f0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1c700 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1c710 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1c720 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1c730 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1c740 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1c750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c760 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1c770 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1c780 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1c790 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1c7a0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1c7b0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f  ....}......if (o
1c7c0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1c7d0 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c  O_PRIVATE_KEY ||
1c7e0 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20   objectclass == 
1c7f0 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20  CKO_PUBLIC_KEY) 
1c800 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
1c810 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
1c820 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1c830 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09  of(ck_true);....
1c840 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
1c850 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
1c860 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
1c870 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
1c880 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  alse);.....}....
1c890 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c8a0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1c8b0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
1c8c0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
1c8d0 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
1c8e0 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
1c8f0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1c900 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1c910 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1c920 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54  .case CKA_SENSIT
1c930 49 56 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  IVE:.....CACKEY_
1c940 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1c950 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1c960 74 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45  te CKA_SENSITIVE
1c970 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1c980 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1c990 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1c9a0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1c9b0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
1c9c0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1c9d0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1c9e0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1c9f0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1ca00 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1ca10 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
1ca20 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
1ca30 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1ca40 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1ca50 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
1ca60 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  TE_KEY) {......p
1ca70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
1ca80 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
1ca90 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
1caa0 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
1cab0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
1cac0 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09  &ck_false;......
1cad0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1cae0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
1caf0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
1cb00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1cb10 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
1cb20 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
1cb30 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
1cb40 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
1cb50 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
1cb60 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1cb70 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1cb80 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1cb90 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09  A_EXTRACTABLE:..
1cba0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cbb0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1cbc0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1cbd0 5f 45 58 54 52 41 43 54 41 42 4c 45 20 28 30 78  _EXTRACTABLE (0x
1cbe0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1cbf0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1cc00 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1cc10 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1cc20 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
1cc30 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
1cc40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cc50 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
1cc60 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
1cc70 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
1cc80 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
1cc90 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
1cca0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1ccb0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1ccc0 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
1ccd0 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
1cce0 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
1ccf0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1cd00 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
1cd10 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
1cd20 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1cd30 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
1cd40 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1cd50 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
1cd60 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1cd70 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1cd80 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
1cd90 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
1cda0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
1cdb0 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
1cdc0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1cdd0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1cde0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1cdf0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  ;....case CKA_MO
1ce00 44 55 4c 55 53 3a 0a 09 09 09 09 43 41 43 4b 45  DULUS:.....CACKE
1ce10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ce20 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1ce30 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  bute CKA_MODULUS
1ce40 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1ce50 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1ce60 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1ce70 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1ce80 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
1ce90 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1cea0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1ceb0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1cec0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1ced0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1cee0 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
1cef0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
1cf00 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1cf10 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
1cf20 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
1cf30 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
1cf40 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64  et = x509_to_mod
1cf50 75 6c 75 73 28 63 65 72 74 69 66 69 63 61 74 65  ulus(certificate
1cf60 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
1cf70 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
1cf80 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
1cf90 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
1cfa0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
1cfb0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
1cfc0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1cfd0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
1cfe0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
1cff0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d000 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1d010 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
1d020 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1d030 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1d040 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1d050 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50 55  ;....case CKA_PU
1d060 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09  BLIC_EXPONENT:..
1d070 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d080 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1d090 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1d0a0 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
1d0b0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1d0c0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1d0d0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1d0e0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1d0f0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
1d100 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1d110 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1d120 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1d130 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1d140 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1d150 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
1d160 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
1d170 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1d180 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
1d190 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
1d1a0 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
1d1b0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70  et = x509_to_exp
1d1c0 6f 6e 65 6e 74 28 63 65 72 74 69 66 69 63 61 74  onent(certificat
1d1d0 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
1d1e0 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09  en, &pValue);...
1d1f0 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
1d200 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09  _ret < 0) {.....
1d210 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
1d220 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
1d230 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1d240 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
1d250 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
1d260 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d270 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1d280 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22  urning (%p/%lu)"
1d290 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1d2a0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1d2b0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1d2c0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
1d2d0 52 55 53 54 5f 44 49 47 49 54 41 4c 5f 53 49 47  RUST_DIGITAL_SIG
1d2e0 4e 41 54 55 52 45 3a 0a 09 09 09 63 61 73 65 20  NATURE:....case 
1d2f0 43 4b 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45  CKA_TRUST_NON_RE
1d300 50 55 44 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61  PUDIATION:....ca
1d310 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59  se CKA_TRUST_KEY
1d320 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09  _ENCIPHERMENT:..
1d330 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1d340 5f 44 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45  _DATA_ENCIPHERME
1d350 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  NT:....case CKA_
1d360 54 52 55 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d  TRUST_KEY_AGREEM
1d370 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ENT:....case CKA
1d380 5f 54 52 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f  _TRUST_KEY_CERT_
1d390 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b  SIGN:....case CK
1d3a0 41 5f 54 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e  A_TRUST_CRL_SIGN
1d3b0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1d3c0 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a  UST_SERVER_AUTH:
1d3d0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
1d3e0 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a  ST_CLIENT_AUTH:.
1d3f0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1d400 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a  T_CODE_SIGNING:.
1d410 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1d420 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49  T_EMAIL_PROTECTI
1d430 4f 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ON:.....CACKEY_D
1d440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1d450 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1d460 65 20 43 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20  e CKA_TRUST_... 
1d470 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1d480 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1d490 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1d4a0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1d4b0 63 6b 5f 74 72 75 73 74 65 64 3b 0a 09 09 09 09  ck_trusted;.....
1d4c0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1d4d0 65 6f 66 28 63 6b 5f 74 72 75 73 74 65 64 29 3b  eof(ck_trusted);
1d4e0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1d4f0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1d500 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
1d510 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
1d520 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54  ed long) *((CK_T
1d530 52 55 53 54 20 2a 29 20 70 56 61 6c 75 65 29 2c  RUST *) pValue),
1d540 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1d550 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1d560 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1d570 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45  ;....case CKA_CE
1d580 52 54 5f 53 48 41 31 5f 48 41 53 48 3a 0a 09 09  RT_SHA1_HASH:...
1d590 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d5a0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1d5b0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1d5c0 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48 20 28  CERT_SHA1_HASH (
1d5d0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1d5e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1d5f0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1d600 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1d610 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
1d620 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
1d630 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d640 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1d650 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1d660 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
1d670 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  ot a Netscape tr
1d680 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
1d690 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1d6a0 0a 0a 09 09 09 09 53 48 41 31 52 65 73 65 74 28  ......SHA1Reset(
1d6b0 26 73 68 61 31 5f 63 74 78 29 3b 0a 09 09 09 09  &sha1_ctx);.....
1d6c0 53 48 41 31 49 6e 70 75 74 28 26 73 68 61 31 5f  SHA1Input(&sha1_
1d6d0 63 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65  ctx, certificate
1d6e0 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
1d6f0 6e 29 3b 0a 09 09 09 09 53 48 41 31 52 65 73 75  n);.....SHA1Resu
1d700 6c 74 28 26 73 68 61 31 5f 63 74 78 2c 20 73 68  lt(&sha1_ctx, sh
1d710 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 70  a1_hash);......p
1d720 56 61 6c 75 65 20 3d 20 73 68 61 31 5f 68 61 73  Value = sha1_has
1d730 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  h;.....ulValueLe
1d740 6e 20 3d 20 73 69 7a 65 6f 66 28 73 68 61 31 5f  n = sizeof(sha1_
1d750 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b  hash);......CACK
1d760 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d770 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1d780 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
1d790 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1d7a0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1d7b0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1d7c0 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48  e CKA_CERT_MD5_H
1d7d0 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ASH:.....CACKEY_
1d7e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1d7f0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1d800 74 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f  te CKA_CERT_MD5_
1d810 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e  HASH (0x%08lx) .
1d820 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1d830 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1d840 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1d850 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
1d860 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1d870 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1d880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1d890 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1d8a0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1d8b0 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63   are not a Netsc
1d8c0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
1d8d0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
1d8e0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49  .....}......MD5I
1d8f0 6e 69 74 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09  nit(&md5_ctx);..
1d900 09 09 09 4d 44 35 55 70 64 61 74 65 28 26 6d 64  ...MD5Update(&md
1d910 35 5f 63 74 78 2c 20 63 65 72 74 69 66 69 63 61  5_ctx, certifica
1d920 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
1d930 6c 65 6e 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e  len);.....MD5Fin
1d940 61 6c 28 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64  al(md5_hash, &md
1d950 35 5f 63 74 78 29 3b 0a 0a 09 09 09 09 70 56 61  5_ctx);......pVa
1d960 6c 75 65 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a  lue = md5_hash;.
1d970 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1d980 20 73 69 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68   sizeof(md5_hash
1d990 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
1d9a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1d9b0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
1d9c0 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
1d9d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1d9e0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1d9f0 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74  reak;....default
1da00 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  :.....pValue = N
1da10 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ULL;.....ulValue
1da20 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
1da30 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  -1;.....break;..
1da40 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c  .}....if (((CK_L
1da50 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ONG) ulValueLen)
1da60 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d   != ((CK_LONG) -
1da70 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68  1)) {..../* Push
1da80 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20   curr_attr onto 
1da90 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09  the stack */....
1daa0 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d  curr_attr.type =
1dab0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b   curr_attr_type;
1dac0 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c  ....curr_attr.ul
1dad0 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c  ValueLen = ulVal
1dae0 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f  ueLen;.....curr_
1daf0 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61  attr.pValue = ma
1db00 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75  lloc(curr_attr.u
1db10 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d  lValueLen);....m
1db20 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e  emcpy(curr_attr.
1db30 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20  pValue, pValue, 
1db40 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
1db50 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70  eLen);.....if (p
1db60 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56  Value_free && pV
1db70 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65  alue) {.....free
1db80 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a  (pValue);....}..
1db90 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20  ...if (numattrs 
1dba0 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29  >= retval_count)
1dbb0 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20   {.....retval = 
1dbc0 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20  realloc(retval, 
1dbd0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
1dbe0 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
1dbf0 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79  ....}.....memcpy
1dc00 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72  (&retval[numattr
1dc10 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72 2c 20  s], &curr_attr, 
1dc20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74 74 72  sizeof(curr_attr
1dc30 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b  ));....numattrs+
1dc40 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  +;...}..}...if (
1dc50 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29 20 7b  numattrs != 0) {
1dc60 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  ...retval_count 
1dc70 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09 72 65  = numattrs;...re
1dc80 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72  tval = realloc(r
1dc90 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f  etval, retval_co
1dca0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
1dcb0 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20  tval));..} else 
1dcc0 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61 6c 29  {...free(retval)
1dcd0 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20 4e 55  ;....retval = NU
1dce0 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75  LL;..}...*pulCou
1dcf0 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a  nt = numattrs;..
1dd00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1dd10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1dd20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25 70 29  %lu objects (%p)
1dd30 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20 28 76  .", numattrs, (v
1dd40 6f 69 64 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a  oid *) retval);.
1dd50 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
1dd60 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1dd70 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65   cackey_free_ide
1dd80 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63  ntities(struct c
1dd90 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
1dda0 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69  identities, unsi
1ddb0 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69  gned long identi
1ddc0 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43  ties_count) {..C
1ddd0 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
1dde0 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65  r_attr;..unsigne
1ddf0 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61  d long id_idx, a
1de00 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69  ttr_idx;...if (i
1de10 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c  dentities == NUL
1de20 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69 65 73 5f  L || identities_
1de30 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  count == 0) {...
1de40 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72  return;..}...for
1de50 20 28 69 64 5f 69 64 78 20 3d 20 30 3b 20 69 64   (id_idx = 0; id
1de60 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65  _idx < identitie
1de70 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b  s_count; id_idx+
1de80 2b 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74  +) {...if (ident
1de90 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1dea0 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 66  tributes) {....f
1deb0 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30  or (attr_idx = 0
1dec0 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65  ; attr_idx < ide
1ded0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1dee0 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
1def0 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  ; attr_idx++) {.
1df00 09 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  ....curr_attr = 
1df10 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  &identities[id_i
1df20 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5b 61  dx].attributes[a
1df30 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69  ttr_idx];......i
1df40 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  f (curr_attr->pV
1df50 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65  alue) {......fre
1df60 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  e(curr_attr->pVa
1df70 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  lue);.....}....}
1df80 0a 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74  .....if (identit
1df90 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1dfa0 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66 72  ibutes) {.....fr
1dfb0 65 65 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ee(identities[id
1dfc0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1dfd0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  );....}.....cack
1dfe0 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 69 64  ey_free_certs(id
1dff0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1e000 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20  .pcsc_identity, 
1e010 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  1, 1);...}..}...
1e020 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 29  free(identities)
1e030 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69  ;.}..static unsi
1e040 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79  gned long cackey
1e050 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
1e060 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
1e070 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
1e080 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65  ntities, unsigne
1e090 64 20 6c 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63  d long num_dod_c
1e0a0 65 72 74 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65  erts) {..unsigne
1e0b0 64 20 6c 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c  d long cert_idx,
1e0c0 20 69 64 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69   id_idx = 0;...i
1e0d0 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d  f (identities ==
1e0e0 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
1e0f0 6e 28 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20  n(num_dod_certs 
1e100 2a 20 33 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  * 3);..}...for (
1e110 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65  cert_idx = 0; ce
1e120 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64  rt_idx < num_dod
1e130 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78  _certs; cert_idx
1e140 2b 2b 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 69  ++) {...identiti
1e150 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1e160 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  identity = NULL;
1e170 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
1e180 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1e190 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
1e1a0 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 43 45 52  tributes(CKO_CER
1e1b0 54 49 46 49 43 41 54 45 2c 20 26 65 78 74 72 61  TIFICATE, &extra
1e1c0 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d  _certs[cert_idx]
1e1d0 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f  , 0xf000 | cert_
1e1e0 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
1e1f0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1e200 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64  tes_count);...id
1e210 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74  _idx++;....ident
1e220 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1e230 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55  sc_identity = NU
1e240 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73  LL;...identities
1e250 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1e260 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74  tes = cackey_get
1e270 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f  _attributes(CKO_
1e280 50 55 42 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74  PUBLIC_KEY, &ext
1e290 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64  ra_certs[cert_id
1e2a0 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72  x], 0xf000 | cer
1e2b0 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69  t_idx, &identiti
1e2c0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1e2d0 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  butes_count);...
1e2e0 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65  id_idx++;....ide
1e2f0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1e300 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20  pcsc_identity = 
1e310 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69  NULL;...identiti
1e320 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1e330 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
1e340 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
1e350 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1e360 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63  , &extra_certs[c
1e370 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30  ert_idx], 0xf000
1e380 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64   | cert_idx, &id
1e390 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1e3a0 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
1e3b0 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  t);...id_idx++;.
1e3c0 09 7d 0a 0a 09 72 65 74 75 72 6e 28 69 64 5f 69  .}...return(id_i
1e3d0 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73  dx);.}..static s
1e3e0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
1e3f0 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65  ntity *cackey_re
1e400 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74  ad_identities(st
1e410 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
1e420 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
1e430 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64   long *ids_found
1e440 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
1e450 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
1e460 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   *pcsc_identitie
1e470 73 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  s;..struct cacke
1e480 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
1e490 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65  tities;..unsigne
1e4a0 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20  d long num_ids, 
1e4b0 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 69 64 5f  id_idx, curr_id_
1e4c0 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20  type;..unsigned 
1e4d0 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20  long num_certs, 
1e4e0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63  num_dod_certs, c
1e4f0 65 72 74 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e  ert_idx;..int in
1e500 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1e510 73 20 3d 20 30 2c 20 69 6e 63 6c 75 64 65 5f 64  s = 0, include_d
1e520 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b  od_certs;...CACK
1e530 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e540 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1e550 20 28 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e   (ids_found == N
1e560 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1e570 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e580 72 6f 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20  ror.  ids_found 
1e590 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
1e5a0 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
1e5b0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 43 41  #ifdef CACKEY_CA
1e5c0 52 44 5f 53 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f  RD_SLOT_INCLUDE_
1e5d0 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 6e 63  EXTRA_CERTS..inc
1e5e0 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1e5f0 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 09 69   = 1;.#endif...i
1e600 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1e610 59 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48  Y_DOD_CERTS_ON_H
1e620 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c  W_SLOTS") != NUL
1e630 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65  L) {...include_e
1e640 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a  xtra_certs = 1;.
1e650 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  .}...if (getenv(
1e660 22 43 41 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43  "CACKEY_NO_DOD_C
1e670 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53  ERTS_ON_HW_SLOTS
1e680 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1e690 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
1e6a0 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66  rts = 0;..}..#if
1e6b0 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f 5f 45 58  def CACKEY_NO_EX
1e6c0 54 52 41 5f 43 45 52 54 53 0a 09 69 66 20 28 67  TRA_CERTS..if (g
1e6d0 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 45 58  etenv("CACKEY_EX
1e6e0 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e  TRA_CERTS") != N
1e6f0 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65  ULL) {...include
1e700 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a  _dod_certs = 1;.
1e710 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c  .} else {...incl
1e720 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1e730 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09 69 66 20  0;..}.#else..if 
1e740 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1e750 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29  NO_EXTRA_CERTS")
1e760 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
1e770 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1e780 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 0;..} else {..
1e790 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72  .include_dod_cer
1e7a0 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64 69  ts = 1;..}.#endi
1e7b0 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75 64 65 5f  f...if (include_
1e7c0 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 6e  dod_certs) {...n
1e7d0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 73  um_dod_certs = s
1e7e0 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74  izeof(extra_cert
1e7f0 73 29 20 2f 20 73 69 7a 65 6f 66 28 65 78 74 72  s) / sizeof(extr
1e800 61 5f 63 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 20  a_certs[0]);..} 
1e810 65 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64  else {...num_dod
1e820 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a  _certs = 0;..}..
1e830 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72  .if (slot->inter
1e840 6e 61 6c 29 20 7b 0a 09 09 6e 75 6d 5f 69 64 73  nal) {...num_ids
1e850 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64   = cackey_read_d
1e860 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55  od_identities(NU
1e870 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  LL, num_dod_cert
1e880 73 29 3b 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69  s);....if (num_i
1e890 64 73 20 21 3d 20 30 29 20 7b 0a 09 09 09 69 64  ds != 0) {....id
1e8a0 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f  entities = mallo
1e8b0 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65  c(num_ids * size
1e8c0 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29  of(*identities))
1e8d0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61  ;.....cackey_rea
1e8e0 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73  d_dod_identities
1e8f0 28 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d  (identities, num
1e900 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d  _dod_certs);...}
1e910 20 65 6c 73 65 20 7b 0a 09 09 09 69 64 65 6e 74   else {....ident
1e920 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ities = NULL;...
1e930 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20  }....*ids_found 
1e940 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65  = num_ids;....re
1e950 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29  turn(identities)
1e960 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e  ;..}...pcsc_iden
1e970 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
1e980 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c  read_certs(slot,
1e990 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74   NULL, &num_cert
1e9a0 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64  s);..if (pcsc_id
1e9b0 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
1e9c0 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74  ) {.../* Convert
1e9d0 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73   number of Certs
1e9e0 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62   to number of ob
1e9f0 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69  jects */...num_i
1ea00 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54  ds = (CKO_PRIVAT
1ea10 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54  E_KEY - CKO_CERT
1ea20 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e  IFICATE + 1) * n
1ea30 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 66 20  um_certs;....if 
1ea40 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63  (include_extra_c
1ea50 65 72 74 73 29 20 7b 0a 09 09 09 6e 75 6d 5f 69  erts) {....num_i
1ea60 64 73 20 2b 3d 20 63 61 63 6b 65 79 5f 72 65 61  ds += cackey_rea
1ea70 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73  d_dod_identities
1ea80 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63  (NULL, num_dod_c
1ea90 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 69 64  erts);...}....id
1eaa0 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f  entities = mallo
1eab0 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65  c(num_ids * size
1eac0 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29  of(*identities))
1ead0 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63 65 72 74  ;..../* Add cert
1eae0 69 66 69 63 61 74 65 73 2c 20 70 75 62 6c 69 63  ificates, public
1eaf0 20 6b 65 79 73 2c 20 61 6e 64 20 70 72 69 76 61   keys, and priva
1eb00 74 65 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65  te keys from the
1eb10 20 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a 09 09   smartcard */...
1eb20 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f  id_idx = 0;...fo
1eb30 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b  r (cert_idx = 0;
1eb40 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f   cert_idx < num_
1eb50 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b  certs; cert_idx+
1eb60 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28 63 75 72  +) {....for (cur
1eb70 72 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f  r_id_type = CKO_
1eb80 43 45 52 54 49 46 49 43 41 54 45 3b 20 63 75 72  CERTIFICATE; cur
1eb90 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f  r_id_type <= CKO
1eba0 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b 20 63 75  _PRIVATE_KEY; cu
1ebb0 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a  rr_id_type++) {.
1ebc0 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
1ebd0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1ebe0 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  s = cackey_get_a
1ebf0 74 74 72 69 62 75 74 65 73 28 63 75 72 72 5f 69  ttributes(curr_i
1ec00 64 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69 64  d_type, &pcsc_id
1ec10 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
1ec20 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26 69  x], cert_idx, &i
1ec30 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1ec40 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
1ec50 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69  nt);......identi
1ec60 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1ec70 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c  c_identity = mal
1ec80 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e  loc(sizeof(*iden
1ec90 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1eca0 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a  csc_identity));.
1ecb0 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74  ....memcpy(ident
1ecc0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1ecd0 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63  sc_identity, &pc
1ece0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1ecf0 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28  rt_idx], sizeof(
1ed00 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  *identities[id_i
1ed10 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1ed20 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69  y));......identi
1ed30 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1ed40 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  c_identity->cert
1ed50 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63  ificate = malloc
1ed60 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
1ed70 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
1ed80 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
1ed90 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69  .memcpy(identiti
1eda0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1edb0 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
1edc0 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e  icate, pcsc_iden
1edd0 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d  tities[cert_idx]
1ede0 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63  .certificate, pc
1edf0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1ee00 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
1ee10 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69  ate_len);......i
1ee20 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09  d_idx++;....}...
1ee30 7d 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65  }....if (include
1ee40 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a  _extra_certs) {.
1ee50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ee60 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e  PRINTF("Includin
1ee70 67 20 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20  g US Government 
1ee80 43 65 72 74 69 66 69 63 61 74 65 73 20 6f 6e 20  Certificates on 
1ee90 68 61 72 64 77 61 72 65 20 73 6c 6f 74 22 29 3b  hardware slot");
1eea0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64  .....cackey_read
1eeb0 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28  _dod_identities(
1eec0 69 64 65 6e 74 69 74 69 65 73 20 2b 20 69 64 5f  identities + id_
1eed0 69 64 78 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  idx, num_dod_cer
1eee0 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ts);...}....cack
1eef0 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63  ey_free_certs(pc
1ef00 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  sc_identities, n
1ef10 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09  um_certs, 1);...
1ef20 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75  .*ids_found = nu
1ef30 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e  m_ids;....return
1ef40 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d  (identities);..}
1ef50 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20  ...*ids_found = 
1ef60 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  0;..return(NULL)
1ef70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 61 63 6b  ;.}..static cack
1ef80 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 67 65  ey_ret cackey_ge
1ef90 74 5f 70 69 6e 28 63 68 61 72 20 2a 70 69 6e 62  t_pin(char *pinb
1efa0 75 66 29 20 7b 0a 09 46 49 4c 45 20 2a 70 69 6e  uf) {..FILE *pin
1efb0 66 64 3b 0a 09 63 68 61 72 20 2a 66 67 65 74 73  fd;..char *fgets
1efc0 5f 72 65 74 3b 0a 09 69 6e 74 20 70 63 6c 6f 73  _ret;..int pclos
1efd0 65 5f 72 65 74 3b 0a 0a 09 69 66 20 28 63 61 63  e_ret;...if (cac
1efe0 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1eff0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
1f000 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
1f010 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
1f020 09 69 66 20 28 70 69 6e 62 75 66 20 3d 3d 20 4e  .if (pinbuf == N
1f030 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
1f040 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
1f050 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
1f060 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f070 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  ("CACKEY_PIN_COM
1f080 4d 41 4e 44 20 3d 20 25 73 22 2c 20 63 61 63 6b  MAND = %s", cack
1f090 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b  ey_pin_command);
1f0a0 0a 0a 09 70 69 6e 66 64 20 3d 20 70 6f 70 65 6e  ...pinfd = popen
1f0b0 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
1f0c0 61 6e 64 2c 20 22 72 22 29 3b 0a 09 69 66 20 28  and, "r");..if (
1f0d0 70 69 6e 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pinfd == NULL) {
1f0e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f0f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f100 25 73 3a 20 55 6e 61 62 6c 65 20 74 6f 20 72 75  %s: Unable to ru
1f110 6e 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63  n", cackey_pin_c
1f120 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 72 65 74 75  ommand);....retu
1f130 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
1f140 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 66  _BADPIN);..}...f
1f150 67 65 74 73 5f 72 65 74 20 3d 20 66 67 65 74 73  gets_ret = fgets
1f160 28 70 69 6e 62 75 66 2c 20 33 32 2c 20 70 69 6e  (pinbuf, 32, pin
1f170 66 64 29 3b 0a 09 69 66 20 28 66 67 65 74 73 5f  fd);..if (fgets_
1f180 72 65 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ret == NULL) {..
1f190 09 70 69 6e 62 75 66 5b 30 5d 20 3d 20 27 5c 30  .pinbuf[0] = '\0
1f1a0 27 3b 0a 09 7d 0a 0a 09 70 63 6c 6f 73 65 5f 72  ';..}...pclose_r
1f1b0 65 74 20 3d 20 70 63 6c 6f 73 65 28 70 69 6e 66  et = pclose(pinf
1f1c0 64 29 3b 0a 09 69 66 20 28 70 63 6c 6f 73 65 5f  d);..if (pclose_
1f1d0 72 65 74 20 3d 3d 20 2d 31 20 26 26 20 65 72 72  ret == -1 && err
1f1e0 6e 6f 20 3d 3d 20 45 43 48 49 4c 44 29 20 7b 0a  no == ECHILD) {.
1f1f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f200 52 49 4e 54 46 28 22 4e 6f 74 69 63 65 2e 20 20  RINTF("Notice.  
1f210 70 63 6c 6f 73 65 28 29 20 69 6e 64 69 63 61 74  pclose() indicat
1f220 65 64 20 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ed it could not 
1f230 67 65 74 20 74 68 65 20 73 74 61 74 75 73 20 6f  get the status o
1f240 66 20 74 68 65 20 63 68 69 6c 64 2c 20 61 73 73  f the child, ass
1f250 75 6d 69 6e 67 20 69 74 20 73 75 63 63 65 65 65  uming it succeee
1f260 64 65 64 20 21 22 29 3b 0a 0a 09 09 70 63 6c 6f  ded !");....pclo
1f270 73 65 5f 72 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a  se_ret = 0;..}..
1f280 09 69 66 20 28 70 63 6c 6f 73 65 5f 72 65 74 20  .if (pclose_ret 
1f290 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1f2a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f2b0 72 72 6f 72 2e 20 20 25 73 3a 20 65 78 69 74 65  rror.  %s: exite
1f2c0 64 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20  d with non-zero 
1f2d0 73 74 61 74 75 73 20 6f 66 20 25 69 22 2c 20 63  status of %i", c
1f2e0 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1f2f0 64 2c 20 70 63 6c 6f 73 65 5f 72 65 74 29 3b 0a  d, pclose_ret);.
1f300 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
1f310 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
1f320 0a 09 7d 0a 0a 09 69 66 20 28 73 74 72 6c 65 6e  ..}...if (strlen
1f330 28 70 69 6e 62 75 66 29 20 3c 20 31 29 20 7b 0a  (pinbuf) < 1) {.
1f340 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f350 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25  RINTF("Error.  %
1f360 73 3a 20 72 65 74 75 72 6e 65 64 20 6e 6f 20 64  s: returned no d
1f370 61 74 61 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e  ata", cackey_pin
1f380 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 72 65  _command);....re
1f390 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
1f3a0 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a  _E_BADPIN);..}..
1f3b0 09 69 66 20 28 70 69 6e 62 75 66 5b 73 74 72 6c  .if (pinbuf[strl
1f3c0 65 6e 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20  en(pinbuf) - 1] 
1f3d0 3d 3d 20 27 5c 6e 27 29 20 7b 0a 09 09 70 69 6e  == '\n') {...pin
1f3e0 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75  buf[strlen(pinbu
1f3f0 66 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a  f) - 1] = '\0';.
1f400 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  .}...return(CACK
1f410 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
1f420 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1f430 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e  TION(CK_RV, C_In
1f440 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  itialize)(CK_VOI
1f450 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73 29  D_PTR pInitArgs)
1f460 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c   {..CK_C_INITIAL
1f470 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20  IZE_ARGS CK_PTR 
1f480 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20  args;..uint32_t 
1f490 69 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f  idx, highest_slo
1f4a0 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e  t;..int mutex_in
1f4b0 69 74 5f 72 65 74 3b 0a 09 69 6e 74 20 69 6e 63  it_ret;..int inc
1f4c0 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a  lude_dod_certs;.
1f4d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f4e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1f4f0 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69  ;...if (cackey_i
1f500 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1f510 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f520 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72  NTF("Error.  Alr
1f530 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64  eady initialized
1f540 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f550 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45  KR_CRYPTOKI_ALRE
1f560 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  ADY_INITIALIZED)
1f570 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74  ;..}...if (pInit
1f580 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Args != NULL) {.
1f590 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72  ..args = pInitAr
1f5a0 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61  gs;...memcpy(&ca
1f5b0 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c  ckey_args, args,
1f5c0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61   sizeof(cackey_a
1f5d0 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72  rgs));....if (ar
1f5e0 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20  gs->CreateMutex 
1f5f0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  == NULL || args-
1f600 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d  >DestroyMutex ==
1f610 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c   NULL || args->L
1f620 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ockMutex == NULL
1f630 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b   || args->Unlock
1f640 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Mutex == NULL) {
1f650 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72  ....if (args->Cr
1f660 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c  eateMutex != NUL
1f670 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72  L || args->Destr
1f680 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20  oyMutex != NULL 
1f690 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74  || args->LockMut
1f6a0 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex != NULL || ar
1f6b0 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  gs->UnlockMutex 
1f6c0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43  != NULL) {.....C
1f6d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f6e0 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c  TF("Error. Some,
1f6f0 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72   but not All thr
1f700 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65  eading primitive
1f710 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a  s provided.");..
1f720 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1f730 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1f740 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 23  ..}...} else {.#
1f750 69 66 64 65 66 20 48 41 56 45 5f 43 41 43 4b 45  ifdef HAVE_CACKE
1f760 59 5f 4d 55 54 45 58 5f 50 54 48 52 45 41 44 5f  Y_MUTEX_PTHREAD_
1f770 46 55 4e 43 53 0a 09 09 09 69 66 20 28 63 61 63  FUNCS....if (cac
1f780 6b 65 79 5f 6d 75 74 65 78 5f 70 74 68 72 65 61  key_mutex_pthrea
1f790 64 5f 66 75 6e 63 73 28 29 2d 3e 70 74 68 72 65  d_funcs()->pthre
1f7a0 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 20 3d 3d  ad_mutex_init ==
1f7b0 20 4e 55 4c 4c 20 7c 7c 20 63 61 63 6b 65 79 5f   NULL || cackey_
1f7c0 6d 75 74 65 78 5f 70 74 68 72 65 61 64 5f 66 75  mutex_pthread_fu
1f7d0 6e 63 73 28 29 2d 3e 70 74 68 72 65 61 64 5f 6d  ncs()->pthread_m
1f7e0 75 74 65 78 5f 6c 6f 63 6b 20 3d 3d 20 4e 55 4c  utex_lock == NUL
1f7f0 4c 20 7c 7c 20 63 61 63 6b 65 79 5f 6d 75 74 65  L || cackey_mute
1f800 78 5f 70 74 68 72 65 61 64 5f 66 75 6e 63 73 28  x_pthread_funcs(
1f810 29 2d 3e 70 74 68 72 65 61 64 5f 6d 75 74 65 78  )->pthread_mutex
1f820 5f 75 6e 6c 6f 63 6b 20 3d 3d 20 4e 55 4c 4c 29  _unlock == NULL)
1f830 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
1f840 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f850 72 2e 20 4c 69 62 72 61 72 79 20 69 73 20 6e 6f  r. Library is no
1f860 74 20 6c 69 6e 6b 65 64 20 74 6f 20 70 74 68 72  t linked to pthr
1f870 65 61 64 73 20 61 6e 64 20 77 65 20 61 72 65 20  eads and we are 
1f880 75 6e 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  unable to find t
1f890 68 65 6d 20 61 74 20 72 75 6e 74 69 6d 65 2e 22  hem at runtime."
1f8a0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
1f8b0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1f8c0 29 3b 0a 09 09 09 7d 0a 23 65 6e 64 69 66 0a 09  );....}.#endif..
1f8d0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63  .}..} else {...c
1f8e0 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74  ackey_args.Creat
1f8f0 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  eMutex = NULL;..
1f900 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73  .cackey_args.Des
1f910 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  troyMutex = NULL
1f920 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  ;...cackey_args.
1f930 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  LockMutex = NULL
1f940 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  ;...cackey_args.
1f950 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55  UnlockMutex = NU
1f960 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
1f970 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a  s.flags = 0;..}.
1f980 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
1f990 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
1f9a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1f9b0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1f9c0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
1f9d0 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  x++) {...cackey_
1f9e0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
1f9f0 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66  tive = 0;..}...f
1fa00 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1fa10 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1fa20 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1fa30 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1fa40 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
1fa50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1fa60 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09  ].active = 0;...
1fa70 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1fa80 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
1fa90 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73  NULL;...cackey_s
1faa0 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
1fab0 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
1fac0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1fad0 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  idx].transaction
1fae0 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
1faf0 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1fb00 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65  s[idx].slot_rese
1fb10 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  t = 0;...cackey_
1fb20 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e  slots[idx].token
1fb30 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 63 61  _flags = 0;...ca
1fb40 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1fb50 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
1fb60 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1fb70 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a  ].internal = 0;.
1fb80 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1fb90 64 78 5d 2e 69 64 5f 74 79 70 65 5f 68 69 6e 74  dx].id_type_hint
1fba0 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50   = CACKEY_ID_TYP
1fbb0 45 5f 55 4e 4b 4e 4f 57 4e 3b 0a 09 7d 0a 0a 23  E_UNKNOWN;..}..#
1fbc0 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f 5f  ifdef CACKEY_NO_
1fbd0 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 66 20  EXTRA_CERTS..if 
1fbe0 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1fbf0 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d  EXTRA_CERTS") !=
1fc00 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75   NULL) {...inclu
1fc10 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31  de_dod_certs = 1
1fc20 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e  ;..} else {...in
1fc30 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1fc40 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09 69  = 0;..}.#else..i
1fc50 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1fc60 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
1fc70 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1fc80 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1fc90 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b  s = 0;..} else {
1fca0 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1fcb0 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e  erts = 1;..}.#en
1fcc0 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75 64  dif...if (includ
1fcd0 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 3d 20 30  e_dod_certs == 0
1fce0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1fcf0 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64  UG_PRINTF("Asked
1fd00 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65 20   not to include 
1fd10 44 6f 44 20 63 65 72 74 69 66 69 63 61 74 65 73  DoD certificates
1fd20 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ");..} else {...
1fd30 68 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d 20 28  highest_slot = (
1fd40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1fd50 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1fd60 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 20  ckey_slots[0])) 
1fd70 2d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  - 1;....CACKEY_D
1fd80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63  EBUG_PRINTF("Inc
1fd90 6c 75 64 69 6e 67 20 44 6f 44 20 63 65 72 74 73  luding DoD certs
1fda0 20 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28   in slot %lu", (
1fdb0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
1fdc0 69 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09  ighest_slot);...
1fdd0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1fde0 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63 74 69  ghest_slot].acti
1fdf0 76 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79  ve = 1;...cackey
1fe00 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1fe10 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20  lot].internal = 
1fe20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  1;...cackey_slot
1fe30 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e  s[highest_slot].
1fe40 6c 61 62 65 6c 20 3d 20 28 75 6e 73 69 67 6e 65  label = (unsigne
1fe50 64 20 63 68 61 72 20 2a 29 20 22 55 53 20 47 6f  d char *) "US Go
1fe60 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69  vernment Certifi
1fe70 63 61 74 65 73 22 3b 0a 09 09 63 61 63 6b 65 79  cates";...cackey
1fe80 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1fe90 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
1fea0 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09 09 63   = "CACKey";...c
1feb0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1fec0 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f  est_slot].token_
1fed0 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09  flags = 0;..}...
1fee0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1fef0 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63  ed = 1;...if (!c
1ff00 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e  ackey_biglock_in
1ff10 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e  it) {...mutex_in
1ff20 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  it_ret = cackey_
1ff30 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26 63 61  mutex_create(&ca
1ff40 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1ff50 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74  ..if (mutex_init
1ff60 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ret != 0) {....
1ff70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ff80 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 75 74  NTF("Error.  Mut
1ff90 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
1ffa0 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  n failed.");....
1ffb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54  .return(CKR_CANT
1ffc0 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63  _LOCK);...}....c
1ffd0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e  ackey_biglock_in
1ffe0 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 20  it = 1;..}.../* 
1fff0 44 65 66 69 6e 65 20 61 20 63 6f 6d 6d 61 6e 64  Define a command
20000 20 74 6f 20 70 72 6f 6d 70 74 20 75 73 65 72 20   to prompt user 
20010 66 6f 72 20 61 20 50 49 4e 20 2a 2f 0a 23 69 66  for a PIN */.#if
20020 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43  def CACKEY_PIN_C
20030 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 0a 09  OMMAND_DEFAULT..
20040 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
20050 6e 64 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b  nd = strdup(CACK
20060 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54  EY_MACRO_DEFAULT
20070 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 50 49 4e  _XSTR(CACKEY_PIN
20080 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54  _COMMAND_DEFAULT
20090 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ));.#endif..#ifd
200a0 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  ef CACKEY_PIN_CO
200b0 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41  MMAND_XONLY_DEFA
200c0 55 4c 54 0a 09 69 66 20 28 67 65 74 65 6e 76 28  ULT..if (getenv(
200d0 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20 4e 55  "DISPLAY") != NU
200e0 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70  LL) {...cackey_p
200f0 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72  in_command = str
20100 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f  dup(CACKEY_MACRO
20110 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41  _DEFAULT_XSTR(CA
20120 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
20130 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 29 29  _XONLY_DEFAULT))
20140 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66  ;..}.#endif...if
20150 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
20160 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20 21  _PIN_COMMAND") !
20170 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
20180 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
20190 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28 22   strdup(getenv("
201a0 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
201b0 4e 44 22 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ND"));..}...if (
201c0 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50  getenv("CACKEY_P
201d0 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59  IN_COMMAND_XONLY
201e0 22 29 20 21 3d 20 4e 55 4c 4c 20 26 26 20 67 65  ") != NULL && ge
201f0 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22 29 20  tenv("DISPLAY") 
20200 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  != NULL) {...cac
20210 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
20220 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28  = strdup(getenv(
20230 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d  "CACKEY_PIN_COMM
20240 41 4e 44 5f 58 4f 4e 4c 59 22 29 29 3b 0a 09 7d  AND_XONLY"));..}
20250 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
20260 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f  READERS_INCLUDE_
20270 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09 63 61  ONLY_DEFAULT..ca
20280 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
20290 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72 64  lude_only = strd
202a0 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  up(CACKEY_MACRO_
202b0 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43  DEFAULT_XSTR(CAC
202c0 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c  KEY_READERS_INCL
202d0 55 44 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c 54  UDE_ONLY_DEFAULT
202e0 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ));.#endif..#ifd
202f0 65 66 20 43 41 43 4b 45 59 5f 52 45 41 44 45 52  ef CACKEY_READER
20300 53 5f 45 58 43 4c 55 44 45 5f 44 45 46 41 55 4c  S_EXCLUDE_DEFAUL
20310 54 0a 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72  T..cackey_reader
20320 73 5f 65 78 63 6c 75 64 65 20 3d 20 73 74 72 64  s_exclude = strd
20330 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  up(CACKEY_MACRO_
20340 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43  DEFAULT_XSTR(CAC
20350 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c  KEY_READERS_EXCL
20360 55 44 45 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23  UDE_DEFAULT));.#
20370 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65  endif...if (gete
20380 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45  nv("CACKEY_READE
20390 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22  RS_INCLUDE_ONLY"
203a0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  ) != NULL) {...c
203b0 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e  ackey_readers_in
203c0 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72  clude_only = str
203d0 64 75 70 28 67 65 74 65 6e 76 28 22 43 41 43 4b  dup(getenv("CACK
203e0 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55  EY_READERS_INCLU
203f0 44 45 5f 4f 4e 4c 59 22 29 29 3b 0a 0a 09 09 69  DE_ONLY"));....i
20400 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72  f (cackey_reader
20410 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 5b 30  s_include_only[0
20420 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09  ] == '\0') {....
20430 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64  free(cackey_read
20440 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
20450 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65  );.....cackey_re
20460 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
20470 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ly = NULL;...}..
20480 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  }...if (getenv("
20490 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45  CACKEY_READERS_E
204a0 58 43 4c 55 44 45 22 29 20 21 3d 20 4e 55 4c 4c  XCLUDE") != NULL
204b0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 72 65 61  ) {...cackey_rea
204c0 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 73  ders_exclude = s
204d0 74 72 64 75 70 28 67 65 74 65 6e 76 28 22 43 41  trdup(getenv("CA
204e0 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43  CKEY_READERS_EXC
204f0 4c 55 44 45 22 29 29 3b 0a 0a 09 09 69 66 20 28  LUDE"));....if (
20500 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65  cackey_readers_e
20510 78 63 6c 75 64 65 5b 30 5d 20 3d 3d 20 27 5c 30  xclude[0] == '\0
20520 27 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  ') {....free(cac
20530 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
20540 75 64 65 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  ude);.....cackey
20550 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65  _readers_exclude
20560 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a   = NULL;...}..}.
20570 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20580 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
20590 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
205a0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
205b0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
205c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
205d0 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a  CK_RV, C_Finaliz
205e0 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
205f0 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e  Reserved) {..uin
20600 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43  t32_t idx;...CAC
20610 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20620 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
20630 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20  f (pReserved != 
20640 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
20650 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20660 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20  rror. pReserved 
20670 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
20680 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
20690 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
206a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
206b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
206c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
206d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
206e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
206f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20700 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20710 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66  IALIZED);..}...f
20720 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
20730 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
20740 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
20750 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
20760 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
20770 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
20780 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
20790 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c  ctive) {....C_Cl
207a0 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b  oseSession(idx);
207b0 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
207c0 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
207d0 74 5f 61 6c 6c 28 31 29 3b 0a 0a 09 66 6f 72 20  t_all(1);...for 
207e0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
207f0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
20800 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
20810 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
20820 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
20830 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
20840 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  x].internal) {..
20850 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
20860 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
20870 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
20880 63 65 72 74 73 29 20 7b 0a 09 09 09 63 61 63 6b  certs) {....cack
20890 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 63 61  ey_free_certs(ca
208a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
208b0 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 63 61  cached_certs, ca
208c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
208d0 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
208e0 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63 61 63 6b  nt, 1);.....cack
208f0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61  ey_slots[idx].ca
20900 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c  ched_certs = NUL
20910 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b  L;...}..}...cack
20920 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
20930 63 74 28 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  ct();...if (cack
20940 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
20950 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65  = NULL) {...free
20960 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
20970 61 6e 64 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  and);....cackey_
20980 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 4e 55  pin_command = NU
20990 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  LL;..}...if (cac
209a0 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
209b0 75 64 65 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c  ude_only != NULL
209c0 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65  ) {...free(cacke
209d0 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
209e0 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 63 61 63 6b  e_only);....cack
209f0 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
20a00 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a  de_only = NULL;.
20a10 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
20a20 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20  readers_exclude 
20a30 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65  != NULL) {...fre
20a40 65 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73  e(cackey_readers
20a50 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 63 61  _exclude);....ca
20a60 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
20a70 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  lude = NULL;..}.
20a80 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  ..cackey_initial
20a90 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b  ized = 0;...CACK
20aa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20ab0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
20ac0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
20ad0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
20ae0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
20af0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
20b00 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49   C_GetInfo)(CK_I
20b10 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
20b20 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
20b30 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
20b40 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
20b50 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
20b60 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c  ic CK_UTF8CHAR l
20b70 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
20b80 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a  n[] = "CACKey";.
20b90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20ba0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
20bb0 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
20bc0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
20bd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20be0 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
20bf0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
20c00 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
20c10 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
20c20 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
20c30 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
20c40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20c50 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
20c60 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
20c70 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20c80 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
20c90 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63  );..}...pInfo->c
20ca0 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d  ryptokiVersion.m
20cb0 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  ajor = ((CACKEY_
20cc0 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
20cd0 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20  _CODE) >> 16) & 
20ce0 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72  0xff;..pInfo->cr
20cf0 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69  yptokiVersion.mi
20d00 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  nor = ((CACKEY_C
20d10 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
20d20 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78  CODE) >> 8) & 0x
20d30 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ff;...memset(pIn
20d40 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
20d50 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
20d60 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
20d70 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79  rerID));..memcpy
20d80 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
20d90 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74  urerID, manufact
20da0 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d  urerID, sizeof(m
20db0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d  anufacturerID) -
20dc0 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c   1);...pInfo->fl
20dd0 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65  ags = 0x00;...me
20de0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mset(pInfo->libr
20df0 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
20e00 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
20e10 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69  o->libraryDescri
20e20 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79  ption));..memcpy
20e30 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44  (pInfo->libraryD
20e40 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72  escription, libr
20e50 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
20e60 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65  sizeof(libraryDe
20e70 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b  scription) - 1);
20e80 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  ...pInfo->librar
20e90 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  yVersion.major =
20ea0 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
20eb0 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
20ec0 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  xff;..pInfo->lib
20ed0 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  raryVersion.mino
20ee0 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
20ef0 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
20f00 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f   0xff;...CACKEY_
20f10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20f20 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
20f30 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
20f40 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
20f50 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73  .}../*. * Proces
20f60 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  s list of reader
20f70 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61  s, and create ma
20f80 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65  pping between re
20f90 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c  ader name and sl
20fa0 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46  ot ID. */.CK_DEF
20fb0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
20fc0 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73  RV, C_GetSlotLis
20fd0 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65  t)(CK_BBOOL toke
20fe0 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f  nPresent, CK_SLO
20ff0 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69  T_ID_PTR pSlotLi
21000 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
21010 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74   pulCount) {..st
21020 61 74 69 63 20 69 6e 74 20 66 69 72 73 74 5f 63  atic int first_c
21030 61 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75  all = 1;..int mu
21040 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
21050 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
21060 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75  t;..CK_ULONG cou
21070 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d  nt, slot_count =
21080 20 30 2c 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c   0, currslot, sl
21090 6f 74 5f 69 64 78 3b 0a 09 63 68 61 72 20 2a 70  ot_idx;..char *p
210a0 63 73 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63  csc_readers, *pc
210b0 73 63 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70  sc_readers_s, *p
210c0 63 73 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09  csc_readers_e;..
210d0 63 68 61 72 20 2a 72 65 61 64 65 72 5f 63 68 65  char *reader_che
210e0 63 6b 5f 70 61 74 74 65 72 6e 3b 0a 09 44 57 4f  ck_pattern;..DWO
210f0 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f  RD pcsc_readers_
21100 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
21110 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
21120 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72  ;..size_t curr_r
21130 65 61 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20  eader_len;..int 
21140 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 09 69 6e 74  slot_reset;..int
21150 20 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 3b   include_reader;
21160 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21170 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
21180 29 3b 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e  );...if (pulCoun
21190 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
211a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
211b0 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f  TF("Error. pulCo
211c0 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  unt is NULL.");.
211d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
211e0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
211f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
21200 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
21210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21220 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
21230 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
21240 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
21250 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
21260 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d  IALIZED);..}...m
21270 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
21280 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
21290 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
212a0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
212b0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
212c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
212d0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
212e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
212f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
21300 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
21310 2f 2a 20 43 6c 65 61 72 20 6c 69 73 74 20 6f 66  /* Clear list of
21320 20 73 6c 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74 5f   slots */..slot_
21330 72 65 73 65 74 20 3d 20 30 3b 0a 09 69 66 20 28  reset = 0;..if (
21340 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 69  pSlotList) {...i
21350 66 20 28 66 69 72 73 74 5f 63 61 6c 6c 29 20 7b  f (first_call) {
21360 0a 09 09 09 66 69 72 73 74 5f 63 61 6c 6c 20 3d  ....first_call =
21370 20 30 3b 0a 0a 09 09 09 73 6c 6f 74 5f 72 65 73   0;.....slot_res
21380 65 74 20 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09 2f  et = 1;...}..../
21390 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
213a0 73 6c 6f 74 73 20 68 61 76 65 20 62 65 65 6e 20  slots have been 
213b0 72 65 73 65 74 20 74 68 65 6e 20 70 75 72 67 65  reset then purge
213c0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
213d0 20 61 6e 64 20 63 68 65 63 6b 20 61 67 61 69 6e   and check again
213e0 20 2a 2f 0a 09 09 66 6f 72 20 28 63 75 72 72 73   */...for (currs
213f0 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
21400 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
21410 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
21420 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
21430 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
21440 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65  ) {....if (cacke
21450 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
21460 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
21470 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
21480 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
21490 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
214a0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  .active) {.....c
214b0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
214c0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
214d0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f  ts[currslot].slo
214e0 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09 73  t_reset) {.....s
214f0 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a  lot_reset = 1;..
21500 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
21510 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f  ..}....if (slot_
21520 72 65 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b  reset) {....CACK
21530 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21540 22 50 75 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f  "Purging all slo
21550 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29  t information.")
21560 3b 0a 0a 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70  ;...../* Only up
21570 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66  date the list of
21580 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65   slots if we are
21590 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
215a0 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20  supply the slot 
215b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09  information */..
215c0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
215d0 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 31 29  isconnect_all(1)
215e0 3b 0a 0a 09 09 09 66 6f 72 20 28 63 75 72 72 73  ;.....for (currs
215f0 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
21600 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
21610 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
21620 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
21630 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
21640 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b  ) {.....if (cack
21650 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
21660 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  t].internal) {..
21670 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
21680 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ..}......cackey_
21690 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
216a0 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 09 7d  active = 0;....}
216b0 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  ...}..}.../* Det
216c0 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72  ermine list of r
216d0 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f  eaders */..pcsc_
216e0 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
216f0 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
21700 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63  t();..if (pcsc_c
21710 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
21720 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
21730 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21740 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74  _PRINTF("Connect
21750 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69  ion to PC/SC fai
21760 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  led, assuming no
21770 20 68 61 72 64 77 61 72 65 20 73 6c 6f 74 73 22   hardware slots"
21780 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70  );..} else {...p
21790 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20  csc_readers_len 
217a0 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69  = 0;....scard_li
217b0 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
217c0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
217d0 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
217e0 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ndle, NULL, NULL
217f0 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
21800 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  len);....if (sca
21810 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
21820 65 74 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f  et == SCARD_F_CO
21830 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 43  MM_ERROR) {....C
21840 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21850 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64  TF("Error. SCard
21860 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 72 65  ListReaders() re
21870 74 75 72 6e 65 64 20 53 43 41 52 44 5f 46 5f 43  turned SCARD_F_C
21880 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d  OMM_ERROR, assum
21890 69 6e 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  ing Connection t
218a0 6f 20 50 43 2f 53 43 20 77 65 6e 74 20 61 77 61  o PC/SC went awa
218b0 79 2e 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e  y. Reconnecting.
218c0 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70  ");.....cackey_p
218d0 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29  csc_disconnect()
218e0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  ;....cackey_pcsc
218f0 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09  _connect();.....
21900 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21910 4e 54 46 28 22 54 72 79 69 6e 67 20 53 43 61 72  NTF("Trying SCar
21920 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 61  dListReaders() a
21930 67 61 69 6e 22 29 3b 0a 09 09 09 73 63 61 72 64  gain");....scard
21940 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
21950 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
21960 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
21970 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e  _handle, NULL, N
21980 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ULL, &pcsc_reade
21990 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09  rs_len);...}....
219a0 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
219b0 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
219c0 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e  RD_E_INSUFFICIEN
219d0 54 5f 42 55 46 46 45 52 29 20 7b 0a 09 09 09 43  T_BUFFER) {....C
219e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
219f0 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64  TF("Error. SCard
21a00 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 72 65  ListReaders() re
21a10 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49  turned SCARD_E_I
21a20 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46  NSUFFICIENT_BUFF
21a30 45 52 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 69  ER, assuming thi
21a40 73 20 69 73 20 61 20 62 75 67 20 28 65 2e 67 2e  s is a bug (e.g.
21a50 2c 20 47 6f 6f 67 6c 65 20 50 43 53 43 29 20 61  , Google PCSC) a
21a60 6e 64 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  nd allocating a 
21a70 6d 61 73 73 69 76 65 20 61 6d 6f 75 6e 74 20 6f  massive amount o
21a80 66 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  f space to hold 
21a90 74 68 65 20 72 65 61 64 65 72 20 6c 69 73 74 2e  the reader list.
21aa0 22 29 3b 0a 0a 09 09 09 70 63 73 63 5f 72 65 61  ");.....pcsc_rea
21ab0 64 65 72 73 5f 6c 65 6e 20 3d 20 33 32 37 36 38  ders_len = 32768
21ac0 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72  ;....scard_listr
21ad0 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 41  eaders_ret = SCA
21ae0 52 44 5f 53 5f 53 55 43 43 45 53 53 3b 0a 09 09  RD_S_SUCCESS;...
21af0 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c  }....if (scard_l
21b00 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
21b10 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
21b20 53 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 72  S && pcsc_reader
21b30 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09  s_len != 0) {...
21b40 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d 20  .pcsc_readers = 
21b50 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 64  malloc(pcsc_read
21b60 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73  ers_len);....pcs
21b70 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 63  c_readers_s = pc
21b80 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 09  sc_readers;.....
21b90 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
21ba0 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
21bb0 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
21bc0 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
21bd0 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73  LL, pcsc_readers
21be0 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
21bf0 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 61  len);....if (sca
21c00 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
21c10 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
21c20 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 73  CCESS) {.....pcs
21c30 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 63  c_readers_e = pc
21c40 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 73  sc_readers + pcs
21c50 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a  c_readers_len;..
21c60 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74  ..../* Start wit
21c70 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20  h Slot ID 1, to 
21c80 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47  avoid a bug in G
21c90 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09  DM on RHEL */...
21ca0 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a  ../* Bug 594911:
21cb0 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
21cc0 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f  a.redhat.com/sho
21cd0 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34  w_bug.cgi?id=594
21ce0 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 73  911 */.....currs
21cf0 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 77 68 69  lot = 1;.....whi
21d00 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73  le (pcsc_readers
21d10 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   < pcsc_readers_
21d20 65 29 20 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e  e) {....../* Fin
21d30 64 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  d next available
21d40 20 73 6c 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f   slot */......fo
21d50 72 20 28 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  r (; currslot < 
21d60 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
21d70 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
21d80 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
21d90 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
21da0 09 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65  ......if (!cacke
21db0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
21dc0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
21dd0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09  ...break;.......
21de0 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 63  }......}.......c
21df0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
21e00 20 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61   strlen(pcsc_rea
21e10 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20  ders);.......if 
21e20 28 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ((pcsc_readers +
21e30 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e   curr_reader_len
21e40 29 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73  ) > pcsc_readers
21e50 5f 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61  _e) {.......brea
21e60 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
21e70 69 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f  if (curr_reader_
21e80 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  len == 0) {.....
21e90 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
21ea0 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c  ......if (currsl
21eb0 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ot >= (sizeof(ca
21ec0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
21ed0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
21ee0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09  s[0]))) {.......
21ef0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21f00 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20  NTF("Found more 
21f10 72 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f  readers than slo
21f20 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ts are available
21f30 21 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  !");........brea
21f40 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
21f50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21f60 4e 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65  NTF("Found reade
21f70 72 3a 20 25 73 20 28 63 75 72 72 73 6c 6f 74 20  r: %s (currslot 
21f80 3d 20 25 6c 75 29 22 2c 20 70 63 73 63 5f 72 65  = %lu)", pcsc_re
21f90 61 64 65 72 73 2c 20 28 75 6e 73 69 67 6e 65 64  aders, (unsigned
21fa0 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 29   long) currslot)
21fb0 3b 0a 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b  ;.......if (cack
21fc0 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
21fd0 64 65 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29  de_only != NULL)
21fe0 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
21ff0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73  DEBUG_PRINTF("As
22000 6b 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 6f  ked to include o
22010 6e 6c 79 20 72 65 61 64 65 72 73 20 6d 61 74 63  nly readers matc
22020 68 69 6e 67 3a 20 25 73 22 2c 20 63 61 63 6b 65  hing: %s", cacke
22030 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
22040 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 09 09 09 09  e_only);........
22050 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d  include_reader =
22060 20 30 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72   0;.......reader
22070 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d  _check_pattern =
22080 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f   cackey_readers_
22090 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 3b 0a 09 09  include_only;...
220a0 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 63 61  ...} else if (ca
220b0 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
220c0 6c 75 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  lude != NULL) {.
220d0 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
220e0 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64  UG_PRINTF("Asked
220f0 20 74 6f 20 65 78 63 6c 75 64 65 20 72 65 61 64   to exclude read
22100 65 72 73 20 6d 61 74 63 68 69 6e 67 3a 20 25 73  ers matching: %s
22110 22 2c 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72  ", cackey_reader
22120 73 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 09  s_exclude);.....
22130 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65  ...include_reade
22140 72 20 3d 20 31 3b 0a 09 09 09 09 09 09 72 65 61  r = 1;.......rea
22150 64 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72  der_check_patter
22160 6e 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 65  n = cackey_reade
22170 72 73 5f 65 78 63 6c 75 64 65 3b 0a 09 09 09 09  rs_exclude;.....
22180 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
22190 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d  include_reader =
221a0 20 31 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72   1;.......reader
221b0 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d  _check_pattern =
221c0 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 0a 09   NULL;......}...
221d0 09 09 09 09 69 66 20 28 72 65 61 64 65 72 5f 63  ....if (reader_c
221e0 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 21 3d 20  heck_pattern != 
221f0 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 69 66  NULL) {.......if
22200 20 28 73 74 72 73 74 72 28 70 63 73 63 5f 72 65   (strstr(pcsc_re
22210 61 64 65 72 73 2c 20 72 65 61 64 65 72 5f 63 68  aders, reader_ch
22220 65 63 6b 5f 70 61 74 74 65 72 6e 29 20 21 3d 20  eck_pattern) != 
22230 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 43  NULL) {........C
22240 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22250 54 46 28 22 54 68 69 73 20 72 65 61 64 65 72 20  TF("This reader 
22260 6d 61 74 63 68 65 64 20 74 68 65 20 70 61 74 74  matched the patt
22270 65 72 6e 2e 22 29 3b 0a 09 09 09 09 09 09 0a 09  ern.");.........
22280 09 09 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65  ......include_re
22290 61 64 65 72 20 3d 20 21 69 6e 63 6c 75 64 65 5f  ader = !include_
222a0 72 65 61 64 65 72 3b 0a 09 09 09 09 09 09 7d 0a  reader;.......}.
222b0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
222c0 28 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20  (include_reader 
222d0 21 3d 20 31 29 20 7b 0a 09 09 09 09 09 09 43 41  != 1) {.......CA
222e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
222f0 46 28 22 53 6b 69 70 70 69 6e 67 20 74 68 69 73  F("Skipping this
22300 20 72 65 61 64 65 72 2e 22 29 3b 0a 0a 09 09 09   reader.");.....
22310 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20  ...pcsc_readers 
22320 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  += curr_reader_l
22330 65 6e 20 2b 20 31 3b 0a 0a 09 09 09 09 09 09 63  en + 1;........c
22340 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 09 7d 0a  ontinue;......}.
22350 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70  ....../* Only up
22360 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66  date the list of
22370 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65   slots if we are
22380 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
22390 61 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65  asked supply the
223a0 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f   slot informatio
223b0 6e 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53  n */......if (pS
223c0 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09  lotList) {......
223d0 09 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29  .if (slot_reset)
223e0 20 7b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79   {........cackey
223f0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
22400 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09  .active = 1;....
22410 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
22420 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72  [currslot].inter
22430 6e 61 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09 09  nal = 0;........
22440 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
22450 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
22460 65 72 20 3d 20 73 74 72 64 75 70 28 70 63 73 63  er = strdup(pcsc
22470 5f 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09  _readers);......
22480 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
22490 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61  urrslot].pcsc_ca
224a0 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
224b0 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
224c0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
224d0 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
224e0 68 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61  h = 0;........ca
224f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
22500 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  lot].transaction
22510 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
22520 30 3b 0a 09 09 09 09 09 09 09 69 66 20 28 63 61  0;........if (ca
22530 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
22540 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
22550 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
22560 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  [currslot].token
22570 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
22580 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09  IN_REQUIRED;....
22590 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
225a0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
225b0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65  s[currslot].toke
225c0 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 09  n_flags = 0;....
225d0 09 09 09 09 7d 0a 09 09 09 09 09 09 09 63 61 63  ....}........cac
225e0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
225f0 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ot].label = NULL
22600 3b 0a 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  ;.........cackey
22610 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
22620 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (&cackey_slots[c
22630 75 72 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09  urrslot]);......
22640 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  .}......} else {
22650 0a 09 09 09 09 09 09 69 66 20 28 21 63 61 63 6b  .......if (!cack
22660 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
22670 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  t].active) {....
22680 09 09 09 09 2f 2a 20 41 72 74 69 66 69 63 69 61  ..../* Artificia
22690 6c 6c 79 20 69 6e 63 72 65 61 73 65 20 74 68 65  lly increase the
226a0 20 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76   number of activ
226b0 65 20 73 6c 6f 74 73 20 62 79 20 77 68 61 74 20  e slots by what 
226c0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74 69  will become acti
226d0 76 65 20 2a 2f 0a 09 09 09 09 09 09 09 43 41 43  ve */........CAC
226e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
226f0 28 22 46 6f 75 6e 64 20 69 6e 2d 61 63 74 69 76  ("Found in-activ
22700 65 20 73 6c 6f 74 20 25 6c 75 2c 20 62 75 74 20  e slot %lu, but 
22710 69 74 20 77 69 6c 6c 20 62 65 20 61 63 74 69 76  it will be activ
22720 65 20 61 66 74 65 72 20 61 20 72 65 73 65 74 20  e after a reset 
22730 2d 2d 20 6d 61 72 6b 69 6e 67 20 61 73 20 61 63  -- marking as ac
22740 74 69 76 65 20 66 6f 72 20 61 63 63 6f 75 6e 74  tive for account
22750 69 6e 67 20 70 75 72 70 6f 73 65 73 22 2c 20 28  ing purposes", (
22760 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
22770 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09  urrslot);.......
22780 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a  ..slot_count++;.
22790 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09  ......}......}..
227a0 09 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a  ....currslot++;.
227b0 0a 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65  ......pcsc_reade
227c0 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65  rs += curr_reade
227d0 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d  r_len + 1;.....}
227e0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
227f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22800 49 4e 54 46 28 22 53 65 63 6f 6e 64 20 63 61 6c  INTF("Second cal
22810 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65  l to SCardListRe
22820 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65  aders failed, re
22830 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41  turn %s/%li", CA
22840 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
22850 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
22860 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
22870 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  s_ret), (long) s
22880 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
22890 5f 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  _ret);....}.....
228a0 66 72 65 65 28 70 63 73 63 5f 72 65 61 64 65 72  free(pcsc_reader
228b0 73 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  s_s);...} else {
228c0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
228d0 5f 50 52 49 4e 54 46 28 22 46 69 72 73 74 20 63  _PRINTF("First c
228e0 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74  all to SCardList
228f0 52 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20  Readers failed, 
22900 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20  return %s/%li", 
22910 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
22920 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
22930 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  R(scard_listread
22940 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ers_ret), (long)
22950 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65   scard_listreade
22960 72 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a  rs_ret);...}..}.
22970 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20  ..for (currslot 
22980 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  = 0; currslot < 
22990 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
229a0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
229b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
229c0 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
229d0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
229e0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
229f0 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ive) {....CACKEY
22a00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
22a10 6f 75 6e 64 20 61 63 74 69 76 65 20 73 6c 6f 74  ound active slot
22a20 20 25 6c 75 2c 20 72 65 61 64 65 72 20 3d 20 25   %lu, reader = %
22a30 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  s", (unsigned lo
22a40 6e 67 29 20 63 75 72 72 73 6c 6f 74 2c 20 63 61  ng) currslot, ca
22a50 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
22a60 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
22a70 29 3b 0a 0a 09 09 09 73 6c 6f 74 5f 63 6f 75 6e  );.....slot_coun
22a80 74 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  t++;...}..}...mu
22a90 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
22aa0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
22ab0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22ac0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
22ad0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
22ae0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22af0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
22b00 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
22b10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
22b20 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
22b30 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
22b40 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70   == NULL) {...*p
22b50 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63  ulCount = slot_c
22b60 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ount;....CACKEY_
22b70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22b80 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
22b90 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20  %i).  Found %lu 
22ba0 72 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74  readers, but not
22bb0 20 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53   storing IDs (pS
22bc0 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  lotList == NULL)
22bd0 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69  ", CKR_OK, (unsi
22be0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f  gned long) slot_
22bf0 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
22c00 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
22c10 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e  count = *pulCoun
22c20 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20  t;..if (count < 
22c30 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  slot_count) {...
22c40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22c50 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72  NTF("Error. User
22c60 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65   allocated %lu e
22c70 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 68  ntries, but we h
22c80 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e  ave %lu entries.
22c90 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63  ", count, slot_c
22ca0 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59  ount);....CACKEY
22cb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22cc0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46  eturning CKR_BUF
22cd0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b  FER_TOO_SMALL");
22ce0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42  ....return(CKR_B
22cf0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
22d00 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  ;...}...mutex_re
22d10 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
22d20 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
22d30 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
22d40 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
22d50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22d60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22d70 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
22d80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22d90 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
22da0 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64  R);..}...slot_id
22db0 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72  x = 0;..for (cur
22dc0 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 72  rslot = 0; (curr
22dd0 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
22de0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
22df0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
22e00 74 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 6c  ts[0]))); currsl
22e10 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63  ot++) {...if (!c
22e20 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
22e30 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
22e40 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
22e50 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 78  ....if (slot_idx
22e60 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09   >= count) {....
22e70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22e80 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72  NTF("Error. User
22e90 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65   allocated %lu e
22ea0 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 6a  ntries, but we j
22eb0 75 73 74 20 74 72 69 65 64 20 74 6f 20 77 72 69  ust tried to wri
22ec0 74 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e  te to the %lu in
22ed0 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22  dex -- ignoring"
22ee0 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64  , count, slot_id
22ef0 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  x);.....continue
22f00 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69  ;...}....pSlotLi
22f10 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63  st[slot_idx] = c
22f20 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f  urrslot;...slot_
22f30 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65  idx++;..}...mute
22f40 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
22f50 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
22f60 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
22f70 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
22f80 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
22f90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22fa0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
22fb0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
22fc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
22fd0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
22fe0 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f  .*pulCount = slo
22ff0 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45  t_count;...CACKE
23000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23010 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
23020 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c   (%i).  Found %l
23030 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52  u readers.", CKR
23040 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  _OK, (unsigned l
23050 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  ong) slot_count)
23060 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
23070 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65  K);...tokenPrese
23080 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e  nt = tokenPresen
23090 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  t; /* Supress un
230a0 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
230b0 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
230c0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
230d0 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49  K_RV, C_GetSlotI
230e0 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
230f0 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f  slotID, CK_SLOT_
23100 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
23110 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  {..static CK_UTF
23120 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69  8CHAR slotDescri
23130 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
23140 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75  y Slot";..int mu
23150 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
23160 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
23170 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23180 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
23190 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
231a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
231b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
231c0 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
231d0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
231e0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
231f0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
23200 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
23210 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
23220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23230 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
23240 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
23250 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
23260 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
23270 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
23280 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
23290 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
232a0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
232b0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
232c0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
232d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
232e0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
232f0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
23300 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
23310 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
23320 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
23330 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
23340 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
23350 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
23360 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
23370 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
23380 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
23390 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
233a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
233b0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
233c0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
233d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
233e0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
233f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
23400 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
23410 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23420 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23430 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
23440 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
23450 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
23460 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
23470 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
23480 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23490 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
234a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
234b0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
234c0 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
234d0 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09   CKF_HW_SLOT;...
234e0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
234f0 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e  s[slotID].intern
23500 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66  al) {...pInfo->f
23510 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f  lags |= CKF_REMO
23520 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d  VABLE_DEVICE;..}
23530 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  ...if (cackey_to
23540 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
23550 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
23560 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) == CACKEY_PCS
23570 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
23580 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
23590 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f  gs |= CKF_TOKEN_
235a0 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79  PRESENT;..}...by
235b0 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74  tes_to_copy = st
235c0 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74  rlen(cackey_slot
235d0 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72  s[slotID].pcsc_r
235e0 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a  eader);..if (siz
235f0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
23600 61 63 74 75 72 65 72 49 44 29 20 3c 20 62 79 74  acturerID) < byt
23610 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09  es_to_copy) {...
23620 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
23630 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
23640 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09  nufacturerID);..
23650 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  }..memcpy(pInfo-
23660 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
23670 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c   cackey_slots[sl
23680 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65  otID].pcsc_reade
23690 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  r, bytes_to_copy
236a0 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  );...mutex_retva
236b0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
236c0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
236d0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
236e0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
236f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23700 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23710 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
23720 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23730 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23740 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74  OR);..}...memset
23750 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63  (pInfo->slotDesc
23760 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69  ription, ' ', si
23770 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  zeof(pInfo->slot
23780 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09  Description));..
23790 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c  memcpy(pInfo->sl
237a0 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  otDescription, s
237b0 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  lotDescription, 
237c0 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72  sizeof(slotDescr
237d0 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09  iption) - 1);...
237e0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61  memset(pInfo->ma
237f0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20  nufacturerID, ' 
23800 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
23810 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
23820 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  );...pInfo->hard
23830 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
23840 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
23850 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
23860 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
23870 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
23880 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
23890 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
238a0 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e  8) & 0xff;...pIn
238b0 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
238c0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30  ion.major = 0x00
238d0 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ;..pInfo->firmwa
238e0 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
238f0 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59  = 0x00;...CACKEY
23900 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
23910 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
23920 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
23930 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
23940 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
23950 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
23960 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43  _GetTokenInfo)(C
23970 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
23980 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f  , CK_TOKEN_INFO_
23990 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74  PTR pInfo) {..st
239a0 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
239b0 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b   manufacturerID[
239c0 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e  ] = "U.S. Govern
239d0 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43  ment";..static C
239e0 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66 61 75  K_UTF8CHAR defau
239f0 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b  ltLabel[] = "Unk
23a00 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74  nown Token";..st
23a10 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
23a20 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20   model[] = "CAC 
23a30 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20  Token";..struct 
23a40 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
23a50 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
23a60 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64  ities;..unsigned
23a70 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b   long num_certs;
23a80 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f  ..ssize_t label_
23a90 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ret;..int mutex_
23aa0 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65  retval;..int use
23ab0 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a  _default_label;.
23ac0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23ad0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
23ae0 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
23af0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
23b00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23b10 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
23b20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
23b30 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
23b40 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
23b50 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
23b60 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
23b70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23b80 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
23b90 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
23ba0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
23bb0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
23bc0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
23bd0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
23be0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
23bf0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
23c00 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
23c10 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
23c20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23c30 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
23c40 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
23c50 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
23c60 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
23c70 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
23c80 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
23c90 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
23ca0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
23cb0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
23cc0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
23cd0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
23ce0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
23cf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23d00 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
23d10 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
23d20 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
23d30 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
23d40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
23d50 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
23d60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23d70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23d80 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
23d90 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
23da0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
23db0 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
23dc0 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
23dd0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23de0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
23df0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
23e00 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
23e10 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b  ..if (cackey_tok
23e20 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b  en_present(&cack
23e30 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
23e40 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  ) != CACKEY_PCSC
23e50 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
23e60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23e70 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b  G_PRINTF("No tok
23e80 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  en is present in
23e90 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20   slotID = %lu", 
23ea0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
23eb0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23ec0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23ed0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ....return(CKR_T
23ee0 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54  OKEN_NOT_PRESENT
23ef0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
23f00 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c  mine token label
23f10 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74   from certificat
23f20 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49  es */..memset(pI
23f30 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c  nfo->label, ' ',
23f40 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
23f50 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66  abel));..use_def
23f60 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a  ault_label = 1;.
23f70 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
23f80 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
23f90 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63   == NULL) {...pc
23fa0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
23fb0 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
23fc0 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
23fd0 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26  slotID], NULL, &
23fe0 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69 66  num_certs);...if
23ff0 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   (pcsc_identitie
24000 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
24010 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20  if (num_certs > 
24020 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72  0) {.....label_r
24030 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63  et = cackey_pcsc
24040 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62  _identity_to_lab
24050 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  el(pcsc_identiti
24060 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  es, pInfo->label
24070 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
24080 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66 20  label));.....if 
24090 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20  (label_ret > 0) 
240a0 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61 75  {......use_defau
240b0 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09  lt_label = 0;...
240c0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
240d0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d  [slotID].label =
240e0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70   malloc(sizeof(p
240f0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a  Info->label));..
24100 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b  .....memcpy(cack
24110 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
24120 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c  .label, pInfo->l
24130 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e  abel, sizeof(pIn
24140 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  fo->label));....
24150 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  .}....}.....cack
24160 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63  ey_free_certs(pc
24170 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  sc_identities, n
24180 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09  um_certs, 1);...
24190 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65  }..} else {...me
241a0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  mcpy(pInfo->labe
241b0 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  l, cackey_slots[
241c0 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73  slotID].label, s
241d0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
241e0 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66  el));....use_def
241f0 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a  ault_label = 0;.
24200 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
24210 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
24220 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24230 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
24240 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
24250 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24260 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24270 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
24280 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
24290 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
242a0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73  OR);..}...if (us
242b0 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29  e_default_label)
242c0 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66   {...memcpy(pInf
242d0 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c  o->label, defaul
242e0 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64  tLabel, sizeof(d
242f0 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31  efaultLabel) - 1
24300 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
24310 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
24320 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f  erID, ' ', sizeo
24330 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
24340 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63  turerID));..memc
24350 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
24360 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61  cturerID, manufa
24370 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66  cturerID, sizeof
24380 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  (manufacturerID)
24390 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28   - 1);...memset(
243a0 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20  pInfo->model, ' 
243b0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
243c0 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70  >model));..memcp
243d0 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20  y(pInfo->model, 
243e0 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f  model, sizeof(mo
243f0 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  del) - 1);...mem
24400 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  set(pInfo->seria
24410 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69  lNumber, ' ', si
24420 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69  zeof(pInfo->seri
24430 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65  alNumber));...me
24440 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54  mset(pInfo->utcT
24450 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ime, ' ', sizeof
24460 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29  (pInfo->utcTime)
24470 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  );...pInfo->hard
24480 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
24490 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
244a0 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
244b0 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
244c0 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
244d0 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
244e0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
244f0 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e  8) & 0xff;...pIn
24500 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
24510 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30  ion.major = 0x00
24520 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ;..pInfo->firmwa
24530 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
24540 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d  = 0x00;...pInfo-
24550 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49  >flags = CKF_WRI
24560 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43  TE_PROTECTED | C
24570 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54  KF_USER_PIN_INIT
24580 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f  IALIZED | CKF_TO
24590 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20  KEN_INITIALIZED 
245a0 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  | cackey_slots[s
245b0 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
245c0 67 73 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  gs;...if (cackey
245d0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20  _pin_command != 
245e0 4e 55 4c 4c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d  NULL) {...pInfo-
245f0 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 50 52  >flags |= CKF_PR
24600 4f 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54 49  OTECTED_AUTHENTI
24610 43 41 54 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a  CATION_PATH;..}.
24620 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65  ..pInfo->ulMaxSe
24630 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69  ssionCount = (si
24640 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
24650 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
24660 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
24670 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d  ])) - 1;..pInfo-
24680 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  >ulSessionCount 
24690 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
246a0 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
246b0 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73  Info->ulMaxRwSes
246c0 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09  sionCount = 0;..
246d0 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69  pInfo->ulRwSessi
246e0 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41  onCount = CK_UNA
246f0 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
24700 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
24710 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b  MaxPinLen = 128;
24720 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69  ..pInfo->ulMinPi
24730 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f  nLen = 0;..pInfo
24740 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d  ->ulTotalPublicM
24750 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
24760 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
24770 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72  ON;..pInfo->ulFr
24780 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d  eePublicMemory =
24790 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
247a0 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
247b0 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76  nfo->ulTotalPriv
247c0 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  ateMemory = CK_U
247d0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
247e0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
247f0 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65 6d  ulFreePrivateMem
24800 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
24810 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
24820 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
24830 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24840 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
24850 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
24860 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
24870 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
24880 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46  N(CK_RV, C_WaitF
24890 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f  orSlotEvent)(CK_
248a0 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f  FLAGS flags, CK_
248b0 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f  SLOT_ID_PTR pSlo
248c0 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52  tID, CK_VOID_PTR
248d0 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 43   pReserved) {..C
248e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
248f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
24900 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21  .if (pReserved !
24910 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
24920 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24930 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65  "Error. pReserve
24940 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  d is not NULL.")
24950 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24960 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
24970 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
24980 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
24990 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
249a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
249b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
249c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
249d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
249e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
249f0 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20 49  ./* XXX: TODO: I
24a00 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e 2e  mplement this...
24a10 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55   */..CACKEY_DEBU
24a20 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24a30 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
24a40 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
24a50 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
24a60 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
24a70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
24a80 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
24a90 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
24aa0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
24ab0 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61  K_RV, C_GetMecha
24ac0 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f  nismList)(CK_SLO
24ad0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
24ae0 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50  MECHANISM_TYPE_P
24af0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  TR pMechanismLis
24b00 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
24b10 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43  pulCount) {..CAC
24b20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24b30 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
24b40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
24b50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
24b60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24b70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
24b80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
24b90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
24ba0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
24bb0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
24bc0 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ulCount == NULL)
24bd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24be0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24bf0 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55    pulCount is NU
24c00 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
24c10 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
24c20 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
24c30 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20  echanismList == 
24c40 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f  NULL) {...*pulCo
24c50 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43 4b  unt = 1;....CACK
24c60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24c70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
24c80 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
24c90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24ca0 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70  OK);..}...if (*p
24cb0 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a 09  ulCount < 1) {..
24cc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24cd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75  INTF("Error.  Bu
24ce0 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22  ffer too small."
24cf0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24d00 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
24d10 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e  L);..}...pMechan
24d20 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d  ismList[0] = CKM
24d30 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c  _RSA_PKCS;..*pul
24d40 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 43  Count = 1;...CAC
24d50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24d60 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24d70 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
24d80 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
24d90 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
24da0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
24db0 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  , C_GetMechanism
24dc0 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
24dd0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48   slotID, CK_MECH
24de0 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c  ANISM_TYPE type,
24df0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e   CK_MECHANISM_IN
24e00 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
24e10 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
24e20 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
24e30 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
24e40 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
24e50 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
24e60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24e70 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
24e80 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
24e90 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
24ea0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
24eb0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
24ec0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
24ed0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24ee0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
24ef0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
24f00 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
24f10 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
24f20 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
24f30 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
24f40 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
24f50 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
24f60 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
24f70 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
24f80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24f90 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
24fa0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
24fb0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
24fc0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
24fd0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
24fe0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
24ff0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
25000 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
25010 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
25020 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25030 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
25040 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
25050 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25060 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
25070 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
25080 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
25090 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
250a0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
250b0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
250c0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
250d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
250e0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
250f0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
25100 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
25110 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
25120 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
25130 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25140 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25150 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
25160 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
25170 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
25180 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
25190 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
251a0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
251b0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
251c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
251d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
251e0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
251f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
25200 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
25210 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
25220 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65   (type) {...case
25230 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
25240 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65  ..pInfo->ulMinKe
25250 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09  ySize = 512;....
25260 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53  pInfo->ulMaxKeyS
25270 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70  ize = 8192;....p
25280 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b  Info->flags = CK
25290 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59  F_HW | CKF_ENCRY
252a0 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54  PT | CKF_DECRYPT
252b0 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b   | CKF_SIGN | CK
252c0 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65  F_VERIFY;....bre
252d0 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ak;..}...CACKEY_
252e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
252f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
25300 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
25310 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
25320 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20  .}../* We don't 
25330 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74  support this met
25340 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  hod. */.CK_DEFIN
25350 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
25360 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43  , C_InitToken)(C
25370 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
25380 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
25390 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  R pPin, CK_ULONG
253a0 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54   ulPinLen, CK_UT
253b0 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65  F8CHAR_PTR pLabe
253c0 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  l) {..CACKEY_DEB
253d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
253e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
253f0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
25400 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25410 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25420 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
25430 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
25440 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
25450 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
25460 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
25470 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
25480 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ng CKR_TOKEN_WRI
25490 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69  TE_PROTECTED (%i
254a0 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  )", CKR_TOKEN_WR
254b0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
254c0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b  ..return(CKR_TOK
254d0 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
254e0 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f  ED);.}../* We do
254f0 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73  n't support this
25500 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44   method. */.CK_D
25510 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
25520 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29  K_RV, C_InitPIN)
25530 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
25540 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
25550 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
25560 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
25570 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nLen) {..CACKEY_
25580 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
25590 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
255a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
255b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
255c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
255d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
255e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
255f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
25600 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
25610 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
25620 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
25630 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f  rning CKR_TOKEN_
25640 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20  WRITE_PROTECTED 
25650 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e  (%i)", CKR_TOKEN
25660 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
25670 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
25680 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
25690 45 43 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ECTED);.}..CK_DE
256a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
256b0 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43  _RV, C_SetPIN)(C
256c0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
256d0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54   hSession, CK_UT
256e0 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50  F8CHAR_PTR pOldP
256f0 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f  in, CK_ULONG ulO
25700 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46  ldPinLen, CK_UTF
25710 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69  8CHAR_PTR pNewPi
25720 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65  n, CK_ULONG ulNe
25730 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 63 68 61 72  wPinLen) {..char
25740 20 6f 6c 64 70 69 6e 62 75 66 5b 36 34 5d 2c 20   oldpinbuf[64], 
25750 6e 65 77 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09  newpinbuf[64];..
25760 63 61 63 6b 65 79 5f 72 65 74 20 73 65 74 5f 70  cackey_ret set_p
25770 69 6e 5f 72 65 74 2c 20 67 65 74 5f 70 69 6e 5f  in_ret, get_pin_
25780 72 65 74 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  ret;..CK_SLOT_ID
25790 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75   slotID;..int mu
257a0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
257b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
257c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
257d0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
257e0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
257f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25800 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
25810 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
25820 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
25830 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
25840 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  IZED);..}...mute
25850 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
25860 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
25870 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
25880 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
25890 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
258a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
258b0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
258c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
258d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
258e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
258f0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
25900 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
25910 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
25920 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
25930 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
25940 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25950 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
25960 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
25970 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
25980 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
25990 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
259a0 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
259b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
259c0 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
259d0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
259e0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
259f0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
25a00 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
25a10 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
25a20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25a30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
25a40 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
25a50 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
25a60 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
25a70 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
25a80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25a90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25aa0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
25ab0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25ac0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
25ad0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
25ae0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
25af0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25b00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
25b10 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
25b20 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
25b30 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
25b40 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
25b50 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
25b60 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
25b70 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
25b80 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
25b90 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
25ba0 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
25bb0 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd != NULL) {...
25bc0 2f 2a 20 47 65 74 20 6f 6c 64 20 50 49 4e 20 2a  /* Get old PIN *
25bd0 2f 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20  /...get_pin_ret 
25be0 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e  = cackey_get_pin
25bf0 28 6f 6c 64 70 69 6e 62 75 66 29 3b 0a 0a 09 09  (oldpinbuf);....
25c00 69 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 74 20  if (get_pin_ret 
25c10 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
25c20 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
25c30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25c40 72 72 6f 72 20 77 68 69 6c 65 20 67 65 74 74 69  rror while getti
25c50 6e 67 20 4f 6c 64 20 50 49 4e 2c 20 72 65 74 75  ng Old PIN, retu
25c60 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e  rning CKR_PIN_IN
25c70 43 4f 52 52 45 43 54 2e 22 29 3b 0a 0a 09 09 09  CORRECT.");.....
25c80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25c90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25ca0 63 6b 29 3b 0a 09 09 09 0a 09 09 09 72 65 74 75  ck);........retu
25cb0 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  rn(CKR_PIN_INCOR
25cc0 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 4f  RECT);...}....pO
25cd0 6c 64 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38  ldPin = (CK_UTF8
25ce0 43 48 41 52 5f 50 54 52 29 20 6f 6c 64 70 69 6e  CHAR_PTR) oldpin
25cf0 62 75 66 3b 0a 09 09 75 6c 4f 6c 64 50 69 6e 4c  buf;...ulOldPinL
25d00 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 6c 64 70  en = strlen(oldp
25d10 69 6e 62 75 66 29 3b 0a 0a 09 09 2f 2a 20 47 65  inbuf);..../* Ge
25d20 74 20 6e 65 77 20 50 49 4e 20 2a 2f 0a 09 09 67  t new PIN */...g
25d30 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63  et_pin_ret = cac
25d40 6b 65 79 5f 67 65 74 5f 70 69 6e 28 6e 65 77 70  key_get_pin(newp
25d50 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67  inbuf);....if (g
25d60 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41  et_pin_ret != CA
25d70 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
25d80 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
25d90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 20  G_PRINTF("Error 
25da0 77 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4e 65  while getting Ne
25db0 77 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e 67  w PIN, returning
25dc0 20 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44   CKR_PIN_INVALID
25dd0 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  .");.....cackey_
25de0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25df0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
25e00 09 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
25e10 50 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09  PIN_INVALID);...
25e20 7d 0a 0a 09 09 70 4e 65 77 50 69 6e 20 3d 20 28  }....pNewPin = (
25e30 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 29  CK_UTF8CHAR_PTR)
25e40 20 6e 65 77 70 69 6e 62 75 66 3b 0a 09 09 75 6c   newpinbuf;...ul
25e50 4e 65 77 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c  NewPinLen = strl
25e60 65 6e 28 6e 65 77 70 69 6e 62 75 66 29 3b 0a 09  en(newpinbuf);..
25e70 7d 0a 0a 09 69 66 20 28 70 4f 6c 64 50 69 6e 20  }...if (pOldPin 
25e80 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
25e90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25ea0 28 22 4f 6c 64 20 50 49 4e 20 76 61 6c 75 65 20  ("Old PIN value 
25eb0 69 73 20 77 72 6f 6e 67 20 28 6e 75 6c 6c 29 2e  is wrong (null).
25ec0 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  ");....cackey_mu
25ed0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
25ee0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
25ef0 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
25f00 43 4f 52 52 45 43 54 29 3b 0a 09 7d 0a 0a 09 69  CORRECT);..}...i
25f10 66 20 28 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d  f (ulOldPinLen =
25f20 3d 20 30 20 7c 7c 20 75 6c 4f 6c 64 50 69 6e 4c  = 0 || ulOldPinL
25f30 65 6e 20 3e 20 38 29 20 7b 0a 09 09 43 41 43 4b  en > 8) {...CACK
25f40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25f50 22 4f 6c 64 20 50 49 4e 20 6c 65 6e 67 74 68 20  "Old PIN length 
25f60 69 73 20 77 72 6f 6e 67 3a 20 25 6c 75 2e 22 2c  is wrong: %lu.",
25f70 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
25f80 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 29 3b 0a 0a   ulOldPinLen);..
25f90 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25fa0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25fb0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
25fc0 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45  (CKR_PIN_INCORRE
25fd0 43 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4e  CT);..}...if (pN
25fe0 65 77 50 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ewPin == NULL) {
25ff0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26000 50 52 49 4e 54 46 28 22 4e 65 77 20 50 49 4e 20  PRINTF("New PIN 
26010 76 61 6c 75 65 20 69 73 20 77 72 6f 6e 67 20 28  value is wrong (
26020 65 69 74 68 65 72 20 4e 55 4c 4c 2c 20 6f 72 20  either NULL, or 
26030 74 6f 6f 20 6c 6f 6e 67 2f 73 68 6f 72 74 29 2e  too long/short).
26040 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  ");....cackey_mu
26050 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
26060 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
26070 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
26080 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
26090 28 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3c 20 35  (ulNewPinLen < 5
260a0 20 7c 7c 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 20   || ulNewPinLen 
260b0 3e 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  > 8) {...CACKEY_
260c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65  DEBUG_PRINTF("Ne
260d0 77 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 20  w PIN length is 
260e0 77 72 6f 6e 67 3a 20 25 6c 75 2c 20 6d 75 73 74  wrong: %lu, must
260f0 20 62 65 20 61 74 6c 65 61 73 74 20 35 20 61 6e   be atleast 5 an
26100 64 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 38  d no more than 8
26110 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
26120 6e 67 29 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29  ng) ulNewPinLen)
26130 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
26140 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26150 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
26160 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 45 4e 5f  urn(CKR_PIN_LEN_
26170 52 41 4e 47 45 29 3b 0a 09 7d 0a 0a 09 73 65 74  RANGE);..}...set
26180 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  _pin_ret = cacke
26190 79 5f 73 65 74 5f 70 69 6e 28 26 63 61 63 6b 65  y_set_pin(&cacke
261a0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
261b0 20 70 4f 6c 64 50 69 6e 2c 20 75 6c 4f 6c 64 50   pOldPin, ulOldP
261c0 69 6e 4c 65 6e 2c 20 70 4e 65 77 50 69 6e 2c 20  inLen, pNewPin, 
261d0 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09  ulNewPinLen);...
261e0 69 66 20 28 73 65 74 5f 70 69 6e 5f 72 65 74 20  if (set_pin_ret 
261f0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
26200 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  _OK) {...if (cac
26210 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
26220 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61  == NULL) {....ca
26230 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
26240 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c  D].token_flags |
26250 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
26260 49 52 45 44 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  IRED;...}....if 
26270 28 73 65 74 5f 70 69 6e 5f 72 65 74 20 3d 3d 20  (set_pin_ret == 
26280 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
26290 43 4b 45 44 29 20 7b 0a 09 09 09 63 61 63 6b 65  CKED) {....cacke
262a0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
262b0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
262c0 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b  KF_USER_PIN_LOCK
262d0 45 44 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  ED;...}..}...mut
262e0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
262f0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
26300 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
26310 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
26320 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
26330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26340 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
26350 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
26360 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
26370 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
26380 0a 09 73 77 69 74 63 68 20 28 73 65 74 5f 70 69  ..switch (set_pi
26390 6e 5f 72 65 74 29 20 7b 0a 09 09 63 61 73 65 20  n_ret) {...case 
263a0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
263b0 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
263c0 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73  G_PRINTF("Succes
263d0 73 66 75 6c 6c 79 20 73 65 74 20 50 49 4e 2e 22  sfully set PIN."
263e0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
263f0 52 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20 43 41  R_OK);...case CA
26400 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
26410 49 4e 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  IN:....CACKEY_DE
26420 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
26430 77 61 73 20 69 6e 76 61 6c 69 64 2e 22 29 3b 0a  was invalid.");.
26440 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
26450 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 63  IN_INVALID);...c
26460 61 73 65 20 43 41 43 4b 45 59 5f 50 43 53 43 5f  ase CACKEY_PCSC_
26470 45 5f 4c 4f 43 4b 45 44 3a 0a 09 09 09 43 41 43  E_LOCKED:....CAC
26480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26490 28 22 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65  ("Token is locke
264a0 64 20 6f 72 20 74 68 69 73 20 63 68 61 6e 67 65  d or this change
264b0 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65   is not permitte
264c0 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  d.");.....return
264d0 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29  (CKR_PIN_LOCKED)
264e0 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ;...default:....
264f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26500 4e 54 46 28 22 53 6f 6d 65 74 68 69 6e 67 20 65  NTF("Something e
26510 6c 73 65 20 77 65 6e 74 20 77 72 6f 6e 67 20 63  lse went wrong c
26520 68 61 6e 67 69 6e 67 20 74 68 65 20 50 49 4e 3a  hanging the PIN:
26530 20 25 69 22 2c 20 73 65 74 5f 70 69 6e 5f 72 65   %i", set_pin_re
26540 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  t);.....return(C
26550 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
26560 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43  );..}...return(C
26570 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
26580 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
26590 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
265a0 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43  C_OpenSession)(C
265b0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
265c0 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  , CK_FLAGS flags
265d0 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41  , CK_VOID_PTR pA
265e0 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e  pplication, CK_N
265f0 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b  OTIFY notify, CK
26600 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
26610 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b  PTR phSession) {
26620 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
26630 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
26640 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75  retval;..int fou
26650 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a  nd_session = 0;.
26660 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26670 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
26680 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26  ;...if ((flags &
26690 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53   CKF_SERIAL_SESS
266a0 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49  ION) != CKF_SERI
266b0 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09  AL_SESSION) {...
266c0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
266d0 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f  ON_PARALLEL_NOT_
266e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a  SUPPORTED);..}..
266f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
26700 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
26710 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26720 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
26730 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
26740 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
26750 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
26760 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
26770 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
26780 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
26790 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
267a0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
267b0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
267c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
267d0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
267e0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
267f0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
26800 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
26810 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
26820 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
26830 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
26840 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
26850 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
26860 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26870 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
26880 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
26890 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
268a0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
268b0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
268c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
268d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
268e0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
268f0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
26900 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
26910 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26920 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
26930 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
26940 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
26950 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
26960 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
26970 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26980 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26990 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
269a0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
269b0 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79  ;..}.../* Verify
269c0 20 74 68 61 74 20 74 68 65 20 63 61 72 64 20 69   that the card i
269d0 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68  s actually in th
269e0 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58  e slot. */../* X
269f0 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b  XX: Check to mak
26a00 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 69  e sure this is i
26a10 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 73 70  n the PKCS#11 sp
26a20 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09  ecification */..
26a30 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
26a40 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
26a50 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
26a60 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
26a70 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
26a80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26a90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26aa0 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74  Card not present
26ab0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  .  Returning CKR
26ac0 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22  _DEVICE_REMOVED"
26ad0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
26ae0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
26af0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
26b00 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f  turn(CKR_DEVICE_
26b10 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66  REMOVED);..}...f
26b20 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78  or (idx = 1; idx
26b30 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
26b40 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
26b50 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
26b60 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
26b70 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65  ) {...if (!cacke
26b80 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
26b90 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75  active) {....fou
26ba0 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a  nd_session = 1;.
26bb0 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d  ....*phSession =
26bc0 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79   idx;.....cackey
26bd0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
26be0 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61  ctive = 1;....ca
26bf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
26c00 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74  x].slotID = slot
26c10 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ID;....cackey_se
26c20 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74  ssions[idx].stat
26c30 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49  e = CKS_RO_PUBLI
26c40 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61  C_SESSION;....ca
26c50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
26c60 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  x].flags = flags
26c70 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
26c80 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69  ions[idx].ulDevi
26c90 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09  ceError = 0;....
26ca0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26cb0 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f  idx].pApplicatio
26cc0 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e  n = pApplication
26cd0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
26ce0 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79  ions[idx].Notify
26cf0 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63   = notify;.....c
26d00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
26d10 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  dx].identities =
26d20 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79   NULL;....cackey
26d30 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
26d40 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
26d50 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
26d60 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65  sessions[idx].se
26d70 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b  arch_active = 0;
26d80 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
26d90 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61  ions[idx].sign_a
26da0 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63  ctive = 0;.....c
26db0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
26dc0 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  dx].decrypt_acti
26dd0 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
26de0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
26df0 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  .identities = ca
26e00 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
26e10 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ties(&cackey_slo
26e20 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63  ts[slotID], &cac
26e30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
26e40 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
26e50 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b  nt);......break;
26e60 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
26e70 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
26e80 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26e90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
26ea0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
26eb0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
26ec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26ed0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
26ee0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
26ef0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
26f00 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
26f10 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f  f (!found_sessio
26f20 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
26f30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
26f40 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f  rning CKR_SESSIO
26f50 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43  N_COUNT (%i)", C
26f60 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54  KR_SESSION_COUNT
26f70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26f80 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b  _SESSION_COUNT);
26f90 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
26fa0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
26fb0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
26fc0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
26fd0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
26fe0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
26ff0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f  ION(CK_RV, C_Clo
27000 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45  seSession)(CK_SE
27010 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27020 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  ssion) {..int mu
27030 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
27040 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27050 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
27060 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
27070 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
27080 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27090 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
270a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
270b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
270c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
270d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
270e0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
270f0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
27100 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
27110 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
27120 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
27130 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
27140 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27150 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
27160 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
27170 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
27180 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
27190 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
271a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
271b0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
271c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
271d0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
271e0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
271f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27200 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
27210 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
27220 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
27230 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
27240 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
27250 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
27260 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
27270 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
27280 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
27290 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
272a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
272b0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
272c0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
272d0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
272e0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
272f0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
27300 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
27310 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  ive = 0;..cackey
27320 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
27330 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
27340 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
27350 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65  ities, cackey_se
27360 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27370 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
27380 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  t);...mutex_retv
27390 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
273a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
273b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
273c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
273d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
273e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
273f0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
27400 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
27410 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
27420 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
27430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27440 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
27450 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
27460 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
27470 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
27480 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
27490 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
274a0 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  ns)(CK_SLOT_ID s
274b0 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32  lotID) {..uint32
274c0 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  _t idx;..int mut
274d0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
274e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
274f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
27500 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
27510 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
27520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27530 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
27540 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
27550 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
27560 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
27570 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
27580 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
27590 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
275a0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
275b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
275c0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
275d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
275e0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
275f0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
27600 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
27610 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
27620 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
27630 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
27640 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
27650 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
27660 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
27670 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27680 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
27690 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
276a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
276b0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
276c0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
276d0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
276e0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
276f0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
27700 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
27710 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
27720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27730 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
27740 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
27750 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
27760 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
27770 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
27780 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
27790 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
277a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
277b0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
277c0 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
277d0 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
277e0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
277f0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
27800 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
27810 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
27820 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27830 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
27840 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
27850 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49  sions[idx].slotI
27860 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09  D != slotID) {..
27870 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
27880 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  }.....cackey_mut
27890 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
278a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f  _biglock);....C_
278b0 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78  CloseSession(idx
278c0 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
278d0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
278e0 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a  iglock);...}..}.
278f0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
27900 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
27910 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27920 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
27930 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
27940 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27950 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
27960 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
27970 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27980 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27990 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
279a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
279b0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
279c0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
279d0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
279e0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
279f0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
27a00 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b  tSessionInfo)(CK
27a10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
27a20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53  hSession, CK_SES
27a30 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49  SION_INFO_PTR pI
27a40 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  nfo) {..int mute
27a50 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
27a60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27a70 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
27a80 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
27a90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27aa0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27ab0 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
27ac0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27ad0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
27ae0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
27af0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
27b00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27b10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27b20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
27b30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27b40 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
27b50 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
27b60 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
27b70 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
27b80 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
27b90 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
27ba0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
27bb0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
27bc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27bd0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
27be0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
27bf0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
27c00 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
27c10 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
27c20 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
27c30 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
27c40 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27c50 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
27c60 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
27c70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27c80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
27c90 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
27ca0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
27cb0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
27cc0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
27cd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27ce0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
27cf0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27d00 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27d10 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
27d20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27d30 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
27d40 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
27d50 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
27d60 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
27d70 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  D);..}...pInfo->
27d80 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
27d90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27da0 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66  n].slotID;..pInf
27db0 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65  o->state = cacke
27dc0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27dd0 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e  ion].state;..pIn
27de0 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b  fo->flags = cack
27df0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
27e00 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49  sion].flags;..pI
27e10 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72  nfo->ulDeviceErr
27e20 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  or = cackey_sess
27e30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75  ions[hSession].u
27e40 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09  lDeviceError;...
27e50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
27e60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27e70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27e80 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
27e90 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
27ea0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27eb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
27ec0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
27ed0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27ee0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
27ef0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
27f00 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
27f10 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
27f20 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
27f30 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
27f40 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
27f50 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f  ON(CK_RV, C_GetO
27f60 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
27f70 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
27f80 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
27f90 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
27fa0 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
27fb0 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f  _PTR pulOperatio
27fc0 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41  nStateLen) {..CA
27fd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27fe0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
27ff0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
28000 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
28010 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28020 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
28030 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
28040 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
28050 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
28060 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
28070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28080 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
28090 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
280a0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
280b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
280c0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
280d0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
280e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
280f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
28100 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
28110 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
28120 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
28130 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
28140 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61  _BYTE_PTR pOpera
28150 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c  tionState, CK_UL
28160 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53  ONG ulOperationS
28170 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45  tateLen, CK_OBJE
28180 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79  CT_HANDLE hEncry
28190 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ptionKey, CK_OBJ
281a0 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68  ECT_HANDLE hAuth
281b0 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b  enticationKey) {
281c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
281d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
281e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
281f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
28200 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28210 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
28220 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
28230 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
28240 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
28250 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
28260 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28270 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
28280 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
28290 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
282a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
282b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
282c0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
282d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
282e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
282f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
28300 20 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67   C_LoginMutexArg
28310 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
28320 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
28330 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54  _USER_TYPE userT
28340 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ype, CK_UTF8CHAR
28350 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
28360 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 69 6e  ONG ulPinLen, in
28370 74 20 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a  t lock_mutex) {.
28380 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
28390 49 44 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ID;..cackey_ret 
283a0 67 65 74 5f 70 69 6e 5f 72 65 74 3b 0a 09 63 68  get_pin_ret;..ch
283b0 61 72 20 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09  ar pinbuf[64];..
283c0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
283d0 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
283e0 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67  aining;..int log
283f0 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  in_ret;...CACKEY
28400 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
28410 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
28420 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
28430 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
28440 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28450 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
28460 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
28470 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
28480 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
28490 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
284a0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
284b0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
284c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
284d0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
284e0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
284f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28500 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28510 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
28520 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
28530 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
28540 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
28550 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65  D);..}...if (use
28560 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45  rType != CKU_USE
28570 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  R) {...CACKEY_DE
28580 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28590 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  r.  We only supp
285a0 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61  ort USER mode, a
285b0 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64  sked for %lu mod
285c0 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  e.", (unsigned l
285d0 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a  ong) userType)..
285e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45  ..return(CKR_USE
285f0 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b  R_TYPE_INVALID);
28600 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d  ..}...if (lock_m
28610 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f  utex) {...mutex_
28620 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
28630 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
28640 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66  y_biglock);...if
28650 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
28660 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
28670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28680 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
28690 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
286a0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
286b0 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a  _ERROR);...}..}.
286c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
286d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
286e0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 69 66 20  .active) {...if 
286f0 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09  (lock_mutex) {..
28700 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
28710 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
28720 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  lock);...}....CA
28730 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28740 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
28750 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
28760 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28770 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
28780 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
28790 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
287a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
287b0 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
287c0 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
287d0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
287e0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
287f0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
28800 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
28810 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28820 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
28830 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
28840 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
28850 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
28860 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66  , slotID);....if
28870 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a   (lock_mutex) {.
28880 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
28890 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
288a0 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72  glock);...}....r
288b0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
288c0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
288d0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
288e0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
288f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
28900 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28910 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
28920 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
28930 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
28940 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
28950 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c  lotID);....if (l
28960 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ock_mutex) {....
28970 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
28980 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
28990 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ck);...}....retu
289a0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
289b0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
289c0 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
289d0 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd != NULL) {...
289e0 69 66 20 28 70 50 69 6e 20 21 3d 20 4e 55 4c 4c  if (pPin != NULL
289f0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
28a00 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74  BUG_PRINTF("Prot
28a10 65 63 74 65 64 20 61 75 74 68 65 6e 74 69 63 61  ected authentica
28a20 74 69 6f 6e 20 70 61 74 68 20 69 6e 20 65 66 66  tion path in eff
28a30 65 63 74 20 61 6e 64 20 50 49 4e 20 70 72 6f 76  ect and PIN prov
28a40 69 64 65 64 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a  ided !?");...}..
28a50 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20  ..get_pin_ret = 
28a60 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 70  cackey_get_pin(p
28a70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67  inbuf);....if (g
28a80 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41  et_pin_ret != CA
28a90 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
28aa0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
28ab0 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
28ac0 5f 67 65 74 5f 70 69 6e 28 29 20 72 65 74 75 72  _get_pin() retur
28ad0 6e 65 64 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ned in failure, 
28ae0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 50 49 4e  assuming the PIN
28af0 20 77 61 73 20 69 6e 63 6f 72 72 65 63 74 2e 22   was incorrect."
28b00 29 3b 0a 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f  );.....if (lock_
28b10 6d 75 74 65 78 29 20 7b 0a 09 09 09 09 63 61 63  mutex) {.....cac
28b20 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
28b30 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28b40 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72  ;....}.....retur
28b50 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
28b60 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 50 69  ECT);...}....pPi
28b70 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52  n = (CK_UTF8CHAR
28b80 5f 50 54 52 29 20 70 69 6e 62 75 66 3b 0a 09 09  _PTR) pinbuf;...
28b90 75 6c 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65  ulPinLen = strle
28ba0 6e 28 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09  n(pinbuf);..}...
28bb0 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  login_ret = cack
28bc0 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79  ey_login(&cackey
28bd0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
28be0 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20  pPin, ulPinLen, 
28bf0 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  &tries_remaining
28c00 2c 20 33 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e  , 3);..if (login
28c10 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
28c20 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66  CSC_S_OK) {...if
28c30 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a   (lock_mutex) {.
28c40 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
28c50 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
28c60 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 69  glock);...}....i
28c70 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20  f (login_ret == 
28c80 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
28c90 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CKED) {....CACKE
28ca0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28cb0 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73  Error.  Token is
28cc0 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09   locked.");.....
28cd0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
28ce0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
28cf0 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e   |= CKF_USER_PIN
28d00 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 43 41 43  _LOCKED;.....CAC
28d10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28d20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
28d30 50 49 4e 5f 4c 4f 43 4b 45 44 20 28 25 69 29 22  PIN_LOCKED (%i)"
28d40 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f  , (int) CKR_PIN_
28d50 4c 4f 43 4b 45 44 29 3b 0a 0a 09 09 09 72 65 74  LOCKED);.....ret
28d60 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b  urn(CKR_PIN_LOCK
28d70 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66  ED);...} else if
28d80 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43   (login_ret == C
28d90 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
28da0 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  PIN) {....CACKEY
28db0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28dc0 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50  rror.  Invalid P
28dd0 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  IN.");.....cacke
28de0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
28df0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
28e00 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
28e10 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74  T_LOW;.....if (t
28e20 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d  ries_remaining =
28e30 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  = 1) {.....cacke
28e40 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
28e50 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
28e60 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41  KF_USER_PIN_FINA
28e70 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09  L_TRY;....}.....
28e80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28e90 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
28ea0 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
28eb0 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b   (%i)", (int) CK
28ec0 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
28ed0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
28ee0 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
28ef0 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
28f00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28f10 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72  or.  Unknown err
28f20 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  or returned from
28f30 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20   cackey_login() 
28f40 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74  (%i)", login_ret
28f50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28f60 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
28f70 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f  ..}...cackey_slo
28f80 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
28f90 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f  _flags &= ~(CKF_
28fa0 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20  USER_PIN_LOCKED 
28fb0 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43  | CKF_USER_PIN_C
28fc0 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c  OUNT_LOW | CKF_L
28fd0 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20  OGIN_REQUIRED | 
28fe0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e  CKF_USER_PIN_FIN
28ff0 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65  AL_TRY);...cacke
29000 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29010 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  ion].state = CKS
29020 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f  _RO_USER_FUNCTIO
29030 4e 53 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d  NS;...if (lock_m
29040 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f  utex) {...mutex_
29050 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
29060 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
29070 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
29080 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
29090 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
290a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
290b0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
290c0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
290d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
290e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d  ERAL_ERROR);...}
290f0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29100 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29110 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
29120 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
29130 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
29140 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
29150 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67  ION(CK_RV, C_Log
29160 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  in)(CK_SESSION_H
29170 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
29180 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65  CK_USER_TYPE use
29190 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48  rType, CK_UTF8CH
291a0 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
291b0 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20  ULONG ulPinLen) 
291c0 7b 0a 09 72 65 74 75 72 6e 28 43 5f 4c 6f 67 69  {..return(C_Logi
291d0 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69  nMutexArg(hSessi
291e0 6f 6e 2c 20 75 73 65 72 54 79 70 65 2c 20 70 50  on, userType, pP
291f0 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 31 29  in, ulPinLen, 1)
29200 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
29210 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
29220 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53  C_Logout)(CK_SES
29230 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
29240 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  sion) {..CK_SLOT
29250 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74  _ID slotID;..int
29260 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
29270 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29280 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
29290 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
292a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
292b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
292c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
292d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
292e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
292f0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
29300 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
29310 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
29320 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
29330 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
29340 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
29350 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
29360 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
29370 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29380 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
29390 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
293a0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
293b0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
293c0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
293d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
293e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
293f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
29400 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
29410 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
29420 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29430 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
29440 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
29450 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
29460 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
29470 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
29480 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29490 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
294a0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
294b0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
294c0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
294d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
294e0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
294f0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
29500 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
29510 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
29520 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
29530 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29540 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
29550 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
29560 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
29570 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
29580 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
29590 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
295a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
295b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
295c0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
295d0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
295e0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
295f0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
29600 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
29610 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
29620 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
29630 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
29640 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
29650 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29660 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
29670 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
29680 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
29690 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
296a0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
296b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
296c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
296d0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
296e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
296f0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
29700 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29710 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
29720 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b  _PUBLIC_SESSION;
29730 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69  ...if (cackey_pi
29740 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c  n_command == NUL
29750 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  L) {...cackey_sl
29760 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
29770 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f  n_flags = CKF_LO
29780 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d  GIN_REQUIRED;..}
29790 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79   else {...cackey
297a0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
297b0 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
297c0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
297d0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
297e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
297f0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
29800 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
29810 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29820 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29830 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
29840 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29850 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
29860 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
29870 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29880 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
29890 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
298a0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
298b0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
298c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
298d0 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43  _CreateObject)(C
298e0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
298f0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54   hSession, CK_AT
29900 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
29910 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
29920 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  ulCount, CK_OBJE
29930 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
29940 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45  Object) {..CACKE
29950 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29960 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
29970 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
29980 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
29990 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
299a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
299b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
299c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
299d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
299e0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
299f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
29a00 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
29a10 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29a20 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
29a30 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29a40 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
29a50 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29a60 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
29a70 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
29a80 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79  ON(CK_RV, C_Copy
29a90 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49  Object)(CK_SESSI
29aa0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29ab0 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
29ac0 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
29ad0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
29ae0 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
29af0 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f  NG ulCount, CK_O
29b00 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
29b10 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a   phNewObject) {.
29b20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29b30 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
29b40 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
29b50 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
29b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29b70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
29b80 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
29b90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
29ba0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
29bb0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
29bc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29bd0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
29be0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29bf0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
29c00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29c10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
29c20 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
29c30 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29c40 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
29c50 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
29c60 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29  C_DestroyObject)
29c70 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
29c80 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
29c90 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
29ca0 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
29cb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
29cc0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
29cd0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
29ce0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
29cf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29d00 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
29d10 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
29d20 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
29d30 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
29d40 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
29d50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
29d60 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
29d70 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29d80 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
29d90 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29da0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
29db0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29dc0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
29dd0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
29de0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62  N(CK_RV, C_GetOb
29df0 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53  jectSize)(CK_SES
29e00 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
29e10 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
29e20 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
29e30 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
29e40 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f  Size) {..CACKEY_
29e50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
29e60 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
29e70 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
29e80 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
29e90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29ea0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
29eb0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
29ec0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
29ed0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
29ee0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
29ef0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29f00 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
29f10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29f20 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
29f30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29f40 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
29f50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29f60 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
29f70 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
29f80 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74  (CK_RV, C_GetAtt
29f90 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f  ributeValue)(CK_
29fa0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
29fb0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
29fc0 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
29fd0 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
29fe0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
29ff0 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29  K_ULONG ulCount)
2a000 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45   {..CK_ATTRIBUTE
2a010 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74   *curr_attr;..st
2a020 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
2a030 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a  tity *identity;.
2a040 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
2a050 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74  dentity_idx, att
2a060 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72  r_idx, sess_attr
2a070 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09  _idx, num_ids;..
2a080 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2a090 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
2a0a0 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f  = CKR_OK;..CK_VO
2a0b0 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
2a0c0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
2a0d0 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  Len;...CACKEY_DE
2a0e0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2a0f0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2a100 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2a110 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a120 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a130 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2a140 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a150 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2a160 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2a170 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
2a180 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
2a190 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
2a1a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
2a1b0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2a1c0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
2a1d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a1e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2a1f0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
2a200 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2a210 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2a220 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2a230 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63  ..}...if (hObjec
2a240 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
2a250 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a260 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20  "Error.  Object 
2a270 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
2a280 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2a290 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48  urn(CKR_OBJECT_H
2a2a0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2a2b0 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74  .}...if (ulCount
2a2c0 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
2a2d0 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20  ort circuit, if 
2a2e0 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72  zero objects wer
2a2f0 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75  e specified retu
2a300 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d  rn zero items im
2a310 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43  mediately */...C
2a320 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a330 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a340 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
2a350 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
2a360 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
2a370 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
2a380 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55  (pTemplate == NU
2a390 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
2a3a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a3b0 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69  or.  pTemplate i
2a3c0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
2a3d0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2a3e0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64  TS_BAD);..}...id
2a3f0 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62  entity_idx = hOb
2a400 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65  ject - 1;...mute
2a410 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2a420 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2a430 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2a440 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2a450 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2a460 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a470 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2a480 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2a490 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2a4a0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2a4b0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2a4c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2a4d0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2a4e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2a4f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2a500 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a510 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2a520 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2a530 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2a540 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2a550 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2a560 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b  ..num_ids = cack
2a570 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a580 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2a590 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64  _count;...if (id
2a5a0 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75  entity_idx >= nu
2a5b0 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65  m_ids) {...cacke
2a5c0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2a5d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2a5e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a5f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a600 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75  Object handle ou
2a610 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65  t of range.  ide
2a620 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c  ntity_idx = %lu,
2a630 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22   num_ids = %lu."
2a640 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2a650 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20  ) identity_idx, 
2a660 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2a670 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74  num_ids);....ret
2a680 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48  urn(CKR_OBJECT_H
2a690 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2a6a0 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20  .}...identity = 
2a6b0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
2a6c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2a6d0 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69  ities[identity_i
2a6e0 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72  dx];...for (attr
2a6f0 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69  _idx = 0; attr_i
2a700 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74  dx < ulCount; at
2a710 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75  tr_idx++) {...cu
2a720 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70  rr_attr = &pTemp
2a730 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a  late[attr_idx];.
2a740 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
2a750 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ;...ulValueLen =
2a760 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a   (CK_LONG) -1;..
2a770 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a780 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66  RINTF("Looking f
2a790 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78 25  or attribute 0x%
2a7a0 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25  08lx (identity:%
2a7b0 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lu) ...", (unsig
2a7c0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
2a7d0 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69  ttr->type, (unsi
2a7e0 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74  gned long) ident
2a7f0 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72  ity_idx);....for
2a800 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20   (sess_attr_idx 
2a810 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  = 0; sess_attr_i
2a820 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61  dx < identity->a
2a830 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
2a840 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b   sess_attr_idx++
2a850 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74  ) {....if (ident
2a860 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
2a870 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74  sess_attr_idx].t
2a880 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72  ype == curr_attr
2a890 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41  ->type) {.....CA
2a8a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a8b0 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74  F(" ... found it
2a8c0 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75  , pValue = %p, u
2a8d0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22  lValueLen = %lu"
2a8e0 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  , identity->attr
2a8f0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
2a900 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64  _idx].pValue, id
2a910 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
2a920 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
2a930 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  ].ulValueLen);..
2a940 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  ........pValue =
2a950 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
2a960 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
2a970 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09  idx].pValue;....
2a980 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64  .ulValueLen = id
2a990 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
2a9a0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
2a9b0 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09  ].ulValueLen;...
2a9c0 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75  .}...}....if (cu
2a9d0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20  rr_attr->pValue 
2a9e0 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  && pValue) {....
2a9f0 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75  if (curr_attr->u
2aa00 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56  lValueLen >= ulV
2aa10 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d  alueLen) {.....m
2aa20 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d  emcpy(curr_attr-
2aa30 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c  >pValue, pValue,
2aa40 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09   ulValueLen);...
2aa50 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c  .} else {.....ul
2aa60 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
2aa70 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65  ONG) -1;......re
2aa80 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
2aa90 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09  R_TOO_SMALL;....
2aaa0 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74  }...}....curr_at
2aab0 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  tr->ulValueLen =
2aac0 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a   ulValueLen;..}.
2aad0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2aae0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2aaf0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2ab00 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2ab10 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2ab20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ab30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2ab40 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2ab50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2ab60 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2ab70 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61  ;..}...if (retva
2ab80 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55  l == CKR_ATTRIBU
2ab90 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29  TE_TYPE_INVALID)
2aba0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2abb0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2abc0 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54  ing CKR_ATTRIBUT
2abd0 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28  E_TYPE_INVALID (
2abe0 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
2abf0 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  al);..} else if 
2ac00 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42  (retval == CKR_B
2ac10 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
2ac20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2ac30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2ac40 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  ing CKR_BUFFER_T
2ac50 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20  OO_SMALL (%i)", 
2ac60 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
2ac70 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61  } else if (retva
2ac80 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l == CKR_OK) {..
2ac90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2aca0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2acb0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69  CKR_OK (%i)", (i
2acc0 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20  nt) retval);..} 
2acd0 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f  else {...CACKEY_
2ace0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2acf0 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e  turning %i", (in
2ad00 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  t) retval);..}..
2ad10 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
2ad20 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2ad30 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2ad40 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  SetAttributeValu
2ad50 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2ad60 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2ad70 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2ad80 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52  hObject, CK_ATTR
2ad90 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
2ada0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
2adb0 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59  Count) {..CACKEY
2adc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2add0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2ade0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2adf0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2ae00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ae10 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2ae20 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2ae30 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2ae40 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2ae50 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2ae60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2ae70 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2ae80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2ae90 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2aea0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2aeb0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2aec0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2aed0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2aee0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2aef0 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f  N(CK_RV, C_FindO
2af00 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53  bjectsInit)(CK_S
2af10 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2af20 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49  ession, CK_ATTRI
2af30 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
2af40 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
2af50 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  ount) {..CK_SLOT
2af60 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f  _ID slotID;..CK_
2af70 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20  ULONG idx;..int 
2af80 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
2af90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2afa0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2afb0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2afc0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2afd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2afe0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2aff0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2b000 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2b010 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2b020 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2b030 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2b040 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2b050 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2b060 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2b070 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2b080 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2b090 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b0a0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2b0b0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2b0c0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2b0d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2b0e0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
2b0f0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2b100 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2b110 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2b120 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2b130 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2b140 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b150 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2b160 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2b170 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2b180 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2b190 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2b1a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2b1b0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2b1c0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2b1d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2b1e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b1f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2b200 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2b210 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2b220 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2b230 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2b240 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
2b250 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b260 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
2b270 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2b280 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2b290 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2b2a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b2b0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
2b2c0 68 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  h already active
2b2d0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2b2e0 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41  (CKR_OPERATION_A
2b2f0 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  CTIVE);..}...slo
2b300 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
2b310 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b320 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
2b330 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
2b340 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
2b350 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
2b360 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
2b370 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2b380 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b390 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
2b3a0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
2b3b0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
2b3c0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
2b3d0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
2b3e0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2b3f0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
2b400 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2b410 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
2b420 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2b430 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2b440 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
2b450 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
2b460 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
2b470 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
2b480 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
2b490 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2b4a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
2b4b0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2b4c0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2b4d0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
2b4e0 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73  slotID].slot_res
2b4f0 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  et) {...CACKEY_D
2b500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65  EBUG_PRINTF("The
2b510 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72   slot has been r
2b520 65 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61  eset since we la
2b530 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64  st looked for id
2b540 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63  entities -- resc
2b550 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20  anning");....if 
2b560 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2b570 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2b580 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
2b590 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
2b5a0 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65  identities(cacke
2b5b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b5c0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c  ion].identities,
2b5d0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2b5e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2b5f0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
2b600 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2b610 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2b620 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09  tities = NULL;..
2b630 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2b640 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2b650 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30  tities_count = 0
2b660 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
2b670 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
2b680 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29  ].label != NULL)
2b690 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
2b6a0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
2b6b0 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65  label);....cacke
2b6c0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
2b6d0 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
2b6e0 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  }....cackey_mark
2b6f0 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63  _slot_reset(&cac
2b700 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
2b710 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ]);...cackey_slo
2b720 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f  ts[slotID].slot_
2b730 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09  reset = 0;..}...
2b740 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2b750 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2b760 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c  entities == NULL
2b770 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
2b780 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b790 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
2b7a0 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
2b7b0 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ies(&cackey_slot
2b7c0 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b  s[slotID], &cack
2b7d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b7e0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2b7f0 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66  _count);..}...if
2b800 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e   (pTemplate != N
2b810 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43  ULL) {...if (ulC
2b820 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  ount != 0) {....
2b830 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b840 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2b850 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75  _query_count = u
2b860 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65  lCount;....cacke
2b870 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b880 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2b890 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75  y = malloc(ulCou
2b8a0 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
2b8b0 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65  mplate));.....me
2b8c0 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73  mcpy(cackey_sess
2b8d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b8e0 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65  earch_query, pTe
2b8f0 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20  mplate, ulCount 
2b900 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c  * sizeof(*pTempl
2b910 61 74 65 29 29 3b 0a 09 09 09 66 6f 72 20 28 69  ate));....for (i
2b920 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c  dx = 0; idx < ul
2b930 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a  Count; idx++) {.
2b940 09 09 09 09 69 66 20 28 70 54 65 6d 70 6c 61 74  ....if (pTemplat
2b950 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  e[idx].ulValueLe
2b960 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 63  n == 0) {......c
2b970 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b980 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2b990 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
2b9a0 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09  e = NULL;.......
2b9b0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a  continue;.....}.
2b9c0 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
2b9d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b9e0 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
2b9f0 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63  .pValue = malloc
2ba00 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e  (pTemplate[idx].
2ba10 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
2ba20 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
2ba30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ba40 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78  search_query[idx
2ba50 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09  ].pValue) {.....
2ba60 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
2ba70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2ba80 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
2ba90 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d  dx].pValue, pTem
2baa0 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75  plate[idx].pValu
2bab0 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78  e, pTemplate[idx
2bac0 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  ].ulValueLen);..
2bad0 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  ...}....}...} el
2bae0 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73  se {....cackey_s
2baf0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2bb00 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
2bb10 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63  ount = 0;....cac
2bb20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bb30 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2bb40 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  ery = NULL;...}.
2bb50 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
2bb60 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
2bb70 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2bb80 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2bb90 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b  glock);.....CACK
2bba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bbb0 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
2bbc0 71 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20  query specified 
2bbd0 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d  as NULL, but num
2bbe0 62 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72  ber of query ter
2bbf0 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  ms not specified
2bc00 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65   as 0.");.....re
2bc10 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2bc20 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09  TS_BAD);...}....
2bc30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2bc40 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2bc50 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30  _query_count = 0
2bc60 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
2bc70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2bc80 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c  arch_query = NUL
2bc90 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  L;..}...cackey_s
2bca0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2bcb0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
2bcc0 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  = 1;..cackey_ses
2bcd0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2bce0 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d  search_curr_id =
2bcf0 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76   0;...mutex_retv
2bd00 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2bd10 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2bd20 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2bd30 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2bd40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2bd50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2bd60 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2bd70 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2bd80 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2bd90 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2bda0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bdb0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2bdc0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2bdd0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2bde0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
2bdf0 20 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63   cackey_pkcs11_c
2be00 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65  ompare_attribute
2be10 73 28 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  s(CK_ATTRIBUTE *
2be20 61 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 20  a, CK_ATTRIBUTE 
2be30 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  *b) {..unsigned 
2be40 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20  char *smallbuf, 
2be50 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73 69 7a 65  *largebuf;..size
2be60 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c  _t smallbuf_len,
2be70 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a   largebuf_len;..
2be80 09 69 66 20 28 61 2d 3e 74 79 70 65 20 21 3d 20  .if (a->type != 
2be90 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72 65 74  b->type) {...ret
2bea0 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43  urn(0);..}...CAC
2beb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bec0 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20  ("    ... found 
2bed0 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e  matching type ..
2bee0 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
2bef0 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20  BUG_PRINTBUF("  
2bf00 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a    ... our value:
2bf10 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d  ", a->pValue, a-
2bf20 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  >ulValueLen);...
2bf30 69 66 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d  if (b->pValue ==
2bf40 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2bf50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bf60 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64         ... found
2bf70 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22   wildcard match"
2bf80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
2bf90 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61  ..}...if (a->pVa
2bfa0 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  lue == NULL) {..
2bfb0 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a  .return(0);..}..
2bfc0 20 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65   .if (b->ulValue
2bfd0 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75  Len == a->ulValu
2bfe0 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61  eLen && memcmp(a
2bff0 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61  ->pValue, b->pVa
2c000 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c  lue, b->ulValueL
2c010 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  en) == 0) {...CA
2c020 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c030 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
2c040 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68 22  und exact match"
2c050 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
2c060 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 61 2d  ..}...switch (a-
2c070 3e 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  >type) {...case 
2c080 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09  CKA_MODULUS:....
2c090 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  if (a->ulValueLe
2c0a0 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c  n == b->ulValueL
2c0b0 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  en) {.....break;
2c0c0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d  ....}.....if (a-
2c0d0 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d  >ulValueLen > b-
2c0e0 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09  >ulValueLen) {..
2c0f0 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d  ...smallbuf = b-
2c100 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61  >pValue;.....sma
2c110 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75  llbuf_len = b->u
2c120 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09  lValueLen;......
2c130 6c 61 72 67 65 62 75 66 20 3d 20 61 2d 3e 70 56  largebuf = a->pV
2c140 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62  alue;.....largeb
2c150 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61  uf_len = a->ulVa
2c160 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73  lueLen;....} els
2c170 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66  e {.....smallbuf
2c180 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = a->pValue;...
2c190 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d  ..smallbuf_len =
2c1a0 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   a->ulValueLen;.
2c1b0 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20  .....largebuf = 
2c1c0 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c  b->pValue;.....l
2c1d0 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d  argebuf_len = b-
2c1e0 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09  >ulValueLen;....
2c1f0 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61 72  }.....for (; lar
2c200 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61  gebuf_len != sma
2c210 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65  llbuf_len; large
2c220 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c  buf++,largebuf_l
2c230 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20 28  en--) {.....if (
2c240 6c 61 72 67 65 62 75 66 5b 30 5d 20 21 3d 20 30  largebuf[0] != 0
2c250 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ) {......break;.
2c260 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
2c270 66 20 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20  f (largebuf_len 
2c280 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29  != smallbuf_len)
2c290 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
2c2a0 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d  .}.....if (memcm
2c2b0 70 28 6c 61 72 67 65 62 75 66 2c 20 73 6d 61 6c  p(largebuf, smal
2c2c0 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c  lbuf, smallbuf_l
2c2d0 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  en) == 0) {.....
2c2e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c2f0 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20  NTF("       ... 
2c300 66 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d 61 74  found approximat
2c310 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09  e match");......
2c320 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a  return(1);....}.
2c330 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
2c340 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b  return(0);.}..CK
2c350 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2c360 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
2c370 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f  jects)(CK_SESSIO
2c380 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2c390 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
2c3a0 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74  DLE_PTR phObject
2c3b0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78  , CK_ULONG ulMax
2c3c0 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f  ObjectCount, CK_
2c3d0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a  ULONG_PTR pulObj
2c3e0 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72  ectCount) {..str
2c3f0 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
2c400 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43  ity *curr_id;..C
2c410 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
2c420 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e  r_attr;..CK_ULON
2c430 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63  G curr_id_idx, c
2c440 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20  urr_out_id_idx, 
2c450 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73  curr_attr_idx, s
2c460 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43  ess_attr_idx;..C
2c470 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f  K_ULONG matched_
2c480 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63  count, prev_matc
2c490 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20  hed_count;..int 
2c4a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23 69  mutex_retval;.#i
2c4b0 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
2c4c0 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45  G_SEARCH_SPEEDTE
2c4d0 53 54 0a 09 73 74 72 75 63 74 20 74 69 6d 65 76  ST..struct timev
2c4e0 61 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a 09  al start, end;..
2c4f0 75 69 6e 74 36 34 5f 74 20 73 74 61 72 74 5f 69  uint64_t start_i
2c500 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e  nt, end_int;.#en
2c510 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
2c520 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2c530 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2c540 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2c550 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c560 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c570 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2c580 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2c590 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2c5a0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2c5b0 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63  }...if (pulObjec
2c5c0 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  tCount == NULL) 
2c5d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2c5e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c5f0 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20   pulObjectCount 
2c600 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2c610 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2c620 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2c630 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e  f (phObject == N
2c640 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  ULL && ulMaxObje
2c650 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ctCount == 0) {.
2c660 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
2c670 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65  it, if zero obje
2c680 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69  cts were specifi
2c690 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69  ed return zero i
2c6a0 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  tems immediately
2c6b0 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74   */...*pulObject
2c6c0 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41  Count = 0;....CA
2c6d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c6e0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2c6f0 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
2c700 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
2c710 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
2c720 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
2c730 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c  phObject == NULL
2c740 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2c750 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c760 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e  .  phObject is N
2c770 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2c780 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2c790 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
2c7a0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20  lMaxObjectCount 
2c7b0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
2c7c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c7d0 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e  rror.  Maximum n
2c7e0 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
2c7f0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65   specified as ze
2c800 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ro.");....return
2c810 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2c820 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  AD);..}...if (hS
2c830 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
2c840 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
2c850 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2c860 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
2c870 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
2c880 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2c890 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c8a0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
2c8b0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
2c8c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2c8d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2c8e0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
2c8f0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2c900 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2c910 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2c920 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2c930 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2c940 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c950 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2c960 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2c970 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2c980 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2c990 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2c9a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2c9b0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2c9c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2c9d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2c9e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c9f0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2ca00 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2ca10 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2ca20 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2ca30 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2ca40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2ca50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ca60 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
2ca70 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2ca80 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2ca90 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2caa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2cab0 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
2cac0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2cad0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2cae0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
2caf0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69  IALIZED);..}..#i
2cb00 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
2cb10 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45  G_SEARCH_SPEEDTE
2cb20 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79  ST..gettimeofday
2cb30 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a  (&start, NULL);.
2cb40 23 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f 75  #endif...curr_ou
2cb50 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66  t_id_idx = 0;..f
2cb60 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20  or (curr_id_idx 
2cb70 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
2cb80 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2cb90 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72  ch_curr_id; curr
2cba0 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79  _id_idx < cackey
2cbb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cbc0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
2cbd0 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a  ount && ulMaxObj
2cbe0 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69  ectCount; curr_i
2cbf0 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72  d_idx++) {...cur
2cc00 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73  r_id = &cackey_s
2cc10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2cc20 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72  ].identities[cur
2cc30 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41  r_id_idx];....CA
2cc40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2cc50 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64  F("Processing id
2cc60 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e  entity:%lu", (un
2cc70 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
2cc80 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61  r_id_idx);....ma
2cc90 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b  tched_count = 0;
2cca0 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74  ....for (curr_at
2ccb0 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72  tr_idx = 0; curr
2ccc0 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b  _attr_idx < cack
2ccd0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2cce0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2ccf0 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61  ry_count; curr_a
2cd00 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
2cd10 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
2cd20 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75  nt = matched_cou
2cd30 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74  nt;.....curr_att
2cd40 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  r = &cackey_sess
2cd50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2cd60 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72  earch_query[curr
2cd70 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09  _attr_idx];.....
2cd80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cd90 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20  NTF("  Checking 
2cda0 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 25 73  for attribute %s
2cdb0 20 28 30 78 25 30 38 6c 78 29 20 69 6e 20 69 64   (0x%08lx) in id
2cdc0 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43  entity:%i...", C
2cdd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
2cde0 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54  _ATTRIBUTE_TO_ST
2cdf0 52 28 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  R(curr_attr->typ
2ce00 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  e), (unsigned lo
2ce10 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74  ng) curr_attr->t
2ce20 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  ype, (int) curr_
2ce30 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b  id_idx);....CACK
2ce40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
2ce50 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f  F("    Value loo
2ce60 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72  king for:", curr
2ce70 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63  _attr->pValue, c
2ce80 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
2ce90 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28  eLen);.....for (
2cea0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20  sess_attr_idx = 
2ceb0 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  0; sess_attr_idx
2cec0 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72   < curr_id->attr
2ced0 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65  ibutes_count; se
2cee0 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  ss_attr_idx++) {
2cef0 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
2cf00 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61  pkcs11_compare_a
2cf10 74 74 72 69 62 75 74 65 73 28 26 63 75 72 72 5f  ttributes(&curr_
2cf20 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
2cf30 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63  ess_attr_idx], c
2cf40 75 72 72 5f 61 74 74 72 29 29 20 7b 0a 09 09 09  urr_attr)) {....
2cf50 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b  ..matched_count+
2cf60 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  +;.......break;.
2cf70 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f  ....}....}...../
2cf80 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 62 75  * If the attribu
2cf90 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  te could not be 
2cfa0 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20  matched, do not 
2cfb0 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64  try to match add
2cfc0 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74  itional attribut
2cfd0 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65  es */....if (pre
2cfe0 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20  v_matched_count 
2cff0 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  == matched_count
2d000 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
2d010 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d  ..}...}....if (m
2d020 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20  atched_count == 
2d030 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2d040 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2d050 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a  _query_count) {.
2d060 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d070 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c  PRINTF("  ... Al
2d080 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 73 20  l %i attributes 
2d090 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e  checked for foun
2d0a0 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69  d, adding identi
2d0b0 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65  ty:%i to returne
2d0c0 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63  d list", (int) c
2d0d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d0e0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2d0f0 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e  query_count, (in
2d100 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
2d110 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75  .....phObject[cu
2d120 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d  rr_out_id_idx] =
2d130 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31   curr_id_idx + 1
2d140 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63  ;.....ulMaxObjec
2d150 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75  tCount--;.....cu
2d160 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b  rr_out_id_idx++;
2d170 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
2d180 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d190 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c  TF("  ... Not al
2d1a0 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64  l %i (only found
2d1b0 20 25 69 29 20 61 74 74 72 69 62 75 74 65 73 20   %i) attributes 
2d1c0 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e  checked for foun
2d1d0 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64  d, not adding id
2d1e0 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74  entity:%i", (int
2d1f0 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
2d200 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2d210 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20  ch_query_count, 
2d220 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f  (int) matched_co
2d230 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  unt, (int) curr_
2d240 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a  id_idx);...}..}.
2d250 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2d260 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2d270 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72  h_curr_id = curr
2d280 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62  _id_idx;..*pulOb
2d290 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72  jectCount = curr
2d2a0 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23 69  _out_id_idx;..#i
2d2b0 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
2d2c0 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45  G_SEARCH_SPEEDTE
2d2d0 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79  ST..gettimeofday
2d2e0 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73  (&end, NULL);..s
2d2f0 74 61 72 74 5f 69 6e 74 20 3d 20 28 73 74 61 72  tart_int = (star
2d300 74 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30  t.tv_sec * 10000
2d310 30 30 29 20 2b 20 73 74 61 72 74 2e 74 76 5f 75  00) + start.tv_u
2d320 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d 20  sec;..end_int = 
2d330 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31 30  (end.tv_sec * 10
2d340 30 30 30 30 30 29 20 2b 20 65 6e 64 2e 74 76 5f  00000) + end.tv_
2d350 75 73 65 63 3b 0a 09 66 70 72 69 6e 74 66 28 73  usec;..fprintf(s
2d360 74 64 65 72 72 2c 20 22 53 65 61 72 63 68 20 74  tderr, "Search t
2d370 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65 63  ook %lu microsec
2d380 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67 6e  onds\n", (unsign
2d390 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69 6e  ed long) (end_in
2d3a0 74 20 2d 20 73 74 61 72 74 5f 69 6e 74 29 29 3b  t - start_int));
2d3b0 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78 5f  .#endif...mutex_
2d3c0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2d3d0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2d3e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2d3f0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2d400 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2d410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d420 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2d430 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2d440 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2d450 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2d460 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d470 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2d480 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f  R_OK (%i), num o
2d490 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43  bjects = %lu", C
2d4a0 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63  KR_OK, *pulObjec
2d4b0 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72  tCount);...retur
2d4c0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
2d4d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2d4e0 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
2d4f0 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53  jectsFinal)(CK_S
2d500 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2d510 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c  ession) {..CK_UL
2d520 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  ONG idx;..int mu
2d530 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
2d540 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d550 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2d560 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2d570 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2d580 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d590 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2d5a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2d5b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2d5c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2d5d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
2d5e0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2d5f0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2d600 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2d610 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2d620 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2d630 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2d640 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d650 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2d660 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2d670 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2d680 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2d690 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
2d6a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2d6b0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2d6c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2d6d0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2d6e0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2d6f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d700 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2d710 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2d720 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2d730 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2d740 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2d750 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2d760 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2d770 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2d780 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2d790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d7a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2d7b0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2d7c0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2d7d0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2d7e0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2d7f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2d800 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d810 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
2d820 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2d830 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2d840 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2d850 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d860 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
2d870 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2d880 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2d890 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
2d8a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2d8b0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2d8c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2d8d0 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  h_active = 0;...
2d8e0 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
2d8f0 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
2d900 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2d910 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
2d920 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
2d930 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2d940 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2d950 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
2d960 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65 28 63  lue) {....free(c
2d970 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d980 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2d990 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
2d9a0 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  e);...}..}...if 
2d9b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2d9c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2d9d0 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65  h_query) {...fre
2d9e0 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
2d9f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2da00 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09  ch_query);..}...
2da10 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2da20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2da30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2da40 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2da50 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2da60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2da70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2da80 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2da90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2daa0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2dab0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2dac0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2dad0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
2dae0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
2daf0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
2db00 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2db10 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
2db20 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  yptInit)(CK_SESS
2db30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2db40 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2db50 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2db60 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2db70 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
2db80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2db90 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2dba0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2dbb0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2dbc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2dbd0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2dbe0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2dbf0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2dc00 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2dc10 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2dc20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2dc30 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2dc40 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2dc50 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2dc60 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2dc70 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2dc80 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2dc90 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2dca0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2dcb0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
2dcc0 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rypt)(CK_SESSION
2dcd0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2dce0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
2dcf0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
2dd00 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
2dd10 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44  _PTR pEncryptedD
2dd20 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
2dd30 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61  R pulEncryptedDa
2dd40 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  taLen) {..CACKEY
2dd50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2dd60 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2dd70 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2dd80 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2dd90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2dda0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2ddb0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2ddc0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2ddd0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2dde0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2ddf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2de00 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2de10 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2de20 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2de30 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2de40 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2de50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2de60 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2de70 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2de80 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
2de90 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
2dea0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2deb0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2dec0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
2ded0 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  G ulPartLen, CK_
2dee0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
2def0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
2df00 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
2df10 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
2df20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2df30 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2df40 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2df50 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2df60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2df70 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2df80 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2df90 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2dfa0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2dfb0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2dfc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2dfd0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2dfe0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2dff0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2e000 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2e010 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2e020 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2e030 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2e040 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2e050 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
2e060 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ncryptFinal)(CK_
2e070 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2e080 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2e090 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70  _PTR pLastEncryp
2e0a0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
2e0b0 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63  G_PTR pulLastEnc
2e0c0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
2e0d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e0e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2e0f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2e100 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2e110 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e120 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2e130 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2e140 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e150 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2e160 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2e170 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e180 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2e190 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e1a0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2e1b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2e1c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2e1d0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2e1e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e1f0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2e200 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2e210 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28   C_DecryptInit)(
2e220 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2e230 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2e240 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2e250 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2e260 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
2e270 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
2e280 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a  val;...hKey--;..
2e290 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e2a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2e2b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2e2c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2e2d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e2e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2e2f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2e300 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2e310 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2e320 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2e330 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d  f (pMechanism ==
2e340 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2e350 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e360 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
2e370 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  m is NULL.");...
2e380 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2e390 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2e3a0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d  .if (pMechanism-
2e3b0 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b  >mechanism != CK
2e3c0 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09  M_RSA_PKCS) {...
2e3d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e3e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
2e3f0 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
2e400 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  m not specified 
2e410 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22  as CKM_RSA_PKCS"
2e420 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2e430 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d  _MECHANISM_PARAM
2e440 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2e450 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
2e460 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
2e470 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2e480 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
2e490 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2e4a0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
2e4b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e4c0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2e4d0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
2e4e0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2e4f0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2e500 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2e510 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2e520 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
2e530 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2e540 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2e550 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2e560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e570 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2e580 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2e590 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2e5a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2e5b0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2e5c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2e5d0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
2e5e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2e5f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2e600 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2e610 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e620 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
2e630 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2e640 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2e650 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2e660 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
2e670 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2e680 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
2e690 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2e6a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2e6b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2e6c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e6d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
2e6e0 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e  crypt already in
2e6f0 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09   progress.");...
2e700 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2e710 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
2e720 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e  ..}...if (hKey >
2e730 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
2e740 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2e750 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a  tities_count) {.
2e760 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2e770 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2e780 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2e790 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e7a0 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c  rror.  Key handl
2e7b0 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28  e out of range (
2e7c0 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c  requested key %l
2e7d0 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e  u, only %lu iden
2e7e0 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65  tities available
2e7f0 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
2e800 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69  ong) hKey, (unsi
2e810 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65  gned long) cacke
2e820 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2e830 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
2e840 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
2e850 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45  n(CKR_KEY_HANDLE
2e860 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2e870 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e880 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
2e890 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09  t_active = 1;...
2e8a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e8b0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
2e8c0 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d  t_mechanism = pM
2e8d0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
2e8e0 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ism;..cackey_ses
2e8f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e900 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
2e910 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  m = pMechanism->
2e920 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63  pParameter;..cac
2e930 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e940 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
2e950 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d  ech_parmlen = pM
2e960 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61  echanism->ulPara
2e970 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65  meterLen;..cacke
2e980 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2e990 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
2e9a0 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
2e9b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e9c0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
2e9d0 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ey];...mutex_ret
2e9e0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2e9f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2ea00 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2ea10 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2ea20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2ea30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ea40 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
2ea50 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2ea60 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2ea70 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
2ea80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ea90 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2eaa0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
2eab0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
2eac0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
2ead0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2eae0 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53   C_Decrypt)(CK_S
2eaf0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2eb00 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2eb10 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61  PTR pEncryptedDa
2eb20 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  ta, CK_ULONG ulE
2eb30 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c  ncryptedDataLen,
2eb40 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
2eb50 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
2eb60 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09   pulDataLen) {..
2eb70 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e  CK_ULONG datalen
2eb80 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e  _update, datalen
2eb90 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64  _final;..CK_RV d
2eba0 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74  ecrypt_ret;..int
2ebb0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2ebc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ebd0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2ebe0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2ebf0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2ec00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ec10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2ec20 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2ec30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2ec40 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2ec50 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2ec60 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d  f (pulDataLen ==
2ec70 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2ec80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ec90 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65  Error. pulDataLe
2eca0 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
2ecb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2ecc0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2ecd0 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20  .datalen_update 
2ece0 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a  = *pulDataLen;..
2ecf0 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43  .decrypt_ret = C
2ed00 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68  _DecryptUpdate(h
2ed10 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70  Session, pEncryp
2ed20 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79  tedData, ulEncry
2ed30 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61  ptedDataLen, pDa
2ed40 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64  ta, &datalen_upd
2ed50 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79  ate);..if (decry
2ed60 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
2ed70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2ed80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ed90 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65  .  DecryptUpdate
2eda0 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
2edb0 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
2edc0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2edd0 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
2ede0 0a 09 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ...if (decrypt_r
2edf0 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52  et != CKR_BUFFER
2ee00 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
2ee10 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 64 65  ./* Terminate de
2ee20 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 74 69  cryption operati
2ee30 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f  on */.....mutex_
2ee40 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2ee50 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2ee60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69  y_biglock);....i
2ee70 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2ee80 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  != 0) {.....CACK
2ee90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2eea0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2eeb0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
2eec0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2eed0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  RAL_ERROR);....}
2eee0 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
2eef0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ef00 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
2ef10 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2ef20 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2ef30 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
2ef40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ef50 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2ef60 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2ef70 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
2ef80 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2ef90 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a  _INVALID);....}.
2efa0 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
2efb0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2efc0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
2efd0 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  e) {.....cackey_
2efe0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2eff0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2f000 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f010 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2f020 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69  Decrypt not acti
2f030 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65  ve.");........re
2f040 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
2f050 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
2f060 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ED);....}.....ca
2f070 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2f080 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2f090 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
2f0a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2f0b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2f0c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2f0d0 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
2f0e0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2f0f0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2f100 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f110 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
2f120 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
2f130 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2f140 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  ROR);....}...}..
2f150 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
2f160 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _ret);..}...if (
2f170 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61  pData) {...pData
2f180 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61   += datalen_upda
2f190 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f  te;..}..datalen_
2f1a0 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61  final = *pulData
2f1b0 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70  Len - datalen_up
2f1c0 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f  date;...decrypt_
2f1d0 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46  ret = C_DecryptF
2f1e0 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70  inal(hSession, p
2f1f0 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66  Data, &datalen_f
2f200 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72  inal);..if (decr
2f210 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ypt_ret != CKR_O
2f220 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
2f230 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2f240 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c  r.  DecryptFinal
2f250 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
2f260 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
2f270 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2f280 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
2f290 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
2f2a0 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75  t_ret);..}...*pu
2f2b0 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c  lDataLen = datal
2f2c0 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61  en_update + data
2f2d0 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43  len_final;...CAC
2f2e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f2f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2f300 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
2f310 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2f320 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
2f330 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2f340 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  , C_DecryptUpdat
2f350 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2f360 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2f370 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
2f380 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
2f390 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50  ONG ulEncryptedP
2f3a0 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
2f3b0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
2f3c0 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c  ONG_PTR pulPartL
2f3d0 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  en) {..static CK
2f3e0 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d  _BYTE buf[16384]
2f3f0 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65  ;..ssize_t bufle
2f400 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  n;..CK_SLOT_ID s
2f410 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65  lotID;..CK_RV re
2f420 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
2f430 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d  AL_ERROR;..int m
2f440 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2f450 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f460 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2f470 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2f480 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2f490 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f4a0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2f4b0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2f4c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2f4d0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2f4e0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2f4f0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2f500 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2f510 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2f520 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2f530 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2f540 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2f550 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f560 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2f570 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2f580 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2f590 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2f5a0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2f5b0 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74   (pEncryptedPart
2f5c0 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e   == NULL && ulEn
2f5d0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d  cryptedPartLen =
2f5e0 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
2f5f0 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20  t circuit if we 
2f600 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63  are asked to dec
2f610 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20  rypt nothing... 
2f620 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
2f630 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2f640 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20  ing CKR_OK (%i) 
2f650 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22  (short circuit)"
2f660 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
2f670 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
2f680 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65  ...if (pEncrypte
2f690 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  dPart == NULL) {
2f6a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f6b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
2f6c0 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 69 73  EncryptedPart is
2f6d0 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63   NULL, but ulEnc
2f6e0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73  ryptedPartLen is
2f6f0 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65   not 0.");....re
2f700 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2f710 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
2f720 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   (ulEncryptedPar
2f730 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tLen == 0) {...C
2f740 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f750 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63  TF("Error. ulEnc
2f760 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73  ryptedPartLen is
2f770 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73   0, but pPart is
2f780 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
2f790 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2f7a0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2f7b0 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20  .if (pulPartLen 
2f7c0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2f7d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f7e0 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74  ("Error. pulPart
2f7f0 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
2f800 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2f810 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2f820 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2f830 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2f840 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2f850 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2f860 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2f870 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f880 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
2f890 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2f8a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2f8b0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2f8c0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2f8d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f8e0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
2f8f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2f900 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2f910 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2f920 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2f930 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2f940 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2f950 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2f960 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2f970 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
2f980 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2f990 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2f9a0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2f9b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2f9c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2f9d0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2f9e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f9f0 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
2fa00 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2fa10 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2fa20 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2fa30 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
2fa40 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
2fa50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
2fa60 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
2fa70 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
2fa80 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
2fa90 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
2faa0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
2fab0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2fac0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2fad0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
2fae0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
2faf0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
2fb00 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
2fb10 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
2fb20 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2fb30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
2fb40 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
2fb50 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
2fb60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2fb70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
2fb80 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
2fb90 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
2fba0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
2fbb0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
2fbc0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2fbd0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2fbe0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
2fbf0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2fc00 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
2fc10 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
2fc20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
2fc30 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20  rypt_mechanism) 
2fc40 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
2fc50 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b  _PKCS:..../* Ask
2fc60 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74   card to decrypt
2fc70 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20   */....buflen = 
2fc80 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
2fc90 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
2fca0 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
2fcb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2fcc0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
2fcd0 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64  tity, pEncrypted
2fce0 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65  Part, ulEncrypte
2fcf0 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73  dPartLen, buf, s
2fd00 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31  izeof(buf), 0, 1
2fd10 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65  );.....if (bufle
2fd20 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
2fd30 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20  _E_NEEDLOGIN && 
2fd40 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
2fd50 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd != NULL) {...
2fd60 09 09 69 66 20 28 43 5f 4c 6f 67 69 6e 4d 75 74  ..if (C_LoginMut
2fd70 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20  exArg(hSession, 
2fd80 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20  CKU_USER, NULL, 
2fd90 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29  0, 0) == CKR_OK)
2fda0 20 7b 0a 09 09 09 09 09 62 75 66 6c 65 6e 20 3d   {......buflen =
2fdb0 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
2fdc0 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
2fdd0 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  s[slotID], cacke
2fde0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2fdf0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
2fe00 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65  ntity, pEncrypte
2fe10 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74  dPart, ulEncrypt
2fe20 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20  edPartLen, buf, 
2fe30 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20  sizeof(buf), 0, 
2fe40 31 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  1);.....}....}..
2fe50 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20  ...if (buflen < 
2fe60 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72  0) {...../* Decr
2fe70 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a  yption failed. *
2fe80 2f 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e  /.....if (buflen
2fe90 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
2fea0 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09  E_NEEDLOGIN) {..
2feb0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2fec0 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44  _USER_NOT_LOGGED
2fed0 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  _IN;.....} else 
2fee0 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41  if (buflen == CA
2fef0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
2ff00 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09  NABSENT) {......
2ff10 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56  retval = CKR_DEV
2ff20 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09  ICE_REMOVED;....
2ff30 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 43  .} else {......C
2ff40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ff50 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
2ff60 6e 64 20 41 50 44 55 2c 20 65 72 72 6f 72 20 3d  nd APDU, error =
2ff70 20 25 6c 69 22 2c 20 28 6c 6f 6e 67 20 69 6e 74   %li", (long int
2ff80 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  ) buflen);......
2ff90 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45  .retval = CKR_GE
2ffa0 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09  NERAL_ERROR;....
2ffb0 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20  .}....} else if 
2ffc0 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
2ffd0 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c  ) buflen) > *pul
2ffe0 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74  PartLen && pPart
2fff0 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79  ) {...../* Decry
30000 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61  pted data too la
30010 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61  rge */.....retva
30020 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
30030 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65  OO_SMALL;....} e
30040 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50  lse {.....if (pP
30050 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63  art) {......memc
30060 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62  py(pPart, buf, b
30070 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09  uflen);.....}...
30080 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d  ...*pulPartLen =
30090 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65   buflen;......re
300a0 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09  tval = CKR_OK;..
300b0 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
300c0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
300d0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
300e0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
300f0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
30100 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
30110 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
30120 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
30130 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
30140 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
30150 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
30160 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
30170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
30180 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e  turning %i", (in
30190 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  t) retval);...re
301a0 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
301b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
301c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
301d0 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ryptFinal)(CK_SE
301e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
301f0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
30200 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b  TR pLastPart, CK
30210 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61  _ULONG_PTR pulLa
30220 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e  stPartLen) {..in
30230 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
30240 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64  .int terminate_d
30250 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41  ecrypt = 1;...CA
30260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30270 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
30280 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
30290 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
302a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
302b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
302c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
302d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
302e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
302f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
30300 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
30310 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
30320 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
30330 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
30340 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
30350 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
30360 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30370 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
30380 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
30390 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
303a0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
303b0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
303c0 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20  (pulLastPartLen 
303d0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
303e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
303f0 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74  ("Error. pulLast
30400 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  PartLen is NULL.
30410 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
30420 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
30430 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
30440 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
30450 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
30460 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
30470 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
30480 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
30490 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
304a0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
304b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
304c0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
304d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
304e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
304f0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
30500 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
30510 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
30520 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
30530 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30540 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
30550 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
30560 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
30570 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
30580 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
30590 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
305a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
305b0 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ypt_active) {...
305c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
305d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
305e0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
305f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30600 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74  or.  Decrypt not
30610 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
30620 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
30630 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
30640 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75  LIZED);..}...*pu
30650 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30  lLastPartLen = 0
30660 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72  ;...if (pLastPar
30670 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74  t == NULL) {...t
30680 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
30690 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74   = 0;..}...if (t
306a0 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
306b0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
306c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
306d0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
306e0 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72   0;..}...mutex_r
306f0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
30700 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
30710 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
30720 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
30730 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
30740 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30750 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
30760 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
30770 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
30780 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
30790 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
307a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
307b0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
307c0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
307d0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
307e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
307f0 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29  V, C_DigestInit)
30800 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
30810 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
30820 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
30830 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43  echanism) {..CAC
30840 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30850 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
30860 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
30870 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
30880 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30890 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
308a0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
308b0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
308c0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
308d0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
308e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
308f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
30900 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
30910 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
30920 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30930 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
30940 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
30950 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
30960 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
30970 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
30980 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  gest)(CK_SESSION
30990 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
309a0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
309b0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
309c0 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
309d0 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b  _PTR pDigest, CK
309e0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69  _ULONG_PTR pulDi
309f0 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  gestLen) {..CACK
30a00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30a10 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
30a20 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
30a30 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
30a40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30a50 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
30a60 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
30a70 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
30a80 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
30a90 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
30aa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
30ab0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
30ac0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30ad0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
30ae0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
30af0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
30b00 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
30b10 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
30b20 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
30b30 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
30b40 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  estUpdate)(CK_SE
30b50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
30b60 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
30b70 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
30b80 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  NG ulPartLen) {.
30b90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30ba0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
30bb0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
30bc0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
30bd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30be0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
30bf0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
30c00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
30c10 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
30c20 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
30c30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30c40 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
30c50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30c60 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
30c70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30c80 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
30c90 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
30ca0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30cb0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
30cc0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
30cd0 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f  C_DigestKey)(CK_
30ce0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
30cf0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
30d00 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
30d10 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
30d20 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
30d30 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
30d40 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
30d50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30d60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
30d70 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
30d80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
30d90 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
30da0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
30db0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30dc0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
30dd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30de0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
30df0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
30e00 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
30e10 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
30e20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30e30 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
30e40 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
30e50 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29  , C_DigestFinal)
30e60 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
30e70 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
30e80 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74  BYTE_PTR pDigest
30e90 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
30ea0 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09  ulDigestLen) {..
30eb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30ec0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
30ed0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
30ee0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
30ef0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30f00 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
30f10 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
30f20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
30f30 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
30f40 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
30f50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30f60 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
30f70 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
30f80 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
30f90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30fa0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
30fb0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
30fc0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
30fd0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
30fe0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
30ff0 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45  _SignInit)(CK_SE
31000 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
31010 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
31020 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
31030 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
31040 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e  NDLE hKey) {..in
31050 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
31060 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b  ..hKey--;...CACK
31070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31080 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
31090 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
310a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
310b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
310c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
310d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
310e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
310f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
31100 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  ED);..}...if (pM
31110 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c  echanism == NULL
31120 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
31130 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
31140 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20  . pMechanism is 
31150 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
31160 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
31170 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
31180 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
31190 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41  anism != CKM_RSA
311a0 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45  _PKCS) {...CACKE
311b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
311c0 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
311d0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74  m->mechanism not
311e0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b   specified as CK
311f0 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09  M_RSA_PKCS");...
31200 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48  .return(CKR_MECH
31210 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41  ANISM_PARAM_INVA
31220 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  LID);..}...if (h
31230 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
31240 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
31250 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
31260 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
31270 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
31280 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
31290 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
312a0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
312b0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
312c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
312d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
312e0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
312f0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
31300 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
31310 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
31320 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
31330 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
31340 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31350 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
31360 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
31370 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
31380 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
31390 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
313a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
313b0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
313c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
313d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
313e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
313f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
31400 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
31410 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
31420 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
31430 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
31440 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
31450 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
31460 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
31470 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
31480 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
31490 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
314a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
314b0 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61  ror.  Sign alrea
314c0 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22  dy in progress."
314d0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
314e0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54  KR_OPERATION_ACT
314f0 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  IVE);..}...if (h
31500 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65  Key >= cackey_se
31510 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
31520 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
31530 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  t) {...cackey_mu
31540 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
31550 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
31560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31570 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20  TF("Error.  Key 
31580 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
31590 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b  nge (requested k
315a0 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75  ey %lu, only %lu
315b0 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69   identities avai
315c0 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67  lable).", (unsig
315d0 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20  ned long) hKey, 
315e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
315f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31600 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
31610 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  ties_count);....
31620 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48  return(CKR_KEY_H
31630 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
31640 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
31650 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31660 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  ign_active = 1;.
31670 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
31680 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
31690 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65  _mechanism = pMe
316a0 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
316b0 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  sm;...cackey_ses
316c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
316d0 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32  sign_buflen = 12
316e0 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  8;..cackey_sessi
316f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31700 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a  gn_bufused = 0;.
31710 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
31720 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
31730 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  buf = malloc(siz
31740 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73  eof(*cackey_sess
31750 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31760 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65  ign_buf) * cacke
31770 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
31780 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
31790 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
317a0 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f  G_PRINTF("Sessio
317b0 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74  n %lu sign_ident
317c0 69 74 79 20 69 73 20 25 70 20 28 69 64 65 6e 74  ity is %p (ident
317d0 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73  ity #%lu)", (uns
317e0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73  igned long) hSes
317f0 73 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26  sion, (void *) &
31800 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31810 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
31820 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73  ties[hKey], (uns
31830 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79  igned long) hKey
31840 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  );..cackey_sessi
31850 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31860 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63  gn_identity = &c
31870 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
31880 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
31890 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74  ies[hKey];...mut
318a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
318b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
318c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
318d0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
318e0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
318f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31900 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
31910 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
31920 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
31930 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
31940 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31950 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
31960 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
31970 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
31980 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
31990 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
319a0 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43  CK_RV, C_Sign)(C
319b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
319c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
319d0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
319e0 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
319f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
31a00 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
31a10 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74  NG_PTR pulSignat
31a20 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67  ureLen) {..unsig
31a30 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73  ned long start_s
31a40 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b  ign_bufused;..CK
31a50 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69  _RV sign_ret;..i
31a60 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
31a70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31a80 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
31a90 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
31aa0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
31ab0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31ac0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
31ad0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
31ae0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
31af0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
31b00 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
31b10 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
31b20 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
31b30 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
31b40 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
31b50 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
31b60 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
31b70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31b80 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
31b90 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
31ba0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
31bb0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
31bc0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
31bd0 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  ..start_sign_buf
31be0 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 65  used = cackey_se
31bf0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
31c00 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a  .sign_bufused;..
31c10 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69  .sign_ret = C_Si
31c20 67 6e 55 70 64 61 74 65 28 68 53 65 73 73 69 6f  gnUpdate(hSessio
31c30 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61  n, pData, ulData
31c40 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f  Len);..if (sign_
31c50 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
31c60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31c70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
31c80 53 69 67 6e 55 70 64 61 74 65 28 29 20 72 65 74  SignUpdate() ret
31c90 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
31ca0 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
31cb0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e  igned long) sign
31cc0 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 73 69  _ret);....if (si
31cd0 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55  gn_ret != CKR_BU
31ce0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
31cf0 7b 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61  {....mutex_retva
31d00 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
31d10 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
31d20 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
31d30 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
31d40 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
31d50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31d60 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
31d70 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
31d80 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
31d90 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  RROR);....}.....
31da0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
31db0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
31dc0 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
31dd0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
31de0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
31df0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
31e00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31e10 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
31e20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
31e30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
31e40 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
31e50 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  LID);....}.....i
31e60 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
31e70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31e80 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09  gn_active) {....
31e90 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
31ea0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
31eb0 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
31ec0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31ed0 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74  Error.  Sign not
31ee0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
31ef0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
31f00 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
31f10 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a  IALIZED);....}..
31f20 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
31f30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31f40 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  n_active = 0;...
31f50 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
31f60 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
31f70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
31f80 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
31f90 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
31fa0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
31fb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
31fc0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
31fd0 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
31fe0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
31ff0 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d  ERROR);....}...}
32000 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
32010 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f  ret);..}...sign_
32020 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61  ret = C_SignFina
32030 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67  l(hSession, pSig
32040 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61  nature, pulSigna
32050 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73  tureLen);..if (s
32060 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
32070 4b 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f  K) {...if (sign_
32080 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  ret == CKR_BUFFE
32090 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
320a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
320b0 52 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c  RINTF("SignFinal
320c0 28 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f  () returned CKR_
320d0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
320e0 20 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64   (rv = %lu), und
320f0 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74  oing C_SignUpdat
32100 65 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e()", (unsigned 
32110 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
32120 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
32130 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
32140 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74  ign_bufused = st
32150 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
32160 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67  ;.....return(sig
32170 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43  n_ret);...}....C
32180 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
32190 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
321a0 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64  Final() returned
321b0 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
321c0 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
321d0 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
321e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  ;....return(sign
321f0 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _ret);..}...if (
32200 70 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55  pSignature == NU
32210 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
32220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69  EBUG_PRINTF("pSi
32230 67 6e 61 74 75 72 65 20 73 70 65 63 69 66 69 65  gnature specifie
32240 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69  d as NULL, undoi
32250 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28  ng C_SignUpdate(
32260 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73  )");....cackey_s
32270 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
32280 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  ].sign_bufused =
32290 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75   start_sign_bufu
322a0 73 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73  sed;....return(s
322b0 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43  ign_ret);..}...C
322c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
322d0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
322e0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
322f0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
32300 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
32310 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
32320 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65  RV, C_SignUpdate
32330 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
32340 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
32350 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
32360 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
32370 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  Len) {..int mute
32380 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 72  x_retval;..int r
32390 65 73 69 7a 65 52 65 74 72 79 3b 0a 09 69 6e 74  esizeRetry;..int
323a0 20 6e 65 65 64 52 65 73 69 7a 65 3b 0a 0a 09 43   needResize;...C
323b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
323c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
323d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
323e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
323f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32400 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
32410 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
32420 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
32430 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
32440 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
32450 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
32460 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
32470 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
32480 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
32490 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
324a0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
324b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
324c0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
324d0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
324e0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
324f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
32500 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
32510 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20   (pPart == NULL 
32520 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20  && ulPartLen == 
32530 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
32540 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72  circuit if we ar
32550 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20  e asked to sign 
32560 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
32570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
32580 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
32590 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
325a0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
325b0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
325c0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
325d0 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29   (pPart == NULL)
325e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
325f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
32600 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20   pPart is NULL, 
32610 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73  but ulPartLen is
32620 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65   not 0.");....re
32630 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
32640 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
32650 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30   (ulPartLen == 0
32660 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
32670 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
32680 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30  . ulPartLen is 0
32690 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e  , but pPart is n
326a0 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
326b0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
326c0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
326d0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
326e0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
326f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
32700 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
32710 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
32720 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32730 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
32740 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
32750 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
32760 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
32770 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
32780 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
32790 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
327a0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
327b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
327c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
327d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
327e0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
327f0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
32800 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
32810 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
32820 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
32830 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
32840 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
32850 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
32860 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
32870 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
32880 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32890 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
328a0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
328b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
328c0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
328d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
328e0 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
328f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
32900 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29  .sign_mechanism)
32910 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
32920 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63  A_PKCS:..../* Ac
32930 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c  cumulate directl
32940 79 20 2a 2f 0a 09 09 09 66 6f 72 20 28 72 65 73  y */....for (res
32950 69 7a 65 52 65 74 72 79 20 3d 20 30 3b 20 72 65  izeRetry = 0; re
32960 73 69 7a 65 52 65 74 72 79 20 3c 20 31 31 3b 20  sizeRetry < 11; 
32970 72 65 73 69 7a 65 52 65 74 72 79 2b 2b 29 20 7b  resizeRetry++) {
32980 0a 09 09 09 09 6e 65 65 64 52 65 73 69 7a 65 20  .....needResize 
32990 3d 20 30 3b 0a 09 09 09 09 69 66 20 28 28 63 61  = 0;.....if ((ca
329a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
329b0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
329c0 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e  used + ulPartLen
329d0 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) > cackey_sessi
329e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
329f0 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09  gn_buflen) {....
32a00 09 09 6e 65 65 64 52 65 73 69 7a 65 20 3d 20 31  ..needResize = 1
32a10 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
32a20 28 21 6e 65 65 64 52 65 73 69 7a 65 29 20 7b 0a  (!needResize) {.
32a30 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
32a40 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
32a50 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 69  BUG_PRINTF("Resi
32a60 7a 69 6e 67 20 73 69 67 6e 69 6e 67 20 62 75 66  zing signing buf
32a70 66 65 72 20 28 74 72 79 20 23 25 69 20 6f 66 20  fer (try #%i of 
32a80 31 30 20 2d 2d 20 31 31 74 68 20 69 73 20 66 61  10 -- 11th is fa
32a90 74 61 6c 29 22 2c 20 72 65 73 69 7a 65 52 65 74  tal)", resizeRet
32aa0 72 79 29 3b 0a 0a 09 09 09 09 69 66 20 28 72 65  ry);......if (re
32ab0 73 69 7a 65 52 65 74 72 79 20 3d 3d 20 31 30 29  sizeRetry == 10)
32ac0 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61 63   {......free(cac
32ad0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
32ae0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
32af0 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
32b00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
32b10 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20  ].sign_buflen = 
32b20 30 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  0;......cackey_s
32b30 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
32b40 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 4e 55 4c  ].sign_buf = NUL
32b50 4c 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  L;.......break;.
32b60 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65  ....}......cacke
32b70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
32b80 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
32b90 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b   *= 2;......cack
32ba0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
32bb0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
32bc0 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f   realloc(cackey_
32bd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
32be0 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a  n].sign_buf, siz
32bf0 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73  eof(*cackey_sess
32c00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
32c10 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65  ign_buf) * cacke
32c20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
32c30 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
32c40 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
32c50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
32c60 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
32c70 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  uf == NULL) {...
32c80 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
32c90 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
32ca0 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
32cb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32cc0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 69 6e 67  "Error.  Signing
32cd0 20 62 75 66 66 65 72 20 69 73 20 4e 55 4c 4c 2e   buffer is NULL.
32ce0 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
32cf0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
32d00 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  R);....}.....mem
32d10 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
32d20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
32d30 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f  gn_buf + cackey_
32d40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
32d50 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
32d60 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65   pPart, ulPartLe
32d70 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  n);.....cackey_s
32d80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
32d90 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
32da0 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09  = ulPartLen;....
32db0 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74  .break;..}...mut
32dc0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
32dd0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
32de0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
32df0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
32e00 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
32e10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32e20 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
32e30 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
32e40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
32e50 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
32e60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32e70 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
32e80 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
32e90 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
32ea0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
32eb0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
32ec0 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e  CK_RV, C_SignFin
32ed0 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
32ee0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
32ef0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
32f00 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
32f10 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
32f20 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20  eLen) {..static 
32f30 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31  CK_BYTE sigbuf[1
32f40 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73  024];..ssize_t s
32f50 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c  igbuflen;..CK_SL
32f60 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43  OT_ID slotID;..C
32f70 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
32f80 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
32f90 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f  ..int terminate_
32fa0 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d  sign = 1;..int m
32fb0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
32fc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
32fd0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
32fe0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
32ff0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
33000 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33010 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
33020 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
33030 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
33040 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
33050 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
33060 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  (pulSignatureLen
33070 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
33080 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33090 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67  F("Error. pulSig
330a0 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c  natureLen is NUL
330b0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
330c0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
330d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
330e0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
330f0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
33100 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
33110 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
33120 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
33130 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
33140 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
33150 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
33160 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
33170 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
33180 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
33190 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
331a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
331b0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
331c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
331d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
331e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
331f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
33200 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
33210 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
33220 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
33230 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
33240 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
33250 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
33260 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
33270 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
33280 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
33290 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
332a0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
332b0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
332c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
332d0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
332e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
332f0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
33300 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
33310 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
33320 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
33330 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
33340 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
33350 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
33360 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
33370 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
33380 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
33390 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
333a0 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ED);..}...slotID
333b0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
333c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
333d0 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
333e0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
333f0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
33400 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
33410 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
33420 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
33430 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
33440 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
33450 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
33460 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
33470 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
33480 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
33490 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
334a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
334b0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
334c0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
334d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
334e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
334f0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
33500 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
33510 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
33520 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
33530 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
33540 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
33550 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
33560 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
33570 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
33580 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
33590 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
335a0 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  gn_mechanism) {.
335b0 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
335c0 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63  KCS:..../* Ask c
335d0 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09  ard to sign */..
335e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
335f0 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f  RINTF("Asking to
33600 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74   sign from ident
33610 69 74 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f  ity %p in sessio
33620 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29  n %lu", (void *)
33630 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
33640 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
33650 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67  identity, (unsig
33660 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69  ned long) hSessi
33670 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65  on);....sigbufle
33680 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
33690 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
336a0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
336b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
336c0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
336d0 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65  ntity, cackey_se
336e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
336f0 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65  .sign_buf, cacke
33700 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
33710 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
33720 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f  d, sigbuf, sizeo
33730 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29  f(sigbuf), 1, 0)
33740 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66  ;.....if (sigbuf
33750 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
33760 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26  SC_E_NEEDLOGIN &
33770 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  & cackey_pin_com
33780 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  mand != NULL) {.
33790 09 09 09 09 69 66 20 28 43 5f 4c 6f 67 69 6e 4d  ....if (C_LoginM
337a0 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e  utexArg(hSession
337b0 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c  , CKU_USER, NULL
337c0 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f  , 0, 0) == CKR_O
337d0 4b 29 20 7b 0a 09 09 09 09 09 73 69 67 62 75 66  K) {......sigbuf
337e0 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67  len = cackey_sig
337f0 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79  ndecrypt(&cackey
33800 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
33810 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
33820 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
33830 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f  dentity, cackey_
33840 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
33850 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63  n].sign_buf, cac
33860 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
33870 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
33880 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a  sed, sigbuf, siz
33890 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20  eof(sigbuf), 1, 
338a0 30 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  0);.....}....}..
338b0 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e  ...if (sigbuflen
338c0 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53   < 0) {...../* S
338d0 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a  igning failed. *
338e0 2f 0a 09 09 09 09 69 66 20 28 73 69 67 62 75 66  /.....if (sigbuf
338f0 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
33900 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20  SC_E_NEEDLOGIN) 
33910 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
33920 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47  CKR_USER_NOT_LOG
33930 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c  GED_IN;.....} el
33940 73 65 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e  se if (sigbuflen
33950 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
33960 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b  E_TOKENABSENT) {
33970 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
33980 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45  KR_DEVICE_REMOVE
33990 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  D;.....} else {.
339a0 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
339b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
339c0 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
339d0 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
339e0 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29  long) sigbuflen)
339f0 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65   > *pulSignature
33a00 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72  Len && pSignatur
33a10 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e  e) {...../* Sign
33a20 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67  ed data too larg
33a30 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f  e */.....CACKEY_
33a40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65  DEBUG_PRINTF("re
33a50 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
33a60 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69  R_TOO_SMALL;  si
33a70 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70  gbuflen = %lu, p
33a80 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
33a90 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64   %lu", (unsigned
33aa0 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e   long) sigbuflen
33ab0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
33ac0 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  ) *pulSignatureL
33ad0 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  en);......retval
33ae0 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
33af0 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65  O_SMALL;......te
33b00 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30  rminate_sign = 0
33b10 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
33b20 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  ..terminate_sign
33b30 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70   = 0;......if (p
33b40 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09  Signature) {....
33b50 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74  ..memcpy(pSignat
33b60 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67  ure, sigbuf, sig
33b70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74  buflen);.......t
33b80 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
33b90 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70  1;.....}......*p
33ba0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
33bb0 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09   sigbuflen;.....
33bc0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b  .retval = CKR_OK
33bd0 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b  ;....}.....break
33be0 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69  ;..}...if (termi
33bf0 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69  nate_sign) {...i
33c00 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
33c10 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
33c20 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65  n_buf) {....free
33c30 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
33c40 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
33c50 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  buf);...}....cac
33c60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
33c70 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
33c80 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74  ve = 0;..}...mut
33c90 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
33ca0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
33cb0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
33cc0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
33cd0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
33ce0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33cf0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
33d00 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
33d10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
33d20 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
33d30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33d40 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
33d50 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76   %i", (int) retv
33d60 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
33d70 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  tval);.}..CK_DEF
33d80 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
33d90 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  RV, C_SignRecove
33da0 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  rInit)(CK_SESSIO
33db0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
33dc0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
33dd0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
33de0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
33df0 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
33e00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
33e10 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
33e20 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
33e30 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
33e40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
33e50 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
33e60 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
33e70 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
33e80 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
33e90 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
33ea0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
33eb0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
33ec0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33ed0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
33ee0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33ef0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
33f00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33f10 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
33f20 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
33f30 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52  N(CK_RV, C_SignR
33f40 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49  ecover)(CK_SESSI
33f50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
33f60 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
33f70 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
33f80 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
33f90 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
33fa0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
33fb0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
33fc0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
33fd0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
33fe0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
33ff0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
34000 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
34010 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
34020 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
34030 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
34040 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
34050 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
34060 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34070 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
34080 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34090 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
340a0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
340b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
340c0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
340d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
340e0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
340f0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
34100 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29  V, C_VerifyInit)
34110 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
34120 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
34130 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
34140 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
34150 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
34160 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
34170 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
34180 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
34190 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
341a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
341b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
341c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
341d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
341e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
341f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
34200 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34210 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
34220 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34230 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
34240 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
34250 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
34260 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
34270 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34280 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
34290 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
342a0 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f  V, C_Verify)(CK_
342b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
342c0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
342d0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
342e0 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
342f0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
34300 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
34310 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29   ulSignatureLen)
34320 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
34330 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
34340 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
34350 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
34360 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
34370 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
34380 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
34390 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
343a0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
343b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
343c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
343d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
343e0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
343f0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
34400 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
34410 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
34420 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
34430 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34440 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
34450 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
34460 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61 74  V, C_VerifyUpdat
34470 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
34480 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
34490 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
344a0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
344b0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
344c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
344d0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
344e0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
344f0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
34500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
34510 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
34520 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
34530 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
34540 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
34550 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
34560 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
34570 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
34580 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
34590 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
345a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
345b0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
345c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
345d0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
345e0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
345f0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
34600 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
34610 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
34620 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
34630 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
34640 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
34650 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
34660 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
34670 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
34680 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
34690 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
346a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
346b0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
346c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
346d0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
346e0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
346f0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
34700 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
34710 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
34720 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
34730 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
34740 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
34750 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
34760 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
34770 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
34780 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
34790 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65  K_RV, C_VerifyRe
347a0 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45  coverInit)(CK_SE
347b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
347c0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
347d0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
347e0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
347f0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
34800 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34810 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
34820 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
34830 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
34840 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
34850 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
34860 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
34870 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
34880 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
34890 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
348a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
348b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
348c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
348d0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
348e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
348f0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
34900 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
34910 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
34920 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
34930 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
34940 65 72 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b  erifyRecover)(CK
34950 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
34960 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
34970 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
34980 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67  , CK_ULONG ulSig
34990 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59  natureLen, CK_BY
349a0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
349b0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61  _ULONG_PTR pulDa
349c0 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  taLen) {..CACKEY
349d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
349e0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
349f0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
34a00 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
34a10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
34a20 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
34a30 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
34a40 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
34a50 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
34a60 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
34a70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
34a80 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
34a90 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34aa0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
34ab0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34ac0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
34ad0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34ae0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
34af0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
34b00 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
34b10 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28  tEncryptUpdate)(
34b20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
34b30 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
34b40 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
34b50 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
34b60 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
34b70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
34b80 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
34b90 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
34ba0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
34bb0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
34bc0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
34bd0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
34be0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
34bf0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
34c00 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
34c10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
34c20 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
34c30 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
34c40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34c50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
34c60 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34c70 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
34c80 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
34c90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
34ca0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
34cb0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34cc0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
34cd0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
34ce0 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67 65  V, C_DecryptDige
34cf0 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  stUpdate)(CK_SES
34d00 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
34d10 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
34d20 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
34d30 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
34d40 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43  ryptedPartLen, C
34d50 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
34d60 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
34d70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
34d80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34d90 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
34da0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
34db0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
34dc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
34dd0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
34de0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
34df0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
34e00 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
34e10 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
34e20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
34e30 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
34e40 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
34e50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
34e60 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
34e70 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
34e80 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
34e90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
34ea0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
34eb0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
34ec0 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65  ignEncryptUpdate
34ed0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
34ee0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
34ef0 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
34f00 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
34f10 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
34f20 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
34f30 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
34f40 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
34f50 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
34f60 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
34f70 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
34f80 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
34f90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
34fa0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
34fb0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
34fc0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
34fd0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
34fe0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
34ff0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
35000 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
35010 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
35020 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
35030 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
35040 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
35050 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
35060 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
35070 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
35080 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
35090 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65  _RV, C_DecryptVe
350a0 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53  rifyUpdate)(CK_S
350b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
350c0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
350d0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
350e0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  rt, CK_ULONG ulE
350f0 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c  ncryptedPartLen,
35100 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
35110 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
35120 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09   pulPartLen) {..
35130 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
35140 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
35150 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
35160 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
35170 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
35180 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
35190 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
351a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
351b0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
351c0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
351d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
351e0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
351f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
35200 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
35210 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
35220 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
35230 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
35240 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
35250 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
35260 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
35270 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b  _GenerateKey)(CK
35280 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
35290 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
352a0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
352b0 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42  anism, CK_ATTRIB
352c0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
352d0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
352e0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
352f0 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29  ANDLE_PTR phKey)
35300 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
35310 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
35320 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
35330 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
35340 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
35350 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
35360 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
35370 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
35380 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
35390 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
353a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
353b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
353c0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
353d0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
353e0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
353f0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
35400 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
35410 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
35420 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
35430 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
35440 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  V, C_GenerateKey
35450 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Pair)(CK_SESSION
35460 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
35470 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
35480 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
35490 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
354a0 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61  pPublicKeyTempla
354b0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  te, CK_ULONG ulP
354c0 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74  ublicKeyAttribut
354d0 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49  eCount, CK_ATTRI
354e0 42 55 54 45 5f 50 54 52 20 70 50 72 69 76 61 74  BUTE_PTR pPrivat
354f0 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b  eKeyTemplate, CK
35500 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65  _ULONG ulPrivate
35510 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e  KeyAttributeCoun
35520 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
35530 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63  DLE_PTR phPublic
35540 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Key, CK_OBJECT_H
35550 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76  ANDLE_PTR phPriv
35560 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  ateKey) {..CACKE
35570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
35580 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
35590 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
355a0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
355b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
355c0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
355d0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
355e0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
355f0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
35600 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
35610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
35620 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
35630 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
35640 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
35650 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
35660 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
35670 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
35680 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
35690 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
356a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70  ON(CK_RV, C_Wrap
356b0 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
356c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
356d0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
356e0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
356f0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
35700 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f  WrappingKey, CK_
35710 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
35720 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  ey, CK_BYTE_PTR 
35730 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f  pWrappedKey, CK_
35740 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61  ULONG_PTR pulWra
35750 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43  ppedKeyLen) {..C
35760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
35770 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
35780 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
35790 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
357a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
357b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
357c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
357d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
357e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
357f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
35800 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
35810 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
35820 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
35830 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
35840 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
35850 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
35860 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
35870 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
35880 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
35890 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
358a0 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45  UnwrapKey)(CK_SE
358b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
358c0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
358d0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
358e0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
358f0 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67  NDLE hUnwrapping
35900 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Key, CK_BYTE_PTR
35910 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b   pWrappedKey, CK
35920 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64  _ULONG ulWrapped
35930 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49  KeyLen, CK_ATTRI
35940 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
35950 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41  te, CK_ULONG ulA
35960 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
35970 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
35980 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41  PTR phKey) {..CA
35990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
359a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
359b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
359c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
359d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
359e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
359f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
35a00 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
35a10 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
35a20 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
35a30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
35a40 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
35a50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
35a60 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
35a70 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
35a80 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
35a90 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
35aa0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
35ab0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
35ac0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
35ad0 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53  eriveKey)(CK_SES
35ae0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
35af0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
35b00 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
35b10 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
35b20 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b  DLE hBaseKey, CK
35b30 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
35b40 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
35b50 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f  NG ulAttributeCo
35b60 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
35b70 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29  ANDLE_PTR phKey)
35b80 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
35b90 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
35ba0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
35bb0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
35bc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
35bd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
35be0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
35bf0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
35c00 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
35c10 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
35c20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
35c30 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
35c40 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
35c50 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
35c60 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
35c70 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
35c80 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
35c90 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
35ca0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
35cb0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
35cc0 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29  V, C_SeedRandom)
35cd0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
35ce0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
35cf0 42 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20  BYTE_PTR pSeed, 
35d00 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c  CK_ULONG ulSeedL
35d10 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
35d20 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
35d30 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
35d40 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
35d50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
35d60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
35d70 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
35d80 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
35d90 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
35da0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
35db0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
35dc0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
35dd0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
35de0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
35df0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
35e00 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
35e10 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
35e20 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
35e30 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
35e40 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
35e50 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65  K_RV, C_Generate
35e60 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49  Random)(CK_SESSI
35e70 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
35e80 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
35e90 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f  pRandomData, CK_
35ea0 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65  ULONG ulRandomLe
35eb0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
35ec0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
35ed0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
35ee0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
35ef0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
35f00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
35f10 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
35f20 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
35f30 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
35f40 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
35f50 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
35f60 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
35f70 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
35f80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
35f90 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
35fa0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
35fb0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
35fc0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
35fd0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65  ORTED);.}../* De
35fe0 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f  precated Functio
35ff0 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  n */.CK_DEFINE_F
36000 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
36010 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74  _GetFunctionStat
36020 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  us)(CK_SESSION_H
36030 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
36040 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
36050 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
36060 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
36070 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
36080 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
36090 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25  _NOT_PARALLEL (%
360a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
360b0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
360c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
360d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
360e0 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e  LEL);...hSession
360f0 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20   = hSession; /* 
36100 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76  Supress unused v
36110 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20  ariable warning 
36120 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61  */.}../* Depreca
36130 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ted Function */.
36140 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
36150 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63  ON(CK_RV, C_Canc
36160 65 6c