Hex Artifact Content

Artifact 984e852cb78479da5288539ef41ce991b9b2d22c:


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 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64  VE_ZLIB_H.#  ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e    include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73  h>.#  endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  e.#  ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20  LIBZ.#    undef 
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64  HAVE_LIBZ.#  end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  if.#endif..#defi
02f0: 6e 65 20 43 4b 5f 50 54 52 20 2a 0a 23 64 65 66  ne CK_PTR *.#def
0300: 69 6e 65 20 43 4b 5f 44 45 46 49 4e 45 5f 46 55  ine CK_DEFINE_FU
0310: 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70  NCTION(returnTyp
0320: 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54  e, name) returnT
0330: 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65  ype name.#define
0340: 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43   CK_DECLARE_FUNC
0350: 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70 65 2c  TION(returnType,
0360: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70   name) returnTyp
0370: 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65 20 43  e name.#define C
0380: 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43 54 49  K_DECLARE_FUNCTI
0390: 4f 4e 5f 50 4f 49 4e 54 45 52 28 72 65 74 75 72  ON_POINTER(retur
03a0: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
03b0: 75 72 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29  urnType (* name)
03c0: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 43 41 4c 4c  .#define CK_CALL
03d0: 42 41 43 4b 5f 46 55 4e 43 54 49 4f 4e 28 72 65  BACK_FUNCTION(re
03e0: 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20  turnType, name) 
03f0: 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e 61  returnType (* na
0400: 6d 65 29 0a 23 69 66 6e 64 65 66 20 4e 55 4c 4c  me).#ifndef NULL
0410: 5f 50 54 52 0a 23 20 20 64 65 66 69 6e 65 20 4e  _PTR.#  define N
0420: 55 4c 4c 5f 50 54 52 20 30 0a 23 65 6e 64 69 66  ULL_PTR 0.#endif
0430: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73  ..#include "pkcs
0440: 31 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  11.h".#include "
0450: 70 6b 63 73 31 31 6e 2e 68 22 0a 23 69 6e 63 6c  pkcs11n.h".#incl
0460: 75 64 65 20 22 61 73 6e 31 2d 78 35 30 39 2e 68  ude "asn1-x509.h
0470: 22 0a 23 69 6e 63 6c 75 64 65 20 22 73 68 61 31  ".#include "sha1
0480: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64  .h".#include "md
0490: 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 49 6e 63 6c  5.h"../*. * Incl
04a0: 75 64 65 20 74 68 65 73 65 20 73 6f 75 72 63 65  ude these source
04b0: 20 66 69 6c 65 73 20 69 6e 20 74 68 69 73 20 74   files in this t
04c0: 72 61 6e 73 6c 61 74 69 6f 6e 20 75 6e 69 74 20  ranslation unit 
04d0: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 62  so that we can b
04e0: 69 6e 64 20 74 6f 0a 20 2a 20 66 75 6e 63 74 69  ind to. * functi
04f0: 6f 6e 73 20 61 6e 64 20 6e 6f 74 20 69 6e 63 6c  ons and not incl
0500: 75 64 65 20 61 6e 79 20 73 79 6d 62 6f 6c 73 20  ude any symbols 
0510: 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  in the output sh
0520: 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 2a 2f  ared object.. */
0530: 0a 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d  .#include "asn1-
0540: 78 35 30 39 2e 63 22 0a 23 69 6e 63 6c 75 64 65  x509.c".#include
0550: 20 22 73 68 61 31 2e 63 22 0a 23 69 6e 63 6c 75   "sha1.c".#inclu
0560: 64 65 20 22 6d 64 35 2e 63 22 0a 0a 23 69 66 6e  de "md5.c"..#ifn
0570: 64 65 66 20 43 41 43 4b 45 59 5f 43 52 59 50 54  def CACKEY_CRYPT
0580: 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45  OKI_VERSION_CODE
0590: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
05a0: 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
05b0: 4f 4e 5f 43 4f 44 45 20 30 78 30 32 31 65 30 30  ON_CODE 0x021e00
05c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 47 53 43 2d  .#endif../* GSC-
05d0: 49 53 20 76 32 2e 31 20 44 65 66 69 6e 69 74 69  IS v2.1 Definiti
05e0: 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43 6c 61 73 73  ons */./** Class
05f0: 65 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  es **/.#define G
0600: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
0610: 31 36 20 20 20 20 20 20 20 20 20 20 20 30 78 30  16           0x0
0620: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0630: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41  CLASS_GLOBAL_PLA
0640: 54 46 4f 52 4d 20 20 20 30 78 38 30 0a 0a 2f 2a  TFORM   0x80../*
0650: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a  * Instructions *
0660: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0670: 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f  _INSTR_GET_RESPO
0680: 4e 53 45 20 20 20 20 20 20 30 78 43 30 0a 23 64  NSE      0xC0.#d
0690: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
06a0: 52 5f 52 45 41 44 5f 42 49 4e 41 52 59 20 20 20  R_READ_BINARY   
06b0: 20 20 20 20 30 78 42 30 0a 23 64 65 66 69 6e 65      0xB0.#define
06c0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 55 50 44   GSCIS_INSTR_UPD
06d0: 41 54 45 5f 42 49 4e 41 52 59 20 20 20 20 20 30  ATE_BINARY     0
06e0: 78 44 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xD6.#define GSCI
06f0: 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 20 20  S_INSTR_SELECT  
0700: 20 20 20 20 20 20 20 20 20 20 30 78 41 34 0a 23            0xA4.#
0710: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0720: 54 52 5f 45 58 54 45 52 4e 41 4c 5f 41 55 54 48  TR_EXTERNAL_AUTH
0730: 20 20 20 20 20 30 78 38 32 0a 23 64 65 66 69 6e       0x82.#defin
0740: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0750: 54 5f 43 48 41 4c 4c 45 4e 47 45 20 20 20 20 20  T_CHALLENGE     
0760: 30 78 38 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x84.#define GSC
0770: 49 53 5f 49 4e 53 54 52 5f 49 4e 54 45 52 4e 41  IS_INSTR_INTERNA
0780: 4c 5f 41 55 54 48 20 20 20 20 20 30 78 38 38 0a  L_AUTH     0x88.
0790: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
07a0: 53 54 52 5f 56 45 52 49 46 59 20 20 20 20 20 20  STR_VERIFY      
07b0: 20 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69        0x20.#defi
07c0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
07d0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
07e0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53   0x2A.#define GS
07f0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52  CIS_INSTR_GET_PR
0800: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36  OP          0x56
0810: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
0820: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20  NSTR_GET_ACR    
0830: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66         0x4C.#def
0840: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0850: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20  READ_BUFFER     
0860: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47    0x52.#define G
0870: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
0880: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34  ECRYPT       0x4
0890: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  2..#define GSCIS
08a0: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
08b0: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f  PLET     0x04../
08c0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a  ** Tags **/./***
08d0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23   CCC Tags ***/.#
08e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08f0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20  _CARDID         
0900: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e       0xF0.#defin
0910: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
0920: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VER             
0930: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF1.#define GSC
0940: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20  IS_TAG_CCG_VER  
0950: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a             0xF2.
0960: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0970: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20  G_CARDURL       
0980: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69        0xF3.#defi
0990: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  ne GSCIS_TAG_PKC
09a0: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20  S15             
09b0: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53   0xF4.#define GS
09c0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
09d0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35  _MODEL      0xF5
09e0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09f0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20  AG_ACR_TABLE    
0a00: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66         0xF6.#def
0a10: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
0a20: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20  RD_APDU         
0a30: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47    0xF7.#define G
0a40: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43  SCIS_TAG_REDIREC
0a50: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46  TION         0xF
0a60: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  A.#define GSCIS_
0a70: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20  TAG_CT          
0a80: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65          0xFB.#de
0a90: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0aa0: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
0ab0: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20     0xFC.#define 
0ac0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
0ad0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78  C             0x
0ae0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c  FD../*** General
0af0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a   - EF 2200 ***/.
0b00: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0b10: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_FNAME         
0b20: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69        0x01.#defi
0b30: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  ne GSCIS_TAG_MNA
0b40: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0b50: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53   0x02.#define GS
0b60: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20  CIS_TAG_LNAME   
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33              0x03
0b80: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b90: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20  AG_SUFFIX       
0ba0: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66         0x04.#def
0bb0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ine GSCIS_TAG_GO
0bc0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20  VT_AGENCY       
0bd0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47    0x05.#define G
0be0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20  SCIS_TAG_BUREAU 
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0c00: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  6.#define GSCIS_
0c10: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20  TAG_BUREAU_CODE 
0c20: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65          0x07.#de
0c30: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
0c40: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EPT_CODE        
0c50: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20     0x08.#define 
0c60: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20  GSCIS_TAG_TITLE 
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0c80: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  09.#define GSCIS
0c90: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20  _TAG_BUILDING   
0ca0: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64           0x10.#d
0cb0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0cc0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20  OFFICE_ADDR1    
0cd0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65      0x11.#define
0ce0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cf0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30  E_ADDR2        0
0d00: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x12.#define GSCI
0d10: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
0d20: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23  Y         0x13.#
0d30: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0d40: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20  _OFFICE_STATE   
0d50: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e       0x14.#defin
0d60: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0d70: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20  CE_ZIP          
0d80: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0x15.#define GSC
0d90: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f  IS_TAG_OFFICE_CO
0da0: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a  UNTRY      0x16.
0db0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0dc0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20  G_OFFICE_PHONE  
0dd0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69        0x17.#defi
0de0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0df0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20  ICE_PHONE_EXT   
0e00: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53   0x18.#define GS
0e10: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
0e20: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39  AX          0x19
0e30: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0e40: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20  AG_OFFICE_EMAIL 
0e50: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66         0x1A.#def
0e60: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0e70: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20  FICE_ROOM       
0e80: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47    0x1B.#define G
0e90: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
0ea0: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31  AGENCY       0x1
0eb0: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  C.#define GSCIS_
0ec0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
0ed0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a  OR      0x1D../*
0ee0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30  ** PII - EF 2100
0ef0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20  CIS_TAG_SSN     
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30              0x20
0f20: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f30: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20  AG_DOB          
0f40: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66         0x21.#def
0f50: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45  ine GSCIS_TAG_GE
0f60: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NDER            
0f70: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67    0x22../*** Log
0f80: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  in Information -
0f90: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 4000 ***/.#d
0fa0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0fb0: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20  USERID          
0fc0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65      0x40.#define
0fd0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
0fe0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  N              0
0ff0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x41.#define GSCI
1000: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20  S_TAG_PASSWORD  
1010: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a            0x42..
1020: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d  /*** Card Inform
1030: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20  ation - EF 5000 
1040: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
1050: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20  IS_TAG_ISSUERID 
1060: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a             0x50.
1070: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1080: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20  G_SERNO         
1090: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69        0x51.#defi
10a0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53  ne GSCIS_TAG_ISS
10b0: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  UE_DATE         
10c0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
10d0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
10e0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33  ATE         0x53
10f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1100: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20  AG_CARD_TYPE    
1110: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66         0x54.#def
1120: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ine GSCIS_TAG_SE
1130: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20  CURITY_CODE     
1140: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47    0x57.#define G
1150: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
1160: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35  AID          0x5
1170: 38 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f  8../*** PKI Info
1180: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30  rmation - EF 700
1190: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
11a0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
11b0: 43 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37  CATE         0x7
11c0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
11d0: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
11e0: 41 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65  ATE     0x71.#de
11f0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43  fine GSCIS_TAG_C
1200: 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20  ERT_EXPIRE_DATE 
1210: 20 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70     0x72../** App
1220: 6c 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66  let IDs **/.#def
1230: 69 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43  ine GSCIS_AID_CC
1240: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C               
1250: 20 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78    0xA0, 0x00, 0x
1260: 30 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20  00, 0x01, 0x16, 
1270: 30 78 44 42 2c 20 30 78 30 30 0a 0a 2f 2a 20 4d  0xDB, 0x00../* M
1280: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 64  aximum size of d
1290: 61 74 61 20 70 6f 72 74 69 6f 6e 20 6f 66 20 41  ata portion of A
12a0: 50 44 55 73 20 2a 2f 0a 2f 2a 2a 20 44 6f 20 6e  PDUs */./** Do n
12b0: 6f 74 20 73 65 74 20 74 68 69 73 20 61 62 6f 76  ot set this abov
12c0: 65 20 32 35 30 20 2a 2a 2f 0a 23 64 65 66 69 6e  e 250 **/.#defin
12d0: 65 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  e CACKEY_APDU_MT
12e0: 55 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  U               
12f0: 32 35 30 0a 0a 2f 2a 20 41 54 52 20 49 66 20 6e  250../* ATR If n
1300: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
1310: 23 69 66 6e 64 65 66 20 4d 41 58 5f 41 54 52 5f  #ifndef MAX_ATR_
1320: 53 49 5a 45 0a 23 64 65 66 69 6e 65 20 4d 41 58  SIZE.#define MAX
1330: 5f 41 54 52 5f 53 49 5a 45 20 31 30 32 34 0a 23  _ATR_SIZE 1024.#
1340: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 43 41  endif..#ifdef CA
1350: 43 4b 45 59 5f 44 45 42 55 47 0a 23 20 20 69 66  CKEY_DEBUG.#  if
1360: 64 65 66 20 48 41 56 45 5f 54 49 4d 45 5f 48 0a  def HAVE_TIME_H.
1370: 23 20 20 20 20 69 6e 63 6c 75 64 65 20 3c 74 69  #    include <ti
1380: 6d 65 2e 68 3e 0a 73 74 61 74 69 63 20 74 69 6d  me.h>.static tim
1390: 65 5f 74 20 63 61 63 6b 65 79 5f 64 65 62 75 67  e_t cackey_debug
13a0: 5f 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 30 3b  _start_time = 0;
13b0: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 43 41 43  .#    define CAC
13c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
13d0: 49 4d 45 20 7b 20 69 66 20 28 63 61 63 6b 65 79  IME { if (cackey
13e0: 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d  _debug_start_tim
13f0: 65 20 3d 3d 20 30 29 20 7b 20 63 61 63 6b 65 79  e == 0) { cackey
1400: 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d  _debug_start_tim
1410: 65 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 20  e = time(NULL); 
1420: 7d 3b 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65  }; fprintf(cacke
1430: 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b  y_debug_fd(), "[
1440: 25 6c 75 5d 3a 20 22 2c 20 28 75 6e 73 69 67 6e  %lu]: ", (unsign
1450: 65 64 20 6c 6f 6e 67 29 20 28 74 69 6d 65 28 4e  ed long) (time(N
1460: 55 4c 4c 29 20 2d 20 63 61 63 6b 65 79 5f 64 65  ULL) - cackey_de
1470: 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 29 29  bug_start_time))
1480: 3b 20 7d 0a 23 20 20 65 6c 73 65 0a 23 20 20 20  ; }.#  else.#   
1490: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
14a0: 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 20 2f  EBUG_PRINTTIME /
14b0: 2a 2a 2f 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20  **/.#  endif..# 
14c0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
14d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e  EBUG_PRINTF(x...
14e0: 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ) { CACKEY_DEBUG
14f0: 5f 50 52 49 4e 54 54 49 4d 45 3b 20 66 70 72 69  _PRINTTIME; fpri
1500: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1510: 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a  _fd(), "%s():%i:
1520: 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f   ", __func__, __
1530: 4c 49 4e 45 5f 5f 29 3b 20 66 70 72 69 6e 74 66  LINE__); fprintf
1540: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
1550: 28 29 2c 20 78 29 3b 20 66 70 72 69 6e 74 66 28  (), x); fprintf(
1560: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
1570: 29 2c 20 22 5c 6e 22 29 3b 20 66 66 6c 75 73 68  ), "\n"); fflush
1580: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
1590: 28 29 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65  ()); }.#  define
15a0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
15b0: 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20  INTBUF(f, x, y) 
15c0: 7b 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  { unsigned char 
15d0: 2a 54 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e 65  *TMPBUF; unsigne
15e0: 64 20 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50 42  d long idx; TMPB
15f0: 55 46 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  UF = (unsigned c
1600: 68 61 72 20 2a 29 20 28 78 29 3b 20 43 41 43 4b  har *) (x); CACK
1610: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 49  EY_DEBUG_PRINTTI
1620: 4d 45 3b 20 66 70 72 69 6e 74 66 28 63 61 63 6b  ME; fprintf(cack
1630: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1640: 25 73 28 29 3a 25 69 3a 20 25 73 20 20 28 25 73  %s():%i: %s  (%s
1650: 2f 25 6c 75 20 3d 20 7b 25 30 32 78 22 2c 20 5f  /%lu = {%02x", _
1660: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1670: 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67  _, f, #x, (unsig
1680: 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54  ned long) (y), T
1690: 4d 50 42 55 46 5b 30 5d 29 3b 20 66 6f 72 20 28  MPBUF[0]); for (
16a0: 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28  idx = 1; idx < (
16b0: 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20 66 70 72  y); idx++) { fpr
16c0: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
16d0: 67 5f 66 64 28 29 2c 20 22 2c 20 25 30 32 78 22  g_fd(), ", %02x"
16e0: 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20  , TMPBUF[idx]); 
16f0: 7d 3b 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65  }; fprintf(cacke
1700: 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 7d  y_debug_fd(), "}
1710: 29 5c 6e 22 29 3b 20 66 66 6c 75 73 68 28 63 61  )\n"); fflush(ca
1720: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29  ckey_debug_fd())
1730: 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ; }.#  define CA
1740: 43 4b 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f  CKEY_DEBUG_PERRO
1750: 52 28 78 29 20 7b 20 66 70 72 69 6e 74 66 28 63  R(x) { fprintf(c
1760: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1770: 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f  , "%s():%i: ", _
1780: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1790: 5f 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55 47  _); CACKEY_DEBUG
17a0: 5f 50 52 49 4e 54 54 49 4d 45 3b 20 70 65 72 72  _PRINTTIME; perr
17b0: 6f 72 28 78 29 3b 20 66 66 6c 75 73 68 28 63 61  or(x); fflush(ca
17c0: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29  ckey_debug_fd())
17d0: 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 66 72  ; }.#  define fr
17e0: 65 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f 44  ee(x) { CACKEY_D
17f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52 45  EBUG_PRINTF("FRE
1800: 45 28 25 70 29 20 28 25 73 29 22 2c 20 28 76 6f  E(%p) (%s)", (vo
1810: 69 64 20 2a 29 20 78 2c 20 23 78 29 3b 20 66 72  id *) x, #x); fr
1820: 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69 63  ee(x); }..static
1830: 20 46 49 4c 45 20 2a 63 61 63 6b 65 79 5f 64 65   FILE *cackey_de
1840: 62 75 67 5f 66 64 28 76 6f 69 64 29 20 7b 0a 09  bug_fd(void) {..
1850: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 64 20  static FILE *fd 
1860: 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6c  = NULL;..char *l
1870: 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20 28 66 64  ogfile;...if (fd
1880: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   != NULL) {...re
1890: 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09 2f  turn(fd);..}.../
18a0: 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20 73 74 64  *.. * Log to std
18b0: 65 72 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 6f  err initially so
18c0: 20 77 65 20 63 61 6e 20 75 73 65 20 64 65 62 75   we can use debu
18d0: 67 67 69 6e 67 20 77 69 74 68 69 6e 0a 09 20 2a  gging within.. *
18e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
18f0: 69 74 68 6f 75 74 20 67 65 74 74 69 6e 67 20 69  ithout getting i
1900: 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65 20  nto an infinite 
1910: 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64 20 3d 20  loop.. */..fd = 
1920: 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67 66 69 6c  stderr;...logfil
1930: 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43 4b  e = getenv("CACK
1940: 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45  EY_DEBUG_LOGFILE
1950: 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65  ");..if (logfile
1960: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   != NULL) {...CA
1970: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1980: 46 28 22 46 6f 75 6e 64 20 65 6e 76 69 72 6f 6e  F("Found environ
1990: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 3a 20 25  ment variable: %
19a0: 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09  s", logfile);...
19b0: 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74 72 63 68  .logfile = strch
19c0: 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d 27 29 3b  r(logfile, '=');
19d0: 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 3d  ...if (logfile =
19e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67  = NULL) {....log
19f0: 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43  file = getenv("C
1a00: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1a10: 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c 73 65 20  ILE");...} else 
1a20: 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b 0a  {....logfile++;.
1a30: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f 67  ..}..}...if (log
1a40: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
1a50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a60: 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6c 6f 67  RINTF("Found log
1a70: 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c 6f 67 66   file: %s", logf
1a80: 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d 20 66 6f  ile);....fd = fo
1a90: 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20 22 61 22  pen(logfile, "a"
1aa0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d  );..}...if (fd =
1ab0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 64 20 3d  = NULL) {...fd =
1ac0: 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a 09 69 66   stderr;..}...if
1ad0: 20 28 66 64 20 3d 3d 20 73 74 64 65 72 72 29 20   (fd == stderr) 
1ae0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1af0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1b00: 6e 67 20 73 74 64 65 72 72 22 29 3b 0a 09 7d 20  ng stderr");..} 
1b10: 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f  else {...CACKEY_
1b20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1b30: 74 75 72 6e 69 6e 67 20 25 70 22 2c 20 28 76 6f  turning %p", (vo
1b40: 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d 0a 0a 09  id *) fd);..}...
1b50: 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a 73  return(fd);.}..s
1b60: 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b  tatic void *CACK
1b70: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41  EY_DEBUG_FUNC_MA
1b80: 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65  LLOC(size_t size
1b90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75  , const char *fu
1ba0: 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a  nc, int line) {.
1bb0: 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a  .void *retval;..
1bc0: 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63  .retval = malloc
1bd0: 28 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59  (size);...CACKEY
1be0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45  _DEBUG_PRINTTIME
1bf0: 3b 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65  ;..fprintf(cacke
1c00: 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 25  y_debug_fd(), "%
1c10: 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c  s():%i: ", func,
1c20: 20 6c 69 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66   line);..fprintf
1c30: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
1c40: 28 29 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 3d 20  (), "MALLOC() = 
1c50: 25 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66  %p", retval);..f
1c60: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1c70: 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b  bug_fd(), "\n");
1c80: 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
1c90: 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72  debug_fd());...r
1ca0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
1cb0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43  ..static void *C
1cc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
1cd0: 5f 52 45 41 4c 4c 4f 43 28 76 6f 69 64 20 2a 70  _REALLOC(void *p
1ce0: 74 72 2c 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c  tr, size_t size,
1cf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e   const char *fun
1d00: 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09  c, int line) {..
1d10: 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09  void *retval;...
1d20: 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63  retval = realloc
1d30: 28 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 69  (ptr, size);...i
1d40: 66 20 28 72 65 74 76 61 6c 20 21 3d 20 70 74 72  f (retval != ptr
1d50: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d60: 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 0a 09 09  UG_PRINTTIME;...
1d70: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
1d80: 65 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28 29  ebug_fd(), "%s()
1d90: 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69  :%i: ", func, li
1da0: 6e 65 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 63  ne);...fprintf(c
1db0: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1dc0: 2c 20 22 52 45 41 4c 4c 4f 43 28 25 70 29 20 3d  , "REALLOC(%p) =
1dd0: 20 25 70 22 2c 20 70 74 72 2c 20 72 65 74 76 61   %p", ptr, retva
1de0: 6c 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 63 61  l);...fprintf(ca
1df0: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
1e00: 20 22 5c 6e 22 29 3b 0a 09 09 66 66 6c 75 73 68   "\n");...fflush
1e10: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
1e20: 28 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  ());..}...if (re
1e30: 74 76 61 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tval == NULL) {.
1e40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e50: 52 49 4e 54 46 28 22 20 2a 2a 2a 20 45 52 52 4f  RINTF(" *** ERRO
1e60: 52 20 2a 2a 2a 20 72 65 61 6c 6c 6f 63 20 72 65  R *** realloc re
1e70: 74 75 72 6e 65 64 20 4e 55 4c 4c 20 28 73 69 7a  turned NULL (siz
1e80: 65 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  e = %lu)", (unsi
1e90: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29  gned long) size)
1ea0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
1eb0: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
1ec0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
1ed0: 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28  BUG_FUNC_STRDUP(
1ee0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 74 72 2c  const char *ptr,
1ef0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e   const char *fun
1f00: 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09  c, int line) {..
1f10: 63 68 61 72 20 2a 72 65 74 76 61 6c 3b 0a 0a 09  char *retval;...
1f20: 72 65 74 76 61 6c 20 3d 20 73 74 72 64 75 70 28  retval = strdup(
1f30: 70 74 72 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ptr);...CACKEY_D
1f40: 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 0a  EBUG_PRINTTIME;.
1f50: 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f  .fprintf(cackey_
1f60: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28  debug_fd(), "%s(
1f70: 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c  ):%i: ", func, l
1f80: 69 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 63  ine);..fprintf(c
1f90: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1fa0: 2c 20 22 53 54 52 44 55 50 5f 4d 41 4c 4c 4f 43  , "STRDUP_MALLOC
1fb0: 28 29 20 3d 20 25 70 22 2c 20 72 65 74 76 61 6c  () = %p", retval
1fc0: 29 3b 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b  );..fprintf(cack
1fd0: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1fe0: 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 63 61  \n");..fflush(ca
1ff0: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29  ckey_debug_fd())
2000: 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
2010: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f  l);.}..static co
2020: 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59  nst char *CACKEY
2030: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f  _DEBUG_FUNC_TAG_
2040: 54 4f 5f 53 54 52 28 75 6e 73 69 67 6e 65 64 20  TO_STR(unsigned 
2050: 63 68 61 72 20 74 61 67 29 20 7b 0a 09 73 77 69  char tag) {..swi
2060: 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 63 61  tch (tag) {...ca
2070: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
2080: 44 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DID:....return("
2090: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
20a0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
20b0: 5f 54 41 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09  _TAG_CCC_VER:...
20c0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
20d0: 41 47 5f 43 43 43 5f 56 45 52 22 29 3b 0a 09 09  AG_CCC_VER");...
20e0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
20f0: 43 47 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72  CG_VER:....retur
2100: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 47  n("GSCIS_TAG_CCG
2110: 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47  _VER");...case G
2120: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
2130: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2140: 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 22 29  IS_TAG_CARDURL")
2150: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2160: 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 72 65  AG_PKCS15:....re
2170: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2180: 50 4b 43 53 31 35 22 29 3b 0a 09 09 63 61 73 65  PKCS15");...case
2190: 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44   GSCIS_TAG_REG_D
21a0: 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65  ATA_MODEL:....re
21b0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
21c0: 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29  REG_DATA_MODEL")
21d0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
21e0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
21f0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2200: 41 47 5f 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a  AG_ACR_TABLE");.
2210: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2220: 5f 43 41 52 44 5f 41 50 44 55 3a 0a 09 09 09 72  _CARD_APDU:....r
2230: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2240: 5f 43 41 52 44 5f 41 50 44 55 22 29 3b 0a 09 09  _CARD_APDU");...
2250: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52  case GSCIS_TAG_R
2260: 45 44 49 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72  EDIRECTION:....r
2270: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2280: 5f 52 45 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a  _REDIRECTION");.
2290: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
22a0: 5f 43 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  _CT:....return("
22b0: 47 53 43 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a  GSCIS_TAG_CT");.
22c0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
22d0: 5f 53 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  _ST:....return("
22e0: 47 53 43 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a  GSCIS_TAG_ST");.
22f0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2300: 5f 4e 45 58 54 43 43 43 3a 0a 09 09 09 72 65 74  _NEXTCCC:....ret
2310: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e  urn("GSCIS_TAG_N
2320: 45 58 54 43 43 43 22 29 3b 0a 09 09 63 61 73 65  EXTCCC");...case
2330: 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45   GSCIS_TAG_FNAME
2340: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2350: 49 53 5f 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a  IS_TAG_FNAME");.
2360: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2370: 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72  _MNAME:....retur
2380: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  n("GSCIS_TAG_MNA
2390: 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ME");...case GSC
23a0: 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09  IS_TAG_LNAME:...
23b0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
23c0: 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61  AG_LNAME");...ca
23d0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46  se GSCIS_TAG_SUF
23e0: 46 49 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  FIX:....return("
23f0: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
2400: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2410: 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59  _TAG_GOVT_AGENCY
2420: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2430: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e  IS_TAG_GOVT_AGEN
2440: 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  CY");...case GSC
2450: 49 53 5f 54 41 47 5f 42 55 52 45 41 55 3a 0a 09  IS_TAG_BUREAU:..
2460: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2470: 54 41 47 5f 42 55 52 45 41 55 22 29 3b 0a 09 09  TAG_BUREAU");...
2480: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42  case GSCIS_TAG_B
2490: 55 52 45 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72  UREAU_CODE:....r
24a0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
24b0: 5f 42 55 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a  _BUREAU_CODE");.
24c0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
24d0: 5f 44 45 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72  _DEPT_CODE:....r
24e0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
24f0: 5f 44 45 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09  _DEPT_CODE");...
2500: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 54  case GSCIS_TAG_T
2510: 49 54 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ITLE:....return(
2520: 22 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45  "GSCIS_TAG_TITLE
2530: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2540: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09  _TAG_BUILDING:..
2550: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2560: 54 41 47 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a  TAG_BUILDING");.
2570: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2580: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 3a 0a 09  _OFFICE_ADDR1:..
2590: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
25a0: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31  TAG_OFFICE_ADDR1
25b0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
25c0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
25d0: 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  2:....return("GS
25e0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
25f0: 44 44 52 32 22 29 3b 0a 09 09 63 61 73 65 20 47  DDR2");...case G
2600: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2610: 43 49 54 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  CITY:....return(
2620: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2630: 45 5f 43 49 54 59 22 29 3b 0a 09 09 63 61 73 65  E_CITY");...case
2640: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2650: 45 5f 53 54 41 54 45 3a 0a 09 09 09 72 65 74 75  E_STATE:....retu
2660: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2670: 46 49 43 45 5f 53 54 41 54 45 22 29 3b 0a 09 09  FICE_STATE");...
2680: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2690: 46 46 49 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65  FFICE_ZIP:....re
26a0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
26b0: 4f 46 46 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09  OFFICE_ZIP");...
26c0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
26d0: 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09  FFICE_COUNTRY:..
26e0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
26f0: 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54  TAG_OFFICE_COUNT
2700: 52 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  RY");...case GSC
2710: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
2720: 4f 4e 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ONE:....return("
2730: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2740: 5f 50 48 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65  _PHONE");...case
2750: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2760: 45 5f 50 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09  E_PHONE_EXT:....
2770: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2780: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45  G_OFFICE_PHONE_E
2790: 58 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  XT");...case GSC
27a0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41  IS_TAG_OFFICE_FA
27b0: 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  X:....return("GS
27c0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
27d0: 41 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  AX");...case GSC
27e0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
27f0: 41 49 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AIL:....return("
2800: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2810: 5f 45 4d 41 49 4c 22 29 3b 0a 09 09 63 61 73 65  _EMAIL");...case
2820: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2830: 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72  E_ROOM:....retur
2840: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2850: 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61  ICE_ROOM");...ca
2860: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  se GSCIS_TAG_NON
2870: 47 4f 56 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72  GOV_AGENCY:....r
2880: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2890: 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29  _NONGOV_AGENCY")
28a0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
28b0: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f  AG_SSN_DESIGNATO
28c0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  R:....return("GS
28d0: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
28e0: 47 4e 41 54 4f 52 22 29 3b 0a 09 09 63 61 73 65  GNATOR");...case
28f0: 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a   GSCIS_TAG_SSN:.
2900: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2910: 5f 54 41 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61  _TAG_SSN");...ca
2920: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42  se GSCIS_TAG_DOB
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 44 4f 42 22 29 3b 0a 09 09  IS_TAG_DOB");...
2950: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47  case GSCIS_TAG_G
2960: 45 4e 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  ENDER:....return
2970: 28 22 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44  ("GSCIS_TAG_GEND
2980: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ER");...case GSC
2990: 49 53 5f 54 41 47 5f 55 53 45 52 49 44 3a 0a 09  IS_TAG_USERID:..
29a0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
29b0: 54 41 47 5f 55 53 45 52 49 44 22 29 3b 0a 09 09  TAG_USERID");...
29c0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44  case GSCIS_TAG_D
29d0: 4f 4d 41 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e  OMAIN:....return
29e0: 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41  ("GSCIS_TAG_DOMA
29f0: 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  IN");...case GSC
2a00: 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 3a  IS_TAG_PASSWORD:
2a10: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2a20: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 22 29  S_TAG_PASSWORD")
2a30: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2a40: 41 47 5f 49 53 53 55 45 52 49 44 3a 0a 09 09 09  AG_ISSUERID:....
2a50: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2a60: 47 5f 49 53 53 55 45 52 49 44 22 29 3b 0a 09 09  G_ISSUERID");...
2a70: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
2a80: 45 52 4e 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERNO:....return(
2a90: 22 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f  "GSCIS_TAG_SERNO
2aa0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2ab0: 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45 3a  _TAG_ISSUE_DATE:
2ac0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2ad0: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
2ae0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2af0: 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45  _TAG_EXPIRE_DATE
2b00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2b10: 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41  IS_TAG_EXPIRE_DA
2b20: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  TE");...case GSC
2b30: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
2b40: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2b50: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
2b60: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2b70: 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f  _TAG_SECURITY_CO
2b80: 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  DE:....return("G
2b90: 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54  SCIS_TAG_SECURIT
2ba0: 59 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65  Y_CODE");...case
2bb0: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49   GSCIS_TAG_CARDI
2bc0: 44 5f 41 49 44 3a 0a 09 09 09 72 65 74 75 72 6e  D_AID:....return
2bd0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  ("GSCIS_TAG_CARD
2be0: 49 44 5f 41 49 44 22 29 3b 0a 09 09 63 61 73 65  ID_AID");...case
2bf0: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
2c00: 46 49 43 41 54 45 3a 0a 09 09 09 72 65 74 75 72  FICATE:....retur
2c10: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52  n("GSCIS_TAG_CER
2c20: 54 49 46 49 43 41 54 45 22 29 3b 0a 09 09 63 61  TIFICATE");...ca
2c30: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  se GSCIS_TAG_CER
2c40: 54 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09  T_ISSUE_DATE:...
2c50: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2c60: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
2c70: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  TE");...case GSC
2c80: 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49  IS_TAG_CERT_EXPI
2c90: 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  RE_DATE:....retu
2ca0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45  rn("GSCIS_TAG_CE
2cb0: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29  RT_EXPIRE_DATE")
2cc0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55  ;..}...return("U
2cd0: 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61  NKNOWN");.}..sta
2ce0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2cf0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2d00: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
2d10: 52 28 4c 4f 4e 47 20 72 65 74 63 6f 64 65 29 20  R(LONG retcode) 
2d20: 7b 0a 09 73 77 69 74 63 68 20 28 72 65 74 63 6f  {..switch (retco
2d30: 64 65 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41  de) {...case SCA
2d40: 52 44 5f 53 5f 53 55 43 43 45 53 53 3a 0a 09 09  RD_S_SUCCESS:...
2d50: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 53  .return("SCARD_S
2d60: 5f 53 55 43 43 45 53 53 22 29 3b 0a 09 09 63 61  _SUCCESS");...ca
2d70: 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 43 45  se SCARD_E_CANCE
2d80: 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  LLED:....return(
2d90: 22 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c  "SCARD_E_CANCELL
2da0: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
2db0: 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53  RD_E_CANT_DISPOS
2dc0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
2dd0: 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f  ARD_E_CANT_DISPO
2de0: 53 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  SE");...case SCA
2df0: 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e  RD_E_INSUFFICIEN
2e00: 54 5f 42 55 46 46 45 52 3a 0a 09 09 09 72 65 74  T_BUFFER:....ret
2e10: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 53  urn("SCARD_E_INS
2e20: 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52  UFFICIENT_BUFFER
2e30: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2e40: 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a  _E_INVALID_ATR:.
2e50: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2e60: 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 22 29  _E_INVALID_ATR")
2e70: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2e80: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a  _INVALID_HANDLE:
2e90: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2ea0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44  D_E_INVALID_HAND
2eb0: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  LE");...case SCA
2ec0: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52  RD_E_INVALID_PAR
2ed0: 41 4d 45 54 45 52 3a 0a 09 09 09 72 65 74 75 72  AMETER:....retur
2ee0: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
2ef0: 49 44 5f 50 41 52 41 4d 45 54 45 52 22 29 3b 0a  ID_PARAMETER");.
2f00: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49  ..case SCARD_E_I
2f10: 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09  NVALID_TARGET:..
2f20: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2f30: 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 54  E_INVALID_TARGET
2f40: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2f50: 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45  _E_INVALID_VALUE
2f60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2f70: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c  RD_E_INVALID_VAL
2f80: 55 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  UE");...case SCA
2f90: 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a  RD_E_NO_MEMORY:.
2fa0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2fb0: 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a  _E_NO_MEMORY");.
2fc0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55  ..case SCARD_E_U
2fd0: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09  NKNOWN_READER:..
2fe0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2ff0: 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52  E_UNKNOWN_READER
3000: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3010: 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72  _E_TIMEOUT:....r
3020: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 54  eturn("SCARD_E_T
3030: 49 4d 45 4f 55 54 22 29 3b 0a 09 09 63 61 73 65  IMEOUT");...case
3040: 20 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47   SCARD_E_SHARING
3050: 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72  _VIOLATION:....r
3060: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53  eturn("SCARD_E_S
3070: 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e  HARING_VIOLATION
3080: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3090: 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a  _E_NO_SMARTCARD:
30a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
30b0: 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44  D_E_NO_SMARTCARD
30c0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
30d0: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a  _E_UNKNOWN_CARD:
30e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
30f0: 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44  D_E_UNKNOWN_CARD
3100: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3110: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
3120: 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  H:....return("SC
3130: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
3140: 41 54 43 48 22 29 3b 0a 09 09 63 61 73 65 20 53  ATCH");...case S
3150: 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59  CARD_E_NOT_READY
3160: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3170: 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29  RD_E_NOT_READY")
3180: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3190: 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45  _SYSTEM_CANCELLE
31a0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
31b0: 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e  ARD_E_SYSTEM_CAN
31c0: 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65  CELLED");...case
31d0: 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41   SCARD_E_NOT_TRA
31e0: 4e 53 41 43 54 45 44 3a 0a 09 09 09 72 65 74 75  NSACTED:....retu
31f0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f  rn("SCARD_E_NOT_
3200: 54 52 41 4e 53 41 43 54 45 44 22 29 3b 0a 09 09  TRANSACTED");...
3210: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45 41  case SCARD_E_REA
3220: 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a  DER_UNAVAILABLE:
3230: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3240: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41  D_E_READER_UNAVA
3250: 49 4c 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65  ILABLE");...case
3260: 20 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f   SCARD_W_UNSUPPO
3270: 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65  RTED_CARD:....re
3280: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e  turn("SCARD_W_UN
3290: 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44 22 29  SUPPORTED_CARD")
32a0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57  ;...case SCARD_W
32b0: 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41  _UNRESPONSIVE_CA
32c0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
32d0: 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53  CARD_W_UNRESPONS
32e0: 49 56 45 5f 43 41 52 44 22 29 3b 0a 09 09 63 61  IVE_CARD");...ca
32f0: 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  se SCARD_W_UNPOW
3300: 45 52 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65  ERED_CARD:....re
3310: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e  turn("SCARD_W_UN
3320: 50 4f 57 45 52 45 44 5f 43 41 52 44 22 29 3b 0a  POWERED_CARD");.
3330: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52  ..case SCARD_W_R
3340: 45 53 45 54 5f 43 41 52 44 3a 0a 09 09 09 72 65  ESET_CARD:....re
3350: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45  turn("SCARD_W_RE
3360: 53 45 54 5f 43 41 52 44 22 29 3b 0a 09 09 63 61  SET_CARD");...ca
3370: 73 65 20 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56  se SCARD_W_REMOV
3380: 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ED_CARD:....retu
3390: 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f  rn("SCARD_W_REMO
33a0: 56 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61  VED_CARD");...ca
33b0: 73 65 20 53 43 41 52 44 5f 45 5f 50 43 49 5f 54  se SCARD_E_PCI_T
33c0: 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74  OO_SMALL:....ret
33d0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 43 49  urn("SCARD_E_PCI
33e0: 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09  _TOO_SMALL");...
33f0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45 41  case SCARD_E_REA
3400: 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a  DER_UNSUPPORTED:
3410: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3420: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50  D_E_READER_UNSUP
3430: 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73 65  PORTED");...case
3440: 20 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41   SCARD_E_DUPLICA
3450: 54 45 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65  TE_READER:....re
3460: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 44 55  turn("SCARD_E_DU
3470: 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52 22 29  PLICATE_READER")
3480: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3490: 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45  _CARD_UNSUPPORTE
34a0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
34b0: 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50  ARD_E_CARD_UNSUP
34c0: 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73 65  PORTED");...case
34d0: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56   SCARD_E_NO_SERV
34e0: 49 43 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ICE:....return("
34f0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49  SCARD_E_NO_SERVI
3500: 43 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  CE");...case SCA
3510: 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f  RD_E_SERVICE_STO
3520: 50 50 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  PPED:....return(
3530: 22 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45  "SCARD_E_SERVICE
3540: 5f 53 54 4f 50 50 45 44 22 29 3b 0a 09 09 63 61  _STOPPED");...ca
3550: 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 53 55 50  se SCARD_E_UNSUP
3560: 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 3a 0a  PORTED_FEATURE:.
3570: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3580: 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46  _E_UNSUPPORTED_F
3590: 45 41 54 55 52 45 22 29 3b 0a 23 69 66 64 65 66  EATURE");.#ifdef
35a0: 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45   SCARD_W_INSERTE
35b0: 44 5f 43 41 52 44 0a 09 09 63 61 73 65 20 53 43  D_CARD...case SC
35c0: 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43  ARD_W_INSERTED_C
35d0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
35e0: 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44  SCARD_W_INSERTED
35f0: 5f 43 41 52 44 22 29 3b 0a 23 65 6e 64 69 66 0a  _CARD");.#endif.
3600: 23 69 66 64 65 66 20 53 43 41 52 44 5f 45 5f 4e  #ifdef SCARD_E_N
3610: 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41  O_READERS_AVAILA
3620: 42 4c 45 0a 09 09 63 61 73 65 20 53 43 41 52 44  BLE...case SCARD
3630: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56  _E_NO_READERS_AV
3640: 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  AILABLE:....retu
3650: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  rn("SCARD_E_NO_R
3660: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
3670: 22 29 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09  ");.#endif..}...
3680: 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22  return("UNKNOWN"
3690: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e  );.}..static con
36a0: 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f  st char *CACKEY_
36b0: 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
36c0: 5f 54 4f 5f 53 54 52 28 75 69 6e 74 31 36 5f 74  _TO_STR(uint16_t
36d0: 20 6f 62 6a 69 64 29 20 7b 0a 09 73 77 69 74 63   objid) {..switc
36e0: 68 20 28 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61  h (objid) {...ca
36f0: 73 65 20 30 78 32 30 30 30 3a 0a 09 09 09 72 65  se 0x2000:....re
3700: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3710: 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e  _OBJID_GENERALIN
3720: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 32  FO");...case 0x2
3730: 31 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  100:....return("
3740: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3750: 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f  _PROPERSONALINFO
3760: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 33 30 30  ");...case 0x300
3770: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3780: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41  CKEY_TLV_OBJID_A
3790: 43 43 45 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a  CCESSCONTROL");.
37a0: 09 09 63 61 73 65 20 30 78 34 30 30 30 3a 0a 09  ..case 0x4000:..
37b0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
37c0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e  _TLV_OBJID_LOGIN
37d0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 35 30 30  ");...case 0x500
37e0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
37f0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
3800: 41 52 44 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73  ARDINFO");...cas
3810: 65 20 30 78 36 30 30 30 3a 0a 09 09 09 72 65 74  e 0x6000:....ret
3820: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3830: 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53  OBJID_BIOMETRICS
3840: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 37 30 30  ");...case 0x700
3850: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3860: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44  CKEY_TLV_OBJID_D
3870: 49 47 49 54 41 4c 53 49 47 43 45 52 54 22 29 3b  IGITALSIGCERT");
3880: 0a 09 09 63 61 73 65 20 30 78 30 32 30 30 3a 0a  ...case 0x0200:.
3890: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
38a0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
38b0: 50 45 52 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65  PERSON");...case
38c0: 20 30 78 30 32 30 32 3a 0a 09 09 09 72 65 74 75   0x0202:....retu
38d0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
38e0: 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54  BJID_CAC_BENEFIT
38f0: 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  S");...case 0x02
3900: 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  03:....return("C
3910: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3920: 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54  CAC_OTHERBENEFIT
3930: 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  S");...case 0x02
3940: 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  01:....return("C
3950: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3960: 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b  CAC_PERSONNEL");
3970: 0a 09 09 63 61 73 65 20 30 78 30 32 46 45 3a 0a  ...case 0x02FE:.
3980: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3990: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
39a0: 50 4b 49 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a  PKICERT");..}...
39b0: 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e  .return("UNKNOWN
39c0: 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f  ");.}..static co
39d0: 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59  nst char *CACKEY
39e0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54  _DEBUG_FUNC_APPT
39f0: 59 50 45 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38  YPE_TO_STR(uint8
3a00: 5f 74 20 61 70 70 74 79 70 65 29 20 7b 0a 09 73  _t apptype) {..s
3a10: 77 69 74 63 68 20 28 61 70 70 74 79 70 65 29 20  witch (apptype) 
3a20: 7b 0a 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09  {...case 0x00:..
3a30: 09 09 72 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29  ..return("NONE")
3a40: 3b 0a 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09  ;...case 0x01:..
3a50: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3a60: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
3a70: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 3a  ");...case 0x02:
3a80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3a90: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29  EY_TLV_APP_SKI")
3aa0: 3b 0a 09 09 63 61 73 65 20 30 78 30 33 3a 0a 09  ;...case 0x03:..
3ab0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3ac0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
3ad0: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
3ae0: 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_SKI");...case 
3af0: 30 78 30 34 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x04:....return(
3b00: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3b10: 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  PKI");...case 0x
3b20: 30 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  05:....return("C
3b30: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45  ACKEY_TLV_APP_GE
3b40: 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54  NERIC | CACKEY_T
3b50: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
3b60: 63 61 73 65 20 30 78 30 36 3a 0a 09 09 09 72 65  case 0x06:....re
3b70: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3b80: 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45  _APP_SKI | CACKE
3b90: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b  Y_TLV_APP_PKI");
3ba0: 0a 09 09 63 61 73 65 20 30 78 30 37 3a 0a 09 09  ...case 0x07:...
3bb0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3bc0: 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20  TLV_APP_GENERIC 
3bd0: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
3be0: 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c  _SKI | CACKEY_TL
3bf0: 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a  V_APP_PKI");..}.
3c00: 0a 09 72 65 74 75 72 6e 28 22 49 4e 56 41 4c 49  ..return("INVALI
3c10: 44 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  D");.}..static c
3c20: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
3c30: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54  Y_DEBUG_FUNC_ATT
3c40: 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 43 4b  RIBUTE_TO_STR(CK
3c50: 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 20  _ATTRIBUTE_TYPE 
3c60: 61 74 74 72 29 20 7b 0a 09 73 77 69 74 63 68 20  attr) {..switch 
3c70: 28 61 74 74 72 29 20 7b 0a 09 09 63 61 73 65 20  (attr) {...case 
3c80: 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 72 65  CKA_CLASS:....re
3c90: 74 75 72 6e 28 22 43 4b 41 5f 43 4c 41 53 53 22  turn("CKA_CLASS"
3ca0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 54 4f  );...case CKA_TO
3cb0: 4b 45 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  KEN:....return("
3cc0: 43 4b 41 5f 54 4f 4b 45 4e 22 29 3b 0a 09 09 63  CKA_TOKEN");...c
3cd0: 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a  ase CKA_PRIVATE:
3ce0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3cf0: 50 52 49 56 41 54 45 22 29 3b 0a 09 09 63 61 73  PRIVATE");...cas
3d00: 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09  e CKA_LABEL:....
3d10: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 41 42 45  return("CKA_LABE
3d20: 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  L");...case CKA_
3d30: 41 50 50 4c 49 43 41 54 49 4f 4e 3a 0a 09 09 09  APPLICATION:....
3d40: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 50 50 4c  return("CKA_APPL
3d50: 49 43 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  ICATION");...cas
3d60: 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09  e CKA_VALUE:....
3d70: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55  return("CKA_VALU
3d80: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
3d90: 4f 42 4a 45 43 54 5f 49 44 3a 0a 09 09 09 72 65  OBJECT_ID:....re
3da0: 74 75 72 6e 28 22 43 4b 41 5f 4f 42 4a 45 43 54  turn("CKA_OBJECT
3db0: 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  _ID");...case CK
3dc0: 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  A_CERTIFICATE_TY
3dd0: 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  PE:....return("C
3de0: 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  KA_CERTIFICATE_T
3df0: 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  YPE");...case CK
3e00: 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 72 65 74  A_ISSUER:....ret
3e10: 75 72 6e 28 22 43 4b 41 5f 49 53 53 55 45 52 22  urn("CKA_ISSUER"
3e20: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45  );...case CKA_SE
3e30: 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09  RIAL_NUMBER:....
3e40: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 52 49  return("CKA_SERI
3e50: 41 4c 5f 4e 55 4d 42 45 52 22 29 3b 0a 09 09 63  AL_NUMBER");...c
3e60: 61 73 65 20 43 4b 41 5f 41 43 5f 49 53 53 55 45  ase CKA_AC_ISSUE
3e70: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
3e80: 41 5f 41 43 5f 49 53 53 55 45 52 22 29 3b 0a 09  A_AC_ISSUER");..
3e90: 09 63 61 73 65 20 43 4b 41 5f 4f 57 4e 45 52 3a  .case CKA_OWNER:
3ea0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3eb0: 4f 57 4e 45 52 22 29 3b 0a 09 09 63 61 73 65 20  OWNER");...case 
3ec0: 43 4b 41 5f 41 54 54 52 5f 54 59 50 45 53 3a 0a  CKA_ATTR_TYPES:.
3ed0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
3ee0: 54 54 52 5f 54 59 50 45 53 22 29 3b 0a 09 09 63  TTR_TYPES");...c
3ef0: 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45 44 3a  ase CKA_TRUSTED:
3f00: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3f10: 54 52 55 53 54 45 44 22 29 3b 0a 09 09 63 61 73  TRUSTED");...cas
3f20: 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a  e CKA_KEY_TYPE:.
3f30: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b  ...return("CKA_K
3f40: 45 59 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73  EY_TYPE");...cas
3f50: 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09  e CKA_SUBJECT:..
3f60: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55  ..return("CKA_SU
3f70: 42 4a 45 43 54 22 29 3b 0a 09 09 63 61 73 65 20  BJECT");...case 
3f80: 43 4b 41 5f 49 44 3a 0a 09 09 09 72 65 74 75 72  CKA_ID:....retur
3f90: 6e 28 22 43 4b 41 5f 49 44 22 29 3b 0a 09 09 63  n("CKA_ID");...c
3fa0: 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56  ase CKA_SENSITIV
3fb0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
3fc0: 41 5f 53 45 4e 53 49 54 49 56 45 22 29 3b 0a 09  A_SENSITIVE");..
3fd0: 09 63 61 73 65 20 43 4b 41 5f 45 4e 43 52 59 50  .case CKA_ENCRYP
3fe0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
3ff0: 41 5f 45 4e 43 52 59 50 54 22 29 3b 0a 09 09 63  A_ENCRYPT");...c
4000: 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50 54 3a  ase CKA_DECRYPT:
4010: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4020: 44 45 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73  DECRYPT");...cas
4030: 65 20 43 4b 41 5f 57 52 41 50 3a 0a 09 09 09 72  e CKA_WRAP:....r
4040: 65 74 75 72 6e 28 22 43 4b 41 5f 57 52 41 50 22  eturn("CKA_WRAP"
4050: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 55 4e  );...case CKA_UN
4060: 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e 28  WRAP:....return(
4070: 22 43 4b 41 5f 55 4e 57 52 41 50 22 29 3b 0a 09  "CKA_UNWRAP");..
4080: 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a  .case CKA_SIGN:.
4090: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
40a0: 49 47 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  IGN");...case CK
40b0: 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a  A_SIGN_RECOVER:.
40c0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
40d0: 49 47 4e 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09  IGN_RECOVER");..
40e0: 09 63 61 73 65 20 43 4b 41 5f 56 45 52 49 46 59  .case CKA_VERIFY
40f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4100: 5f 56 45 52 49 46 59 22 29 3b 0a 09 09 63 61 73  _VERIFY");...cas
4110: 65 20 43 4b 41 5f 56 45 52 49 46 59 5f 52 45 43  e CKA_VERIFY_REC
4120: 4f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  OVER:....return(
4130: 22 43 4b 41 5f 56 45 52 49 46 59 5f 52 45 43 4f  "CKA_VERIFY_RECO
4140: 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  VER");...case CK
4150: 41 5f 44 45 52 49 56 45 3a 0a 09 09 09 72 65 74  A_DERIVE:....ret
4160: 75 72 6e 28 22 43 4b 41 5f 44 45 52 49 56 45 22  urn("CKA_DERIVE"
4170: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 54  );...case CKA_ST
4180: 41 52 54 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  ART_DATE:....ret
4190: 75 72 6e 28 22 43 4b 41 5f 53 54 41 52 54 5f 44  urn("CKA_START_D
41a0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ATE");...case CK
41b0: 41 5f 45 4e 44 5f 44 41 54 45 3a 0a 09 09 09 72  A_END_DATE:....r
41c0: 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 44 5f 44  eturn("CKA_END_D
41d0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ATE");...case CK
41e0: 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 72 65  A_MODULUS:....re
41f0: 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55  turn("CKA_MODULU
4200: 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  S");...case CKA_
4210: 4d 4f 44 55 4c 55 53 5f 42 49 54 53 3a 0a 09 09  MODULUS_BITS:...
4220: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44  .return("CKA_MOD
4230: 55 4c 55 53 5f 42 49 54 53 22 29 3b 0a 09 09 63  ULUS_BITS");...c
4240: 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45  ase CKA_PUBLIC_E
4250: 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75  XPONENT:....retu
4260: 72 6e 28 22 43 4b 41 5f 50 55 42 4c 49 43 5f 45  rn("CKA_PUBLIC_E
4270: 58 50 4f 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73  XPONENT");...cas
4280: 65 20 43 4b 41 5f 50 52 49 56 41 54 45 5f 45 58  e CKA_PRIVATE_EX
4290: 50 4f 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75 72  PONENT:....retur
42a0: 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45 5f 45  n("CKA_PRIVATE_E
42b0: 58 50 4f 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73  XPONENT");...cas
42c0: 65 20 43 4b 41 5f 50 52 49 4d 45 5f 31 3a 0a 09  e CKA_PRIME_1:..
42d0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52  ..return("CKA_PR
42e0: 49 4d 45 5f 31 22 29 3b 0a 09 09 63 61 73 65 20  IME_1");...case 
42f0: 43 4b 41 5f 50 52 49 4d 45 5f 32 3a 0a 09 09 09  CKA_PRIME_2:....
4300: 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d  return("CKA_PRIM
4310: 45 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  E_2");...case CK
4320: 41 5f 45 58 50 4f 4e 45 4e 54 5f 31 3a 0a 09 09  A_EXPONENT_1:...
4330: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50  .return("CKA_EXP
4340: 4f 4e 45 4e 54 5f 31 22 29 3b 0a 09 09 63 61 73  ONENT_1");...cas
4350: 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32  e CKA_EXPONENT_2
4360: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4370: 5f 45 58 50 4f 4e 45 4e 54 5f 32 22 29 3b 0a 09  _EXPONENT_2");..
4380: 09 63 61 73 65 20 43 4b 41 5f 43 4f 45 46 46 49  .case CKA_COEFFI
4390: 43 49 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e  CIENT:....return
43a0: 28 22 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e  ("CKA_COEFFICIEN
43b0: 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  T");...case CKA_
43c0: 50 52 49 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e  PRIME:....return
43d0: 28 22 43 4b 41 5f 50 52 49 4d 45 22 29 3b 0a 09  ("CKA_PRIME");..
43e0: 09 63 61 73 65 20 43 4b 41 5f 53 55 42 50 52 49  .case CKA_SUBPRI
43f0: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ME:....return("C
4400: 4b 41 5f 53 55 42 50 52 49 4d 45 22 29 3b 0a 09  KA_SUBPRIME");..
4410: 09 63 61 73 65 20 43 4b 41 5f 42 41 53 45 3a 0a  .case CKA_BASE:.
4420: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 42  ...return("CKA_B
4430: 41 53 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ASE");...case CK
4440: 41 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09  A_PRIME_BITS:...
4450: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
4460: 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73  ME_BITS");...cas
4470: 65 20 43 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f  e CKA_SUB_PRIME_
4480: 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  BITS:....return(
4490: 22 43 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42  "CKA_SUB_PRIME_B
44a0: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ITS");...case CK
44b0: 41 5f 56 41 4c 55 45 5f 42 49 54 53 3a 0a 09 09  A_VALUE_BITS:...
44c0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c  .return("CKA_VAL
44d0: 55 45 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73  UE_BITS");...cas
44e0: 65 20 43 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 3a  e CKA_VALUE_LEN:
44f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4500: 56 41 4c 55 45 5f 4c 45 4e 22 29 3b 0a 09 09 63  VALUE_LEN");...c
4510: 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41  ase CKA_EXTRACTA
4520: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
4530: 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 22  CKA_EXTRACTABLE"
4540: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c 4f  );...case CKA_LO
4550: 43 41 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  CAL:....return("
4560: 43 4b 41 5f 4c 4f 43 41 4c 22 29 3b 0a 09 09 63  CKA_LOCAL");...c
4570: 61 73 65 20 43 4b 41 5f 4e 45 56 45 52 5f 45 58  ase CKA_NEVER_EX
4580: 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 72 65  TRACTABLE:....re
4590: 74 75 72 6e 28 22 43 4b 41 5f 4e 45 56 45 52 5f  turn("CKA_NEVER_
45a0: 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09  EXTRACTABLE");..
45b0: 09 63 61 73 65 20 43 4b 41 5f 41 4c 57 41 59 53  .case CKA_ALWAYS
45c0: 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 72  _SENSITIVE:....r
45d0: 65 74 75 72 6e 28 22 43 4b 41 5f 41 4c 57 41 59  eturn("CKA_ALWAY
45e0: 53 5f 53 45 4e 53 49 54 49 56 45 22 29 3b 0a 09  S_SENSITIVE");..
45f0: 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 47 45  .case CKA_KEY_GE
4600: 4e 5f 4d 45 43 48 41 4e 49 53 4d 3a 0a 09 09 09  N_MECHANISM:....
4610: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f  return("CKA_KEY_
4620: 47 45 4e 5f 4d 45 43 48 41 4e 49 53 4d 22 29 3b  GEN_MECHANISM");
4630: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49  ...case CKA_MODI
4640: 46 49 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  FIABLE:....retur
4650: 6e 28 22 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c  n("CKA_MODIFIABL
4660: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4670: 45 43 44 53 41 5f 50 41 52 41 4d 53 3a 0a 09 09  ECDSA_PARAMS:...
4680: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 44  .return("CKA_ECD
4690: 53 41 5f 50 41 52 41 4d 53 22 29 3b 0a 09 09 63  SA_PARAMS");...c
46a0: 61 73 65 20 43 4b 41 5f 45 43 5f 50 4f 49 4e 54  ase CKA_EC_POINT
46b0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
46c0: 5f 45 43 5f 50 4f 49 4e 54 22 29 3b 0a 09 09 63  _EC_POINT");...c
46d0: 61 73 65 20 43 4b 41 5f 53 45 43 4f 4e 44 41 52  ase CKA_SECONDAR
46e0: 59 5f 41 55 54 48 3a 0a 09 09 09 72 65 74 75 72  Y_AUTH:....retur
46f0: 6e 28 22 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59  n("CKA_SECONDARY
4700: 5f 41 55 54 48 22 29 3b 0a 09 09 63 61 73 65 20  _AUTH");...case 
4710: 43 4b 41 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41  CKA_AUTH_PIN_FLA
4720: 47 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  GS:....return("C
4730: 4b 41 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47  KA_AUTH_PIN_FLAG
4740: 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  S");...case CKA_
4750: 48 57 5f 46 45 41 54 55 52 45 5f 54 59 50 45 3a  HW_FEATURE_TYPE:
4760: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4770: 48 57 5f 46 45 41 54 55 52 45 5f 54 59 50 45 22  HW_FEATURE_TYPE"
4780: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 52 45  );...case CKA_RE
4790: 53 45 54 5f 4f 4e 5f 49 4e 49 54 3a 0a 09 09 09  SET_ON_INIT:....
47a0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 52 45 53 45  return("CKA_RESE
47b0: 54 5f 4f 4e 5f 49 4e 49 54 22 29 3b 0a 09 09 63  T_ON_INIT");...c
47c0: 61 73 65 20 43 4b 41 5f 48 41 53 5f 52 45 53 45  ase CKA_HAS_RESE
47d0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
47e0: 41 5f 48 41 53 5f 52 45 53 45 54 22 29 3b 0a 09  A_HAS_RESET");..
47f0: 09 63 61 73 65 20 43 4b 41 5f 56 45 4e 44 4f 52  .case CKA_VENDOR
4800: 5f 44 45 46 49 4e 45 44 3a 0a 09 09 09 72 65 74  _DEFINED:....ret
4810: 75 72 6e 28 22 43 4b 41 5f 56 45 4e 44 4f 52 5f  urn("CKA_VENDOR_
4820: 44 45 46 49 4e 45 44 22 29 3b 0a 09 7d 0a 0a 09  DEFINED");..}...
4830: 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22  return("UNKNOWN"
4840: 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20  );.}..#  define 
4850: 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43 4b 45 59  malloc(x) CACKEY
4860: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
4870: 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  OC(x, __func__, 
4880: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66  __LINE__).#  def
4890: 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79  ine realloc(x, y
48a0: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
48b0: 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79  UNC_REALLOC(x, y
48c0: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
48d0: 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65 66 20 73  NE__).#  ifdef s
48e0: 74 72 64 75 70 0a 23 20 20 20 20 75 6e 64 65 66  trdup.#    undef
48f0: 20 73 74 72 64 75 70 0a 23 20 20 65 6e 64 69 66   strdup.#  endif
4900: 0a 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75  .#  define strdu
4910: 70 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55  p(x) CACKEY_DEBU
4920: 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 78 2c  G_FUNC_STRDUP(x,
4930: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
4940: 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 20 64 65  E__).#else.#  de
4950: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4960: 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f  G_PRINTF(x...) /
4970: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41  **/.#  define CA
4980: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4990: 42 55 46 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a  BUF(f, x, y) /**
49a0: 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  /.#  define CACK
49b0: 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28  EY_DEBUG_PERROR(
49c0: 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  x) /**/.#  defin
49d0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
49e0: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 78  UNC_TAG_TO_STR(x
49f0: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
4a00: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
4a10: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
4a20: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 78  CARDERR_TO_STR(x
4a30: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
4a40: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
4a50: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f  KEY_DEBUG_FUNC_O
4a60: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 29 20 22  BJID_TO_STR(x) "
4a70: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
4a80: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
4a90: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54  _DEBUG_FUNC_APPT
4aa0: 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  YPE_TO_STR(x) "D
4ab0: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
4ac0: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4ad0: 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49  DEBUG_FUNC_ATTRI
4ae0: 42 55 54 45 5f 54 4f 5f 53 54 52 28 78 29 20 22  BUTE_TO_STR(x) "
4af0: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
4b00: 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 63  #endif..struct c
4b10: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
4b20: 69 74 79 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  ity {..unsigned 
4b30: 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a  char applet[7];.
4b40: 09 75 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b 0a  .uint16_t file;.
4b50: 0a 09 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69  ..size_t certifi
4b60: 63 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73 69 67  cate_len;..unsig
4b70: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66  ned char *certif
4b80: 69 63 61 74 65 3b 0a 0a 09 73 73 69 7a 65 5f 74  icate;...ssize_t
4b90: 20 6b 65 79 73 69 7a 65 3b 0a 7d 3b 0a 0a 73 74   keysize;.};..st
4ba0: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
4bb0: 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74 20 63  tity {..struct c
4bc0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
4bd0: 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
4be0: 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42 55  ty;...CK_ATTRIBU
4bf0: 54 45 20 2a 61 74 74 72 69 62 75 74 65 73 3b 0a  TE *attributes;.
4c00: 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69 62  .CK_ULONG attrib
4c10: 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a  utes_count;.};..
4c20: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65  struct cackey_se
4c30: 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63 74  ssion {..int act
4c40: 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49  ive;...CK_SLOT_I
4c50: 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53  D slotID;...CK_S
4c60: 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43 4b 5f  TATE state;..CK_
4c70: 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 4b  FLAGS flags;..CK
4c80: 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65 45  _ULONG ulDeviceE
4c90: 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  rror;..CK_VOID_P
4ca0: 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b  TR pApplication;
4cb0: 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74 69  ..CK_NOTIFY Noti
4cc0: 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63  fy;...struct cac
4cd0: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
4ce0: 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
4cf0: 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
4d00: 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74  ies_count;...int
4d10: 20 73 65 61 72 63 68 5f 61 63 74 69 76 65 3b 0a   search_active;.
4d20: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54  .CK_ATTRIBUTE_PT
4d30: 52 20 73 65 61 72 63 68 5f 71 75 65 72 79 3b 0a  R search_query;.
4d40: 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63 68  .CK_ULONG search
4d50: 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09 75  _query_count;..u
4d60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65 61  nsigned long sea
4d70: 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09 69  rch_curr_id;...i
4d80: 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65 3b 0a  nt sign_active;.
4d90: 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59  .CK_MECHANISM_TY
4da0: 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  PE sign_mechanis
4db0: 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52 20  m;..CK_BYTE_PTR 
4dc0: 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69 67  sign_buf;..unsig
4dd0: 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75  ned long sign_bu
4de0: 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20  flen;..unsigned 
4df0: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 73 65  long sign_bufuse
4e00: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
4e10: 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 67 6e  y_identity *sign
4e20: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e 74  _identity;...int
4e30: 20 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b   decrypt_active;
4e40: 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  ..CK_MECHANISM_T
4e50: 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68  YPE decrypt_mech
4e60: 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f  anism;..CK_VOID_
4e70: 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68  PTR decrypt_mech
4e80: 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  _parm;..CK_ULONG
4e90: 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61   decrypt_mech_pa
4ea0: 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20 63  rmlen;..struct c
4eb0: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
4ec0: 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
4ed0: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
4ee0: 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74 20  key_slot {..int 
4ef0: 61 63 74 69 76 65 3b 0a 09 69 6e 74 20 69 6e 74  active;..int int
4f00: 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20 2a 70  ernal;...char *p
4f10: 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69 6e  csc_reader;...in
4f20: 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  t pcsc_card_conn
4f30: 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41 4e  ected;..SCARDHAN
4f40: 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a 0a  DLE pcsc_card;..
4f50: 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  .int transaction
4f60: 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72 61  _depth;..int tra
4f70: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
4f80: 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f  _lock;...int slo
4f90: 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c  t_reset;...CK_FL
4fa0: 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b  AGS token_flags;
4fb0: 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
4fc0: 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52 44   *label;...DWORD
4fd0: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 7d 3b 0a 0a 74   protocol;.};..t
4fe0: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
4ff0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45  ACKEY_TLV_APP_GE
5000: 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09 43  NERIC = 0x01,..C
5010: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
5020: 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09 43  I     = 0x02,..C
5030: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
5040: 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20 63  I     = 0x04.} c
5050: 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70  ackey_tlv_apptyp
5060: 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  e;..typedef enum
5070: 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f   {..CACKEY_TLV_O
5080: 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f  BJID_GENERALINFO
5090: 20 20 20 20 20 20 20 3d 20 30 78 32 30 30 30 2c         = 0x2000,
50a0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
50b0: 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e  ID_PROPERSONALIN
50c0: 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a 09  FO   = 0x2100,..
50d0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
50e0: 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20 20  _ACCESSCONTROL  
50f0: 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43 41     = 0x3000,..CA
5100: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c  CKEY_TLV_OBJID_L
5110: 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20 20 20  OGIN            
5120: 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43 4b   = 0x4000,..CACK
5130: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52  EY_TLV_OBJID_CAR
5140: 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20 3d  DINFO          =
5150: 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x5000,..CACKEY
5160: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45  _TLV_OBJID_BIOME
5170: 54 52 49 43 53 20 20 20 20 20 20 20 20 3d 20 30  TRICS        = 0
5180: 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x6000,..CACKEY_T
5190: 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c  LV_OBJID_DIGITAL
51a0: 53 49 47 43 45 52 54 20 20 20 20 3d 20 30 78 37  SIGCERT    = 0x7
51b0: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
51c0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
51d0: 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30 32 30  N        = 0x020
51e0: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
51f0: 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54  BJID_CAC_BENEFIT
5200: 53 20 20 20 20 20 20 3d 20 30 78 30 32 30 32 2c  S      = 0x0202,
5210: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5220: 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45  ID_CAC_OTHERBENE
5230: 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a 09  FITS = 0x0203,..
5240: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5250: 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20 20  _CAC_PERSONNEL  
5260: 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43 41     = 0x0201,..CA
5270: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
5280: 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20 20  AC_PKICERT      
5290: 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63 6b   = 0x02FE.} cack
52a0: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 3b  ey_tlv_objectid;
52b0: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
52c0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  ..CACKEY_PCSC_S_
52d0: 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20 20  TOKENPRESENT    
52e0: 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53  = 1,..CACKEY_PCS
52f0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  C_S_OK          
5300: 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45 59      = 0,..CACKEY
5310: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
5320: 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09 43          = -1,..C
5330: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
5340: 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20 2d  PIN          = -
5350: 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  2,..CACKEY_PCSC_
5360: 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20  E_LOCKED        
5370: 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59 5f    = -3,..CACKEY_
5380: 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
5390: 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43 41         = -4,..CA
53a0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
53b0: 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d 36  NABSENT     = -6
53c0: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
53d0: 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 20 20  _RETRY          
53e0: 20 3d 20 2d 37 0a 7d 20 63 61 63 6b 65 79 5f 72   = -7.} cackey_r
53f0: 65 74 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  et;..struct cack
5400: 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b  ey_tlv_cardurl {
5410: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
5420: 20 20 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09         rid[5];..
5430: 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79  cackey_tlv_appty
5440: 70 65 20 20 20 61 70 70 74 79 70 65 3b 0a 09 63  pe   apptype;..c
5450: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5460: 69 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63  id  objectid;..c
5470: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5480: 69 64 20 20 61 70 70 69 64 3b 0a 09 75 6e 73 69  id  appid;..unsi
5490: 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20  gned char       
54a0: 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75   pinid;.};..stru
54b0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
54c0: 74 69 74 79 3b 0a 73 74 72 75 63 74 20 63 61 63  tity;.struct cac
54d0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b  key_tlv_entity {
54e0: 0a 09 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09  ..uint8_t tag;..
54f0: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a  size_t length;..
5500: 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20  .union {...void 
5510: 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72 75 63 74  *value;...struct
5520: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64   cackey_tlv_card
5530: 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64 75  url *value_cardu
5540: 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76 61  rl;...uint8_t va
5550: 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09  lue_byte;..};...
5560: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
5570: 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b  v_entity *_next;
5580: 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47  .};../* CACKEY G
5590: 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f  lobal Handles */
55a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 61  .static void *ca
55b0: 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e  ckey_biglock = N
55c0: 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74 72 75  ULL;.static stru
55d0: 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ct cackey_sessio
55e0: 6e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  n cackey_session
55f0: 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 73  s[128];.static s
5600: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
5610: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31  t cackey_slots[1
5620: 32 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  28];.static int 
5630: 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
5640: 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69  ed = 0;.static i
5650: 6e 74 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  nt cackey_bigloc
5660: 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43  k_init = 0;.CK_C
5670: 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53  _INITIALIZE_ARGS
5680: 20 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f   cackey_args;../
5690: 2a 2a 20 45 78 74 72 61 20 63 65 72 74 69 66 69  ** Extra certifi
56a0: 63 61 74 65 73 20 74 6f 20 69 6e 63 6c 75 64 65  cates to include
56b0: 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73 74   in token **/.st
56c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
56d0: 5f 69 64 65 6e 74 69 74 79 20 65 78 74 72 61 5f  _identity extra_
56e0: 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e 63  certs[] = {.#inc
56f0: 6c 75 64 65 20 22 63 61 63 6b 65 79 5f 62 75 69  lude "cackey_bui
5700: 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d 3b  ltin_certs.h".};
5710: 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c  ../* PCSC Global
5720: 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74   Handles */.stat
5730: 69 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 58  ic LPSCARDCONTEX
5740: 54 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  T cackey_pcsc_ha
5750: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74  ndle = NULL;..st
5760: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f  atic unsigned lo
5770: 6e 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65 72  ng cackey_getver
5780: 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74  sion(void) {..st
5790: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f  atic unsigned lo
57a0: 6e 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35 3b  ng retval = 255;
57b0: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
57c0: 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69  major = 0;..unsi
57d0: 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20  gned long minor 
57e0: 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f  = 0;..char *majo
57f0: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63  r_str = NULL;..c
5800: 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d  har *minor_str =
5810: 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f   NULL;...CACKEY_
5820: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
5830: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72  lled.");...if (r
5840: 65 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a  etval != 255) {.
5850: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5860: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
5870: 20 30 78 25 6c 78 20 28 63 61 63 68 65 64 29 2e   0x%lx (cached).
5880: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72  ", retval);....r
5890: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09  eturn(retval);..
58a0: 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a  }...retval = 0;.
58b0: 0a 23 69 66 64 65 66 20 50 41 43 4b 41 47 45 5f  .#ifdef PACKAGE_
58c0: 56 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 20  VERSION.        
58d0: 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b  major_str = PACK
58e0: 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66  AGE_VERSION;..if
58f0: 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09   (major_str) {..
5900: 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20          major = 
5910: 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74  strtoul(major_st
5920: 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31  r, &minor_str, 1
5930: 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72  0);....if (minor
5940: 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72  _str) {....minor
5950: 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72   = strtoul(minor
5960: 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20  _str + 1, NULL, 
5970: 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65  10);...}..}...re
5980: 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c  tval = (major <<
5990: 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c   16) | (minor <<
59a0: 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41   8);.#endif...CA
59b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
59c0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25  F("Returning 0x%
59d0: 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  lx", retval);...
59e0: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
59f0: 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61  }../* PC/SC Rela
5a00: 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f  ted Functions */
5a10: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
5a20: 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b   *     void cack
5a30: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
5a40: 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20  ect_all(void);. 
5a50: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
5a60: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
5a70: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
5a80: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
5a90: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
5aa0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f  s function disco
5ab0: 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20  nnects from all 
5ac0: 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  cards.. *. */.st
5ad0: 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
5ae0: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
5af0: 74 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75  t_all(void) {..u
5b00: 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43  int32_t idx;...C
5b10: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5b20: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
5b30: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
5b40: 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
5b50: 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
5b60: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
5b70: 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
5b80: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
5b90: 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c  ts[idx].internal
5ba0: 29 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69  ) {..../* Skip i
5bb0: 6e 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f  nternal slots */
5bc0: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
5bd0: 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
5be0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
5bf0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
5c00: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
5c10: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44  G_PRINTF("SCardD
5c20: 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63  isconnect(%lu) c
5c30: 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65  alled", (unsigne
5c40: 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09  d long) idx);...
5c50: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
5c60: 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  t(cackey_slots[i
5c70: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53  dx].pcsc_card, S
5c80: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
5c90: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
5ca0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
5cb0: 61 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28  abel) {....free(
5cc0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
5cd0: 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61  ].label);.....ca
5ce0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
5cf0: 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
5d00: 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  }....cackey_slot
5d10: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
5d20: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
5d30: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
5d40: 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
5d50: 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63  depth = 0;...cac
5d60: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
5d70: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
5d80: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09  hw_lock = 0;....
5d90: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
5da0: 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
5db0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5dc0: 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20  PRINTF("Marking 
5dd0: 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20  active slot %lu 
5de0: 61 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c  as being reset",
5df0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
5e00: 20 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61   idx);...}....ca
5e10: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
5e20: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
5e30: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
5e40: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
5e50: 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  ing");...return;
5e60: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
5e70: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
5e80: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
5e90: 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a  _connect(void);.
5ea0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
5eb0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
5ec0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
5ed0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
5ee0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
5ef0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
5f00: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
5f10: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
5f20: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
5f30: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
5f40: 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20  ion connects to 
5f50: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63  the PC/SC Connec
5f60: 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64  tion Manager and
5f70: 20 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20   updates the. * 
5f80: 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c      global handl
5f90: 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  e.. *. */.static
5fa0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5fb0: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
5fc0: 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  void) {..LONG sc
5fd0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
5fe0: 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45  ret;.#ifdef HAVE
5ff0: 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e  _SCARDISVALIDCON
6000: 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64  TEXT..LONG scard
6010: 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65  _isvalid_ret;.#e
6020: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
6030: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6040: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63  ed.");...if (cac
6050: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6060: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  == NULL) {...cac
6070: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6080: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
6090: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
60a0: 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63  dle));...if (cac
60b0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
60c0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41  == NULL) {....CA
60d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
60e0: 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f  F("Call to mallo
60f0: 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75  c() failed, retu
6100: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
6110: 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
6120: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
6130: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
6140: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
6150: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09  GENERIC);...}...
6160: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6170: 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62  INTF("SCardEstab
6180: 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61  lishContext() ca
6190: 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f  lled");...scard_
61a0: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
61b0: 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  = SCardEstablish
61c0: 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43  Context(SCARD_SC
61d0: 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c  OPE_SYSTEM, NULL
61e0: 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70  , NULL, cackey_p
61f0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69  csc_handle);...i
6200: 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  f (scard_est_con
6210: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52  text_ret != SCAR
6220: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
6230: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6240: 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53  RINTF("Call to S
6250: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
6260: 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74  text failed (ret
6270: 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72  urned %s/%li), r
6280: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
6290: 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ure", CACKEY_DEB
62a0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
62b0: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73  _TO_STR(scard_es
62c0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20  t_context_ret), 
62d0: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74  (long) scard_est
62e0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a  _context_ret);..
62f0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70  ...free(cackey_p
6300: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09  csc_handle);....
6310: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6320: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63  le = NULL;.....c
6330: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
6340: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
6350: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6360: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
6370: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
6380: 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49  HAVE_SCARDISVALI
6390: 44 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59  DCONTEXT..CACKEY
63a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
63b0: 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65  CardIsValidConte
63c0: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
63d0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
63e0: 74 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64  t = SCardIsValid
63f0: 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f  Context(*cackey_
6400: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69  pcsc_handle);..i
6410: 66 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64  f (scard_isvalid
6420: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
6430: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
6440: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6450: 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63  ("Handle has bec
6460: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61  ome invalid (SCa
6470: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74  rdIsValidContext
6480: 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69   = %s/%li), tryi
6490: 6e 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69  ng to re-establi
64a0: 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44  sh...", CACKEY_D
64b0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
64c0: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
64d0: 69 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c  isvalid_ret), (l
64e0: 6f 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c  ong) scard_isval
64f0: 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b  id_ret);....CACK
6500: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6510: 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43  "SCardEstablishC
6520: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22  ontext() called"
6530: 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63  );...scard_est_c
6540: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
6550: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6560: 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53  xt(SCARD_SCOPE_S
6570: 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  YSTEM, NULL, NUL
6580: 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  L, cackey_pcsc_h
6590: 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63  andle);...if (sc
65a0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
65b0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
65c0: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43  UCCESS) {....CAC
65d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
65e0: 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45  ("Call to SCardE
65f0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20  stablishContext 
6600: 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64  failed (returned
6610: 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e   %s/%li), return
6620: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c  ing in failure",
6630: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
6640: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
6650: 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  TR(scard_est_con
6660: 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  text_ret), (long
6670: 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ) scard_est_cont
6680: 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72  ext_ret);.....fr
6690: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
66a0: 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65  andle);....cacke
66b0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
66c0: 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79  NULL;.....cackey
66d0: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
66e0: 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74  t_all();.....ret
66f0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6700: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
6710: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6720: 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68  PRINTF("Handle h
6730: 61 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62  as been re-estab
6740: 6c 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e  lished");..}.#en
6750: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
6760: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73  UG_PRINTF("Suces
6770: 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64  sfully connected
6780: 20 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72   to PC/SC, retur
6790: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22  ning in success"
67a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
67b0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
67c0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
67d0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
67e0: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  et cackey_pcsc_d
67f0: 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b  isconnect(void);
6800: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
6810: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
6820: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
6830: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
6840: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
6850: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
6860: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
6870: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
6880: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
6890: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
68a0: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
68b0: 20 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20   from the PC/SC 
68c0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  Connection manag
68d0: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20  er and updates. 
68e0: 2a 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c  *     the global
68f0: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a   handle.. *. */.
6900: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
6910: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  t cackey_pcsc_di
6920: 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b  sconnect(void) {
6930: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c  ..LONG scard_rel
6940: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09  _context_ret;...
6950: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6960: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
6970: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
6980: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
6990: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43  ) {...return(CAC
69a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
69b0: 09 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63  .}...scard_rel_c
69c0: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
69d0: 72 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74  rdReleaseContext
69e0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
69f0: 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63  ndle);...if (cac
6a00: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6a10: 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
6a20: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
6a30: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
6a40: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  andle = NULL;..}
6a50: 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c  ...if (scard_rel
6a60: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20  _context_ret != 
6a70: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
6a80: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
6a90: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6aa0: 43 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  C);..}...return(
6ab0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
6ac0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
6ad0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64  OSIS. *     void
6ae0: 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f   cackey_mark_slo
6af0: 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63  t_reset(struct c
6b00: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
6b10: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
6b20: 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  TS. *     None. 
6b30: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
6b40: 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  E. *     None. *
6b50: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
6b60: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
6b70: 61 72 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20  arks a slot has 
6b80: 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65  having been rese
6b90: 74 2c 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63  t, to later be c
6ba0: 6c 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20  leaned up.. *   
6bb0: 20 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68    Cleanup only h
6bc0: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b  appens when a PK
6bd0: 43 53 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c  CS#11 client cal
6be0: 6c 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  ls C_FindObjects
6bf0: 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  Init.. *. */.sta
6c00: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
6c10: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
6c20: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6c30: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20  ot *slot) {..if 
6c40: 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (slot == NULL) {
6c50: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
6c60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6c70: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
6c80: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63  ..if (slot->pcsc
6c90: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
6ca0: 20 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e   {...SCardDiscon
6cb0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
6cc0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
6cd0: 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c  E_CARD);..}...sl
6ce0: 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ot->slot_reset =
6cf0: 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f   1;..slot->pcsc_
6d00: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
6d10: 20 30 3b 0a 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e   0;..slot->token
6d20: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
6d30: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 43  IN_REQUIRED;...C
6d40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6d50: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 2e 22 29  TF("Returning.")
6d60: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
6d70: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
6d80: 20 20 20 20 20 4c 4f 4e 47 20 63 61 63 6b 65 79       LONG cackey
6d90: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  _reconnect_card(
6da0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6db0: 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20  ot *slot, DWORD 
6dc0: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c  default_protocol
6dd0: 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 74  , LPDWORD select
6de0: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a  ed_protocol);. *
6df0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
6e00: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
6e10: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
6e20: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
6e30: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
6e40: 20 20 20 20 20 44 57 4f 52 44 20 64 65 66 61 75       DWORD defau
6e50: 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20  lt_protocol. *  
6e60: 20 20 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c 20         Protocol 
6e70: 74 6f 20 61 74 74 65 6d 70 74 20 66 69 72 73 74  to attempt first
6e80: 0a 20 2a 0a 20 2a 20 20 20 20 20 4c 50 44 57 4f  . *. *     LPDWO
6e90: 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  RD selected_prot
6ea0: 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20  ocol. *         
6eb0: 5b 4f 55 54 5d 20 50 72 6f 74 6f 63 6f 6c 20 73  [OUT] Protocol s
6ec0: 65 6c 65 63 74 65 64 0a 20 2a 0a 20 2a 20 52 45  elected. *. * RE
6ed0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
6ee0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
6ef0: 75 65 20 66 72 6f 6d 20 53 43 61 72 64 52 65 63  ue from SCardRec
6f00: 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 4e  onnect(). *. * N
6f10: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
6f20: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
6f30: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 53 43  rapper around SC
6f40: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20  ardReconnect(). 
6f50: 2a 0a 20 2a 20 20 20 20 20 54 68 65 20 53 43 61  *. *     The SCa
6f60: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 66 75  rdReconnect() fu
6f70: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c  nction call will
6f80: 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
6f90: 20 77 69 74 68 20 74 68 65 0a 20 2a 20 20 20 20   with the. *    
6fa0: 20 64 77 50 72 65 66 65 72 72 65 64 50 72 6f 74   dwPreferredProt
6fb0: 6f 63 6f 6c 73 20 6f 66 20 22 64 65 66 61 75 6c  ocols of "defaul
6fc0: 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20 20 49 66  t_protocol".  If
6fd0: 20 74 68 61 74 20 63 61 6c 6c 20 72 65 74 75 72   that call retur
6fe0: 6e 73 0a 20 2a 20 20 20 20 20 53 43 41 52 44 5f  ns. *     SCARD_
6ff0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
7000: 20 74 72 79 20 61 67 61 69 6e 20 77 69 74 68 20   try again with 
7010: 61 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d  a protocol of T=
7020: 30 2c 20 61 6e 64 20 66 61 69 6c 69 6e 67 0a 20  0, and failing. 
7030: 2a 20 20 20 20 20 74 68 61 74 20 54 3d 31 2e 0a  *     that T=1..
7040: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 4c 4f   *. */.static LO
7050: 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e  NG cackey_reconn
7060: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
7070: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
7080: 74 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74  t, DWORD default
7090: 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f  _protocol, LPDWO
70a0: 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  RD selected_prot
70b0: 6f 63 6f 6c 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  ocol) {..LONG sc
70c0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09  ard_conn_ret;...
70d0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
70e0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
70f0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7100: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
7110: 52 45 44 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f  RED, default_pro
7120: 74 6f 63 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53  tocol, SCARD_RES
7130: 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65  ET_CARD, selecte
7140: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69  d_protocol);...i
7150: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7160: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7170: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7180: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7190: 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e  INTF("SCardRecon
71a0: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
71b0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
71c0: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
71d0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
71e0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
71f0: 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  = SCardReconnect
7200: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7210: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
7220: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
7230: 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52  OCOL_T0, SCARD_R
7240: 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63  ESET_CARD, selec
7250: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  ted_protocol);..
7260: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7270: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7280: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7290: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
72a0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52  G_PRINTF("SCardR
72b0: 65 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  econnect() retur
72c0: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
72d0: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
72e0: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31  ng with just T=1
72f0: 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ")....scard_conn
7300: 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f  _ret = SCardReco
7310: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
7320: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41  _card, SCARD_SHA
7330: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
7340: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43  _PROTOCOL_T1, SC
7350: 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20  ARD_RESET_CARD, 
7360: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
7370: 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  l);...}..}...ret
7380: 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  urn(scard_conn_r
7390: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  et);.}../*. * SY
73a0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
73b0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
73c0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
73d0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
73e0: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
73f0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
7400: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7410: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
7420: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
7430: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
7440: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
7450: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
7460: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
7470: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
7480: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
7490: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
74a0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
74b0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
74c0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
74d0: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
74e0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
74f0: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
7500: 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f  ckey_ret pcsc_co
7510: 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52  nnect_ret;..DWOR
7520: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e  D protocol;..LON
7530: 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  G scard_conn_ret
7540: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
7550: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
7560: 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29  ");...if (!slot)
7570: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7580: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
7590: 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64  d slot specified
75a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
75b0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
75c0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
75d0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
75e0: 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
75f0: 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
7600: 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28  connect();..if (
7610: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
7620: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
7630: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
7640: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
7650: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
7660: 53 43 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  SC failed, retur
7670: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
7680: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
7690: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
76a0: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e  IC);..}.../* Con
76b0: 6e 65 63 74 20 74 6f 20 72 65 61 64 65 72 2c 20  nect to reader, 
76c0: 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66  if needed */..if
76d0: 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61   (!slot->pcsc_ca
76e0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a  rd_connected) {.
76f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7700: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
7710: 65 63 74 28 25 73 29 20 63 61 6c 6c 65 64 22 2c  ect(%s) called",
7720: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
7730: 65 72 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e  er);...scard_con
7740: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
7750: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
7760: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
7770: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
7780: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
7790: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
77a0: 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
77b0: 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T1, &slot->p
77c0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
77d0: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
77e0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
77f0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7800: 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b  MATCH) {....CACK
7810: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7820: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
7830: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
7840: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
7850: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
7860: 74 20 54 3d 30 22 29 0a 09 09 09 73 63 61 72 64  t T=0")....scard
7870: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
7880: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
7890: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
78a0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
78b0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
78c0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
78d0: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
78e0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
78f0: 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63  col);.....if (sc
7900: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
7910: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7920: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41  SMATCH) {.....CA
7930: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7940: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
7950: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
7960: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
7970: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
7980: 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 73 63  ust T=1").....sc
7990: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
79a0: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
79b0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
79c0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
79d0: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
79e0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
79f0: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
7a00: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
7a10: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09  otocol);....}...
7a20: 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  }....if (scard_c
7a30: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
7a40: 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52  _W_UNPOWERED_CAR
7a50: 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
7a60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
7a70: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
7a80: 72 6e 65 64 20 53 43 41 52 44 5f 57 5f 55 4e 50  rned SCARD_W_UNP
7a90: 4f 57 45 52 45 44 5f 43 41 52 44 2c 20 74 72 79  OWERED_CARD, try
7aa0: 69 6e 67 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63  ing to re-connec
7ab0: 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  t...");.....scar
7ac0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7ad0: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
7ae0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
7af0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
7b00: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 44 49  , SCARD_SHARE_DI
7b10: 52 45 43 54 2c 20 53 43 41 52 44 5f 50 52 4f 54  RECT, SCARD_PROT
7b20: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
7b30: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
7b40: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
7b50: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
7b60: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7b70: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7b80: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7b90: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7ba0: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
7bb0: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
7bc0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7bd0: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
7be0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
7bf0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7c00: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
7c10: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
7c20: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
7c30: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
7c40: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
7c50: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
7c60: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
7c70: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
7c80: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
7c90: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
7ca0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
7cb0: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
7cc0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
7cd0: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
7ce0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
7cf0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
7d00: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
7d10: 31 22 29 0a 09 09 09 09 09 73 63 61 72 64 5f 63  1")......scard_c
7d20: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
7d30: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
7d40: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
7d50: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
7d60: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
7d70: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
7d80: 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T1, &slot->pcs
7d90: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
7da0: 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  l);.....}....}..
7db0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7dc0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
7dd0: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
7de0: 70 72 6f 74 6f 63 6f 6c 2c 20 26 70 72 6f 74 6f  protocol, &proto
7df0: 63 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  col);...}....if 
7e00: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7e10: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
7e20: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
7e30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
7e40: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64  nnection to card
7e50: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
7e60: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53  ng in failure (S
7e70: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20  CardConnect() = 
7e80: 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59  %s/%li)", CACKEY
7e90: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
7ea0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
7eb0: 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f  d_conn_ret), (lo
7ec0: 6e 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ng) scard_conn_r
7ed0: 65 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  et);.....return(
7ee0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7ef0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73  NERIC);...}....s
7f00: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
7f10: 6f 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09  onnected = 1;...
7f20: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7f30: 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73  n_depth = 0;...s
7f40: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
7f50: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
7f60: 30 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f  0;...slot->proto
7f70: 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a  col = protocol;.
7f80: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  .}...return(CACK
7f90: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
7fa0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
7fb0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
7fc0: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  et cackey_begin_
7fd0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
7fe0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7ff0: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  slot);. *. * ARG
8000: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
8010: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
8020: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
8030: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
8040: 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e   to. *. * RETURN
8050: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
8060: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
8070: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
8080: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
8090: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
80a0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
80b0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
80c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 68  e transaction sh
80d0: 6f 75 6c 64 20 62 65 20 74 65 72 6d 69 6e 61 74  ould be terminat
80e0: 65 64 20 75 73 69 6e 67 20 22 63 61 63 6b 65 79  ed using "cackey
80f0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
8100: 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ". *. */.static 
8110: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8120: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
8130: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
8140: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
8150: 09 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b  .cackey_ret cack
8160: 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f  ey_conn_ret;..LO
8170: 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  NG scard_trans_r
8180: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
8190: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
81a0: 64 2e 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63  d.");...cackey_c
81b0: 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  onn_ret = cackey
81c0: 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  _connect_card(sl
81d0: 6f 74 29 3b 0a 09 69 66 20 28 63 61 63 6b 65 79  ot);..if (cackey
81e0: 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43  _conn_ret != CAC
81f0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
8200: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8210: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
8220: 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
8230: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
8240: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
8250: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
8260: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
8270: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8280: 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20  n_depth++;...if 
8290: 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
82a0: 6f 6e 5f 64 65 70 74 68 20 3e 20 31 20 26 26 20  on_depth > 1 && 
82b0: 21 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  !slot->transacti
82c0: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 29  on_need_hw_lock)
82d0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
82e0: 47 5f 50 52 49 4e 54 46 28 22 41 6c 72 65 61 64  G_PRINTF("Alread
82f0: 79 20 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  y in a transacti
8300: 6f 6e 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e  on, performing n
8310: 6f 20 61 63 74 69 6f 6e 20 28 6e 65 77 20 64 65  o action (new de
8320: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
8330: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8340: 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  pth);....return(
8350: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8360: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
8370: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
8380: 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73 63  w_lock = 0;...sc
8390: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20  ard_trans_ret = 
83a0: 53 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61  SCardBeginTransa
83b0: 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63  ction(slot->pcsc
83c0: 5f 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61  _card);..if (sca
83d0: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20  rd_trans_ret != 
83e0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
83f0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
8400: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
8410: 20 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61   to begin transa
8420: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
8430: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
8440: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8450: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
8460: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
8470: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
8480: 75 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73  ully began trans
8490: 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28  action on slot (
84a0: 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  %s)", slot->pcsc
84b0: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75  _reader);...retu
84c0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
84d0: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
84e0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
84f0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8500: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
8510: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8520: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
8530: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
8540: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
8550: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
8560: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
8570: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
8580: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
8590: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
85a0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
85b0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
85c0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
85d0: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
85e0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
85f0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
8600: 20 72 65 71 75 69 72 65 73 20 22 63 61 63 6b 65   requires "cacke
8610: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
8620: 69 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65  ion" to be calle
8630: 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73  d first. *. */.s
8640: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
8650: 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e   cackey_end_tran
8660: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
8670: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8680: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
8690: 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43  trans_ret;...CAC
86a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
86b0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
86c0: 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  f (!slot->pcsc_c
86d0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
86e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
86f0: 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20  PRINTF("Card is 
8700: 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75  not connected, u
8710: 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61  nable to end tra
8720: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 63 61 72 64  nsaction on card
8730: 22 29 3b 0a 0a 09 09 69 66 20 28 73 6c 6f 74 2d  ");....if (slot-
8740: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8750: 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 43 41 43  th > 0) {....CAC
8760: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8770: 28 22 44 65 63 72 65 61 73 69 6e 67 20 74 72 61  ("Decreasing tra
8780: 6e 73 61 63 74 69 6f 6e 20 64 65 70 74 68 20 61  nsaction depth a
8790: 6e 64 20 61 73 6b 69 6e 67 20 66 6f 72 20 61 20  nd asking for a 
87a0: 68 61 72 64 77 61 72 65 20 6c 6f 63 6b 20 6f 6e  hardware lock on
87b0: 20 74 68 65 20 6e 65 78 74 20 62 65 67 69 6e 20   the next begin 
87c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72  transaction (cur
87d0: 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29  rent depth = %i)
87e0: 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ", slot->transac
87f0: 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09  tion_depth);....
8800: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8810: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 09 09  on_depth--;.....
8820: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
8830: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
8840: 20 7b 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61   {.....slot->tra
8850: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
8860: 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a  _lock = 1;....}.
8870: 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ..}....return(CA
8880: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
8890: 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  RIC);..}...if (s
88a0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
88b0: 5f 64 65 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09  _depth == 0) {..
88c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
88d0: 49 4e 54 46 28 22 54 65 72 6d 69 6e 61 74 69 6e  INTF("Terminatin
88e0: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
88f0: 74 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65 67  that has not beg
8900: 75 6e 21 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  un!");....return
8910: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
8920: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c  ENERIC);..}...sl
8930: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8940: 64 65 70 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73  depth--;...if (s
8950: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8960: 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09  _depth > 0) {...
8970: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8980: 4e 54 46 28 22 54 72 61 6e 73 61 63 74 69 6f 6e  NTF("Transaction
8990: 73 20 73 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72  s still in progr
89a0: 65 73 73 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61  ess, not termina
89b0: 74 69 6e 67 20 6f 6e 2d 63 61 72 64 20 54 72 61  ting on-card Tra
89c0: 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e  nsaction (curren
89d0: 74 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20  t depth = %i)", 
89e0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
89f0: 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74  n_depth);....ret
8a00: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8a10: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72  S_OK);..}...scar
8a20: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43  d_trans_ret = SC
8a30: 61 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  ardEndTransactio
8a40: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
8a50: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
8a60: 41 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64  ARD);..if (scard
8a70: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43  _trans_ret != SC
8a80: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
8a90: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8aa0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
8ab0: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  o end transactio
8ac0: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
8ad0: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
8ae0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
8af0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
8b00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8b10: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
8b20: 20 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e   terminated tran
8b30: 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20  saction on slot 
8b40: 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73  (%s)", slot->pcs
8b50: 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74  c_reader);...ret
8b60: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8b70: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44  S_OK);.}../* APD
8b80: 55 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69  U Related Functi
8b90: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e  ons */./*. * SYN
8ba0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
8bb0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
8bc0: 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20  end_apdu(struct 
8bd0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8be0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
8bf0: 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64   class, unsigned
8c00: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
8c10: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
8c20: 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p1, unsigned ch
8c30: 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20  ar p2, unsigned 
8c40: 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65  char lc, unsigne
8c50: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
8c60: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20  signed char le, 
8c70: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
8c80: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
8c90: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
8ca0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
8cb0: 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  n);. *. * ARGUME
8cc0: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
8cd0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8ce0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8cf0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8d00: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
8d10: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20  ned char class. 
8d20: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 43  *         APDU C
8d30: 6c 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53  lass (GSCIS_CLAS
8d40: 53 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43  S_ISO7816 or GSC
8d50: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
8d60: 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20  PLATFORM. *     
8d70: 20 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43      usually), (C
8d80: 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  LA). *. *     un
8d90: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
8da0: 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20  ruction. *      
8db0: 20 20 20 41 50 44 55 20 49 6e 73 74 72 75 63 74     APDU Instruct
8dc0: 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20  ion (INS). *. * 
8dd0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
8de0: 72 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20  r p1. *         
8df0: 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 31  APDU Parameter 1
8e00: 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20   (P1). *. *     
8e10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32  unsigned char p2
8e20: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
8e30: 20 50 61 72 61 6d 65 74 65 72 20 32 20 28 50 32   Parameter 2 (P2
8e40: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
8e50: 67 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20  gned char lc. * 
8e60: 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e          APDU Len
8e70: 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28  gth of Content (
8e80: 4c 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Lc) -- this is t
8e90: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61  he length of "da
8ea0: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70  ta". *         p
8eb0: 61 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64  arameter.  If "d
8ec0: 61 74 61 22 20 69 73 20 73 70 65 63 69 66 69 65  ata" is specifie
8ed0: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
8ee0: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20  parameter will. 
8ef0: 2a 20 20 20 20 20 20 20 20 20 62 65 20 69 67 6e  *         be ign
8f00: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
8f10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
8f20: 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50  ata. *         P
8f30: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
8f40: 20 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68   to send.  It sh
8f50: 6f 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74  ould be "Lc" byt
8f60: 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20  es long.  If. * 
8f70: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
8f80: 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20  d as NULL, "Lc" 
8f90: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74  will not be sent
8fa0: 2c 20 61 6e 64 20 74 68 69 73 20 62 75 66 66 65  , and this buffe
8fb0: 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20  r will be. *    
8fc0: 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a       ignored.. *
8fd0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
8fe0: 20 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20   char le. *     
8ff0: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
9000: 6f 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28  of Expectation (
9010: 4c 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Le) -- this is t
9020: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
9030: 0a 20 2a 20 20 20 20 20 20 20 20 20 65 78 70 65  . *         expe
9040: 63 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20  cted reply.  If 
9050: 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65  this is specifie
9060: 64 20 61 73 20 30 20 74 68 65 6e 20 69 74 20 77  d as 0 then it w
9070: 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20  ill not. *      
9080: 20 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20     be sent.. *. 
9090: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a  *     uint16_t *
90a0: 72 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20  respcode. *     
90b0: 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65      [OUT] Pointe
90c0: 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20  r to storage of 
90d0: 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f  APDU response co
90e0: 64 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a  de.  If this is.
90f0: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69   *         speci
9100: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
9110: 65 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20  e response code 
9120: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65  will be discarde
9130: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
9140: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
9150: 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20  data. *         
9160: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
9170: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
9180: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20   response data. 
9190: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
91a0: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
91b0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
91c0: 73 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c  sponse data will
91d0: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20   be discarded.  
91e0: 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68  If. *         th
91f0: 65 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22  e "respdata_len"
9200: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 70   parameter is sp
9210: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
9220: 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20   this buffer. * 
9230: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74          will not
9240: 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a   be updated.. *.
9250: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72   *     size_t *r
9260: 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20  espdata_len. *  
9270: 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d         [IN, OUT]
9280: 20 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c   Pointer initial
9290: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
92a0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22  he size of the "
92b0: 72 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20  respdata". *    
92c0: 20 20 20 20 20 62 75 66 66 65 72 2e 20 20 42 65       buffer.  Be
92d0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
92e0: 74 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76  the pointed to v
92f0: 61 6c 75 65 20 69 73 20 75 70 64 61 74 65 64 20  alue is updated 
9300: 74 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  to the. *       
9310: 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    number of byte
9320: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
9330: 20 62 75 66 66 65 72 2e 20 20 49 66 20 74 68 69   buffer.  If thi
9340: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
9350: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c  s. *         NUL
9360: 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  L, it will not b
9370: 65 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22  e updated, and "
9380: 72 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62  respdata" will b
9390: 65 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e  e ignored causin
93a0: 67 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65  g. *         the
93b0: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74   response data t
93c0: 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  o be discarded..
93d0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
93e0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
93f0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
9400: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
9410: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
9420: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
9430: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20    On error. *   
9440: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
9450: 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 49 66 20  TOKENABSENT  If 
9460: 74 68 65 20 73 65 6e 64 69 6e 67 20 66 61 69 6c  the sending fail
9470: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 20 74  ed because the t
9480: 6f 6b 65 6e 20 69 73 0a 20 2a 20 20 20 20 20 20  oken is. *      
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94a0: 20 20 20 20 20 20 20 20 20 20 61 62 73 65 6e 74            absent
94b0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
94c0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
94d0: 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74  n will connect t
94e0: 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  o the PC/SC Conn
94f0: 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76  ection Manager v
9500: 69 61 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  ia. *     cackey
9510: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20  _pcsc_connect() 
9520: 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a  if needed.. *. *
9530: 20 20 20 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e       It will con
9540: 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 64  nect to the card
9550: 20 69 6e 20 74 68 65 20 72 65 61 64 65 72 20 61   in the reader a
9560: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 73  ttached to the s
9570: 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 65 63 69  lot. *     speci
9580: 66 69 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 72  fied.  It will r
9590: 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20  econnect to the 
95a0: 63 61 72 64 20 69 66 20 74 68 65 20 63 6f 6e 6e  card if the conn
95b0: 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f  ection. *     go
95c0: 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a  es away.. *. */.
95d0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
95e0: 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  t cackey_send_ap
95f0: 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  du(struct cackey
9600: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
9610: 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73  igned char class
9620: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9630: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73  instruction, uns
9640: 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75  igned char p1, u
9650: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c  nsigned char p2,
9660: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
9670: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  c, unsigned char
9680: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64   *data, unsigned
9690: 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36   char le, uint16
96a0: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e  _t *respcode, un
96b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
96c0: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72  pdata, size_t *r
96d0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
96e0: 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63  uint8_t major_rc
96f0: 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a  , minor_rc;..siz
9700: 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  e_t bytes_to_cop
9710: 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  y, tmp_respdata_
9720: 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52 44 5f 49  len;..LPCSCARD_I
9730: 4f 5f 52 45 51 55 45 53 54 20 70 69 6f 53 65 6e  O_REQUEST pioSen
9740: 64 50 63 69 3b 0a 09 44 57 4f 52 44 20 70 72 6f  dPci;..DWORD pro
9750: 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44 20 78 6d  tocol;..DWORD xm
9760: 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e  it_len, recv_len
9770: 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d  ;..LONG scard_xm
9780: 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65  it_ret, scard_re
9790: 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20  conn_ret;..BYTE 
97a0: 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20  xmit_buf[1024], 
97b0: 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a  recv_buf[1024];.
97c0: 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  .int pcsc_connec
97d0: 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 74 72  t_ret, pcsc_getr
97e0: 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64  esp_ret;..int id
97f0: 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
9800: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
9810: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74  .");...if (!slot
9820: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9830: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
9840: 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65  id slot specifie
9850: 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
9860: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9870: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73  NERIC);..}...pcs
9880: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
9890: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
98a0: 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28  ard(slot);..if (
98b0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
98c0: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
98d0: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
98e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
98f0: 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74  nable to connect
9900: 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
9910: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
9920: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9930: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9940: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  C);..}.../* Dete
9950: 72 6d 69 6e 65 20 77 68 69 63 68 20 70 72 6f 74  rmine which prot
9960: 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 75 73 69  ocol to send usi
9970: 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 73  ng */..switch (s
9980: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b  lot->protocol) {
9990: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52  ...case SCARD_PR
99a0: 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 70 69  OTOCOL_T0:....pi
99b0: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44  oSendPci = SCARD
99c0: 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65  _PCI_T0;.....bre
99d0: 61 6b 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ak;...case SCARD
99e0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09  _PROTOCOL_T1:...
99f0: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
9a00: 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09  ARD_PCI_T1;.....
9a10: 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74  break;...default
9a20: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
9a30: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
9a40: 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64  d protocol found
9a50: 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a  , aborting.");..
9a60: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9a70: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9a80: 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d  ;..}.../* Transm
9a90: 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20  it */..xmit_len 
9aa0: 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  = 0;..xmit_buf[x
9ab0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61  mit_len++] = cla
9ac0: 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  ss;..xmit_buf[xm
9ad0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74  it_len++] = inst
9ae0: 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62  ruction;..xmit_b
9af0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
9b00: 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78   p1;..xmit_buf[x
9b10: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b  mit_len++] = p2;
9b20: 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09  ..if (data) {...
9b30: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
9b40: 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 66 6f 72  n++] = lc;...for
9b50: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
9b60: 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09   lc; idx++) {...
9b70: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
9b80: 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78  en++] = data[idx
9b90: 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  ];...}..}...if (
9ba0: 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  le != 0x00) {...
9bb0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
9bc0: 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d 0a 0a 09  n++] = le;..}...
9bd0: 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61  /* Begin Smartca
9be0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
9bf0: 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  /..cackey_begin_
9c00: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
9c10: 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d  );...if (class =
9c20: 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  = GSCIS_CLASS_IS
9c30: 4f 37 38 31 36 20 26 26 20 69 6e 73 74 72 75 63  O7816 && instruc
9c40: 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e  tion == GSCIS_IN
9c50: 53 54 52 5f 56 45 52 49 46 59 20 26 26 20 70 31  STR_VERIFY && p1
9c60: 20 3d 3d 20 30 78 30 30 20 26 26 20 70 32 20 3d   == 0x00 && p2 =
9c70: 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41 43 4b  = 0x00) {...CACK
9c80: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9c90: 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 20 3c  "Sending APDU: <
9ca0: 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b 0a 09  <censored>>");..
9cb0: 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
9cc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
9cd0: 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 22  ("Sending APDU:"
9ce0: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74  , xmit_buf, xmit
9cf0: 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 63 76  _len);..}...recv
9d00: 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65  _len = sizeof(re
9d10: 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 72 64 5f  cv_buf);..scard_
9d20: 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64  xmit_ret = SCard
9d30: 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70  Transmit(slot->p
9d40: 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e  csc_card, pioSen
9d50: 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20  dPci, xmit_buf, 
9d60: 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20  xmit_len, NULL, 
9d70: 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f  recv_buf, &recv_
9d80: 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 63 61 72  len);...if (scar
9d90: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43  d_xmit_ret == SC
9da0: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
9db0: 43 54 45 44 29 20 7b 0a 09 09 43 41 43 4b 45 59  CTED) {...CACKEY
9dc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
9dd0: 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50  ailed to send AP
9de0: 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72  DU to card (SCar
9df0: 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73  dTransmit() = %s
9e00: 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20  /%lx), will ask 
9e10: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
9e20: 20 74 6f 20 72 65 74 72 79 20 28 6e 6f 74 20 72   to retry (not r
9e30: 65 73 65 74 74 69 6e 67 20 63 61 72 64 29 2e 2e  esetting card)..
9e40: 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  .", CACKEY_DEBUG
9e50: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
9e60: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
9e70: 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64  _ret), (unsigned
9e80: 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69   long) scard_xmi
9e90: 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20 42 65  t_ret);..../* Be
9ea0: 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20 54 72  gin Smartcard Tr
9eb0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63  ansaction */...c
9ec0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
9ed0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
9ee0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
9ef0: 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a  SC_E_RETRY);..}.
9f00: 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
9f10: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
9f20: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
9f30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9f40: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64  ("Failed to send
9f50: 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53   APDU to card (S
9f60: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d  CardTransmit() =
9f70: 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45   %s/%lx)", CACKE
9f80: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
9f90: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
9fa0: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75  rd_xmit_ret), (u
9fb0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63  nsigned long) sc
9fc0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
9fd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9fe0: 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 73  RINTF("Marking s
9ff0: 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20 62 65  lot as having be
a000: 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 63 61  en reset");...ca
a010: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
a020: 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69  eset(slot);....i
a030: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
a040: 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53  t == SCARD_W_RES
a050: 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ET_CARD) {....CA
a060: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a070: 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65  F("Reset require
a080: 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e  d, please hold..
a090: 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72  .");.....scard_r
a0a0: 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  econn_ret = cack
a0b0: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
a0c0: 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52  d(slot, SCARD_PR
a0d0: 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
a0e0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
a0f0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
a100: 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  f (scard_reconn_
a110: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53  ret == SCARD_S_S
a120: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a  UCCESS) {...../*
a130: 20 55 70 64 61 74 65 20 70 72 6f 74 6f 63 6f 6c   Update protocol
a140: 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 72   */.....slot->pr
a150: 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f  otocol = protoco
a160: 6c 3b 0a 09 09 09 09 73 77 69 74 63 68 20 28 73  l;.....switch (s
a170: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b  lot->protocol) {
a180: 0a 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44  ......case SCARD
a190: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09  _PROTOCOL_T0:...
a1a0: 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d  ....pioSendPci =
a1b0: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a   SCARD_PCI_T0;..
a1c0: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
a1d0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f  ..case SCARD_PRO
a1e0: 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09  TOCOL_T1:.......
a1f0: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
a200: 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09  RD_PCI_T1;......
a210: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 65  ..break;......de
a220: 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 43 41 43  fault:.......CAC
a230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a240: 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63  ("Invalid protoc
a250: 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f  ol found, but to
a260: 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20 61 6e 79  o late to do any
a270: 74 68 69 6e 67 20 61 62 6f 75 74 20 69 74 20 6e  thing about it n
a280: 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79  ow -- trying any
a290: 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62  way.");........b
a2a0: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
a2b0: 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68  ./* Re-establish
a2c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
a2d0: 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20   it was present 
a2e0: 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d  */.....if (slot-
a2f0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
a300: 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73  th > 0) {......s
a310: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
a320: 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73  _depth--;......s
a330: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
a340: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
a350: 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62  1;......cackey_b
a360: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
a370: 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09  (slot);.....}...
a380: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a390: 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75  PRINTF("Reset su
a3a0: 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e  ccessful, retran
a3b0: 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09  smitting");.....
a3c0: 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65  .recv_len = size
a3d0: 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 09  of(recv_buf);...
a3e0: 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ..scard_xmit_ret
a3f0: 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74   = SCardTransmit
a400: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
a410: 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d  , pioSendPci, xm
a420: 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e  it_buf, xmit_len
a430: 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66  , NULL, recv_buf
a440: 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  , &recv_len);...
a450: 09 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69  ...if (scard_xmi
a460: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
a470: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
a480: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a490: 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74  INTF("Retransmit
a4a0: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
a4b0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66  ng in failure af
a4c0: 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e  ter disconnectin
a4d0: 67 20 74 68 65 20 63 61 72 64 20 28 53 43 61 72  g the card (SCar
a4e0: 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25  dTransmit = %s/%
a4f0: 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  li)", CACKEY_DEB
a500: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
a510: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d  _TO_STR(scard_xm
a520: 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  it_ret), (long) 
a530: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
a540: 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69 73 63  .......SCardDisc
a550: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
a560: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
a570: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 09  AVE_CARD);......
a580: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
a590: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a  connected = 0;..
a5a0: 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
a5b0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
a5c0: 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  n */......slot->
a5d0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
a5e0: 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b  h = 1;......cack
a5f0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
a600: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09  on(slot);.......
a610: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
a620: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
a630: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c  );.....}....} el
a640: 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  se {.....CACKEY_
a650: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69  DEBUG_PRINTF("Di
a660: 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64  sconnecting card
a670: 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69  ");......SCardDi
a680: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
a690: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
a6a0: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09  LEAVE_CARD);....
a6b0: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
a6c0: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
a6d0: 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
a6e0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
a6f0: 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74  n */.....slot->t
a700: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
a710: 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79   = 1;.....cackey
a720: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
a730: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43  (slot);......CAC
a740: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a750: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  ("Returning in f
a760: 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65  ailure");.....re
a770: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
a780: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
a790: 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
a7a0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a7b0: 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e  _PRINTF("Disconn
a7c0: 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a  ecting card");..
a7d0: 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  ...SCardDisconne
a7e0: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
a7f0: 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f  rd, SCARD_LEAVE_
a800: 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e  CARD);....slot->
a810: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
a820: 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20  ted = 0;...../* 
a830: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
a840: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
a850: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
a860: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
a870: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
a880: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
a890: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a8a0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
a8b0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09   in failure");..
a8c0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
a8d0: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
a8e0: 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  NT);...}..}...CA
a8f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a900: 42 55 46 28 22 52 65 74 75 72 6e 65 64 20 56 61  BUF("Returned Va
a910: 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c  lue:", recv_buf,
a920: 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66   recv_len);...if
a930: 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20   (recv_len < 2) 
a940: 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72  {.../* Minimal r
a950: 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69  esponse length i
a960: 73 20 32 20 62 79 74 65 73 2c 20 72 65 74 75 72  s 2 bytes, retur
a970: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
a980: 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
a990: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e  G_PRINTF("Respon
a9a0: 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65  se too small, re
a9b0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
a9c0: 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25  re (recv_len = %
a9d0: 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
a9e0: 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b  long) recv_len);
a9f0: 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
aa00: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
aa10: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
aa20: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
aa30: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  t);....return(CA
aa40: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
aa50: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  RIC);..}.../* De
aa60: 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63  termine result c
aa70: 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63  ode */..major_rc
aa80: 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76   = recv_buf[recv
aa90: 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f  _len - 2];..mino
aaa0: 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b  r_rc = recv_buf[
aab0: 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09  recv_len - 1];..
aac0: 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a  if (respcode) {.
aad0: 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d  ..*respcode = (m
aae0: 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20  ajor_rc << 8) | 
aaf0: 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f  minor_rc;..}.../
ab00: 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65  * Adjust message
ab10: 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76   buffer */..recv
ab20: 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20  _len -= 2;.../* 
ab30: 41 64 64 20 62 79 74 65 73 20 74 6f 20 72 65 74  Add bytes to ret
ab40: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d  urn value */..tm
ab50: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d  p_respdata_len =
ab60: 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74   0;..if (respdat
ab70: 61 20 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65  a && respdata_le
ab80: 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64  n) {...tmp_respd
ab90: 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64  ata_len = *respd
aba0: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65  ata_len;....byte
abb0: 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73  s_to_copy = *res
abc0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66  pdata_len;....if
abd0: 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74   (recv_len < byt
abe0: 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09  es_to_copy) {...
abf0: 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
ac00: 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a   recv_len;...}..
ac10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ac20: 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25  RINTF("Copying %
ac30: 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68 65 20  lu bytes to the 
ac40: 62 75 66 66 65 72 20 28 72 65 63 76 27 64 20 25  buffer (recv'd %
ac50: 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e  lu bytes, but on
ac60: 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66  ly %lu bytes lef
ac70: 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29  t in our buffer)
ac80: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
ac90: 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  g) bytes_to_copy
aca0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
acb0: 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73  ) recv_len, (uns
acc0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73  igned long) *res
acd0: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d  pdata_len);....m
ace0: 65 6d 63 70 79 28 72 65 73 70 64 61 74 61 2c 20  emcpy(respdata, 
acf0: 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f  recv_buf, bytes_
ad00: 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70  to_copy);...resp
ad10: 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f  data += bytes_to
ad20: 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64  _copy;....*respd
ad30: 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f  ata_len = bytes_
ad40: 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72  to_copy;...tmp_r
ad50: 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62  espdata_len -= b
ad60: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d  ytes_to_copy;..}
ad70: 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65   else {...if (re
ad80: 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09  cv_len != 0) {..
ad90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ada0: 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20  RINTF("Throwing 
adb0: 61 77 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20  away %lu bytes, 
adc0: 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74 20 74  nowhere to put t
add0: 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64  hem!", (unsigned
ade0: 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29   long) recv_len)
adf0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d  ;...}..}...if (m
ae00: 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29  ajor_rc == 0x61)
ae10: 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20   {.../* We need 
ae20: 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43  to READ */...CAC
ae30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ae40: 28 22 42 75 66 66 65 72 20 72 65 61 64 20 72 65  ("Buffer read re
ae50: 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20  quired");....if 
ae60: 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30  (minor_rc == 0x0
ae70: 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63  0) {....minor_rc
ae80: 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d   = CACKEY_APDU_M
ae90: 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f  TU;...}....pcsc_
aea0: 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61  getresp_ret = ca
aeb0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
aec0: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
aed0: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
aee0: 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e  INSTR_GET_RESPON
aef0: 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  SE, 0x00, 0x00, 
af00: 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72  0, NULL, minor_r
af10: 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73  c, respcode, res
af20: 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70  pdata, &tmp_resp
af30: 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66  data_len);....if
af40: 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72   (pcsc_getresp_r
af50: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
af60: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
af70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
af80: 28 22 42 75 66 66 65 72 20 72 65 61 64 20 66 61  ("Buffer read fa
af90: 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67  iled!  Returning
afa0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
afb0: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
afc0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
afd0: 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
afe0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
aff0: 74 29 3b 0a 0a 09 09 09 69 66 20 28 70 63 73 63  t);.....if (pcsc
b000: 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 3d 20  _getresp_ret == 
b010: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
b020: 54 52 59 29 20 7b 0a 09 09 09 09 72 65 74 75 72  TRY) {.....retur
b030: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
b040: 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09  RETRY);....}....
b050: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b060: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
b070: 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64  ..}....if (respd
b080: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72  ata_len) {....*r
b090: 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74  espdata_len += t
b0a0: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  mp_respdata_len;
b0b0: 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53  ...}..../* End S
b0c0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b0d0: 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79  tion */...cackey
b0e0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
b0f0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45  (slot);....CACKE
b100: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b110: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
b120: 63 65 73 73 20 28 62 75 66 66 65 72 20 72 65 61  cess (buffer rea
b130: 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09  d complete)");..
b140: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b150: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
b160: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b170: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b180: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
b190: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
b1a0: 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d  .if (major_rc ==
b1b0: 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75   0x90) {.../* Su
b1c0: 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45  ccess */...CACKE
b1d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b1e0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
b1f0: 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d  cess (major_rc =
b200: 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74   0x90)");....ret
b210: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b220: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43  S_OK);..}....CAC
b230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b240: 28 22 41 50 44 55 20 52 65 74 75 72 6e 65 64 20  ("APDU Returned 
b250: 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  an error, return
b260: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
b270: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
b280: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
b290: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
b2a0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a  OSIS. *     ssiz
b2b0: 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  e_t cackey_read_
b2c0: 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61  buffer(struct ca
b2d0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
b2e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b2f0: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63  buffer, size_t c
b300: 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  ount, unsigned c
b310: 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65  har t_or_v, size
b320: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  _t initial_offse
b330: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
b340: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
b350: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
b360: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
b370: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
b380: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
b390: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b3a0: 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20  *buffer. *      
b3b0: 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a     [OUT] Buffer.
b3c0: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
b3d0: 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20   count. *       
b3e0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
b3f0: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  s to attempt to 
b400: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75  read. *. *     u
b410: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
b420: 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53  r_v. *         S
b430: 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66 66  elect the T-buff
b440: 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66  er (01) or V-buf
b450: 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61 64  fer (02) to read
b460: 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20   from.  . *. *  
b470: 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61     size_t initia
b480: 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20  l_offset. *     
b490: 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65 20      Specify the 
b4a0: 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20  offset to begin 
b4b0: 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a  the read from. *
b4c0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
b4d0: 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20  LUE. *     This 
b4e0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
b4f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
b500: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
b510: 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72  ad, or -1 on err
b520: 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  or.. *. * NOTES.
b530: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
b540: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
b550: 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  t cackey_read_bu
b560: 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b  ffer(struct cack
b570: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
b580: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
b590: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75  ffer, size_t cou
b5a0: 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nt, unsigned cha
b5b0: 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74  r t_or_v, size_t
b5c0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29   initial_offset)
b5d0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
b5e0: 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a  r *init_buffer;.
b5f0: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75  .size_t init_cou
b600: 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74  nt;..size_t init
b610: 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b  _initial_offset;
b620: 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74  ...size_t offset
b630: 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74   = 0, max_offset
b640: 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e  , max_count;..un
b650: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b  signed char cmd[
b660: 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  2];..uint16_t re
b670: 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e  spcode;..int sen
b680: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
b690: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
b6a0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f  lled.");...init_
b6b0: 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 3b  buffer = buffer;
b6c0: 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63  ..init_count = c
b6d0: 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74  ount;..init_init
b6e0: 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69  ial_offset = ini
b6f0: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d  tial_offset;...m
b700: 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e  ax_offset = coun
b710: 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20  t;..max_count = 
b720: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b  CACKEY_APDU_MTU;
b730: 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d  ...if (t_or_v !=
b740: 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20   1 && t_or_v != 
b750: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  2) {...CACKEY_DE
b760: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
b770: 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d  lid T or V param
b780: 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c 20  eter specified, 
b790: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b7a0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
b7b0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b  n(-1);..}...cmd[
b7c0: 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77  0] = t_or_v;...w
b7d0: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20  hile (1) {...if 
b7e0: 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f  (offset >= max_o
b7f0: 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b  ffset) {....CACK
b800: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b810: 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c  "Buffer too smal
b820: 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61  l, returning wha
b830: 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a  t we got...");..
b840: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
b850: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66  .count = max_off
b860: 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09  set - offset;...
b870: 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f  if (count > max_
b880: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e  count) {....coun
b890: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09  t = max_count;..
b8a0: 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63  .}....cmd[1] = c
b8b0: 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65  ount;....send_re
b8c0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
b8d0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
b8e0: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
b8f0: 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e  ATFORM, GSCIS_IN
b900: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c  STR_READ_BUFFER,
b910: 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65   ((initial_offse
b920: 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38  t + offset) >> 8
b930: 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69  ) & 0xff, (initi
b940: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
b950: 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65  et) & 0xff, size
b960: 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78  of(cmd), cmd, 0x
b970: 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62  00, &respcode, b
b980: 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20  uffer + offset, 
b990: 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28  &count);....if (
b9a0: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
b9b0: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
b9c0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
b9d0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
b9e0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
b9f0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
ba00: 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74 75  ffer");.....retu
ba10: 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  rn(cackey_read_b
ba20: 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74  uffer(slot, init
ba30: 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f  _buffer, init_co
ba40: 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69  unt, t_or_v, ini
ba50: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t_initial_offset
ba60: 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ));...}....if (s
ba70: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
ba80: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
ba90: 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d  ..if (respcode =
baa0: 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09  = 0x6A86) {.....
bab0: 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d  if (max_count ==
bac0: 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b   1) {......break
bad0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78  ;.....}......max
bae0: 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75  _count = max_cou
baf0: 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e  nt / 2;......con
bb00: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
bb10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bb20: 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64  NTF("cackey_send
bb30: 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20  _apdu() failed, 
bb40: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
bb50: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75  lure");.....retu
bb60: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f  rn(-1);...}....o
bb70: 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a  ffset += count;.
bb80: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d  ...if (count < m
bb90: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  ax_count) {....C
bba0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bbb0: 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d  TF("Short read -
bbc0: 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d  - count = %i, cm
bbd0: 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74  d[1] = %i", (int
bbe0: 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  ) count, (int) c
bbf0: 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61  md[1]);.....brea
bc00: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  k;...}..}..#ifde
bc10: 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49  f CACKEY_PARANOI
bc20: 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49  D.#  ifdef _POSI
bc30: 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20  X_SSIZE_MAX..if 
bc40: 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58  (offset > _POSIX
bc50: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
bc60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bc70: 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63 65  NTF("Offset exce
bc80: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
bc90: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
bca0: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
bcb0: 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c  %li, offset = %l
bcc0: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53  u)", (long) _POS
bcd0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75  IX_SSIZE_MAX, (u
bce0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66  nsigned long) of
bcf0: 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  fset);....return
bd00: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
bd10: 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  f.#endif...CACKE
bd20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bd30: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
bd40: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62  cess, read %lu b
bd50: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  ytes", (unsigned
bd60: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
bd70: 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29  ..return(offset)
bd80: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
bd90: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
bda0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c  y_ret cackey_sel
bdb0: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63  ect_applet(struc
bdc0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
bdd0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
bde0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20  ar *aid, size_t 
bdf0: 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20  aid_len);. *. * 
be00: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
be10: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
be20: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
be30: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
be40: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
be50: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
be60: 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20   char *aid. *   
be70: 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e        Buffer con
be80: 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49  taining Applet I
be90: 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20  D to select. *. 
bea0: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64  *     size_t aid
beb0: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  _len. *         
bec0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
bed0: 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 70  in the "aid" (Ap
bee0: 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 74  plet ID) paramet
bef0: 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  er. *. * RETURN 
bf00: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
bf10: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
bf20: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
bf30: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
bf40: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
bf50: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
bf60: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  NOTES. *     Non
bf70: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  e. *. */.static 
bf80: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
bf90: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
bfa0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
bfb0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
bfc0: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69  ed char *aid, si
bfd0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a  ze_t aid_len) {.
bfe0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
bff0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c000: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
c010: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c020: 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74  PRINTBUF("Select
c030: 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69  ing applet:", ai
c040: 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73  d, aid_len);...s
c050: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
c060: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
c070: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
c080: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
c090: 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f  R_SELECT, GSCIS_
c0a0: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50  PARAM_SELECT_APP
c0b0: 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c  LET, 0x00, aid_l
c0c0: 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e  en, aid, 0x00, N
c0d0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
c0e0: 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ;...if (send_ret
c0f0: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
c100: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43  E_RETRY) {...CAC
c110: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c120: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66  ("ADPU Sending f
c130: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20  ailed, retrying 
c140: 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29 3b  select applet");
c150: 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
c160: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
c170: 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c  slot, aid, aid_l
c180: 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  en));..}...if (s
c190: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
c1a0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
c1b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c1c0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
c1d0: 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74  open applet, ret
c1e0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
c1f0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
c200: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
c210: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
c220: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c230: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
c240: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
c250: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
c260: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
c270: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
c280: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
c290: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
c2a0: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
c2b0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
c2c0: 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20  16_t ef);. *. * 
c2d0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
c2e0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
c2f0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
c300: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
c310: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
c320: 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74  . *     uint16_t
c330: 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45   ef. *         E
c340: 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f  lemental File to
c350: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45   select. *. * RE
c360: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
c370: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
c380: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
c390: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
c3a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
c3b0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
c3c0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
c3d0: 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20 61    This selects a
c3e0: 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c  n Elementary Fil
c3f0: 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68 65  e (EF) under the
c400: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63   currently selec
c410: 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63  ted. *     Dedic
c420: 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20  ated File (DF). 
c430: 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c  *. *     Typical
c440: 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  ly this is calle
c450: 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e  d after selectin
c460: 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41 70  g the correct Ap
c470: 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20  plet (using. *  
c480: 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74     cackey_select
c490: 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20  _applet) for VM 
c4a0: 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61  cards. *. */.sta
c4b0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
c4c0: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
c4d0: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
c4e0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
c4f0: 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69  16_t ef) {..unsi
c500: 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62 75  gned char fid_bu
c510: 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  f[2];..int send_
c520: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
c530: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
c540: 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e  ed.");.../* Open
c550: 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20   the elementary 
c560: 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66  file */..fid_buf
c570: 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20  [0] = (ef >> 8) 
c580: 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66  & 0xff;..fid_buf
c590: 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b  [1] = ef & 0xff;
c5a0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c5b0: 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e  PRINTF("Selectin
c5c0: 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20  g file: %04lx", 
c5d0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c5e0: 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  ef);...send_ret 
c5f0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
c600: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
c610: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
c620: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
c630: 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69  , 0x02, 0x0C, si
c640: 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66  zeof(fid_buf), f
c650: 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55  id_buf, 0x00, NU
c660: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
c670: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
c680: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
c690: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
c6a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
c6b0: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  led to open file
c6c0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
c6d0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
c6e0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
c6f0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
c700: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c710: 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
c720: 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65  ly selected file
c730: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
c740: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
c750: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
c760: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
c770: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74  ckey_free_tlv(st
c780: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
c790: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20  entity *root);. 
c7a0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
c7b0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
c7c0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
c7d0: 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  root. *         
c7e0: 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20  Root of the TLV 
c7f0: 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66 72  list to start fr
c800: 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55  eeing. *. * RETU
c810: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
c820: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
c830: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
c840: 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20  ction frees the 
c850: 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65  TLV linked liste
c860: 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a  d returned from.
c870: 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72   *     "cackey_r
c880: 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a  ead_tlv". *. */.
c890: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
c8a0: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75  ey_free_tlv(stru
c8b0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
c8c0: 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73  tity *root) {..s
c8d0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
c8e0: 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a  _entity *curr, *
c8f0: 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74  next;...if (root
c900: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
c910: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
c920: 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72  curr = root; cur
c930: 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20  r; curr = next) 
c940: 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d  {...next = curr-
c950: 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63  >_next;....switc
c960: 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a  h (curr->tag) {.
c970: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
c980: 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09  G_ACR_TABLE:....
c990: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
c9a0: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
c9b0: 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29  if (curr->value)
c9c0: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
c9d0: 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d  r->value);.....}
c9e0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
c9f0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
ca00: 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63  RDURL:.....if (c
ca10: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
ca20: 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  rl) {......free(
ca30: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
ca40: 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  url);.....}.....
ca50: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72  break;...}....fr
ca60: 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72  ee(curr);..}...r
ca70: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
ca80: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
ca90: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
caa0: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
cab0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
cac0: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
cad0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
cae0: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
caf0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
cb00: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b  tlv_entity *cack
cb10: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75  ey_read_tlv(stru
cb20: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
cb30: 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20  slot) {..struct 
cb40: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
cb50: 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20  y *curr_entity, 
cb60: 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c  *root = NULL, *l
cb70: 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73  ast = NULL;..uns
cb80: 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f  igned char tlen_
cb90: 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66  buf[2], tval_buf
cba0: 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09  [1024], *tval;..
cbb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c  unsigned char vl
cbc0: 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f  en_buf[2], vval_
cbd0: 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c  buf[8192], *vval
cbe0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
cbf0: 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67   *tmpbuf;..unsig
cc00: 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c  ned long tmpbufl
cc10: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65  en;..ssize_t tle
cc20: 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f  n, vlen;..ssize_
cc30: 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a  t read_ret;..siz
cc40: 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30  e_t offset_t = 0
cc50: 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a  , offset_v = 0;.
cc60: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  .unsigned char t
cc70: 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67  ag;..size_t leng
cc80: 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  th;.#ifdef HAVE_
cc90: 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70  LIBZ..int uncomp
cca0: 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66  ress_ret;.#endif
ccb0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ccc0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
ccd0: 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  );...read_ret = 
cce0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
ccf0: 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75  er(slot, tlen_bu
cd00: 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62  f, sizeof(tlen_b
cd10: 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  uf), 1, offset_t
cd20: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
cd30: 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f   != sizeof(tlen_
cd40: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
cd50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
cd60: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ead failed, retu
cd70: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
cd80: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
cd90: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d  LL);..}...tlen =
cda0: 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c   (tlen_buf[1] <<
cdb0: 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30   8) | tlen_buf[0
cdc0: 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  ];...read_ret = 
cdd0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
cde0: 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75  er(slot, vlen_bu
cdf0: 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62  f, sizeof(vlen_b
ce00: 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  uf), 2, offset_v
ce10: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
ce20: 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f   != sizeof(vlen_
ce30: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
ce40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
ce50: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ead failed, retu
ce60: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
ce70: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
ce80: 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d  LL);..}...vlen =
ce90: 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c   (vlen_buf[1] <<
cea0: 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30   8) | vlen_buf[0
ceb0: 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ];...CACKEY_DEBU
cec0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65  G_PRINTF("Tag Le
ced0: 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75  ngth = %lu, Valu
cee0: 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c  e Length = %lu",
cef0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
cf00: 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64   tlen, (unsigned
cf10: 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09   long) vlen);...
cf20: 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09  offset_t += 2;..
cf30: 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a  offset_v += 2;..
cf40: 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65  .if (tlen > size
cf50: 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a  of(tval_buf)) {.
cf60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cf70: 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74  RINTF("Tag lengt
cf80: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  h is too large, 
cf90: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
cfa0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
cfb0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
cfc0: 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28   (vlen > sizeof(
cfd0: 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43  vval_buf)) {...C
cfe0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
cff0: 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68  TF("Value length
d000: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72   is too large, r
d010: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
d020: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
d030: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61  (NULL);..}...rea
d040: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
d050: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
d060: 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c   tval_buf, tlen,
d070: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09   1, offset_t);..
d080: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
d090: 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  tlen) {...CACKEY
d0a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
d0b0: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e  nable to read en
d0c0: 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72  tire T-buffer, r
d0d0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
d0e0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
d0f0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61  (NULL);..}...rea
d100: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
d110: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
d120: 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c   vval_buf, vlen,
d130: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09   2, offset_v);..
d140: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
d150: 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  vlen) {...CACKEY
d160: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
d170: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e  nable to read en
d180: 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72  tire V-buffer, r
d190: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
d1a0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
d1b0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61  (NULL);..}...tva
d1c0: 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76  l = tval_buf;..v
d1d0: 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a  val = vval_buf;.
d1e0: 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30  .while (tlen > 0
d1f0: 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a   && vlen > 0) {.
d200: 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09  ..tag = *tval;..
d210: 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d  .tval++;...tlen-
d220: 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20  -;....if (*tval 
d230: 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65  == 0xff) {....le
d240: 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20  ngth = (tval[2] 
d250: 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b  << 8) | tval[1];
d260: 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09  ....tval += 3;..
d270: 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d  ..tlen -= 3;...}
d280: 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74   else {....lengt
d290: 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76  h = *tval;....tv
d2a0: 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b  al++;....tlen--;
d2b0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
d2c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
d2d0: 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43 41  : %s (%02x)", CA
d2e0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
d2f0: 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c  TAG_TO_STR(tag),
d300: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
d310: 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44  tag);...CACKEY_D
d320: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56  EBUG_PRINTBUF("V
d330: 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65  alue:", vval, le
d340: 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65  ngth);....curr_e
d350: 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
d360: 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09  switch (tag) {..
d370: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
d380: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75  _CARDURL:.....cu
d390: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
d3a0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
d3b0: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75  entity));.....cu
d3c0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
d3d0: 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f  _cardurl = mallo
d3e0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
d3f0: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
d400: 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d  durl));......mem
d410: 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d  cpy(curr_entity-
d420: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
d430: 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09  rid, vval, 5);..
d440: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
d450: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
d460: 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d  pptype = vval[5]
d470: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
d480: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
d490: 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76  ->objectid = (vv
d4a0: 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76  al[6] << 8) | vv
d4b0: 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[7];.....curr_
d4c0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
d4d0: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28  rdurl->appid = (
d4e0: 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20  vval[8] << 8) | 
d4f0: 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75  vval[9];......cu
d500: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
d510: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
d520: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
d530: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
d540: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
d550: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
d560: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
d570: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
d580: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
d590: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
d5a0: 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09  c(length);......
d5b0: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
d5c0: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09  val, length);...
d5d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
d5e0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
d5f0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
d600: 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09  th = length;....
d610: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
d620: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  lue = tmpbuf;...
d630: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
d640: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
d650: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
d660: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
d670: 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72  FICATE:.....curr
d680: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  _entity = malloc
d690: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
d6a0: 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66 20  tity));..#ifdef 
d6b0: 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d  HAVE_LIBZ.....tm
d6c0: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
d6d0: 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66   * 2;.....tmpbuf
d6e0: 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66   = malloc(tmpbuf
d6f0: 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d  len);......uncom
d700: 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f  press_ret = unco
d710: 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26  mpress(tmpbuf, &
d720: 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c  tmpbuflen, vval,
d730: 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66   length);.....if
d740: 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74   (uncompress_ret
d750: 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09   != Z_OK) {.....
d760: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d770: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
d780: 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f  decompress, unco
d790: 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e 65  mpress() returne
d7a0: 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e  d %i -- resortin
d7b0: 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79  g to direct copy
d7c0: 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ", uncompress_re
d7d0: 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66  t);.......tmpbuf
d7e0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  len = length;...
d7f0: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
d800: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
d810: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
d820: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
d830: 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20  F("Decompressed 
d840: 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d  to:", tmpbuf, tm
d850: 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a  pbuflen);.#else.
d860: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d870: 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67  _PRINTF("Missing
d880: 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74   ZLIB Support, t
d890: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20  his certificate 
d8a0: 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73  is likely useles
d8b0: 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70  s...");......tmp
d8c0: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b  buflen = length;
d8d0: 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62  .....memcpy(tmpb
d8e0: 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  uf, vval, length
d8f0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63  );.#endif......c
d900: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
d910: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
d920: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
d930: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09   tmpbuflen;.....
d940: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
d950: 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09  ue = tmpbuf;....
d960: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e  .curr_entity->_n
d970: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ext = NULL;.....
d980: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
d990: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
d9a0: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
d9b0: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
d9c0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
d9d0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
d9e0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
d9f0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
da00: 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61  value_byte = vva
da10: 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[0];.....curr_e
da20: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
da30: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
da40: 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20  ...}....vval += 
da50: 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d  length;...vlen -
da60: 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20  = length;....if 
da70: 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20  (curr_entity != 
da80: 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72  NULL) {....if (r
da90: 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  oot == NULL) {..
daa0: 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65  ...root = curr_e
dab0: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
dac0: 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c  if (last != NULL
dad0: 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e  ) {.....last->_n
dae0: 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  ext = curr_entit
daf0: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74  y;....}.....last
db00: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
db10: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ..}..}...return(
db20: 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  root);.}../*. * 
db30: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
db40: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
db50: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
db60: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
db70: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
db80: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
db90: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
dba0: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
dbb0: 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74 20  ee_certs(struct 
dbc0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
dbd0: 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a  tity *start, siz
dbe0: 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66  e_t count, int f
dbf0: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69  ree_start) {..si
dc00: 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28  ze_t idx;...if (
dc10: 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  start == NULL) {
dc20: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
dc30: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
dc40: 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  x < count; idx++
dc50: 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b  ) {...if (start[
dc60: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
dc70: 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72  ) {....free(star
dc80: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
dc90: 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  te);...}..}...if
dca0: 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a   (free_start) {.
dcb0: 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09  ..free(start);..
dcc0: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }...return;.}../
dcd0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
dce0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
dcf0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
dd00: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
dd10: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
dd20: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
dd30: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
dd40: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
dd50: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
dd60: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
dd70: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
dd80: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
dd90: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
dda0: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72  sc_identity *cer
ddb0: 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ts, unsigned lon
ddc0: 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72  g *count) {..str
ddd0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
dde0: 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69  identity *curr_i
ddf0: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
de00: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63  y_tlv_entity *cc
de10: 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72  c_tlv, *ccc_curr
de20: 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70  , *app_tlv, *app
de30: 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64  _curr;..unsigned
de40: 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20   char ccc_aid[] 
de50: 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43  = {GSCIS_AID_CCC
de60: 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
de70: 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09  r curr_aid[7];..
de80: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75  unsigned long ou
de90: 74 69 64 78 20 3d 20 30 3b 0a 09 63 61 63 6b 65  tidx = 0;..cacke
dea0: 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74 69 6f  y_ret transactio
deb0: 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 63 65 72 74  n_ret;..int cert
dec0: 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e  s_resizable;..in
ded0: 74 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65  t send_ret, sele
dee0: 63 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ct_ret;...CACKEY
def0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
df00: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
df10: 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  count == NULL) {
df20: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
df30: 50 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73  PRINTF("count is
df40: 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67   NULL, returning
df50: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
df60: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
df70: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21  .}...if (certs !
df80: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
df90: 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  *count == 0) {..
dfa0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dfb0: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64  RINTF("Requested
dfc0: 20 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a   we return 0 obj
dfd0: 65 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63  ects, short-circ
dfe0: 75 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  uit");.....retur
dff0: 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
e000: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d  .../* Begin a Sm
e010: 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74  artCard transact
e020: 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74  ion */..transact
e030: 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ion_ret = cackey
e040: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
e050: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74  on(slot);..if (t
e060: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21  ransaction_ret !
e070: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
e080: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
e090: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
e0a0: 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ble begin transa
e0b0: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
e0c0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e0d0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
e0e0: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d  .}...if (certs =
e0f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74  = NULL) {...cert
e100: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
e110: 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a  f(*certs) * 5);.
e120: 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09  ..*count = 5;...
e130: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
e140: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
e150: 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
e160: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65   = 0;..}.../* Se
e170: 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70  lect the CCC App
e180: 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  let */..send_ret
e190: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
e1a0: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63  _applet(slot, cc
e1b0: 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  c_aid, sizeof(cc
e1c0: 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65  c_aid));..if (se
e1d0: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
e1e0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
e1f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e200: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73  NTF("Unable to s
e210: 65 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74  elect CCC Applet
e220: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
e230: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20  ailure");..../* 
e240: 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
e250: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
e260: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
e270: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
e280: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
e290: 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64  L);..}.../* Read
e2a0: 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73   all the applets
e2b0: 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20   from the CCC's 
e2c0: 54 4c 56 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20  TLV */..ccc_tlv 
e2d0: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c  = cackey_read_tl
e2e0: 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f  v(slot);.../* Lo
e2f0: 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20  ok for CARDURLs 
e300: 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20  that coorespond 
e310: 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a  to PKI applets *
e320: 2f 0a 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72  /..for (ccc_curr
e330: 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f   = ccc_tlv; ccc_
e340: 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d  curr; ccc_curr =
e350: 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74   ccc_curr->_next
e360: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
e370: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
e380: 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20   tag: %s ... ", 
e390: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
e3a0: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 63  C_TAG_TO_STR(ccc
e3b0: 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09  _curr->tag));...
e3c0: 09 69 66 20 28 63 63 63 5f 63 75 72 72 2d 3e 74  .if (ccc_curr->t
e3d0: 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
e3e0: 43 41 52 44 55 52 4c 29 20 7b 0a 09 09 09 43 41  CARDURL) {....CA
e3f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e400: 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
e410: 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
e420: 72 65 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c  re about CARDURL
e430: 73 29 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  s)");.....contin
e440: 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  ue;...}....if ((
e450: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
e460: 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
e470: 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   & CACKEY_TLV_AP
e480: 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59  P_PKI) != CACKEY
e490: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a  _TLV_APP_PKI) {.
e4a0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e4b0: 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
e4c0: 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
e4d0: 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b  ly care about PK
e4e0: 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20  I applets, this 
e4f0: 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a  applet supports:
e500: 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b   %s/%02x)", CACK
e510: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
e520: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63  PTYPE_TO_STR(ccc
e530: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
e540: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20  durl->apptype), 
e550: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63  (unsigned int) c
e560: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
e570: 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29  ardurl->apptype)
e580: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
e590: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
e5a0: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
e5b0: 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
e5c0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
e5d0: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
e5e0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
e5f0: 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 43 41 43 4b  l->rid));...CACK
e600: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e610: 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c  "AppID = %s/%04l
e620: 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
e630: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
e640: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
e650: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
e660: 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
e670: 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
e680: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
e690: 69 64 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45  id);...CACKEY_DE
e6a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65  BUG_PRINTF("Obje
e6b0: 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ctID = %s/%04lx"
e6c0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
e6d0: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
e6e0: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
e6f0: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
e700: 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
e710: 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
e720: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
e730: 6a 65 63 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63  jectid);....memc
e740: 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63  py(curr_aid, ccc
e750: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
e760: 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
e770: 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
e780: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
e790: 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a  ;...curr_aid[siz
e7a0: 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20  eof(curr_aid) - 
e7b0: 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e  2] = (ccc_curr->
e7c0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
e7d0: 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66  ppid >> 8) & 0xf
e7e0: 66 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69  f;...curr_aid[si
e7f0: 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d  zeof(curr_aid) -
e800: 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e   1] = ccc_curr->
e810: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
e820: 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09  ppid & 0xff;....
e830: 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20  /* Select found 
e840: 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09  applet ... */...
e850: 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63  select_ret = cac
e860: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
e870: 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64  t(slot, curr_aid
e880: 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  , sizeof(curr_ai
e890: 64 29 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63  d));...if (selec
e8a0: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
e8b0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
e8c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e8d0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
e8e0: 65 6c 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b  elect applet, sk
e8f0: 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
e900: 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
e910: 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  ");.....continue
e920: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20  ;...}..../* ... 
e930: 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65  and object (file
e940: 29 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65  ) */...select_re
e950: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
e960: 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63  t_file(slot, ccc
e970: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
e980: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b  durl->objectid);
e990: 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
e9a0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
e9b0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
e9c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e9d0: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63  "Failed to selec
e9e0: 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67  t file, skipping
e9f0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
ea00: 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  his object");...
ea10: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
ea20: 0a 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .../* Process th
ea30: 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f  is file's TLV lo
ea40: 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66  oking for certif
ea50: 69 63 61 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f  icates */...app_
ea60: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
ea70: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
ea80: 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20  for (app_curr = 
ea90: 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72  app_tlv; app_cur
eaa0: 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70  r; app_curr = ap
eab0: 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  p_curr->_next) {
eac0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ead0: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
eae0: 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ag: %s", CACKEY_
eaf0: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
eb00: 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e  O_STR(app_curr->
eb10: 74 61 67 29 29 3b 0a 09 09 09 69 66 20 28 61 70  tag));....if (ap
eb20: 70 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47  p_curr->tag != G
eb30: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
eb40: 43 41 54 45 29 20 7b 0a 09 09 09 09 43 41 43 4b  CATE) {.....CACK
eb50: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
eb60: 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
eb70: 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
eb80: 20 61 62 6f 75 74 20 43 45 52 54 49 46 49 43 41   about CERTIFICA
eb90: 54 45 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e  TEs)");......con
eba0: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
ebb0: 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73  curr_id = &certs
ebc0: 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74  [outidx];....out
ebd0: 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70  idx++;.....memcp
ebe0: 79 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65  y(curr_id->apple
ebf0: 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
ec00: 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
ec10: 6c 65 74 29 29 3b 0a 09 09 09 63 75 72 72 5f 69  let));....curr_i
ec20: 64 2d 3e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75  d->file = ccc_cu
ec30: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
ec40: 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09  l->objectid;....
ec50: 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65  curr_id->keysize
ec60: 20 3d 20 2d 31 3b 0a 0a 09 09 09 43 41 43 4b 45   = -1;.....CACKE
ec70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ec80: 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d  Filling curr_id-
ec90: 3e 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74  >applet (%p) wit
eca0: 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63  h %lu bytes:", c
ecb0: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
ecc0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
ecd0: 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e  sizeof(curr_id->
ece0: 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 43 41 43  applet));....CAC
ecf0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
ed00: 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f  UF("VAL:", curr_
ed10: 69 64 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65  id->applet, size
ed20: 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c  of(curr_id->appl
ed30: 65 74 29 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69  et));.....curr_i
ed40: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
ed50: 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c  en = app_curr->l
ed60: 65 6e 67 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f  ength;.....curr_
ed70: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
ed80: 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
ed90: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
eda0: 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75  n);....memcpy(cu
edb0: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
edc0: 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61  te, app_curr->va
edd0: 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  lue, curr_id->ce
ede0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
edf0: 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e  ....if (outidx >
ee00: 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  = *count) {.....
ee10: 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
ee20: 62 6c 65 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75  ble) {......*cou
ee30: 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65  nt *= 2;......ce
ee40: 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65  rts = realloc(ce
ee50: 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72  rts, sizeof(*cer
ee60: 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b  ts) * (*count));
ee70: 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
ee80: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
ee90: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ...}...}....cack
eea0: 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f  ey_free_tlv(app_
eeb0: 74 6c 76 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74  tlv);....if (out
eec0: 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
eed0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
eee0: 7d 0a 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  }...cackey_free_
eef0: 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09  tlv(ccc_tlv);...
ef00: 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b  *count = outidx;
ef10: 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
ef20: 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74  izable) {...cert
ef30: 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74  s = realloc(cert
ef40: 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  s, sizeof(*certs
ef50: 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09  ) * (*count));..
ef60: 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  }.../* Terminate
ef70: 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73   SmartCard Trans
ef80: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
ef90: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
efa0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72  n(slot);...retur
efb0: 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a  n(certs);.}../*.
efc0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
efd0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
efe0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
eff0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
f000: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
f010: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
f020: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
f030: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
f040: 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
f050: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
f060: 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
f070: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
f080: 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
f090: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
f0a0: 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75  size_t buflen, u
f0b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
f0c0: 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74  tbuf, size_t out
f0d0: 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49  buflen, int padI
f0e0: 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f  nput, int unpadO
f0f0: 75 74 70 75 74 29 20 7b 0a 09 75 6e 73 69 67 6e  utput) {..unsign
f100: 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c  ed char *tmpbuf,
f110: 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74   *tmpbuf_s, *out
f120: 62 75 66 5f 73 3b 0a 09 75 6e 73 69 67 6e 65 64  buf_s;..unsigned
f130: 20 63 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73   char bytes_to_s
f140: 65 6e 64 2c 20 70 31 3b 0a 09 75 6e 73 69 67 6e  end, p1;..unsign
f150: 65 64 20 63 68 61 72 20 62 6c 6f 63 6b 74 79 70  ed char blocktyp
f160: 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 73  e;..cackey_ret s
f170: 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74 31 36  end_ret;..uint16
f180: 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 73 73  _t respcode;..ss
f190: 69 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d 20 30  ize_t retval = 0
f1a0: 2c 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09  , unpadoffset;..
f1b0: 73 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65 6e  size_t tmpbuflen
f1c0: 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f 75 74  , padlen, tmpout
f1d0: 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65  buflen;..int fre
f1e0: 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69  e_tmpbuf = 0;..i
f1f0: 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f  nt le;...CACKEY_
f200: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
f210: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73  lled.");...if (s
f220: 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  lot == NULL) {..
f230: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f240: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73 6c  INTF("Error.  sl
f250: 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  ot is NULL");...
f260: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
f270: 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c  ..if (buf == NUL
f280: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
f290: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
f2a0: 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c 22  r.  buf is NULL"
f2b0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
f2c0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75  ;..}...if (outbu
f2d0: 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  f == NULL) {...C
f2e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f2f0: 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 62  TF("Error.  outb
f300: 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  uf is NULL");...
f310: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
f320: 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d  ..if (identity =
f330: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
f340: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f350: 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74  "Error.  identit
f360: 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  y is NULL");....
f370: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
f380: 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  .if (identity->p
f390: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20  csc_identity == 
f3a0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
f3b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
f3c0: 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d  rror.  identity-
f3d0: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69  >pcsc_identity i
f3e0: 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
f3f0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  urn(-1);..}.../*
f400: 20 44 65 74 65 72 6d 69 6e 65 20 69 64 65 6e 74   Determine ident
f410: 69 74 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a  ity Key size */.
f420: 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  .if (identity->p
f430: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
f440: 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69  ysize < 0) {...i
f450: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
f460: 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
f470: 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a  = x509_to_keysiz
f480: 65 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  e(identity->pcsc
f490: 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
f4a0: 66 69 63 61 74 65 2c 20 69 64 65 6e 74 69 74 79  ficate, identity
f4b0: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
f4c0: 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
f4d0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d  );..}.../* Pad m
f4e0: 65 73 73 61 67 65 20 74 6f 20 6b 65 79 20 73 69  essage to key si
f4f0: 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e  ze */..if (padIn
f500: 70 75 74 29 20 7b 0a 09 09 69 66 20 28 69 64 65  put) {...if (ide
f510: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
f520: 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20  tity->keysize > 
f530: 30 29 20 7b 0a 09 09 09 69 66 20 28 62 75 66 6c  0) {....if (bufl
f540: 65 6e 20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e  en != identity->
f550: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
f560: 65 79 73 69 7a 65 29 20 7b 0a 09 09 09 09 69 66  eysize) {.....if
f570: 20 28 62 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e   (buflen > (iden
f580: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
f590: 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33  ity->keysize + 3
f5a0: 29 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  )) {......CACKEY
f5b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
f5c0: 72 72 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69  rror.  Message i
f5d0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73  s too large to s
f5e0: 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a  ign/decrypt");..
f5f0: 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
f600: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62  .....}......tmpb
f610: 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79  uflen = identity
f620: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
f630: 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d  >keysize;.....tm
f640: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d  pbuf = malloc(tm
f650: 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72  pbuflen);.....fr
f660: 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a  ee_tmpbuf = 1;..
f670: 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70  ....padlen = tmp
f680: 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20  buflen - buflen 
f690: 2d 20 33 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41  - 3;....../* RSA
f6a0: 20 50 4b 43 53 23 31 20 45 4d 53 41 2d 50 4b 43   PKCS#1 EMSA-PKC
f6b0: 53 31 2d 76 31 5f 35 20 50 61 64 64 69 6e 67 20  S1-v1_5 Padding 
f6c0: 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66 5b 30 5d  */.....tmpbuf[0]
f6d0: 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 74 6d 70   = 0x00;.....tmp
f6e0: 62 75 66 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09  buf[1] = 0x01;..
f6f0: 09 09 09 6d 65 6d 73 65 74 28 26 74 6d 70 62 75  ...memset(&tmpbu
f700: 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c  f[2], 0xFF, padl
f710: 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b  en);.....tmpbuf[
f720: 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30  padlen + 2]= 0x0
f730: 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 26 74  0;.....memcpy(&t
f740: 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33  mpbuf[padlen + 3
f750: 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  ], buf, buflen);
f760: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
f770: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70  UG_PRINTBUF("Unp
f780: 61 64 64 65 64 3a 22 2c 20 62 75 66 2c 20 62 75  added:", buf, bu
f790: 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45  flen);.....CACKE
f7a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
f7b0: 28 22 50 61 64 64 65 64 3a 22 2c 20 74 6d 70 62  ("Padded:", tmpb
f7c0: 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a  uf, tmpbuflen);.
f7d0: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
f7e0: 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09  tmpbuf = buf;...
f7f0: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75  ..tmpbuflen = bu
f800: 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74  flen;.....free_t
f810: 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 09 70  mpbuf = 0;.....p
f820: 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a  adlen = 0;....}.
f830: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
f840: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f850: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 74  F("Unable to det
f860: 65 72 6d 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c  ermine key size,
f870: 20 68 6f 70 69 6e 67 20 74 68 65 20 6d 65 73 73   hoping the mess
f880: 61 67 65 20 69 73 20 70 72 6f 70 65 72 6c 79 20  age is properly 
f890: 70 61 64 64 65 64 21 22 29 3b 0a 0a 09 09 09 74  padded!");.....t
f8a0: 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09  mpbuf = buf;....
f8b0: 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c  tmpbuflen = bufl
f8c0: 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62  en;....free_tmpb
f8d0: 75 66 20 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65  uf = 0;....padle
f8e0: 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n = 0;...}..} el
f8f0: 73 65 20 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20  se {...tmpbuf = 
f900: 62 75 66 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e  buf;...tmpbuflen
f910: 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65   = buflen;...fre
f920: 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09  e_tmpbuf = 0;...
f930: 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a  padlen = 0;..}..
f940: 09 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61  ./* Begin transa
f950: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
f960: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
f970: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53  on(slot);.../* S
f980: 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20 61 70  elect correct ap
f990: 70 6c 65 74 20 2a 2f 0a 09 43 41 43 4b 45 59 5f  plet */..CACKEY_
f9a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
f9b0: 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66  lecting applet f
f9c0: 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c  ound at %p ...",
f9d0: 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
f9e0: 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74  identity->applet
f9f0: 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 6c 65 63  );..cackey_selec
fa00: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69  t_applet(slot, i
fa10: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
fa20: 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 2c 20  entity->applet, 
fa30: 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d  sizeof(identity-
fa40: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
fa50: 61 70 70 6c 65 74 29 29 3b 0a 0a 09 2f 2a 20 53  applet));.../* S
fa60: 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20 66 69  elect correct fi
fa70: 6c 65 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 73 65  le */..cackey_se
fa80: 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20  lect_file(slot, 
fa90: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
faa0: 64 65 6e 74 69 74 79 2d 3e 66 69 6c 65 29 3b 0a  dentity->file);.
fab0: 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70  ..tmpbuf_s = tmp
fac0: 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d  buf;..outbuf_s =
fad0: 20 6f 75 74 62 75 66 3b 0a 09 77 68 69 6c 65 20   outbuf;..while 
fae0: 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09  (tmpbuflen) {...
faf0: 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20  if (tmpbuflen > 
fb00: 32 34 35 29 20 7b 0a 09 09 09 62 79 74 65 73 5f  245) {....bytes_
fb10: 74 6f 5f 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09  to_send = 245;..
fb20: 09 09 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 09  ..p1 = 0x80;....
fb30: 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 7d 20 65  le = 0x00;...} e
fb40: 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73 5f 74  lse {....bytes_t
fb50: 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c  o_send = tmpbufl
fb60: 65 6e 3b 0a 09 09 09 70 31 20 3d 20 30 78 30 30  en;....p1 = 0x00
fb70: 3b 0a 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  ;....le = 0x00;.
fb80: 09 09 7d 0a 0a 09 09 74 6d 70 6f 75 74 62 75 66  ..}....tmpoutbuf
fb90: 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b  len = outbuflen;
fba0: 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
fbb0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
fbc0: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
fbd0: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
fbe0: 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  M, GSCIS_INSTR_S
fbf0: 49 47 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20  IGNDECRYPT, p1, 
fc00: 30 78 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73  0x00, bytes_to_s
fc10: 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c  end, tmpbuf, le,
fc20: 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62   &respcode, outb
fc30: 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65  uf, &tmpoutbufle
fc40: 6e 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  n);...if (send_r
fc50: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
fc60: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
fc70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
fc80: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46  ("ADPU Sending F
fc90: 61 69 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e 69  ailed -- returni
fca0: 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a  ng in error.");.
fcb0: 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70  ....if (free_tmp
fcc0: 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28 74  buf) {.....if (t
fcd0: 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09 09  mpbuf_s) {......
fce0: 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a  free(tmpbuf_s);.
fcf0: 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f  ....}....}...../
fd00: 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  * End transactio
fd10: 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65  n */....cackey_e
fd20: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
fd30: 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 72 65  lot);.....if (re
fd40: 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 32  spcode == 0x6982
fd50: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
fd60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63  EBUG_PRINTF("Sec
fd70: 75 72 69 74 79 20 73 74 61 74 75 73 20 6e 6f 74  urity status not
fd80: 20 73 61 74 69 73 69 66 69 65 64 2e 20 20 52 65   satisified.  Re
fd90: 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49  turning NEEDLOGI
fda0: 4e 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  N");......cackey
fdb0: 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
fdc0: 28 73 6c 6f 74 29 3b 0a 09 09 09 09 73 6c 6f 74  (slot);.....slot
fdd0: 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ->token_flags = 
fde0: 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
fdf0: 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ED;......return(
fe00: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
fe10: 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a  EDLOGIN);....}..
fe20: 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
fe30: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
fe40: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a  _TOKENABSENT) {.
fe50: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
fe60: 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61  _PRINTF("Token a
fe70: 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  bsent.  Returnin
fe80: 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b  g TOKENABSENT");
fe90: 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72  ......cackey_mar
fea0: 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
feb0: 74 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 6f  t);.....slot->to
fec0: 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
fed0: 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
fee0: 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
fef0: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
ff00: 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 0a 09 09  BSENT);....}....
ff10: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
ff20: 0a 0a 09 09 74 6d 70 62 75 66 20 2b 3d 20 62 79  ....tmpbuf += by
ff30: 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09 74  tes_to_send;...t
ff40: 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 62 79 74 65  mpbuflen -= byte
ff50: 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75  s_to_send;....ou
ff60: 74 62 75 66 20 2b 3d 20 74 6d 70 6f 75 74 62 75  tbuf += tmpoutbu
ff70: 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 75 66 6c 65  flen;...outbufle
ff80: 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65  n -= tmpoutbufle
ff90: 6e 3b 0a 09 09 72 65 74 76 61 6c 20 2b 3d 20 74  n;...retval += t
ffa0: 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a  mpoutbuflen;..}.
ffb0: 0a 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75  ..if (free_tmpbu
ffc0: 66 29 20 7b 0a 09 09 69 66 20 28 74 6d 70 62 75  f) {...if (tmpbu
ffd0: 66 5f 73 29 20 7b 0a 09 09 09 66 72 65 65 28 74  f_s) {....free(t
ffe0: 6d 70 62 75 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d  mpbuf_s);...}..}
fff0: 0a 0a 09 6f 75 74 62 75 66 20 3d 20 6f 75 74 62  ...outbuf = outb
10000 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74  uf_s;.../* End t
10010 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
10020 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
10030 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69  ction(slot);..#i
10040 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
10050 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
10060 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
10070 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e 20  if (outbuflen > 
10080 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
10090 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
100a0 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62 75  UG_PRINTF("Outbu
100b0 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61 78  flen exceeds max
100c0 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75  imum value, retu
100d0 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
100e0 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 75  . (max = %li, ou
100f0 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c  tbuflen = %lu)",
10100 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
10110 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
10120 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66  ned long) outbuf
10130 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
10140 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66  -1);..}.#  endif
10150 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 55 6e 70  .#endif.../* Unp
10160 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20  ad reply */..if 
10170 28 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a  (unpadOutput) {.
10180 09 09 69 66 20 28 72 65 74 76 61 6c 20 3c 20 33  ..if (retval < 3
10190 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
101a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 70 6c  BUG_PRINTF("Repl
101b0 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  y is too small, 
101c0 77 65 20 61 72 65 20 6e 6f 74 20 61 62 6c 65 20  we are not able 
101d0 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70 61 73 73  to unpad -- pass
101e0 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70  ing back and hop
101f0 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74  ing for the best
10200 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  !");.....CACKEY_
10210 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10220 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
10230 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69  ss, retval = %li
10240 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67   (bytes)", (long
10250 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65  ) retval);....re
10260 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09  turn(retval);...
10270 7d 0a 0a 09 09 69 66 20 28 6f 75 74 62 75 66 5b  }....if (outbuf[
10280 30 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  0] != 0x00) {...
10290 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
102a0 49 4e 54 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a  INTF("Unrecogniz
102b0 65 64 20 70 61 64 64 69 6e 67 20 73 63 68 65 6d  ed padding schem
102c0 65 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63  e -- passing bac
102d0 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72  k and hoping for
102e0 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09   the best!");...
102f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10300 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
10310 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
10320 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
10330 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
10340 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
10350 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c  tval);...}....bl
10360 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74 62 75 66  ocktype = outbuf
10370 5b 31 5d 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73  [1];...unpadoffs
10380 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63  et = 0;....switc
10390 68 20 28 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  h (blocktype) {.
103a0 09 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09  ...case 0x00:...
103b0 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
103c0 65 6d 65 20 31 2c 20 74 68 65 20 66 69 72 73 74  eme 1, the first
103d0 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69   non-zero byte i
103e0 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 64  s the start of d
103f0 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28  ata */.....for (
10400 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b  unpadoffset = 2;
10410 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72   unpadoffset < r
10420 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73  etval; unpadoffs
10430 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20  et++) {......if 
10440 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
10450 73 65 74 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a  set] != 0x00) {.
10460 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10470 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  ..}.....}.....br
10480 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30  eak;....case 0x0
10490 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e  1:...../* Paddin
104a0 67 20 53 63 68 65 6d 65 20 32 2c 20 70 61 64 20  g Scheme 2, pad 
104b0 62 79 74 65 73 20 61 72 65 20 30 78 46 46 20 66  bytes are 0xFF f
104c0 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78 30 30 20  ollowed by 0x00 
104d0 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
104e0 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
104f0 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
10500 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
10510 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
10520 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
10530 20 21 3d 20 30 78 46 46 29 20 7b 0a 09 09 09 09   != 0xFF) {.....
10540 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70  ..if (outbuf[unp
10550 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78 30  adoffset] == 0x0
10560 30 29 20 7b 0a 09 09 09 09 09 09 09 75 6e 70 61  0) {........unpa
10570 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09  doffset++;......
10580 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09  ...break;.......
10590 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09  } else {........
105a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
105b0 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64  NTF("Invalid pad
105c0 64 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c  ding data found,
105d0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
105e0 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61  ilure, should ha
105f0 76 65 20 62 65 65 6e 20 30 78 30 30 20 66 6f 75  ve been 0x00 fou
10600 6e 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73  nd 0x%02x", (uns
10610 69 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75  igned int) outbu
10620 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b  f[unpadoffset]);
10630 0a 0a 09 09 09 09 09 09 09 72 65 74 75 72 6e 28  .........return(
10640 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  -1);.......}....
10650 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
10660 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10670 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61  INTF("Invalid pa
10680 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64  dding data found
10690 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
106a0 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68  ailure, should h
106b0 61 76 65 20 62 65 65 6e 20 30 78 46 46 20 66 6f  ave been 0xFF fo
106c0 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e  und 0x%02x", (un
106d0 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62  signed int) outb
106e0 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29  uf[unpadoffset])
106f0 3b 0a 0a 09 09 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
10700 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  -1);......}.....
10710 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  }.....break;....
10720 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 09 2f  case 0x02:...../
10730 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65  * Padding Scheme
10740 20 33 2c 20 70 61 64 20 62 79 74 65 73 20 61 72   3, pad bytes ar
10750 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74  e non-zero first
10760 20 7a 65 72 6f 20 62 79 74 65 20 66 6f 75 6e 64   zero byte found
10770 20 69 73 20 74 68 65 20 73 65 70 65 72 61 74 6f   is the seperato
10780 72 20 62 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f  r byte */.....fo
10790 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  r (unpadoffset =
107a0 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20   2; unpadoffset 
107b0 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f  < retval; unpado
107c0 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09  ffset++) {......
107d0 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
107e0 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29  offset] == 0x00)
107f0 20 7b 0a 09 09 09 09 09 09 75 6e 70 61 64 6f 66   {.......unpadof
10800 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62  fset++;........b
10810 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  reak;......}....
10820 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
10830 7d 0a 0a 09 09 69 66 20 28 75 6e 70 61 64 6f 66  }....if (unpadof
10840 66 73 65 74 20 3e 20 72 65 74 76 61 6c 29 20 7b  fset > retval) {
10850 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10860 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20  _PRINTF("Offset 
10870 67 72 65 61 74 65 72 20 74 68 61 6e 20 72 65 70  greater than rep
10880 6c 79 20 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e  ly size, abortin
10890 67 2e 20 20 28 75 6e 70 61 64 6f 66 66 73 65 74  g.  (unpadoffset
108a0 20 3d 20 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d   = %lu, retval =
108b0 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
108c0 64 20 6c 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66  d long) unpadoff
108d0 73 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  set, (unsigned l
108e0 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  ong) retval);...
108f0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
10900 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
10910 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64  G_PRINTBUF("Padd
10920 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65  ed:", outbuf, re
10930 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c  tval);....retval
10940 20 2d 3d 20 75 6e 70 61 64 6f 66 66 73 65 74 3b   -= unpadoffset;
10950 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75  ...memmove(outbu
10960 66 2c 20 6f 75 74 62 75 66 20 2b 20 75 6e 70 61  f, outbuf + unpa
10970 64 6f 66 66 73 65 74 2c 20 72 65 74 76 61 6c 29  doffset, retval)
10980 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
10990 47 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61  G_PRINTBUF("Unpa
109a0 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20  dded:", outbuf, 
109b0 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43  retval);..}....C
109c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
109d0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
109e0 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c   success, retval
109f0 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c   = %li (bytes)",
10a00 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b   (long) retval);
10a10 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
10a20 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
10a30 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
10a40 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
10a50 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
10a60 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
10a70 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
10a80 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
10a90 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
10aa0 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
10ab0 6c 6f 67 69 6e 28 73 74 72 75 63 74 20 63 61 63  login(struct cac
10ac0 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
10ad0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
10ae0 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  in, unsigned lon
10af0 67 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a  g pin_len, int *
10b00 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
10b10 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  p) {..unsigned c
10b20 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d  har cac_pin[8] =
10b30 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78   {0xFF, 0xFF, 0x
10b40 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
10b50 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
10b60 7d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73  };..uint16_t res
10b70 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74  ponse_code;..int
10b80 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
10b90 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
10ba0 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74  .../* Indicate t
10bb0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  hat we do not kn
10bc0 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e  ow about how man
10bd0 79 20 74 72 69 65 73 20 61 72 65 20 72 65 6d 61  y tries are rema
10be0 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72  ining */..if (tr
10bf0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
10c00 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61   {...*tries_rema
10c10 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d  ining_p = -1;..}
10c20 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79  .../* Apparently
10c30 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a  , CAC PINs are *
10c40 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73  EXACTLY* 8 bytes
10c50 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74   long -- pad wit
10c60 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68  h 0xFF if too sh
10c70 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f  ort */..if (pin_
10c80 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65  len >= 8) {...me
10c90 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69  mcpy(cac_pin, pi
10ca0 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  n, 8);..} else {
10cb0 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69  ...memcpy(cac_pi
10cc0 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29  n, pin, pin_len)
10cd0 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20  ;..}.../* Issue 
10ce0 50 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73  PIN Verify */..s
10cf0 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
10d00 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
10d10 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
10d20 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
10d30 52 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20  R_VERIFY, 0x00, 
10d40 30 78 30 30 2c 20 73 69 7a 65 6f 66 28 63 61 63  0x00, sizeof(cac
10d50 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20  _pin), cac_pin, 
10d60 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f  0x00, &response_
10d70 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  code, NULL, NULL
10d80 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  );..if (send_ret
10d90 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
10da0 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72  S_OK) {...if ((r
10db0 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30  esponse_code & 0
10dc0 78 36 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30  x63C0) == 0x63C0
10dd0 29 20 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d  ) {....tries_rem
10de0 61 69 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e  aining = (respon
10df0 73 65 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a  se_code & 0xF);.
10e00 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10e10 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72  _PRINTF("PIN Ver
10e20 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64  ification failed
10e30 2c 20 25 69 20 74 72 69 65 73 20 72 65 6d 61 69  , %i tries remai
10e40 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d  ning", tries_rem
10e50 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20  aining);.....if 
10e60 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  (tries_remaining
10e70 5f 70 29 20 7b 0a 09 09 09 09 2a 74 72 69 65 73  _p) {.....*tries
10e80 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74  _remaining_p = t
10e90 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
10ea0 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28  ...}.....return(
10eb0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
10ec0 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  DPIN);...}....if
10ed0 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20   (response_code 
10ee0 3d 3d 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09  == 0x6983) {....
10ef0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10f00 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63  NTF("PIN Verific
10f10 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65  ation failed, de
10f20 76 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 22 29  vice is locked")
10f30 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
10f40 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45  KEY_PCSC_E_LOCKE
10f50 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  D);...}....retur
10f60 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
10f70 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
10f80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10f90 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
10fa0 74 69 6f 6e 20 73 75 63 63 65 65 64 65 64 22 29  tion succeeded")
10fb0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
10fc0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
10fd0 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
10fe0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
10ff0 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
11000 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
11010 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
11020 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
11030 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
11040 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
11050 72 65 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  ret cackey_token
11060 5f 70 72 65 73 65 6e 74 28 73 74 72 75 63 74 20  _present(struct 
11070 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
11080 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74  t) {..cackey_ret
11090 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
110a0 74 3b 0a 09 44 57 4f 52 44 20 72 65 61 64 65 72  t;..DWORD reader
110b0 5f 6c 65 6e 20 3d 20 30 2c 20 73 74 61 74 65 20  _len = 0, state 
110c0 3d 20 30 2c 20 70 72 6f 74 6f 63 6f 6c 20 3d 20  = 0, protocol = 
110d0 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54  0, atr_len;..BYT
110e0 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49  E atr[MAX_ATR_SI
110f0 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75  ZE];..LONG statu
11100 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63  s_ret, scard_rec
11110 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  onn_ret;...CACKE
11120 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11130 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
11140 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29  (slot->internal)
11150 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
11160 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
11170 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e  ing token presen
11180 74 20 28 69 6e 74 65 72 6e 61 6c 20 74 6f 6b 65  t (internal toke
11190 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  n)");....return(
111a0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
111b0 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a  KENPRESENT);..}.
111c0 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
111d0 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
111e0 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
111f0 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
11200 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
11210 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
11220 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11230 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
11240 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
11250 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61  eturning token a
11260 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75  bsent");....retu
11270 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
11280 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
11290 7d 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69  }...atr_len = si
112a0 7a 65 6f 66 28 61 74 72 29 3b 0a 09 73 74 61 74  zeof(atr);..stat
112b0 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
112c0 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
112d0 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
112e0 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
112f0 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
11300 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66   &atr_len);...if
11310 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20   (status_ret == 
11320 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
11330 48 41 4e 44 4c 45 29 20 7b 0a 09 09 43 41 43 4b  HANDLE) {...CACK
11340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11350 22 53 43 61 72 64 53 74 61 74 75 73 28 29 20 72  "SCardStatus() r
11360 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
11370 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 2c 20  INVALID_HANDLE, 
11380 6d 61 72 6b 69 6e 67 20 69 73 20 6e 6f 74 20 61  marking is not a
11390 6c 72 65 61 64 79 20 63 6f 6e 6e 65 63 74 65 64  lready connected
113a0 20 61 6e 64 20 74 72 79 69 6e 67 20 61 67 61 69   and trying agai
113b0 6e 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61  n");...cackey_ma
113c0 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
113d0 6f 74 29 3b 0a 0a 09 09 70 63 73 63 5f 63 6f 6e  ot);....pcsc_con
113e0 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
113f0 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
11400 6c 6f 74 29 3b 0a 09 09 69 66 20 28 70 63 73 63  lot);...if (pcsc
11410 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
11420 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
11430 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
11440 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
11450 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
11460 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
11470 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b   token absent");
11480 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
11490 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
114a0 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09 61  BSENT);...}....a
114b0 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  tr_len = sizeof(
114c0 61 74 72 29 3b 0a 09 09 73 74 61 74 75 73 5f 72  atr);...status_r
114d0 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
114e0 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
114f0 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
11500 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
11510 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
11520 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20  r_len);..}...if 
11530 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53  (status_ret != S
11540 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
11550 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  {...cackey_mark_
11560 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
11570 3b 0a 0a 09 09 69 66 20 28 73 74 61 74 75 73 5f  ;....if (status_
11580 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52  ret == SCARD_W_R
11590 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09  ESET_CARD) {....
115a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
115b0 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69  NTF("Reset requi
115c0 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64  red, please hold
115d0 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64  ...");.....scard
115e0 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  _reconn_ret = ca
115f0 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
11600 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f  ard(slot, SCARD_
11610 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
11620 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
11630 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09   &protocol);....
11640 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e  if (scard_reconn
11650 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
11660 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f  SUCCESS) {...../
11670 2a 20 55 70 64 61 74 65 20 70 72 6f 74 6f 63 6f  * Update protoco
11680 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 70  l */.....slot->p
11690 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63  rotocol = protoc
116a0 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20 52 65 2d 65  ol;....../* Re-e
116b0 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63  stablish transac
116c0 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20  tion, if it was 
116d0 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69  present */.....i
116e0 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
116f0 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
11700 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  {......slot->tra
11710 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d  nsaction_depth--
11720 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  ;......slot->tra
11730 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
11740 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09  _lock = 1;......
11750 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
11760 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
11770 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
11780 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11790 52 65 73 65 74 20 73 75 63 63 65 73 73 66 75 6c  Reset successful
117a0 2c 20 72 65 71 75 65 72 79 69 6e 67 22 29 3b 0a  , requerying");.
117b0 09 09 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d  ....status_ret =
117c0 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f   SCardStatus(slo
117d0 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55  t->pcsc_card, NU
117e0 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c  LL, &reader_len,
117f0 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63   &state, &protoc
11800 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65  ol, atr, &atr_le
11810 6e 29 3b 0a 09 09 09 09 69 66 20 28 73 74 61 74  n);.....if (stat
11820 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  us_ret != SCARD_
11830 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
11840 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11850 52 49 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e 61  RINTF("Still una
11860 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72  ble to query car
11870 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e  d status, return
11880 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
11890 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29  .  SCardStatus()
118a0 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44   = %s", CACKEY_D
118b0 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
118c0 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73  RR_TO_STR(status
118d0 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 09 72 65  _ret));.......re
118e0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
118f0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
11900 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
11910 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
11920 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
11930 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20  le to reconnect 
11940 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69  to card, returni
11950 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e  ng token absent.
11960 20 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74    SCardReconnect
11970 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59  () = %s", CACKEY
11980 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
11990 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
119a0 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a  d_reconn_ret));.
119b0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
119c0 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
119d0 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d  BSENT);....}...}
119e0 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
119f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11a00 55 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20  Unable to query 
11a10 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74  card status, ret
11a20 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
11a30 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75  ent.  SCardStatu
11a40 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45  s() = %s", CACKE
11a50 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
11a60 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61  RDERR_TO_STR(sta
11a70 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72  tus_ret));.....r
11a80 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
11a90 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
11aa0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28  ;...}..}...if ((
11ab0 73 74 61 74 65 20 26 20 53 43 41 52 44 5f 41 42  state & SCARD_AB
11ac0 53 45 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f 41  SENT) == SCARD_A
11ad0 42 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45  BSENT) {...CACKE
11ae0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11af0 43 61 72 64 20 69 73 20 61 62 73 65 6e 74 2c 20  Card is absent, 
11b00 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
11b10 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74  absent");....ret
11b20 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
11b30 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
11b40 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
11b50 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
11b60 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e  ing token presen
11b70 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  t.");...return(C
11b80 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
11b90 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f  ENPRESENT);.}../
11ba0 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
11bb0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
11bc0 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
11bd0 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
11be0 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
11bf0 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
11c00 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
11c10 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63  static ssize_t c
11c20 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
11c30 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72  ity_to_label(str
11c40 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
11c50 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
11c60 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ty, unsigned cha
11c70 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e  r *label_buf, un
11c80 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65  signed long labe
11c90 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e  l_buf_len) {..un
11ca0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74  signed long cert
11cb0 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 76 6f  ificate_len;..vo
11cc0 69 64 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a  id *label_asn1;.
11cd0 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63 61  .void *certifica
11ce0 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72 65  te;..int x509_re
11cf0 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69 66  ad_ret;...certif
11d00 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79  icate = identity
11d10 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  ->certificate;..
11d20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
11d30 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
11d40 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69  ificate_len;...i
11d50 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
11d60 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  en < 0) {...retu
11d70 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30  rn(-1);..}...x50
11d80 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
11d90 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72  9_to_subject(cer
11da0 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
11db0 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64  icate_len, (void
11dc0 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31   **) &label_asn1
11dd0 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61  );..if (x509_rea
11de0 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 72  d_ret < 0) {...r
11df0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
11e00 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
11e10 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e  x509_dn_to_strin
11e20 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35  g(label_asn1, x5
11e30 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68  09_read_ret, (ch
11e40 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c  ar *) label_buf,
11e50 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20   label_buf_len, 
11e60 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30 39  "CN");..if (x509
11e70 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  _read_ret <= 0) 
11e80 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  {...x509_read_re
11e90 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73  t = x509_dn_to_s
11ea0 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31  tring(label_asn1
11eb0 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c  , x509_read_ret,
11ec0 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f   (char *) label_
11ed0 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  buf, label_buf_l
11ee0 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66  en, NULL);....if
11ef0 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
11f00 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72  <= 0) {....retur
11f10 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23  n(-1);...}..}..#
11f20 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
11f30 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
11f40 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
11f50 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
11f60 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  et > _POSIX_SSIZ
11f70 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
11f80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11f90 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65 78  x509_read_ret ex
11fa0 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
11fb0 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
11fc0 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
11fd0 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61 64  = %li, x509_read
11fe0 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c  _ret = %lu)", (l
11ff0 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a  ong) _POSIX_SSIZ
12000 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64  E_MAX, (unsigned
12010 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61 64   long) x509_read
12020 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
12030 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
12040 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72  f.#endif...retur
12050 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29  n(x509_read_ret)
12060 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20  ;.}../* Returns 
12070 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  0 on success */.
12080 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
12090 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 76  y_mutex_create(v
120a0 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09  oid **mutex) {..
120b0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
120c0 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a  *pthread_mutex;.
120d0 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74  .int pthread_ret
120e0 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74  val;..CK_RV cust
120f0 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  om_retval;...CAC
12100 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12110 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
12120 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  f ((cackey_args.
12130 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c  flags & CKF_OS_L
12140 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b  OCKING_OK) == CK
12150 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
12160 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74   {...pthread_mut
12170 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ex = malloc(size
12180 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  of(*pthread_mute
12190 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68 72  x));...if (!pthr
121a0 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ead_mutex) {....
121b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
121c0 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 61  NTF("Failed to a
121d0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22  llocate memory."
121e0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
121f0 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61  );...}....pthrea
12200 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65  d_retval = pthre
12210 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70 74  ad_mutex_init(pt
12220 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c  hread_mutex, NUL
12230 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  L);...if (pthrea
12240 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  d_retval != 0) {
12250 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12260 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64  _PRINTF("pthread
12270 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72 65  _mutex_init() re
12280 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69  turned error (%i
12290 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74  ).", pthread_ret
122a0 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
122b0 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75  (-1);...}....*mu
122c0 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  tex = pthread_mu
122d0 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  tex;..} else {..
122e0 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73  .if (cackey_args
122f0 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b 0a  .CreateMutex) {.
12300 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
12310 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 43   = cackey_args.C
12320 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65 78  reateMutex(mutex
12330 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f  );.....if (custo
12340 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f  m_retval != CKR_
12350 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
12360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
12370 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74  ackey_args.Creat
12380 65 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  eMutex() returne
12390 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
123a0 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
123b0 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
123c0 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
123d0 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
123e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
123f0 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
12400 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
12410 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  n(0);.}../* Retu
12420 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
12430 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
12440 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
12450 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a  (void *mutex) {.
12460 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
12470 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
12480 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
12490 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
124a0 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
124b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
124c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
124d0 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
124e0 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
124f0 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
12500 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
12510 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
12520 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09  tex = mutex;....
12530 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d  pthread_retval =
12540 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
12550 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65  ock(pthread_mute
12560 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  x);...if (pthrea
12570 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  d_retval != 0) {
12580 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12590 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64  _PRINTF("pthread
125a0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65  _mutex_lock() re
125b0 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69  turned error (%i
125c0 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74  ).", pthread_ret
125d0 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
125e0 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  (-1);...}..} els
125f0 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  e {...if (cackey
12600 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29  _args.LockMutex)
12610 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
12620 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
12630 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65  s.LockMutex(mute
12640 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74  x);.....if (cust
12650 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52  om_retval != CKR
12660 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
12670 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12680 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
12690 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64  Mutex() returned
126a0 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20   error (%li).", 
126b0 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65  (long) custom_re
126c0 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75  tval);......retu
126d0 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d  rn(-1);....}...}
126e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
126f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
12700 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79  ning sucessfully
12710 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e   (0)");...return
12720 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  (0);.}../* Retur
12730 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  ns 0 on success 
12740 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
12750 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
12760 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b  k(void *mutex) {
12770 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
12780 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
12790 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
127a0 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
127b0 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
127c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
127d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
127e0 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
127f0 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
12800 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
12810 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
12820 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
12830 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09  utex = mutex;...
12840 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  .pthread_retval 
12850 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  = pthread_mutex_
12860 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d  unlock(pthread_m
12870 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68  utex);...if (pth
12880 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
12890 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
128a0 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
128b0 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
128c0 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
128d0 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61  r (%i).", pthrea
128e0 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  d_retval);.....r
128f0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
12900 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63  } else {...if (c
12910 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
12920 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73  kMutex) {....cus
12930 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tom_retval = cac
12940 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
12950 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09  utex(mutex);....
12960 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76  .if (custom_retv
12970 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al != CKR_OK) {.
12980 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12990 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
129a0 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78  args.UnlockMutex
129b0 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
129c0 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67  r (%li).", (long
129d0 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29  ) custom_retval)
129e0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
129f0 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a  );....}...}..}..
12a00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12a10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
12a20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22  sucessfully (0)"
12a30 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
12a40 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54 54  }..static CK_ATT
12a50 52 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b 65  RIBUTE_PTR cacke
12a60 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
12a70 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53  (CK_OBJECT_CLASS
12a80 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73 74   objectclass, st
12a90 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
12aa0 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
12ab0 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ity, unsigned lo
12ac0 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c  ng identity_num,
12ad0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
12ae0 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69  lCount) {..stati
12af0 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72  c CK_BBOOL ck_tr
12b00 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63 20  ue = 1;..static 
12b10 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73  CK_BBOOL ck_fals
12b20 65 20 3d 20 30 3b 0a 09 73 74 61 74 69 63 20 43  e = 0;..static C
12b30 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72 75 73 74  K_TRUST ck_trust
12b40 65 64 20 3d 20 43 4b 5f 54 52 55 53 54 45 44 5f  ed = CK_TRUSTED_
12b50 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43 4b 5f 55  DELEGATOR;..CK_U
12b60 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73 20 3d 20  LONG numattrs = 
12b70 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b  0, retval_count;
12b80 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 54  ..CK_ATTRIBUTE_T
12b90 59 50 45 20 63 75 72 72 5f 61 74 74 72 5f 74 79  YPE curr_attr_ty
12ba0 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  pe;..CK_ATTRIBUT
12bb0 45 20 63 75 72 72 5f 61 74 74 72 2c 20 2a 72 65  E curr_attr, *re
12bc0 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  tval;..CK_VOID_P
12bd0 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55  TR pValue;..CK_U
12be0 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  LONG ulValueLen;
12bf0 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53  ..CK_OBJECT_CLAS
12c00 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  S ck_object_clas
12c10 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46 49 43 41  s;..CK_CERTIFICA
12c20 54 45 5f 54 59 50 45 20 63 6b 5f 63 65 72 74 69  TE_TYPE ck_certi
12c30 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b  ficate_type;..CK
12c40 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79  _KEY_TYPE ck_key
12c50 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43  _type;..CK_UTF8C
12c60 48 41 52 20 75 63 54 6d 70 42 75 66 5b 31 30 32  HAR ucTmpBuf[102
12c70 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74 65 78 74  4];..SHA1Context
12c80 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d 44 35 5f   sha1_ctx;..MD5_
12c90 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a 09 75 69  CTX md5_ctx;..ui
12ca0 6e 74 38 5f 74 20 73 68 61 31 5f 68 61 73 68 5b  nt8_t sha1_hash[
12cb0 53 48 41 31 48 61 73 68 53 69 7a 65 5d 3b 0a 09  SHA1HashSize];..
12cc0 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68 61 73 68  uint8_t md5_hash
12cd0 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d 3b 0a 09  [MD5HashSize];..
12ce0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
12cf0 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73 73 69  ertificate;..ssi
12d00 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65  ze_t certificate
12d10 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f  _len = -1, x509_
12d20 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70  read_ret;..int p
12d30 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41  Value_free;...CA
12d40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12d50 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63  F("Called (objec
12d60 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69 64  tClass = %lu, id
12d70 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75  entity_num = %lu
12d80 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
12d90 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 73 73  ong) objectclass
12da0 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b  , identity_num);
12db0 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 30  ...*pulCount = 0
12dc0 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ;...if (objectcl
12dd0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
12de0 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74  FICATE && object
12df0 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42  class != CKO_PUB
12e00 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63  LIC_KEY && objec
12e10 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52  tclass != CKO_PR
12e20 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a  IVATE_KEY && obj
12e30 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
12e40 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
12e50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
12e60 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
12e70 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55  ng 0 objects (NU
12e80 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 6f 62 6a  LL), invalid obj
12e90 65 63 74 20 63 6c 61 73 73 22 29 3b 0a 0a 09 09  ect class");....
12ea0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
12eb0 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72 74 20 2a  .../* Get Cert *
12ec0 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20  /..if (identity 
12ed0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
12ee0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12ef0 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
12f00 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e  jects (NULL), in
12f10 76 61 6c 69 64 20 69 64 65 6e 74 69 79 20 70 72  valid identiy pr
12f20 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09 72 65 74  ovided");....ret
12f30 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
12f40 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 69 64  certificate = id
12f50 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
12f60 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74  ate;..certificat
12f70 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79  e_len = identity
12f80 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
12f90 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69  n;...if (certifi
12fa0 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c  cate_len == -1 |
12fb0 7c 20 63 65 72 74 69 66 69 63 61 74 65 20 3d 3d  | certificate ==
12fc0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
12fd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12fe0 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65  Returning 0 obje
12ff0 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 69 73  cts (NULL), this
13000 20 69 64 65 6e 74 69 74 79 20 64 6f 65 73 20 6e   identity does n
13010 6f 74 20 68 61 76 65 20 61 6e 20 58 2e 35 30 39  ot have an X.509
13020 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73   certificate ass
13030 6f 63 69 61 74 65 64 20 77 69 74 68 20 69 74 20  ociated with it 
13040 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  and will not wor
13050 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  k");....return(N
13060 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65  ULL);..}.../* Ve
13070 72 69 66 79 20 74 68 61 74 20 63 65 72 74 69 66  rify that certif
13080 69 63 61 74 65 20 69 73 20 41 53 4e 2e 31 20 65  icate is ASN.1 e
13090 6e 63 6f 64 65 64 20 58 2e 35 30 39 20 63 65 72  ncoded X.509 cer
130a0 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20  tificate */..if 
130b0 28 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28  (x509_to_serial(
130c0 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
130d0 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 4e 55  tificate_len, NU
130e0 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09 43 41 43  LL) < 0) {...CAC
130f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13100 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
13110 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68  jects (NULL), th
13120 65 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63  e X.509 certific
13130 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ate associated w
13140 69 74 68 20 74 68 69 73 20 69 64 65 6e 74 69 74  ith this identit
13150 79 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 22 29  y is not valid")
13160 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
13170 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 5f 63  );..}...retval_c
13180 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72 65 74 76  ount = 64;..retv
13190 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 65 74 76  al = malloc(retv
131a0 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  al_count * sizeo
131b0 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09 66  f(*retval));...f
131c0 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79  or (curr_attr_ty
131d0 70 65 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74  pe = 0; curr_att
131e0 72 5f 74 79 70 65 20 3c 20 30 78 63 65 35 33 36  r_type < 0xce536
131f0 33 62 66 3b 20 63 75 72 72 5f 61 74 74 72 5f 74  3bf; curr_attr_t
13200 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  ype++) {...if (c
13210 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 3d  urr_attr_type ==
13220 20 30 78 38 30 30 29 20 7b 0a 09 09 09 63 75 72   0x800) {....cur
13230 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 78  r_attr_type = 0x
13240 63 65 35 33 36 33 30 30 3b 0a 09 09 7d 0a 0a 09  ce536300;...}...
13250 09 70 56 61 6c 75 65 5f 66 72 65 65 20 3d 20 30  .pValue_free = 0
13260 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ;...pValue = NUL
13270 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  L;...ulValueLen 
13280 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a  = (CK_LONG) -1;.
13290 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72 5f  ...switch (curr_
132a0 61 74 74 72 5f 74 79 70 65 29 20 7b 0a 09 09 09  attr_type) {....
132b0 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a  case CKA_CLASS:.
132c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
132d0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
132e0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
132f0 41 5f 43 4c 41 53 53 20 28 30 78 25 30 38 6c 78  A_CLASS (0x%08lx
13300 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
13310 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
13320 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 63 6b  r_type);......ck
13330 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 20 3d 20  _object_class = 
13340 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a 0a 09 09  objectclass;....
13350 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6f  ..pValue = &ck_o
13360 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 09 09  bject_class;....
13370 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
13380 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63 74 5f 63  zeof(ck_object_c
13390 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lass);......CACK
133a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
133b0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
133c0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
133d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
133e0 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53  ((CK_OBJECT_CLAS
133f0 53 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  S *) pValue), pV
13400 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
13410 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
13420 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
13430 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e  ..case CKA_TOKEN
13440 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
13450 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
13460 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
13470 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78 25 30 38  CKA_TOKEN (0x%08
13480 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
13490 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
134a0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
134b0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
134c0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
134d0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
134e0 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ue);......CACKEY
134f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
13500 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
13510 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
13520 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
13530 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
13540 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
13550 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
13560 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
13570 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
13580 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 09 43  A_PRIVATE:.....C
13590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
135a0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
135b0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 52 49  ttribute CKA_PRI
135c0 56 41 54 45 20 28 30 78 25 30 38 6c 78 29 20 2e  VATE (0x%08lx) .
135d0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
135e0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
135f0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
13600 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
13610 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
13620 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
13630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
13640 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
13650 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
13660 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63   are not a Netsc
13670 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
13680 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
13690 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c  .....}......pVal
136a0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
136b0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
136c0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
136d0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
136e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
136f0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
13700 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
13710 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
13720 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
13730 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
13740 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
13750 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
13760 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
13770 54 52 55 53 54 45 44 3a 0a 09 09 09 09 43 41 43  TRUSTED:.....CAC
13780 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13790 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
137a0 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54  ribute CKA_TRUST
137b0 45 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ED (0x%08lx) ...
137c0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
137d0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
137e0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
137f0 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
13800 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
13810 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
13820 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
13830 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
13840 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
13850 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
13860 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
13870 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
13880 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
13890 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
138a0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
138b0 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
138c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
138d0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
138e0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
138f0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
13900 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
13910 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
13920 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
13930 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
13940 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
13950 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42  ase CKA_MODIFIAB
13960 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  LE:.....CACKEY_D
13970 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
13980 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
13990 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45  e CKA_MODIFIABLE
139a0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
139b0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
139c0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
139d0 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
139e0 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75  &ck_false;.....u
139f0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
13a00 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09  of(ck_false);...
13a10 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13a20 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
13a30 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
13a40 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
13a50 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
13a60 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
13a70 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
13a80 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
13a90 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
13aa0 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c  ..case CKA_LABEL
13ab0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
13ac0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
13ad0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
13ae0 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78 25 30 38  CKA_LABEL (0x%08
13af0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
13b00 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
13b10 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
13b20 2f 2a 20 58 58 58 3a 20 44 65 74 65 72 6d 69 6e  /* XXX: Determin
13b30 65 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 09 75 6c  e name */.....ul
13b40 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69  ValueLen = snpri
13b50 6e 74 66 28 28 63 68 61 72 20 2a 29 20 75 63 54  ntf((char *) ucT
13b60 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66 28 75 63  mpBuf, sizeof(uc
13b70 54 6d 70 42 75 66 29 2c 20 22 49 64 65 6e 74 69  TmpBuf), "Identi
13b80 74 79 20 23 25 6c 75 22 2c 20 28 75 6e 73 69 67  ty #%lu", (unsig
13b90 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
13ba0 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 70 56 61  ty_num);.....pVa
13bb0 6c 75 65 20 3d 20 75 63 54 6d 70 42 75 66 3b 0a  lue = ucTmpBuf;.
13bc0 0a 09 09 09 09 69 66 20 28 75 6c 56 61 6c 75 65  .....if (ulValue
13bd0 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 28 75 63  Len >= sizeof(uc
13be0 54 6d 70 42 75 66 29 29 20 7b 0a 09 09 09 09 09  TmpBuf)) {......
13bf0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a  ulValueLen = 0;.
13c00 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
13c10 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  LL;.....}......C
13c20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13c30 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
13c40 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
13c50 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
13c60 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
13c70 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
13c80 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45  ..case CKA_VALUE
13c90 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
13ca0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
13cb0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
13cc0 43 4b 41 5f 56 41 4c 55 45 20 28 30 78 25 30 38  CKA_VALUE (0x%08
13cd0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
13ce0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
13cf0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
13d00 73 77 69 74 63 68 20 28 6f 62 6a 65 63 74 63 6c  switch (objectcl
13d10 61 73 73 29 20 7b 0a 09 09 09 09 09 63 61 73 65  ass) {......case
13d20 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
13d30 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  :.......CACKEY_D
13d40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
13d50 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
13d60 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
13d70 61 72 65 20 61 20 70 72 69 76 61 74 65 20 6b 65  are a private ke
13d80 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65  y.");........bre
13d90 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b  ak;......case CK
13da0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
13db0 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  :.......CACKEY_D
13dc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
13dd0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
13de0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
13df0 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
13e00 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
13e10 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
13e20 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49  ..case CKO_PUBLI
13e30 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 69 66 20  C_KEY:.......if 
13e40 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
13e50 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09   >= 0) {........
13e60 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
13e70 78 35 30 39 5f 74 6f 5f 70 75 62 6b 65 79 28 63  x509_to_pubkey(c
13e80 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
13e90 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
13ea0 61 6c 75 65 29 3b 0a 09 09 09 09 09 09 09 69 66  alue);........if
13eb0 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
13ec0 3c 20 30 29 20 7b 20 0a 09 09 09 09 09 09 09 09  < 0) { .........
13ed0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
13ee0 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
13ef0 09 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
13f00 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
13f10 74 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09  t;........}.....
13f20 09 09 7d 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ..}........break
13f30 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  ;......case CKO_
13f40 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09  CERTIFICATE:....
13f50 09 09 09 70 56 61 6c 75 65 20 3d 20 63 65 72 74  ...pValue = cert
13f60 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09 09 75  ificate;.......u
13f70 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63 65 72 74  lValueLen = cert
13f80 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09  ificate_len;....
13f90 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
13fa0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
13fb0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
13fc0 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
13fd0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
13fe0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
13ff0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
14000 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
14010 49 53 53 55 45 52 3a 0a 09 09 09 09 43 41 43 4b  ISSUER:.....CACK
14020 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14030 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
14040 69 62 75 74 65 20 43 4b 41 5f 49 53 53 55 45 52  ibute CKA_ISSUER
14050 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
14060 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
14070 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
14080 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
14090 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
140a0 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a  RTIFICATE && obj
140b0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
140c0 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
140d0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
140e0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
140f0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
14100 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
14110 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
14120 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65  cate or Netscape
14130 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
14140 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
14150 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
14160 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
14170 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
14180 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
14190 6f 5f 69 73 73 75 65 72 28 63 65 72 74 69 66 69  o_issuer(certifi
141a0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
141b0 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
141c0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
141d0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
141e0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
141f0 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
14200 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
14210 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
14220 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
14230 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14240 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
14250 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
14260 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
14270 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
14280 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
14290 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
142a0 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09  SERIAL_NUMBER:..
142b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
142c0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
142d0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
142e0 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28  _SERIAL_NUMBER (
142f0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
14300 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
14310 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
14320 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
14330 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
14340 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63  IFICATE && objec
14350 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45  tclass != CKO_NE
14360 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
14370 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14380 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
14390 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
143a0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
143b0 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
143c0 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74  te or Netscape t
143d0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
143e0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
143f0 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
14400 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
14410 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
14420 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
14430 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 63 61  serial(certifica
14440 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
14450 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
14460 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
14470 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
14480 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
14490 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
144a0 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
144b0 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
144c0 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
144d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
144e0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
144f0 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29  turning (%p/%lu)
14500 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
14510 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
14520 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
14530 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
14540 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43 41 43  SUBJECT:.....CAC
14550 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14560 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
14570 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42 4a 45  ribute CKA_SUBJE
14580 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  CT (0x%08lx) ...
14590 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
145a0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
145b0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
145c0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
145d0 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
145e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
145f0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
14600 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
14610 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
14620 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74  not a certificat
14630 65 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  e");.......break
14640 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
14650 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
14660 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
14670 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
14680 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65  09_to_subject(ce
14690 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
146a0 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
146b0 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
146c0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
146d0 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
146e0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
146f0 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
14700 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
14710 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
14720 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
14730 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14740 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
14750 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
14760 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14770 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
14780 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
14790 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43   CKA_ID:.....CAC
147a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
147b0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
147c0 72 69 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30  ribute CKA_ID (0
147d0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
147e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
147f0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
14800 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
14810 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
14820 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
14830 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14840 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
14850 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
14860 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
14870 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
14880 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
14890 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
148a0 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28  .ucTmpBuf[0] = (
148b0 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20  (identity_num + 
148c0 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  1) >> 8) & 0xff;
148d0 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d  .....ucTmpBuf[1]
148e0 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75   =  (identity_nu
148f0 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a  m + 1) & 0xff;..
14900 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63  ....pValue = &uc
14910 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61  TmpBuf;.....ulVa
14920 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09  lueLen = 2;.....
14930 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14940 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
14950 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
14960 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
14970 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
14980 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
14990 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49  ..case CKA_CERTI
149a0 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09  FICATE_TYPE:....
149b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
149c0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
149d0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
149e0 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20  ERTIFICATE_TYPE 
149f0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
14a00 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14a10 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
14a20 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
14a30 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
14a40 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
14a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14a60 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
14a70 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
14a80 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
14a90 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22   a certificate."
14aa0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
14ab0 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65  ....}....../* We
14ac0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e   only support on
14ad0 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 79  e certificate ty
14ae0 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72  pe */.....ck_cer
14af0 74 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20  tificate_type = 
14b00 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09  CKC_X_509;......
14b10 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72  pValue = &ck_cer
14b20 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09  tificate_type;..
14b30 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
14b40 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66  sizeof(ck_certif
14b50 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09  icate_type);....
14b60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14b70 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
14b80 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20  rning CKC_X_509 
14b90 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c  (%lu) (%p/%lu)",
14ba0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
14bb0 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41   *((CK_CERTIFICA
14bc0 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75  TE_TYPE *) pValu
14bd0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
14be0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
14bf0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
14c00 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
14c10 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43  _KEY_TYPE:.....C
14c20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14c30 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
14c40 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59  ttribute CKA_KEY
14c50 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20  _TYPE (0x%08lx) 
14c60 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
14c70 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
14c80 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
14c90 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
14ca0 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26  KO_PRIVATE_KEY &
14cb0 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
14cc0 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29   CKO_PUBLIC_KEY)
14cd0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
14ce0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
14cf0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
14d00 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
14d10 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29  are not a key.")
14d20 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
14d30 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20  ...}....../* We 
14d40 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65  only support one
14d50 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09   key type */....
14d60 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43  .ck_key_type = C
14d70 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61  KK_RSA;......pVa
14d80 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79  lue = &ck_key_ty
14d90 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  pe;.....ulValueL
14da0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b  en = sizeof(ck_k
14db0 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43  ey_type);......C
14dc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14dd0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
14de0 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29  ng CKK_RSA (%lu)
14df0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
14e00 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
14e10 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
14e20 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  PE *) pValue), p
14e30 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
14e40 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
14e50 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
14e60 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e  ...case CKA_SIGN
14e70 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
14e80 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
14e90 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
14ea0 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c  CKA_SIGN (0x%08l
14eb0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
14ec0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
14ed0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
14ee0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
14ef0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
14f00 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
14f10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14f20 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
14f30 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
14f40 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
14f50 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
14f60 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
14f70 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
14f80 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
14f90 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20  KO_PRIVATE_KEY) 
14fa0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
14fb0 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
14fc0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
14fd0 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09  of(ck_true);....
14fe0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
14ff0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
15000 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
15010 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
15020 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  alse);.....}....
15030 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15040 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
15050 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
15060 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
15070 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
15080 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
15090 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
150a0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
150b0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
150c0 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52  .case CKA_SIGN_R
150d0 45 43 4f 56 45 52 3a 0a 09 09 09 09 43 41 43 4b  ECOVER:.....CACK
150e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
150f0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
15100 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 5f 52  ibute CKA_SIGN_R
15110 45 43 4f 56 45 52 20 28 30 78 25 30 38 6c 78 29  ECOVER (0x%08lx)
15120 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
15130 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
15140 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
15150 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15160 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
15170 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
15180 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15190 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
151a0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
151b0 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
151c0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
151d0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
151e0 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20  ...}....../* We 
151f0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 73  currently only s
15200 75 70 70 6f 72 74 20 22 53 69 67 6e 20 77 69 74  upport "Sign wit
15210 68 20 41 70 70 65 6e 64 69 78 22 20 2a 2f 0a 09  h Appendix" */..
15220 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
15230 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c  false;.....ulVal
15240 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
15250 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43  k_false);......C
15260 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15270 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
15280 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
15290 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
152a0 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
152b0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
152c0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
152d0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
152e0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
152f0 73 65 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a  se CKA_DECRYPT:.
15300 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15310 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
15320 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
15330 41 5f 44 45 43 52 59 50 54 20 28 30 78 25 30 38  A_DECRYPT (0x%08
15340 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
15350 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
15360 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
15370 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
15380 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
15390 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
153a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
153b0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
153c0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
153d0 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
153e0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
153f0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
15400 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
15410 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15420 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
15430 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  || objectclass =
15440 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
15450 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
15460 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
15470 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
15480 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
15490 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
154a0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
154b0 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
154c0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
154d0 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a  _false);.....}..
154e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
154f0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
15500 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
15510 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
15520 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
15530 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
15540 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
15550 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
15560 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
15570 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53  ...case CKA_SENS
15580 49 54 49 56 45 3a 0a 09 09 09 09 43 41 43 4b 45  ITIVE:.....CACKE
15590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
155a0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
155b0 62 75 74 65 20 43 4b 41 5f 53 45 4e 53 49 54 49  bute CKA_SENSITI
155c0 56 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  VE (0x%08lx) ...
155d0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
155e0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
155f0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
15600 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
15610 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
15620 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
15630 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
15640 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
15650 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
15660 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
15670 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
15680 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
15690 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
156a0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
156b0 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09  VATE_KEY) {.....
156c0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
156d0 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
156e0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
156f0 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
15700 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
15710 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
15720 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
15730 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
15740 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
15750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15760 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
15770 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
15780 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
15790 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
157a0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
157b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
157c0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
157d0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
157e0 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a  CKA_EXTRACTABLE:
157f0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15800 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
15810 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
15820 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 20 28  KA_EXTRACTABLE (
15830 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
15840 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
15850 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
15860 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
15870 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
15880 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
15890 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
158a0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
158b0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
158c0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
158d0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
158e0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
158f0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
15900 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
15910 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s == CKO_PRIVATE
15920 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61  _KEY) {......pVa
15930 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
15940 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
15950 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
15960 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
15970 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
15980 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c  ck_true;......ul
15990 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
159a0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09  f(ck_false);....
159b0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
159c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
159d0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
159e0 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
159f0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
15a00 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
15a10 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
15a20 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
15a30 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
15a40 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
15a50 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09 43 41 43  MODULUS:.....CAC
15a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15a70 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
15a80 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55 4c  ribute CKA_MODUL
15a90 55 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  US (0x%08lx) ...
15aa0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15ab0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
15ac0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
15ad0 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
15ae0 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
15af0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
15b00 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
15b10 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
15b20 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
15b30 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
15b40 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
15b50 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
15b60 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
15b70 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
15b80 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
15b90 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 6d  _ret = x509_to_m
15ba0 6f 64 75 6c 75 73 28 63 65 72 74 69 66 69 63 61  odulus(certifica
15bb0 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
15bc0 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
15bd0 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
15be0 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
15bf0 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
15c00 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
15c10 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
15c20 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
15c30 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
15c40 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15c50 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
15c60 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29  turning (%p/%lu)
15c70 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
15c80 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
15c90 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
15ca0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
15cb0 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a  PUBLIC_EXPONENT:
15cc0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15cd0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
15ce0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
15cf0 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
15d00 4e 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  NT (0x%08lx) ...
15d10 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15d20 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
15d30 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
15d40 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
15d50 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
15d60 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
15d70 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
15d80 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
15d90 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
15da0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
15db0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
15dc0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
15dd0 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
15de0 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
15df0 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
15e00 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 65  _ret = x509_to_e
15e10 78 70 6f 6e 65 6e 74 28 63 65 72 74 69 66 69 63  xponent(certific
15e20 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
15e30 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
15e40 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
15e50 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
15e60 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
15e70 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
15e80 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
15e90 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
15ea0 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
15eb0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15ec0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
15ed0 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
15ee0 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
15ef0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
15f00 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
15f10 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
15f20 5f 54 52 55 53 54 5f 44 49 47 49 54 41 4c 5f 53  _TRUST_DIGITAL_S
15f30 49 47 4e 41 54 55 52 45 3a 0a 09 09 09 63 61 73  IGNATURE:....cas
15f40 65 20 43 4b 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f  e CKA_TRUST_NON_
15f50 52 45 50 55 44 49 41 54 49 4f 4e 3a 0a 09 09 09  REPUDIATION:....
15f60 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b  case CKA_TRUST_K
15f70 45 59 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a  EY_ENCIPHERMENT:
15f80 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
15f90 53 54 5f 44 41 54 41 5f 45 4e 43 49 50 48 45 52  ST_DATA_ENCIPHER
15fa0 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b  MENT:....case CK
15fb0 41 5f 54 52 55 53 54 5f 4b 45 59 5f 41 47 52 45  A_TRUST_KEY_AGRE
15fc0 45 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43  EMENT:....case C
15fd0 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 43 45 52  KA_TRUST_KEY_CER
15fe0 54 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20  T_SIGN:....case 
15ff0 43 4b 41 5f 54 52 55 53 54 5f 43 52 4c 5f 53 49  CKA_TRUST_CRL_SI
16000 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  GN:....case CKA_
16010 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54  TRUST_SERVER_AUT
16020 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  H:....case CKA_T
16030 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48  RUST_CLIENT_AUTH
16040 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
16050 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47  UST_CODE_SIGNING
16060 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
16070 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43  UST_EMAIL_PROTEC
16080 54 49 4f 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  TION:.....CACKEY
16090 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
160a0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
160b0 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 2e 2e  ute CKA_TRUST_..
160c0 2e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  . (0x%08lx) ..."
160d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
160e0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
160f0 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
16100 20 26 63 6b 5f 74 72 75 73 74 65 64 3b 0a 09 09   &ck_trusted;...
16110 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
16120 69 7a 65 6f 66 28 63 6b 5f 74 72 75 73 74 65 64  izeof(ck_trusted
16130 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
16140 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
16150 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
16160 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
16170 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
16180 5f 54 52 55 53 54 20 2a 29 20 70 56 61 6c 75 65  _TRUST *) pValue
16190 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
161a0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
161b0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
161c0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
161d0 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48 3a 0a  CERT_SHA1_HASH:.
161e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
161f0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
16200 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
16210 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48  A_CERT_SHA1_HASH
16220 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
16230 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16240 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
16250 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
16260 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45  tclass != CKO_NE
16270 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
16280 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16290 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
162a0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
162b0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
162c0 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20   not a Netscape 
162d0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
162e0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
162f0 09 7d 0a 0a 09 09 09 09 53 48 41 31 52 65 73 65  .}......SHA1Rese
16300 74 28 26 73 68 61 31 5f 63 74 78 29 3b 0a 09 09  t(&sha1_ctx);...
16310 09 09 53 48 41 31 49 6e 70 75 74 28 26 73 68 61  ..SHA1Input(&sha
16320 31 5f 63 74 78 2c 20 63 65 72 74 69 66 69 63 61  1_ctx, certifica
16330 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
16340 6c 65 6e 29 3b 0a 09 09 09 09 53 48 41 31 52 65  len);.....SHA1Re
16350 73 75 6c 74 28 26 73 68 61 31 5f 63 74 78 2c 20  sult(&sha1_ctx, 
16360 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09  sha1_hash);.....
16370 09 70 56 61 6c 75 65 20 3d 20 73 68 61 31 5f 68  .pValue = sha1_h
16380 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ash;.....ulValue
16390 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 73 68 61  Len = sizeof(sha
163a0 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41  1_hash);......CA
163b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
163c0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
163d0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
163e0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
163f0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
16400 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
16410 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35  ase CKA_CERT_MD5
16420 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45  _HASH:.....CACKE
16430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16440 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
16450 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44  bute CKA_CERT_MD
16460 35 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78 29  5_HASH (0x%08lx)
16470 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
16480 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
16490 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
164a0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
164b0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
164c0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
164d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
164e0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
164f0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
16500 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74  we are not a Net
16510 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
16520 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
16530 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 4d 44  k;.....}......MD
16540 35 49 6e 69 74 28 26 6d 64 35 5f 63 74 78 29 3b  5Init(&md5_ctx);
16550 0a 09 09 09 09 4d 44 35 55 70 64 61 74 65 28 26  .....MD5Update(&
16560 6d 64 35 5f 63 74 78 2c 20 63 65 72 74 69 66 69  md5_ctx, certifi
16570 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
16580 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 4d 44 35 46  e_len);.....MD5F
16590 69 6e 61 6c 28 6d 64 35 5f 68 61 73 68 2c 20 26  inal(md5_hash, &
165a0 6d 64 35 5f 63 74 78 29 3b 0a 0a 09 09 09 09 70  md5_ctx);......p
165b0 56 61 6c 75 65 20 3d 20 6d 64 35 5f 68 61 73 68  Value = md5_hash
165c0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
165d0 20 3d 20 73 69 7a 65 6f 66 28 6d 64 35 5f 68 61   = sizeof(md5_ha
165e0 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  sh);......CACKEY
165f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
16600 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
16610 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
16620 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
16630 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
16640 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75  .break;....defau
16650 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  lt:.....pValue =
16660 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c   NULL;.....ulVal
16670 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47  ueLen = (CK_LONG
16680 29 20 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b  ) -1;.....break;
16690 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b  ...}....if (((CK
166a0 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65  _LONG) ulValueLe
166b0 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29  n) != ((CK_LONG)
166c0 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75   -1)) {..../* Pu
166d0 73 68 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74  sh curr_attr ont
166e0 6f 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09  o the stack */..
166f0 09 09 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65  ..curr_attr.type
16700 20 3d 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70   = curr_attr_typ
16710 65 3b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  e;....curr_attr.
16720 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56  ulValueLen = ulV
16730 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72  alueLen;.....cur
16740 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20  r_attr.pValue = 
16750 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72  malloc(curr_attr
16760 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
16770 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74  .memcpy(curr_att
16780 72 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65  r.pValue, pValue
16790 2c 20 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61  , curr_attr.ulVa
167a0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20  lueLen);.....if 
167b0 28 70 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20  (pValue_free && 
167c0 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72  pValue) {.....fr
167d0 65 65 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d  ee(pValue);....}
167e0 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72  .....if (numattr
167f0 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e  s >= retval_coun
16800 74 29 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 20  t) {.....retval 
16810 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c  = realloc(retval
16820 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  , retval_count *
16830 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
16840 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63  );....}.....memc
16850 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74  py(&retval[numat
16860 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72  trs], &curr_attr
16870 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74  , sizeof(curr_at
16880 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72  tr));....numattr
16890 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  s++;...}..}...if
168a0 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29   (numattrs != 0)
168b0 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e   {...retval_coun
168c0 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09  t = numattrs;...
168d0 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63  retval = realloc
168e0 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f  (retval, retval_
168f0 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
16900 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73  retval));..} els
16910 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61  e {...free(retva
16920 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20  l);....retval = 
16930 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43  NULL;..}...*pulC
16940 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b  ount = numattrs;
16950 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16960 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
16970 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25  g %lu objects (%
16980 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20  p).", numattrs, 
16990 28 76 6f 69 64 20 2a 29 20 72 65 74 76 61 6c 29  (void *) retval)
169a0 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
169b0 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  l);.}..static vo
169c0 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 69  id cackey_free_i
169d0 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74  dentities(struct
169e0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
169f0 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e   *identities, un
16a00 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e  signed long iden
16a10 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a  tities_count) {.
16a20 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63  .CK_ATTRIBUTE *c
16a30 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67  urr_attr;..unsig
16a40 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c  ned long id_idx,
16a50 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20   attr_idx;...if 
16a60 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e  (identities == N
16a70 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69 65  ULL || identitie
16a80 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  s_count == 0) {.
16a90 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66  ..return;..}...f
16aa0 6f 72 20 28 69 64 5f 69 64 78 20 3d 20 30 3b 20  or (id_idx = 0; 
16ab0 69 64 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74  id_idx < identit
16ac0 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64  ies_count; id_id
16ad0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 69 64 65  x++) {...if (ide
16ae0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
16af0 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09  attributes) {...
16b00 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d  .for (attr_idx =
16b10 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 69   0; attr_idx < i
16b20 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
16b30 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
16b40 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20  nt; attr_idx++) 
16b50 7b 0a 09 09 09 09 63 75 72 72 5f 61 74 74 72 20  {.....curr_attr 
16b60 3d 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  = &identities[id
16b70 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
16b80 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09  [attr_idx];.....
16b90 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e  .if (curr_attr->
16ba0 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66  pValue) {......f
16bb0 72 65 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  ree(curr_attr->p
16bc0 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09  Value);.....}...
16bd0 09 7d 0a 0a 09 09 09 69 66 20 28 69 64 65 6e 74  .}.....if (ident
16be0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
16bf0 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09  tributes) {.....
16c00 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 5b  free(identities[
16c10 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
16c20 65 73 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  es);....}.....ca
16c30 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
16c40 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
16c50 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
16c60 2c 20 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a  , 1, 1);...}..}.
16c70 0a 09 66 72 65 65 28 69 64 65 6e 74 69 74 69 65  ..free(identitie
16c80 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e  s);.}..static un
16c90 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b  signed long cack
16ca0 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e  ey_read_dod_iden
16cb0 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61  tities(struct ca
16cc0 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
16cd0 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67  dentities, unsig
16ce0 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 64 6f 64  ned long num_dod
16cf0 5f 63 65 72 74 73 29 20 7b 0a 09 75 6e 73 69 67  _certs) {..unsig
16d00 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 5f 69 64  ned long cert_id
16d10 78 2c 20 69 64 5f 69 64 78 20 3d 20 30 3b 0a 0a  x, id_idx = 0;..
16d20 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20  .if (identities 
16d30 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
16d40 75 72 6e 28 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  urn(num_dod_cert
16d50 73 20 2a 20 33 29 3b 0a 09 7d 0a 0a 09 66 6f 72  s * 3);..}...for
16d60 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20   (cert_idx = 0; 
16d70 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 64  cert_idx < num_d
16d80 6f 64 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69  od_certs; cert_i
16d90 64 78 2b 2b 29 20 7b 0a 09 09 69 64 65 6e 74 69  dx++) {...identi
16da0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
16db0 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c  c_identity = NUL
16dc0 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  L;...identities[
16dd0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
16de0 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
16df0 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 43  attributes(CKO_C
16e00 45 52 54 49 46 49 43 41 54 45 2c 20 26 65 78 74  ERTIFICATE, &ext
16e10 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64  ra_certs[cert_id
16e20 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72  x], 0xf000 | cer
16e30 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69  t_idx, &identiti
16e40 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
16e50 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  butes_count);...
16e60 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65  id_idx++;....ide
16e70 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
16e80 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20  pcsc_identity = 
16e90 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69  NULL;...identiti
16ea0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
16eb0 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
16ec0 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
16ed0 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 2c 20 26 65  O_PUBLIC_KEY, &e
16ee0 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f  xtra_certs[cert_
16ef0 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63  idx], 0xf000 | c
16f00 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69  ert_idx, &identi
16f10 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
16f20 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a  ributes_count);.
16f30 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69  ..id_idx++;....i
16f40 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
16f50 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
16f60 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69  = NULL;...identi
16f70 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
16f80 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
16f90 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
16fa0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
16fb0 53 54 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73  ST, &extra_certs
16fc0 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30  [cert_idx], 0xf0
16fd0 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26  00 | cert_idx, &
16fe0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
16ff0 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
17000 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b  unt);...id_idx++
17010 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 69 64  ;..}...return(id
17020 5f 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  _idx);.}..static
17030 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69   struct cackey_i
17040 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  dentity *cackey_
17050 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28  read_identities(
17060 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
17070 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
17080 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f 75  ed long *ids_fou
17090 6e 64 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  nd) {..struct ca
170a0 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
170b0 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74  ty *pcsc_identit
170c0 69 65 73 3b 0a 09 73 74 72 75 63 74 20 63 61 63  ies;..struct cac
170d0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
170e0 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
170f0 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73  ned long num_ids
17100 2c 20 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 69  , id_idx, curr_i
17110 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65  d_type;..unsigne
17120 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
17130 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 2c  , num_dod_certs,
17140 20 63 65 72 74 5f 69 64 78 3b 0a 09 69 6e 74 20   cert_idx;..int 
17150 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
17160 72 74 73 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  rts = 0;...CACKE
17170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17180 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
17190 28 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55  (ids_found == NU
171a0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
171b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
171c0 6f 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69  or.  ids_found i
171d0 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
171e0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23  urn(NULL);..}..#
171f0 69 66 64 65 66 20 43 41 43 4b 45 59 5f 43 41 52  ifdef CACKEY_CAR
17200 44 5f 53 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f 45  D_SLOT_INCLUDE_E
17210 58 54 52 41 5f 43 45 52 54 53 0a 09 69 6e 63 6c  XTRA_CERTS..incl
17220 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20  ude_extra_certs 
17230 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66  = 1;.#endif...if
17240 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
17250 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57  _DOD_CERTS_ON_HW
17260 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c  _SLOTS") != NULL
17270 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78  ) {...include_ex
17280 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09  tra_certs = 1;..
17290 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  }...if (getenv("
172a0 43 41 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45  CACKEY_NO_DOD_CE
172b0 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22  RTS_ON_HW_SLOTS"
172c0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  ) != NULL) {...i
172d0 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72  nclude_extra_cer
172e0 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  ts = 0;..}...if 
172f0 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
17300 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29  NO_EXTRA_CERTS")
17310 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6e 75   != NULL) {...nu
17320 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b  m_dod_certs = 0;
17330 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 75 6d  ..} else {...num
17340 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 73 69 7a  _dod_certs = siz
17350 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 29  eof(extra_certs)
17360 20 2f 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f   / sizeof(extra_
17370 63 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 0a 0a 09  certs[0]);..}...
17380 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e  if (slot->intern
17390 61 6c 29 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 20  al) {...num_ids 
173a0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  = cackey_read_do
173b0 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c  d_identities(NUL
173c0 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  L, num_dod_certs
173d0 29 3b 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64  );....if (num_id
173e0 73 20 21 3d 20 30 29 20 7b 0a 09 09 09 69 64 65  s != 0) {....ide
173f0 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63  ntities = malloc
17400 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f  (num_ids * sizeo
17410 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b  f(*identities));
17420 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64  .....cackey_read
17430 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28  _dod_identities(
17440 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f  identities, num_
17450 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 20  dod_certs);...} 
17460 65 6c 73 65 20 7b 0a 09 09 09 69 64 65 6e 74 69  else {....identi
17470 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  ties = NULL;...}
17480 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d  ....*ids_found =
17490 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74   num_ids;....ret
174a0 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b  urn(identities);
174b0 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74  ..}...pcsc_ident
174c0 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
174d0 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20  ead_certs(slot, 
174e0 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73  NULL, &num_certs
174f0 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64 65  );..if (pcsc_ide
17500 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
17510 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20   {.../* Convert 
17520 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73 20  number of Certs 
17530 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  to number of obj
17540 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64  ects */...num_id
17550 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 45  s = (CKO_PRIVATE
17560 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49  _KEY - CKO_CERTI
17570 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e 75  FICATE + 1) * nu
17580 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 66 20 28  m_certs;....if (
17590 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
175a0 72 74 73 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 64  rts) {....num_id
175b0 73 20 2b 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  s += cackey_read
175c0 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28  _dod_identities(
175d0 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65  NULL, num_dod_ce
175e0 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 65  rts);...}....ide
175f0 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63  ntities = malloc
17600 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f  (num_ids * sizeo
17610 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b  f(*identities));
17620 0a 0a 09 09 2f 2a 20 41 64 64 20 63 65 72 74 69  ..../* Add certi
17630 66 69 63 61 74 65 73 2c 20 70 75 62 6c 69 63 20  ficates, public 
17640 6b 65 79 73 2c 20 61 6e 64 20 70 72 69 76 61 74  keys, and privat
17650 65 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20  e keys from the 
17660 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a 09 09 69  smartcard */...i
17670 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72  d_idx = 0;...for
17680 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20   (cert_idx = 0; 
17690 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63  cert_idx < num_c
176a0 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b  erts; cert_idx++
176b0 29 20 7b 0a 09 09 09 66 6f 72 20 28 63 75 72 72  ) {....for (curr
176c0 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43  _id_type = CKO_C
176d0 45 52 54 49 46 49 43 41 54 45 3b 20 63 75 72 72  ERTIFICATE; curr
176e0 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f  _id_type <= CKO_
176f0 50 52 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 72  PRIVATE_KEY; cur
17700 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09  r_id_type++) {..
17710 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
17720 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
17730 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
17740 74 72 69 62 75 74 65 73 28 63 75 72 72 5f 69 64  tributes(curr_id
17750 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69 64 65  _type, &pcsc_ide
17760 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
17770 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64  ], cert_idx, &id
17780 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
17790 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
177a0 74 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74  t);......identit
177b0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
177c0 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  _identity = mall
177d0 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74  oc(sizeof(*ident
177e0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
177f0 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09  sc_identity));..
17800 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69  ...memcpy(identi
17810 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
17820 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73  c_identity, &pcs
17830 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
17840 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a  t_idx], sizeof(*
17850 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
17860 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
17870 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74  ));......identit
17880 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
17890 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
178a0 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
178b0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
178c0 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66  cert_idx].certif
178d0 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09  icate_len);.....
178e0 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65  memcpy(identitie
178f0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
17900 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
17910 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74  cate, pcsc_ident
17920 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e  ities[cert_idx].
17930 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73  certificate, pcs
17940 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
17950 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t_idx].certifica
17960 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64  te_len);......id
17970 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d  _idx++;....}...}
17980 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f  ....if (include_
17990 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09  extra_certs) {..
179a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
179b0 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67  RINTF("Including
179c0 20 44 6f 44 20 43 65 72 74 69 66 69 63 61 74 65   DoD Certificate
179d0 73 20 6f 6e 20 68 61 72 64 77 61 72 65 20 73 6c  s on hardware sl
179e0 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  ot");.....cackey
179f0 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
17a00 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 73 20  ties(identities 
17a10 2b 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f  + id_idx, num_do
17a20 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09  d_certs);...}...
17a30 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
17a40 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ts(pcsc_identiti
17a50 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31  es, num_certs, 1
17a60 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64  );....*ids_found
17a70 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72   = num_ids;....r
17a80 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73  eturn(identities
17a90 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f 66 6f  );..}....*ids_fo
17aa0 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  und = 0;..return
17ab0 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  (NULL);.}..CK_DE
17ac0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
17ad0 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a  _RV, C_Initializ
17ae0 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
17af0 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f  InitArgs) {..CK_
17b00 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47  C_INITIALIZE_ARG
17b10 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09  S CK_PTR args;..
17b20 75 69 6e 74 33 32 5f 74 20 69 64 78 2c 20 68 69  uint32_t idx, hi
17b30 67 68 65 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74  ghest_slot;..int
17b40 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b   mutex_init_ret;
17b50 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17b60 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
17b70 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
17b80 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
17b90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17ba0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c  INTF("Error.  Al
17bb0 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65  ready initialize
17bc0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
17bd0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52  CKR_CRYPTOKI_ALR
17be0 45 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44  EADY_INITIALIZED
17bf0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69  );..}...if (pIni
17c00 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  tArgs != NULL) {
17c10 0a 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41  ...args = pInitA
17c20 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63  rgs;...memcpy(&c
17c30 61 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73  ackey_args, args
17c40 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  , sizeof(cackey_
17c50 61 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61  args));....if (a
17c60 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78  rgs->CreateMutex
17c70 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
17c80 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d  ->DestroyMutex =
17c90 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
17ca0 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  LockMutex == NUL
17cb0 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63  L || args->Unloc
17cc0 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20  kMutex == NULL) 
17cd0 7b 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43  {....if (args->C
17ce0 72 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55  reateMutex != NU
17cf0 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74  LL || args->Dest
17d00 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  royMutex != NULL
17d10 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75   || args->LockMu
17d20 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
17d30 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78  rgs->UnlockMutex
17d40 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
17d50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17d60 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65  NTF("Error. Some
17d70 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68  , but not All th
17d80 72 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76  reading primitiv
17d90 65 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a  es provided.");.
17da0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
17db0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
17dc0 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  ...}...}..} else
17dd0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73   {...cackey_args
17de0 2e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e  .CreateMutex = N
17df0 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
17e00 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20  gs.DestroyMutex 
17e10 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
17e20 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20  _args.LockMutex 
17e30 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
17e40 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
17e50 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
17e60 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20  ey_args.flags = 
17e70 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  0;..}...for (idx
17e80 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
17e90 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
17ea0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
17eb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
17ec0 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63  )); idx++) {...c
17ed0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
17ee0 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
17ef0 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
17f00 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
17f10 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
17f20 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
17f30 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  lots[0])); idx++
17f40 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ) {...cackey_slo
17f50 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ts[idx].active =
17f60 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
17f70 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
17f80 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  der = NULL;...ca
17f90 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
17fa0 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
17fb0 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  h = 0;...cackey_
17fc0 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
17fd0 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
17fe0 6f 63 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  ock = 0;...cacke
17ff0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f  y_slots[idx].slo
18000 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63  t_reset = 0;...c
18010 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
18020 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30  .token_flags = 0
18030 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
18040 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55  [idx].label = NU
18050 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  LL;...cackey_slo
18060 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c  ts[idx].internal
18070 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 67   = 0;..}...if (g
18080 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f  etenv("CACKEY_NO
18090 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21  _EXTRA_CERTS") !
180a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
180b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
180c0 22 41 73 6b 65 64 20 6e 6f 74 20 74 6f 20 69 6e  "Asked not to in
180d0 63 6c 75 64 65 20 44 6f 44 20 63 65 72 74 69 66  clude DoD certif
180e0 69 63 61 74 65 73 22 29 3b 0a 09 7d 20 65 6c 73  icates");..} els
180f0 65 20 7b 0a 09 09 68 69 67 68 65 73 74 5f 73 6c  e {...highest_sl
18100 6f 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  ot = (sizeof(cac
18110 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
18120 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
18130 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a 09 09 43 41  [0])) - 1;....CA
18140 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18150 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44  F("Including DoD
18160 20 63 65 72 74 73 20 69 6e 20 73 6c 6f 74 20 25   certs in slot %
18170 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
18180 6f 6e 67 29 20 68 69 67 68 65 73 74 5f 73 6c 6f  ong) highest_slo
18190 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c  t);....cackey_sl
181a0 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
181b0 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09  ].active = 1;...
181c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67  cackey_slots[hig
181d0 68 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72  hest_slot].inter
181e0 6e 61 6c 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65  nal = 1;...cacke
181f0 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f  y_slots[highest_
18200 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 28 75  slot].label = (u
18210 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
18220 22 44 6f 44 20 43 65 72 74 69 66 69 63 61 74 65  "DoD Certificate
18230 73 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  s";...cackey_slo
18240 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
18250 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 22  .pcsc_reader = "
18260 43 41 43 4b 65 79 22 3b 0a 09 09 63 61 63 6b 65  CACKey";...cacke
18270 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f  y_slots[highest_
18280 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  slot].token_flag
18290 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b  s = 0;..}...cack
182a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
182b0 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65   1;...if (!cacke
182c0 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20  y_biglock_init) 
182d0 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72  {...mutex_init_r
182e0 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  et = cackey_mute
182f0 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79  x_create(&cackey
18300 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66  _biglock);....if
18310 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74   (mutex_init_ret
18320 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
18330 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18340 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69  "Error.  Mutex i
18350 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61  nitialization fa
18360 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74  iled.");.....ret
18370 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43  urn(CKR_CANT_LOC
18380 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  K);...}....cacke
18390 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
183a0 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f   1;..}...CACKEY_
183b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
183c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
183d0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
183e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
183f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
18400 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
18410 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  Finalize)(CK_VOI
18420 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
18430 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
18440 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
18450 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
18460 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
18470 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
18480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18490 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
184a0 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
184b0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
184c0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
184d0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
184e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
184f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
18500 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18510 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
18520 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
18530 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
18540 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
18550 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
18560 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
18570 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
18580 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
18590 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
185a0 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
185b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
185c0 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
185d0 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  ...C_CloseSessio
185e0 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  n(idx);...}..}..
185f0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
18600 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
18610 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
18620 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
18630 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
18640 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
18650 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
18660 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
18670 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61  ots[idx].interna
18680 6c 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65  l) {....continue
18690 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
186a0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
186b0 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09  csc_reader) {...
186c0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
186d0 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
186e0 64 65 72 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63  der);...}..}...c
186f0 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
18700 6e 6e 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65  nnect();...cacke
18710 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  y_initialized = 
18720 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  0;...CACKEY_DEBU
18730 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
18740 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
18750 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
18760 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
18770 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
18780 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49  ON(CK_RV, C_GetI
18790 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52  nfo)(CK_INFO_PTR
187a0 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69   pInfo) {..stati
187b0 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61  c CK_UTF8CHAR ma
187c0 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d  nufacturerID[] =
187d0 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e   "U.S. Governmen
187e0 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  t";..static CK_U
187f0 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 79 44  TF8CHAR libraryD
18800 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22  escription[] = "
18810 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45  CACKey";...CACKE
18820 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18830 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
18840 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
18850 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18860 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18870 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
18880 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
18890 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
188a0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
188b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
188c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
188d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
188e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
188f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18900 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
18910 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
18920 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69  .pInfo->cryptoki
18930 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
18940 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
18950 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
18960 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
18970 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56  pInfo->cryptokiV
18980 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
18990 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
189a0 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
189b0 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d  > 8) & 0xff;...m
189c0 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emset(pInfo->man
189d0 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27  ufacturerID, ' '
189e0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
189f0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29  manufacturerID))
18a00 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
18a10 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
18a20 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c   manufacturerID,
18a30 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74   sizeof(manufact
18a40 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09  urerID) - 1);...
18a50 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30  pInfo->flags = 0
18a60 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49  x00;...memset(pI
18a70 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63  nfo->libraryDesc
18a80 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69  ription, ' ', si
18a90 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  zeof(pInfo->libr
18aa0 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 29  aryDescription))
18ab0 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
18ac0 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  >libraryDescript
18ad0 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73 63  ion, libraryDesc
18ae0 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28  ription, sizeof(
18af0 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
18b00 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66  on) - 1);...pInf
18b10 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f  o->libraryVersio
18b20 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
18b30 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
18b40 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
18b50 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72  Info->libraryVer
18b60 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61  sion.minor = (ca
18b70 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
18b80 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
18b90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18ba0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
18bb0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
18bc0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
18bd0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  (CKR_OK);.}../*.
18be0 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74 20   * Process list 
18bf0 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64 20  of readers, and 
18c00 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20 62  create mapping b
18c10 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e 61  etween reader na
18c20 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20  me and slot ID. 
18c30 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
18c40 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
18c50 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42  etSlotList)(CK_B
18c60 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e  BOOL tokenPresen
18c70 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54  t, CK_SLOT_ID_PT
18c80 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f  R pSlotList, CK_
18c90 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75  ULONG_PTR pulCou
18ca0 6e 74 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  nt) {..int mutex
18cb0 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63  _retval;..int pc
18cc0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a  sc_connect_ret;.
18cd0 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c  .CK_ULONG count,
18ce0 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c   slot_count = 0,
18cf0 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f   currslot, slot_
18d00 69 64 78 3b 0a 09 63 68 61 72 20 2a 70 63 73 63  idx;..char *pcsc
18d10 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f  _readers, *pcsc_
18d20 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63  readers_s, *pcsc
18d30 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f  _readers_e;..DWO
18d40 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f  RD pcsc_readers_
18d50 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
18d60 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
18d70 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72  ;..size_t curr_r
18d80 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43  eader_len;...CAC
18d90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18da0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
18db0 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
18dc0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
18dd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18de0 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73  ror. pulCount is
18df0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
18e00 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
18e10 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
18e20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
18e30 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
18e40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18e50 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
18e60 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
18e70 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
18e80 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
18e90 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
18ea0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
18eb0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
18ec0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
18ed0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
18ee0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
18ef0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18f00 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
18f10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
18f20 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
18f30 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65  OR);..}.../* Cle
18f40 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  ar list of slots
18f50 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69   */..if (pSlotLi
18f60 73 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  st) {...CACKEY_D
18f70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72  EBUG_PRINTF("Pur
18f80 67 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e  ging all slot in
18f90 66 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09  formation.");...
18fa0 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20  ./* Only update 
18fb0 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  the list of slot
18fc0 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75  s if we are actu
18fd0 61 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c  ally being suppl
18fe0 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72  y the slot infor
18ff0 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  mation */...cack
19000 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
19010 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f  ect_all();....fo
19020 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
19030 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
19040 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
19050 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
19060 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
19070 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69  rrslot++) {....i
19080 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
19090 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
190a0 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  al) {.....contin
190b0 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ue;....}.....if 
190c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
190d0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
190e0 64 65 72 29 20 7b 0a 09 09 09 09 66 72 65 65 28  der) {.....free(
190f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
19100 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
19110 65 72 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  er);......cackey
19120 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
19130 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e  .pcsc_reader = N
19140 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ULL;....}.....if
19150 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
19160 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20  urrslot].label) 
19170 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b 65  {.....free(cacke
19180 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
19190 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09 63  ].label);......c
191a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
191b0 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55  slot].label = NU
191c0 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  LL;....}.....cac
191d0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
191e0 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  ot].active = 0;.
191f0 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  ..}..}.../* Dete
19200 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65  rmine list of re
19210 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63  aders */..pcsc_c
19220 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
19230 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
19240 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  ();..if (pcsc_co
19250 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
19260 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
19270 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19280 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69  PRINTF("Connecti
19290 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c  on to PC/SC fail
192a0 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  ed, assuming no 
192b0 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74  slots");....slot
192c0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65  _count = 0;..} e
192d0 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61  lse {...pcsc_rea
192e0 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09  ders_len = 0;...
192f0 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  .scard_listreade
19300 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69  rs_ret = SCardLi
19310 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65  stReaders(*cacke
19320 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e  y_pcsc_handle, N
19330 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63  ULL, NULL, &pcsc
19340 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a  _readers_len);..
19350 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74  ..if (scard_list
19360 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53  readers_ret == S
19370 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f  CARD_F_COMM_ERRO
19380 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  R) {....CACKEY_D
19390 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
193a0 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61  or. SCardListRea
193b0 64 65 72 73 28 29 20 72 65 74 75 72 6e 65 64 20  ders() returned 
193c0 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52  SCARD_F_COMM_ERR
193d0 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e  OR, assuming Con
193e0 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43  nection to PC/SC
193f0 20 77 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f   went away. Reco
19400 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09  nnecting.");....
19410 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73  .cackey_pcsc_dis
19420 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61  connect();....ca
19430 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
19440 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  t();.....CACKEY_
19450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72  DEBUG_PRINTF("Tr
19460 79 69 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65  ying SCardListRe
19470 61 64 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b  aders() again");
19480 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65  ....scard_listre
19490 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72  aders_ret = SCar
194a0 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61  dListReaders(*ca
194b0 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
194c0 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70  , NULL, NULL, &p
194d0 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
194e0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61  ;...}....if (sca
194f0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
19500 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
19510 43 43 45 53 53 20 26 26 20 70 63 73 63 5f 72 65  CCESS && pcsc_re
19520 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20  aders_len != 0) 
19530 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  {....pcsc_reader
19540 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f  s = malloc(pcsc_
19550 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09  readers_len);...
19560 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20  .pcsc_readers_s 
19570 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a  = pcsc_readers;.
19580 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65  ....scard_listre
19590 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72  aders_ret = SCar
195a0 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61  dListReaders(*ca
195b0 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
195c0 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61  , NULL, pcsc_rea
195d0 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64  ders, &pcsc_read
195e0 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20  ers_len);....if 
195f0 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
19600 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  rs_ret == SCARD_
19610 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
19620 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20  .pcsc_readers_e 
19630 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  = pcsc_readers +
19640 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65   pcsc_readers_le
19650 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74  n;....../* Start
19660 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c   with Slot ID 1,
19670 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20   to avoid a bug 
19680 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a  in GDM on RHEL *
19690 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34  /...../* Bug 594
196a0 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67  911: https://bug
196b0 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d  zilla.redhat.com
196c0 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64  /show_bug.cgi?id
196d0 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63  =594911 */.....c
196e0 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09  urrslot = 1;....
196f0 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b  .slot_count = 0;
19700 0a 09 09 09 09 77 68 69 6c 65 20 28 70 63 73 63  .....while (pcsc
19710 5f 72 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f  _readers < pcsc_
19720 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09  readers_e) {....
19730 09 09 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20 61  ../* Find next a
19740 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f  vailable slot */
19750 0a 09 09 09 09 09 66 6f 72 20 28 3b 20 63 75 72  ......for (; cur
19760 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
19770 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
19780 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
19790 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
197a0 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69 66  ot++) {.......if
197b0 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   (!cackey_slots[
197c0 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
197d0 29 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b  ) {........break
197e0 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
197f0 0a 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61 64  .......curr_read
19800 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  er_len = strlen(
19810 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a  pcsc_readers);..
19820 09 09 09 09 09 69 66 20 28 28 70 63 73 63 5f 72  .....if ((pcsc_r
19830 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65  eaders + curr_re
19840 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63  ader_len) > pcsc
19850 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09  _readers_e) {...
19860 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
19870 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72  }.......if (curr
19880 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30  _reader_len == 0
19890 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  ) {.......break;
198a0 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66  ......}.......if
198b0 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73   (currslot >= (s
198c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
198d0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
198e0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
198f0 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  {.......CACKEY_D
19900 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
19910 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20  nd more readers 
19920 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61  than slots are a
19930 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09  vailable!");....
19940 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
19950 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44  }.......CACKEY_D
19960 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
19970 6e 64 20 72 65 61 64 65 72 3a 20 25 73 22 2c 20  nd reader: %s", 
19980 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a  pcsc_readers);..
19990 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64  ...../* Only upd
199a0 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ate the list of 
199b0 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20  slots if we are 
199c0 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61  actually being a
199d0 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20  sked supply the 
199e0 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
199f0 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c   */......if (pSl
19a00 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09  otList) {.......
19a10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
19a20 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20  rslot].active = 
19a30 31 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  1;.......cackey_
19a40 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
19a50 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 09  internal = 0;...
19a60 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
19a70 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
19a80 72 65 61 64 65 72 20 3d 20 73 74 72 64 75 70 28  reader = strdup(
19a90 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 09  pcsc_readers);..
19aa0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
19ab0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
19ac0 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
19ad0 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65  = 0;.......cacke
19ae0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
19af0 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ].transaction_de
19b00 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09 63  pth = 0;.......c
19b10 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
19b20 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f  slot].transactio
19b30 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
19b40 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79   0;.......cackey
19b50 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
19b60 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b  .slot_reset = 1;
19b70 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
19b80 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f  ots[currslot].to
19b90 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
19ba0 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
19bb0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
19bc0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
19bd0 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  el = NULL;......
19be0 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
19bf0 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79  ot_reset(&cackey
19c00 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
19c10 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  );......} else {
19c20 0a 09 09 09 09 09 09 2f 2a 20 41 72 74 69 66 69  ......./* Artifi
19c30 63 69 61 6c 6c 79 20 69 6e 63 72 65 61 73 65 20  cially increase 
19c40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 63  the number of ac
19c50 74 69 76 65 20 73 6c 6f 74 73 20 62 79 20 77 68  tive slots by wh
19c60 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  at will become a
19c70 63 74 69 76 65 20 2a 2f 0a 09 09 09 09 09 09 73  ctive */.......s
19c80 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09  lot_count++;....
19c90 09 09 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f  ..}......currslo
19ca0 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f  t++;.......pcsc_
19cb0 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f  readers += curr_
19cc0 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a  reader_len + 1;.
19cd0 09 09 09 09 7d 0a 0a 09 09 09 09 66 6f 72 20 28  ....}......for (
19ce0 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
19cf0 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
19d00 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
19d10 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
19d20 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
19d30 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66  lot++) {......if
19d40 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
19d50 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
19d60 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
19d70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
19d80 75 6e 64 20 61 63 74 69 76 65 20 73 6c 6f 74 20  und active slot 
19d90 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
19da0 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b  long) currslot);
19db0 0a 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75  ........slot_cou
19dc0 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  nt++;......}....
19dd0 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  .}....} else {..
19de0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19df0 50 52 49 4e 54 46 28 22 53 65 63 6f 6e 64 20 63  PRINTF("Second c
19e00 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74  all to SCardList
19e10 52 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20  Readers failed, 
19e20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20  return %s/%li", 
19e30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
19e40 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
19e50 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  R(scard_listread
19e60 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ers_ret), (long)
19e70 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65   scard_listreade
19e80 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09  rs_ret);....}...
19e90 09 09 66 72 65 65 28 70 63 73 63 5f 72 65 61 64  ..free(pcsc_read
19ea0 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65  ers_s);...} else
19eb0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
19ec0 55 47 5f 50 52 49 4e 54 46 28 22 46 69 72 73 74  UG_PRINTF("First
19ed0 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69   call to SCardLi
19ee0 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 64  stReaders failed
19ef0 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22  , return %s/%li"
19f00 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
19f10 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
19f20 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65  STR(scard_listre
19f30 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e  aders_ret), (lon
19f40 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61  g) scard_listrea
19f50 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09  ders_ret);...}..
19f60 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
19f70 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
19f80 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
19f90 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
19fa0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
19fb0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19fc0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19fd0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
19fe0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
19ff0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1a000 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c  R);..}...if (pSl
1a010 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  otList == NULL) 
1a020 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  {...*pulCount = 
1a030 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43  slot_count;....C
1a040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a050 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1a060 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e  R_OK (%i).  Foun
1a070 64 20 25 6c 75 20 72 65 61 64 65 72 73 2c 20 62  d %lu readers, b
1a080 75 74 20 6e 6f 74 20 73 74 6f 72 69 6e 67 20 49  ut not storing I
1a090 44 73 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d  Ds (pSlotList ==
1a0a0 20 4e 55 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c   NULL)", CKR_OK,
1a0b0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a0c0 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09   slot_count);...
1a0d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1a0e0 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70  ..}...count = *p
1a0f0 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f  ulCount;..if (co
1a100 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt < slot_count
1a110 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a120 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a130 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64  . User allocated
1a140 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75   %lu entries, bu
1a150 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e  t we have %lu en
1a160 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20  tries.", count, 
1a170 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  slot_count);....
1a180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a190 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1a1a0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
1a1b0 41 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ALL");....return
1a1c0 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f  (CKR_BUFFER_TOO_
1a1d0 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 6d 75  SMALL);...}...mu
1a1e0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1a1f0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1a200 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1a210 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1a220 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1a230 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a240 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1a250 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1a260 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1a270 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
1a280 6c 6f 74 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f  lot_idx = 0;..fo
1a290 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
1a2a0 20 28 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69   (currslot < (si
1a2b0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1a2c0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1a2d0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 3b 20  ey_slots[0]))); 
1a2e0 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
1a2f0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
1a300 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1a310 76 65 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75  ve) {....continu
1a320 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c  e;...}....if (sl
1a330 6f 74 5f 69 64 78 20 3e 3d 20 63 6f 75 6e 74 29  ot_idx >= count)
1a340 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1a350 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a360 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64  . User allocated
1a370 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75   %lu entries, bu
1a380 74 20 77 65 20 6a 75 73 74 20 74 72 69 65 64 20  t we just tried 
1a390 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1a3a0 25 6c 75 20 69 6e 64 65 78 20 2d 2d 20 69 67 6e  %lu index -- ign
1a3b0 6f 72 69 6e 67 22 2c 20 63 6f 75 6e 74 2c 20 73  oring", count, s
1a3c0 6c 6f 74 5f 69 64 78 29 3b 0a 0a 09 09 09 63 6f  lot_idx);.....co
1a3d0 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 70  ntinue;...}....p
1a3e0 53 6c 6f 74 4c 69 73 74 5b 73 6c 6f 74 5f 69 64  SlotList[slot_id
1a3f0 78 5d 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09  x] = currslot;..
1a400 09 73 6c 6f 74 5f 69 64 78 2b 2b 3b 0a 09 7d 0a  .slot_idx++;..}.
1a410 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1a420 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1a430 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1a440 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1a450 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1a460 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a470 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1a480 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1a490 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a4a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1a4b0 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  ;..}...*pulCount
1a4c0 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a   = slot_count;..
1a4d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a4e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1a4f0 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f  CKR_OK (%i).  Fo
1a500 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 2e  und %lu readers.
1a510 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69  ", CKR_OK, (unsi
1a520 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f  gned long) slot_
1a530 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e  count);...return
1a540 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65  (CKR_OK);...toke
1a550 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e  nPresent = token
1a560 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72  Present; /* Supr
1a570 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
1a580 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
1a590 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1a5a0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1a5b0 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c  tSlotInfo)(CK_SL
1a5c0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
1a5d0 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70  _SLOT_INFO_PTR p
1a5e0 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
1a5f0 43 4b 5f 55 54 46 38 43 48 41 52 20 73 6c 6f 74  CK_UTF8CHAR slot
1a600 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20  Description[] = 
1a610 22 43 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09  "CACKey Slot";..
1a620 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1a630 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f  ;..int bytes_to_
1a640 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  copy;...CACKEY_D
1a650 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1a660 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
1a670 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
1a680 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a690 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
1a6a0 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
1a6b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1a6c0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1a6d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1a6e0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1a6f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a700 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1a710 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1a720 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1a730 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1a740 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1a750 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
1a760 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
1a770 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1a780 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1a790 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1a7a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a7b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1a7c0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1a7d0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
1a7e0 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
1a7f0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
1a800 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
1a810 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
1a820 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1a830 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1a840 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1a850 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1a860 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1a870 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a880 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1a890 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1a8a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1a8b0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1a8c0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1a8d0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
1a8e0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
1a8f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a900 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1a910 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1a920 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
1a930 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
1a940 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
1a950 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1a960 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1a970 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1a980 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1a990 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66  );..}...pInfo->f
1a9a0 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 5f 53 4c  lags = CKF_HW_SL
1a9b0 4f 54 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  OT;...if (!cacke
1a9c0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1a9d0 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 70 49  internal) {...pI
1a9e0 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b  nfo->flags |= CK
1a9f0 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49  F_REMOVABLE_DEVI
1aa00 43 45 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  CE;..}...if (cac
1aa10 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
1aa20 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
1aa30 73 6c 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b  slotID]) == CACK
1aa40 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
1aa50 52 45 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66  RESENT) {...pInf
1aa60 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  o->flags |= CKF_
1aa70 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09  TOKEN_PRESENT;..
1aa80 7d 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  }...bytes_to_cop
1aa90 79 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65  y = strlen(cacke
1aaa0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1aab0 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69  pcsc_reader);..i
1aac0 66 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  f (sizeof(pInfo-
1aad0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1aae0 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   < bytes_to_copy
1aaf0 29 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63  ) {...bytes_to_c
1ab00 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e  opy = sizeof(pIn
1ab10 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1ab20 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28  ID);..}..memcpy(
1ab30 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1ab40 72 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c  rerID, cackey_sl
1ab50 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63  ots[slotID].pcsc
1ab60 5f 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74  _reader, bytes_t
1ab70 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78  o_copy);...mutex
1ab80 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1ab90 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1aba0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1abb0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1abc0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1abd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1abe0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1abf0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1ac00 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1ac10 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1ac20 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c  memset(pInfo->sl
1ac30 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  otDescription, '
1ac40 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1ac50 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
1ac60 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  n));..memcpy(pIn
1ac70 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
1ac80 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 70  ion, slotDescrip
1ac90 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f  tion, sizeof(slo
1aca0 74 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  tDescription) - 
1acb0 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
1acc0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1acd0 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
1ace0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1acf0 72 65 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f  rerID));...pInfo
1ad00 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
1ad10 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
1ad20 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1ad30 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
1ad40 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
1ad50 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
1ad60 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1ad70 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
1ad80 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
1ad90 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
1ada0 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
1adb0 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
1adc0 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
1add0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ade0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1adf0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1ae00 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1ae10 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1ae20 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1ae30 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49  _RV, C_GetTokenI
1ae40 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
1ae50 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e  slotID, CK_TOKEN
1ae60 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
1ae70 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
1ae80 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75  F8CHAR manufactu
1ae90 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20  rerID[] = "U.S. 
1aea0 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74  Government";..st
1aeb0 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1aec0 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20   defaultLabel[] 
1aed0 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e  = "Unknown Token
1aee0 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
1aef0 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d  F8CHAR model[] =
1af00 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73   "CAC Token";..s
1af10 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
1af20 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
1af30 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  _identities;..un
1af40 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
1af50 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20  certs;..ssize_t 
1af60 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20  label_ret;..int 
1af70 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
1af80 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c  nt use_default_l
1af90 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  abel;...CACKEY_D
1afa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1afb0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
1afc0 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
1afd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1afe0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
1aff0 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
1b000 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1b010 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1b020 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1b030 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1b040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b050 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1b060 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1b070 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1b080 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1b090 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1b0a0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
1b0b0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
1b0c0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1b0d0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1b0e0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1b0f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b100 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1b110 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1b120 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
1b130 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
1b140 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
1b150 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
1b160 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
1b170 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1b180 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1b190 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1b1a0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1b1b0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1b1c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b1d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1b1e0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1b1f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1b200 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1b210 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1b220 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
1b230 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
1b240 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b250 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1b260 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1b270 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
1b280 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
1b290 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
1b2a0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1b2b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1b2c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1b2d0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1b2e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1b2f0 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
1b300 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
1b310 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45  lotID]) != CACKE
1b320 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
1b330 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45  ESENT) {...CACKE
1b340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b350 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73  No token is pres
1b360 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20  ent in slotID = 
1b370 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  %lu", slotID);..
1b380 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1b390 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1b3a0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1b3b0 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50  (CKR_TOKEN_NOT_P
1b3c0 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75  RESENT);..}...mu
1b3d0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1b3e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1b3f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1b400 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1b410 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1b420 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b430 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1b440 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1b450 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1b460 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1b470 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
1b480 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d  token label from
1b490 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f   certificates */
1b4a0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
1b4b0 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65  label, ' ', size
1b4c0 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
1b4d0 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  );..use_default_
1b4e0 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20  label = 1;...if 
1b4f0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1b500 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e  otID].label == N
1b510 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64  ULL) {...pcsc_id
1b520 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
1b530 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63 61  y_read_certs(&ca
1b540 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1b550 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  D], NULL, &num_c
1b560 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73  erts);...if (pcs
1b570 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
1b580 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e  NULL) {....if (n
1b590 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a  um_certs > 0) {.
1b5a0 09 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20  ....label_ret = 
1b5b0 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
1b5c0 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63  tity_to_label(pc
1b5d0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70  sc_identities, p
1b5e0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a  Info->label, siz
1b5f0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
1b600 29 29 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 65  ));.....if (labe
1b610 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09  l_ret > 0) {....
1b620 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
1b630 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63  bel = 0;.......c
1b640 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1b650 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c  ID].label = mall
1b660 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  oc(sizeof(pInfo-
1b670 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09  >label));.......
1b680 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 6c  memcpy(cackey_sl
1b690 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
1b6a0 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  l, pInfo->label,
1b6b0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1b6c0 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09  abel));.....}...
1b6d0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
1b6e0 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
1b6f0 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
1b700 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20  rts, 1);...}..} 
1b710 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
1b720 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61  pInfo->label, ca
1b730 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1b740 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  D].label, sizeof
1b750 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1b760 0a 0a 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  ....use_default_
1b770 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09  label = 0;..}...
1b780 69 66 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f  if (use_default_
1b790 6c 61 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70  label) {...memcp
1b7a0 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  y(pInfo->label, 
1b7b0 64 65 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69  defaultLabel, si
1b7c0 7a 65 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65  zeof(defaultLabe
1b7d0 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65  l) - 1);..}...me
1b7e0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
1b7f0 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
1b800 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
1b810 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
1b820 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
1b830 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1b840 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1b850 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75  sizeof(manufactu
1b860 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d  rerID) - 1);...m
1b870 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emset(pInfo->mod
1b880 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  el, ' ', sizeof(
1b890 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a  pInfo->model));.
1b8a0 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
1b8b0 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a  odel, model, siz
1b8c0 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b  eof(model) - 1);
1b8d0 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1b8e0 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27  >serialNumber, '
1b8f0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1b900 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29  ->serialNumber))
1b910 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
1b920 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20  ->utcTime, ' ', 
1b930 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74  sizeof(pInfo->ut
1b940 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f  cTime));...pInfo
1b950 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
1b960 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
1b970 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1b980 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
1b990 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
1b9a0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
1b9b0 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1b9c0 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
1b9d0 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
1b9e0 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
1b9f0 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
1ba00 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
1ba10 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
1ba20 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
1ba30 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  KF_WRITE_PROTECT
1ba40 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49  ED | CKF_USER_PI
1ba50 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20  N_INITIALIZED | 
1ba60 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41  CKF_TOKEN_INITIA
1ba70 4c 49 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f 73  LIZED | cackey_s
1ba80 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1ba90 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 70 49 6e 66  en_flags;...pInf
1baa0 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43  o->ulMaxSessionC
1bab0 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63  ount = (sizeof(c
1bac0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1bad0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1bae0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20  sessions[0])) - 
1baf0 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73  1;..pInfo->ulSes
1bb00 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55  sionCount = CK_U
1bb10 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
1bb20 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
1bb30 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f  ulMaxRwSessionCo
1bb40 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d  unt = 0;..pInfo-
1bb50 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e  >ulRwSessionCoun
1bb60 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  t = CK_UNAVAILAB
1bb70 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
1bb80 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e  .pInfo->ulMaxPin
1bb90 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66  Len = 128;..pInf
1bba0 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d  o->ulMinPinLen =
1bbb0 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f   0;..pInfo->ulTo
1bbc0 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  talPublicMemory 
1bbd0 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
1bbe0 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
1bbf0 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c  Info->ulFreePubl
1bc00 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  icMemory = CK_UN
1bc10 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
1bc20 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
1bc30 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d  lTotalPrivateMem
1bc40 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
1bc50 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
1bc60 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65  ;..pInfo->ulFree
1bc70 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20  PrivateMemory = 
1bc80 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1bc90 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41  NFORMATION;...CA
1bca0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bcb0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1bcc0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1bcd0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1bce0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1bcf0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1bd00 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74  V, C_WaitForSlot
1bd10 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20  Event)(CK_FLAGS 
1bd20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49  flags, CK_SLOT_I
1bd30 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43  D_PTR pSlotID, C
1bd40 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65  K_VOID_PTR pRese
1bd50 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f  rved) {..CACKEY_
1bd60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1bd70 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
1bd80 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c  Reserved != NULL
1bd90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1bda0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1bdb0 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e  . pReserved is n
1bdc0 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
1bdd0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1bde0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1bdf0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1be00 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1be10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1be20 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1be30 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1be40 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1be50 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1be60 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58  ZED);..}.../* XX
1be70 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65  X: TODO: Impleme
1be80 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43  nt this... */..C
1be90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bea0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1beb0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1bec0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1bed0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1bee0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1bef0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1bf00 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1bf10 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1bf20 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1bf30 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
1bf40 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  st)(CK_SLOT_ID s
1bf50 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e  lotID, CK_MECHAN
1bf60 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d 65  ISM_TYPE_PTR pMe
1bf70 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f  chanismList, CK_
1bf80 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75  ULONG_PTR pulCou
1bf90 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  nt) {..CACKEY_DE
1bfa0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1bfb0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1bfc0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1bfd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1bfe0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1bff0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1c000 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1c010 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1c020 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1c030 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e  .}...if (pulCoun
1c040 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
1c050 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c060 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 43  TF("Error.  pulC
1c070 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  ount is NULL.");
1c080 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1c090 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1c0a0 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
1c0b0 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  smList == NULL) 
1c0c0 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  {...*pulCount = 
1c0d0 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  1;....CACKEY_DEB
1c0e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1c0f0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1c100 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
1c110 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
1c120 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e  }...if (*pulCoun
1c130 74 20 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b 45  t < 1) {...CACKE
1c140 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c150 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72 20 74  Error.  Buffer t
1c160 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09  oo small.");....
1c170 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45  return(CKR_BUFFE
1c180 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d  R_TOO_SMALL);..}
1c190 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  ...pMechanismLis
1c1a0 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50  t[0] = CKM_RSA_P
1c1b0 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  KCS;..*pulCount 
1c1c0 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  = 1;...CACKEY_DE
1c1d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1c1e0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1c1f0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1c200 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1c210 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1c220 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1c230 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28  tMechanismInfo)(
1c240 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1c250 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  D, CK_MECHANISM_
1c260 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45  TYPE type, CK_ME
1c270 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52  CHANISM_INFO_PTR
1c280 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d   pInfo) {..int m
1c290 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
1c2a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c2b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1c2c0 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
1c2d0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1c2e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c2f0 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
1c300 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1c310 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1c320 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1c330 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1c340 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c350 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c360 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1c370 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1c380 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1c390 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1c3a0 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
1c3b0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
1c3c0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1c3d0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1c3e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1c3f0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1c400 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c410 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1c420 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1c430 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
1c440 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
1c450 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c460 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1c470 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1c480 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1c490 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1c4a0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1c4b0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1c4c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c4d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c4e0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1c4f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1c500 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1c510 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
1c520 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1c530 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
1c540 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c550 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1c560 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1c570 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
1c580 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
1c590 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
1c5a0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
1c5b0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1c5c0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
1c5d0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1c5e0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1c5f0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1c600 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1c610 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1c620 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1c630 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1c640 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c650 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1c660 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1c670 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1c680 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1c690 7d 0a 0a 09 73 77 69 74 63 68 20 28 74 79 70 65  }...switch (type
1c6a0 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
1c6b0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66  SA_PKCS:....pInf
1c6c0 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20  o->ulMinKeySize 
1c6d0 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d  = 512;....pInfo-
1c6e0 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20  >ulMaxKeySize = 
1c6f0 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e  8192;....pInfo->
1c700 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c  flags = CKF_HW |
1c710 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43   CKF_ENCRYPT | C
1c720 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46  KF_DECRYPT | CKF
1c730 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49  _SIGN | CKF_VERI
1c740 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  FY;....break;..}
1c750 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c760 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1c770 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1c780 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1c790 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  n(CKR_OK);.}../*
1c7a0 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72   We don't suppor
1c7b0 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a  t this method. *
1c7c0 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
1c7d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e  TION(CK_RV, C_In
1c7e0 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54  itToken)(CK_SLOT
1c7f0 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55  _ID slotID, CK_U
1c800 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
1c810 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
1c820 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  Len, CK_UTF8CHAR
1c830 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09  _PTR pLabel) {..
1c840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c850 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1c860 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1c870 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1c880 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c890 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1c8a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1c8b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1c8c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1c8d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1c8e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c8f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1c900 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
1c910 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b  TECTED (%i)", CK
1c920 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
1c930 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75  OTECTED);...retu
1c940 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  rn(CKR_TOKEN_WRI
1c950 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d  TE_PROTECTED);.}
1c960 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
1c970 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
1c980 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
1c990 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1c9a0 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45  C_InitPIN)(CK_SE
1c9b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1c9c0 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
1c9d0 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
1c9e0 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20  ULONG ulPinLen) 
1c9f0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1ca00 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1ca10 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1ca20 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1ca30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ca40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1ca50 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1ca60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1ca70 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1ca80 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1ca90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1caa0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1cab0 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
1cac0 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c  PROTECTED (%i)",
1cad0 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
1cae0 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72  _PROTECTED);...r
1caf0 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f  eturn(CKR_TOKEN_
1cb00 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
1cb10 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74  ;.}../* We don't
1cb20 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65   support this me
1cb30 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49  thod. */.CK_DEFI
1cb40 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1cb50 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f  V, C_SetPIN)(CK_
1cb60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1cb70 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38  Session, CK_UTF8
1cb80 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e  CHAR_PTR pOldPin
1cb90 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64  , CK_ULONG ulOld
1cba0 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43  PinLen, CK_UTF8C
1cbb0 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c  HAR_PTR pNewPin,
1cbc0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50   CK_ULONG ulNewP
1cbd0 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  inLen) {..CACKEY
1cbe0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1cbf0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1cc00 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1cc10 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1cc20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1cc30 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1cc40 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1cc50 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1cc60 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1cc70 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1cc80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1cc90 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1cca0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1ccb0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1ccc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1ccd0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1cce0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1ccf0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1cd00 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1cd10 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53  N(CK_RV, C_OpenS
1cd20 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f  ession)(CK_SLOT_
1cd30 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c  ID slotID, CK_FL
1cd40 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f  AGS flags, CK_VO
1cd50 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74  ID_PTR pApplicat
1cd60 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e  ion, CK_NOTIFY n
1cd70 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f  otify, CK_SESSIO
1cd80 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53  N_HANDLE_PTR phS
1cd90 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67  ession) {..unsig
1cda0 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69  ned long idx;..i
1cdb0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1cdc0 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73  ..int found_sess
1cdd0 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  ion = 0;...CACKE
1cde0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cdf0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1ce00 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45  ((flags & CKF_SE
1ce10 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d  RIAL_SESSION) !=
1ce20 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53   CKF_SERIAL_SESS
1ce30 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ION) {...return(
1ce40 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41  CKR_SESSION_PARA
1ce50 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  LLEL_NOT_SUPPORT
1ce60 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ED);..}...if (!c
1ce70 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1ce80 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1ce90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1cea0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1ceb0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1cec0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1ced0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1cee0 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
1cef0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
1cf00 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1cf10 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1cf20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1cf30 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1cf40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cf50 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1cf60 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1cf70 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
1cf80 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
1cf90 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
1cfa0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
1cfb0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1cfc0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1cfd0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1cfe0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1cff0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1d000 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1d010 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d020 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1d030 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1d040 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1d050 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
1d060 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1d070 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
1d080 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d090 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d0a0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1d0b0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
1d0c0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
1d0d0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
1d0e0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1d0f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1d100 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1d110 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
1d120 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1d130 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1d140 68 65 20 63 61 72 64 20 69 73 20 61 63 74 75 61  he card is actua
1d150 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e  lly in the slot.
1d160 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65   */../* XXX: Che
1d170 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
1d180 74 68 69 73 20 69 73 20 69 6e 20 74 68 65 20 50  this is in the P
1d190 4b 43 53 23 31 31 20 73 70 65 63 69 66 69 63 61  KCS#11 specifica
1d1a0 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63  tion */..if (cac
1d1b0 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
1d1c0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
1d1d0 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b  slotID]) != CACK
1d1e0 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
1d1f0 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  RESENT) {...CACK
1d200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d210 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f  "Error.  Card no
1d220 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75  t present.  Retu
1d230 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45  rning CKR_DEVICE
1d240 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63  _REMOVED");....c
1d250 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1d260 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1d270 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
1d280 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
1d290 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
1d2a0 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 1; idx < (siz
1d2b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1d2c0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1d2d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1d2e0 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
1d2f0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1d300 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ons[idx].active)
1d310 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73   {....found_sess
1d320 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68  ion = 1;.....*ph
1d330 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a  Session = idx;..
1d340 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1d350 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ns[idx].active =
1d360 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   1;....cackey_se
1d370 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74  ssions[idx].slot
1d380 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09  ID = slotID;....
1d390 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d3a0 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  idx].state = CKS
1d3b0 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49  _RO_PUBLIC_SESSI
1d3c0 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ON;....cackey_se
1d3d0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67  ssions[idx].flag
1d3e0 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61  s = flags;....ca
1d3f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1d400 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  x].ulDeviceError
1d410 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 0;....cackey_
1d420 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41  sessions[idx].pA
1d430 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70  pplication = pAp
1d440 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61  plication;....ca
1d450 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1d460 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69  x].Notify = noti
1d470 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  fy;.....cackey_s
1d480 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
1d490 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ntities = NULL;.
1d4a0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1d4b0 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
1d4c0 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  es_count = 0;...
1d4d0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1d4e0 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63  s[idx].search_ac
1d4f0 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61  tive = 0;.....ca
1d500 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1d510 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  x].sign_active =
1d520 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
1d530 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63  essions[idx].dec
1d540 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b  rypt_active = 0;
1d550 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
1d560 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69  ions[idx].identi
1d570 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
1d580 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63  ad_identities(&c
1d590 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1d5a0 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73  ID], &cackey_ses
1d5b0 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
1d5c0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a  ities_count);...
1d5d0 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
1d5e0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1d5f0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1d600 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1d610 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1d620 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1d630 0a 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 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1d650 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1d660 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1d670 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1d680 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75  );..}...if (!fou
1d690 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09  nd_session) {...
1d6a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d6b0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1d6c0 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54  KR_SESSION_COUNT
1d6d0 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45 53 53   (%i)", CKR_SESS
1d6e0 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72  ION_COUNT);....r
1d6f0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1d700 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43  N_COUNT);..}...C
1d710 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d720 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1d730 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1d740 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1d750 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1d760 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1d770 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73 69  RV, C_CloseSessi
1d780 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  on)(CK_SESSION_H
1d790 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
1d7a0 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
1d7b0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
1d7c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1d7d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1d7e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1d7f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d800 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d810 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1d820 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1d830 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1d840 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1d850 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
1d860 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
1d870 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
1d880 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1d890 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1d8a0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
1d8b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d8c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1d8d0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
1d8e0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1d8f0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1d900 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1d910 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1d920 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1d930 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1d940 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1d950 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1d960 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d970 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d980 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1d990 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1d9a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1d9b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1d9c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d9d0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
1d9e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1d9f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1da00 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1da10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1da20 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
1da30 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1da40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1da50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1da60 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
1da70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1da80 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30  sion].active = 0
1da90 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69  ;..cackey_free_i
1daa0 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79  dentities(cackey
1dab0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1dac0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20  on].identities, 
1dad0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1dae0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1daf0 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d  ties_count);...m
1db00 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1db10 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1db20 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1db30 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1db40 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1db50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1db60 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1db70 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1db80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1db90 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1dba0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1dbb0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1dbc0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1dbd0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1dbe0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1dbf0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1dc00 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65  N(CK_RV, C_Close
1dc10 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f  AllSessions)(CK_
1dc20 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29 20  SLOT_ID slotID) 
1dc30 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
1dc40 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1dc50 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
1dc60 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1dc70 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1dc80 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1dc90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1dca0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1dcb0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1dcc0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1dcd0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1dce0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1dcf0 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
1dd00 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
1dd10 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1dd20 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1dd30 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1dd40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1dd50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1dd60 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1dd70 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1dd80 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
1dd90 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
1dda0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ddb0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
1ddc0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1ddd0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1dde0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1ddf0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1de00 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1de10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1de20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1de30 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1de40 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1de50 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1de60 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1de70 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1de80 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
1de90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1dea0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1deb0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1dec0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
1ded0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
1dee0 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
1def0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1df00 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1df10 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
1df20 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
1df30 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f  NVALID);..}...fo
1df40 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1df50 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1df60 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1df70 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1df80 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
1df90 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
1dfa0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
1dfb0 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63  tive) {....if (c
1dfc0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1dfd0 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c  dx].slotID != sl
1dfe0 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74  otID) {.....cont
1dff0 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  inue;....}.....c
1e000 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1e010 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1e020 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65  k);....C_CloseSe
1e030 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63  ssion(idx);....c
1e040 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1e050 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1e060 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
1e070 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1e080 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1e090 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1e0a0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1e0b0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1e0c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e0d0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1e0e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1e0f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1e100 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1e110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e120 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1e130 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1e140 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1e150 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1e160 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1e170 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f  _RV, C_GetSessio
1e180 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f  nInfo)(CK_SESSIO
1e190 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1e1a0 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e  n, CK_SESSION_IN
1e1b0 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
1e1c0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1e1d0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
1e1e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1e1f0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
1e200 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1e210 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e220 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
1e230 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1e240 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1e250 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1e260 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1e270 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1e280 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e290 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1e2a0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1e2b0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1e2c0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1e2d0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
1e2e0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
1e2f0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
1e300 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1e310 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1e320 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1e330 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1e340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e350 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
1e360 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1e370 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1e380 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1e390 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1e3a0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1e3b0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1e3c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1e3d0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1e3e0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1e3f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e400 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1e410 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1e420 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1e430 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1e440 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1e450 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
1e460 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1e470 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1e480 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1e490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e4a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1e4b0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
1e4c0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1e4d0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1e4e0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1e4f0 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20  ..pInfo->slotID 
1e500 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1e510 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
1e520 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74  ID;..pInfo->stat
1e530 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  e = cackey_sessi
1e540 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
1e550 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  ate;..pInfo->fla
1e560 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  gs = cackey_sess
1e570 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66  ions[hSession].f
1e580 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  lags;..pInfo->ul
1e590 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61  DeviceError = ca
1e5a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1e5b0 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65  ession].ulDevice
1e5c0 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72  Error;...mutex_r
1e5d0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1e5e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1e5f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1e600 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1e610 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1e620 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e630 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1e640 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1e650 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1e660 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
1e670 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e680 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e690 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1e6a0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1e6b0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1e6c0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1e6d0 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f  V, C_GetOperatio
1e6e0 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49  nState)(CK_SESSI
1e6f0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1e700 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1e710 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c  pOperationState,
1e720 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1e730 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c  lOperationStateL
1e740 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1e750 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1e760 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1e770 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1e780 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e790 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e7a0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1e7b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e7c0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1e7d0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1e7e0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1e7f0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1e800 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1e810 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1e820 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1e830 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e840 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1e850 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1e860 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1e870 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1e880 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61  K_RV, C_SetOpera
1e890 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45  tionState)(CK_SE
1e8a0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1e8b0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1e8c0 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61  TR pOperationSta
1e8d0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f  te, CK_ULONG ulO
1e8e0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e  perationStateLen
1e8f0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1e900 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65  LE hEncryptionKe
1e910 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
1e920 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63 61 74  DLE hAuthenticat
1e930 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  ionKey) {..CACKE
1e940 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e950 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1e960 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1e970 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1e980 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e990 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1e9a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1e9b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1e9c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1e9d0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1e9e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1e9f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1ea00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1ea10 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1ea20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1ea30 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1ea40 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1ea50 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1ea60 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1ea70 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69  ON(CK_RV, C_Logi
1ea80 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
1ea90 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1eaa0 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72  K_USER_TYPE user
1eab0 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41  Type, CK_UTF8CHA
1eac0 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55  R_PTR pPin, CK_U
1ead0 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b  LONG ulPinLen) {
1eae0 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
1eaf0 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  tID;..int mutex_
1eb00 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69  retval;..int tri
1eb10 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69  es_remaining;..i
1eb20 6e 74 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09  nt login_ret;...
1eb30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1eb40 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1eb50 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1eb60 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1eb70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1eb80 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1eb90 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1eba0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1ebb0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1ebc0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1ebd0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
1ebe0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
1ebf0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1ec00 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1ec10 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1ec20 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1ec30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ec40 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1ec50 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
1ec60 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1ec70 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1ec80 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
1ec90 66 20 28 75 73 65 72 54 79 70 65 20 21 3d 20 43  f (userType != C
1eca0 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09 43 41 43  KU_USER) {...CAC
1ecb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ecc0 28 22 45 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c  ("Error.  We onl
1ecd0 79 20 73 75 70 70 6f 72 74 20 55 53 45 52 20 6d  y support USER m
1ece0 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f 72 20 25  ode, asked for %
1ecf0 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69  lu mode.", (unsi
1ed00 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73 65 72 54  gned long) userT
1ed10 79 70 65 29 0a 0a 09 09 72 65 74 75 72 6e 28 43  ype)....return(C
1ed20 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f 49 4e 56  KR_USER_TYPE_INV
1ed30 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1ed40 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1ed50 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1ed60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1ed70 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1ed80 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1ed90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1eda0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1edb0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1edc0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1edd0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1ede0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1edf0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
1ee00 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1ee10 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1ee20 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1ee30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ee40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1ee50 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
1ee60 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1ee70 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1ee80 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1ee90 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
1eea0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1eeb0 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
1eec0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
1eed0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
1eee0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1eef0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1ef00 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
1ef10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ef20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1ef30 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1ef40 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
1ef50 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
1ef60 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1ef70 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1ef80 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1ef90 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1efa0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
1efb0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1efc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1efd0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1efe0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1eff0 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
1f000 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
1f010 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1f020 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1f030 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1f040 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1f050 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1f060 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20  }...login_ret = 
1f070 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61  cackey_login(&ca
1f080 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1f090 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c  D], pPin, ulPinL
1f0a0 65 6e 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69  en, &tries_remai
1f0b0 6e 69 6e 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69  ning);..if (logi
1f0c0 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
1f0d0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63  PCSC_S_OK) {...c
1f0e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1f0f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f100 6b 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e  k);....if (login
1f110 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
1f120 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a  CSC_E_LOCKED) {.
1f130 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f140 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f150 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e  Token is locked.
1f160 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
1f170 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1f180 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
1f190 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b  USER_PIN_LOCKED;
1f1a0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1f1b0 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d  PIN_LOCKED);...}
1f1c0 20 65 6c 73 65 20 69 66 20 28 6c 6f 67 69 6e 5f   else if (login_
1f1d0 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
1f1e0 53 43 5f 45 5f 42 41 44 50 49 4e 29 20 7b 0a 09  SC_E_BADPIN) {..
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 45 72 72 6f 72 2e 20 20 49  RINTF("Error.  I
1f210 6e 76 61 6c 69 64 20 50 49 4e 2e 22 29 3b 0a 0a  nvalid PIN.");..
1f220 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f230 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
1f240 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f  ags |= CKF_USER_
1f250 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a  PIN_COUNT_LOW;..
1f260 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  ...if (tries_rem
1f270 61 69 6e 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09  aining == 1) {..
1f280 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f290 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
1f2a0 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f  ags |= CKF_USER_
1f2b0 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09  PIN_FINAL_TRY;..
1f2c0 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ..}.....return(C
1f2d0 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
1f2e0 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
1f2f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f300 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65  rror.  Unknown e
1f310 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72  rror returned fr
1f320 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28  om cackey_login(
1f330 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72  ) (%i)", login_r
1f340 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  et);....return(C
1f350 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1f360 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
1f370 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1f380 65 6e 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b  en_flags &= ~(CK
1f390 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45  F_USER_PIN_LOCKE
1f3a0 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e  D | CKF_USER_PIN
1f3b0 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46  _COUNT_LOW | CKF
1f3c0 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20  _LOGIN_REQUIRED 
1f3d0 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46  | CKF_USER_PIN_F
1f3e0 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63  INAL_TRY);...cac
1f3f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1f400 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43  ssion].state = C
1f410 4b 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54  KS_RO_USER_FUNCT
1f420 49 4f 4e 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  IONS;...mutex_re
1f430 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1f440 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1f450 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1f460 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1f470 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1f480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f490 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1f4a0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1f4b0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1f4c0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1f4d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f4e0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1f4f0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1f500 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1f510 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1f520 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1f530 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53  , C_Logout)(CK_S
1f540 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1f550 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c  ession) {..CK_SL
1f560 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69  OT_ID slotID;..i
1f570 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1f580 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f590 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1f5a0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1f5b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1f5c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f5d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1f5e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1f5f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f600 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1f610 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1f620 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
1f630 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
1f640 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1f650 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1f660 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1f670 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
1f680 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f690 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1f6a0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
1f6b0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1f6c0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1f6d0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1f6e0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1f6f0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1f700 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f710 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1f720 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1f730 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f740 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1f750 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1f760 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1f770 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1f780 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1f790 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1f7a0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
1f7b0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1f7c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f7d0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1f7e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f7f0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
1f800 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1f810 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1f820 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1f830 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
1f840 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
1f850 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
1f860 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
1f870 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
1f880 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1f890 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1f8a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1f8b0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1f8c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f8d0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1f8e0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1f8f0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
1f900 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
1f910 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f920 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1f930 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1f940 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
1f950 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
1f960 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f970 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1f980 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1f990 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
1f9a0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
1f9b0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
1f9c0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1f9d0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1f9e0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1f9f0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1fa00 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  OR);..}...cackey
1fa10 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1fa20 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f  on].state = CKS_
1fa30 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f  RO_PUBLIC_SESSIO
1fa40 4e 3b 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  N;..cackey_slots
1fa50 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
1fa60 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e  lags = CKF_LOGIN
1fa70 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 6d 75 74  _REQUIRED;...mut
1fa80 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1fa90 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1faa0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1fab0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1fac0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1fad0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fae0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1faf0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1fb00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1fb10 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1fb20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fb30 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1fb40 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1fb50 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1fb60 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1fb70 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1fb80 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74 65 4f  CK_RV, C_CreateO
1fb90 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
1fba0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1fbb0 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  n, CK_ATTRIBUTE_
1fbc0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
1fbd0 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c  K_ULONG ulCount,
1fbe0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
1fbf0 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 29 20  E_PTR phObject) 
1fc00 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1fc10 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1fc20 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1fc30 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1fc40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fc50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1fc60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1fc70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1fc80 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1fc90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1fca0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fcb0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1fcc0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1fcd0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1fce0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1fcf0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1fd00 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1fd10 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1fd20 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1fd30 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1fd40 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28  , C_CopyObject)(
1fd50 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1fd60 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
1fd70 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
1fd80 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ject, CK_ATTRIBU
1fd90 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
1fda0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
1fdb0 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
1fdc0 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f 62  NDLE_PTR phNewOb
1fdd0 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ject) {..CACKEY_
1fde0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1fdf0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1fe00 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1fe10 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1fe20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1fe30 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1fe40 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1fe50 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1fe60 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1fe70 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1fe80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1fe90 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1fea0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1feb0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1fec0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1fed0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1fee0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1fef0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1ff00 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1ff10 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f  (CK_RV, C_Destro
1ff20 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53  yObject)(CK_SESS
1ff30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1ff40 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
1ff50 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b  ANDLE hObject) {
1ff60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ff70 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1ff80 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1ff90 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1ffa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ffb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1ffc0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1ffd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ffe0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1fff0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
20000 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20010 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
20020 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
20030 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
20040 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
20050 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
20060 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
20070 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20080 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
20090 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
200a0 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65   C_GetObjectSize
200b0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
200c0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
200d0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
200e0 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Object, CK_ULONG
200f0 5f 50 54 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a  _PTR pulSize) {.
20100 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20110 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
20120 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20130 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
20140 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20150 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
20160 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
20170 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20180 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20190 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
201a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
201b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
201c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
201d0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
201e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
201f0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
20200 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
20210 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
20220 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
20230 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
20240 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61  C_GetAttributeVa
20250 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  lue)(CK_SESSION_
20260 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
20270 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
20280 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
20290 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
202a0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
202b0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41  ulCount) {..CK_A
202c0 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
202d0 74 74 72 3b 0a 09 73 74 72 75 63 74 20 63 61 63  ttr;..struct cac
202e0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
202f0 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65  entity;..unsigne
20300 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f  d long identity_
20310 69 64 78 2c 20 61 74 74 72 5f 69 64 78 2c 20 73  idx, attr_idx, s
20320 65 73 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75  ess_attr_idx, nu
20330 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65  m_ids;..int mute
20340 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  x_retval;..CK_RV
20350 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b   retval = CKR_OK
20360 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  ;..CK_VOID_PTR p
20370 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  Value;..CK_ULONG
20380 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43   ulValueLen;...C
20390 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
203a0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
203b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
203c0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
203d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
203e0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
203f0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
20400 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
20410 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
20420 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
20430 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
20440 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
20450 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
20460 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
20470 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20480 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
20490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
204a0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
204b0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
204c0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
204d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
204e0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
204f0 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20   (hObject == 0) 
20500 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20510 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20520 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f   Object handle o
20530 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
20540 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
20550 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e  OBJECT_HANDLE_IN
20560 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
20570 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  (ulCount == 0) {
20580 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
20590 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a  uit, if zero obj
205a0 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66  ects were specif
205b0 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20  ied return zero 
205c0 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c  items immediatel
205d0 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  y */...CACKEY_DE
205e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
205f0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
20600 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
20610 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
20620 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
20630 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61  .}...if (pTempla
20640 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  te == NULL) {...
20650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20660 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 54 65  NTF("Error.  pTe
20670 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22  mplate is NULL."
20680 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20690 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
206a0 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69  ..}...identity_i
206b0 64 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31  dx = hObject - 1
206c0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
206d0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
206e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
206f0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
20700 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
20710 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20720 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
20730 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
20740 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20750 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
20760 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
20770 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20780 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
20790 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
207a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
207b0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
207c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
207d0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
207e0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
207f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
20800 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
20810 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64  ID);..}...num_id
20820 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  s = cackey_sessi
20830 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
20840 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a  entities_count;.
20850 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 5f 69  ..if (identity_i
20860 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b  dx >= num_ids) {
20870 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
20880 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20890 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
208a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
208b0 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68  Error.  Object h
208c0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
208d0 67 65 2e 20 20 69 64 65 6e 74 69 74 79 5f 69 64  ge.  identity_id
208e0 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73  x = %lu, num_ids
208f0 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67   = %lu.", (unsig
20900 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
20910 74 79 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e 65  ty_idx, (unsigne
20920 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29  d long) num_ids)
20930 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20940 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e  OBJECT_HANDLE_IN
20950 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65  VALID);..}...ide
20960 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
20970 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20980 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64  n].identities[id
20990 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66  entity_idx];...f
209a0 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30  or (attr_idx = 0
209b0 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 75 6c 43  ; attr_idx < ulC
209c0 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b  ount; attr_idx++
209d0 29 20 7b 0a 09 09 63 75 72 72 5f 61 74 74 72 20  ) {...curr_attr 
209e0 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b 61 74 74  = &pTemplate[att
209f0 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75  r_idx];....pValu
20a00 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61  e = NULL;...ulVa
20a10 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e  lueLen = (CK_LON
20a20 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59  G) -1;....CACKEY
20a30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4c  _DEBUG_PRINTF("L
20a40 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69  ooking for attri
20a50 62 75 74 65 20 30 78 25 30 38 6c 78 20 28 69 64  bute 0x%08lx (id
20a60 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22  entity:%lu) ..."
20a70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
20a80 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  ) curr_attr->typ
20a90 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
20aa0 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 29  g) identity_idx)
20ab0 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73 73 5f 61  ;....for (sess_a
20ac0 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73  ttr_idx = 0; ses
20ad0 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65  s_attr_idx < ide
20ae0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
20af0 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74  s_count; sess_at
20b00 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69  tr_idx++) {....i
20b10 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 61 74 74  f (identity->att
20b20 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
20b30 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63  r_idx].type == c
20b40 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20  urr_attr->type) 
20b50 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
20b60 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
20b70 66 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c 75 65  found it, pValue
20b80 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65   = %p, ulValueLe
20b90 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74 69  n = %lu", identi
20ba0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
20bb0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
20bc0 61 6c 75 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e  alue, identity->
20bd0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
20be0 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75  attr_idx].ulValu
20bf0 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09  eLen);..........
20c00 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74  pValue = identit
20c10 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
20c20 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61  ss_attr_idx].pVa
20c30 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  lue;.....ulValue
20c40 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  Len = identity->
20c50 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
20c60 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75  attr_idx].ulValu
20c70 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  eLen;....}...}..
20c80 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
20c90 3e 70 56 61 6c 75 65 20 26 26 20 70 56 61 6c 75  >pValue && pValu
20ca0 65 29 20 7b 0a 09 09 09 69 66 20 28 63 75 72 72  e) {....if (curr
20cb0 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
20cc0 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29  n >= ulValueLen)
20cd0 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75   {.....memcpy(cu
20ce0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
20cf0 20 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65   pValue, ulValue
20d00 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20  Len);....} else 
20d10 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  {.....ulValueLen
20d20 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
20d30 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
20d40 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
20d50 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  ALL;....}...}...
20d60 09 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61  .curr_attr->ulVa
20d70 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65  lueLen = ulValue
20d80 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  Len;..}...mutex_
20d90 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20da0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
20db0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
20dc0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
20dd0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
20de0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20df0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
20e00 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20e10 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20e20 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
20e30 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
20e40 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f  _ATTRIBUTE_TYPE_
20e50 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43 41 43  INVALID) {...CAC
20e60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20e70 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
20e80 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49  ATTRIBUTE_TYPE_I
20e90 4e 56 41 4c 49 44 20 28 25 69 29 22 2c 20 28 69  NVALID (%i)", (i
20ea0 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20  nt) retval);..} 
20eb0 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20  else if (retval 
20ec0 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  == CKR_BUFFER_TO
20ed0 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43  O_SMALL) {...CAC
20ee0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20ef0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
20f00 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
20f10 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
20f20 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69  tval);..} else i
20f30 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
20f40 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
20f50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20f60 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
20f70 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
20f80 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  al);..} else {..
20f90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20fa0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
20fb0 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  %i", (int) retva
20fc0 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  l);..}...return(
20fd0 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
20fe0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
20ff0 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74 74 72 69  K_RV, C_SetAttri
21000 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45  buteValue)(CK_SE
21010 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
21020 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
21030 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
21040 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
21050 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
21060 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b  ULONG ulCount) {
21070 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21080 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
21090 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
210a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
210b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
210c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
210d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
210e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
210f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
21100 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
21110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21120 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
21130 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21140 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
21150 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
21160 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
21170 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
21180 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21190 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
211a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
211b0 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e   C_FindObjectsIn
211c0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
211d0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
211e0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
211f0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
21200 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a  LONG ulCount) {.
21210 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
21220 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64  ID;..CK_ULONG id
21230 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
21240 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
21250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
21260 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
21270 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
21280 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
21290 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
212a0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
212b0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
212c0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
212d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
212e0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
212f0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
21300 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
21310 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
21320 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
21330 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
21340 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21350 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21360 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
21370 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
21380 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
21390 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
213a0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
213b0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
213c0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
213d0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
213e0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
213f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21400 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21410 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
21420 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21430 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21440 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
21450 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
21460 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
21470 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
21480 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21490 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
214a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
214b0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
214c0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
214d0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
214e0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
214f0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
21500 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21510 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
21520 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  h_active) {...ca
21530 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
21540 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
21550 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
21560 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21570 2e 20 20 53 65 61 72 63 68 20 61 6c 72 65 61 64  .  Search alread
21580 79 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  y active.");....
21590 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
215a0 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a  RATION_ACTIVE);.
215b0 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
215c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
215d0 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
215e0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
215f0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
21600 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
21610 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
21620 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
21630 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21640 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21650 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
21660 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
21670 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
21680 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
21690 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
216a0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
216b0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
216c0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
216d0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
216e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
216f0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
21700 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
21710 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
21720 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
21730 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
21740 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
21750 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
21760 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
21770 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
21780 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
21790 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
217a0 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
217b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
217c0 4e 54 46 28 22 54 68 65 20 73 6c 6f 74 20 68 61  NTF("The slot ha
217d0 73 20 62 65 65 6e 20 72 65 73 65 74 20 73 69 6e  s been reset sin
217e0 63 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b 65  ce we last looke
217f0 64 20 66 6f 72 20 69 64 65 6e 74 69 74 69 65 73  d for identities
21800 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22 29   -- rescanning")
21810 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  ;....if (cackey_
21820 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21830 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 21 3d  n].identities !=
21840 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b   NULL) {....cack
21850 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69  ey_free_identiti
21860 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  es(cackey_sessio
21870 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
21880 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f  ntities, cackey_
21890 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
218a0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
218b0 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  unt);.....cackey
218c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
218d0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  on].identities =
218e0 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79   NULL;....cackey
218f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21900 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
21910 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09  ount = 0;...}...
21920 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
21930 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20  s[slotID].label 
21940 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 72  != NULL) {....fr
21950 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
21960 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a  slotID].label);.
21970 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
21980 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20  slotID].label = 
21990 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  NULL;...}....cac
219a0 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
219b0 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  set(&cackey_slot
219c0 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a 09 09 63 61  s[slotID]);...ca
219d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
219e0 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  D].slot_reset = 
219f0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  0;..}...if (cack
21a00 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21a10 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
21a20 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   == NULL) {...ca
21a30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21a40 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
21a50 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
21a60 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63  _identities(&cac
21a70 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
21a80 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  ], &cackey_sessi
21a90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
21aa0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
21ab0 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c  ..}...if (pTempl
21ac0 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate != NULL) {..
21ad0 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20  .if (ulCount != 
21ae0 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73  0) {....cackey_s
21af0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21b00 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
21b10 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a  ount = ulCount;.
21b20 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
21b30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
21b40 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c  rch_query = mall
21b50 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a  oc(ulCount * siz
21b60 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29  eof(*pTemplate))
21b70 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63  ;.....memcpy(cac
21b80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
21b90 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
21ba0 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20  ery, pTemplate, 
21bb0 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  ulCount * sizeof
21bc0 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09  (*pTemplate));..
21bd0 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
21be0 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 69  idx < ulCount; i
21bf0 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28  dx++) {.....if (
21c00 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75  pTemplate[idx].u
21c10 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 20  lValueLen == 0) 
21c20 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65  {......cackey_se
21c30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
21c40 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
21c50 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  x].pValue = NULL
21c60 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65  ;.......continue
21c70 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63  ;.....}......cac
21c80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
21c90 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
21ca0 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20  ery[idx].pValue 
21cb0 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d 70 6c 61  = malloc(pTempla
21cc0 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  te[idx].ulValueL
21cd0 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 61  en);......if (ca
21ce0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21cf0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
21d00 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
21d10 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  ) {......memcpy(
21d20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21d30 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
21d40 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
21d50 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64  ue, pTemplate[id
21d60 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70  x].pValue, pTemp
21d70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75  late[idx].ulValu
21d80 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 09  eLen);.....}....
21d90 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
21da0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21db0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
21dc0 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30  _query_count = 0
21dd0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
21de0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
21df0 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55  earch_query = NU
21e00 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  LL;...}..} else 
21e10 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  {...if (ulCount 
21e20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65  != 0) {....cacke
21e30 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21e40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21e50 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
21e60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21e70 20 53 65 61 72 63 68 20 71 75 65 72 79 20 73 70   Search query sp
21e80 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
21e90 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 71   but number of q
21ea0 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 73  uery terms not s
21eb0 70 65 63 69 66 69 65 64 20 61 73 20 30 2e 22 29  pecified as 0.")
21ec0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
21ed0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
21ee0 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
21ef0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21f00 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
21f10 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b  ount = 0;...cack
21f20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21f30 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
21f40 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  ry = NULL;..}...
21f50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21f60 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
21f70 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 61  _active = 1;..ca
21f80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21f90 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
21fa0 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75  urr_id = 0;...mu
21fb0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
21fc0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
21fd0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21fe0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
21ff0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
22000 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22010 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
22020 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
22030 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
22040 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
22050 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22060 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
22070 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
22080 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
22090 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74  n(CKR_OK);.}..st
220a0 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
220b0 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61  pkcs11_compare_a
220c0 74 74 72 69 62 75 74 65 73 28 43 4b 5f 41 54 54  ttributes(CK_ATT
220d0 52 49 42 55 54 45 20 2a 61 2c 20 43 4b 5f 41 54  RIBUTE *a, CK_AT
220e0 54 52 49 42 55 54 45 20 2a 62 29 20 7b 0a 09 75  TRIBUTE *b) {..u
220f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 6d  nsigned char *sm
22100 61 6c 6c 62 75 66 2c 20 2a 6c 61 72 67 65 62 75  allbuf, *largebu
22110 66 3b 0a 09 73 69 7a 65 5f 74 20 73 6d 61 6c 6c  f;..size_t small
22120 62 75 66 5f 6c 65 6e 2c 20 6c 61 72 67 65 62 75  buf_len, largebu
22130 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 61 2d 3e  f_len;...if (a->
22140 74 79 70 65 20 21 3d 20 62 2d 3e 74 79 70 65 29  type != b->type)
22150 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a   {...return(0);.
22160 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
22170 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 2e 2e  G_PRINTF("    ..
22180 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67  . found matching
22190 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09 43   type ...");...C
221a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
221b0 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75  TBUF("    ... ou
221c0 72 20 76 61 6c 75 65 3a 22 2c 20 61 2d 3e 70 56  r value:", a->pV
221d0 61 6c 75 65 2c 20 61 2d 3e 75 6c 56 61 6c 75 65  alue, a->ulValue
221e0 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 62 2d 3e 70  Len);...if (b->p
221f0 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Value == NULL) {
22200 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22210 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
22220 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 72  .. found wildcar
22230 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65  d match");....re
22240 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66  turn(1);..}...if
22250 20 28 61 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e   (a->pValue == N
22260 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
22270 30 29 3b 0a 09 7d 0a 0a 20 09 69 66 20 28 62 2d  0);..}.. .if (b-
22280 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 61  >ulValueLen == a
22290 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20  ->ulValueLen && 
222a0 6d 65 6d 63 6d 70 28 61 2d 3e 70 56 61 6c 75 65  memcmp(a->pValue
222b0 2c 20 62 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e  , b->pValue, b->
222c0 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30  ulValueLen) == 0
222d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
222e0 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20  UG_PRINTF("     
222f0 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63    ... found exac
22300 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65  t match");....re
22310 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 77  turn(1);..}...sw
22320 69 74 63 68 20 28 61 2d 3e 74 79 70 65 29 20 7b  itch (a->type) {
22330 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55  ...case CKA_MODU
22340 4c 55 53 3a 0a 09 09 09 69 66 20 28 61 2d 3e 75  LUS:....if (a->u
22350 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d 3e  lValueLen == b->
22360 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
22370 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09  ..break;....}...
22380 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65  ..if (a->ulValue
22390 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56 61 6c 75 65  Len > b->ulValue
223a0 4c 65 6e 29 20 7b 0a 09 09 09 09 73 6d 61 6c 6c  Len) {.....small
223b0 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b  buf = b->pValue;
223c0 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65  .....smallbuf_le
223d0 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = b->ulValueLe
223e0 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66  n;......largebuf
223f0 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = a->pValue;...
22400 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d  ..largebuf_len =
22410 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   a->ulValueLen;.
22420 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
22430 73 6d 61 6c 6c 62 75 66 20 3d 20 61 2d 3e 70 56  smallbuf = a->pV
22440 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62  alue;.....smallb
22450 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61  uf_len = a->ulVa
22460 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72  lueLen;......lar
22470 67 65 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75  gebuf = b->pValu
22480 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f  e;.....largebuf_
22490 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65  len = b->ulValue
224a0 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 6f  Len;....}.....fo
224b0 72 20 28 3b 20 6c 61 72 67 65 62 75 66 5f 6c 65  r (; largebuf_le
224c0 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  n != smallbuf_le
224d0 6e 3b 20 6c 61 72 67 65 62 75 66 2b 2b 2c 6c 61  n; largebuf++,la
224e0 72 67 65 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b 0a  rgebuf_len--) {.
224f0 09 09 09 09 69 66 20 28 6c 61 72 67 65 62 75 66  ....if (largebuf
22500 5b 30 5d 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  [0] != 0) {.....
22510 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09  .break;.....}...
22520 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 72 67 65  .}.....if (large
22530 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c  buf_len != small
22540 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 62  buf_len) {.....b
22550 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  reak;....}.....i
22560 66 20 28 6d 65 6d 63 6d 70 28 6c 61 72 67 65 62  f (memcmp(largeb
22570 75 66 2c 20 73 6d 61 6c 6c 62 75 66 2c 20 73 6d  uf, smallbuf, sm
22580 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 3d 3d 20 30  allbuf_len) == 0
22590 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
225a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
225b0 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 61 70      ... found ap
225c0 70 72 6f 78 69 6d 61 74 65 20 6d 61 74 63 68 22  proximate match"
225d0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 31  );......return(1
225e0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  );....}.....brea
225f0 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30  k;..}...return(0
22600 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
22610 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
22620 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43  C_FindObjects)(C
22630 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
22640 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
22650 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
22660 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f  phObject, CK_ULO
22670 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  NG ulMaxObjectCo
22680 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  unt, CK_ULONG_PT
22690 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  R pulObjectCount
226a0 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
226b0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72  ey_identity *cur
226c0 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42  r_id;..CK_ATTRIB
226d0 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
226e0 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69  .CK_ULONG curr_i
226f0 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f  d_idx, curr_out_
22700 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74  id_idx, curr_att
22710 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72  r_idx, sess_attr
22720 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  _idx;..CK_ULONG 
22730 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70  matched_count, p
22740 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
22750 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  t;..int mutex_re
22760 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
22770 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
22780 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
22790 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
227a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
227b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
227c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
227d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
227e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
227f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
22800 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a  ..}...if (pulObj
22810 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  ectCount == NULL
22820 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22830 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22840 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  .  pulObjectCoun
22850 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
22860 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
22870 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
22880 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d  .if (phObject ==
22890 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62   NULL && ulMaxOb
228a0 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
228b0 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
228c0 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62  cuit, if zero ob
228d0 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69  jects were speci
228e0 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f  fied return zero
228f0 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65   items immediate
22900 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65  ly */...*pulObje
22910 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  ctCount = 0;....
22920 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22930 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22940 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
22950 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
22960 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
22970 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
22980 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
22990 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
229a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
229b0 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73  or.  phObject is
229c0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
229d0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
229e0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
229f0 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  (ulMaxObjectCoun
22a00 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
22a10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22a20 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d  "Error.  Maximum
22a30 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
22a40 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ts specified as 
22a50 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75  zero.");....retu
22a60 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
22a70 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
22a80 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
22a90 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
22aa0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
22ab0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
22ac0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
22ad0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
22ae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22af0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
22b00 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
22b10 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
22b20 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
22b30 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
22b40 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
22b50 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
22b60 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
22b70 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
22b80 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
22b90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22ba0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
22bb0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
22bc0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22bd0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
22be0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
22bf0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
22c00 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
22c10 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
22c20 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
22c30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22c40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
22c50 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
22c60 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
22c70 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
22c80 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
22c90 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
22ca0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22cb0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
22cc0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
22cd0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
22ce0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
22cf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22d00 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
22d10 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
22d20 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
22d30 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
22d40 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
22d50 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  .curr_out_id_idx
22d60 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72   = 0;..for (curr
22d70 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79  _id_idx = cackey
22d80 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
22d90 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
22da0 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20  id; curr_id_idx 
22db0 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
22dc0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
22dd0 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20  tities_count && 
22de0 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
22df0 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29  ; curr_id_idx++)
22e00 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26   {...curr_id = &
22e10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22e20 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
22e30 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78  ties[curr_id_idx
22e40 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ];....CACKEY_DEB
22e50 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65  UG_PRINTF("Proce
22e60 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  ssing identity:%
22e70 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
22e80 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78  ong) curr_id_idx
22e90 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f  );....matched_co
22ea0 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20  unt = 0;....for 
22eb0 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d  (curr_attr_idx =
22ec0 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64   0; curr_attr_id
22ed0 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
22ee0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
22ef0 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
22f00 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b  ; curr_attr_idx+
22f10 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74  +) {....prev_mat
22f20 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74  ched_count = mat
22f30 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09  ched_count;.....
22f40 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63  curr_attr = &cac
22f50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22f60 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
22f70 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64  ery[curr_attr_id
22f80 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  x];.....CACKEY_D
22f90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43  EBUG_PRINTF("  C
22fa0 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72  hecking for attr
22fb0 69 62 75 74 65 20 25 73 20 28 30 78 25 30 38 6c  ibute %s (0x%08l
22fc0 78 29 20 69 6e 20 69 64 65 6e 74 69 74 79 3a 25  x) in identity:%
22fd0 69 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  i...", CACKEY_DE
22fe0 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55  BUG_FUNC_ATTRIBU
22ff0 54 45 5f 54 4f 5f 53 54 52 28 63 75 72 72 5f 61  TE_TO_STR(curr_a
23000 74 74 72 2d 3e 74 79 70 65 29 2c 20 28 75 6e 73  ttr->type), (uns
23010 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
23020 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e  _attr->type, (in
23030 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
23040 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23050 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 56  _PRINTBUF("    V
23060 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  alue looking for
23070 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 70  :", curr_attr->p
23080 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72  Value, curr_attr
23090 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ->ulValueLen);..
230a0 09 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74  ...for (sess_att
230b0 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f  r_idx = 0; sess_
230c0 61 74 74 72 5f 69 64 78 20 3c 20 63 75 72 72 5f  attr_idx < curr_
230d0 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63  id->attributes_c
230e0 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f  ount; sess_attr_
230f0 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20  idx++) {.....if 
23100 28 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63  (cackey_pkcs11_c
23110 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65  ompare_attribute
23120 73 28 26 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  s(&curr_id->attr
23130 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
23140 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61 74 74 72  _idx], curr_attr
23150 29 29 20 7b 0a 09 09 09 09 09 6d 61 74 63 68 65  )) {......matche
23160 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09  d_count++;......
23170 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09  .break;.....}...
23180 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 65  .}...../* If the
23190 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c 64   attribute could
231a0 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64 2c   not be matched,
231b0 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d   do not try to m
231c0 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20  atch additional 
231d0 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 09  attributes */...
231e0 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68 65  .if (prev_matche
231f0 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68  d_count == match
23200 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  ed_count) {.....
23210 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  break;....}...}.
23220 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f 63  ...if (matched_c
23230 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73  ount == cackey_s
23240 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23250 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
23260 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
23270 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23280 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74    ... All %i att
23290 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20  ributes checked 
232a0 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e  for found, addin
232b0 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74 6f  g identity:%i to
232c0 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22 2c   returned list",
232d0 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65   (int) cackey_se
232e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
232f0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
23300 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  unt, (int) curr_
23310 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f  id_idx);.....phO
23320 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69  bject[curr_out_i
23330 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 64  d_idx] = curr_id
23340 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c  _idx + 1;.....ul
23350 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d  MaxObjectCount--
23360 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f 69  ;.....curr_out_i
23370 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73  d_idx++;...} els
23380 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
23390 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
233a0 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e  . Not all %i (on
233b0 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74 74  ly found %i) att
233c0 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20  ributes checked 
233d0 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61  for found, not a
233e0 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  dding identity:%
233f0 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79  i", (int) cackey
23400 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23410 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
23420 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61  _count, (int) ma
23430 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e  tched_count, (in
23440 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
23450 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f  ...}..}..cackey_
23460 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
23470 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
23480 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 3b  d = curr_id_idx;
23490 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  ..*pulObjectCoun
234a0 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f  t = curr_out_id_
234b0 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  idx;...mutex_ret
234c0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
234d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
234e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
234f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
23500 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23510 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23520 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
23530 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
23540 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
23550 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
23560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23570 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
23580 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65  K (%i), num obje
23590 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f  cts = %lu", CKR_
235a0 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  OK, *pulObjectCo
235b0 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  unt);...return(C
235c0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
235d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
235e0 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
235f0 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  tsFinal)(CK_SESS
23600 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23610 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47  ion) {..CK_ULONG
23620 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
23630 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
23640 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23650 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
23660 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
23670 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
23680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23690 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
236a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
236b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
236c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
236d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
236e0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
236f0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
23700 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
23710 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
23720 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
23730 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23740 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23750 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
23760 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
23770 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
23780 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
23790 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
237a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
237b0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
237c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
237d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
237e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
237f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23800 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
23810 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
23820 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
23830 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
23840 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23850 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
23860 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
23870 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23880 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
23890 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
238a0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
238b0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
238c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
238d0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
238e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
238f0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
23900 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
23910 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
23920 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
23930 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
23940 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
23950 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23960 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f  rror.  Search no
23970 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
23980 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
23990 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
239a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61  ALIZED);..}...ca
239b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
239c0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
239d0 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72  ctive = 0;...for
239e0 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
239f0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
23a00 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
23a10 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69  h_query_count; i
23a20 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
23a30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
23a40 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
23a50 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
23a60 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
23a70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23a80 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
23a90 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b  ry[idx].pValue);
23aa0 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ...}..}...if (ca
23ab0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
23ac0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
23ad0 75 65 72 79 29 20 7b 0a 09 09 66 72 65 65 28 63  uery) {...free(c
23ae0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23af0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
23b00 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74  query);..}...mut
23b10 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
23b20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23b30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23b40 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
23b50 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
23b60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23b70 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
23b80 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
23b90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
23ba0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
23bb0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23bc0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
23bd0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
23be0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
23bf0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
23c00 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23c10 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
23c20 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
23c30 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
23c40 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
23c50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
23c60 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
23c70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
23c80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23c90 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23ca0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23cb0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23cc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23cd0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23ce0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23cf0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23d00 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23d10 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
23d20 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
23d30 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
23d40 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
23d50 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
23d60 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23d70 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
23d80 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23d90 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
23da0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
23db0 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
23dc0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
23dd0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
23de0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
23df0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
23e00 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
23e10 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61  R pEncryptedData
23e20 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
23e30 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
23e40 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
23e50 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
23e60 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
23e70 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
23e80 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23e90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23ea0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
23eb0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23ec0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
23ed0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
23ee0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
23ef0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
23f00 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
23f10 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
23f20 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
23f30 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
23f40 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
23f50 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23f60 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
23f70 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
23f80 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55  K_RV, C_EncryptU
23f90 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
23fa0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
23fb0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
23fc0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
23fd0 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  lPartLen, CK_BYT
23fe0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
23ff0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
24000 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50  TR pulEncryptedP
24010 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
24020 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24030 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
24040 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
24050 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
24060 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24070 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
24080 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
24090 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
240a0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
240b0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
240c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
240d0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
240e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
240f0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
24100 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24110 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
24120 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
24130 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
24140 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
24150 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
24160 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  yptFinal)(CK_SES
24170 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
24180 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
24190 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64  R pLastEncrypted
241a0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
241b0 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70  TR pulLastEncryp
241c0 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
241d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
241e0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
241f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
24200 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
24210 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24220 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
24230 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
24240 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
24250 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
24260 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
24270 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24280 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24290 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
242a0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
242b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
242c0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
242d0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
242e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
242f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24300 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24310 44 65 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f  DecryptInit)(CK_
24320 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
24330 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
24340 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
24350 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
24360 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
24370 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
24380 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41  ;...hKey--;...CA
24390 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
243a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
243b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
243c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
243d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
243e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
243f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
24400 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
24410 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
24420 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
24430 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55  pMechanism == NU
24440 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
24450 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24460 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69  or. pMechanism i
24470 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
24480 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
24490 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
244a0 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65   (pMechanism->me
244b0 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52  chanism != CKM_R
244c0 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43  SA_PKCS) {...CAC
244d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
244e0 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
244f0 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e  ism->mechanism n
24500 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
24510 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a  CKM_RSA_PKCS");.
24520 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45  ...return(CKR_ME
24530 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e  CHANISM_PARAM_IN
24540 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
24550 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
24560 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
24570 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
24580 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
24590 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
245a0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
245b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
245c0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
245d0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
245e0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
245f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
24600 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
24610 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24620 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
24630 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24640 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
24650 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
24660 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24670 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
24680 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
24690 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
246a0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
246b0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
246c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
246d0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
246e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
246f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
24700 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24710 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
24720 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
24730 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
24740 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
24750 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
24760 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
24770 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24780 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
24790 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
247a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
247b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
247c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
247d0 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
247e0 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72  pt already in pr
247f0 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09  ogress.");......
24800 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
24810 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d  TION_ACTIVE);..}
24820 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63  ...if (hKey >= c
24830 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
24840 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
24850 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63  ies_count) {...c
24860 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
24870 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24880 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
24890 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
248a0 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f  r.  Key handle o
248b0 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71  ut of range (req
248c0 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20  uested key %lu, 
248d0 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74  only %lu identit
248e0 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22  ies available)."
248f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
24900 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65  ) hKey, (unsigne
24910 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73  d long) cackey_s
24920 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24930 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
24940 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  nt);....return(C
24950 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e  KR_KEY_HANDLE_IN
24960 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  VALID);..}...cac
24970 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24980 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
24990 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63  ctive = 1;...cac
249a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
249b0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
249c0 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68  echanism = pMech
249d0 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
249e0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
249f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
24a00 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d  rypt_mech_parm =
24a10 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61   pMechanism->pPa
24a20 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79  rameter;..cackey
24a30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24a40 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68  on].decrypt_mech
24a50 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68  _parmlen = pMech
24a60 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74  anism->ulParamet
24a70 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73  erLen;..cackey_s
24a80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24a90 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69  ].decrypt_identi
24aa0 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  ty = &cackey_ses
24ab0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
24ac0 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d  identities[hKey]
24ad0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
24ae0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
24af0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
24b00 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
24b10 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
24b20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24b30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24b40 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
24b50 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24b60 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
24b70 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
24b80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
24b90 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
24ba0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
24bb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
24bc0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24bd0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24be0 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53  Decrypt)(CK_SESS
24bf0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
24c00 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
24c10 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c   pEncryptedData,
24c20 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72   CK_ULONG ulEncr
24c30 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b  yptedDataLen, CK
24c40 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
24c50 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
24c60 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f  lDataLen) {..CK_
24c70 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70  ULONG datalen_up
24c80 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69  date, datalen_fi
24c90 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72  nal;..CK_RV decr
24ca0 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  ypt_ret;..int mu
24cb0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
24cc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24cd0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
24ce0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
24cf0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
24d00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24d10 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
24d20 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
24d30 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
24d40 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
24d50 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
24d60 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55  pulDataLen == NU
24d70 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
24d80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24d90 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69  or. pulDataLen i
24da0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
24db0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
24dc0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61  TS_BAD);..}...da
24dd0 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a  talen_update = *
24de0 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65  pulDataLen;...de
24df0 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65  crypt_ret = C_De
24e00 63 72 79 70 74 55 70 64 61 74 65 28 68 53 65 73  cryptUpdate(hSes
24e10 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64  sion, pEncrypted
24e20 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65  Data, ulEncrypte
24e30 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c  dDataLen, pData,
24e40 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65   &datalen_update
24e50 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f  );..if (decrypt_
24e60 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
24e70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24e80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24e90 44 65 63 72 79 70 74 55 70 64 61 74 65 28 29 20  DecryptUpdate() 
24ea0 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
24eb0 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
24ec0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
24ed0 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09  ecrypt_ret);....
24ee0 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20  if (decrypt_ret 
24ef0 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  != CKR_BUFFER_TO
24f00 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a  O_SMALL) {..../*
24f10 20 54 65 72 6d 69 6e 61 74 65 20 64 65 63 72 79   Terminate decry
24f20 70 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ption operation 
24f30 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74  */.....mutex_ret
24f40 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
24f50 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
24f60 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28  iglock);....if (
24f70 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
24f80 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
24f90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24fa0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
24fb0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
24fc0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
24fd0 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09  _ERROR);....}...
24fe0 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
24ff0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25000 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  .active) {.....c
25010 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
25020 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
25030 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  k);......CACKEY_
25040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25050 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
25060 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
25070 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
25080 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
25090 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  VALID);....}....
250a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
250b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
250c0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
250d0 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
250e0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
250f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09  _biglock);......
25100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25110 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
25120 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e  rypt not active.
25130 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72  ");........retur
25140 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
25150 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
25160 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  ;....}.....cacke
25170 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25180 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
25190 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74  ive = 0;.....mut
251a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
251b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
251c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
251d0 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ....if (mutex_re
251e0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
251f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25200 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
25210 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
25220 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
25230 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25240 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  );....}...}....r
25250 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65  eturn(decrypt_re
25260 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61  t);..}...if (pDa
25270 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d  ta) {...pData +=
25280 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b   datalen_update;
25290 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e  ..}..datalen_fin
252a0 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e  al = *pulDataLen
252b0 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74   - datalen_updat
252c0 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74  e;...decrypt_ret
252d0 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61   = C_DecryptFina
252e0 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74  l(hSession, pDat
252f0 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61  a, &datalen_fina
25300 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74  l);..if (decrypt
25310 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
25320 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25330 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25340 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20   DecryptFinal() 
25350 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
25360 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
25370 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
25380 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09  ecrypt_ret);....
25390 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72  return(decrypt_r
253a0 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61  et);..}...*pulDa
253b0 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f  taLen = datalen_
253c0 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e  update + datalen
253d0 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  _final;...CACKEY
253e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
253f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
25400 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
25410 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
25420 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
25430 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
25440 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 29 28  _DecryptUpdate)(
25450 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
25460 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
25470 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
25480 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
25490 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
254a0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
254b0 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
254c0 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29  _PTR pulPartLen)
254d0 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59   {..static CK_BY
254e0 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09  TE buf[16384];..
254f0 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a  ssize_t buflen;.
25500 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
25510 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  ID;..CK_RV retva
25520 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
25530 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65  ERROR;..int mute
25540 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
25550 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25560 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
25570 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
25580 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
25590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
255a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
255b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
255c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
255d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
255e0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
255f0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
25600 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
25610 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
25620 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
25630 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
25640 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
25650 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25660 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
25670 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
25680 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
25690 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
256a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  LID);..}...if (p
256b0 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d  EncryptedPart ==
256c0 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79   NULL && ulEncry
256d0 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30  ptedPartLen == 0
256e0 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
256f0 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65  ircuit if we are
25700 20 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70   asked to decryp
25710 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a  t nothing... */.
25720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25730 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
25740 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
25750 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
25760 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
25770 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
25780 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61  if (pEncryptedPa
25790 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
257a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
257b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63  NTF("Error. pEnc
257c0 72 79 70 74 65 64 50 61 72 74 20 69 73 20 4e 55  ryptedPart is NU
257d0 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70  LL, but ulEncryp
257e0 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f  tedPartLen is no
257f0 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  t 0.");....retur
25800 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
25810 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
25820 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
25830 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  n == 0) {...CACK
25840 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25850 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70  "Error. ulEncryp
25860 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c  tedPartLen is 0,
25870 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f   but pPart is no
25880 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
25890 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
258a0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
258b0 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20   (pulPartLen == 
258c0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
258d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
258e0 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e  rror. pulPartLen
258f0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
25900 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
25910 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
25920 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
25930 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
25940 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25950 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
25960 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
25970 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25980 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
25990 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
259a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
259b0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
259c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
259d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
259e0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
259f0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25a00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25a10 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
25a20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25a30 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
25a40 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
25a50 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
25a60 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
25a70 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
25a80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25a90 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
25aa0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
25ab0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25ac0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
25ad0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25ae0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
25af0 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65  crypt not active
25b00 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
25b10 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
25b20 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
25b30 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
25b40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25b50 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
25b60 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
25b70 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
25b80 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
25b90 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
25ba0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
25bb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25bc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25bd0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
25be0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
25bf0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
25c00 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
25c10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
25c20 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
25c30 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
25c40 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
25c50 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
25c60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25c70 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
25c80 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
25c90 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
25ca0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
25cb0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
25cc0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25cd0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25ce0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
25cf0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25d00 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
25d10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25d20 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
25d30 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  t_mechanism) {..
25d40 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
25d50 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61  CS:..../* Ask ca
25d60 72 64 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f  rd to decrypt */
25d70 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63  ....buflen = cac
25d80 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
25d90 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
25da0 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65  otID], cackey_se
25db0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25dc0 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74  .decrypt_identit
25dd0 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  y, pEncryptedPar
25de0 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  t, ulEncryptedPa
25df0 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65  rtLen, buf, size
25e00 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a  of(buf), 0, 1);.
25e10 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c  ....if (buflen <
25e20 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63   0) {...../* Dec
25e30 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20  ryption failed. 
25e40 2a 2f 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65  */.....if (bufle
25e50 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
25e60 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a  _E_NEEDLOGIN) {.
25e70 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
25e80 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45  R_USER_NOT_LOGGE
25e90 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65  D_IN;.....} else
25ea0 20 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43   if (buflen == C
25eb0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
25ec0 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09  ENABSENT) {.....
25ed0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45  .retval = CKR_DE
25ee0 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09  VICE_REMOVED;...
25ef0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
25f00 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
25f10 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09  ERAL_ERROR;.....
25f20 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  }....} else if (
25f30 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
25f40 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50   buflen) > *pulP
25f50 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29  artLen && pPart)
25f60 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70   {...../* Decryp
25f70 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ted data too lar
25f80 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c  ge */.....retval
25f90 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
25fa0 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c  O_SMALL;....} el
25fb0 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61  se {.....if (pPa
25fc0 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  rt) {......memcp
25fd0 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75  y(pPart, buf, bu
25fe0 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  flen);.....}....
25ff0 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20  ..*pulPartLen = 
26000 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74  buflen;......ret
26010 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09  val = CKR_OK;...
26020 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
26030 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
26040 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
26050 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26060 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
26070 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
26080 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26090 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
260a0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
260b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
260c0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
260d0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
260e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
260f0 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
26100 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
26110 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
26120 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
26130 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
26140 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  yptFinal)(CK_SES
26150 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
26160 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
26170 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f  R pLastPart, CK_
26180 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73  ULONG_PTR pulLas
26190 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74  tPartLen) {..int
261a0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
261b0 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65  int terminate_de
261c0 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43  crypt = 1;...CAC
261d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
261e0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
261f0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
26200 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
26210 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26220 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
26230 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
26240 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
26250 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
26260 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
26270 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
26280 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
26290 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
262a0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
262b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
262c0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
262d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
262e0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
262f0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
26300 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
26310 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
26320 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
26330 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
26340 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
26350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26360 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50  "Error. pulLastP
26370 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
26380 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26390 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
263a0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
263b0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
263c0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
263d0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
263e0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
263f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26400 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26410 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
26420 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
26430 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
26440 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
26450 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26460 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
26470 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
26480 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26490 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
264a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
264b0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
264c0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
264d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
264e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
264f0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
26500 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
26510 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
26520 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
26530 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26540 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26550 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
26560 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26570 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
26580 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
26590 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
265a0 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
265b0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  IZED);..}...*pul
265c0 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b  LastPartLen = 0;
265d0 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72 74  ...if (pLastPart
265e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65   == NULL) {...te
265f0 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20  rminate_decrypt 
26600 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  = 0;..}...if (te
26610 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29  rminate_decrypt)
26620 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
26630 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
26640 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20  ecrypt_active = 
26650 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
26660 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
26670 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
26680 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
26690 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
266a0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
266b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
266c0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
266d0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
266e0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
266f0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
26700 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26710 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26720 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
26730 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
26740 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
26750 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
26760 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28  , C_DigestInit)(
26770 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
26780 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
26790 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
267a0 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b  chanism) {..CACK
267b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
267c0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
267d0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
267e0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
267f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26800 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
26810 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
26820 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
26830 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
26840 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
26850 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
26860 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
26870 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
26880 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
26890 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
268a0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
268b0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
268c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
268d0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
268e0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
268f0 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  est)(CK_SESSION_
26900 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
26910 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
26920 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
26930 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
26940 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f  PTR pDigest, CK_
26950 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67  ULONG_PTR pulDig
26960 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  estLen) {..CACKE
26970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26980 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
26990 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
269a0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
269b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
269c0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
269d0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
269e0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
269f0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
26a00 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
26a10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
26a20 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
26a30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26a40 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
26a50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26a60 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
26a70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26a80 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
26a90 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
26aa0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
26ab0 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  stUpdate)(CK_SES
26ac0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
26ad0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
26ae0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
26af0 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09  G ulPartLen) {..
26b00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26b10 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
26b20 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
26b30 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
26b40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26b50 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
26b60 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
26b70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
26b80 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
26b90 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
26ba0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26bb0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
26bc0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
26bd0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
26be0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
26bf0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
26c00 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
26c10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
26c20 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
26c30 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
26c40 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53  _DigestKey)(CK_S
26c50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
26c60 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
26c70 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
26c80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26c90 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
26ca0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
26cb0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
26cc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26cd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
26ce0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
26cf0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26d00 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
26d10 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
26d20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26d30 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26d40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
26d50 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
26d60 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
26d70 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
26d80 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
26d90 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26da0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
26db0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
26dc0 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28   C_DigestFinal)(
26dd0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
26de0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
26df0 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
26e00 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
26e10 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
26e20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26e30 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
26e40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
26e50 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
26e60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26e70 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
26e80 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
26e90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
26ea0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
26eb0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
26ec0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26ed0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26ee0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26ef0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
26f00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26f10 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
26f20 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
26f30 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26f40 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
26f50 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
26f60 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53  SignInit)(CK_SES
26f70 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
26f80 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
26f90 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
26fa0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
26fb0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74  DLE hKey) {..int
26fc0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
26fd0 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45  .hKey--;...CACKE
26fe0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26ff0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
27000 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
27010 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
27020 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27030 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
27040 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
27050 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
27060 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
27070 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
27080 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29  chanism == NULL)
27090 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
270a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
270b0 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e   pMechanism is N
270c0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
270d0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
270e0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
270f0 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
27100 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f  nism != CKM_RSA_
27110 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  PKCS) {...CACKEY
27120 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27130 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
27140 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20  ->mechanism not 
27150 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d  specified as CKM
27160 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09  _RSA_PKCS");....
27170 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41  return(CKR_MECHA
27180 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c  NISM_PARAM_INVAL
27190 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ID);..}...if (hS
271a0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
271b0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
271c0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
271d0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
271e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
271f0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
27200 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27210 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
27220 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
27230 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
27240 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
27250 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
27260 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
27270 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
27280 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
27290 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
272a0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
272b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
272c0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
272d0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
272e0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
272f0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
27300 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
27310 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
27320 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
27330 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
27340 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
27350 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27360 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
27370 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
27380 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
27390 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
273a0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
273b0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
273c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
273d0 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
273e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
273f0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27400 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
27410 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27420 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64  or.  Sign alread
27430 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29  y in progress.")
27440 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
27450 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49  R_OPERATION_ACTI
27460 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b  VE);..}...if (hK
27470 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73  ey >= cackey_ses
27480 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27490 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
274a0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
274b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
274c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
274d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
274e0 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68  F("Error.  Key h
274f0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
27500 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65  ge (requested ke
27510 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20  y %lu, only %lu 
27520 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c  identities avail
27530 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e  able).", (unsign
27540 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28  ed long) hKey, (
27550 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
27560 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27570 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
27580 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  ies_count);....r
27590 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41  eturn(CKR_KEY_HA
275a0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
275b0 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
275c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
275d0 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  gn_active = 1;..
275e0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
275f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
27600 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63  mechanism = pMec
27610 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
27620 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  m;...cackey_sess
27630 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
27640 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38  ign_buflen = 128
27650 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
27660 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
27670 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09  n_bufused = 0;..
27680 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27690 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
276a0 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  uf = malloc(size
276b0 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
276c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
276d0 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
276e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
276f0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
27700 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
27710 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e  _PRINTF("Session
27720 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69   %lu sign_identi
27730 74 79 20 69 73 20 25 70 20 28 69 64 65 6e 74 69  ty is %p (identi
27740 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69  ty #%lu)", (unsi
27750 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73  gned long) hSess
27760 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26 63  ion, (void *) &c
27770 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27780 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
27790 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69  ies[hKey], (unsi
277a0 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29  gned long) hKey)
277b0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
277c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
277d0 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61  n_identity = &ca
277e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
277f0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
27800 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65  es[hKey];...mute
27810 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
27820 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
27830 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27840 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
27850 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
27860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27870 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
27880 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
27890 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
278a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
278b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
278c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
278d0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
278e0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
278f0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
27900 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
27910 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b  K_RV, C_Sign)(CK
27920 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
27930 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
27940 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
27950 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
27960 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
27970 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
27980 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75  G_PTR pulSignatu
27990 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e  reLen) {..unsign
279a0 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69  ed long start_si
279b0 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f  gn_bufused;..CK_
279c0 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e  RV sign_ret;..in
279d0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
279e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
279f0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
27a00 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
27a10 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
27a20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27a30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
27a40 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
27a50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27a60 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
27a70 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
27a80 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
27a90 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
27aa0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
27ab0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
27ac0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
27ad0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
27ae0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27af0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
27b00 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
27b10 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
27b20 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
27b30 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
27b40 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75  .start_sign_bufu
27b50 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  sed = cackey_ses
27b60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27b70 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
27b80 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67  sign_ret = C_Sig
27b90 6e 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e  nUpdate(hSession
27ba0 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c  , pData, ulDataL
27bb0 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72  en);..if (sign_r
27bc0 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
27bd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27be0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
27bf0 69 67 6e 55 70 64 61 74 65 28 29 20 72 65 74 75  ignUpdate() retu
27c00 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
27c10 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
27c20 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
27c30 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 73 69 67  ret);....if (sig
27c40 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46  n_ret != CKR_BUF
27c50 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
27c60 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
27c70 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
27c80 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27c90 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
27ca0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
27cb0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
27cc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27cd0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
27ce0 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
27cf0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
27d00 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  ROR);....}.....i
27d10 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
27d20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
27d30 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
27d40 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27d50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27d60 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
27d70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27d80 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
27d90 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
27da0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
27db0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
27dc0 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ID);....}.....if
27dd0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
27de0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
27df0 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  n_active) {.....
27e00 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
27e10 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27e20 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ck);......CACKEY
27e30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27e40 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20  rror.  Sign not 
27e50 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
27e60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
27e70 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
27e80 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09  ALIZED);....}...
27e90 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
27ea0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
27eb0 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
27ec0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
27ed0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
27ee0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27ef0 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
27f00 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
27f10 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
27f20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27f30 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
27f40 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
27f50 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
27f60 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  RROR);....}...}.
27f70 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
27f80 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72  et);..}...sign_r
27f90 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c  et = C_SignFinal
27fa0 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e  (hSession, pSign
27fb0 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74  ature, pulSignat
27fc0 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69  ureLen);..if (si
27fd0 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  gn_ret != CKR_OK
27fe0 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f 72  ) {...if (sign_r
27ff0 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52  et == CKR_BUFFER
28000 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
28010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28020 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c 28  INTF("SignFinal(
28030 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f 42  ) returned CKR_B
28040 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20  UFFER_TOO_SMALL 
28050 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f  (rv = %lu), undo
28060 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65  ing C_SignUpdate
28070 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ()", (unsigned l
28080 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
28090 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
280a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
280b0 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61  gn_bufused = sta
280c0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
280d0 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67 6e  .....return(sign
280e0 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  _ret);...}....CA
280f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28100 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46  F("Error.  SignF
28110 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
28120 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
28130 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
28140 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
28150 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
28160 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
28170 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c  Signature == NUL
28180 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
28190 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69 67  BUG_PRINTF("pSig
281a0 6e 61 74 75 72 65 20 73 70 65 63 69 66 69 65 64  nature specified
281b0 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e   as NULL, undoin
281c0 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29  g C_SignUpdate()
281d0 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65  ");....cackey_se
281e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
281f0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
28200 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
28210 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  ed;....return(si
28220 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41  gn_ret);..}...CA
28230 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28240 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
28250 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
28260 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
28270 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
28280 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
28290 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29  V, C_SignUpdate)
282a0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
282b0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
282c0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
282d0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
282e0 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  en) {..int mutex
282f0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
28300 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28310 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
28320 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
28330 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
28340 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28350 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
28360 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
28370 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
28380 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
28390 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
283a0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
283b0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
283c0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
283d0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
283e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
283f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28400 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28410 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
28420 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
28430 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
28440 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
28450 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  ID);..}...if (pP
28460 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
28470 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  lPartLen == 0) {
28480 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
28490 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
284a0 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68  ked to sign noth
284b0 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b  ing... */...CACK
284c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
284d0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
284e0 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
284f0 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
28500 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
28510 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  OK);..}...if (pP
28520 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
28530 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28540 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61  INTF("Error. pPa
28550 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20  rt is NULL, but 
28560 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  ulPartLen is not
28570 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
28580 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
28590 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
285a0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
285b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
285c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
285d0 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
285e0 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
285f0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
28600 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
28610 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
28620 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
28630 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
28640 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_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 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
28670 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28680 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
28690 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
286a0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
286b0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
286c0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
286d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
286e0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
286f0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28700 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
28710 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28720 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
28730 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
28740 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
28750 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
28760 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
28770 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
28780 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28790 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
287a0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
287b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
287c0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
287d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
287e0 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
287f0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
28800 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
28810 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
28820 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ZED);..}...switc
28830 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
28840 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
28850 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
28860 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
28870 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75  CS:..../* Accumu
28880 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f  late directly */
28890 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ....if ((cackey_
288a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
288b0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
288c0 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63  + ulPartLen) > c
288d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
288e0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
288f0 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b  flen) {.....cack
28900 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28910 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
28920 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63  n *= 2;......cac
28930 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28940 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
28950 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79  = realloc(cackey
28960 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28970 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69  on].sign_buf, si
28980 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73  zeof(*cackey_ses
28990 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
289a0 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b  sign_buf) * cack
289b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
289c0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
289d0 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  n);....}.....mem
289e0 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
289f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
28a00 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f  gn_buf + cackey_
28a10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28a20 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
28a30 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65   pPart, ulPartLe
28a40 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  n);.....cackey_s
28a50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28a60 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
28a70 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09  = ulPartLen;....
28a80 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74  .break;..}...mut
28a90 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
28aa0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28ab0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28ac0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
28ad0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
28ae0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28af0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
28b00 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
28b10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
28b20 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
28b30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28b40 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
28b50 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
28b60 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
28b70 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
28b80 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
28b90 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e  CK_RV, C_SignFin
28ba0 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
28bb0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
28bc0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
28bd0 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
28be0 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
28bf0 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20  eLen) {..static 
28c00 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31  CK_BYTE sigbuf[1
28c10 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73  024];..ssize_t s
28c20 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c  igbuflen;..CK_SL
28c30 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43  OT_ID slotID;..C
28c40 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
28c50 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
28c60 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f  ..int terminate_
28c70 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d  sign = 1;..int m
28c80 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
28c90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28ca0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
28cb0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
28cc0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
28cd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28ce0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
28cf0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
28d00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
28d10 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
28d20 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
28d30 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  (pulSignatureLen
28d40 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
28d50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28d60 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67  F("Error. pulSig
28d70 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c  natureLen is NUL
28d80 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
28d90 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
28da0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
28db0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
28dc0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
28dd0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
28de0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
28df0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
28e00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28e10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28e20 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
28e30 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
28e40 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
28e50 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
28e60 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
28e70 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
28e80 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
28e90 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
28ea0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
28eb0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
28ec0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28ed0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
28ee0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
28ef0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
28f00 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
28f10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28f20 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
28f30 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
28f40 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
28f50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
28f60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28f70 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
28f80 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
28f90 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28fa0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
28fb0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
28fc0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
28fd0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
28fe0 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
28ff0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
29000 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
29010 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
29020 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29030 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
29040 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
29050 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
29060 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
29070 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ED);..}...slotID
29080 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
29090 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
290a0 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
290b0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
290c0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
290d0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
290e0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
290f0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
29100 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29110 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
29120 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
29130 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
29140 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
29150 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
29160 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
29170 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
29180 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
29190 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
291a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
291b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
291c0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
291d0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
291e0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
291f0 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
29200 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
29210 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29220 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
29230 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
29240 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
29250 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
29260 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
29270 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  gn_mechanism) {.
29280 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
29290 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63  KCS:..../* Ask c
292a0 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09  ard to sign */..
292b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
292c0 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f  RINTF("Asking to
292d0 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74   sign from ident
292e0 69 74 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f  ity %p in sessio
292f0 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29  n %lu", (void *)
29300 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
29310 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
29320 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67  identity, (unsig
29330 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69  ned long) hSessi
29340 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65  on);....sigbufle
29350 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
29360 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
29370 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
29380 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29390 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
293a0 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65  ntity, cackey_se
293b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
293c0 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65  .sign_buf, cacke
293d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
293e0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
293f0 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f  d, sigbuf, sizeo
29400 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29  f(sigbuf), 1, 0)
29410 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66  ;.....if (sigbuf
29420 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f  len < 0) {...../
29430 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64  * Signing failed
29440 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67  . */.....if (sig
29450 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
29460 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
29470 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  N) {......retval
29480 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f   = CKR_USER_NOT_
29490 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d  LOGGED_IN;.....}
294a0 20 65 6c 73 65 20 69 66 20 28 73 69 67 62 75 66   else if (sigbuf
294b0 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
294c0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
294d0 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
294e0 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  = CKR_DEVICE_REM
294f0 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65  OVED;.....} else
29500 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
29510 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
29520 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  OR;.....}....} e
29530 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e  lse if (((unsign
29540 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c  ed long) sigbufl
29550 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74  en) > *pulSignat
29560 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61  ureLen && pSigna
29570 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53  ture) {...../* S
29580 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c  igned data too l
29590 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b  arge */.....CACK
295a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
295b0 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  "retval = CKR_BU
295c0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20  FFER_TOO_SMALL; 
295d0 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75   sigbuflen = %lu
295e0 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  , pulSignatureLe
295f0 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  n = %lu", (unsig
29600 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66  ned long) sigbuf
29610 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  len, (unsigned l
29620 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75  ong) *pulSignatu
29630 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74  reLen);......ret
29640 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
29650 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09  _TOO_SMALL;.....
29660 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
29670 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  = 0;....} else {
29680 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73  .....terminate_s
29690 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66  ign = 0;......if
296a0 20 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a   (pSignature) {.
296b0 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67  .....memcpy(pSig
296c0 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20  nature, sigbuf, 
296d0 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09  sigbuflen);.....
296e0 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  ..terminate_sign
296f0 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09   = 1;.....}.....
29700 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  .*pulSignatureLe
29710 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a  n = sigbuflen;..
29720 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
29730 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72  _OK;....}.....br
29740 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  eak;..}...if (te
29750 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a  rminate_sign) {.
29760 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
29770 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29780 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66  sign_buf) {....f
29790 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
297a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
297b0 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09  gn_buf);...}....
297c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
297d0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
297e0 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09  ctive = 0;..}...
297f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
29800 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
29810 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29820 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
29830 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
29840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29850 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
29860 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
29870 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29880 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
29890 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
298a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
298b0 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
298c0 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
298d0 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
298e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
298f0 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63  CK_RV, C_SignRec
29900 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53  overInit)(CK_SES
29910 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
29920 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
29930 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
29940 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
29950 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
29960 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29970 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
29980 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
29990 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
299a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
299b0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
299c0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
299d0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
299e0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
299f0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
29a00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29a10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
29a20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29a30 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
29a40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29a50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
29a60 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
29a70 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
29a80 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
29a90 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
29aa0 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45  gnRecover)(CK_SE
29ab0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
29ac0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
29ad0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
29ae0 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
29af0 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
29b00 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
29b10 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
29b20 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
29b30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
29b40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
29b50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
29b60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29b70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29b80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
29b90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29ba0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
29bb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
29bc0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
29bd0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29be0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
29bf0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
29c00 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
29c10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29c20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
29c30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29c40 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
29c50 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
29c60 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e  K_RV, C_VerifyIn
29c70 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
29c80 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
29c90 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
29ca0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
29cb0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
29cc0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
29cd0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
29ce0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
29cf0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
29d00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29d10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29d20 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
29d30 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29d40 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
29d50 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
29d60 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
29d70 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29d80 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
29d90 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
29da0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
29db0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29dc0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
29dd0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29de0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
29df0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
29e00 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28  K_RV, C_Verify)(
29e10 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
29e20 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
29e30 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
29e40 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
29e50 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
29e60 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
29e70 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
29e80 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
29e90 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
29ea0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
29eb0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
29ec0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29ed0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29ee0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
29ef0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29f00 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
29f10 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
29f20 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
29f30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29f40 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
29f50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
29f60 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
29f70 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29f80 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
29f90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29fa0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
29fb0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
29fc0 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70  K_RV, C_VerifyUp
29fd0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
29fe0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
29ff0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2a000 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2a010 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
2a020 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a030 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2a040 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2a050 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2a060 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a070 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2a080 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2a090 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2a0a0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2a0b0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2a0c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2a0d0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2a0e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a0f0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2a100 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a110 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2a120 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2a130 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2a140 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2a150 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
2a160 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ifyFinal)(CK_SES
2a170 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2a180 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2a190 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2a1a0 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
2a1b0 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  reLen) {..CACKEY
2a1c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2a1d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2a1e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2a1f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2a200 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a210 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2a220 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2a230 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2a240 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2a250 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2a260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2a270 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2a280 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a290 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2a2a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a2b0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2a2c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a2d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2a2e0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2a2f0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2a300 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b  yRecoverInit)(CK
2a310 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2a320 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2a330 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2a340 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2a350 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
2a360 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a370 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2a380 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2a390 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2a3a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a3b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2a3c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2a3d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2a3e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2a3f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2a400 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a410 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a420 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2a430 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2a440 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2a450 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2a460 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2a470 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a480 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2a490 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2a4a0 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 29  C_VerifyRecover)
2a4b0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2a4c0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2a4d0 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
2a4e0 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ure, CK_ULONG ul
2a4f0 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b  SignatureLen, CK
2a500 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2a510 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2a520 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  lDataLen) {..CAC
2a530 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a540 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2a550 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2a560 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2a570 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a580 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2a590 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2a5a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2a5b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2a5c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2a5d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a5e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2a5f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2a600 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2a610 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a620 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2a630 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2a640 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2a650 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2a660 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2a670 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74  gestEncryptUpdat
2a680 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2a690 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2a6a0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2a6b0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
2a6c0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
2a6d0 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
2a6e0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2a6f0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2a700 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2a710 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2a720 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2a730 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2a740 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a750 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a760 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2a770 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a780 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2a790 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2a7a0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2a7b0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a7c0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2a7d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2a7e0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2a7f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a800 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2a810 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a820 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2a830 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2a840 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44  K_RV, C_DecryptD
2a850 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
2a860 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2a870 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2a880 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
2a890 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2a8a0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2a8b0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2a8c0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2a8d0 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
2a8e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a8f0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2a900 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2a910 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2a920 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a930 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2a940 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2a950 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2a960 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2a970 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2a980 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a990 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a9a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2a9b0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2a9c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2a9d0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2a9e0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2a9f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2aa00 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2aa10 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2aa20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
2aa30 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2aa40 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2aa50 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2aa60 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
2aa70 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
2aa80 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
2aa90 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2aaa0 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
2aab0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2aac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2aad0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2aae0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2aaf0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2ab00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ab10 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2ab20 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2ab30 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2ab40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2ab50 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2ab60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2ab70 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2ab80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ab90 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2aba0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2abb0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2abc0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2abd0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2abe0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2abf0 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
2ac00 74 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43  tVerifyUpdate)(C
2ac10 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2ac20 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2ac30 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2ac40 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
2ac50 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2ac60 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2ac70 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
2ac80 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
2ac90 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2aca0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2acb0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2acc0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2acd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ace0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2acf0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2ad00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2ad10 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2ad20 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2ad30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ad40 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2ad50 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ad60 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2ad70 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2ad80 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2ad90 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2ada0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2adb0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2adc0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2add0 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29  , C_GenerateKey)
2ade0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2adf0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2ae00 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2ae10 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54  echanism, CK_ATT
2ae20 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
2ae30 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
2ae40 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
2ae50 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
2ae60 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2ae70 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2ae80 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2ae90 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2aea0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2aeb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2aec0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2aed0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2aee0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2aef0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2af00 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2af10 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2af20 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2af30 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2af40 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2af50 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2af60 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2af70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2af80 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2af90 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2afa0 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65  K_RV, C_Generate
2afb0 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53  KeyPair)(CK_SESS
2afc0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2afd0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2afe0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2aff0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
2b000 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d  TR pPublicKeyTem
2b010 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
2b020 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69  ulPublicKeyAttri
2b030 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54  buteCount, CK_AT
2b040 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 72 69  TRIBUTE_PTR pPri
2b050 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c  vateKeyTemplate,
2b060 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76   CK_ULONG ulPriv
2b070 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 65 43  ateKeyAttributeC
2b080 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
2b090 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62  HANDLE_PTR phPub
2b0a0 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  licKey, CK_OBJEC
2b0b0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50  T_HANDLE_PTR phP
2b0c0 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41  rivateKey) {..CA
2b0d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b0e0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2b0f0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2b100 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2b110 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b120 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2b130 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2b140 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2b150 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2b160 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2b170 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b180 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2b190 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2b1a0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2b1b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2b1c0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2b1d0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2b1e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2b1f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2b200 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57  CTION(CK_RV, C_W
2b210 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  rapKey)(CK_SESSI
2b220 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2b230 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2b240 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2b250 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2b260 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20  E hWrappingKey, 
2b270 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2b280 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50   hKey, CK_BYTE_P
2b290 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20  TR pWrappedKey, 
2b2a0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2b2b0 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b  WrappedKeyLen) {
2b2c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b2d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2b2e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2b2f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2b300 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b310 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2b320 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2b330 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2b340 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2b350 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2b360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b370 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2b380 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2b390 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2b3a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2b3b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2b3c0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2b3d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2b3e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2b3f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2b400 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b   C_UnwrapKey)(CK
2b410 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2b420 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2b430 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2b440 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2b450 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70  _HANDLE hUnwrapp
2b460 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f  ingKey, CK_BYTE_
2b470 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c  PTR pWrappedKey,
2b480 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70   CK_ULONG ulWrap
2b490 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54  pedKeyLen, CK_AT
2b4a0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
2b4b0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
2b4c0 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  ulAttributeCount
2b4d0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2b4e0 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a  LE_PTR phKey) {.
2b4f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b500 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2b510 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2b520 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2b530 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b540 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2b550 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2b560 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2b570 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2b580 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2b590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b5a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2b5b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2b5c0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2b5d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2b5e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2b5f0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2b600 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2b610 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2b620 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2b630 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f  C_DeriveKey)(CK_
2b640 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2b650 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2b660 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2b670 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2b680 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c  HANDLE hBaseKey,
2b690 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
2b6a0 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
2b6b0 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74  ULONG ulAttribut
2b6c0 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
2b6d0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
2b6e0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2b6f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2b700 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2b710 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2b720 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b730 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b740 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2b750 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2b760 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2b770 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2b780 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2b790 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2b7a0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2b7b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2b7c0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2b7d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2b7e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2b7f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2b800 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2b810 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2b820 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64  K_RV, C_SeedRand
2b830 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  om)(CK_SESSION_H
2b840 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2b850 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65  CK_BYTE_PTR pSee
2b860 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65  d, CK_ULONG ulSe
2b870 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  edLen) {..CACKEY
2b880 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2b890 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2b8a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2b8b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2b8c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b8d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2b8e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2b8f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2b900 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2b910 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2b920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2b930 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2b940 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2b950 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2b960 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2b970 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2b980 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2b990 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2b9a0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2b9b0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72  N(CK_RV, C_Gener
2b9c0 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45  ateRandom)(CK_SE
2b9d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2b9e0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2b9f0 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20  TR pRandomData, 
2ba00 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f  CK_ULONG ulRando
2ba10 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  mLen) {..CACKEY_
2ba20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2ba30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2ba40 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2ba50 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2ba60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ba70 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2ba80 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2ba90 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2baa0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2bab0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2bac0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2bad0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2bae0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2baf0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2bb00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2bb10 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2bb20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2bb30 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a  UPPORTED);.}../*
2bb40 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63   Deprecated Func
2bb50 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  tion */.CK_DEFIN
2bb60 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2bb70 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  , C_GetFunctionS
2bb80 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f  tatus)(CK_SESSIO
2bb90 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2bba0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2bbb0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2bbc0 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
2bbd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2bbe0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2bbf0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
2bc00 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2bc10 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
2bc20 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  L);...return(CKR
2bc30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
2bc40 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73  RALLEL);...hSess
2bc50 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20  ion = hSession; 
2bc60 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
2bc70 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
2bc80 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72  ng */.}../* Depr
2bc90 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20  ecated Function 
2bca0 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
2bcb0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
2bcc0 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43  ancelFunction)(C
2bcd0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2bce0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41   hSession) {..CA
2bcf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bd00 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2bd10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bd20 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2bd30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2bd40 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20  PARALLEL (%i)", 
2bd50 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2bd60 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65  _PARALLEL);...re
2bd70 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2bd80 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
2bd90 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53  ...hSession = hS
2bda0 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65  ession; /* Supre
2bdb0 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62  ss unused variab
2bdc0 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a  le warning */.}.
2bdd0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2bde0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
2bdf0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b  FunctionList)(CK
2be00 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50  _FUNCTION_LIST_P
2be10 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f  TR_PTR ppFunctio
2be20 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e  nList) {..CK_FUN
2be30 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70  CTION_LIST_PTR p
2be40 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
2be50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2be60 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2be70 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e  ..if (ppFunction
2be80 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
2be90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2bea0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70  RINTF("Error. pp
2beb0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20  FunctionList is 
2bec0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2bed0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2bee0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e  _BAD);..}...pFun
2bef0 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c  ctionList = mall
2bf00 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63  oc(sizeof(*pFunc
2bf10 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46  tionList));...pF
2bf20 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72  unctionList->ver
2bf30 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43  sion.major = ((C
2bf40 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
2bf50 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
2bf60 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75  16) & 0xff;..pFu
2bf70 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
2bf80 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41  ion.minor = ((CA
2bf90 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
2bfa0 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38  RSION_CODE) >> 8
2bfb0 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e  ) & 0xff;...pFun
2bfc0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
2bfd0 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74  tialize = C_Init
2bfe0 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ialize;..pFuncti
2bff0 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69  onList->C_Finali
2c000 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b  ze = C_Finalize;
2c010 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2c020 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47  >C_GetInfo = C_G
2c030 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  etInfo;..pFuncti
2c040 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
2c050 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f  tList = C_GetSlo
2c060 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tList;..pFunctio
2c070 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
2c080 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74  Info = C_GetSlot
2c090 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
2c0a0 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e  List->C_GetToken
2c0b0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65  Info = C_GetToke
2c0c0 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
2c0d0 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72  nList->C_WaitFor
2c0e0 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61  SlotEvent = C_Wa
2c0f0 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a  itForSlotEvent;.
2c100 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c110 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
2c120 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e  st = C_GetMechan
2c130 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  ismList;..pFunct
2c140 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65  ionList->C_GetMe
2c150 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f  chanismInfo = C_
2c160 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
2c170 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c180 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20  ->C_InitToken = 
2c190 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46  C_InitToken;..pF
2c1a0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
2c1b0 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50  nitPIN = C_InitP
2c1c0 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
2c1d0 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43  st->C_SetPIN = C
2c1e0 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  _SetPIN;..pFunct
2c1f0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53  ionList->C_OpenS
2c200 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53  ession = C_OpenS
2c210 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
2c220 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53  onList->C_CloseS
2c230 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65  ession = C_Close
2c240 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  Session;..pFunct
2c250 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65  ionList->C_Close
2c260 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f  AllSessions = C_
2c270 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
2c280 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c290 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  ->C_GetSessionIn
2c2a0 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f  fo = C_GetSessio
2c2b0 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
2c2c0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72  nList->C_GetOper
2c2d0 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47  ationState = C_G
2c2e0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
2c2f0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c300 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_SetOperation
2c310 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65  State = C_SetOpe
2c320 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
2c330 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c  unctionList->C_L
2c340 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a  ogin = C_Login;.
2c350 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c360 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67  C_Logout = C_Log
2c370 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  out;..pFunctionL
2c380 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a  ist->C_CreateObj
2c390 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62  ect = C_CreateOb
2c3a0 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
2c3b0 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65  List->C_CopyObje
2c3c0 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63  ct = C_CopyObjec
2c3d0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2c3e0 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  t->C_DestroyObje
2c3f0 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62  ct = C_DestroyOb
2c400 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
2c410 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63  List->C_GetObjec
2c420 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a  tSize = C_GetObj
2c430 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74  ectSize;..pFunct
2c440 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74  ionList->C_GetAt
2c450 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
2c460 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
2c470 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
2c480 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75  st->C_SetAttribu
2c490 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41  teValue = C_SetA
2c4a0 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
2c4b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2c4c0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
2c4d0 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
2c4e0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
2c4f0 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
2c500 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  cts = C_FindObje
2c510 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  cts;..pFunctionL
2c520 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
2c530 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64  tsFinal = C_Find
2c540 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70  ObjectsFinal;..p
2c550 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2c560 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f  EncryptInit = C_
2c570 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46  EncryptInit;..pF
2c580 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
2c590 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79  ncrypt = C_Encry
2c5a0 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  pt;..pFunctionLi
2c5b0 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64  st->C_EncryptUpd
2c5c0 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55  ate = C_EncryptU
2c5d0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
2c5e0 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
2c5f0 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70  Final = C_Encryp
2c600 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
2c610 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
2c620 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70  tInit = C_Decryp
2c630 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
2c640 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
2c650 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70   = C_Decrypt;..p
2c660 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2c670 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  DecryptUpdate = 
2c680 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b  C_DecryptUpdate;
2c690 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2c6a0 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20  >C_DecryptFinal 
2c6b0 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
2c6c0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c6d0 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d  ->C_DigestInit =
2c6e0 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09   C_DigestInit;..
2c6f0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2c700 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65  _Digest = C_Dige
2c710 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
2c720 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61  st->C_DigestUpda
2c730 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64  te = C_DigestUpd
2c740 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2c750 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79  ist->C_DigestKey
2c760 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a   = C_DigestKey;.
2c770 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c780 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20  C_DigestFinal = 
2c790 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09  C_DigestFinal;..
2c7a0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2c7b0 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69  _SignInit = C_Si
2c7c0 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  gnInit;..pFuncti
2c7d0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d  onList->C_Sign =
2c7e0 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74   C_Sign;..pFunct
2c7f0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55  ionList->C_SignU
2c800 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70  pdate = C_SignUp
2c810 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
2c820 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61  List->C_SignFina
2c830 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b  l = C_SignFinal;
2c840 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2c850 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e  >C_SignRecoverIn
2c860 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76  it = C_SignRecov
2c870 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  erInit;..pFuncti
2c880 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65  onList->C_SignRe
2c890 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65  cover = C_SignRe
2c8a0 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
2c8b0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49  nList->C_VerifyI
2c8c0 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e  nit = C_VerifyIn
2c8d0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
2c8e0 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43  st->C_Verify = C
2c8f0 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74  _Verify;..pFunct
2c900 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
2c910 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69  yUpdate = C_Veri
2c920 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
2c930 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
2c940 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69  fyFinal = C_Veri
2c950 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  fyFinal;..pFunct
2c960 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
2c970 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43  yRecoverInit = C
2c980 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
2c990 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
2c9a0 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f  st->C_VerifyReco
2c9b0 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65  ver = C_VerifyRe
2c9c0 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
2c9d0 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45  nList->C_DigestE
2c9e0 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
2c9f0 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
2ca00 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
2ca10 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44  List->C_DecryptD
2ca20 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f  igestUpdate = C_
2ca30 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
2ca40 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2ca50 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79  ist->C_SignEncry
2ca60 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67  ptUpdate = C_Sig
2ca70 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a  nEncryptUpdate;.
2ca80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2ca90 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
2caa0 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
2cab0 74 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09  tVerifyUpdate;..
2cac0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2cad0 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43  _GenerateKey = C
2cae0 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70  _GenerateKey;..p
2caf0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2cb00 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20  GenerateKeyPair 
2cb10 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  = C_GenerateKeyP
2cb20 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  air;..pFunctionL
2cb30 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d  ist->C_WrapKey =
2cb40 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75   C_WrapKey;..pFu
2cb50 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e  nctionList->C_Un
2cb60 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72  wrapKey = C_Unwr
2cb70 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  apKey;..pFunctio
2cb80 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b  nList->C_DeriveK
2cb90 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79  ey = C_DeriveKey
2cba0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2cbb0 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d  ->C_SeedRandom =
2cbc0 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09   C_SeedRandom;..
2cbd0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2cbe0 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20  _GenerateRandom 
2cbf0 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  = C_GenerateRand
2cc00 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  om;..pFunctionLi
2cc10 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
2cc20 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46  nStatus = C_GetF
2cc30 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09  unctionStatus;..
2cc40 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2cc50 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20  _CancelFunction 
2cc60 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  = C_CancelFuncti
2cc70 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
2cc80 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
2cc90 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e  nList = C_GetFun
2cca0 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70  ctionList;...*pp
2ccb0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70  FunctionList = p
2ccc0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
2ccd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cce0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2ccf0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2cd00 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2cd10 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a                 KR_OK);.}..