Hex Artifact Content

Artifact 0661f619debb98d747931b8679aff58ea768f800:


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 2c 20 73 74 61 74 65 2c 20 70 72 6f  _len, state, pro
110c0 74 6f 63 6f 6c 2c 20 61 74 72 5f 6c 65 6e 3b 0a  tocol, atr_len;.
110d0 09 42 59 54 45 20 61 74 72 5b 4d 41 58 5f 41 54  .BYTE atr[MAX_AT
110e0 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73  R_SIZE];..LONG s
110f0 74 61 74 75 73 5f 72 65 74 2c 20 73 63 61 72 64  tatus_ret, scard
11100 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43  _reconn_ret;...C
11110 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11120 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
11130 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72  .if (slot->inter
11140 6e 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  nal) {...CACKEY_
11150 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
11160 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72  turning token pr
11170 65 73 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20  esent (internal 
11180 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74  token)");....ret
11190 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
111a0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b  S_TOKENPRESENT);
111b0 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  ..}...pcsc_conne
111c0 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
111d0 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
111e0 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  t);..if (pcsc_co
111f0 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
11200 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
11210 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11220 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
11230 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
11240 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  d, returning tok
11250 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
11260 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
11270 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
11280 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c 65 6e 20  );..}...atr_len 
11290 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09  = sizeof(atr);..
112a0 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61  status_ret = SCa
112b0 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70  rdStatus(slot->p
112c0 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20  csc_card, NULL, 
112d0 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74  &reader_len, &st
112e0 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20  ate, &protocol, 
112f0 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a  atr, &atr_len);.
11300 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74  ..if (status_ret
11310 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e 56 41   == SCARD_E_INVA
11320 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09  LID_HANDLE) {...
11330 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11340 4e 54 46 28 22 53 43 61 72 64 53 74 61 74 75 73  NTF("SCardStatus
11350 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
11360 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44  D_E_INVALID_HAND
11370 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 69 73 20 6e  LE, marking is n
11380 6f 74 20 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65  ot already conne
11390 63 74 65 64 20 61 6e 64 20 74 72 79 69 6e 67 20  cted and trying 
113a0 61 67 61 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65  again");...cacke
113b0 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
113c0 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63  t(slot);....pcsc
113d0 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
113e0 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
113f0 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28  rd(slot);...if (
11400 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
11410 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
11420 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
11430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11440 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
11450 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
11460 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
11470 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t");.....return(
11480 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
11490 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a  KENABSENT);...}.
114a0 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a  ...atr_len = siz
114b0 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74  eof(atr);...stat
114c0 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
114d0 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
114e0 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
114f0 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
11500 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
11510 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a   &atr_len);..}..
11520 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
11530 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
11540 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  SS) {...cackey_m
11550 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
11560 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61  lot);....if (sta
11570 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  tus_ret == SCARD
11580 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b  _W_RESET_CARD) {
11590 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
115a0 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72  _PRINTF("Reset r
115b0 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20  equired, please 
115c0 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  hold...");.....s
115d0 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
115e0 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  = cackey_reconne
115f0 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43  ct_card(slot, SC
11600 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
11610 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
11620 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  _T1, &protocol);
11630 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65  ....if (scard_re
11640 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
11650 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
11660 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f  .../* Update pro
11670 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f  tocol */.....slo
11680 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72  t->protocol = pr
11690 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20  otocol;....../* 
116a0 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
116b0 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
116c0 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
116d0 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
116e0 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
116f0 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
11700 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
11710 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  th--;......slot-
11720 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
11730 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09  d_hw_lock = 1;..
11740 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  ....cackey_begin
11750 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
11760 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  t);.....}......C
11770 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11780 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73  TF("Reset succes
11790 73 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67  sful, requerying
117a0 22 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72  ");.....status_r
117b0 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
117c0 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
117d0 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
117e0 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
117f0 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
11800 72 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28  r_len);.....if (
11810 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43  status_ret != SC
11820 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
11830 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
11840 55 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c  UG_PRINTF("Still
11850 20 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79   unable to query
11860 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65   card status, re
11870 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
11880 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74  sent.  SCardStat
11890 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b  us() = %s", CACK
118a0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
118b0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74  ARDERR_TO_STR(st
118c0 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09  atus_ret));.....
118d0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
118e0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
118f0 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  NT);.....}....} 
11900 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
11910 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11920 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e  Unable to reconn
11930 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
11940 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
11950 65 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e  ent.  SCardRecon
11960 6e 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41  nect() = %s", CA
11970 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
11980 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
11990 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
119a0 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ));......return(
119b0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
119c0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d  KENABSENT);....}
119d0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
119e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
119f0 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75  TF("Unable to qu
11a00 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c  ery card status,
11a10 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
11a20 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53   absent.  SCardS
11a30 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43  tatus() = %s", C
11a40 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
11a50 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
11a60 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a  (status_ret));..
11a70 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
11a80 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
11a90 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ENT);...}..}...i
11aa0 66 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52  f ((state & SCAR
11ab0 44 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41  D_ABSENT) == SCA
11ac0 52 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43  RD_ABSENT) {...C
11ad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11ae0 54 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65  TF("Card is abse
11af0 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  nt, returning to
11b00 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09  ken absent");...
11b10 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
11b20 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
11b30 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  T);..}...CACKEY_
11b40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
11b50 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72  turning token pr
11b60 65 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75  esent.");...retu
11b70 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
11b80 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a  _TOKENPRESENT);.
11b90 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
11ba0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
11bb0 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
11bc0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
11bd0 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
11be0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
11bf0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
11c00 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
11c10 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  _t cackey_pcsc_i
11c20 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c  dentity_to_label
11c30 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
11c40 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  csc_identity *id
11c50 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
11c60 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66   char *label_buf
11c70 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
11c80 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b  label_buf_len) {
11c90 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
11ca0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
11cb0 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73  ..void *label_as
11cc0 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69  n1;..void *certi
11cd0 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30  ficate;..int x50
11ce0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65  9_read_ret;...ce
11cf0 72 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e  rtificate = iden
11d00 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
11d10 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f  e;..certificate_
11d20 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  len = identity->
11d30 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
11d40 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
11d50 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  te_len < 0) {...
11d60 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
11d70 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
11d80 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
11d90 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
11da0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28  rtificate_len, (
11db0 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f  void **) &label_
11dc0 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39  asn1);..if (x509
11dd0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
11de0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11df0 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65  }...x509_read_re
11e00 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73  t = x509_dn_to_s
11e10 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31  tring(label_asn1
11e20 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c  , x509_read_ret,
11e30 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f   (char *) label_
11e40 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  buf, label_buf_l
11e50 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28  en, "CN");..if (
11e60 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d  x509_read_ret <=
11e70 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61   0) {...x509_rea
11e80 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f  d_ret = x509_dn_
11e90 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f  to_string(label_
11ea0 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  asn1, x509_read_
11eb0 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61  ret, (char *) la
11ec0 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62  bel_buf, label_b
11ed0 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a  uf_len, NULL);..
11ee0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
11ef0 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72  ret <= 0) {....r
11f00 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
11f10 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
11f20 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
11f30 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
11f40 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65  MAX..if (x509_re
11f50 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f  ad_ret > _POSIX_
11f60 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
11f70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11f80 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65  TF("x509_read_re
11f90 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75  t exceeds maximu
11fa0 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69  m value, returni
11fb0 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28  ng in failure. (
11fc0 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f  max = %li, x509_
11fd0 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22  read_ret = %lu)"
11fe0 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
11ff0 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
12000 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f  gned long) x509_
12010 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65  read_ret);....re
12020 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
12030 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72  endif.#endif...r
12040 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f  eturn(x509_read_
12050 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  ret);.}../* Retu
12060 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
12070 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
12080 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61  ackey_mutex_crea
12090 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29  te(void **mutex)
120a0 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
120b0 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
120c0 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
120d0 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
120e0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
120f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12100 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
12110 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
12120 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
12130 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
12140 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
12150 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
12160 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28  _mutex = malloc(
12170 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f  sizeof(*pthread_
12180 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21  mutex));...if (!
12190 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b  pthread_mutex) {
121a0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
121b0 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
121c0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
121d0 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ry.");.....retur
121e0 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74  n(-1);...}....pt
121f0 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
12200 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
12210 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c  t(pthread_mutex,
12220 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74   NULL);...if (pt
12230 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
12240 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
12250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
12260 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28  read_mutex_init(
12270 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
12280 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
12290 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
122a0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
122b0 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61  .*mutex = pthrea
122c0 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65  d_mutex;..} else
122d0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
122e0 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
122f0 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
12300 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
12310 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d  gs.CreateMutex(m
12320 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
12330 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
12340 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
12350 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12360 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43  F("cackey_args.C
12370 72 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74  reateMutex() ret
12380 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69  urned error (%li
12390 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74  ).", (long) cust
123a0 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  om_retval);.....
123b0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
123c0 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  }...}..}...CACKE
123d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
123e0 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73  Returning sucess
123f0 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72  fully (0)");...r
12400 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
12410 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
12420 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
12430 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
12440 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78  lock(void *mutex
12450 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
12460 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
12470 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
12480 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
12490 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
124a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
124b0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
124c0 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
124d0 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
124e0 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
124f0 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
12500 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
12510 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b  d_mutex = mutex;
12520 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
12530 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
12540 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f  ex_lock(pthread_
12550 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74  mutex);...if (pt
12560 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
12570 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
12580 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
12590 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
125a0 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
125b0 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
125c0 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
125d0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
125e0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
125f0 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
12600 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
12610 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
12620 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28  _args.LockMutex(
12630 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
12640 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
12650 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
12660 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12670 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
12680 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75  LockMutex() retu
12690 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
126a0 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
126b0 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
126c0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
126d0 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
126e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
126f0 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
12700 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
12710 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
12720 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
12730 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
12740 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  t cackey_mutex_u
12750 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65  nlock(void *mute
12760 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  x) {..pthread_mu
12770 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d  tex_t *pthread_m
12780 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65  utex;..int pthre
12790 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ad_retval;..CK_R
127a0 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b  V custom_retval;
127b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
127c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
127d0 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79  );...if ((cackey
127e0 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b  _args.flags & CK
127f0 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
12800 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49   == CKF_OS_LOCKI
12810 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65  NG_OK) {...pthre
12820 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78  ad_mutex = mutex
12830 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  ;....pthread_ret
12840 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
12850 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65  tex_unlock(pthre
12860 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20  ad_mutex);...if 
12870 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  (pthread_retval 
12880 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
12890 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
128a0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
128b0 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20  lock() returned 
128c0 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
128d0 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
128e0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
128f0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
12900 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  f (cackey_args.U
12910 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09  nlockMutex) {...
12920 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d  .custom_retval =
12930 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c   cackey_args.Unl
12940 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ockMutex(mutex);
12950 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
12960 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
12970 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
12980 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
12990 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
129a0 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20  utex() returned 
129b0 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28  error (%li).", (
129c0 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74  long) custom_ret
129d0 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  val);......retur
129e0 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  n(-1);....}...}.
129f0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
12a00 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
12a10 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20  ing sucessfully 
12a20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  (0)");...return(
12a30 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b  0);.}..static CK
12a40 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63  _ATTRIBUTE_PTR c
12a50 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
12a60 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  utes(CK_OBJECT_C
12a70 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73  LASS objectclass
12a80 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  , struct cackey_
12a90 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69  pcsc_identity *i
12aa0 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
12ab0 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f  d long identity_
12ac0 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  num, CK_ULONG_PT
12ad0 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73  R pulCount) {..s
12ae0 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63  tatic CK_BBOOL c
12af0 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61  k_true = 1;..sta
12b00 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f  tic CK_BBOOL ck_
12b10 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74  false = 0;..stat
12b20 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74  ic CK_TRUST ck_t
12b30 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53  rusted = CK_TRUS
12b40 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09  TED_DELEGATOR;..
12b50 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72  CK_ULONG numattr
12b60 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f  s = 0, retval_co
12b70 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  unt;..CK_ATTRIBU
12b80 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74  TE_TYPE curr_att
12b90 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52  r_type;..CK_ATTR
12ba0 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c  IBUTE curr_attr,
12bb0 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f   *retval;..CK_VO
12bc0 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
12bd0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
12be0 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f  Len;..CK_OBJECT_
12bf0 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f  CLASS ck_object_
12c00 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49  class;..CK_CERTI
12c10 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63  FICATE_TYPE ck_c
12c20 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
12c30 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b  ..CK_KEY_TYPE ck
12c40 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55  _key_type;..CK_U
12c50 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66  TF8CHAR ucTmpBuf
12c60 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e  [1024];..SHA1Con
12c70 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09  text sha1_ctx;..
12c80 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b  MD5_CTX md5_ctx;
12c90 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68  ..uint8_t sha1_h
12ca0 61 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65  ash[SHA1HashSize
12cb0 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f  ];..uint8_t md5_
12cc0 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65  hash[MD5HashSize
12cd0 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ];..unsigned cha
12ce0 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a  r *certificate;.
12cf0 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69  .ssize_t certifi
12d00 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78  cate_len = -1, x
12d10 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69  509_read_ret;..i
12d20 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a  nt pValue_free;.
12d30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12d40 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f  RINTF("Called (o
12d50 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75  bjectClass = %lu
12d60 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d  , identity_num =
12d70 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
12d80 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63  ed long) objectc
12d90 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e  lass, identity_n
12da0 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  um);...*pulCount
12db0 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65   = 0;...if (obje
12dc0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
12dd0 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62  ERTIFICATE && ob
12de0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
12df0 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f  _PUBLIC_KEY && o
12e00 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
12e10 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26  O_PRIVATE_KEY &&
12e20 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
12e30 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
12e40 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ST) {...CACKEY_D
12e50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
12e60 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
12e70 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
12e80 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b   object class");
12e90 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
12ea0 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65  ;..}.../* Get Ce
12eb0 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74  rt */..if (ident
12ec0 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
12ed0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12ee0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
12ef0 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
12f00 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69  , invalid identi
12f10 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09  y provided");...
12f20 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
12f30 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20  }...certificate 
12f40 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
12f50 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66  ificate;..certif
12f60 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e  icate_len = iden
12f70 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
12f80 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72  e_len;...if (cer
12f90 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20  tificate_len == 
12fa0 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74  -1 || certificat
12fb0 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
12fc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12fd0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
12fe0 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
12ff0 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f  this identity do
13000 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58  es not have an X
13010 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
13020 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13030 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74   it and will not
13040 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75   work");....retu
13050 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
13060 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65  * Verify that ce
13070 72 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e  rtificate is ASN
13080 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39  .1 encoded X.509
13090 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
130a0 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72  .if (x509_to_ser
130b0 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c  ial(certificate,
130c0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
130d0 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09  , NULL) < 0) {..
130e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
130f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
13100 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
13110 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74  , the X.509 cert
13120 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
13130 65 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65  ed with this ide
13140 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c  ntity is not val
13150 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  id");....return(
13160 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76  NULL);..}...retv
13170 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09  al_count = 64;..
13180 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28  retval = malloc(
13190 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
131a0 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
131b0 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
131c0 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72  r_type = 0; curr
131d0 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63  _attr_type < 0xc
131e0 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74  e5363bf; curr_at
131f0 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69  tr_type++) {...i
13200 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  f (curr_attr_typ
13210 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09  e == 0x800) {...
13220 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  .curr_attr_type 
13230 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09  = 0xce536300;...
13240 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65  }....pValue_free
13250 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d   = 0;...pValue =
13260 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65   NULL;...ulValue
13270 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
13280 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  -1;....switch (c
13290 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b  urr_attr_type) {
132a0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  ....case CKA_CLA
132b0 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SS:.....CACKEY_D
132c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
132d0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
132e0 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25  e CKA_CLASS (0x%
132f0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
13300 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
13310 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
13320 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  ..ck_object_clas
13330 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b  s = objectclass;
13340 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
13350 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b  ck_object_class;
13360 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
13370 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65  = sizeof(ck_obje
13380 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09  ct_class);......
13390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
133a0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
133b0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
133c0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
133d0 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f  g) *((CK_OBJECT_
133e0 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29  CLASS *) pValue)
133f0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
13400 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
13410 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13420 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
13430 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  OKEN:.....CACKEY
13440 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13450 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
13460 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30  ute CKA_TOKEN (0
13470 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13480 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
13490 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
134a0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
134b0 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _true;.....ulVal
134c0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
134d0 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41  k_true);......CA
134e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
134f0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
13500 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
13510 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13520 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
13530 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
13540 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13550 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
13560 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
13570 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09  e CKA_PRIVATE:..
13580 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13590 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
135a0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
135b0 5f 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c  _PRIVATE (0x%08l
135c0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
135d0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
135e0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
135f0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
13600 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
13610 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
13620 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13630 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
13640 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
13650 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e  e we are not a N
13660 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
13670 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
13680 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
13690 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
136a0 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
136b0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
136c0 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
136d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
136e0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
136f0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
13700 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
13710 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
13720 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
13730 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
13740 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
13750 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
13760 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09  CKA_TRUSTED:....
13770 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13780 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
13790 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
137a0 52 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29  RUSTED (0x%08lx)
137b0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
137c0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
137d0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
137e0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
137f0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
13800 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
13810 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13820 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
13830 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
13840 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
13850 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
13860 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
13870 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65  ...}......pValue
13880 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
13890 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
138a0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
138b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
138c0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
138d0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
138e0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
138f0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
13900 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
13910 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
13920 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
13930 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
13940 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49  ...case CKA_MODI
13950 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b  FIABLE:.....CACK
13960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13970 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
13980 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49  ibute CKA_MODIFI
13990 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ABLE (0x%08lx) .
139a0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
139b0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
139c0 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
139d0 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
139e0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
139f0 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
13a00 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
13a10 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
13a20 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
13a30 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
13a40 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
13a50 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
13a60 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
13a70 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
13a80 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13a90 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c  k;....case CKA_L
13aa0 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABEL:.....CACKEY
13ab0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13ac0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
13ad0 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30  ute CKA_LABEL (0
13ae0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13af0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
13b00 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
13b10 09 09 09 09 2f 2a 20 58 58 58 3a 20 44 65 74 65  ..../* XXX: Dete
13b20 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09  rmine name */...
13b30 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
13b40 6e 70 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29  nprintf((char *)
13b50 20 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f   ucTmpBuf, sizeo
13b60 66 28 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64  f(ucTmpBuf), "Id
13b70 65 6e 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75  entity #%lu", (u
13b80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
13b90 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09  entity_num);....
13ba0 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42  .pValue = ucTmpB
13bb0 75 66 3b 0a 0a 09 09 09 09 69 66 20 28 75 6c 56  uf;......if (ulV
13bc0 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f  alueLen >= sizeo
13bd0 66 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09  f(ucTmpBuf)) {..
13be0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
13bf0 20 30 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20   0;......pValue 
13c00 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09  = NULL;.....}...
13c10 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13c20 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
13c30 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22  urning (%p/%lu)"
13c40 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
13c50 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
13c60 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13c70 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56  k;....case CKA_V
13c80 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ALUE:.....CACKEY
13c90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13ca0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
13cb0 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30  ute CKA_VALUE (0
13cc0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13cd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
13ce0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
13cf0 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65  ....switch (obje
13d00 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09  ctclass) {......
13d10 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45  case CKO_PRIVATE
13d20 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b  _KEY:.......CACK
13d30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13d40 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
13d50 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
13d60 20 77 65 20 61 72 65 20 61 20 70 72 69 76 61 74   we are a privat
13d70 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09  e key.");.......
13d80 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
13d90 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  e CKO_NETSCAPE_T
13da0 52 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b  RUST:.......CACK
13db0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13dc0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
13dd0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
13de0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
13df0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
13e00 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  );........break;
13e10 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50  ......case CKO_P
13e20 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09  UBLIC_KEY:......
13e30 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
13e40 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
13e50 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
13e60 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b  t = x509_to_pubk
13e70 65 79 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  ey(certificate, 
13e80 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
13e90 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
13ea0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
13eb0 72 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 09  ret < 0) { .....
13ec0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
13ed0 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65  L;........} else
13ee0 20 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61 6c   {.........ulVal
13ef0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
13f00 64 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a  d_ret;........}.
13f10 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 62  ......}........b
13f20 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
13f30 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a  CKO_CERTIFICATE:
13f40 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
13f50 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09  certificate;....
13f60 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
13f70 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
13f80 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
13f90 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
13fa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
13fb0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
13fc0 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
13fd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
13fe0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
13ff0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14000 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09  CKA_ISSUER:.....
14010 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14020 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
14030 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53  attribute CKA_IS
14040 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e  SUER (0x%08lx) .
14050 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
14060 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
14070 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
14080 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
14090 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26  O_CERTIFICATE &&
140a0 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
140b0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
140c0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
140d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
140e0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
140f0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
14100 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
14110 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73  tificate or Nets
14120 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
14130 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
14140 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
14150 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
14160 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
14170 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
14180 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72  09_to_issuer(cer
14190 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
141a0 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
141b0 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
141c0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
141d0 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
141e0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
141f0 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
14200 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
14210 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
14220 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
14230 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
14240 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
14250 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
14260 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
14270 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
14280 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14290 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45  CKA_SERIAL_NUMBE
142a0 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
142b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
142c0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
142d0 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
142e0 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ER (0x%08lx) ...
142f0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
14300 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
14310 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
14320 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
14330 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f  CERTIFICATE && o
14340 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
14350 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
14360 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
14370 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
14380 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
14390 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
143a0 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
143b0 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61  ficate or Netsca
143c0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
143d0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
143e0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
143f0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
14400 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
14410 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
14420 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69  _to_serial(certi
14430 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
14440 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
14450 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
14460 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
14470 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
14480 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
14490 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
144a0 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
144b0 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
144c0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
144d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
144e0 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
144f0 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
14500 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
14510 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
14520 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14530 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09  CKA_SUBJECT:....
14540 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14550 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
14560 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
14570 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29  UBJECT (0x%08lx)
14580 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
14590 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
145a0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
145b0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
145c0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29  CKO_CERTIFICATE)
145d0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
145e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
145f0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
14600 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
14610 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
14620 69 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 62  icate");.......b
14630 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
14640 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
14650 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
14660 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
14670 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63  = x509_to_subjec
14680 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  t(certificate, c
14690 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
146a0 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
146b0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
146c0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
146d0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
146e0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
146f0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
14700 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
14710 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
14720 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14730 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
14740 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
14750 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
14760 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
14770 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
14780 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09  case CKA_ID:....
14790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
147a0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
147b0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49   attribute CKA_I
147c0 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  D (0x%08lx) ..."
147d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
147e0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
147f0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
14800 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
14810 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
14820 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14830 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
14840 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
14850 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
14860 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
14870 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
14880 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
14890 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d  .....ucTmpBuf[0]
148a0 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75   = ((identity_nu
148b0 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30  m + 1) >> 8) & 0
148c0 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75  xff;.....ucTmpBu
148d0 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74  f[1] =  (identit
148e0 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66  y_num + 1) & 0xf
148f0 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  f;......pValue =
14900 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09   &ucTmpBuf;.....
14910 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a  ulValueLen = 2;.
14920 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14930 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
14940 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
14950 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
14960 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
14970 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
14980 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43  k;....case CKA_C
14990 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
149a0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
149b0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
149c0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
149d0 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  KA_CERTIFICATE_T
149e0 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPE (0x%08lx) ..
149f0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
14a00 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
14a10 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
14a20 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
14a30 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
14a40 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14a50 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
14a60 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
14a70 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
14a80 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
14a90 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  te.");.......bre
14aa0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
14ab0 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
14ac0 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74  t one certificat
14ad0 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b  e type */.....ck
14ae0 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
14af0 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a  e = CKC_X_509;..
14b00 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
14b10 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
14b20 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
14b30 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65  n = sizeof(ck_ce
14b40 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b  rtificate_type);
14b50 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14b60 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
14b70 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f  returning CKC_X_
14b80 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c  509 (%lu) (%p/%l
14b90 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
14ba0 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49  ong) *((CK_CERTI
14bb0 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70  FICATE_TYPE *) p
14bc0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
14bd0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14be0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
14bf0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
14c00 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09   CKA_KEY_TYPE:..
14c10 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14c20 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
14c30 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
14c40 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 38  _KEY_TYPE (0x%08
14c50 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
14c60 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
14c70 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
14c80 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
14c90 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  != CKO_PRIVATE_K
14ca0 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
14cb0 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  s != CKO_PUBLIC_
14cc0 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  KEY) {......CACK
14cd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14ce0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
14cf0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
14d00 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65   we are not a ke
14d10 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  y.");.......brea
14d20 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
14d30 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
14d40 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f   one key type */
14d50 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65  .....ck_key_type
14d60 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09   = CKK_RSA;.....
14d70 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65  .pValue = &ck_ke
14d80 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61  y_type;.....ulVa
14d90 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
14da0 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09  ck_key_type);...
14db0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14dc0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
14dd0 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28  urning CKK_RSA (
14de0 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20  %lu) (%p/%lu)", 
14df0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14e00 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54  *((CK_CERTIFICAT
14e10 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65  E_TYPE *) pValue
14e20 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
14e30 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
14e40 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
14e50 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
14e60 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  SIGN:.....CACKEY
14e70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14e80 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
14e90 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78  ute CKA_SIGN (0x
14ea0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
14eb0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
14ec0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
14ed0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
14ee0 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
14ef0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
14f00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14f10 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
14f20 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
14f30 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
14f40 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
14f50 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
14f60 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
14f70 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
14f80 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
14f90 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
14fa0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
14fb0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
14fc0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
14fd0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
14fe0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
14ff0 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
15000 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
15010 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
15020 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15030 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
15040 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
15050 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
15060 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
15070 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
15080 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
15090 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
150a0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
150b0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49  ;....case CKA_SI
150c0 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09  GN_RECOVER:.....
150d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
150e0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
150f0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49  attribute CKA_SI
15100 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30  GN_RECOVER (0x%0
15110 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
15120 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
15130 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
15140 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
15150 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
15160 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
15170 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15180 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
15190 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
151a0 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
151b0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
151c0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
151d0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
151e0 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   We currently on
151f0 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69 67 6e  ly support "Sign
15200 20 77 69 74 68 20 41 70 70 65 6e 64 69 78 22 20   with Appendix" 
15210 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  */.....pValue = 
15220 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75  &ck_false;.....u
15230 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
15240 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09  of(ck_false);...
15250 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15260 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
15270 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
15280 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
15290 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
152a0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
152b0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
152c0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
152d0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
152e0 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59  ..case CKA_DECRY
152f0 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PT:.....CACKEY_D
15300 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
15310 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
15320 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30  e CKA_DECRYPT (0
15330 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
15340 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
15350 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
15360 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
15370 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
15380 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
15390 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
153a0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
153b0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
153c0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
153d0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
153e0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
153f0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
15400 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
15410 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
15420 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61  KEY || objectcla
15430 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss == CKO_PUBLIC
15440 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61  _KEY) {......pVa
15450 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
15460 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
15470 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
15480 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
15490 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
154a0 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c  k_false;......ul
154b0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
154c0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09  f(ck_false);....
154d0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
154e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
154f0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
15500 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
15510 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
15520 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
15530 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
15540 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
15550 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
15560 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
15570 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 43  SENSITIVE:.....C
15580 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15590 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
155a0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 4e  ttribute CKA_SEN
155b0 53 49 54 49 56 45 20 28 30 78 25 30 38 6c 78 29  SITIVE (0x%08lx)
155c0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
155d0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
155e0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
155f0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15600 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
15610 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
15620 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15630 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
15640 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
15650 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
15660 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
15670 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
15680 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62  ...}......if (ob
15690 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
156a0 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a  _PRIVATE_KEY) {.
156b0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
156c0 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56  k_true;......ulV
156d0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
156e0 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d  (ck_true);.....}
156f0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61   else {......pVa
15700 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
15710 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
15720 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
15730 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
15740 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15750 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
15760 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
15770 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15780 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
15790 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
157a0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
157b0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
157c0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
157d0 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41  ase CKA_EXTRACTA
157e0 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BLE:.....CACKEY_
157f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15800 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
15810 74 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42  te CKA_EXTRACTAB
15820 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  LE (0x%08lx) ...
15830 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15840 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
15850 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
15860 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
15870 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
15880 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
15890 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
158a0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
158b0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
158c0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
158d0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
158e0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
158f0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
15900 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
15910 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09  VATE_KEY) {.....
15920 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
15930 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
15940 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
15950 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
15960 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
15970 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
15980 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
15990 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
159a0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
159b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
159c0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
159d0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
159e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
159f0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
15a00 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
15a10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
15a20 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
15a30 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
15a40 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09  CKA_MODULUS:....
15a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15a60 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
15a70 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d   attribute CKA_M
15a80 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29  ODULUS (0x%08lx)
15a90 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
15aa0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
15ab0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
15ac0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15ad0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
15ae0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
15af0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15b00 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
15b10 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
15b20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
15b30 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
15b40 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
15b50 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
15b60 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
15b70 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
15b80 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
15b90 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69  to_modulus(certi
15ba0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
15bb0 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
15bc0 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
15bd0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
15be0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
15bf0 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
15c00 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
15c10 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
15c20 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
15c30 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
15c40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
15c50 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
15c60 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
15c70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
15c80 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
15c90 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
15ca0 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
15cb0 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ENT:.....CACKEY_
15cc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15cd0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
15ce0 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58  te CKA_PUBLIC_EX
15cf0 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29  PONENT (0x%08lx)
15d00 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
15d10 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
15d20 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
15d30 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15d40 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
15d50 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
15d60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15d70 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
15d80 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
15d90 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
15da0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
15db0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
15dc0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
15dd0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
15de0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
15df0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
15e00 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74  to_exponent(cert
15e10 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
15e20 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
15e30 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
15e40 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
15e50 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
15e60 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
15e70 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
15e80 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
15e90 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
15ea0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
15eb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
15ec0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
15ed0 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
15ee0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15ef0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
15f00 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
15f10 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54   CKA_TRUST_DIGIT
15f20 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09  AL_SIGNATURE:...
15f30 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
15f40 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a  NON_REPUDIATION:
15f50 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
15f60 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d  ST_KEY_ENCIPHERM
15f70 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ENT:....case CKA
15f80 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49  _TRUST_DATA_ENCI
15f90 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73  PHERMENT:....cas
15fa0 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f  e CKA_TRUST_KEY_
15fb0 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61  AGREEMENT:....ca
15fc0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59  se CKA_TRUST_KEY
15fd0 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63  _CERT_SIGN:....c
15fe0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52  ase CKA_TRUST_CR
15ff0 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20  L_SIGN:....case 
16000 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52  CKA_TRUST_SERVER
16010 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43  _AUTH:....case C
16020 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f  KA_TRUST_CLIENT_
16030 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b  AUTH:....case CK
16040 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
16050 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 4b  NING:....case CK
16060 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52  A_TRUST_EMAIL_PR
16070 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41  OTECTION:.....CA
16080 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16090 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
160a0 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53  tribute CKA_TRUS
160b0 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 20  T_... (0x%08lx) 
160c0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
160d0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
160e0 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
160f0 75 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 64  ue = &ck_trusted
16100 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
16110 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
16120 73 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b  sted);......CACK
16130 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16140 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
16150 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
16160 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
16170 28 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 56  ((CK_TRUST *) pV
16180 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
16190 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
161a0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
161b0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
161c0 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41  CKA_CERT_SHA1_HA
161d0 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SH:.....CACKEY_D
161e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
161f0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
16200 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f  e CKA_CERT_SHA1_
16210 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e  HASH (0x%08lx) .
16220 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
16230 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
16240 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
16250 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
16260 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
16270 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
16280 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
16290 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
162a0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
162b0 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63   are not a Netsc
162c0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
162d0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
162e0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 31  .....}......SHA1
162f0 52 65 73 65 74 28 26 73 68 61 31 5f 63 74 78 29  Reset(&sha1_ctx)
16300 3b 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74 28  ;.....SHA1Input(
16310 26 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74 69  &sha1_ctx, certi
16320 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
16330 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48  ate_len);.....SH
16340 41 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f 63  A1Result(&sha1_c
16350 74 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b 0a  tx, sha1_hash);.
16360 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73 68  .....pValue = sh
16370 61 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56  a1_hash;.....ulV
16380 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
16390 28 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09  (sha1_hash);....
163a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
163b0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
163c0 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
163d0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
163e0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
163f0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
16400 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54  ...case CKA_CERT
16410 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 43  _MD5_HASH:.....C
16420 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16430 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
16440 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
16450 54 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25 30  T_MD5_HASH (0x%0
16460 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
16470 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
16480 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
16490 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
164a0 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
164b0 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
164c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
164d0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
164e0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
164f0 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
16500 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
16510 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
16520 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
16530 09 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f 63  ..MD5Init(&md5_c
16540 74 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 61  tx);.....MD5Upda
16550 74 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 72  te(&md5_ctx, cer
16560 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
16570 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09  icate_len);.....
16580 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73  MD5Final(md5_has
16590 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09  h, &md5_ctx);...
165a0 09 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f  ...pValue = md5_
165b0 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75  hash;.....ulValu
165c0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64  eLen = sizeof(md
165d0 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41  5_hash);......CA
165e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
165f0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
16600 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
16610 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
16620 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
16630 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64  .....break;....d
16640 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c  efault:.....pVal
16650 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75  ue = NULL;.....u
16660 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
16670 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72  LONG) -1;.....br
16680 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  eak;...}....if (
16690 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c  ((CK_LONG) ulVal
166a0 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c  ueLen) != ((CK_L
166b0 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f  ONG) -1)) {..../
166c0 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74 74 72  * Push curr_attr
166d0 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
166e0 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  */....curr_attr.
166f0 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72  type = curr_attr
16700 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61  _type;....curr_a
16710 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ttr.ulValueLen =
16720 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09   ulValueLen;....
16730 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75  .curr_attr.pValu
16740 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f  e = malloc(curr_
16750 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  attr.ulValueLen)
16760 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  ;....memcpy(curr
16770 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56  _attr.pValue, pV
16780 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e  alue, curr_attr.
16790 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
167a0 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65  .if (pValue_free
167b0 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09   && pValue) {...
167c0 09 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a  ..free(pValue);.
167d0 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d  ...}.....if (num
167e0 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f  attrs >= retval_
167f0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74  count) {.....ret
16800 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65  val = realloc(re
16810 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75  tval, retval_cou
16820 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
16830 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  val));....}.....
16840 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e  memcpy(&retval[n
16850 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f  umattrs], &curr_
16860 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72  attr, sizeof(cur
16870 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d  r_attr));....num
16880 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  attrs++;...}..}.
16890 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21  ..if (numattrs !
168a0 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f  = 0) {...retval_
168b0 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73  count = numattrs
168c0 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ;...retval = rea
168d0 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
168e0 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
168f0 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d  of(*retval));..}
16900 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72   else {...free(r
16910 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61  etval);....retva
16920 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a  l = NULL;..}...*
16930 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74  pulCount = numat
16940 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  trs;...CACKEY_DE
16950 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
16960 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74  rning %lu object
16970 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74  s (%p).", numatt
16980 72 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65 74  rs, (void *) ret
16990 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
169a0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
169b0 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
169c0 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74  ee_identities(st
169d0 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
169e0 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
169f0 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
16a00 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
16a10 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  ) {..CK_ATTRIBUT
16a20 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75  E *curr_attr;..u
16a30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f  nsigned long id_
16a40 69 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a  idx, attr_idx;..
16a50 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20  .if (identities 
16a60 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74  == NULL || ident
16a70 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30  ities_count == 0
16a80 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
16a90 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d  ...for (id_idx =
16aa0 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65   0; id_idx < ide
16ab0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69  ntities_count; i
16ac0 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  d_idx++) {...if 
16ad0 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
16ae0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20  dx].attributes) 
16af0 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69  {....for (attr_i
16b00 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78  dx = 0; attr_idx
16b10 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64   < identities[id
16b20 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
16b30 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78  _count; attr_idx
16b40 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61  ++) {.....curr_a
16b50 74 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65  ttr = &identitie
16b60 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
16b70 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a  utes[attr_idx];.
16b80 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74  .....if (curr_at
16b90 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09  tr->pValue) {...
16ba0 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 74  ...free(curr_att
16bb0 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  r->pValue);.....
16bc0 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69  }....}.....if (i
16bd0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
16be0 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a  ].attributes) {.
16bf0 09 09 09 09 66 72 65 65 28 69 64 65 6e 74 69 74  ....free(identit
16c00 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
16c10 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09  ibutes);....}...
16c20 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
16c30 72 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69  rts(identities[i
16c40 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
16c50 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d  tity, 1, 1);...}
16c60 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74  ..}...free(ident
16c70 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69  ities);.}..stati
16c80 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  c unsigned long 
16c90 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
16ca0 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63  identities(struc
16cb0 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
16cc0 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75  y *identities, u
16cd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f  nsigned long id_
16ce0 69 64 78 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  idx, unsigned lo
16cf0 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  ng num_dod_certs
16d00 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ) {..unsigned lo
16d10 6e 67 20 63 65 72 74 5f 69 64 78 3b 0a 0a 09 66  ng cert_idx;...f
16d20 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30  or (cert_idx = 0
16d30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d  ; cert_idx < num
16d40 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63 65 72 74  _dod_certs; cert
16d50 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 64 65 6e  _idx++) {...iden
16d60 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
16d70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e  csc_identity = N
16d80 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65  ULL;...identitie
16d90 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
16da0 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65  utes = cackey_ge
16db0 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f  t_attributes(CKO
16dc0 5f 43 45 52 54 49 46 49 43 41 54 45 2c 20 26 65  _CERTIFICATE, &e
16dd0 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f  xtra_certs[cert_
16de0 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63  idx], 0xf000 | c
16df0 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69  ert_idx, &identi
16e00 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
16e10 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a  ributes_count);.
16e20 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69  ..id_idx++;....i
16e30 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
16e40 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
16e50 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69  = NULL;...identi
16e60 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
16e70 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
16e80 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
16e90 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 2c 20  CKO_PUBLIC_KEY, 
16ea0 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72  &extra_certs[cer
16eb0 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c  t_idx], 0xf000 |
16ec0 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e   cert_idx, &iden
16ed0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
16ee0 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29  ttributes_count)
16ef0 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09  ;...id_idx++;...
16f00 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
16f10 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
16f20 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e  y = NULL;...iden
16f30 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
16f40 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b  ttributes = cack
16f50 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
16f60 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  s(CKO_NETSCAPE_T
16f70 52 55 53 54 2c 20 26 65 78 74 72 61 5f 63 65 72  RUST, &extra_cer
16f80 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78  ts[cert_idx], 0x
16f90 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c  f000 | cert_idx,
16fa0 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
16fb0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
16fc0 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78  count);...id_idx
16fd0 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ++;..}...return(
16fe0 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74  id_idx);.}..stat
16ff0 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
17000 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65  _identity *cacke
17010 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65  y_read_identitie
17020 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
17030 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
17040 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f 66  gned long *ids_f
17050 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63 74 20  ound) {..struct 
17060 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
17070 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
17080 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74 20 63  ities;..struct c
17090 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
170a0 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
170b0 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69  igned long num_i
170c0 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75 72 72  ds, id_idx, curr
170d0 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67  _id_type;..unsig
170e0 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72  ned long num_cer
170f0 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  ts, num_dod_cert
17100 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09 69 6e  s, cert_idx;..in
17110 74 20 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f  t include_extra_
17120 63 65 72 74 73 20 3d 20 30 3b 0a 0a 09 43 41 43  certs = 0;...CAC
17130 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17140 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
17150 66 20 28 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20  f (ids_found == 
17160 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
17170 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17180 72 72 6f 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64  rror.  ids_found
17190 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
171a0 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
171b0 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 43  .#ifdef CACKEY_C
171c0 41 52 44 5f 53 4c 4f 54 5f 49 4e 43 4c 55 44 45  ARD_SLOT_INCLUDE
171d0 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 6e  _EXTRA_CERTS..in
171e0 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
171f0 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 09  s = 1;.#endif...
17200 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
17210 45 59 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f  EY_DOD_CERTS_ON_
17220 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55  HW_SLOTS") != NU
17230 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  LL) {...include_
17240 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b  extra_certs = 1;
17250 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  ..}...if (getenv
17260 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f  ("CACKEY_NO_DOD_
17270 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54  CERTS_ON_HW_SLOT
17280 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  S") != NULL) {..
17290 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63  .include_extra_c
172a0 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  erts = 0;..}...i
172b0 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
172c0 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
172d0 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
172e0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  num_dod_certs = 
172f0 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6e  0;..} else {...n
17300 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 73  um_dod_certs = s
17310 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74  izeof(extra_cert
17320 73 29 20 2f 20 73 69 7a 65 6f 66 28 65 78 74 72  s) / sizeof(extr
17330 61 5f 63 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 0a  a_certs[0]);..}.
17340 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65  ..if (slot->inte
17350 72 6e 61 6c 29 20 7b 0a 09 09 6e 75 6d 5f 69 64  rnal) {...num_id
17360 73 20 3d 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  s = num_dod_cert
17370 73 3b 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64  s;....if (num_id
17380 73 20 21 3d 20 30 29 20 7b 0a 09 09 09 69 64 65  s != 0) {....ide
17390 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63  ntities = malloc
173a0 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f  (num_ids * sizeo
173b0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b  f(*identities));
173c0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64  .....cackey_read
173d0 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28  _dod_identities(
173e0 69 64 65 6e 74 69 74 69 65 73 2c 20 30 2c 20 6e  identities, 0, n
173f0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09  um_dod_certs);..
17400 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 64 65  .} else {....ide
17410 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ntities = NULL;.
17420 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e  ..}....*ids_foun
17430 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09  d = num_ids;....
17440 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65  return(identitie
17450 73 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64  s);..}...pcsc_id
17460 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
17470 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f  y_read_certs(slo
17480 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65  t, NULL, &num_ce
17490 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  rts);..if (pcsc_
174a0 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
174b0 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65  LL) {.../* Conve
174c0 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72  rt number of Cer
174d0 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20  ts to number of 
174e0 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d  objects */...num
174f0 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56  _ids = (CKO_PRIV
17500 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45  ATE_KEY - CKO_CE
17510 52 54 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a  RTIFICATE + 1) *
17520 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69   num_certs;....i
17530 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  f (include_extra
17540 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 6e 75 6d  _certs) {....num
17550 5f 69 64 73 20 2b 3d 20 6e 75 6d 5f 64 6f 64 5f  _ids += num_dod_
17560 63 65 72 74 73 3b 0a 09 09 7d 0a 0a 09 09 69 64  certs;...}....id
17570 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f  entities = mallo
17580 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65  c(num_ids * size
17590 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29  of(*identities))
175a0 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63 65 72 74  ;..../* Add cert
175b0 69 66 69 63 61 74 65 73 2c 20 70 75 62 6c 69 63  ificates, public
175c0 20 6b 65 79 73 2c 20 61 6e 64 20 70 72 69 76 61   keys, and priva
175d0 74 65 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65  te keys from the
175e0 20 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a 09 09   smartcard */...
175f0 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f  id_idx = 0;...fo
17600 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b  r (cert_idx = 0;
17610 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f   cert_idx < num_
17620 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b  certs; cert_idx+
17630 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28 63 75 72  +) {....for (cur
17640 72 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f  r_id_type = CKO_
17650 43 45 52 54 49 46 49 43 41 54 45 3b 20 63 75 72  CERTIFICATE; cur
17660 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f  r_id_type <= CKO
17670 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b 20 63 75  _PRIVATE_KEY; cu
17680 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a  rr_id_type++) {.
17690 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
176a0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
176b0 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  s = cackey_get_a
176c0 74 74 72 69 62 75 74 65 73 28 63 75 72 72 5f 69  ttributes(curr_i
176d0 64 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69 64  d_type, &pcsc_id
176e0 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
176f0 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26 69  x], cert_idx, &i
17700 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
17710 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
17720 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69  nt);......identi
17730 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
17740 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c  c_identity = mal
17750 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e  loc(sizeof(*iden
17760 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
17770 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a  csc_identity));.
17780 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74  ....memcpy(ident
17790 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
177a0 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63  sc_identity, &pc
177b0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
177c0 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28  rt_idx], sizeof(
177d0 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  *identities[id_i
177e0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
177f0 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69  y));......identi
17800 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
17810 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  c_identity->cert
17820 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63  ificate = malloc
17830 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
17840 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
17850 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
17860 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69  .memcpy(identiti
17870 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
17880 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
17890 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e  icate, pcsc_iden
178a0 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d  tities[cert_idx]
178b0 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63  .certificate, pc
178c0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
178d0 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
178e0 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69  ate_len);......i
178f0 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09  d_idx++;....}...
17900 7d 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65  }....if (include
17910 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a  _extra_certs) {.
17920 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17930 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e  PRINTF("Includin
17940 67 20 44 6f 44 20 43 65 72 74 69 66 69 63 61 74  g DoD Certificat
17950 65 73 20 6f 6e 20 68 61 72 64 77 61 72 65 20 73  es on hardware s
17960 6c 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  lot");.....cacke
17970 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74  y_read_dod_ident
17980 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 73  ities(identities
17990 2c 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f  , id_idx, num_do
179a0 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09  d_certs);...}...
179b0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
179c0 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ts(pcsc_identiti
179d0 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31  es, num_certs, 1
179e0 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64  );....*ids_found
179f0 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72   = num_ids;....r
17a00 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73  eturn(identities
17a10 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f 66 6f  );..}....*ids_fo
17a20 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  und = 0;..return
17a30 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  (NULL);.}..CK_DE
17a40 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
17a50 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a  _RV, C_Initializ
17a60 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
17a70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f  InitArgs) {..CK_
17a80 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47  C_INITIALIZE_ARG
17a90 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09  S CK_PTR args;..
17aa0 75 69 6e 74 33 32 5f 74 20 69 64 78 2c 20 68 69  uint32_t idx, hi
17ab0 67 68 65 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74  ghest_slot;..int
17ac0 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b   mutex_init_ret;
17ad0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17ae0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
17af0 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
17b00 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
17b10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17b20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c  INTF("Error.  Al
17b30 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65  ready initialize
17b40 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
17b50 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52  CKR_CRYPTOKI_ALR
17b60 45 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44  EADY_INITIALIZED
17b70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69  );..}...if (pIni
17b80 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  tArgs != NULL) {
17b90 0a 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41  ...args = pInitA
17ba0 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63  rgs;...memcpy(&c
17bb0 61 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73  ackey_args, args
17bc0 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  , sizeof(cackey_
17bd0 61 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61  args));....if (a
17be0 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78  rgs->CreateMutex
17bf0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
17c00 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d  ->DestroyMutex =
17c10 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
17c20 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  LockMutex == NUL
17c30 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63  L || args->Unloc
17c40 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20  kMutex == NULL) 
17c50 7b 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43  {....if (args->C
17c60 72 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55  reateMutex != NU
17c70 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74  LL || args->Dest
17c80 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  royMutex != NULL
17c90 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75   || args->LockMu
17ca0 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
17cb0 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78  rgs->UnlockMutex
17cc0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
17cd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17ce0 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65  NTF("Error. Some
17cf0 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68  , but not All th
17d00 72 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76  reading primitiv
17d10 65 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a  es provided.");.
17d20 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
17d30 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
17d40 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  ...}...}..} else
17d50 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73   {...cackey_args
17d60 2e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e  .CreateMutex = N
17d70 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
17d80 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20  gs.DestroyMutex 
17d90 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
17da0 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20  _args.LockMutex 
17db0 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
17dc0 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
17dd0 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
17de0 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20  ey_args.flags = 
17df0 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  0;..}...for (idx
17e00 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
17e10 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
17e20 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
17e30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
17e40 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63  )); idx++) {...c
17e50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
17e60 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
17e70 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
17e80 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
17e90 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
17ea0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
17eb0 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  lots[0])); idx++
17ec0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ) {...cackey_slo
17ed0 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ts[idx].active =
17ee0 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
17ef0 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
17f00 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  der = NULL;...ca
17f10 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
17f20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
17f30 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  h = 0;...cackey_
17f40 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
17f50 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
17f60 6f 63 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  ock = 0;...cacke
17f70 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f  y_slots[idx].slo
17f80 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63  t_reset = 0;...c
17f90 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
17fa0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30  .token_flags = 0
17fb0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
17fc0 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55  [idx].label = NU
17fd0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  LL;...cackey_slo
17fe0 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c  ts[idx].internal
17ff0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 67   = 0;..}...if (g
18000 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f  etenv("CACKEY_NO
18010 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21  _EXTRA_CERTS") !
18020 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
18030 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18040 22 41 73 6b 65 64 20 6e 6f 74 20 74 6f 20 69 6e  "Asked not to in
18050 63 6c 75 64 65 20 44 6f 44 20 63 65 72 74 69 66  clude DoD certif
18060 69 63 61 74 65 73 22 29 3b 0a 09 7d 20 65 6c 73  icates");..} els
18070 65 20 7b 0a 09 09 68 69 67 68 65 73 74 5f 73 6c  e {...highest_sl
18080 6f 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  ot = (sizeof(cac
18090 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
180a0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
180b0 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a 09 09 43 41  [0])) - 1;....CA
180c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
180d0 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44  F("Including DoD
180e0 20 63 65 72 74 73 20 69 6e 20 73 6c 6f 74 20 25   certs in slot %
180f0 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
18100 6f 6e 67 29 20 68 69 67 68 65 73 74 5f 73 6c 6f  ong) highest_slo
18110 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c  t);....cackey_sl
18120 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
18130 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09  ].active = 1;...
18140 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67  cackey_slots[hig
18150 68 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72  hest_slot].inter
18160 6e 61 6c 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65  nal = 1;...cacke
18170 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f  y_slots[highest_
18180 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 28 75  slot].label = (u
18190 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
181a0 22 44 6f 44 20 43 65 72 74 69 66 69 63 61 74 65  "DoD Certificate
181b0 73 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  s";...cackey_slo
181c0 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
181d0 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 22  .pcsc_reader = "
181e0 43 41 43 4b 65 79 22 3b 0a 09 09 63 61 63 6b 65  CACKey";...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 74 6f 6b 65 6e 5f 66 6c 61 67  slot].token_flag
18210 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b  s = 0;..}...cack
18220 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
18230 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65   1;...if (!cacke
18240 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20  y_biglock_init) 
18250 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72  {...mutex_init_r
18260 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  et = cackey_mute
18270 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79  x_create(&cackey
18280 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66  _biglock);....if
18290 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74   (mutex_init_ret
182a0 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
182b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
182c0 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69  "Error.  Mutex i
182d0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61  nitialization fa
182e0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74  iled.");.....ret
182f0 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43  urn(CKR_CANT_LOC
18300 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  K);...}....cacke
18310 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
18320 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f   1;..}...CACKEY_
18330 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
18340 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
18350 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
18360 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
18370 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
18380 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
18390 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  Finalize)(CK_VOI
183a0 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
183b0 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
183c0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
183d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
183e0 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
183f0 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
18400 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18410 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
18420 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
18430 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
18440 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
18450 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
18460 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
18470 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
18480 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18490 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
184a0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
184b0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
184c0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
184d0 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
184e0 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
184f0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
18500 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
18510 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
18520 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
18530 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
18540 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
18550 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  ...C_CloseSessio
18560 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  n(idx);...}..}..
18570 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
18580 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
18590 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
185a0 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
185b0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
185c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
185d0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
185e0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
185f0 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61  ots[idx].interna
18600 6c 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65  l) {....continue
18610 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
18620 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
18630 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09  csc_reader) {...
18640 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
18650 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
18660 64 65 72 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63  der);...}..}...c
18670 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
18680 6e 6e 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65  nnect();...cacke
18690 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  y_initialized = 
186a0 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  0;...CACKEY_DEBU
186b0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
186c0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
186d0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
186e0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
186f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
18700 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49  ON(CK_RV, C_GetI
18710 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52  nfo)(CK_INFO_PTR
18720 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69   pInfo) {..stati
18730 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61  c CK_UTF8CHAR ma
18740 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d  nufacturerID[] =
18750 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e   "U.S. Governmen
18760 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  t";..static CK_U
18770 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 79 44  TF8CHAR libraryD
18780 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22  escription[] = "
18790 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45  CACKey";...CACKE
187a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
187b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
187c0 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
187d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
187e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
187f0 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
18800 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
18810 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
18820 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
18830 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
18840 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18850 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
18860 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
18870 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18880 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
18890 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
188a0 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69  .pInfo->cryptoki
188b0 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
188c0 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
188d0 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
188e0 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
188f0 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56  pInfo->cryptokiV
18900 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
18910 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
18920 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
18930 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d  > 8) & 0xff;...m
18940 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emset(pInfo->man
18950 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27  ufacturerID, ' '
18960 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
18970 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29  manufacturerID))
18980 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
18990 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
189a0 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c   manufacturerID,
189b0 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74   sizeof(manufact
189c0 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09  urerID) - 1);...
189d0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30  pInfo->flags = 0
189e0 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49  x00;...memset(pI
189f0 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63  nfo->libraryDesc
18a00 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69  ription, ' ', si
18a10 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  zeof(pInfo->libr
18a20 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 29  aryDescription))
18a30 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
18a40 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  >libraryDescript
18a50 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73 63  ion, libraryDesc
18a60 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28  ription, sizeof(
18a70 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
18a80 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66  on) - 1);...pInf
18a90 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f  o->libraryVersio
18aa0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
18ab0 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
18ac0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
18ad0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72  Info->libraryVer
18ae0 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61  sion.minor = (ca
18af0 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
18b00 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
18b10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18b20 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
18b30 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
18b40 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
18b50 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  (CKR_OK);.}../*.
18b60 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74 20   * Process list 
18b70 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64 20  of readers, and 
18b80 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20 62  create mapping b
18b90 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e 61  etween reader na
18ba0 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20  me and slot ID. 
18bb0 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
18bc0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
18bd0 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42  etSlotList)(CK_B
18be0 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e  BOOL tokenPresen
18bf0 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54  t, CK_SLOT_ID_PT
18c00 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f  R pSlotList, CK_
18c10 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75  ULONG_PTR pulCou
18c20 6e 74 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  nt) {..int mutex
18c30 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63  _retval;..int pc
18c40 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a  sc_connect_ret;.
18c50 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c  .CK_ULONG count,
18c60 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c   slot_count = 0,
18c70 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f   currslot, slot_
18c80 69 64 78 3b 0a 09 63 68 61 72 20 2a 70 63 73 63  idx;..char *pcsc
18c90 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f  _readers, *pcsc_
18ca0 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63  readers_s, *pcsc
18cb0 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f  _readers_e;..DWO
18cc0 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f  RD pcsc_readers_
18cd0 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
18ce0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
18cf0 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72  ;..size_t curr_r
18d00 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43  eader_len;...CAC
18d10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18d20 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
18d30 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
18d40 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
18d50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18d60 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73  ror. pulCount is
18d70 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
18d80 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
18d90 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
18da0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
18db0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
18dc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18dd0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
18de0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
18df0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
18e00 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
18e10 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
18e20 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
18e30 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
18e40 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
18e50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
18e60 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
18e70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18e80 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
18e90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
18ea0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
18eb0 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65  OR);..}.../* Cle
18ec0 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  ar list of slots
18ed0 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69   */..if (pSlotLi
18ee0 73 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  st) {...CACKEY_D
18ef0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72  EBUG_PRINTF("Pur
18f00 67 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e  ging all slot in
18f10 66 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09  formation.");...
18f20 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20  ./* Only update 
18f30 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  the list of slot
18f40 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75  s if we are actu
18f50 61 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c  ally being suppl
18f60 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72  y the slot infor
18f70 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  mation */...cack
18f80 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
18f90 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f  ect_all();....fo
18fa0 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
18fb0 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
18fc0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
18fd0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
18fe0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
18ff0 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69  rrslot++) {....i
19000 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
19010 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
19020 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  al) {.....contin
19030 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ue;....}.....if 
19040 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
19050 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
19060 64 65 72 29 20 7b 0a 09 09 09 09 66 72 65 65 28  der) {.....free(
19070 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
19080 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
19090 65 72 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  er);......cackey
190a0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
190b0 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e  .pcsc_reader = N
190c0 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ULL;....}.....if
190d0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
190e0 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20  urrslot].label) 
190f0 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b 65  {.....free(cacke
19100 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
19110 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09 63  ].label);......c
19120 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
19130 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55  slot].label = NU
19140 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  LL;....}.....cac
19150 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
19160 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  ot].active = 0;.
19170 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  ..}..}.../* Dete
19180 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65  rmine list of re
19190 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63  aders */..pcsc_c
191a0 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
191b0 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
191c0 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  ();..if (pcsc_co
191d0 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
191e0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
191f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19200 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69  PRINTF("Connecti
19210 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c  on to PC/SC fail
19220 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  ed, assuming no 
19230 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74  slots");....slot
19240 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65  _count = 0;..} e
19250 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61  lse {...pcsc_rea
19260 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09  ders_len = 0;...
19270 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  .scard_listreade
19280 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69  rs_ret = SCardLi
19290 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65  stReaders(*cacke
192a0 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e  y_pcsc_handle, N
192b0 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63  ULL, NULL, &pcsc
192c0 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a  _readers_len);..
192d0 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74  ..if (scard_list
192e0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53  readers_ret == S
192f0 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f  CARD_F_COMM_ERRO
19300 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  R) {....CACKEY_D
19310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19320 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61  or. SCardListRea
19330 64 65 72 73 28 29 20 72 65 74 75 72 6e 65 64 20  ders() returned 
19340 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52  SCARD_F_COMM_ERR
19350 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e  OR, assuming Con
19360 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43  nection to PC/SC
19370 20 77 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f   went away. Reco
19380 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09  nnecting.");....
19390 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73  .cackey_pcsc_dis
193a0 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61  connect();....ca
193b0 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
193c0 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  t();.....CACKEY_
193d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72  DEBUG_PRINTF("Tr
193e0 79 69 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65  ying SCardListRe
193f0 61 64 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b  aders() again");
19400 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65  ....scard_listre
19410 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72  aders_ret = SCar
19420 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61  dListReaders(*ca
19430 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
19440 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70  , NULL, NULL, &p
19450 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
19460 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61  ;...}....if (sca
19470 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
19480 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
19490 43 43 45 53 53 20 26 26 20 70 63 73 63 5f 72 65  CCESS && pcsc_re
194a0 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20  aders_len != 0) 
194b0 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  {....pcsc_reader
194c0 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f  s = malloc(pcsc_
194d0 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09  readers_len);...
194e0 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20  .pcsc_readers_s 
194f0 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a  = pcsc_readers;.
19500 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65  ....scard_listre
19510 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72  aders_ret = SCar
19520 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61  dListReaders(*ca
19530 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
19540 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61  , NULL, pcsc_rea
19550 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64  ders, &pcsc_read
19560 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20  ers_len);....if 
19570 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
19580 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  rs_ret == SCARD_
19590 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
195a0 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20  .pcsc_readers_e 
195b0 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  = pcsc_readers +
195c0 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65   pcsc_readers_le
195d0 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74  n;....../* Start
195e0 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c   with Slot ID 1,
195f0 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20   to avoid a bug 
19600 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a  in GDM on RHEL *
19610 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34  /...../* Bug 594
19620 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67  911: https://bug
19630 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d  zilla.redhat.com
19640 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64  /show_bug.cgi?id
19650 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63  =594911 */.....c
19660 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09  urrslot = 1;....
19670 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b  .slot_count = 0;
19680 0a 09 09 09 09 77 68 69 6c 65 20 28 70 63 73 63  .....while (pcsc
19690 5f 72 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f  _readers < pcsc_
196a0 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09  readers_e) {....
196b0 09 09 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20 61  ../* Find next a
196c0 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f  vailable slot */
196d0 0a 09 09 09 09 09 66 6f 72 20 28 3b 20 63 75 72  ......for (; cur
196e0 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
196f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
19700 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
19710 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
19720 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69 66  ot++) {.......if
19730 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   (!cackey_slots[
19740 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
19750 29 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b  ) {........break
19760 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
19770 0a 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61 64  .......curr_read
19780 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  er_len = strlen(
19790 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a  pcsc_readers);..
197a0 09 09 09 09 09 69 66 20 28 28 70 63 73 63 5f 72  .....if ((pcsc_r
197b0 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65  eaders + curr_re
197c0 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63  ader_len) > pcsc
197d0 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09  _readers_e) {...
197e0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
197f0 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72  }.......if (curr
19800 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30  _reader_len == 0
19810 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  ) {.......break;
19820 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66  ......}.......if
19830 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73   (currslot >= (s
19840 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
19850 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
19860 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
19870 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  {.......CACKEY_D
19880 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
19890 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20  nd more readers 
198a0 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61  than slots are a
198b0 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09  vailable!");....
198c0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
198d0 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44  }.......CACKEY_D
198e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
198f0 6e 64 20 72 65 61 64 65 72 3a 20 25 73 22 2c 20  nd reader: %s", 
19900 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a  pcsc_readers);..
19910 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64  ...../* Only upd
19920 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ate the list of 
19930 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20  slots if we are 
19940 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61  actually being a
19950 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20  sked supply the 
19960 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
19970 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c   */......if (pSl
19980 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09  otList) {.......
19990 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
199a0 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20  rslot].active = 
199b0 31 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  1;.......cackey_
199c0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
199d0 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 09  internal = 0;...
199e0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
199f0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
19a00 72 65 61 64 65 72 20 3d 20 73 74 72 64 75 70 28  reader = strdup(
19a10 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 09  pcsc_readers);..
19a20 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
19a30 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
19a40 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
19a50 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65  = 0;.......cacke
19a60 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
19a70 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ].transaction_de
19a80 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09 63  pth = 0;.......c
19a90 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
19aa0 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f  slot].transactio
19ab0 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
19ac0 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79   0;.......cackey
19ad0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
19ae0 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b  .slot_reset = 1;
19af0 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
19b00 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f  ots[currslot].to
19b10 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
19b20 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
19b30 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
19b40 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
19b50 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  el = NULL;......
19b60 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
19b70 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79  ot_reset(&cackey
19b80 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
19b90 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  );......} else {
19ba0 0a 09 09 09 09 09 09 2f 2a 20 41 72 74 69 66 69  ......./* Artifi
19bb0 63 69 61 6c 6c 79 20 69 6e 63 72 65 61 73 65 20  cially increase 
19bc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 63  the number of ac
19bd0 74 69 76 65 20 73 6c 6f 74 73 20 62 79 20 77 68  tive slots by wh
19be0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  at will become a
19bf0 63 74 69 76 65 20 2a 2f 0a 09 09 09 09 09 09 73  ctive */.......s
19c00 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09  lot_count++;....
19c10 09 09 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f  ..}......currslo
19c20 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f  t++;.......pcsc_
19c30 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f  readers += curr_
19c40 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a  reader_len + 1;.
19c50 09 09 09 09 7d 0a 0a 09 09 09 09 66 6f 72 20 28  ....}......for (
19c60 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
19c70 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
19c80 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
19c90 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
19ca0 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
19cb0 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66  lot++) {......if
19cc0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
19cd0 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
19ce0 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
19cf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
19d00 75 6e 64 20 61 63 74 69 76 65 20 73 6c 6f 74 20  und active slot 
19d10 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
19d20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b  long) currslot);
19d30 0a 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75  ........slot_cou
19d40 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  nt++;......}....
19d50 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  .}....} else {..
19d60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19d70 50 52 49 4e 54 46 28 22 53 65 63 6f 6e 64 20 63  PRINTF("Second c
19d80 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74  all to SCardList
19d90 52 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20  Readers failed, 
19da0 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20  return %s/%li", 
19db0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
19dc0 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
19dd0 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  R(scard_listread
19de0 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ers_ret), (long)
19df0 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65   scard_listreade
19e00 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09  rs_ret);....}...
19e10 09 09 66 72 65 65 28 70 63 73 63 5f 72 65 61 64  ..free(pcsc_read
19e20 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65  ers_s);...} else
19e30 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
19e40 55 47 5f 50 52 49 4e 54 46 28 22 46 69 72 73 74  UG_PRINTF("First
19e50 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69   call to SCardLi
19e60 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 64  stReaders failed
19e70 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22  , return %s/%li"
19e80 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
19e90 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
19ea0 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65  STR(scard_listre
19eb0 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e  aders_ret), (lon
19ec0 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61  g) scard_listrea
19ed0 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09  ders_ret);...}..
19ee0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
19ef0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
19f00 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
19f10 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
19f20 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
19f30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19f40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19f50 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
19f60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
19f70 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
19f80 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c  R);..}...if (pSl
19f90 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  otList == NULL) 
19fa0 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  {...*pulCount = 
19fb0 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43  slot_count;....C
19fc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19fd0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
19fe0 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e  R_OK (%i).  Foun
19ff0 64 20 25 6c 75 20 72 65 61 64 65 72 73 2c 20 62  d %lu readers, b
1a000 75 74 20 6e 6f 74 20 73 74 6f 72 69 6e 67 20 49  ut not storing I
1a010 44 73 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d  Ds (pSlotList ==
1a020 20 4e 55 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c   NULL)", CKR_OK,
1a030 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a040 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09   slot_count);...
1a050 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1a060 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70  ..}...count = *p
1a070 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f  ulCount;..if (co
1a080 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt < slot_count
1a090 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a0a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a0b0 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64  . User allocated
1a0c0 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75   %lu entries, bu
1a0d0 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e  t we have %lu en
1a0e0 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20  tries.", count, 
1a0f0 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  slot_count);....
1a100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a110 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1a120 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
1a130 41 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ALL");....return
1a140 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f  (CKR_BUFFER_TOO_
1a150 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 6d 75  SMALL);...}...mu
1a160 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1a170 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1a180 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1a190 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1a1a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1a1b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a1c0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1a1d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1a1e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1a1f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
1a200 6c 6f 74 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f  lot_idx = 0;..fo
1a210 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
1a220 20 28 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69   (currslot < (si
1a230 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1a240 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1a250 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 3b 20  ey_slots[0]))); 
1a260 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
1a270 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
1a280 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1a290 76 65 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75  ve) {....continu
1a2a0 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c  e;...}....if (sl
1a2b0 6f 74 5f 69 64 78 20 3e 3d 20 63 6f 75 6e 74 29  ot_idx >= count)
1a2c0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1a2d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a2e0 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64  . User allocated
1a2f0 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75   %lu entries, bu
1a300 74 20 77 65 20 6a 75 73 74 20 74 72 69 65 64 20  t we just tried 
1a310 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1a320 25 6c 75 20 69 6e 64 65 78 20 2d 2d 20 69 67 6e  %lu index -- ign
1a330 6f 72 69 6e 67 22 2c 20 63 6f 75 6e 74 2c 20 73  oring", count, s
1a340 6c 6f 74 5f 69 64 78 29 3b 0a 0a 09 09 09 63 6f  lot_idx);.....co
1a350 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 70  ntinue;...}....p
1a360 53 6c 6f 74 4c 69 73 74 5b 73 6c 6f 74 5f 69 64  SlotList[slot_id
1a370 78 5d 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09  x] = currslot;..
1a380 09 73 6c 6f 74 5f 69 64 78 2b 2b 3b 0a 09 7d 0a  .slot_idx++;..}.
1a390 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1a3a0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1a3b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1a3c0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1a3d0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1a3e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a3f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1a400 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1a410 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a420 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1a430 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  ;..}...*pulCount
1a440 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a   = slot_count;..
1a450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a460 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1a470 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f  CKR_OK (%i).  Fo
1a480 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 2e  und %lu readers.
1a490 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69  ", CKR_OK, (unsi
1a4a0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f  gned long) slot_
1a4b0 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e  count);...return
1a4c0 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65  (CKR_OK);...toke
1a4d0 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e  nPresent = token
1a4e0 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72  Present; /* Supr
1a4f0 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
1a500 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
1a510 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1a520 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1a530 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c  tSlotInfo)(CK_SL
1a540 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
1a550 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70  _SLOT_INFO_PTR p
1a560 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
1a570 43 4b 5f 55 54 46 38 43 48 41 52 20 73 6c 6f 74  CK_UTF8CHAR slot
1a580 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20  Description[] = 
1a590 22 43 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09  "CACKey Slot";..
1a5a0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1a5b0 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f  ;..int bytes_to_
1a5c0 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  copy;...CACKEY_D
1a5d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1a5e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
1a5f0 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
1a600 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a610 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
1a620 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
1a630 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1a640 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1a650 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1a660 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1a670 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a680 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1a690 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1a6a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1a6b0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1a6c0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1a6d0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
1a6e0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
1a6f0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1a700 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1a710 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1a720 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a730 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1a740 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1a750 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
1a760 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
1a770 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
1a780 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
1a790 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
1a7a0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1a7b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1a7c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1a7d0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1a7e0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1a7f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a800 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1a810 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1a820 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1a830 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1a840 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1a850 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
1a860 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
1a870 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a880 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1a890 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1a8a0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
1a8b0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
1a8c0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
1a8d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1a8e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1a8f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1a900 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1a910 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66  );..}...pInfo->f
1a920 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 5f 53 4c  lags = CKF_HW_SL
1a930 4f 54 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  OT;...if (!cacke
1a940 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1a950 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 70 49  internal) {...pI
1a960 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b  nfo->flags |= CK
1a970 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49  F_REMOVABLE_DEVI
1a980 43 45 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  CE;..}...if (cac
1a990 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
1a9a0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
1a9b0 73 6c 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b  slotID]) == CACK
1a9c0 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
1a9d0 52 45 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66  RESENT) {...pInf
1a9e0 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  o->flags |= CKF_
1a9f0 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09  TOKEN_PRESENT;..
1aa00 7d 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  }...bytes_to_cop
1aa10 79 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65  y = strlen(cacke
1aa20 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1aa30 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69  pcsc_reader);..i
1aa40 66 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  f (sizeof(pInfo-
1aa50 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1aa60 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   < bytes_to_copy
1aa70 29 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63  ) {...bytes_to_c
1aa80 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e  opy = sizeof(pIn
1aa90 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1aaa0 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28  ID);..}..memcpy(
1aab0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1aac0 72 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c  rerID, cackey_sl
1aad0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63  ots[slotID].pcsc
1aae0 5f 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74  _reader, bytes_t
1aaf0 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78  o_copy);...mutex
1ab00 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1ab10 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1ab20 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1ab30 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1ab40 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1ab50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ab60 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1ab70 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1ab80 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1ab90 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1aba0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c  memset(pInfo->sl
1abb0 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  otDescription, '
1abc0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1abd0 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
1abe0 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  n));..memcpy(pIn
1abf0 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
1ac00 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 70  ion, slotDescrip
1ac10 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f  tion, sizeof(slo
1ac20 74 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  tDescription) - 
1ac30 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
1ac40 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1ac50 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
1ac60 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1ac70 72 65 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f  rerID));...pInfo
1ac80 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
1ac90 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
1aca0 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1acb0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
1acc0 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
1acd0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
1ace0 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1acf0 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
1ad00 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
1ad10 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
1ad20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
1ad30 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
1ad40 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
1ad50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ad60 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1ad70 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1ad80 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1ad90 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1ada0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1adb0 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49  _RV, C_GetTokenI
1adc0 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
1add0 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e  slotID, CK_TOKEN
1ade0 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
1adf0 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
1ae00 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75  F8CHAR manufactu
1ae10 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20  rerID[] = "U.S. 
1ae20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74  Government";..st
1ae30 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1ae40 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20   defaultLabel[] 
1ae50 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e  = "Unknown Token
1ae60 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
1ae70 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d  F8CHAR model[] =
1ae80 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73   "CAC Token";..s
1ae90 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
1aea0 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
1aeb0 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  _identities;..un
1aec0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
1aed0 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20  certs;..ssize_t 
1aee0 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20  label_ret;..int 
1aef0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
1af00 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c  nt use_default_l
1af10 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  abel;...CACKEY_D
1af20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1af30 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
1af40 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
1af50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1af60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
1af70 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
1af80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1af90 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1afa0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1afb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1afc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1afd0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1afe0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1aff0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1b000 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1b010 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1b020 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
1b030 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
1b040 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1b050 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1b060 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1b070 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b080 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1b090 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1b0a0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
1b0b0 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
1b0c0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
1b0d0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
1b0e0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
1b0f0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1b100 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1b110 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1b120 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1b130 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1b140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b150 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1b160 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1b170 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1b180 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1b190 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1b1a0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
1b1b0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
1b1c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b1d0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1b1e0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1b1f0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
1b200 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
1b210 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
1b220 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1b230 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1b240 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1b250 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1b260 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1b270 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
1b280 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
1b290 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45  lotID]) != CACKE
1b2a0 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
1b2b0 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45  ESENT) {...CACKE
1b2c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b2d0 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73  No token is pres
1b2e0 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20  ent in slotID = 
1b2f0 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  %lu", slotID);..
1b300 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1b310 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1b320 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1b330 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50  (CKR_TOKEN_NOT_P
1b340 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75  RESENT);..}...mu
1b350 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1b360 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1b370 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1b380 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1b390 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1b3a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b3b0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1b3c0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1b3d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1b3e0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1b3f0 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
1b400 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d  token label from
1b410 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f   certificates */
1b420 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
1b430 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65  label, ' ', size
1b440 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
1b450 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  );..use_default_
1b460 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20  label = 1;...if 
1b470 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1b480 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e  otID].label == N
1b490 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64  ULL) {...pcsc_id
1b4a0 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
1b4b0 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63 61  y_read_certs(&ca
1b4c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1b4d0 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  D], NULL, &num_c
1b4e0 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73  erts);...if (pcs
1b4f0 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
1b500 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e  NULL) {....if (n
1b510 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a  um_certs > 0) {.
1b520 09 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20  ....label_ret = 
1b530 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
1b540 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63  tity_to_label(pc
1b550 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70  sc_identities, p
1b560 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a  Info->label, siz
1b570 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
1b580 29 29 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 65  ));.....if (labe
1b590 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09  l_ret > 0) {....
1b5a0 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
1b5b0 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63  bel = 0;.......c
1b5c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1b5d0 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c  ID].label = mall
1b5e0 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  oc(sizeof(pInfo-
1b5f0 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09  >label));.......
1b600 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 6c  memcpy(cackey_sl
1b610 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
1b620 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  l, pInfo->label,
1b630 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1b640 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09  abel));.....}...
1b650 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
1b660 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
1b670 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
1b680 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20  rts, 1);...}..} 
1b690 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
1b6a0 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61  pInfo->label, ca
1b6b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1b6c0 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  D].label, sizeof
1b6d0 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1b6e0 0a 0a 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  ....use_default_
1b6f0 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09  label = 0;..}...
1b700 69 66 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f  if (use_default_
1b710 6c 61 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70  label) {...memcp
1b720 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  y(pInfo->label, 
1b730 64 65 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69  defaultLabel, si
1b740 7a 65 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65  zeof(defaultLabe
1b750 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65  l) - 1);..}...me
1b760 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
1b770 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
1b780 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
1b790 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
1b7a0 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
1b7b0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1b7c0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1b7d0 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75  sizeof(manufactu
1b7e0 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d  rerID) - 1);...m
1b7f0 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emset(pInfo->mod
1b800 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  el, ' ', sizeof(
1b810 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a  pInfo->model));.
1b820 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
1b830 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a  odel, model, siz
1b840 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b  eof(model) - 1);
1b850 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1b860 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27  >serialNumber, '
1b870 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1b880 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29  ->serialNumber))
1b890 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
1b8a0 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20  ->utcTime, ' ', 
1b8b0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74  sizeof(pInfo->ut
1b8c0 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f  cTime));...pInfo
1b8d0 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
1b8e0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
1b8f0 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1b900 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
1b910 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
1b920 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
1b930 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1b940 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
1b950 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
1b960 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
1b970 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
1b980 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
1b990 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
1b9a0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
1b9b0 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  KF_WRITE_PROTECT
1b9c0 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49  ED | CKF_USER_PI
1b9d0 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20  N_INITIALIZED | 
1b9e0 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41  CKF_TOKEN_INITIA
1b9f0 4c 49 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f 73  LIZED | cackey_s
1ba00 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1ba10 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 70 49 6e 66  en_flags;...pInf
1ba20 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43  o->ulMaxSessionC
1ba30 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63  ount = (sizeof(c
1ba40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1ba50 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1ba60 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20  sessions[0])) - 
1ba70 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73  1;..pInfo->ulSes
1ba80 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55  sionCount = CK_U
1ba90 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
1baa0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
1bab0 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f  ulMaxRwSessionCo
1bac0 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d  unt = 0;..pInfo-
1bad0 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e  >ulRwSessionCoun
1bae0 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  t = CK_UNAVAILAB
1baf0 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
1bb00 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e  .pInfo->ulMaxPin
1bb10 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66  Len = 128;..pInf
1bb20 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d  o->ulMinPinLen =
1bb30 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f   0;..pInfo->ulTo
1bb40 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  talPublicMemory 
1bb50 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
1bb60 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
1bb70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c  Info->ulFreePubl
1bb80 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  icMemory = CK_UN
1bb90 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
1bba0 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
1bbb0 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d  lTotalPrivateMem
1bbc0 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
1bbd0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
1bbe0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65  ;..pInfo->ulFree
1bbf0 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20  PrivateMemory = 
1bc00 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1bc10 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41  NFORMATION;...CA
1bc20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bc30 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1bc40 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1bc50 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1bc60 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1bc70 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1bc80 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74  V, C_WaitForSlot
1bc90 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20  Event)(CK_FLAGS 
1bca0 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49  flags, CK_SLOT_I
1bcb0 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43  D_PTR pSlotID, C
1bcc0 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65  K_VOID_PTR pRese
1bcd0 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f  rved) {..CACKEY_
1bce0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1bcf0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
1bd00 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c  Reserved != NULL
1bd10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1bd20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1bd30 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e  . pReserved is n
1bd40 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
1bd50 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1bd60 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1bd70 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1bd80 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1bd90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bda0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1bdb0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1bdc0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1bdd0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1bde0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58  ZED);..}.../* XX
1bdf0 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65  X: TODO: Impleme
1be00 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43  nt this... */..C
1be10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1be20 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1be30 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1be40 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1be50 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1be60 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1be70 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1be80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1be90 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1bea0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1beb0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
1bec0 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  st)(CK_SLOT_ID s
1bed0 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e  lotID, CK_MECHAN
1bee0 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d 65  ISM_TYPE_PTR pMe
1bef0 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f  chanismList, CK_
1bf00 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75  ULONG_PTR pulCou
1bf10 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  nt) {..CACKEY_DE
1bf20 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1bf30 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1bf40 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1bf50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1bf60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1bf70 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1bf80 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1bf90 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1bfa0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1bfb0 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e  .}...if (pulCoun
1bfc0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
1bfd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bfe0 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 43  TF("Error.  pulC
1bff0 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  ount is NULL.");
1c000 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1c010 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1c020 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
1c030 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  smList == NULL) 
1c040 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  {...*pulCount = 
1c050 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  1;....CACKEY_DEB
1c060 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1c070 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1c080 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
1c090 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
1c0a0 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e  }...if (*pulCoun
1c0b0 74 20 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b 45  t < 1) {...CACKE
1c0c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c0d0 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72 20 74  Error.  Buffer t
1c0e0 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09  oo small.");....
1c0f0 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45  return(CKR_BUFFE
1c100 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d  R_TOO_SMALL);..}
1c110 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  ...pMechanismLis
1c120 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50  t[0] = CKM_RSA_P
1c130 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  KCS;..*pulCount 
1c140 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  = 1;...CACKEY_DE
1c150 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1c160 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1c170 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1c180 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1c190 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1c1a0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1c1b0 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28  tMechanismInfo)(
1c1c0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1c1d0 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  D, CK_MECHANISM_
1c1e0 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45  TYPE type, CK_ME
1c1f0 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52  CHANISM_INFO_PTR
1c200 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d   pInfo) {..int m
1c210 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
1c220 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c230 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1c240 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
1c250 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1c260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c270 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
1c280 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1c290 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1c2a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1c2b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1c2c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c2d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c2e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1c2f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1c300 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1c310 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1c320 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
1c330 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
1c340 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1c350 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1c360 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1c370 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1c380 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c390 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1c3a0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1c3b0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
1c3c0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
1c3d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c3e0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1c3f0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1c400 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1c410 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1c420 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1c430 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1c440 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c450 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c460 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1c470 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1c480 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1c490 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
1c4a0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1c4b0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
1c4c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c4d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1c4e0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1c4f0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
1c500 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
1c510 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
1c520 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
1c530 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1c540 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
1c550 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1c560 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1c570 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1c580 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1c590 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1c5a0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1c5b0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1c5c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c5d0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1c5e0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1c5f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1c600 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1c610 7d 0a 0a 09 73 77 69 74 63 68 20 28 74 79 70 65  }...switch (type
1c620 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
1c630 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66  SA_PKCS:....pInf
1c640 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20  o->ulMinKeySize 
1c650 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d  = 512;....pInfo-
1c660 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20  >ulMaxKeySize = 
1c670 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e  8192;....pInfo->
1c680 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c  flags = CKF_HW |
1c690 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43   CKF_ENCRYPT | C
1c6a0 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46  KF_DECRYPT | CKF
1c6b0 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49  _SIGN | CKF_VERI
1c6c0 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  FY;....break;..}
1c6d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c6e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1c6f0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1c700 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1c710 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  n(CKR_OK);.}../*
1c720 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72   We don't suppor
1c730 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a  t this method. *
1c740 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
1c750 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e  TION(CK_RV, C_In
1c760 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54  itToken)(CK_SLOT
1c770 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55  _ID slotID, CK_U
1c780 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
1c790 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
1c7a0 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  Len, CK_UTF8CHAR
1c7b0 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09  _PTR pLabel) {..
1c7c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c7d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1c7e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1c7f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1c800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c810 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1c820 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1c830 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1c840 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1c850 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1c860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c870 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1c880 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
1c890 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b  TECTED (%i)", CK
1c8a0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
1c8b0 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75  OTECTED);...retu
1c8c0 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  rn(CKR_TOKEN_WRI
1c8d0 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d  TE_PROTECTED);.}
1c8e0 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
1c8f0 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
1c900 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
1c910 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1c920 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45  C_InitPIN)(CK_SE
1c930 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1c940 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
1c950 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
1c960 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20  ULONG ulPinLen) 
1c970 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1c980 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1c990 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1c9a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1c9b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c9c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1c9d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1c9e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c9f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1ca00 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1ca10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ca20 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1ca30 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
1ca40 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c  PROTECTED (%i)",
1ca50 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
1ca60 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72  _PROTECTED);...r
1ca70 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f  eturn(CKR_TOKEN_
1ca80 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
1ca90 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74  ;.}../* We don't
1caa0 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65   support this me
1cab0 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49  thod. */.CK_DEFI
1cac0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1cad0 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f  V, C_SetPIN)(CK_
1cae0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1caf0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38  Session, CK_UTF8
1cb00 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e  CHAR_PTR pOldPin
1cb10 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64  , CK_ULONG ulOld
1cb20 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43  PinLen, CK_UTF8C
1cb30 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c  HAR_PTR pNewPin,
1cb40 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50   CK_ULONG ulNewP
1cb50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  inLen) {..CACKEY
1cb60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1cb70 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1cb80 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1cb90 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1cba0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1cbb0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1cbc0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1cbd0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1cbe0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1cbf0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1cc00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1cc10 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1cc20 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1cc30 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1cc40 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1cc50 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1cc60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1cc70 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1cc80 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1cc90 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53  N(CK_RV, C_OpenS
1cca0 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f  ession)(CK_SLOT_
1ccb0 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c  ID slotID, CK_FL
1ccc0 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f  AGS flags, CK_VO
1ccd0 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74  ID_PTR pApplicat
1cce0 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e  ion, CK_NOTIFY n
1ccf0 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f  otify, CK_SESSIO
1cd00 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53  N_HANDLE_PTR phS
1cd10 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67  ession) {..unsig
1cd20 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69  ned long idx;..i
1cd30 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1cd40 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73  ..int found_sess
1cd50 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  ion = 0;...CACKE
1cd60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cd70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1cd80 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45  ((flags & CKF_SE
1cd90 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d  RIAL_SESSION) !=
1cda0 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53   CKF_SERIAL_SESS
1cdb0 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ION) {...return(
1cdc0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41  CKR_SESSION_PARA
1cdd0 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  LLEL_NOT_SUPPORT
1cde0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ED);..}...if (!c
1cdf0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1ce00 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1ce10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ce20 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1ce30 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1ce40 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1ce50 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1ce60 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
1ce70 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
1ce80 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1ce90 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1cea0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1ceb0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1cec0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ced0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1cee0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1cef0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
1cf00 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
1cf10 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
1cf20 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
1cf30 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1cf40 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1cf50 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1cf60 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1cf70 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1cf80 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1cf90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1cfa0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1cfb0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1cfc0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1cfd0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
1cfe0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1cff0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
1d000 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d010 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d020 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1d030 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
1d040 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
1d050 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
1d060 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1d070 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1d080 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1d090 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
1d0a0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1d0b0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1d0c0 68 65 20 63 61 72 64 20 69 73 20 61 63 74 75 61  he card is actua
1d0d0 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e  lly in the slot.
1d0e0 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65   */../* XXX: Che
1d0f0 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
1d100 74 68 69 73 20 69 73 20 69 6e 20 74 68 65 20 50  this is in the P
1d110 4b 43 53 23 31 31 20 73 70 65 63 69 66 69 63 61  KCS#11 specifica
1d120 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63  tion */..if (cac
1d130 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
1d140 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
1d150 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b  slotID]) != CACK
1d160 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
1d170 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  RESENT) {...CACK
1d180 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d190 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f  "Error.  Card no
1d1a0 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75  t present.  Retu
1d1b0 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45  rning CKR_DEVICE
1d1c0 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63  _REMOVED");....c
1d1d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1d1e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1d1f0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
1d200 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
1d210 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
1d220 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 1; idx < (siz
1d230 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1d240 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1d250 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1d260 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
1d270 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1d280 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ons[idx].active)
1d290 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73   {....found_sess
1d2a0 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68  ion = 1;.....*ph
1d2b0 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a  Session = idx;..
1d2c0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1d2d0 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ns[idx].active =
1d2e0 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   1;....cackey_se
1d2f0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74  ssions[idx].slot
1d300 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09  ID = slotID;....
1d310 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d320 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  idx].state = CKS
1d330 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49  _RO_PUBLIC_SESSI
1d340 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ON;....cackey_se
1d350 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67  ssions[idx].flag
1d360 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61  s = flags;....ca
1d370 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1d380 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  x].ulDeviceError
1d390 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 0;....cackey_
1d3a0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41  sessions[idx].pA
1d3b0 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70  pplication = pAp
1d3c0 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61  plication;....ca
1d3d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1d3e0 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69  x].Notify = noti
1d3f0 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  fy;.....cackey_s
1d400 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
1d410 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ntities = NULL;.
1d420 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1d430 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
1d440 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  es_count = 0;...
1d450 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1d460 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63  s[idx].search_ac
1d470 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61  tive = 0;.....ca
1d480 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1d490 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  x].sign_active =
1d4a0 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
1d4b0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63  essions[idx].dec
1d4c0 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b  rypt_active = 0;
1d4d0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
1d4e0 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69  ions[idx].identi
1d4f0 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
1d500 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63  ad_identities(&c
1d510 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1d520 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73  ID], &cackey_ses
1d530 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
1d540 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a  ities_count);...
1d550 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
1d560 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1d570 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1d580 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1d590 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1d5a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1d5b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d5c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1d5d0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1d5e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1d5f0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1d600 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75  );..}...if (!fou
1d610 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09  nd_session) {...
1d620 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d630 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1d640 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54  KR_SESSION_COUNT
1d650 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45 53 53   (%i)", CKR_SESS
1d660 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72  ION_COUNT);....r
1d670 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1d680 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43  N_COUNT);..}...C
1d690 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d6a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1d6b0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1d6c0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1d6d0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1d6e0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1d6f0 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73 69  RV, C_CloseSessi
1d700 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  on)(CK_SESSION_H
1d710 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
1d720 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
1d730 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
1d740 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1d750 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1d760 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1d770 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d780 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d790 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1d7a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1d7b0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1d7c0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1d7d0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
1d7e0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
1d7f0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
1d800 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1d810 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1d820 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
1d830 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d840 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1d850 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
1d860 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1d870 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1d880 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1d890 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1d8a0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1d8b0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1d8c0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1d8d0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1d8e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d8f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d900 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1d910 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1d920 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1d930 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1d940 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d950 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
1d960 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1d970 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1d980 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1d990 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d9a0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
1d9b0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1d9c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1d9d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1d9e0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
1d9f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1da00 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30  sion].active = 0
1da10 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69  ;..cackey_free_i
1da20 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79  dentities(cackey
1da30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1da40 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20  on].identities, 
1da50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1da60 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1da70 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d  ties_count);...m
1da80 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1da90 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1daa0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1dab0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1dac0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1dad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1dae0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1daf0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1db00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1db10 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1db20 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1db30 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1db40 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1db50 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1db60 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1db70 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1db80 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65  N(CK_RV, C_Close
1db90 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f  AllSessions)(CK_
1dba0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29 20  SLOT_ID slotID) 
1dbb0 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
1dbc0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1dbd0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
1dbe0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1dbf0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1dc00 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1dc10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1dc20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1dc30 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1dc40 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1dc50 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1dc60 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1dc70 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
1dc80 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
1dc90 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1dca0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1dcb0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1dcc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1dcd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1dce0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1dcf0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1dd00 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
1dd10 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
1dd20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1dd30 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
1dd40 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1dd50 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1dd60 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1dd70 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1dd80 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1dd90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1dda0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ddb0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1ddc0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1ddd0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1dde0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1ddf0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1de00 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
1de10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1de20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1de30 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1de40 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
1de50 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
1de60 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
1de70 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1de80 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1de90 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
1dea0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
1deb0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f  NVALID);..}...fo
1dec0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1ded0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1dee0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1def0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1df00 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
1df10 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
1df20 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
1df30 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63  tive) {....if (c
1df40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1df50 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c  dx].slotID != sl
1df60 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74  otID) {.....cont
1df70 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  inue;....}.....c
1df80 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1df90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1dfa0 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65  k);....C_CloseSe
1dfb0 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63  ssion(idx);....c
1dfc0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1dfd0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1dfe0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
1dff0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1e000 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1e010 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1e020 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1e030 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1e040 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e050 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1e060 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1e070 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1e080 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1e090 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e0a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1e0b0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1e0c0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1e0d0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1e0e0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1e0f0 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f  _RV, C_GetSessio
1e100 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f  nInfo)(CK_SESSIO
1e110 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1e120 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e  n, CK_SESSION_IN
1e130 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
1e140 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1e150 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
1e160 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1e170 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
1e180 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1e190 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e1a0 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
1e1b0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1e1c0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1e1d0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1e1e0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1e1f0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1e200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e210 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1e220 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1e230 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1e240 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1e250 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
1e260 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
1e270 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
1e280 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1e290 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1e2a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1e2b0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1e2c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e2d0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
1e2e0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1e2f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1e300 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1e310 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1e320 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1e330 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1e340 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1e350 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1e360 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1e370 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e380 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1e390 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1e3a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1e3b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1e3c0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1e3d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
1e3e0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1e3f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1e400 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1e410 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e420 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1e430 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
1e440 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1e450 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1e460 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1e470 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20  ..pInfo->slotID 
1e480 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1e490 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
1e4a0 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74  ID;..pInfo->stat
1e4b0 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  e = cackey_sessi
1e4c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
1e4d0 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  ate;..pInfo->fla
1e4e0 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  gs = cackey_sess
1e4f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66  ions[hSession].f
1e500 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  lags;..pInfo->ul
1e510 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61  DeviceError = ca
1e520 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1e530 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65  ession].ulDevice
1e540 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72  Error;...mutex_r
1e550 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1e560 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1e570 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1e580 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1e590 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1e5a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e5b0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1e5c0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1e5d0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1e5e0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
1e5f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e600 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e610 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1e620 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1e630 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1e640 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1e650 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f  V, C_GetOperatio
1e660 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49  nState)(CK_SESSI
1e670 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1e680 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1e690 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c  pOperationState,
1e6a0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1e6b0 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c  lOperationStateL
1e6c0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1e6d0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1e6e0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1e6f0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1e700 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e710 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e720 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1e730 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e740 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1e750 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1e760 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1e770 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1e780 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1e790 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1e7a0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1e7b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e7c0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1e7d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1e7e0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1e7f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1e800 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61  K_RV, C_SetOpera
1e810 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45  tionState)(CK_SE
1e820 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1e830 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1e840 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61  TR pOperationSta
1e850 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f  te, CK_ULONG ulO
1e860 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e  perationStateLen
1e870 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1e880 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65  LE hEncryptionKe
1e890 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
1e8a0 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63 61 74  DLE hAuthenticat
1e8b0 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  ionKey) {..CACKE
1e8c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e8d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1e8e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1e8f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1e900 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e910 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1e920 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1e930 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1e940 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1e950 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1e960 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1e970 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1e980 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1e990 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1e9a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1e9b0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1e9c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1e9d0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1e9e0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1e9f0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69  ON(CK_RV, C_Logi
1ea00 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
1ea10 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1ea20 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72  K_USER_TYPE user
1ea30 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41  Type, CK_UTF8CHA
1ea40 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55  R_PTR pPin, CK_U
1ea50 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b  LONG ulPinLen) {
1ea60 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
1ea70 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  tID;..int mutex_
1ea80 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69  retval;..int tri
1ea90 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69  es_remaining;..i
1eaa0 6e 74 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09  nt login_ret;...
1eab0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1eac0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1ead0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1eae0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1eaf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1eb00 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1eb10 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1eb20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1eb30 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1eb40 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1eb50 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
1eb60 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
1eb70 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1eb80 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1eb90 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1eba0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1ebb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ebc0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1ebd0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
1ebe0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1ebf0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1ec00 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
1ec10 66 20 28 75 73 65 72 54 79 70 65 20 21 3d 20 43  f (userType != C
1ec20 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09 43 41 43  KU_USER) {...CAC
1ec30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ec40 28 22 45 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c  ("Error.  We onl
1ec50 79 20 73 75 70 70 6f 72 74 20 55 53 45 52 20 6d  y support USER m
1ec60 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f 72 20 25  ode, asked for %
1ec70 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69  lu mode.", (unsi
1ec80 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73 65 72 54  gned long) userT
1ec90 79 70 65 29 0a 0a 09 09 72 65 74 75 72 6e 28 43  ype)....return(C
1eca0 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f 49 4e 56  KR_USER_TYPE_INV
1ecb0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1ecc0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1ecd0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1ece0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1ecf0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1ed00 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1ed10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ed20 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1ed30 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1ed40 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1ed50 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1ed60 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1ed70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
1ed80 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1ed90 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1eda0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1edb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1edc0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1edd0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
1ede0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1edf0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1ee00 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1ee10 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
1ee20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1ee30 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
1ee40 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
1ee50 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
1ee60 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1ee70 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1ee80 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
1ee90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1eea0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1eeb0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1eec0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
1eed0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
1eee0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1eef0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1ef00 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1ef10 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1ef20 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
1ef30 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1ef40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ef50 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1ef60 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1ef70 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
1ef80 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
1ef90 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1efa0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1efb0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1efc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1efd0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1efe0 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20  }...login_ret = 
1eff0 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61  cackey_login(&ca
1f000 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1f010 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c  D], pPin, ulPinL
1f020 65 6e 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69  en, &tries_remai
1f030 6e 69 6e 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69  ning);..if (logi
1f040 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
1f050 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63  PCSC_S_OK) {...c
1f060 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1f070 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f080 6b 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e  k);....if (login
1f090 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
1f0a0 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a  CSC_E_LOCKED) {.
1f0b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f0c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f0d0 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e  Token is locked.
1f0e0 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
1f0f0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1f100 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
1f110 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b  USER_PIN_LOCKED;
1f120 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1f130 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d  PIN_LOCKED);...}
1f140 20 65 6c 73 65 20 69 66 20 28 6c 6f 67 69 6e 5f   else if (login_
1f150 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
1f160 53 43 5f 45 5f 42 41 44 50 49 4e 29 20 7b 0a 09  SC_E_BADPIN) {..
1f170 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f180 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 49  RINTF("Error.  I
1f190 6e 76 61 6c 69 64 20 50 49 4e 2e 22 29 3b 0a 0a  nvalid PIN.");..
1f1a0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f1b0 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
1f1c0 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f  ags |= CKF_USER_
1f1d0 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a  PIN_COUNT_LOW;..
1f1e0 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  ...if (tries_rem
1f1f0 61 69 6e 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09  aining == 1) {..
1f200 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f210 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
1f220 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f  ags |= CKF_USER_
1f230 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09  PIN_FINAL_TRY;..
1f240 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ..}.....return(C
1f250 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
1f260 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
1f270 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f280 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65  rror.  Unknown e
1f290 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72  rror returned fr
1f2a0 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28  om cackey_login(
1f2b0 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72  ) (%i)", login_r
1f2c0 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  et);....return(C
1f2d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1f2e0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
1f2f0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1f300 65 6e 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b  en_flags &= ~(CK
1f310 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45  F_USER_PIN_LOCKE
1f320 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e  D | CKF_USER_PIN
1f330 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46  _COUNT_LOW | CKF
1f340 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20  _LOGIN_REQUIRED 
1f350 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46  | CKF_USER_PIN_F
1f360 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63  INAL_TRY);...cac
1f370 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1f380 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43  ssion].state = C
1f390 4b 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54  KS_RO_USER_FUNCT
1f3a0 49 4f 4e 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  IONS;...mutex_re
1f3b0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1f3c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1f3d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1f3e0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1f3f0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1f400 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f410 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1f420 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1f430 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1f440 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1f450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f460 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1f470 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1f480 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1f490 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1f4a0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1f4b0 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53  , C_Logout)(CK_S
1f4c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1f4d0 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c  ession) {..CK_SL
1f4e0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69  OT_ID slotID;..i
1f4f0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1f500 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f510 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1f520 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1f530 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1f540 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f550 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1f560 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1f570 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f580 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1f590 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1f5a0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
1f5b0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
1f5c0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1f5d0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1f5e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1f5f0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
1f600 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f610 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1f620 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
1f630 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1f640 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1f650 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1f660 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1f670 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1f680 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f690 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1f6a0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1f6b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f6c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1f6d0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1f6e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1f6f0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1f700 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1f710 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1f720 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
1f730 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1f740 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f750 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1f760 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f770 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
1f780 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1f790 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1f7a0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1f7b0 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
1f7c0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
1f7d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
1f7e0 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
1f7f0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
1f800 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1f810 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1f820 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1f830 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1f840 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f850 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1f860 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1f870 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
1f880 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
1f890 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f8a0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1f8b0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1f8c0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
1f8d0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
1f8e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f8f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1f900 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1f910 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
1f920 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
1f930 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
1f940 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1f950 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1f960 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1f970 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1f980 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  OR);..}...cackey
1f990 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1f9a0 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f  on].state = CKS_
1f9b0 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f  RO_PUBLIC_SESSIO
1f9c0 4e 3b 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  N;..cackey_slots
1f9d0 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
1f9e0 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e  lags = CKF_LOGIN
1f9f0 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 6d 75 74  _REQUIRED;...mut
1fa00 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1fa10 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1fa20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1fa30 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1fa40 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1fa50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fa60 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1fa70 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1fa80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1fa90 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1faa0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fab0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1fac0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1fad0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1fae0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1faf0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1fb00 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74 65 4f  CK_RV, C_CreateO
1fb10 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
1fb20 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1fb30 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  n, CK_ATTRIBUTE_
1fb40 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
1fb50 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c  K_ULONG ulCount,
1fb60 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
1fb70 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 29 20  E_PTR phObject) 
1fb80 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1fb90 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1fba0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1fbb0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1fbc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fbd0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1fbe0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1fbf0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1fc00 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1fc10 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1fc20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fc30 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1fc40 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1fc50 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1fc60 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1fc70 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1fc80 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1fc90 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1fca0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1fcb0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1fcc0 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28  , C_CopyObject)(
1fcd0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1fce0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
1fcf0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
1fd00 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ject, CK_ATTRIBU
1fd10 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
1fd20 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
1fd30 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
1fd40 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f 62  NDLE_PTR phNewOb
1fd50 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ject) {..CACKEY_
1fd60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1fd70 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1fd80 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1fd90 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1fda0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1fdb0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1fdc0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1fdd0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1fde0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1fdf0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1fe00 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1fe10 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1fe20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1fe30 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1fe40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1fe50 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1fe60 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1fe70 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1fe80 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1fe90 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f  (CK_RV, C_Destro
1fea0 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53  yObject)(CK_SESS
1feb0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1fec0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
1fed0 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b  ANDLE hObject) {
1fee0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fef0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1ff00 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1ff10 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1ff20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ff30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1ff40 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1ff50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ff60 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1ff70 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1ff80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ff90 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1ffa0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1ffb0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1ffc0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1ffd0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1ffe0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1fff0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20000 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
20010 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
20020 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65   C_GetObjectSize
20030 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
20040 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
20050 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
20060 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Object, CK_ULONG
20070 5f 50 54 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a  _PTR pulSize) {.
20080 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20090 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
200a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
200b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
200c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
200d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
200e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
200f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20100 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20110 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
20120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20130 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20140 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20150 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
20160 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20170 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
20180 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
20190 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
201a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
201b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
201c0 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61  C_GetAttributeVa
201d0 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  lue)(CK_SESSION_
201e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
201f0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
20200 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
20210 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
20220 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
20230 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41  ulCount) {..CK_A
20240 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
20250 74 74 72 3b 0a 09 73 74 72 75 63 74 20 63 61 63  ttr;..struct cac
20260 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
20270 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65  entity;..unsigne
20280 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f  d long identity_
20290 69 64 78 2c 20 61 74 74 72 5f 69 64 78 2c 20 73  idx, attr_idx, s
202a0 65 73 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75  ess_attr_idx, nu
202b0 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65  m_ids;..int mute
202c0 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  x_retval;..CK_RV
202d0 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b   retval = CKR_OK
202e0 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  ;..CK_VOID_PTR p
202f0 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  Value;..CK_ULONG
20300 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43   ulValueLen;...C
20310 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20320 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
20330 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
20340 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
20350 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20360 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
20370 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
20380 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
20390 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
203a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
203b0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
203c0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
203d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
203e0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
203f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20400 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
20410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20420 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
20430 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
20440 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
20450 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
20460 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
20470 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20   (hObject == 0) 
20480 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20490 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
204a0 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f   Object handle 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 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e  OBJECT_HANDLE_IN
204e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
204f0 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  (ulCount == 0) {
20500 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
20510 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a  uit, if zero obj
20520 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66  ects were specif
20530 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20  ied return zero 
20540 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c  items immediatel
20550 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  y */...CACKEY_DE
20560 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20570 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
20580 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
20590 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
205a0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
205b0 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61  .}...if (pTempla
205c0 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  te == NULL) {...
205d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
205e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 54 65  NTF("Error.  pTe
205f0 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22  mplate is NULL."
20600 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20610 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
20620 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69  ..}...identity_i
20630 64 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31  dx = hObject - 1
20640 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
20650 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
20660 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
20670 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
20680 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
20690 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
206a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
206b0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
206c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
206d0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
206e0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
206f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20700 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
20710 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
20720 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
20730 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
20740 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20750 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
20760 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
20770 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
20780 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
20790 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64  ID);..}...num_id
207a0 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  s = cackey_sessi
207b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
207c0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a  entities_count;.
207d0 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 5f 69  ..if (identity_i
207e0 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b  dx >= num_ids) {
207f0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
20800 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20810 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
20820 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20830 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68  Error.  Object h
20840 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
20850 67 65 2e 20 20 69 64 65 6e 74 69 74 79 5f 69 64  ge.  identity_id
20860 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73  x = %lu, num_ids
20870 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67   = %lu.", (unsig
20880 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
20890 74 79 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e 65  ty_idx, (unsigne
208a0 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29  d long) num_ids)
208b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
208c0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e  OBJECT_HANDLE_IN
208d0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65  VALID);..}...ide
208e0 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
208f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20900 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64  n].identities[id
20910 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66  entity_idx];...f
20920 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30  or (attr_idx = 0
20930 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 75 6c 43  ; attr_idx < ulC
20940 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b  ount; attr_idx++
20950 29 20 7b 0a 09 09 63 75 72 72 5f 61 74 74 72 20  ) {...curr_attr 
20960 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b 61 74 74  = &pTemplate[att
20970 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75  r_idx];....pValu
20980 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61  e = NULL;...ulVa
20990 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e  lueLen = (CK_LON
209a0 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59  G) -1;....CACKEY
209b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4c  _DEBUG_PRINTF("L
209c0 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69  ooking for attri
209d0 62 75 74 65 20 30 78 25 30 38 6c 78 20 28 69 64  bute 0x%08lx (id
209e0 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22  entity:%lu) ..."
209f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
20a00 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  ) curr_attr->typ
20a10 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
20a20 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 29  g) identity_idx)
20a30 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73 73 5f 61  ;....for (sess_a
20a40 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73  ttr_idx = 0; ses
20a50 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65  s_attr_idx < ide
20a60 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
20a70 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74  s_count; sess_at
20a80 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69  tr_idx++) {....i
20a90 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 61 74 74  f (identity->att
20aa0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
20ab0 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63  r_idx].type == c
20ac0 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20  urr_attr->type) 
20ad0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
20ae0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
20af0 66 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c 75 65  found it, pValue
20b00 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65   = %p, ulValueLe
20b10 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74 69  n = %lu", identi
20b20 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
20b30 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
20b40 61 6c 75 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e  alue, identity->
20b50 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
20b60 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75  attr_idx].ulValu
20b70 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09  eLen);..........
20b80 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74  pValue = identit
20b90 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
20ba0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61  ss_attr_idx].pVa
20bb0 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  lue;.....ulValue
20bc0 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  Len = 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 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  eLen;....}...}..
20c00 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
20c10 3e 70 56 61 6c 75 65 20 26 26 20 70 56 61 6c 75  >pValue && pValu
20c20 65 29 20 7b 0a 09 09 09 69 66 20 28 63 75 72 72  e) {....if (curr
20c30 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
20c40 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29  n >= ulValueLen)
20c50 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75   {.....memcpy(cu
20c60 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
20c70 20 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65   pValue, ulValue
20c80 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20  Len);....} else 
20c90 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  {.....ulValueLen
20ca0 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
20cb0 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
20cc0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
20cd0 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  ALL;....}...}...
20ce0 09 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61  .curr_attr->ulVa
20cf0 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65  lueLen = ulValue
20d00 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  Len;..}...mutex_
20d10 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20d20 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
20d30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
20d40 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
20d50 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
20d60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20d70 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
20d80 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20d90 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20da0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
20db0 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
20dc0 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f  _ATTRIBUTE_TYPE_
20dd0 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43 41 43  INVALID) {...CAC
20de0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20df0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
20e00 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49  ATTRIBUTE_TYPE_I
20e10 4e 56 41 4c 49 44 20 28 25 69 29 22 2c 20 28 69  NVALID (%i)", (i
20e20 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20  nt) retval);..} 
20e30 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20  else if (retval 
20e40 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  == CKR_BUFFER_TO
20e50 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43  O_SMALL) {...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 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
20e90 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
20ea0 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69  tval);..} else i
20eb0 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
20ec0 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
20ed0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20ee0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
20ef0 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
20f00 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  al);..} else {..
20f10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20f20 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
20f30 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  %i", (int) retva
20f40 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  l);..}...return(
20f50 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
20f60 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
20f70 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74 74 72 69  K_RV, C_SetAttri
20f80 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45  buteValue)(CK_SE
20f90 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
20fa0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
20fb0 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
20fc0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
20fd0 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
20fe0 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b  ULONG ulCount) {
20ff0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21000 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
21010 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
21020 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
21030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21040 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
21050 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
21060 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21070 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
21080 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
21090 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
210a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
210b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
210c0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
210d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
210e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
210f0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
21100 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21110 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
21120 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
21130 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e   C_FindObjectsIn
21140 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
21150 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
21160 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
21170 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
21180 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a  LONG ulCount) {.
21190 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
211a0 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64  ID;..CK_ULONG id
211b0 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
211c0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
211d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
211e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
211f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
21200 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
21210 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21220 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
21230 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
21240 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
21250 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
21260 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
21270 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
21280 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
21290 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
212a0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
212b0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
212c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
212d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
212e0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
212f0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
21300 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
21310 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
21320 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
21330 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
21340 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
21350 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
21360 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
21370 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21380 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21390 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
213a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
213b0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
213c0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
213d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
213e0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
213f0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
21400 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21410 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
21420 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21430 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
21440 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
21450 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
21460 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
21470 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
21480 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21490 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
214a0 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  h_active) {...ca
214b0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
214c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
214d0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
214e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
214f0 2e 20 20 53 65 61 72 63 68 20 61 6c 72 65 61 64  .  Search alread
21500 79 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  y active.");....
21510 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
21520 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a  RATION_ACTIVE);.
21530 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
21540 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21550 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
21560 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
21570 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
21580 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
21590 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
215a0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
215b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
215c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
215d0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
215e0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
215f0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
21600 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
21610 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
21620 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
21630 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
21640 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
21650 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
21660 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21670 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
21680 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
21690 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
216a0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
216b0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
216c0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
216d0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
216e0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
216f0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
21700 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
21710 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
21720 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
21730 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21740 4e 54 46 28 22 54 68 65 20 73 6c 6f 74 20 68 61  NTF("The slot ha
21750 73 20 62 65 65 6e 20 72 65 73 65 74 20 73 69 6e  s been reset sin
21760 63 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b 65  ce we last looke
21770 64 20 66 6f 72 20 69 64 65 6e 74 69 74 69 65 73  d for identities
21780 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22 29   -- rescanning")
21790 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  ;....if (cackey_
217a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
217b0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 21 3d  n].identities !=
217c0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b   NULL) {....cack
217d0 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69  ey_free_identiti
217e0 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  es(cackey_sessio
217f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
21800 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f  ntities, cackey_
21810 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21820 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
21830 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  unt);.....cackey
21840 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21850 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  on].identities =
21860 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79   NULL;....cackey
21870 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21880 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
21890 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09  ount = 0;...}...
218a0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
218b0 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20  s[slotID].label 
218c0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 72  != NULL) {....fr
218d0 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
218e0 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a  slotID].label);.
218f0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
21900 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20  slotID].label = 
21910 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  NULL;...}....cac
21920 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
21930 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  set(&cackey_slot
21940 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a 09 09 63 61  s[slotID]);...ca
21950 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
21960 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  D].slot_reset = 
21970 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  0;..}...if (cack
21980 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21990 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
219a0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   == NULL) {...ca
219b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
219c0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
219d0 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
219e0 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63  _identities(&cac
219f0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
21a00 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  ], &cackey_sessi
21a10 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
21a20 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
21a30 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c  ..}...if (pTempl
21a40 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate != NULL) {..
21a50 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20  .if (ulCount != 
21a60 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73  0) {....cackey_s
21a70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21a80 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
21a90 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a  ount = ulCount;.
21aa0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
21ab0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
21ac0 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c  rch_query = mall
21ad0 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a  oc(ulCount * siz
21ae0 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29  eof(*pTemplate))
21af0 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63  ;.....memcpy(cac
21b00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
21b10 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
21b20 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20  ery, pTemplate, 
21b30 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  ulCount * sizeof
21b40 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09  (*pTemplate));..
21b50 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
21b60 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 69  idx < ulCount; i
21b70 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28  dx++) {.....if (
21b80 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75  pTemplate[idx].u
21b90 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 20  lValueLen == 0) 
21ba0 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65  {......cackey_se
21bb0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
21bc0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
21bd0 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  x].pValue = NULL
21be0 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65  ;.......continue
21bf0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63  ;.....}......cac
21c00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
21c10 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
21c20 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20  ery[idx].pValue 
21c30 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d 70 6c 61  = malloc(pTempla
21c40 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  te[idx].ulValueL
21c50 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 61  en);......if (ca
21c60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21c70 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
21c80 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
21c90 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  ) {......memcpy(
21ca0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21cb0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
21cc0 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
21cd0 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64  ue, pTemplate[id
21ce0 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70  x].pValue, pTemp
21cf0 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75  late[idx].ulValu
21d00 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 09  eLen);.....}....
21d10 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
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 5f 63 6f 75 6e 74 20 3d 20 30  _query_count = 0
21d50 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
21d60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
21d70 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55  earch_query = NU
21d80 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  LL;...}..} else 
21d90 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  {...if (ulCount 
21da0 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65  != 0) {....cacke
21db0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21dc0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21dd0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
21de0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21df0 20 53 65 61 72 63 68 20 71 75 65 72 79 20 73 70   Search query sp
21e00 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
21e10 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 71   but number of q
21e20 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 73  uery terms not s
21e30 70 65 63 69 66 69 65 64 20 61 73 20 30 2e 22 29  pecified as 0.")
21e40 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
21e50 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
21e60 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
21e70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21e80 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
21e90 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b  ount = 0;...cack
21ea0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21eb0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
21ec0 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  ry = NULL;..}...
21ed0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21ee0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
21ef0 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 61  _active = 1;..ca
21f00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21f10 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
21f20 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75  urr_id = 0;...mu
21f30 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
21f40 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
21f50 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21f60 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
21f70 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
21f80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21f90 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
21fa0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
21fb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
21fc0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
21fd0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21fe0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
21ff0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
22000 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
22010 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74  n(CKR_OK);.}..st
22020 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
22030 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61  pkcs11_compare_a
22040 74 74 72 69 62 75 74 65 73 28 43 4b 5f 41 54 54  ttributes(CK_ATT
22050 52 49 42 55 54 45 20 2a 61 2c 20 43 4b 5f 41 54  RIBUTE *a, CK_AT
22060 54 52 49 42 55 54 45 20 2a 62 29 20 7b 0a 09 75  TRIBUTE *b) {..u
22070 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 6d  nsigned char *sm
22080 61 6c 6c 62 75 66 2c 20 2a 6c 61 72 67 65 62 75  allbuf, *largebu
22090 66 3b 0a 09 73 69 7a 65 5f 74 20 73 6d 61 6c 6c  f;..size_t small
220a0 62 75 66 5f 6c 65 6e 2c 20 6c 61 72 67 65 62 75  buf_len, largebu
220b0 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 61 2d 3e  f_len;...if (a->
220c0 74 79 70 65 20 21 3d 20 62 2d 3e 74 79 70 65 29  type != b->type)
220d0 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a   {...return(0);.
220e0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
220f0 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 2e 2e  G_PRINTF("    ..
22100 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67  . found matching
22110 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09 43   type ...");...C
22120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22130 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75  TBUF("    ... ou
22140 72 20 76 61 6c 75 65 3a 22 2c 20 61 2d 3e 70 56  r value:", a->pV
22150 61 6c 75 65 2c 20 61 2d 3e 75 6c 56 61 6c 75 65  alue, a->ulValue
22160 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 62 2d 3e 70  Len);...if (b->p
22170 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Value == NULL) {
22180 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22190 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
221a0 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 72  .. found wildcar
221b0 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65  d match");....re
221c0 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66  turn(1);..}...if
221d0 20 28 61 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e   (a->pValue == N
221e0 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
221f0 30 29 3b 0a 09 7d 0a 0a 20 09 69 66 20 28 62 2d  0);..}.. .if (b-
22200 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 61  >ulValueLen == a
22210 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20  ->ulValueLen && 
22220 6d 65 6d 63 6d 70 28 61 2d 3e 70 56 61 6c 75 65  memcmp(a->pValue
22230 2c 20 62 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e  , b->pValue, b->
22240 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30  ulValueLen) == 0
22250 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22260 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20  UG_PRINTF("     
22270 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63    ... found exac
22280 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65  t match");....re
22290 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 77  turn(1);..}...sw
222a0 69 74 63 68 20 28 61 2d 3e 74 79 70 65 29 20 7b  itch (a->type) {
222b0 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55  ...case CKA_MODU
222c0 4c 55 53 3a 0a 09 09 09 69 66 20 28 61 2d 3e 75  LUS:....if (a->u
222d0 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d 3e  lValueLen == b->
222e0 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
222f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09  ..break;....}...
22300 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65  ..if (a->ulValue
22310 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56 61 6c 75 65  Len > b->ulValue
22320 4c 65 6e 29 20 7b 0a 09 09 09 09 73 6d 61 6c 6c  Len) {.....small
22330 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b  buf = b->pValue;
22340 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65  .....smallbuf_le
22350 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = b->ulValueLe
22360 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66  n;......largebuf
22370 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = a->pValue;...
22380 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d  ..largebuf_len =
22390 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   a->ulValueLen;.
223a0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
223b0 73 6d 61 6c 6c 62 75 66 20 3d 20 61 2d 3e 70 56  smallbuf = a->pV
223c0 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62  alue;.....smallb
223d0 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61  uf_len = a->ulVa
223e0 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72  lueLen;......lar
223f0 67 65 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75  gebuf = b->pValu
22400 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f  e;.....largebuf_
22410 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65  len = b->ulValue
22420 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 6f  Len;....}.....fo
22430 72 20 28 3b 20 6c 61 72 67 65 62 75 66 5f 6c 65  r (; largebuf_le
22440 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  n != smallbuf_le
22450 6e 3b 20 6c 61 72 67 65 62 75 66 2b 2b 2c 6c 61  n; largebuf++,la
22460 72 67 65 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b 0a  rgebuf_len--) {.
22470 09 09 09 09 69 66 20 28 6c 61 72 67 65 62 75 66  ....if (largebuf
22480 5b 30 5d 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  [0] != 0) {.....
22490 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09  .break;.....}...
224a0 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 72 67 65  .}.....if (large
224b0 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c  buf_len != small
224c0 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 62  buf_len) {.....b
224d0 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  reak;....}.....i
224e0 66 20 28 6d 65 6d 63 6d 70 28 6c 61 72 67 65 62  f (memcmp(largeb
224f0 75 66 2c 20 73 6d 61 6c 6c 62 75 66 2c 20 73 6d  uf, smallbuf, sm
22500 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 3d 3d 20 30  allbuf_len) == 0
22510 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
22520 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
22530 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 61 70      ... found ap
22540 70 72 6f 78 69 6d 61 74 65 20 6d 61 74 63 68 22  proximate match"
22550 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 31  );......return(1
22560 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  );....}.....brea
22570 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30  k;..}...return(0
22580 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
22590 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
225a0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43  C_FindObjects)(C
225b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
225c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
225d0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
225e0 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f  phObject, CK_ULO
225f0 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  NG ulMaxObjectCo
22600 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  unt, CK_ULONG_PT
22610 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  R pulObjectCount
22620 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
22630 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72  ey_identity *cur
22640 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42  r_id;..CK_ATTRIB
22650 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
22660 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69  .CK_ULONG curr_i
22670 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f  d_idx, curr_out_
22680 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74  id_idx, curr_att
22690 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72  r_idx, sess_attr
226a0 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  _idx;..CK_ULONG 
226b0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70  matched_count, p
226c0 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
226d0 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  t;..int mutex_re
226e0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
226f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
22700 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
22710 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
22720 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
22730 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22740 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
22750 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
22760 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
22770 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
22780 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a  ..}...if (pulObj
22790 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  ectCount == NULL
227a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
227b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
227c0 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  .  pulObjectCoun
227d0 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
227e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
227f0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
22800 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d  .if (phObject ==
22810 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62   NULL && ulMaxOb
22820 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
22830 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
22840 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62  cuit, if zero ob
22850 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69  jects were speci
22860 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f  fied return zero
22870 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65   items immediate
22880 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65  ly */...*pulObje
22890 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  ctCount = 0;....
228a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
228b0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
228c0 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
228d0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
228e0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
228f0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
22900 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
22910 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
22920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22930 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73  or.  phObject is
22940 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
22950 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
22960 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
22970 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  (ulMaxObjectCoun
22980 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
22990 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
229a0 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d  "Error.  Maximum
229b0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
229c0 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ts specified as 
229d0 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75  zero.");....retu
229e0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
229f0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
22a00 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
22a10 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
22a20 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
22a30 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
22a40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
22a50 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
22a60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22a70 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
22a80 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
22a90 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
22aa0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
22ab0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
22ac0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
22ad0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
22ae0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
22af0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
22b00 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
22b10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22b20 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
22b30 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
22b40 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22b50 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
22b60 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
22b70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
22b80 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
22b90 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
22ba0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
22bb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22bc0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
22bd0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
22be0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
22bf0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
22c00 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
22c10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
22c20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22c30 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
22c40 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
22c50 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
22c60 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
22c70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22c80 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
22c90 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
22ca0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
22cb0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
22cc0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
22cd0 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  .curr_out_id_idx
22ce0 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72   = 0;..for (curr
22cf0 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79  _id_idx = cackey
22d00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
22d10 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
22d20 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20  id; curr_id_idx 
22d30 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
22d40 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
22d50 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20  tities_count && 
22d60 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
22d70 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29  ; curr_id_idx++)
22d80 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26   {...curr_id = &
22d90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22da0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
22db0 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78  ties[curr_id_idx
22dc0 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ];....CACKEY_DEB
22dd0 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65  UG_PRINTF("Proce
22de0 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  ssing identity:%
22df0 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
22e00 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78  ong) curr_id_idx
22e10 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f  );....matched_co
22e20 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20  unt = 0;....for 
22e30 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d  (curr_attr_idx =
22e40 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64   0; curr_attr_id
22e50 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
22e60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
22e70 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
22e80 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b  ; curr_attr_idx+
22e90 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74  +) {....prev_mat
22ea0 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74  ched_count = mat
22eb0 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09  ched_count;.....
22ec0 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63  curr_attr = &cac
22ed0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22ee0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
22ef0 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64  ery[curr_attr_id
22f00 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  x];.....CACKEY_D
22f10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43  EBUG_PRINTF("  C
22f20 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72  hecking for attr
22f30 69 62 75 74 65 20 25 73 20 28 30 78 25 30 38 6c  ibute %s (0x%08l
22f40 78 29 20 69 6e 20 69 64 65 6e 74 69 74 79 3a 25  x) in identity:%
22f50 69 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  i...", CACKEY_DE
22f60 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55  BUG_FUNC_ATTRIBU
22f70 54 45 5f 54 4f 5f 53 54 52 28 63 75 72 72 5f 61  TE_TO_STR(curr_a
22f80 74 74 72 2d 3e 74 79 70 65 29 2c 20 28 75 6e 73  ttr->type), (uns
22f90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
22fa0 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e  _attr->type, (in
22fb0 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
22fc0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
22fd0 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 56  _PRINTBUF("    V
22fe0 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  alue looking for
22ff0 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 70  :", curr_attr->p
23000 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72  Value, curr_attr
23010 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ->ulValueLen);..
23020 09 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74  ...for (sess_att
23030 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f  r_idx = 0; sess_
23040 61 74 74 72 5f 69 64 78 20 3c 20 63 75 72 72 5f  attr_idx < curr_
23050 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63  id->attributes_c
23060 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f  ount; sess_attr_
23070 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20  idx++) {.....if 
23080 28 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63  (cackey_pkcs11_c
23090 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65  ompare_attribute
230a0 73 28 26 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  s(&curr_id->attr
230b0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
230c0 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61 74 74 72  _idx], curr_attr
230d0 29 29 20 7b 0a 09 09 09 09 09 6d 61 74 63 68 65  )) {......matche
230e0 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09  d_count++;......
230f0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09  .break;.....}...
23100 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 65  .}...../* If the
23110 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c 64   attribute could
23120 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64 2c   not be matched,
23130 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d   do not try to m
23140 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20  atch additional 
23150 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 09  attributes */...
23160 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68 65  .if (prev_matche
23170 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68  d_count == match
23180 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  ed_count) {.....
23190 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  break;....}...}.
231a0 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f 63  ...if (matched_c
231b0 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73  ount == cackey_s
231c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
231d0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
231e0 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
231f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23200 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74    ... All %i att
23210 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20  ributes checked 
23220 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e  for found, addin
23230 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74 6f  g identity:%i to
23240 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22 2c   returned list",
23250 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65   (int) cackey_se
23260 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23270 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
23280 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  unt, (int) curr_
23290 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f  id_idx);.....phO
232a0 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69  bject[curr_out_i
232b0 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 64  d_idx] = curr_id
232c0 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c  _idx + 1;.....ul
232d0 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d  MaxObjectCount--
232e0 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f 69  ;.....curr_out_i
232f0 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73  d_idx++;...} els
23300 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
23310 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
23320 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e  . Not all %i (on
23330 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74 74  ly found %i) att
23340 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20  ributes checked 
23350 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61  for found, not a
23360 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  dding identity:%
23370 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79  i", (int) cackey
23380 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23390 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
233a0 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61  _count, (int) ma
233b0 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e  tched_count, (in
233c0 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
233d0 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f  ...}..}..cackey_
233e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
233f0 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
23400 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 3b  d = curr_id_idx;
23410 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  ..*pulObjectCoun
23420 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f  t = curr_out_id_
23430 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  idx;...mutex_ret
23440 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
23450 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23460 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
23470 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
23480 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23490 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
234a0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
234b0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
234c0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
234d0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
234e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
234f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
23500 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65  K (%i), num obje
23510 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f  cts = %lu", CKR_
23520 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  OK, *pulObjectCo
23530 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  unt);...return(C
23540 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
23550 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
23560 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
23570 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  tsFinal)(CK_SESS
23580 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23590 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47  ion) {..CK_ULONG
235a0 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
235b0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
235c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
235d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
235e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
235f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
23600 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23610 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
23620 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
23630 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
23640 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
23650 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
23660 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
23670 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
23680 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
23690 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
236a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
236b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
236c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
236d0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
236e0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
236f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
23700 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
23710 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
23720 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
23730 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
23740 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
23750 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
23760 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
23770 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23780 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
23790 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
237a0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
237b0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
237c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
237d0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
237e0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
237f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23800 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
23810 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23820 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
23830 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
23840 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
23850 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
23860 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
23870 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
23880 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
23890 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
238a0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
238b0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
238c0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
238d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
238e0 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f  rror.  Search no
238f0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
23900 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
23910 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
23920 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61  ALIZED);..}...ca
23930 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
23940 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
23950 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72  ctive = 0;...for
23960 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
23970 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
23980 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
23990 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69  h_query_count; i
239a0 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (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 71  ession].search_q
239d0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
239e0 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
239f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23a00 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
23a10 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b  ry[idx].pValue);
23a20 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ...}..}...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 29 20 7b 0a 09 09 66 72 65 65 28 63  uery) {...free(c
23a60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23a70 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
23a80 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74  query);..}...mut
23a90 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
23aa0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23ab0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23ac0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
23ad0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
23ae0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23af0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
23b00 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
23b10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
23b20 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
23b30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23b40 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
23b50 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
23b60 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
23b70 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
23b80 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23b90 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
23ba0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
23bb0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
23bc0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
23bd0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
23be0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
23bf0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
23c00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23c10 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23c20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23c30 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23c40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23c50 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23c60 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23c70 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23c80 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23c90 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
23ca0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
23cb0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
23cc0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
23cd0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
23ce0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23cf0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
23d00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23d10 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
23d20 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
23d30 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
23d40 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
23d50 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
23d60 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
23d70 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
23d80 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
23d90 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61  R pEncryptedData
23da0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
23db0 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
23dc0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
23dd0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
23de0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
23df0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
23e00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23e10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23e20 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
23e30 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23e40 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
23e50 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
23e60 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
23e70 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
23e80 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
23e90 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
23ea0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
23eb0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
23ec0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
23ed0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23ee0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
23ef0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
23f00 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55  K_RV, C_EncryptU
23f10 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
23f20 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
23f30 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
23f40 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
23f50 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  lPartLen, CK_BYT
23f60 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
23f70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
23f80 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50  TR pulEncryptedP
23f90 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
23fa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23fb0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
23fc0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
23fd0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
23fe0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23ff0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
24000 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
24010 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
24020 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
24030 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
24040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
24050 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
24060 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24070 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
24080 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24090 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
240a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
240b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
240c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
240d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
240e0 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  yptFinal)(CK_SES
240f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
24100 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
24110 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64  R pLastEncrypted
24120 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
24130 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70  TR pulLastEncryp
24140 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
24150 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24160 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
24170 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
24180 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
24190 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
241a0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
241b0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
241c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
241d0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
241e0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
241f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24200 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24210 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
24220 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
24230 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
24240 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
24250 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
24260 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
24270 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24280 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24290 44 65 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f  DecryptInit)(CK_
242a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
242b0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
242c0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
242d0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
242e0 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
242f0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
24300 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41  ;...hKey--;...CA
24310 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24320 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
24330 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
24340 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
24350 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24360 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
24370 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
24380 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
24390 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
243a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
243b0 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55  pMechanism == NU
243c0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
243d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
243e0 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69  or. pMechanism i
243f0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
24400 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
24410 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
24420 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65   (pMechanism->me
24430 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52  chanism != CKM_R
24440 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43  SA_PKCS) {...CAC
24450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24460 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
24470 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e  ism->mechanism n
24480 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
24490 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a  CKM_RSA_PKCS");.
244a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45  ...return(CKR_ME
244b0 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e  CHANISM_PARAM_IN
244c0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
244d0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
244e0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
244f0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
24500 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
24510 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24520 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
24530 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24540 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
24550 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
24560 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
24570 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
24580 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
24590 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
245a0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
245b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
245c0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
245d0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
245e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
245f0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
24600 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
24610 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
24620 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
24630 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
24640 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
24650 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
24660 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24670 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
24680 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24690 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
246a0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
246b0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
246c0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
246d0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
246e0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
246f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24700 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
24710 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
24720 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
24730 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
24740 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24750 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
24760 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72  pt already in pr
24770 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09  ogress.");......
24780 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
24790 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d  TION_ACTIVE);..}
247a0 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63  ...if (hKey >= c
247b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
247c0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
247d0 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63  ies_count) {...c
247e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
247f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24800 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
24810 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24820 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f  r.  Key handle o
24830 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71  ut of range (req
24840 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20  uested key %lu, 
24850 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74  only %lu identit
24860 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22  ies available)."
24870 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
24880 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65  ) hKey, (unsigne
24890 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73  d long) cackey_s
248a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
248b0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
248c0 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  nt);....return(C
248d0 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e  KR_KEY_HANDLE_IN
248e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  VALID);..}...cac
248f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24900 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
24910 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63  ctive = 1;...cac
24920 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24930 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
24940 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68  echanism = pMech
24950 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
24960 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
24970 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
24980 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d  rypt_mech_parm =
24990 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61   pMechanism->pPa
249a0 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79  rameter;..cackey
249b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
249c0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68  on].decrypt_mech
249d0 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68  _parmlen = pMech
249e0 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74  anism->ulParamet
249f0 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73  erLen;..cackey_s
24a00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24a10 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69  ].decrypt_identi
24a20 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  ty = &cackey_ses
24a30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
24a40 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d  identities[hKey]
24a50 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
24a60 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
24a70 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
24a80 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
24a90 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
24aa0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24ab0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24ac0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
24ad0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24ae0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
24af0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
24b00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
24b10 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
24b20 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
24b30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
24b40 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24b50 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24b60 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53  Decrypt)(CK_SESS
24b70 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
24b80 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
24b90 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c   pEncryptedData,
24ba0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72   CK_ULONG ulEncr
24bb0 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b  yptedDataLen, CK
24bc0 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
24bd0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
24be0 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f  lDataLen) {..CK_
24bf0 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70  ULONG datalen_up
24c00 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69  date, datalen_fi
24c10 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72  nal;..CK_RV decr
24c20 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  ypt_ret;..int mu
24c30 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
24c40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24c50 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
24c60 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
24c70 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
24c80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24c90 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
24ca0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
24cb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
24cc0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
24cd0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
24ce0 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55  pulDataLen == NU
24cf0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
24d00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24d10 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69  or. pulDataLen i
24d20 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
24d30 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
24d40 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61  TS_BAD);..}...da
24d50 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a  talen_update = *
24d60 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65  pulDataLen;...de
24d70 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65  crypt_ret = C_De
24d80 63 72 79 70 74 55 70 64 61 74 65 28 68 53 65 73  cryptUpdate(hSes
24d90 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64  sion, pEncrypted
24da0 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65  Data, ulEncrypte
24db0 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c  dDataLen, pData,
24dc0 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65   &datalen_update
24dd0 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f  );..if (decrypt_
24de0 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
24df0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24e00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24e10 44 65 63 72 79 70 74 55 70 64 61 74 65 28 29 20  DecryptUpdate() 
24e20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
24e30 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
24e40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
24e50 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09  ecrypt_ret);....
24e60 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20  if (decrypt_ret 
24e70 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  != CKR_BUFFER_TO
24e80 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a  O_SMALL) {..../*
24e90 20 54 65 72 6d 69 6e 61 74 65 20 64 65 63 72 79   Terminate decry
24ea0 70 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ption operation 
24eb0 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74  */.....mutex_ret
24ec0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
24ed0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
24ee0 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28  iglock);....if (
24ef0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
24f00 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
24f10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24f20 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
24f30 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
24f40 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
24f50 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09  _ERROR);....}...
24f60 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
24f70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24f80 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  .active) {.....c
24f90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
24fa0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24fb0 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  k);......CACKEY_
24fc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24fd0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
24fe0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
24ff0 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
25000 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
25010 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  VALID);....}....
25020 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
25030 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25040 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
25050 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
25060 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25070 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09  _biglock);......
25080 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25090 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
250a0 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e  rypt not active.
250b0 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72  ");........retur
250c0 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
250d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
250e0 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  ;....}.....cacke
250f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25100 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
25110 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74  ive = 0;.....mut
25120 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
25130 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25140 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25150 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ....if (mutex_re
25160 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
25170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25180 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
25190 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
251a0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
251b0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
251c0 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  );....}...}....r
251d0 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65  eturn(decrypt_re
251e0 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61  t);..}...if (pDa
251f0 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d  ta) {...pData +=
25200 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b   datalen_update;
25210 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e  ..}..datalen_fin
25220 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e  al = *pulDataLen
25230 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74   - datalen_updat
25240 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74  e;...decrypt_ret
25250 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61   = C_DecryptFina
25260 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74  l(hSession, pDat
25270 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61  a, &datalen_fina
25280 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74  l);..if (decrypt
25290 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
252a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
252b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
252c0 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20   DecryptFinal() 
252d0 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
252e0 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
252f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
25300 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09  ecrypt_ret);....
25310 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72  return(decrypt_r
25320 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61  et);..}...*pulDa
25330 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f  taLen = datalen_
25340 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e  update + datalen
25350 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  _final;...CACKEY
25360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
25370 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
25380 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
25390 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
253a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
253b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
253c0 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 29 28  _DecryptUpdate)(
253d0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
253e0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
253f0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
25400 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
25410 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
25420 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
25430 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
25440 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29  _PTR pulPartLen)
25450 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59   {..static CK_BY
25460 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09  TE buf[16384];..
25470 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a  ssize_t buflen;.
25480 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
25490 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  ID;..CK_RV retva
254a0 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
254b0 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65  ERROR;..int mute
254c0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
254d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
254e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
254f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
25500 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
25510 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25520 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
25530 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
25540 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
25550 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
25560 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
25570 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
25580 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
25590 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
255a0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
255b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
255c0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
255d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
255e0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
255f0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
25600 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
25610 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
25620 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  LID);..}...if (p
25630 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d  EncryptedPart ==
25640 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79   NULL && ulEncry
25650 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30  ptedPartLen == 0
25660 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
25670 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65  ircuit if we are
25680 20 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70   asked to decryp
25690 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a  t nothing... */.
256a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
256b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
256c0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
256d0 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
256e0 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
256f0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
25700 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61  if (pEncryptedPa
25710 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
25720 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25730 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63  NTF("Error. pEnc
25740 72 79 70 74 65 64 50 61 72 74 20 69 73 20 4e 55  ryptedPart is NU
25750 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70  LL, but ulEncryp
25760 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f  tedPartLen is no
25770 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  t 0.");....retur
25780 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
25790 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
257a0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
257b0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  n == 0) {...CACK
257c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
257d0 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70  "Error. ulEncryp
257e0 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c  tedPartLen is 0,
257f0 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f   but pPart is no
25800 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
25810 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
25820 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
25830 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20   (pulPartLen == 
25840 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
25850 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25860 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e  rror. pulPartLen
25870 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
25880 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
25890 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
258a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
258b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
258c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
258d0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
258e0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
258f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25900 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
25910 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
25920 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
25930 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
25940 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
25950 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25960 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
25970 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25980 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25990 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
259a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
259b0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
259c0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
259d0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
259e0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
259f0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
25a00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25a10 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
25a20 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
25a30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25a40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
25a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25a60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
25a70 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65  crypt not active
25a80 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
25a90 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
25aa0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
25ab0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
25ac0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25ad0 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
25ae0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
25af0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
25b00 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
25b10 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
25b20 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
25b30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25b40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25b50 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
25b60 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
25b70 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
25b80 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
25b90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
25ba0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
25bb0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
25bc0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
25bd0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
25be0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25bf0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
25c00 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
25c10 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
25c20 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
25c30 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
25c40 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25c50 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25c60 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
25c70 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25c80 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
25c90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25ca0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
25cb0 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  t_mechanism) {..
25cc0 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
25cd0 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61  CS:..../* Ask ca
25ce0 72 64 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f  rd to decrypt */
25cf0 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63  ....buflen = cac
25d00 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
25d10 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
25d20 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65  otID], cackey_se
25d30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25d40 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74  .decrypt_identit
25d50 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  y, pEncryptedPar
25d60 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  t, ulEncryptedPa
25d70 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65  rtLen, buf, size
25d80 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a  of(buf), 0, 1);.
25d90 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c  ....if (buflen <
25da0 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63   0) {...../* Dec
25db0 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20  ryption failed. 
25dc0 2a 2f 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65  */.....if (bufle
25dd0 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
25de0 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a  _E_NEEDLOGIN) {.
25df0 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
25e00 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45  R_USER_NOT_LOGGE
25e10 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65  D_IN;.....} else
25e20 20 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43   if (buflen == C
25e30 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
25e40 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09  ENABSENT) {.....
25e50 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45  .retval = CKR_DE
25e60 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09  VICE_REMOVED;...
25e70 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
25e80 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
25e90 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09  ERAL_ERROR;.....
25ea0 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  }....} else if (
25eb0 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
25ec0 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50   buflen) > *pulP
25ed0 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29  artLen && pPart)
25ee0 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70   {...../* Decryp
25ef0 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ted data too lar
25f00 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c  ge */.....retval
25f10 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
25f20 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c  O_SMALL;....} el
25f30 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61  se {.....if (pPa
25f40 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  rt) {......memcp
25f50 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75  y(pPart, buf, bu
25f60 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  flen);.....}....
25f70 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20  ..*pulPartLen = 
25f80 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74  buflen;......ret
25f90 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09  val = CKR_OK;...
25fa0 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
25fb0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
25fc0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
25fd0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25fe0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
25ff0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
26000 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26010 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26020 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
26030 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
26040 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
26050 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
26060 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
26070 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
26080 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
26090 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
260a0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
260b0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
260c0 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  yptFinal)(CK_SES
260d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
260e0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
260f0 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f  R pLastPart, CK_
26100 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73  ULONG_PTR pulLas
26110 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74  tPartLen) {..int
26120 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
26130 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65  int terminate_de
26140 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43  crypt = 1;...CAC
26150 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26160 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
26170 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
26180 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
26190 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
261a0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
261b0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
261c0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
261d0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
261e0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
261f0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
26200 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
26210 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
26220 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
26230 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
26240 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
26250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26260 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
26270 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
26280 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
26290 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
262a0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
262b0 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
262c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
262d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
262e0 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50  "Error. pulLastP
262f0 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
26300 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26310 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
26320 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
26330 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
26340 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
26350 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
26360 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
26370 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26380 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26390 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
263a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
263b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
263c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
263d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
263e0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
263f0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
26400 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26410 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
26420 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26430 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
26440 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
26450 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
26460 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
26470 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
26480 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
26490 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
264a0 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
264b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
264c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
264d0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
264e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
264f0 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
26500 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
26510 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
26520 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
26530 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  IZED);..}...*pul
26540 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b  LastPartLen = 0;
26550 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72 74  ...if (pLastPart
26560 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65   == NULL) {...te
26570 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20  rminate_decrypt 
26580 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  = 0;..}...if (te
26590 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29  rminate_decrypt)
265a0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
265b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
265c0 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20  ecrypt_active = 
265d0 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
265e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
265f0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
26600 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
26610 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
26620 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
26630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26640 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
26650 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
26660 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
26670 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
26680 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26690 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
266a0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
266b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
266c0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
266d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
266e0 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28  , C_DigestInit)(
266f0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
26700 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
26710 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
26720 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b  chanism) {..CACK
26730 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26740 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
26750 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
26760 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
26770 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26780 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
26790 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
267a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
267b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
267c0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
267d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
267e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
267f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
26800 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
26810 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
26820 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
26830 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
26840 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
26850 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
26860 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
26870 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  est)(CK_SESSION_
26880 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
26890 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
268a0 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
268b0 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
268c0 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f  PTR pDigest, CK_
268d0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67  ULONG_PTR pulDig
268e0 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  estLen) {..CACKE
268f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26900 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
26910 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
26920 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
26930 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26940 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
26950 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
26960 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
26970 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
26980 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
26990 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
269a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
269b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
269c0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
269d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
269e0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
269f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26a00 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
26a10 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
26a20 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
26a30 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  stUpdate)(CK_SES
26a40 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
26a50 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
26a60 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
26a70 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09  G ulPartLen) {..
26a80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26a90 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
26aa0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
26ab0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
26ac0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26ad0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
26ae0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
26af0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
26b00 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
26b10 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
26b20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26b30 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
26b40 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
26b50 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
26b60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
26b70 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
26b80 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
26b90 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
26ba0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
26bb0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
26bc0 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53  _DigestKey)(CK_S
26bd0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
26be0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
26bf0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
26c00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26c10 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
26c20 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
26c30 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
26c40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26c50 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
26c60 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
26c70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26c80 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
26c90 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
26ca0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26cb0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26cc0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
26cd0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
26ce0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
26cf0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
26d00 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
26d10 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26d20 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
26d30 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
26d40 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28   C_DigestFinal)(
26d50 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
26d60 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
26d70 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
26d80 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
26d90 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
26da0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26db0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
26dc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
26dd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
26de0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26df0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
26e00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
26e10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
26e20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
26e30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
26e40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26e50 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26e60 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26e70 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
26e80 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26e90 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
26ea0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
26eb0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26ec0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
26ed0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
26ee0 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53  SignInit)(CK_SES
26ef0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
26f00 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
26f10 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
26f20 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
26f30 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74  DLE hKey) {..int
26f40 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
26f50 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45  .hKey--;...CACKE
26f60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26f70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
26f80 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
26f90 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
26fa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26fb0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
26fc0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
26fd0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
26fe0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
26ff0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
27000 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29  chanism == NULL)
27010 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27020 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27030 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e   pMechanism is N
27040 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
27050 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
27060 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
27070 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
27080 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f  nism != CKM_RSA_
27090 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  PKCS) {...CACKEY
270a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
270b0 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
270c0 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20  ->mechanism not 
270d0 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d  specified as CKM
270e0 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09  _RSA_PKCS");....
270f0 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41  return(CKR_MECHA
27100 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c  NISM_PARAM_INVAL
27110 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ID);..}...if (hS
27120 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
27130 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
27140 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
27150 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
27160 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
27170 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
27180 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27190 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
271a0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
271b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
271c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
271d0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
271e0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
271f0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
27200 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
27210 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
27220 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
27230 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27240 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
27250 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
27260 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
27270 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
27280 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
27290 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
272a0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
272b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
272c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
272d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
272e0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
272f0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
27300 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
27310 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
27320 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
27330 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
27340 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
27350 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
27360 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
27370 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27380 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
27390 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
273a0 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64  or.  Sign alread
273b0 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29  y in progress.")
273c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
273d0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49  R_OPERATION_ACTI
273e0 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b  VE);..}...if (hK
273f0 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73  ey >= cackey_ses
27400 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27410 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
27420 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
27430 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
27440 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
27450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27460 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68  F("Error.  Key h
27470 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
27480 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65  ge (requested ke
27490 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20  y %lu, only %lu 
274a0 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c  identities avail
274b0 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e  able).", (unsign
274c0 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28  ed long) hKey, (
274d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
274e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
274f0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
27500 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  ies_count);....r
27510 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41  eturn(CKR_KEY_HA
27520 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
27530 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
27540 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
27550 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  gn_active = 1;..
27560 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
27570 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
27580 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63  mechanism = pMec
27590 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
275a0 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  m;...cackey_sess
275b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
275c0 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38  ign_buflen = 128
275d0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
275e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
275f0 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09  n_bufused = 0;..
27600 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27610 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
27620 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  uf = malloc(size
27630 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
27640 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
27650 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
27660 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27670 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
27680 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
27690 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e  _PRINTF("Session
276a0 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69   %lu sign_identi
276b0 74 79 20 69 73 20 25 70 20 28 69 64 65 6e 74 69  ty is %p (identi
276c0 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69  ty #%lu)", (unsi
276d0 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73  gned long) hSess
276e0 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26 63  ion, (void *) &c
276f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27700 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
27710 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69  ies[hKey], (unsi
27720 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29  gned long) hKey)
27730 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
27740 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
27750 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61  n_identity = &ca
27760 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27770 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
27780 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65  es[hKey];...mute
27790 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
277a0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
277b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
277c0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
277d0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
277e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
277f0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
27800 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
27810 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
27820 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
27830 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27840 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
27850 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
27860 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
27870 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
27880 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
27890 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b  K_RV, C_Sign)(CK
278a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
278b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
278c0 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
278d0 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
278e0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
278f0 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
27900 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75  G_PTR pulSignatu
27910 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e  reLen) {..unsign
27920 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69  ed long start_si
27930 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f  gn_bufused;..CK_
27940 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e  RV sign_ret;..in
27950 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
27960 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27970 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
27980 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
27990 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
279a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
279b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
279c0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
279d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
279e0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
279f0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
27a00 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
27a10 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
27a20 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
27a30 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
27a40 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
27a50 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
27a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27a70 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
27a80 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
27a90 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
27aa0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
27ab0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
27ac0 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75  .start_sign_bufu
27ad0 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  sed = cackey_ses
27ae0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27af0 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
27b00 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67  sign_ret = C_Sig
27b10 6e 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e  nUpdate(hSession
27b20 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c  , pData, ulDataL
27b30 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72  en);..if (sign_r
27b40 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
27b50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27b60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
27b70 69 67 6e 55 70 64 61 74 65 28 29 20 72 65 74 75  ignUpdate() retu
27b80 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
27b90 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
27ba0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
27bb0 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 73 69 67  ret);....if (sig
27bc0 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46  n_ret != CKR_BUF
27bd0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
27be0 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
27bf0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
27c00 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27c10 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
27c20 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
27c30 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
27c40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27c50 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
27c60 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
27c70 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
27c80 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  ROR);....}.....i
27c90 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
27ca0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
27cb0 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
27cc0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27cd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27ce0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
27cf0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27d00 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
27d10 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
27d20 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
27d30 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
27d40 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ID);....}.....if
27d50 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
27d60 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
27d70 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  n_active) {.....
27d80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
27d90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27da0 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ck);......CACKEY
27db0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27dc0 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20  rror.  Sign not 
27dd0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
27de0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
27df0 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
27e00 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09  ALIZED);....}...
27e10 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
27e20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
27e30 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
27e40 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
27e50 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
27e60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27e70 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
27e80 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
27e90 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
27ea0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27eb0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
27ec0 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
27ed0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
27ee0 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  RROR);....}...}.
27ef0 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
27f00 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72  et);..}...sign_r
27f10 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c  et = C_SignFinal
27f20 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e  (hSession, pSign
27f30 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74  ature, pulSignat
27f40 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69  ureLen);..if (si
27f50 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  gn_ret != CKR_OK
27f60 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f 72  ) {...if (sign_r
27f70 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52  et == CKR_BUFFER
27f80 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
27f90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27fa0 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c 28  INTF("SignFinal(
27fb0 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f 42  ) returned CKR_B
27fc0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20  UFFER_TOO_SMALL 
27fd0 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f  (rv = %lu), undo
27fe0 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65  ing C_SignUpdate
27ff0 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ()", (unsigned l
28000 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
28010 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
28020 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
28030 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61  gn_bufused = sta
28040 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
28050 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67 6e  .....return(sign
28060 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  _ret);...}....CA
28070 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28080 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46  F("Error.  SignF
28090 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
280a0 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
280b0 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
280c0 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
280d0 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
280e0 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
280f0 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c  Signature == NUL
28100 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
28110 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69 67  BUG_PRINTF("pSig
28120 6e 61 74 75 72 65 20 73 70 65 63 69 66 69 65 64  nature specified
28130 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e   as NULL, undoin
28140 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29  g C_SignUpdate()
28150 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65  ");....cackey_se
28160 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28170 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
28180 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
28190 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  ed;....return(si
281a0 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41  gn_ret);..}...CA
281b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
281c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
281d0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
281e0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
281f0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
28200 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
28210 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29  V, C_SignUpdate)
28220 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
28230 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
28240 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
28250 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
28260 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  en) {..int mutex
28270 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
28280 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28290 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
282a0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
282b0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
282c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
282d0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
282e0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
282f0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
28300 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
28310 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
28320 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
28330 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
28340 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
28350 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
28360 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
28370 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28380 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28390 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
283a0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
283b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
283c0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
283d0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  ID);..}...if (pP
283e0 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
283f0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  lPartLen == 0) {
28400 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
28410 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
28420 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68  ked to sign noth
28430 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b  ing... */...CACK
28440 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28450 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
28460 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
28470 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
28480 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
28490 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  OK);..}...if (pP
284a0 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
284b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
284c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61  INTF("Error. pPa
284d0 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20  rt is NULL, but 
284e0 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  ulPartLen is not
284f0 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
28500 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
28510 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
28520 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
28530 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28540 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
28550 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
28560 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
28570 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
28580 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
28590 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
285a0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
285b0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
285c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
285d0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
285e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
285f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28600 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
28610 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
28620 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
28630 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
28640 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
28650 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
28660 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
28670 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28680 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
28690 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
286a0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
286b0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
286c0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
286d0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
286e0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
286f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
28700 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28710 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
28720 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
28730 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
28740 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
28750 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28760 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
28770 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
28780 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
28790 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
287a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ZED);..}...switc
287b0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
287c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
287d0 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
287e0 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
287f0 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75  CS:..../* Accumu
28800 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f  late directly */
28810 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ....if ((cackey_
28820 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28830 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
28840 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63  + ulPartLen) > c
28850 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28860 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
28870 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b  flen) {.....cack
28880 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28890 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
288a0 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63  n *= 2;......cac
288b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
288c0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
288d0 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79  = realloc(cackey
288e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
288f0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69  on].sign_buf, si
28900 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73  zeof(*cackey_ses
28910 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28920 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b  sign_buf) * cack
28930 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28940 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
28950 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  n);....}.....mem
28960 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
28970 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
28980 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f  gn_buf + cackey_
28990 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
289a0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
289b0 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65   pPart, ulPartLe
289c0 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  n);.....cackey_s
289d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
289e0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
289f0 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09  = ulPartLen;....
28a00 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74  .break;..}...mut
28a10 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
28a20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28a30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28a40 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
28a50 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
28a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28a70 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
28a80 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
28a90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
28aa0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
28ab0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28ac0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
28ad0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
28ae0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
28af0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
28b00 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
28b10 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e  CK_RV, C_SignFin
28b20 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
28b30 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
28b40 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
28b50 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
28b60 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
28b70 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20  eLen) {..static 
28b80 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31  CK_BYTE sigbuf[1
28b90 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73  024];..ssize_t s
28ba0 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c  igbuflen;..CK_SL
28bb0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43  OT_ID slotID;..C
28bc0 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
28bd0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
28be0 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f  ..int terminate_
28bf0 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d  sign = 1;..int m
28c00 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
28c10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28c20 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
28c30 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
28c40 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
28c50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28c60 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
28c70 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
28c80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
28c90 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
28ca0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
28cb0 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  (pulSignatureLen
28cc0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...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 70 75 6c 53 69 67  F("Error. pulSig
28cf0 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c  natureLen is NUL
28d00 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
28d10 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
28d20 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
28d30 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
28d40 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
28d50 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
28d60 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
28d70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
28d80 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28d90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28da0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
28db0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
28dc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
28dd0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
28de0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
28df0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
28e00 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
28e10 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
28e20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
28e30 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
28e40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28e50 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
28e60 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
28e70 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
28e80 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
28e90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28ea0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
28eb0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
28ec0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
28ed0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
28ee0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28ef0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
28f00 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
28f10 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28f20 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
28f30 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
28f40 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
28f50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
28f60 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
28f70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
28f80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
28f90 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
28fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28fb0 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
28fc0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
28fd0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
28fe0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
28ff0 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ED);..}...slotID
29000 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
29010 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
29020 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
29030 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
29040 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
29050 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
29060 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
29070 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
29080 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29090 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
290a0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
290b0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
290c0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
290d0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
290e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
290f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
29100 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
29110 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
29120 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29130 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
29140 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
29150 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
29160 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
29170 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
29180 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
29190 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
291a0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
291b0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
291c0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
291d0 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
291e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
291f0 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  gn_mechanism) {.
29200 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
29210 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63  KCS:..../* Ask c
29220 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09  ard to sign */..
29230 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29240 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f  RINTF("Asking to
29250 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74   sign from ident
29260 69 74 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f  ity %p in sessio
29270 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29  n %lu", (void *)
29280 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
29290 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
292a0 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67  identity, (unsig
292b0 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69  ned long) hSessi
292c0 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65  on);....sigbufle
292d0 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
292e0 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
292f0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
29300 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29310 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
29320 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65  ntity, cackey_se
29330 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29340 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65  .sign_buf, cacke
29350 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29360 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
29370 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f  d, sigbuf, sizeo
29380 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29  f(sigbuf), 1, 0)
29390 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66  ;.....if (sigbuf
293a0 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f  len < 0) {...../
293b0 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64  * Signing failed
293c0 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67  . */.....if (sig
293d0 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
293e0 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
293f0 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  N) {......retval
29400 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f   = CKR_USER_NOT_
29410 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d  LOGGED_IN;.....}
29420 20 65 6c 73 65 20 69 66 20 28 73 69 67 62 75 66   else if (sigbuf
29430 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
29440 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
29450 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
29460 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  = CKR_DEVICE_REM
29470 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65  OVED;.....} else
29480 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
29490 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
294a0 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  OR;.....}....} e
294b0 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e  lse if (((unsign
294c0 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c  ed long) sigbufl
294d0 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74  en) > *pulSignat
294e0 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61  ureLen && pSigna
294f0 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53  ture) {...../* S
29500 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c  igned data too l
29510 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b  arge */.....CACK
29520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29530 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  "retval = CKR_BU
29540 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20  FFER_TOO_SMALL; 
29550 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75   sigbuflen = %lu
29560 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  , pulSignatureLe
29570 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  n = %lu", (unsig
29580 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66  ned long) sigbuf
29590 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  len, (unsigned l
295a0 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75  ong) *pulSignatu
295b0 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74  reLen);......ret
295c0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
295d0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09  _TOO_SMALL;.....
295e0 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
295f0 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  = 0;....} else {
29600 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73  .....terminate_s
29610 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66  ign = 0;......if
29620 20 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a   (pSignature) {.
29630 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67  .....memcpy(pSig
29640 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20  nature, sigbuf, 
29650 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09  sigbuflen);.....
29660 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  ..terminate_sign
29670 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09   = 1;.....}.....
29680 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  .*pulSignatureLe
29690 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a  n = sigbuflen;..
296a0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
296b0 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72  _OK;....}.....br
296c0 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  eak;..}...if (te
296d0 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a  rminate_sign) {.
296e0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
296f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29700 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66  sign_buf) {....f
29710 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
29720 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
29730 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09  gn_buf);...}....
29740 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29750 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
29760 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09  ctive = 0;..}...
29770 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
29780 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
29790 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
297a0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
297b0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
297c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
297d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
297e0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
297f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29800 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
29810 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
29820 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29830 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
29840 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
29850 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
29860 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
29870 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63  CK_RV, C_SignRec
29880 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53  overInit)(CK_SES
29890 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
298a0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
298b0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
298c0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
298d0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
298e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
298f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
29900 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
29910 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
29920 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29930 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
29940 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
29950 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
29960 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
29970 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
29980 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29990 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
299a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
299b0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
299c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
299d0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
299e0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
299f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
29a00 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
29a10 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
29a20 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45  gnRecover)(CK_SE
29a30 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
29a40 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
29a50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
29a60 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
29a70 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
29a80 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
29a90 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
29aa0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
29ab0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
29ac0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
29ad0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
29ae0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29af0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29b00 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
29b10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29b20 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
29b30 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
29b40 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
29b50 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29b60 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
29b70 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
29b80 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
29b90 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29ba0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
29bb0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29bc0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
29bd0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
29be0 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e  K_RV, C_VerifyIn
29bf0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
29c00 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
29c10 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
29c20 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
29c30 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
29c40 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
29c50 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
29c60 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
29c70 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
29c80 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29c90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29ca0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
29cb0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29cc0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
29cd0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
29ce0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
29cf0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29d00 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
29d10 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
29d20 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
29d30 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29d40 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
29d50 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29d60 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
29d70 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
29d80 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28  K_RV, C_Verify)(
29d90 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
29da0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
29db0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
29dc0 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
29dd0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
29de0 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
29df0 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
29e00 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
29e10 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
29e20 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
29e30 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
29e40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29e50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29e60 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
29e70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29e80 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
29e90 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
29ea0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
29eb0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29ec0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
29ed0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
29ee0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
29ef0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29f00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
29f10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29f20 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
29f30 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
29f40 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70  K_RV, C_VerifyUp
29f50 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
29f60 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
29f70 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
29f80 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
29f90 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
29fa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29fb0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
29fc0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
29fd0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
29fe0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29ff0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2a000 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2a010 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2a020 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2a030 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2a040 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2a050 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2a060 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a070 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2a080 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a090 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2a0a0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2a0b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2a0c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2a0d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
2a0e0 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ifyFinal)(CK_SES
2a0f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2a100 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2a110 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2a120 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
2a130 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  reLen) {..CACKEY
2a140 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2a150 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2a160 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2a170 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2a180 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a190 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2a1a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2a1b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2a1c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2a1d0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2a1e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2a1f0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2a200 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a210 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2a220 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a230 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2a240 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a250 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2a260 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2a270 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2a280 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b  yRecoverInit)(CK
2a290 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2a2a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2a2b0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2a2c0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2a2d0 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
2a2e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a2f0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2a300 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2a310 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2a320 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a330 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2a340 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2a350 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2a360 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2a370 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2a380 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a390 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a3a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2a3b0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2a3c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2a3d0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2a3e0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2a3f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a400 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2a410 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2a420 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 29  C_VerifyRecover)
2a430 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2a440 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2a450 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
2a460 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ure, CK_ULONG ul
2a470 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b  SignatureLen, CK
2a480 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2a490 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2a4a0 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  lDataLen) {..CAC
2a4b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a4c0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2a4d0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2a4e0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2a4f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a500 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2a510 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2a520 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2a530 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2a540 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2a550 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a560 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2a570 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2a580 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2a590 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a5a0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2a5b0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2a5c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2a5d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2a5e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2a5f0 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74  gestEncryptUpdat
2a600 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2a610 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2a620 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2a630 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
2a640 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
2a650 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
2a660 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2a670 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2a680 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2a690 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2a6a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2a6b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2a6c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a6d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a6e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2a6f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a700 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2a710 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2a720 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2a730 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a740 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2a750 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2a760 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2a770 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a780 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2a790 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a7a0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2a7b0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2a7c0 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44  K_RV, C_DecryptD
2a7d0 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
2a7e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2a7f0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2a800 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
2a810 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2a820 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2a830 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2a840 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2a850 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
2a860 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a870 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2a880 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2a890 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2a8a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a8b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2a8c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2a8d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2a8e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2a8f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2a900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a910 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a920 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2a930 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2a940 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2a950 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2a960 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2a970 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a980 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2a990 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2a9a0 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
2a9b0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2a9c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2a9d0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2a9e0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
2a9f0 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
2aa00 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
2aa10 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2aa20 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
2aa30 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2aa40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2aa50 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2aa60 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2aa70 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2aa80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2aa90 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2aaa0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2aab0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2aac0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2aad0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2aae0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2aaf0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2ab00 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ab10 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2ab20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ab30 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2ab40 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2ab50 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2ab60 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2ab70 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
2ab80 74 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43  tVerifyUpdate)(C
2ab90 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2aba0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2abb0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2abc0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
2abd0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2abe0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2abf0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
2ac00 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
2ac10 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2ac20 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2ac30 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2ac40 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2ac50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ac60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2ac70 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2ac80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2ac90 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2aca0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2acb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2acc0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2acd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ace0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2acf0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2ad00 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2ad10 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2ad20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ad30 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2ad40 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2ad50 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29  , C_GenerateKey)
2ad60 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2ad70 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2ad80 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2ad90 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54  echanism, CK_ATT
2ada0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
2adb0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
2adc0 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
2add0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
2ade0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2adf0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2ae00 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2ae10 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2ae20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2ae30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ae40 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2ae50 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2ae60 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2ae70 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2ae80 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2ae90 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2aea0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2aeb0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2aec0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2aed0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2aee0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2aef0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2af00 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2af10 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2af20 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65  K_RV, C_Generate
2af30 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53  KeyPair)(CK_SESS
2af40 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2af50 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2af60 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2af70 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
2af80 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d  TR pPublicKeyTem
2af90 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
2afa0 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69  ulPublicKeyAttri
2afb0 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54  buteCount, CK_AT
2afc0 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 72 69  TRIBUTE_PTR pPri
2afd0 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c  vateKeyTemplate,
2afe0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76   CK_ULONG ulPriv
2aff0 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 65 43  ateKeyAttributeC
2b000 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
2b010 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62  HANDLE_PTR phPub
2b020 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  licKey, CK_OBJEC
2b030 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50  T_HANDLE_PTR phP
2b040 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41  rivateKey) {..CA
2b050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b060 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2b070 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2b080 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2b090 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b0a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2b0b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2b0c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2b0d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2b0e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2b0f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b100 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2b110 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2b120 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2b130 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2b140 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2b150 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2b160 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2b170 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2b180 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57  CTION(CK_RV, C_W
2b190 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  rapKey)(CK_SESSI
2b1a0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2b1b0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2b1c0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2b1d0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2b1e0 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20  E hWrappingKey, 
2b1f0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2b200 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50   hKey, CK_BYTE_P
2b210 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20  TR pWrappedKey, 
2b220 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2b230 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b  WrappedKeyLen) {
2b240 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b250 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2b260 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2b270 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2b280 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b290 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2b2a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2b2b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2b2c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2b2d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2b2e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b2f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2b300 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2b310 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2b320 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2b330 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2b340 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2b350 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2b360 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2b370 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2b380 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b   C_UnwrapKey)(CK
2b390 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2b3a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2b3b0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2b3c0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2b3d0 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70  _HANDLE hUnwrapp
2b3e0 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f  ingKey, CK_BYTE_
2b3f0 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c  PTR pWrappedKey,
2b400 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70   CK_ULONG ulWrap
2b410 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54  pedKeyLen, CK_AT
2b420 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
2b430 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
2b440 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  ulAttributeCount
2b450 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2b460 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a  LE_PTR phKey) {.
2b470 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b480 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2b490 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2b4a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2b4b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b4c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2b4d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2b4e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2b4f0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2b500 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2b510 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b520 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2b530 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2b540 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2b550 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2b560 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2b570 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2b580 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2b590 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2b5a0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2b5b0 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f  C_DeriveKey)(CK_
2b5c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2b5d0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2b5e0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2b5f0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2b600 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c  HANDLE hBaseKey,
2b610 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
2b620 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
2b630 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74  ULONG ulAttribut
2b640 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
2b650 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
2b660 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2b670 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2b680 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2b690 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2b6a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b6b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b6c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2b6d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2b6e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2b6f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2b700 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2b710 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2b720 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2b730 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2b740 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2b750 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2b760 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2b770 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2b780 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2b790 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2b7a0 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64  K_RV, C_SeedRand
2b7b0 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  om)(CK_SESSION_H
2b7c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2b7d0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65  CK_BYTE_PTR pSee
2b7e0 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65  d, CK_ULONG ulSe
2b7f0 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  edLen) {..CACKEY
2b800 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2b810 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2b820 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2b830 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2b840 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b850 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2b860 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2b870 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2b880 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2b890 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2b8a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2b8b0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2b8c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2b8d0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2b8e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2b8f0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2b900 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2b910 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2b920 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2b930 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72  N(CK_RV, C_Gener
2b940 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45  ateRandom)(CK_SE
2b950 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2b960 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2b970 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20  TR pRandomData, 
2b980 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f  CK_ULONG ulRando
2b990 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  mLen) {..CACKEY_
2b9a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2b9b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2b9c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2b9d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2b9e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b9f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2ba00 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2ba10 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2ba20 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2ba30 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2ba40 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2ba50 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2ba60 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ba70 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2ba80 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ba90 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2baa0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2bab0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a  UPPORTED);.}../*
2bac0 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63   Deprecated Func
2bad0 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  tion */.CK_DEFIN
2bae0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2baf0 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  , C_GetFunctionS
2bb00 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f  tatus)(CK_SESSIO
2bb10 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2bb20 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2bb30 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2bb40 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
2bb50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2bb60 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2bb70 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
2bb80 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2bb90 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
2bba0 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  L);...return(CKR
2bbb0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
2bbc0 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73  RALLEL);...hSess
2bbd0 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20  ion = hSession; 
2bbe0 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
2bbf0 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
2bc00 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72  ng */.}../* Depr
2bc10 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20  ecated Function 
2bc20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
2bc30 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
2bc40 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43  ancelFunction)(C
2bc50 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2bc60 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41   hSession) {..CA
2bc70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bc80 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2bc90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bca0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2bcb0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2bcc0 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20  PARALLEL (%i)", 
2bcd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2bce0 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65  _PARALLEL);...re
2bcf0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2bd00 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
2bd10 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53  ...hSession = hS
2bd20 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65  ession; /* Supre
2bd30 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62  ss unused variab
2bd40 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a  le warning */.}.
2bd50 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2bd60 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
2bd70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b  FunctionList)(CK
2bd80 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50  _FUNCTION_LIST_P
2bd90 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f  TR_PTR ppFunctio
2bda0 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e  nList) {..CK_FUN
2bdb0 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70  CTION_LIST_PTR p
2bdc0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
2bdd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bde0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2bdf0 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e  ..if (ppFunction
2be00 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
2be10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2be20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70  RINTF("Error. pp
2be30 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20  FunctionList is 
2be40 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2be50 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2be60 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e  _BAD);..}...pFun
2be70 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c  ctionList = mall
2be80 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63  oc(sizeof(*pFunc
2be90 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46  tionList));...pF
2bea0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72  unctionList->ver
2beb0 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43  sion.major = ((C
2bec0 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
2bed0 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
2bee0 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75  16) & 0xff;..pFu
2bef0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
2bf00 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41  ion.minor = ((CA
2bf10 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
2bf20 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38  RSION_CODE) >> 8
2bf30 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e  ) & 0xff;...pFun
2bf40 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
2bf50 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74  tialize = C_Init
2bf60 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ialize;..pFuncti
2bf70 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69  onList->C_Finali
2bf80 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b  ze = C_Finalize;
2bf90 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2bfa0 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47  >C_GetInfo = C_G
2bfb0 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  etInfo;..pFuncti
2bfc0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
2bfd0 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f  tList = C_GetSlo
2bfe0 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tList;..pFunctio
2bff0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
2c000 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74  Info = C_GetSlot
2c010 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
2c020 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e  List->C_GetToken
2c030 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65  Info = C_GetToke
2c040 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
2c050 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72  nList->C_WaitFor
2c060 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61  SlotEvent = C_Wa
2c070 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a  itForSlotEvent;.
2c080 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c090 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
2c0a0 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e  st = C_GetMechan
2c0b0 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  ismList;..pFunct
2c0c0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65  ionList->C_GetMe
2c0d0 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f  chanismInfo = C_
2c0e0 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
2c0f0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c100 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20  ->C_InitToken = 
2c110 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46  C_InitToken;..pF
2c120 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
2c130 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50  nitPIN = C_InitP
2c140 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
2c150 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43  st->C_SetPIN = C
2c160 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  _SetPIN;..pFunct
2c170 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53  ionList->C_OpenS
2c180 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53  ession = C_OpenS
2c190 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
2c1a0 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53  onList->C_CloseS
2c1b0 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65  ession = C_Close
2c1c0 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  Session;..pFunct
2c1d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65  ionList->C_Close
2c1e0 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f  AllSessions = C_
2c1f0 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
2c200 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c210 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  ->C_GetSessionIn
2c220 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f  fo = C_GetSessio
2c230 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
2c240 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72  nList->C_GetOper
2c250 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47  ationState = C_G
2c260 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
2c270 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c280 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_SetOperation
2c290 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65  State = C_SetOpe
2c2a0 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
2c2b0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c  unctionList->C_L
2c2c0 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a  ogin = C_Login;.
2c2d0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c2e0 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67  C_Logout = C_Log
2c2f0 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  out;..pFunctionL
2c300 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a  ist->C_CreateObj
2c310 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62  ect = C_CreateOb
2c320 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
2c330 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65  List->C_CopyObje
2c340 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63  ct = C_CopyObjec
2c350 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2c360 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  t->C_DestroyObje
2c370 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62  ct = C_DestroyOb
2c380 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
2c390 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63  List->C_GetObjec
2c3a0 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a  tSize = C_GetObj
2c3b0 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74  ectSize;..pFunct
2c3c0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74  ionList->C_GetAt
2c3d0 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
2c3e0 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
2c3f0 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
2c400 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75  st->C_SetAttribu
2c410 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41  teValue = C_SetA
2c420 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
2c430 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2c440 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
2c450 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
2c460 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
2c470 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
2c480 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  cts = C_FindObje
2c490 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  cts;..pFunctionL
2c4a0 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
2c4b0 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64  tsFinal = C_Find
2c4c0 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70  ObjectsFinal;..p
2c4d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2c4e0 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f  EncryptInit = C_
2c4f0 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46  EncryptInit;..pF
2c500 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
2c510 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79  ncrypt = C_Encry
2c520 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  pt;..pFunctionLi
2c530 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64  st->C_EncryptUpd
2c540 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55  ate = C_EncryptU
2c550 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
2c560 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
2c570 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70  Final = C_Encryp
2c580 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
2c590 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
2c5a0 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70  tInit = C_Decryp
2c5b0 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
2c5c0 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
2c5d0 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70   = C_Decrypt;..p
2c5e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2c5f0 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  DecryptUpdate = 
2c600 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b  C_DecryptUpdate;
2c610 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2c620 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20  >C_DecryptFinal 
2c630 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
2c640 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c650 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d  ->C_DigestInit =
2c660 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09   C_DigestInit;..
2c670 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2c680 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65  _Digest = C_Dige
2c690 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
2c6a0 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61  st->C_DigestUpda
2c6b0 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64  te = C_DigestUpd
2c6c0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2c6d0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79  ist->C_DigestKey
2c6e0 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a   = C_DigestKey;.
2c6f0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c700 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20  C_DigestFinal = 
2c710 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09  C_DigestFinal;..
2c720 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2c730 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69  _SignInit = C_Si
2c740 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  gnInit;..pFuncti
2c750 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d  onList->C_Sign =
2c760 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74   C_Sign;..pFunct
2c770 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55  ionList->C_SignU
2c780 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70  pdate = C_SignUp
2c790 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
2c7a0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61  List->C_SignFina
2c7b0 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b  l = C_SignFinal;
2c7c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2c7d0 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e  >C_SignRecoverIn
2c7e0 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76  it = C_SignRecov
2c7f0 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  erInit;..pFuncti
2c800 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65  onList->C_SignRe
2c810 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65  cover = C_SignRe
2c820 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
2c830 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49  nList->C_VerifyI
2c840 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e  nit = C_VerifyIn
2c850 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
2c860 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43  st->C_Verify = C
2c870 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74  _Verify;..pFunct
2c880 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
2c890 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69  yUpdate = C_Veri
2c8a0 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
2c8b0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
2c8c0 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69  fyFinal = C_Veri
2c8d0 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  fyFinal;..pFunct
2c8e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
2c8f0 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43  yRecoverInit = C
2c900 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
2c910 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
2c920 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f  st->C_VerifyReco
2c930 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65  ver = C_VerifyRe
2c940 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
2c950 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45  nList->C_DigestE
2c960 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
2c970 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
2c980 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
2c990 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44  List->C_DecryptD
2c9a0 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f  igestUpdate = C_
2c9b0 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
2c9c0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2c9d0 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79  ist->C_SignEncry
2c9e0 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67  ptUpdate = C_Sig
2c9f0 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a  nEncryptUpdate;.
2ca00 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2ca10 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
2ca20 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
2ca30 74 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09  tVerifyUpdate;..
2ca40 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2ca50 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43  _GenerateKey = C
2ca60 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70  _GenerateKey;..p
2ca70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2ca80 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20  GenerateKeyPair 
2ca90 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  = C_GenerateKeyP
2caa0 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  air;..pFunctionL
2cab0 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d  ist->C_WrapKey =
2cac0 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75   C_WrapKey;..pFu
2cad0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e  nctionList->C_Un
2cae0 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72  wrapKey = C_Unwr
2caf0 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  apKey;..pFunctio
2cb00 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b  nList->C_DeriveK
2cb10 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79  ey = C_DeriveKey
2cb20 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2cb30 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d  ->C_SeedRandom =
2cb40 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09   C_SeedRandom;..
2cb50 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2cb60 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20  _GenerateRandom 
2cb70 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  = C_GenerateRand
2cb80 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  om;..pFunctionLi
2cb90 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
2cba0 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46  nStatus = C_GetF
2cbb0 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09  unctionStatus;..
2cbc0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2cbd0 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20  _CancelFunction 
2cbe0 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  = C_CancelFuncti
2cbf0 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
2cc00 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
2cc10 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e  nList = C_GetFun
2cc20 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70  ctionList;...*pp
2cc30 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70  FunctionList = p
2cc40 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
2cc50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cc60 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2cc70 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2cc80 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2cc90 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a                 KR_OK);.}..