Hex Artifact Content

Artifact 711a90f5294f01fcbd3477c7dbe34d2e29b6d34a:


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 0a 09 63 68 61 72 20 2a  active;...char *
4f00: 70 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69  pcsc_reader;...i
4f10: 6e 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  nt pcsc_card_con
4f20: 6e 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41  nected;..SCARDHA
4f30: 4e 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a  NDLE pcsc_card;.
4f40: 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ..int transactio
4f50: 6e 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72  n_depth;..int tr
4f60: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
4f70: 77 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c  w_lock;...int sl
4f80: 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46  ot_reset;...CK_F
4f90: 4c 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73  LAGS token_flags
4fa0: 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ;...unsigned cha
4fb0: 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52  r *label;...DWOR
4fc0: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 7d 3b 0a 0a  D protocol;.};..
4fd0: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09  typedef enum {..
4fe0: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
4ff0: 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09  ENERIC = 0x01,..
5000: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
5010: 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09  KI     = 0x02,..
5020: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
5030: 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20  KI     = 0x04.} 
5040: 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79  cackey_tlv_appty
5050: 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  pe;..typedef enu
5060: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  m {..CACKEY_TLV_
5070: 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46  OBJID_GENERALINF
5080: 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30 30 30  O       = 0x2000
5090: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
50a0: 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49  JID_PROPERSONALI
50b0: 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a  NFO   = 0x2100,.
50c0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
50d0: 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20  D_ACCESSCONTROL 
50e0: 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43      = 0x3000,..C
50f0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5100: 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20 20  LOGIN           
5110: 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43    = 0x4000,..CAC
5120: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5130: 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20  RDINFO          
5140: 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x5000,..CACKE
5150: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d  Y_TLV_OBJID_BIOM
5160: 45 54 52 49 43 53 20 20 20 20 20 20 20 20 3d 20  ETRICS        = 
5170: 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x6000,..CACKEY_
5180: 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41  TLV_OBJID_DIGITA
5190: 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20 30 78  LSIGCERT    = 0x
51a0: 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  7000,..CACKEY_TL
51b0: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
51c0: 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30 32  ON        = 0x02
51d0: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
51e0: 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49  OBJID_CAC_BENEFI
51f0: 54 53 20 20 20 20 20 20 3d 20 30 78 30 32 30 32  TS      = 0x0202
5200: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5210: 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e  JID_CAC_OTHERBEN
5220: 45 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a  EFITS = 0x0203,.
5230: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5240: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20  D_CAC_PERSONNEL 
5250: 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43      = 0x0201,..C
5260: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5270: 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20  CAC_PKICERT     
5280: 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63    = 0x02FE.} cac
5290: 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64  key_tlv_objectid
52a0: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  ;..typedef enum 
52b0: 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  {..CACKEY_PCSC_S
52c0: 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20  _TOKENPRESENT   
52d0: 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43   = 1,..CACKEY_PC
52e0: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
52f0: 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45       = 0,..CACKE
5300: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5310: 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09           = -1,..
5320: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
5330: 44 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20  DPIN          = 
5340: 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -2,..CACKEY_PCSC
5350: 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20  _E_LOCKED       
5360: 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59     = -3,..CACKEY
5370: 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
5380: 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43  N       = -4,..C
5390: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
53a0: 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d  ENABSENT     = -
53b0: 36 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  6,..CACKEY_PCSC_
53c0: 45 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 20  E_RETRY         
53d0: 20 20 3d 20 2d 37 0a 7d 20 63 61 63 6b 65 79 5f    = -7.} cackey_
53e0: 72 65 74 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ret;..struct cac
53f0: 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20  key_tlv_cardurl 
5400: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
5410: 20 20 20 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a          rid[5];.
5420: 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74  .cackey_tlv_appt
5430: 79 70 65 20 20 20 61 70 70 74 79 70 65 3b 0a 09  ype   apptype;..
5440: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
5450: 74 69 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09  tid  objectid;..
5460: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
5470: 74 69 64 20 20 61 70 70 69 64 3b 0a 09 75 6e 73  tid  appid;..uns
5480: 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20  igned char      
5490: 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72    pinid;.};..str
54a0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
54b0: 6e 74 69 74 79 3b 0a 73 74 72 75 63 74 20 63 61  ntity;.struct ca
54c0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
54d0: 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a  {..uint8_t tag;.
54e0: 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a  .size_t length;.
54f0: 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64  ..union {...void
5500: 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72 75 63   *value;...struc
5510: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72  t cackey_tlv_car
5520: 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64  durl *value_card
5530: 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76  url;...uint8_t v
5540: 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a  alue_byte;..};..
5550: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
5560: 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74  lv_entity *_next
5570: 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20  ;.};../* CACKEY 
5580: 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a  Global Handles *
5590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
55a0: 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20  ackey_biglock = 
55b0: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74 72  NULL;.static str
55c0: 75 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69  uct cackey_sessi
55d0: 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  on cackey_sessio
55e0: 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20  ns[128];.static 
55f0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5600: 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ot cackey_slots[
5610: 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74  128];.static int
5620: 20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69   cackey_initiali
5630: 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  zed = 0;.static 
5640: 69 6e 74 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f  int cackey_biglo
5650: 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f  ck_init = 0;.CK_
5660: 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47  C_INITIALIZE_ARG
5670: 53 20 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a  S cackey_args;..
5680: 2f 2a 2a 20 45 78 74 72 61 20 63 65 72 74 69 66  /** Extra certif
5690: 69 63 61 74 65 73 20 74 6f 20 69 6e 63 6c 75 64  icates to includ
56a0: 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73  e in token **/.s
56b0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
56c0: 63 5f 69 64 65 6e 74 69 74 79 20 65 78 74 72 61  c_identity extra
56d0: 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e  _certs[] = {.#in
56e0: 63 6c 75 64 65 20 22 63 61 63 6b 65 79 5f 62 75  clude "cackey_bu
56f0: 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d  iltin_certs.h".}
5700: 3b 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61  ;../* PCSC Globa
5710: 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61  l Handles */.sta
5720: 74 69 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45  tic LPSCARDCONTE
5730: 58 54 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  XT cackey_pcsc_h
5740: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73  andle = NULL;..s
5750: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c  tatic unsigned l
5760: 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65  ong cackey_getve
5770: 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73  rsion(void) {..s
5780: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c  tatic unsigned l
5790: 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35  ong retval = 255
57a0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
57b0: 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73   major = 0;..uns
57c0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72  igned long minor
57d0: 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a   = 0;..char *maj
57e0: 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09  or_str = NULL;..
57f0: 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20  char *minor_str 
5800: 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59  = NULL;...CACKEY
5810: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
5820: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
5830: 72 65 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b  retval != 255) {
5840: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5850: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
5860: 67 20 30 78 25 6c 78 20 28 63 61 63 68 65 64 29  g 0x%lx (cached)
5870: 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  .", retval);....
5880: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
5890: 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b  .}...retval = 0;
58a0: 0a 0a 23 69 66 64 65 66 20 50 41 43 4b 41 47 45  ..#ifdef PACKAGE
58b0: 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20  _VERSION.       
58c0: 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43   major_str = PAC
58d0: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69  KAGE_VERSION;..i
58e0: 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a  f (major_str) {.
58f0: 09 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d  .        major =
5900: 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73   strtoul(major_s
5910: 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20  tr, &minor_str, 
5920: 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f  10);....if (mino
5930: 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f  r_str) {....mino
5940: 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f  r = strtoul(mino
5950: 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c  r_str + 1, NULL,
5960: 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72   10);...}..}...r
5970: 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c  etval = (major <
5980: 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c  < 16) | (minor <
5990: 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  < 8);.#endif...C
59a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
59b0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78  TF("Returning 0x
59c0: 25 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  %lx", retval);..
59d0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
59e0: 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c  .}../* PC/SC Rel
59f0: 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a  ated Functions *
5a00: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
5a10: 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  ret cackey_login
5a20: 5f 72 65 71 75 69 72 65 64 28 73 74 72 75 63 74  _required(struct
5a30: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
5a40: 6f 74 29 20 7b 0a 09 72 65 74 75 72 6e 28 43 41  ot) {..return(CA
5a50: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44  CKEY_PCSC_E_NEED
5a60: 4c 4f 47 49 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  LOGIN);.}../*. *
5a70: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
5a80: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f   void cackey_slo
5a90: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
5aa0: 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  l(void);. *. * A
5ab0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
5ac0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
5ad0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e  N VALUE. *     N
5ae0: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  one. *. * NOTES.
5af0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
5b00: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
5b10: 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e   from all cards.
5b20: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
5b30: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  oid cackey_slots
5b40: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
5b50: 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f  void) {..uint32_
5b60: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f  t idx;...CACKEY_
5b70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
5b80: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28  lled.");...for (
5b90: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
5ba0: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
5bb0: 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
5bc0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
5bd0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
5be0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
5bf0: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
5c00: 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 4b  ected) {....CACK
5c10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5c20: 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  "SCardDisconnect
5c30: 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 28  (%lu) called", (
5c40: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
5c50: 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  dx);.....SCardDi
5c60: 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f  sconnect(cackey_
5c70: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
5c80: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
5c90: 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09  E_CARD);...}....
5ca0: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
5cb0: 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09  [idx].label) {..
5cc0: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
5cd0: 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 3b  ots[idx].label);
5ce0: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
5cf0: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e  s[idx].label = N
5d00: 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ULL;...}....cack
5d10: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
5d20: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
5d30: 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  d = 0;...cackey_
5d40: 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
5d50: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30  action_depth = 0
5d60: 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
5d70: 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f  [idx].transactio
5d80: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
5d90: 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65   0;....if (cacke
5da0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74  y_slots[idx].act
5db0: 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ive) {....CACKEY
5dc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d  _DEBUG_PRINTF("M
5dd0: 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c  arking active sl
5de0: 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20  ot %lu as being 
5df0: 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65  reset", (unsigne
5e00: 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09  d long) idx);...
5e10: 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  }....cackey_slot
5e20: 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65  s[idx].slot_rese
5e30: 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b  t = 1;..}...CACK
5e40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5e50: 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09  "Returning");...
5e60: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
5e70: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
5e80: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5e90: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
5ea0: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  void);. *. * ARG
5eb0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f  UMENTS. *     No
5ec0: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ne. *. * RETURN 
5ed0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
5ee0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
5ef0: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
5f00: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
5f10: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
5f20: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
5f30: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
5f40: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65  s function conne
5f50: 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43  cts to the PC/SC
5f60: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61   Connection Mana
5f70: 67 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20  ger and updates 
5f80: 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61  the. *     globa
5f90: 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f  l handle.. *. */
5fa0: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
5fb0: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63  et cackey_pcsc_c
5fc0: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09  onnect(void) {..
5fd0: 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63  LONG scard_est_c
5fe0: 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64  ontext_ret;.#ifd
5ff0: 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56  ef HAVE_SCARDISV
6000: 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e  ALIDCONTEXT..LON
6010: 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  G scard_isvalid_
6020: 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ret;.#endif...CA
6030: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6040: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
6050: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  if (cackey_pcsc_
6060: 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  handle == NULL) 
6070: 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  {...cackey_pcsc_
6080: 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28  handle = malloc(
6090: 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70  sizeof(*cackey_p
60a0: 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09  csc_handle));...
60b0: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  if (cackey_pcsc_
60c0: 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  handle == NULL) 
60d0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
60e0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74  G_PRINTF("Call t
60f0: 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  o malloc() faile
6100: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
6110: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63  failure");.....c
6120: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
6130: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
6140: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6150: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
6160: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
6170: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
6180: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6190: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
61a0: 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  .scard_est_conte
61b0: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73  xt_ret = SCardEs
61c0: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53  tablishContext(S
61d0: 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45  CARD_SCOPE_SYSTE
61e0: 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63  M, NULL, NULL, c
61f0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6200: 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f  e);...if (scard_
6210: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
6220: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6230: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
6240: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6250: 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62  ll to SCardEstab
6260: 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c  lishContext fail
6270: 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f  ed (returned %s/
6280: 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20  %li), returning 
6290: 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43  in failure", CAC
62a0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
62b0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
62c0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
62d0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
62e0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
62f0: 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63  ret);.....free(c
6300: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6310: 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63  e);....cackey_pc
6320: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c  sc_handle = NULL
6330: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
6340: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
6350: 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  l();.....return(
6360: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6370: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  NERIC);...}..}..
6380: 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52  #ifdef HAVE_SCAR
6390: 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a  DISVALIDCONTEXT.
63a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
63b0: 49 4e 54 46 28 22 53 43 61 72 64 49 73 56 61 6c  INTF("SCardIsVal
63c0: 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c  idContext() call
63d0: 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76  ed");..scard_isv
63e0: 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64  alid_ret = SCard
63f0: 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a  IsValidContext(*
6400: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6410: 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f  le);..if (scard_
6420: 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53  isvalid_ret != S
6430: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
6440: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
6450: 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20  _PRINTF("Handle 
6460: 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c  has become inval
6470: 69 64 20 28 53 43 61 72 64 49 73 56 61 6c 69 64  id (SCardIsValid
6480: 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69  Context = %s/%li
6490: 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d  ), trying to re-
64a0: 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43  establish...", C
64b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
64c0: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
64d0: 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72  (scard_isvalid_r
64e0: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
64f0: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a  d_isvalid_ret);.
6500: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6510: 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74  PRINTF("SCardEst
6520: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20  ablishContext() 
6530: 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72  called");...scar
6540: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
6550: 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69  t = SCardEstabli
6560: 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f  shContext(SCARD_
6570: 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55  SCOPE_SYSTEM, NU
6580: 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79  LL, NULL, cackey
6590: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
65a0: 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63  .if (scard_est_c
65b0: 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43  ontext_ret != SC
65c0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
65d0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
65e0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f  _PRINTF("Call to
65f0: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43   SCardEstablishC
6600: 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72  ontext failed (r
6610: 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c  eturned %s/%li),
6620: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
6630: 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44  ilure", CACKEY_D
6640: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
6650: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
6660: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
6670: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65  , (long) scard_e
6680: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b  st_context_ret);
6690: 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  .....free(cackey
66a0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
66b0: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  ..cackey_pcsc_ha
66c0: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  ndle = NULL;....
66d0: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
66e0: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
66f0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
6700: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
6710: 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
6720: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48  _DEBUG_PRINTF("H
6730: 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72  andle has been r
6740: 65 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b  e-established");
6750: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  ..}.#endif...CAC
6760: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6770: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f  ("Sucessfully co
6780: 6e 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43  nnected to PC/SC
6790: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  , returning in s
67a0: 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75  uccess");...retu
67b0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
67c0: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
67d0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
67e0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
67f0: 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
6800: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52  (void);. *. * AR
6810: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e  GUMENTS. *     N
6820: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  one. *. * RETURN
6830: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
6840: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
6850: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
6860: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
6870: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
6880: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
6890: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
68a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63  is function disc
68b0: 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65  onnects from the
68c0: 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f   PC/SC Connectio
68d0: 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70  n manager and up
68e0: 64 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65  dates. *     the
68f0: 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a   global handle..
6900: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
6910: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
6920: 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
6930: 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  void) {..LONG sc
6940: 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f  ard_rel_context_
6950: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
6960: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6970: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63  ed.");...if (cac
6980: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6990: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
69a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
69b0: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72  S_OK);..}...scar
69c0: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65  d_rel_context_re
69d0: 74 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65  t = SCardRelease
69e0: 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f  Context(*cackey_
69f0: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09  pcsc_handle);...
6a00: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  if (cackey_pcsc_
6a10: 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65  handle) {...free
6a20: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
6a30: 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79  dle);.....cackey
6a40: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e  _pcsc_handle = N
6a50: 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63  ULL;..}...if (sc
6a60: 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f  ard_rel_context_
6a70: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6a80: 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75  UCCESS) {...retu
6a90: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6aa0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
6ab0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
6ac0: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
6ad0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
6ae0: 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d     void cackey_m
6af0: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
6b00: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
6b10: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
6b20: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
6b30: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
6b40: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e  N VALUE. *     N
6b50: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  one. *. * NOTES.
6b60: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
6b70: 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 6c 6f  tion marks a slo
6b80: 74 20 68 61 73 20 68 61 76 69 6e 67 20 62 65 65  t has having bee
6b90: 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61 74 65  n reset, to late
6ba0: 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70 2e  r be cleaned up.
6bb0: 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75 70 20  . *     Cleanup 
6bc0: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
6bd0: 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c 69 65  n a PKCS#11 clie
6be0: 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e 64 4f  nt calls C_FindO
6bf0: 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a 0a 20  bjectsInit.. *. 
6c00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
6c10: 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
6c20: 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61 63  reset(struct cac
6c30: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20  key_slot *slot) 
6c40: 7b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 71  {..int login_req
6c50: 75 69 72 65 64 20 3d 20 2d 31 3b 0a 0a 09 69 66  uired = -1;...if
6c60: 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20   (slot == NULL) 
6c70: 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  {...return;..}..
6c80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6c90: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
6ca0: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73  ...if (slot->pcs
6cb0: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
6cc0: 29 20 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f  ) {...SCardDisco
6cd0: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
6ce0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
6cf0: 56 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73  VE_CARD);..}...s
6d00: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20  lot->slot_reset 
6d10: 3d 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63  = 1;..slot->pcsc
6d20: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
6d30: 3d 20 30 3b 0a 09 73 6c 6f 74 2d 3e 74 6f 6b 65  = 0;..slot->toke
6d40: 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 0a 09 69  n_flags = 0;...i
6d50: 66 20 28 6c 6f 67 69 6e 5f 72 65 71 75 69 72 65  f (login_require
6d60: 64 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 69 66 20  d == -1) {...if 
6d70: 28 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 5f 72 65  (cackey_login_re
6d80: 71 75 69 72 65 64 28 73 6c 6f 74 29 20 21 3d 20  quired(slot) != 
6d90: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
6da0: 29 20 7b 0a 09 09 09 6c 6f 67 69 6e 5f 72 65 71  ) {....login_req
6db0: 75 69 72 65 64 20 3d 20 31 3b 0a 09 09 7d 20 65  uired = 1;...} e
6dc0: 6c 73 65 20 7b 0a 09 09 09 6c 6f 67 69 6e 5f 72  lse {....login_r
6dd0: 65 71 75 69 72 65 64 20 3d 20 30 3b 0a 09 09 7d  equired = 0;...}
6de0: 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f 67 69 6e 5f  ..}...if (login_
6df0: 72 65 71 75 69 72 65 64 29 20 7b 0a 09 09 73 6c  required) {...sl
6e00: 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot->token_flags 
6e10: 7c 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51  |= CKF_LOGIN_REQ
6e20: 55 49 52 45 44 3b 0a 09 7d 0a 0a 09 43 41 43 4b  UIRED;..}...CACK
6e30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6e40: 22 52 65 74 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a  "Returning.");..
6e50: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
6e60: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
6e70: 20 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65    LONG cackey_re
6e80: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
6e90: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
6ea0: 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66  *slot, DWORD def
6eb0: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c  ault_protocol, L
6ec0: 50 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f  PDWORD selected_
6ed0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a  protocol);. *. *
6ee0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
6ef0: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
6f00: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
6f10: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
6f20: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
6f30: 20 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f    DWORD default_
6f40: 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20  protocol. *     
6f50: 20 20 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20      Protocol to 
6f60: 61 74 74 65 6d 70 74 20 66 69 72 73 74 0a 20 2a  attempt first. *
6f70: 0a 20 2a 20 20 20 20 20 4c 50 44 57 4f 52 44 20  . *     LPDWORD 
6f80: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
6f90: 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  l. *         [OU
6fa0: 54 5d 20 50 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  T] Protocol sele
6fb0: 63 74 65 64 0a 20 2a 0a 20 2a 20 52 45 54 55 52  cted. *. * RETUR
6fc0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
6fd0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
6fe0: 66 72 6f 6d 20 53 43 61 72 64 52 65 63 6f 6e 6e  from SCardReconn
6ff0: 65 63 74 28 29 0a 20 2a 0a 20 2a 20 4e 4f 54 45  ect(). *. * NOTE
7000: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
7010: 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
7020: 70 65 72 20 61 72 6f 75 6e 64 20 53 43 61 72 64  per around SCard
7030: 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20  Reconnect(). *. 
7040: 2a 20 20 20 20 20 54 68 65 20 53 43 61 72 64 52  *     The SCardR
7050: 65 63 6f 6e 6e 65 63 74 28 29 20 66 75 6e 63 74  econnect() funct
7060: 69 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65  ion call will be
7070: 20 63 61 6c 6c 65 64 20 66 69 72 73 74 20 77 69   called first wi
7080: 74 68 20 74 68 65 0a 20 2a 20 20 20 20 20 64 77  th the. *     dw
7090: 50 72 65 66 65 72 72 65 64 50 72 6f 74 6f 63 6f  PreferredProtoco
70a0: 6c 73 20 6f 66 20 22 64 65 66 61 75 6c 74 5f 70  ls of "default_p
70b0: 72 6f 74 6f 63 6f 6c 22 2e 20 20 49 66 20 74 68  rotocol".  If th
70c0: 61 74 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  at call returns.
70d0: 20 2a 20 20 20 20 20 53 43 41 52 44 5f 45 5f 50   *     SCARD_E_P
70e0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 20 74 72  ROTO_MISMATCH tr
70f0: 79 20 61 67 61 69 6e 20 77 69 74 68 20 61 20 70  y again with a p
7100: 72 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d 30 2c 20  rotocol of T=0, 
7110: 61 6e 64 20 66 61 69 6c 69 6e 67 0a 20 2a 20 20  and failing. *  
7120: 20 20 20 74 68 61 74 20 54 3d 31 2e 0a 20 2a 0a     that T=1.. *.
7130: 20 2a 2f 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20   */.static LONG 
7140: 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
7150: 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63  _card(struct cac
7160: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
7170: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
7180: 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52 44 20  otocol, LPDWORD 
7190: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
71a0: 6c 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  l) {..LONG scard
71b0: 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 73 63 61  _conn_ret;...sca
71c0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
71d0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f  ardReconnect(slo
71e0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
71f0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
7200: 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63  , default_protoc
7210: 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f  ol, SCARD_RESET_
7220: 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64 5f 70  CARD, selected_p
7230: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28  rotocol);...if (
7240: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7250: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
7260: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41  MISMATCH) {...CA
7270: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7280: 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  F("SCardReconnec
7290: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
72a0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
72b0: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
72c0: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63   just T=0")...sc
72d0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
72e0: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c  CardReconnect(sl
72f0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
7300: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
7310: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
7320: 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T0, SCARD_RESE
7330: 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64  T_CARD, selected
7340: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69  _protocol);....i
7350: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7360: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7370: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7380: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7390: 52 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f  RINTF("SCardReco
73a0: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
73b0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
73c0: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
73d0: 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a  with just T=1").
73e0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
73f0: 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  t = SCardReconne
7400: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
7410: 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  rd, SCARD_SHARE_
7420: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
7430: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44  OTOCOL_T1, SCARD
7440: 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c  _RESET_CARD, sel
7450: 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b  ected_protocol);
7460: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ...}..}...return
7470: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29  (scard_conn_ret)
7480: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
7490: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
74a0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e  y_ret cackey_con
74b0: 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74  nect_card(struct
74c0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
74d0: 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ot);. *. * ARGUM
74e0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
74f0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
7500: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
7510: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
7520: 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  o. *. * RETURN V
7530: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
7540: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
7550: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
7560: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
7570: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
7580: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
7590: 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  OTES. *     None
75a0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
75b0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
75c0: 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74  _connect_card(st
75d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
75e0: 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65   *slot) {..cacke
75f0: 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65  y_ret pcsc_conne
7600: 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 70  ct_ret;..DWORD p
7610: 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73  rotocol;..LONG s
7620: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a  card_conn_ret;..
7630: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7640: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
7650: 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a  ...if (!slot) {.
7660: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7670: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73  RINTF("Invalid s
7680: 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2c 20 72  lot specified, r
7690: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
76a0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
76b0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
76c0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63  ENERIC);..}...pc
76d0: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
76e0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
76f0: 6e 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73  nect();..if (pcs
7700: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
7710: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
7720: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
7730: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e  BUG_PRINTF("Conn
7740: 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20  ection to PC/SC 
7750: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
7760: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
7770: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
7780: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
7790: 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63  ;..}.../* Connec
77a0: 74 20 74 6f 20 72 65 61 64 65 72 2c 20 69 66 20  t to reader, if 
77b0: 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66 20 28 21  needed */..if (!
77c0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
77d0: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43  connected) {...C
77e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
77f0: 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74  TF("SCardConnect
7800: 28 25 73 29 20 63 61 6c 6c 65 64 22 2c 20 73 6c  (%s) called", sl
7810: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29  ot->pcsc_reader)
7820: 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ;...scard_conn_r
7830: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63  et = SCardConnec
7840: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
7850: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73  andle, slot->pcs
7860: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f  c_reader, SCARD_
7870: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
7880: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
7890: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
78a0: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T1, &slot->pcsc
78b0: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
78c0: 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
78d0: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
78e0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
78f0: 43 48 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  CH) {....CACKEY_
7900: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
7910: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74  ardConnect() ret
7920: 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52  urned SCARD_E_PR
7930: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72  OTO_MISMATCH, tr
7940: 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54  ying with just T
7950: 3d 30 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f  =0")....scard_co
7960: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
7970: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
7980: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
7990: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
79a0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
79b0: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
79c0: 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T0, &slot->pcsc
79d0: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
79e0: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64  );.....if (scard
79f0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
7a00: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7a10: 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  TCH) {.....CACKE
7a20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7a30: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
7a40: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
7a50: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
7a60: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
7a70: 20 54 3d 31 22 29 0a 09 09 09 09 73 63 61 72 64   T=1").....scard
7a80: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
7a90: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
7aa0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
7ab0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
7ac0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
7ad0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
7ae0: 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T1, &slot->p
7af0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
7b00: 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  col);....}...}..
7b10: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7b20: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f  _ret == SCARD_W_
7b30: 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 29 20  UNPOWERED_CARD) 
7b40: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
7b50: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
7b60: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
7b70: 64 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45  d SCARD_W_UNPOWE
7b80: 52 45 44 5f 43 41 52 44 2c 20 74 72 79 69 6e 67  RED_CARD, trying
7b90: 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63 74 2e 2e   to re-connect..
7ba0: 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 63  .");.....scard_c
7bb0: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
7bc0: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
7bd0: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
7be0: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
7bf0: 43 41 52 44 5f 53 48 41 52 45 5f 44 49 52 45 43  CARD_SHARE_DIREC
7c00: 54 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  T, SCARD_PROTOCO
7c10: 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f  L_T0 | SCARD_PRO
7c20: 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d  TOCOL_T1, &slot-
7c30: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f  >pcsc_card, &pro
7c40: 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28  tocol);.....if (
7c50: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7c60: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
7c70: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09  MISMATCH) {.....
7c80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7c90: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
7ca0: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
7cb0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7cc0: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
7cd0: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 09   just T=0").....
7ce0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7cf0: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
7d00: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
7d10: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
7d20: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
7d30: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
7d40: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c  PROTOCOL_T0, &sl
7d50: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
7d60: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 09  protocol);......
7d70: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
7d80: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52  et == SCARD_E_PR
7d90: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a  OTO_MISMATCH) {.
7da0: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
7db0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
7dc0: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
7dd0: 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  d SCARD_E_PROTO_
7de0: 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67  MISMATCH, trying
7df0: 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29   with just T=1")
7e00: 0a 09 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ......scard_conn
7e10: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
7e20: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
7e30: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
7e40: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
7e50: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7e60: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7e70: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1, &slot->pcsc_c
7e80: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
7e90: 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
7ea0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7eb0: 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63   cackey_reconnec
7ec0: 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 70 72 6f  t_card(slot, pro
7ed0: 74 6f 63 6f 6c 2c 20 26 70 72 6f 74 6f 63 6f 6c  tocol, &protocol
7ee0: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63  );...}....if (sc
7ef0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20  ard_conn_ret != 
7f00: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
7f10: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
7f20: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65  UG_PRINTF("Conne
7f30: 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61  ction to card fa
7f40: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
7f50: 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 72  in failure (SCar
7f60: 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f  dConnect() = %s/
7f70: 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  %li)", CACKEY_DE
7f80: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
7f90: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63  R_TO_STR(scard_c
7fa0: 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  onn_ret), (long)
7fb0: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29   scard_conn_ret)
7fc0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
7fd0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7fe0: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74  IC);...}....slot
7ff0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
8000: 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f  ected = 1;...slo
8010: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8020: 65 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74  epth = 0;...slot
8030: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ->transaction_ne
8040: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
8050: 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c  ..slot->protocol
8060: 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a   = protocol;..}.
8070: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8080: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
8090: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
80a0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
80b0: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
80c0: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
80d0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
80e0: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
80f0: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
8100: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8110: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8120: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8130: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
8140: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
8150: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
8160: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
8170: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
8180: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
8190: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
81a0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74  TES. *     The t
81b0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c  ransaction shoul
81c0: 64 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20  d be terminated 
81d0: 75 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e  using "cackey_en
81e0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20  d_transaction". 
81f0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
8200: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62  key_ret cackey_b
8210: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
8220: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8230: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
8240: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8250: 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20  conn_ret;..LONG 
8260: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b  scard_trans_ret;
8270: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8280: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
8290: 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e  );...cackey_conn
82a0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
82b0: 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
82c0: 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f  ;..if (cackey_co
82d0: 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nn_ret != CACKEY
82e0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
82f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8300: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
8310: 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
8320: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
8330: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  or");....return(
8340: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
8350: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  NERIC);..}...slo
8360: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8370: 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c  epth++;...if (sl
8380: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8390: 64 65 70 74 68 20 3e 20 31 20 26 26 20 21 73 6c  depth > 1 && !sl
83a0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
83b0: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a  need_hw_lock) {.
83c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
83d0: 52 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20 69  RINTF("Already i
83e0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
83f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61   performing no a
8400: 63 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74 68  ction (new depth
8410: 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74   = %i)", slot->t
8420: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8430: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
8440: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
8450: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .}...slot->trans
8460: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
8470: 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64  ock = 0;...scard
8480: 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61  _trans_ret = SCa
8490: 72 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  rdBeginTransacti
84a0: 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  on(slot->pcsc_ca
84b0: 72 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f  rd);..if (scard_
84c0: 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41  trans_ret != SCA
84d0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
84e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
84f0: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
8500: 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
8510: 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  on, returning in
8520: 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74   error");....ret
8530: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8540: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
8550: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8560: 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c  INTF("Sucessfull
8570: 79 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74  y began transact
8580: 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29  ion on slot (%s)
8590: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  ", slot->pcsc_re
85a0: 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ader);...return(
85b0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
85c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
85d0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
85e0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e  ey_ret cackey_en
85f0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74  d_transaction(st
8600: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
8610: 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41   *slot);. *. * A
8620: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
8630: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8640: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
8650: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
8660: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55  ds to. *. * RETU
8670: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
8680: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8690: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
86a0: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
86b0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
86c0: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
86d0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
86e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
86f0: 71 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62  quires "cackey_b
8700: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
8710: 22 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66  " to be called f
8720: 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  irst. *. */.stat
8730: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
8740: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
8750: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
8760: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
8770: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61  ..LONG scard_tra
8780: 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ns_ret;...CACKEY
8790: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
87a0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
87b0: 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  !slot->pcsc_card
87c0: 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09  _connected) {...
87d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
87e0: 4e 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74  NTF("Card is not
87f0: 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62   connected, unab
8800: 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61  le to end transa
8810: 63 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b  ction on card");
8820: 0a 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ....if (slot->tr
8830: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
8840: 3e 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  > 0) {....CACKEY
8850: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44  _DEBUG_PRINTF("D
8860: 65 63 72 65 61 73 69 6e 67 20 74 72 61 6e 73 61  ecreasing transa
8870: 63 74 69 6f 6e 20 64 65 70 74 68 20 61 6e 64 20  ction depth and 
8880: 61 73 6b 69 6e 67 20 66 6f 72 20 61 20 68 61 72  asking for a har
8890: 64 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  dware lock on th
88a0: 65 20 6e 65 78 74 20 62 65 67 69 6e 20 74 72 61  e next begin tra
88b0: 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e  nsaction (curren
88c0: 74 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20  t depth = %i)", 
88d0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
88e0: 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09 73 6c  n_depth);.....sl
88f0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8900: 64 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20  depth--;.....if 
8910: 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
8920: 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a  on_depth > 0) {.
8930: 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
8940: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
8950: 63 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d  ck = 1;....}...}
8960: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8970: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8980: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
8990: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
89a0: 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  pth == 0) {...CA
89b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
89c0: 46 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61  F("Terminating a
89d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
89e0: 74 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21  t has not begun!
89f0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
8a00: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
8a10: 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d  RIC);..}...slot-
8a20: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8a30: 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  th--;...if (slot
8a40: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8a50: 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43  pth > 0) {...CAC
8a60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8a70: 28 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73  ("Transactions s
8a80: 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73  till in progress
8a90: 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e  , not terminatin
8aa0: 67 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61  g on-card Transa
8ab0: 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64  ction (current d
8ac0: 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f  epth = %i)", slo
8ad0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8ae0: 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e  epth);....return
8af0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
8b00: 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74  K);..}...scard_t
8b10: 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64  rans_ret = SCard
8b20: 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73  EndTransaction(s
8b30: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
8b40: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
8b50: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72  );..if (scard_tr
8b60: 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ans_ret != SCARD
8b70: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
8b80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8b90: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65  NTF("Unable to e
8ba0: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nd transaction, 
8bb0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
8bc0: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  or");....return(
8bd0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
8be0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
8bf0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8c00: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65  ("Sucessfully te
8c10: 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63  rminated transac
8c20: 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73  tion on slot (%s
8c30: 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  )", slot->pcsc_r
8c40: 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e  eader);...return
8c50: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
8c60: 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52  K);.}../* APDU R
8c70: 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73  elated Functions
8c80: 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53   */./*. * SYNPOS
8c90: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
8ca0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64  _ret cackey_send
8cb0: 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63  _apdu(struct cac
8cc0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
8cd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
8ce0: 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ass, unsigned ch
8cf0: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  ar instruction, 
8d00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
8d10: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
8d20: 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p2, unsigned cha
8d30: 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  r lc, unsigned c
8d40: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
8d50: 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e  ned char le, uin
8d60: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c  t16_t *respcode,
8d70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8d80: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74  respdata, size_t
8d90: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b   *respdata_len);
8da0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
8db0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
8dc0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
8dd0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
8de0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
8df0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
8e00: 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20   char class. *  
8e10: 20 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73         APDU Clas
8e20: 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  s (GSCIS_CLASS_I
8e30: 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f  SO7816 or GSCIS_
8e40: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41  CLASS_GLOBAL_PLA
8e50: 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20  TFORM. *        
8e60: 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29   usually), (CLA)
8e70: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
8e80: 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63  ned char instruc
8e90: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  tion. *         
8ea0: 41 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e  APDU Instruction
8eb0: 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20   (INS). *. *    
8ec0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
8ed0: 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  1. *         APD
8ee0: 55 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50  U Parameter 1 (P
8ef0: 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  1). *. *     uns
8f00: 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a  igned char p2. *
8f10: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61           APDU Pa
8f20: 72 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20  rameter 2 (P2). 
8f30: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
8f40: 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20  d char lc. *    
8f50: 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68       APDU Length
8f60: 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29   of Content (Lc)
8f70: 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20   -- this is the 
8f80: 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22  length of "data"
8f90: 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61  . *         para
8fa0: 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61  meter.  If "data
8fb0: 22 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  " is specified a
8fc0: 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72  s NULL, this par
8fd0: 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20  ameter will. *  
8fe0: 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65         be ignore
8ff0: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
9000: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
9010: 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e  . *         Poin
9020: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f  ter to buffer to
9030: 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c   send.  It shoul
9040: 64 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20  d be "Lc" bytes 
9050: 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20  long.  If. *    
9060: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
9070: 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c  s NULL, "Lc" wil
9080: 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61  l not be sent, a
9090: 6e 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77  nd this buffer w
90a0: 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20  ill be. *       
90b0: 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a    ignored.. *. *
90c0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
90d0: 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20  ar le. *        
90e0: 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20   APDU Length of 
90f0: 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29  Expectation (Le)
9100: 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20   -- this is the 
9110: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a  length of the. *
9120: 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65           expecte
9130: 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69  d reply.  If thi
9140: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
9150: 73 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  s 0 then it will
9160: 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20   not. *         
9170: 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20  be sent.. *. *  
9180: 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73     uint16_t *res
9190: 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20  pcode. *        
91a0: 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74   [OUT] Pointer t
91b0: 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44  o storage of APD
91c0: 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e  U response code.
91d0: 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20    If this is. * 
91e0: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
91f0: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  d as NULL, the r
9200: 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c  esponse code wil
9210: 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  l be discarded..
9220: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9230: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
9240: 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  a. *         [OU
9250: 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  T] Pointer to st
9260: 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65  orage of APDU re
9270: 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66  sponse data.  If
9280: 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20   this is. *     
9290: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
92a0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f   NULL, the respo
92b0: 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65  nse data will be
92c0: 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a   discarded.  If.
92d0: 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22   *         the "
92e0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61  respdata_len" pa
92f0: 72 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69  rameter is speci
9300: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
9310: 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20  is buffer. *    
9320: 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65       will not be
9330: 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20   updated.. *. * 
9340: 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70      size_t *resp
9350: 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20  data_len. *     
9360: 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f      [IN, OUT] Po
9370: 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67  inter initialing
9380: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9390: 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73  size of the "res
93a0: 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20  pdata". *       
93b0: 20 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72    buffer.  Befor
93c0: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65  e returning, the
93d0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75   pointed to valu
93e0: 65 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  e is updated to 
93f0: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e  the. *         n
9400: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
9410: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75  ritten to the bu
9420: 66 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69  ffer.  If this i
9430: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20  s specified as. 
9440: 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20  *         NULL, 
9450: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  it will not be u
9460: 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73  pdated, and "res
9470: 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69  pdata" will be i
9480: 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20  gnored causing. 
9490: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65  *         the re
94a0: 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62  sponse data to b
94b0: 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a  e discarded.. *.
94c0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
94d0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
94e0: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
94f0: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
9500: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
9510: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 4f  E_GENERIC      O
9520: 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20 20 20 43  n error. *     C
9530: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
9540: 45 4e 41 42 53 45 4e 54 20 20 49 66 20 74 68 65  ENABSENT  If the
9550: 20 73 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 20   sending failed 
9560: 62 65 63 61 75 73 65 20 74 68 65 20 74 6f 6b 65  because the toke
9570: 6e 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20  n is. *         
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 20 20 20 20 20 20 20 61 62 73 65 6e 74 0a 20 2a         absent. *
95a0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
95b0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
95c0: 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74  ill connect to t
95d0: 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74  he PC/SC Connect
95e0: 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76 69 61 0a  ion Manager via.
95f0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 70 63   *     cackey_pc
9600: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66 20  sc_connect() if 
9610: 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20  needed.. *. *   
9620: 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63    It will connec
9630: 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 6e  t to the card in
9640: 20 74 68 65 20 72 65 61 64 65 72 20 61 74 74 61   the reader atta
9650: 63 68 65 64 20 74 6f 20 74 68 65 20 73 6c 6f 74  ched to the slot
9660: 0a 20 2a 20 20 20 20 20 73 70 65 63 69 66 69 65  . *     specifie
9670: 64 2e 20 20 49 74 20 77 69 6c 6c 20 72 65 63 6f  d.  It will reco
9680: 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72  nnect to the car
9690: 64 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  d if the connect
96a0: 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73 20  ion. *     goes 
96b0: 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  away.. *. */.sta
96c0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
96d0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
96e0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
96f0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
9700: 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75  ed char class, u
9710: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73  nsigned char ins
9720: 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e  truction, unsign
9730: 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69  ed char p1, unsi
9740: 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e  gned char p2, un
9750: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20  signed char lc, 
9760: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
9770: 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ata, unsigned ch
9780: 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20  ar le, uint16_t 
9790: 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67  *respcode, unsig
97a0: 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61  ned char *respda
97b0: 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70  ta, size_t *resp
97c0: 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e  data_len) {..uin
97d0: 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d  t8_t major_rc, m
97e0: 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f 74  inor_rc;..size_t
97f0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20   bytes_to_copy, 
9800: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
9810: 3b 0a 09 4c 50 43 53 43 41 52 44 5f 49 4f 5f 52  ;..LPCSCARD_IO_R
9820: 45 51 55 45 53 54 20 70 69 6f 53 65 6e 64 50 63  EQUEST pioSendPc
9830: 69 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  i;..DWORD protoc
9840: 6f 6c 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f  ol;..DWORD xmit_
9850: 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09  len, recv_len;..
9860: 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 5f  LONG scard_xmit_
9870: 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e  ret, scard_recon
9880: 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69  n_ret;..BYTE xmi
9890: 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63  t_buf[1024], rec
98a0: 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e  v_buf[1024];..in
98b0: 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  t pcsc_connect_r
98c0: 65 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70  et, pcsc_getresp
98d0: 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a  _ret;..int idx;.
98e0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
98f0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
9900: 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b  ;...if (!slot) {
9910: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9920: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
9930: 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22  slot specified."
9940: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
9950: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
9960: 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63  IC);..}...pcsc_c
9970: 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
9980: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
9990: 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73  (slot);..if (pcs
99a0: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
99b0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
99c0: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
99d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
99e0: 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
99f0: 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
9a00: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
9a10: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
9a20: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
9a30: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
9a40: 6e 65 20 77 68 69 63 68 20 70 72 6f 74 6f 63 6f  ne which protoco
9a50: 6c 20 74 6f 20 73 65 6e 64 20 75 73 69 6e 67 20  l to send using 
9a60: 2a 2f 0a 09 73 77 69 74 63 68 20 28 73 6c 6f 74  */..switch (slot
9a70: 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09  ->protocol) {...
9a80: 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f  case SCARD_PROTO
9a90: 43 4f 4c 5f 54 30 3a 0a 09 09 09 70 69 6f 53 65  COL_T0:....pioSe
9aa0: 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43  ndPci = SCARD_PC
9ab0: 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65 61 6b 3b  I_T0;.....break;
9ac0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52  ...case SCARD_PR
9ad0: 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 70 69  OTOCOL_T1:....pi
9ae0: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44  oSendPci = SCARD
9af0: 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 62 72 65  _PCI_T1;.....bre
9b00: 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09  ak;...default:..
9b10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9b20: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70  RINTF("Invalid p
9b30: 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 61  rotocol found, a
9b40: 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09  borting.");.....
9b50: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
9b60: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
9b70: 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 74 20  }.../* Transmit 
9b80: 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 30  */..xmit_len = 0
9b90: 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ;..xmit_buf[xmit
9ba0: 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b  _len++] = class;
9bb0: 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
9bc0: 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 63  len++] = instruc
9bd0: 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  tion;..xmit_buf[
9be0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31  xmit_len++] = p1
9bf0: 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ;..xmit_buf[xmit
9c00: 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69  _len++] = p2;..i
9c10: 66 20 28 64 61 74 61 29 20 7b 0a 09 09 78 6d 69  f (data) {...xmi
9c20: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
9c30: 5d 20 3d 20 6c 63 3b 0a 09 09 66 6f 72 20 28 69  ] = lc;...for (i
9c40: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 6c 63  dx = 0; idx < lc
9c50: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 78 6d  ; idx++) {....xm
9c60: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
9c70: 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b 0a  +] = data[idx];.
9c80: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 65 20  ..}..}...if (le 
9c90: 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 78 6d 69  != 0x00) {...xmi
9ca0: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
9cb0: 5d 20 3d 20 6c 65 3b 0a 09 7d 0a 0a 09 2f 2a 20  ] = le;..}.../* 
9cc0: 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20  Begin Smartcard 
9cd0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
9ce0: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
9cf0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
9d00: 0a 09 69 66 20 28 63 6c 61 73 73 20 3d 3d 20 47  ..if (class == G
9d10: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
9d20: 31 36 20 26 26 20 69 6e 73 74 72 75 63 74 69 6f  16 && instructio
9d30: 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e 53 54 52  n == GSCIS_INSTR
9d40: 5f 56 45 52 49 46 59 20 26 26 20 70 31 20 3d 3d  _VERIFY && p1 ==
9d50: 20 30 78 30 30 20 26 26 20 70 32 20 3d 3d 20 30   0x00 && p2 == 0
9d60: 78 30 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  x00) {...CACKEY_
9d70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
9d80: 6e 64 69 6e 67 20 41 50 44 55 3a 20 3c 3c 63 65  nding APDU: <<ce
9d90: 6e 73 6f 72 65 64 3e 3e 22 29 3b 0a 09 7d 20 65  nsored>>");..} e
9da0: 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  lse {...CACKEY_D
9db0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53  EBUG_PRINTBUF("S
9dc0: 65 6e 64 69 6e 67 20 41 50 44 55 3a 22 2c 20 78  ending APDU:", x
9dd0: 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65  mit_buf, xmit_le
9de0: 6e 29 3b 0a 09 7d 0a 0a 09 72 65 63 76 5f 6c 65  n);..}...recv_le
9df0: 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f  n = sizeof(recv_
9e00: 62 75 66 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69  buf);..scard_xmi
9e10: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61  t_ret = SCardTra
9e20: 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nsmit(slot->pcsc
9e30: 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63  _card, pioSendPc
9e40: 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69  i, xmit_buf, xmi
9e50: 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63  t_len, NULL, rec
9e60: 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e  v_buf, &recv_len
9e70: 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78  );...if (scard_x
9e80: 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  mit_ret == SCARD
9e90: 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45  _E_NOT_TRANSACTE
9ea0: 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  D) {...CACKEY_DE
9eb0: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c  BUG_PRINTF("Fail
9ec0: 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20  ed to send APDU 
9ed0: 74 6f 20 63 61 72 64 20 28 53 43 61 72 64 54 72  to card (SCardTr
9ee0: 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c  ansmit() = %s/%l
9ef0: 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20 63 61 6c  x), will ask cal
9f00: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ling function to
9f10: 20 72 65 74 72 79 20 28 6e 6f 74 20 72 65 73 65   retry (not rese
9f20: 74 74 69 6e 67 20 63 61 72 64 29 2e 2e 2e 22 2c  tting card)...",
9f30: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
9f40: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
9f50: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
9f60: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t), (unsigned lo
9f70: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
9f80: 65 74 29 3b 0a 0a 09 09 2f 2a 20 42 65 67 69 6e  et);..../* Begin
9f90: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
9fa0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  action */...cack
9fb0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
9fc0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74  on(slot);....ret
9fd0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
9fe0: 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a 0a 09 69  E_RETRY);..}...i
9ff0: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
a000: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
a010: 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  CESS) {...CACKEY
a020: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
a030: 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50  ailed to send AP
a040: 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72  DU to card (SCar
a050: 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73  dTransmit() = %s
a060: 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45 59 5f 44  /%lx)", CACKEY_D
a070: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
a080: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
a090: 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69  xmit_ret), (unsi
a0a0: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64  gned long) scard
a0b0: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 43  _xmit_ret);....C
a0c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a0d0: 54 46 28 22 4d 61 72 6b 69 6e 67 20 73 6c 6f 74  TF("Marking slot
a0e0: 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20   as having been 
a0f0: 72 65 73 65 74 22 29 3b 0a 09 09 63 61 63 6b 65  reset");...cacke
a100: 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
a110: 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28  t(slot);....if (
a120: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
a130: 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  = SCARD_W_RESET_
a140: 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
a150: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a160: 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20  Reset required, 
a170: 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29  please hold...")
a180: 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f  ;.....scard_reco
a190: 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
a1a0: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
a1b0: 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  lot, SCARD_PROTO
a1c0: 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
a1d0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 6f  ROTOCOL_T1, &pro
a1e0: 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28  tocol);.....if (
a1f0: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
a200: 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   == SCARD_S_SUCC
a210: 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70  ESS) {...../* Up
a220: 64 61 74 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  date protocol */
a230: 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f  .....slot->proto
a240: 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a  col = protocol;.
a250: 09 09 09 09 73 77 69 74 63 68 20 28 73 6c 6f 74  ....switch (slot
a260: 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09  ->protocol) {...
a270: 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52  ...case SCARD_PR
a280: 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09 09  OTOCOL_T0:......
a290: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
a2a0: 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09  ARD_PCI_T0;.....
a2b0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
a2c0: 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ase SCARD_PROTOC
a2d0: 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70 69 6f  OL_T1:.......pio
a2e0: 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f  SendPci = SCARD_
a2f0: 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09 62  PCI_T1;........b
a300: 72 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61 75  reak;......defau
a310: 6c 74 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59  lt:.......CACKEY
a320: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
a330: 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20  nvalid protocol 
a340: 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20 6c  found, but too l
a350: 61 74 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69  ate to do anythi
a360: 6e 67 20 61 62 6f 75 74 20 69 74 20 6e 6f 77 20  ng about it now 
a370: 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79 77 61 79  -- trying anyway
a380: 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  .");........brea
a390: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
a3a0: 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72   Re-establish tr
a3b0: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74  ansaction, if it
a3c0: 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a   was present */.
a3d0: 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ....if (slot->tr
a3e0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
a3f0: 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74  > 0) {......slot
a400: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
a410: 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74  pth--;......slot
a420: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ->transaction_ne
a430: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a  ed_hw_lock = 1;.
a440: 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69  .....cackey_begi
a450: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  n_transaction(sl
a460: 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ot);.....}......
a470: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a480: 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65  NTF("Reset succe
a490: 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d 69  ssful, retransmi
a4a0: 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72 65  tting");......re
a4b0: 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  cv_len = sizeof(
a4c0: 72 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09 73  recv_buf);.....s
a4d0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20  card_xmit_ret = 
a4e0: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c  SCardTransmit(sl
a4f0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70  ot->pcsc_card, p
a500: 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f  ioSendPci, xmit_
a510: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e  buf, xmit_len, N
a520: 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26  ULL, recv_buf, &
a530: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  recv_len);......
a540: 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  if (scard_xmit_r
a550: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
a560: 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41  CCESS) {......CA
a570: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a580: 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61  F("Retransmit fa
a590: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
a5a0: 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65 72  in failure after
a5b0: 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74   disconnecting t
a5c0: 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54 72  he card (SCardTr
a5d0: 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29  ansmit = %s/%li)
a5e0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
a5f0: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
a600: 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f  _STR(scard_xmit_
a610: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
a620: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09  rd_xmit_ret);...
a630: 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e  ....SCardDisconn
a640: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
a650: 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45  ard, SCARD_LEAVE
a660: 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f  _CARD);......slo
a670: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
a680: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
a690: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
a6a0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
a6b0: 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  /......slot->tra
a6c0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
a6d0: 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f   1;......cackey_
a6e0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
a6f0: 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74  slot);.......ret
a700: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
a710: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
a720: 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
a730: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
a740: 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f  UG_PRINTF("Disco
a750: 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b  nnecting card");
a760: 0a 0a 09 09 09 09 53 43 61 72 64 44 69 73 63 6f  ......SCardDisco
a770: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
a780: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
a790: 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 73 6c  VE_CARD);.....sl
a7a0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
a7b0: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
a7c0: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
a7d0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
a7e0: 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  /.....slot->tran
a7f0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
a800: 31 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65 6e  1;.....cackey_en
a810: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
a820: 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ot);......CACKEY
a830: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
a840: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
a850: 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75 72  ure");.....retur
a860: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
a870: 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
a880: 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
a890: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a8a0: 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74  INTF("Disconnect
a8b0: 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09  ing card");.....
a8c0: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
a8d0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
a8e0: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
a8f0: 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73  D);....slot->pcs
a900: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
a910: 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64   = 0;...../* End
a920: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
a930: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f  action */....slo
a940: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
a950: 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61 63  epth = 1;....cac
a960: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
a970: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 43  ion(slot);.....C
a980: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a990: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
a9a0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 72   failure");....r
a9b0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
a9c0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
a9d0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  ;...}..}...CACKE
a9e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
a9f0: 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75 65  ("Returned Value
aa00: 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72 65  :", recv_buf, re
aa10: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 72  cv_len);...if (r
aa20: 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09  ecv_len < 2) {..
aa30: 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73 70  ./* Minimal resp
aa40: 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20 32  onse length is 2
aa50: 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69 6e   bytes, returnin
aa60: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a  g in failure */.
aa70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
aa80: 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20  RINTF("Response 
aa90: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72  too small, retur
aaa0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
aab0: 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 29  (recv_len = %lu)
aac0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
aad0: 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  g) recv_len);...
aae0: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
aaf0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
ab00: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
ab10: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
ab20: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
ab30: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
ab40: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
ab50: 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 65  mine result code
ab60: 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20   */..major_rc = 
ab70: 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65  recv_buf[recv_le
ab80: 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72  n - 2];..minor_r
ab90: 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63  c = recv_buf[rec
aba0: 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20  v_len - 1];..if 
abb0: 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a  (respcode) {...*
abc0: 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f  respcode = (majo
abd0: 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e  r_rc << 8) | min
abe0: 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41  or_rc;..}.../* A
abf0: 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62 75  djust message bu
ac00: 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65  ffer */..recv_le
ac10: 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64  n -= 2;.../* Add
ac20: 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e   bytes to return
ac30: 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72   value */..tmp_r
ac40: 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b  espdata_len = 0;
ac50: 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20 26  ..if (respdata &
ac60: 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20  & respdata_len) 
ac70: 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61  {...tmp_respdata
ac80: 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 61  _len = *respdata
ac90: 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74  _len;....bytes_t
aca0: 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 61  o_copy = *respda
acb0: 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72  ta_len;....if (r
acc0: 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f  ecv_len < bytes_
acd0: 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 79  to_copy) {....by
ace0: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65  tes_to_copy = re
acf0: 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43  cv_len;...}....C
ad00: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ad10: 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 20  TF("Copying %lu 
ad20: 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75 66  bytes to the buf
ad30: 66 65 72 20 28 72 65 63 76 27 64 20 25 6c 75 20  fer (recv'd %lu 
ad40: 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79 20  bytes, but only 
ad50: 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20 69  %lu bytes left i
ad60: 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c 20  n our buffer)", 
ad70: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
ad80: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 28  bytes_to_copy, (
ad90: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72  unsigned long) r
ada0: 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67 6e  ecv_len, (unsign
adb0: 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64 61  ed long) *respda
adc0: 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63  ta_len);....memc
add0: 70 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 63  py(respdata, rec
ade0: 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f  v_buf, bytes_to_
adf0: 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74  copy);...respdat
ae00: 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f  a += bytes_to_co
ae10: 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61  py;....*respdata
ae20: 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f  _len = bytes_to_
ae30: 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70  copy;...tmp_resp
ae40: 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65  data_len -= byte
ae50: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c  s_to_copy;..} el
ae60: 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f  se {...if (recv_
ae70: 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  len != 0) {....C
ae80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ae90: 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61  TF("Throwing awa
aea0: 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77  y %lu bytes, now
aeb0: 68 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d  here to put them
aec0: 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  !", (unsigned lo
aed0: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09  ng) recv_len);..
aee0: 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f  .}..}...if (majo
aef0: 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a  r_rc == 0x61) {.
af00: 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20  ../* We need to 
af10: 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59  READ */...CACKEY
af20: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
af30: 75 66 66 65 72 20 72 65 61 64 20 72 65 71 75 69  uffer read requi
af40: 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d 69  red");....if (mi
af50: 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29 20  nor_rc == 0x00) 
af60: 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d 20  {....minor_rc = 
af70: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b  CACKEY_APDU_MTU;
af80: 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65 74  ...}....pcsc_get
af90: 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b 65  resp_ret = cacke
afa0: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
afb0: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
afc0: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
afd0: 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c  TR_GET_RESPONSE,
afe0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c 20   0x00, 0x00, 0, 
aff0: 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20  NULL, minor_rc, 
b000: 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 61  respcode, respda
b010: 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 74  ta, &tmp_respdat
b020: 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 70  a_len);....if (p
b030: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
b040: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
b050: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
b060: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
b070: 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65  uffer read faile
b080: 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e  d!  Returning in
b090: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
b0a0: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b0b0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b0c0: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
b0d0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b0e0: 0a 0a 09 09 09 69 66 20 28 70 63 73 63 5f 67 65  .....if (pcsc_ge
b0f0: 74 72 65 73 70 5f 72 65 74 20 3d 3d 20 43 41 43  tresp_ret == CAC
b100: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
b110: 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ) {.....return(C
b120: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
b130: 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  RY);....}.....re
b140: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
b150: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
b160: 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61 74 61  ....if (respdata
b170: 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73 70  _len) {....*resp
b180: 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f  data_len += tmp_
b190: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 09  respdata_len;...
b1a0: 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  }..../* End Smar
b1b0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
b1c0: 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e  n */...cackey_en
b1d0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
b1e0: 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ot);....CACKEY_D
b1f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
b200: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
b210: 73 20 28 62 75 66 66 65 72 20 72 65 61 64 20 63  s (buffer read c
b220: 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65  omplete)");...re
b230: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
b240: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  _S_OK);..}.../* 
b250: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
b260: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
b270: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
b280: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66  tion(slot);...if
b290: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78   (major_rc == 0x
b2a0: 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65  90) {.../* Succe
b2b0: 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  ss */...CACKEY_D
b2c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
b2d0: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
b2e0: 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78  s (major_rc = 0x
b2f0: 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  90)");....return
b300: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
b310: 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59  K);..}....CACKEY
b320: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
b330: 50 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e 20  PDU Returned an 
b340: 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67  error, returning
b350: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
b360: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b370: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
b380: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
b390: 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74  S. *     ssize_t
b3a0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
b3b0: 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65  fer(struct cacke
b3c0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
b3d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
b3e0: 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  fer, size_t coun
b3f0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
b400: 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20   t_or_v, size_t 
b410: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b  initial_offset);
b420: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
b430: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
b440: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
b450: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
b460: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
b470: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75  s to. *. *     u
b480: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
b490: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
b4a0: 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a  [OUT] Buffer. *.
b4b0: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f   *     size_t co
b4c0: 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e  unt. *         N
b4d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
b4e0: 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  o attempt to rea
b4f0: 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  d. *. *     unsi
b500: 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76  gned char t_or_v
b510: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65  . *         Sele
b520: 63 74 20 74 68 65 20 54 2d 62 75 66 66 65 72 20  ct the T-buffer 
b530: 28 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72  (01) or V-buffer
b540: 20 28 30 32 29 20 74 6f 20 72 65 61 64 20 66 72   (02) to read fr
b550: 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20  om.  . *. *     
b560: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f  size_t initial_o
b570: 66 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20  ffset. *        
b580: 20 53 70 65 63 69 66 79 20 74 68 65 20 6f 66 66   Specify the off
b590: 73 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65  set to begin the
b5a0: 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a   read from. *. *
b5b0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
b5c0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
b5d0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
b5e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
b5f0: 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c  s actually read,
b600: 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e   or -1 on error.
b610: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
b620: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a      None. *. */.
b630: 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63  static ssize_t c
b640: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
b650: 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  r(struct cackey_
b660: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
b670: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
b680: 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c  r, size_t count,
b690: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
b6a0: 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e  _or_v, size_t in
b6b0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a  itial_offset) {.
b6c0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
b6d0: 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a 09 73 69  init_buffer;..si
b6e0: 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74 3b  ze_t init_count;
b6f0: 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69 6e  ..size_t init_in
b700: 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09  itial_offset;...
b710: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20  size_t offset = 
b720: 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d  0, max_offset, m
b730: 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67  ax_count;..unsig
b740: 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b  ned char cmd[2];
b750: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63  ..uint16_t respc
b760: 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ode;..int send_r
b770: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
b780: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
b790: 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66  d.");...init_buf
b7a0: 66 65 72 20 3d 20 62 75 66 66 65 72 3b 0a 09 69  fer = buffer;..i
b7b0: 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e  nit_count = coun
b7c0: 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61 6c  t;..init_initial
b7d0: 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69 74 69 61  _offset = initia
b7e0: 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78 5f  l_offset;...max_
b7f0: 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a  offset = count;.
b800: 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43  .max_count = CAC
b810: 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09  KEY_APDU_MTU;...
b820: 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20  if (t_or_v != 1 
b830: 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20  && t_or_v != 2) 
b840: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
b850: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
b860: 20 54 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65   T or V paramete
b870: 72 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74  r specified, ret
b880: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b890: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  e");....return(-
b8a0: 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20  1);..}...cmd[0] 
b8b0: 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c  = t_or_v;...whil
b8c0: 65 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66  e (1) {...if (of
b8d0: 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73  fset >= max_offs
b8e0: 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  et) {....CACKEY_
b8f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
b900: 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  ffer too small, 
b910: 72 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77  returning what w
b920: 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09  e got...");.....
b930: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f  break;...}....co
b940: 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74  unt = max_offset
b950: 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20   - offset;...if 
b960: 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75  (count > max_cou
b970: 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d  nt) {....count =
b980: 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a   max_count;...}.
b990: 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e  ...cmd[1] = coun
b9a0: 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d  t;....send_ret =
b9b0: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
b9c0: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
b9d0: 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46  ASS_GLOBAL_PLATF
b9e0: 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  ORM, GSCIS_INSTR
b9f0: 5f 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28  _READ_BUFFER, ((
ba00: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b  initial_offset +
ba10: 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26   offset) >> 8) &
ba20: 20 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f   0xff, (initial_
ba30: 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29  offset + offset)
ba40: 20 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28   & 0xff, sizeof(
ba50: 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c  cmd), cmd, 0x00,
ba60: 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66   &respcode, buff
ba70: 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f  er + offset, &co
ba80: 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28 73 65 6e  unt);....if (sen
ba90: 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  d_ret == CACKEY_
baa0: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a  PCSC_E_RETRY) {.
bab0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bac0: 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e  PRINTF("ADPU Sen
bad0: 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74  ding failed, ret
bae0: 72 79 69 6e 67 20 72 65 61 64 20 62 75 66 66 65  rying read buffe
baf0: 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  r");.....return(
bb00: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
bb10: 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 75  er(slot, init_bu
bb20: 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74  ffer, init_count
bb30: 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f 69  , t_or_v, init_i
bb40: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 29 3b  nitial_offset));
bb50: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64  ...}....if (send
bb60: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
bb70: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69  CSC_S_OK) {....i
bb80: 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
bb90: 78 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20  x6A86) {.....if 
bba0: 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29  (max_count == 1)
bbb0: 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
bbc0: 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f  ...}......max_co
bbd0: 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20  unt = max_count 
bbe0: 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e  / 2;......contin
bbf0: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43  ue;....}.....CAC
bc00: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bc10: 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  ("cackey_send_ap
bc20: 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74  du() failed, ret
bc30: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
bc40: 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  e");.....return(
bc50: 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73  -1);...}....offs
bc60: 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09  et += count;....
bc70: 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f  if (count < max_
bc80: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
bc90: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bca0: 22 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63  "Short read -- c
bcb0: 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31  ount = %i, cmd[1
bcc0: 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63  ] = %i", (int) c
bcd0: 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b  ount, (int) cmd[
bce0: 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  1]);.....break;.
bcf0: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  ..}..}..#ifdef C
bd00: 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23  ACKEY_PARANOID.#
bd10: 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53    ifdef _POSIX_S
bd20: 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66  SIZE_MAX..if (of
bd30: 66 73 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53  fset > _POSIX_SS
bd40: 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
bd50: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bd60: 28 22 4f 66 66 73 65 74 20 65 78 63 65 65 64 73  ("Offset exceeds
bd70: 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20   maximum value, 
bd80: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
bd90: 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69  lure. (max = %li
bda0: 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22  , offset = %lu)"
bdb0: 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
bdc0: 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
bdd0: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65  gned long) offse
bde0: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
bdf0: 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23  );..}.#  endif.#
be00: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
be10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
be20: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
be30: 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65  s, read %lu byte
be40: 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  s", (unsigned lo
be50: 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72  ng) offset);...r
be60: 65 74 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d  eturn(offset);.}
be70: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
be80: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
be90: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
bea0: 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63  _applet(struct c
beb0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
bec0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
bed0: 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64  *aid, size_t aid
bee0: 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  _len);. *. * ARG
bef0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
bf00: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
bf10: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
bf20: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
bf30: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
bf40: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
bf50: 61 72 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20  ar *aid. *      
bf60: 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69     Buffer contai
bf70: 6e 69 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74  ning Applet ID t
bf80: 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20  o select. *. *  
bf90: 20 20 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65     size_t aid_le
bfa0: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d  n. *         Num
bfb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
bfc0: 74 68 65 20 22 61 69 64 22 20 28 41 70 70 6c 65  the "aid" (Apple
bfd0: 74 20 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a  t ID) parameter.
bfe0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
bff0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
c000: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
c010: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
c020: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
c030: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
c040: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
c050: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  ES. *     None. 
c060: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
c070: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
c080: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72  elect_applet(str
c090: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
c0a0: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
c0b0: 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f  char *aid, size_
c0c0: 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e  t aid_len) {..in
c0d0: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41  t send_ret;...CA
c0e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c0f0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
c100: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c110: 4e 54 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67  NTBUF("Selecting
c120: 20 61 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20   applet:", aid, 
c130: 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64  aid_len);...send
c140: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
c150: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
c160: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
c170: 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  6, GSCIS_INSTR_S
c180: 45 4c 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52  ELECT, GSCIS_PAR
c190: 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54  AM_SELECT_APPLET
c1a0: 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c  , 0x00, aid_len,
c1b0: 20 61 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c   aid, 0x00, NULL
c1c0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a  , NULL, NULL);..
c1d0: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
c1e0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52   CACKEY_PCSC_E_R
c1f0: 45 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59  ETRY) {...CACKEY
c200: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
c210: 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c  DPU Sending fail
c220: 65 64 2c 20 72 65 74 72 79 69 6e 67 20 73 65 6c  ed, retrying sel
c230: 65 63 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09  ect applet");...
c240: 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73  .return(cackey_s
c250: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
c260: 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29  t, aid, aid_len)
c270: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64  );..}...if (send
c280: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
c290: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
c2a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c2b0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  F("Failed to ope
c2c0: 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e  n applet, return
c2d0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
c2e0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
c2f0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
c300: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
c310: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
c320: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
c330: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
c340: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
c350: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
c360: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
c370: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
c380: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
c390: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
c3a0: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
c3b0: 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  t ef);. *. * ARG
c3c0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
c3d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
c3e0: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
c3f0: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
c400: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
c410: 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66       uint16_t ef
c420: 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d  . *         Elem
c430: 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65  ental File to se
c440: 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52  lect. *. * RETUR
c450: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
c460: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
c470: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
c480: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
c490: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
c4a0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
c4b0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
c4c0: 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45  his selects an E
c4d0: 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28  lementary File (
c4e0: 45 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75  EF) under the cu
c4f0: 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64  rrently selected
c500: 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65  . *     Dedicate
c510: 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20  d File (DF). *. 
c520: 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20  *     Typically 
c530: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  this is called a
c540: 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74  fter selecting t
c550: 68 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65  he correct Apple
c560: 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20  t (using. *     
c570: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
c580: 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72  plet) for VM car
c590: 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ds. *. */.static
c5a0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
c5b0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
c5c0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
c5d0: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
c5e0: 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65  t ef) {..unsigne
c5f0: 64 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32  d char fid_buf[2
c600: 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  ];..int send_ret
c610: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
c620: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
c630: 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68  ");.../* Open th
c640: 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c  e elementary fil
c650: 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d  e */..fid_buf[0]
c660: 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30   = (ef >> 8) & 0
c670: 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d  xff;..fid_buf[1]
c680: 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09   = ef & 0xff;...
c690: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c6a0: 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66  NTF("Selecting f
c6b0: 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e  ile: %04lx", (un
c6c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29  signed long) ef)
c6d0: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
c6e0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
c6f0: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
c700: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
c710: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30  _INSTR_SELECT, 0
c720: 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f  x02, 0x0C, sizeo
c730: 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f  f(fid_buf), fid_
c740: 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c  buf, 0x00, NULL,
c750: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69   NULL, NULL);..i
c760: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
c770: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
c780: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
c790: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
c7a0: 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72   to open file, r
c7b0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
c7c0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
c7d0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
c7e0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
c7f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c800: 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20  F("Successfully 
c810: 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b  selected file");
c820: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
c830: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
c840: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
c850: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65  *     void cacke
c860: 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63  y_free_tlv(struc
c870: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
c880: 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20  ity *root);. *. 
c890: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
c8a0: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
c8b0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f  _tlv_entity *roo
c8c0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f  t. *         Roo
c8d0: 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73  t of the TLV lis
c8e0: 74 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69  t to start freei
c8f0: 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ng. *. * RETURN 
c900: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e  VALUE. *     Non
c910: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  e. *. * NOTES. *
c920: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
c930: 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56  on frees the TLV
c940: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72   linked listed r
c950: 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20  eturned from. * 
c960: 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64      "cackey_read
c970: 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61  _tlv". *. */.sta
c980: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
c990: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20  free_tlv(struct 
c9a0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
c9b0: 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75  y *root) {..stru
c9c0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
c9d0: 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78  tity *curr, *nex
c9e0: 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d  t;...if (root ==
c9f0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
ca00: 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72  n;..}...for (cur
ca10: 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20  r = root; curr; 
ca20: 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09  curr = next) {..
ca30: 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e  .next = curr->_n
ca40: 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  ext;....switch (
ca50: 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09  curr->tag) {....
ca60: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
ca70: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73  CR_TABLE:....cas
ca80: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
ca90: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20  IFICATE:.....if 
caa0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a  (curr->value) {.
cab0: 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e  .....free(curr->
cac0: 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09  value);.....}...
cad0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
cae0: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
caf0: 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72  RL:.....if (curr
cb00: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
cb10: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
cb20: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
cb30: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
cb40: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28  ak;...}....free(
cb50: 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  curr);..}...retu
cb60: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
cb70: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
cb80: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
cb90: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
cba0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
cbb0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
cbc0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
cbd0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
cbe0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
cbf0: 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  _entity *cackey_
cc00: 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20  read_tlv(struct 
cc10: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
cc20: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  t) {..struct cac
cc30: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
cc40: 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f  curr_entity, *ro
cc50: 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74  ot = NULL, *last
cc60: 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e   = NULL;..unsign
cc70: 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66  ed char tlen_buf
cc80: 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30  [2], tval_buf[10
cc90: 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73  24], *tval;..uns
cca0: 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f  igned char vlen_
ccb0: 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66  buf[2], vval_buf
ccc0: 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09  [8192], *vval;..
ccd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
cce0: 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64  mpbuf;..unsigned
ccf0: 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b   long tmpbuflen;
cd00: 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20  ..ssize_t tlen, 
cd10: 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72  vlen;..ssize_t r
cd20: 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74  ead_ret;..size_t
cd30: 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f   offset_t = 0, o
cd40: 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e  ffset_v = 0;..un
cd50: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b  signed char tag;
cd60: 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b  ..size_t length;
cd70: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42  .#ifdef HAVE_LIB
cd80: 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73  Z..int uncompres
cd90: 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09  s_ret;.#endif...
cda0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
cdb0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
cdc0: 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63  ..read_ret = cac
cdd0: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
cde0: 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20  slot, tlen_buf, 
cdf0: 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29  sizeof(tlen_buf)
ce00: 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a  , 1, offset_t);.
ce10: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
ce20: 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66   sizeof(tlen_buf
ce30: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
ce40: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
ce50: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
ce60: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
ce70: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
ce80: 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74  ;..}...tlen = (t
ce90: 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29  len_buf[1] << 8)
cea0: 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a   | tlen_buf[0];.
ceb0: 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63  ..read_ret = cac
cec0: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
ced0: 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20  slot, vlen_buf, 
cee0: 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29  sizeof(vlen_buf)
cef0: 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a  , 2, offset_v);.
cf00: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
cf10: 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66   sizeof(vlen_buf
cf20: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
cf30: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
cf40: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
cf50: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
cf60: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
cf70: 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76  ;..}...vlen = (v
cf80: 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29  len_buf[1] << 8)
cf90: 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a   | vlen_buf[0];.
cfa0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cfb0: 52 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74  RINTF("Tag Lengt
cfc0: 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20 4c  h = %lu, Value L
cfd0: 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75  ength = %lu", (u
cfe0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74 6c  nsigned long) tl
cff0: 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
d000: 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66  ng) vlen);...off
d010: 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66  set_t += 2;..off
d020: 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66  set_v += 2;...if
d030: 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28   (tlen > sizeof(
d040: 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43  tval_buf)) {...C
d050: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d060: 54 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69  TF("Tag length i
d070: 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74  s too large, ret
d080: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
d090: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
d0a0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76  ULL);..}...if (v
d0b0: 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61  len > sizeof(vva
d0c0: 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b  l_buf)) {...CACK
d0d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d0e0: 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73  "Value length is
d0f0: 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75   too large, retu
d100: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
d110: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
d120: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72  LL);..}...read_r
d130: 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  et = cackey_read
d140: 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76  _buffer(slot, tv
d150: 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c  al_buf, tlen, 1,
d160: 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20   offset_t);..if 
d170: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65  (read_ret != tle
d180: 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
d190: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
d1a0: 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72  le to read entir
d1b0: 65 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75  e T-buffer, retu
d1c0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
d1d0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
d1e0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72  LL);..}...read_r
d1f0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  et = cackey_read
d200: 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76  _buffer(slot, vv
d210: 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c  al_buf, vlen, 2,
d220: 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20   offset_v);..if 
d230: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65  (read_ret != vle
d240: 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
d250: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
d260: 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72  le to read entir
d270: 65 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75  e V-buffer, retu
d280: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
d290: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
d2a0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d  LL);..}...tval =
d2b0: 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c   tval_buf;..vval
d2c0: 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68   = vval_buf;..wh
d2d0: 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26  ile (tlen > 0 &&
d2e0: 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74   vlen > 0) {...t
d2f0: 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76  ag = *tval;...tv
d300: 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a  al++;...tlen--;.
d310: 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20  ...if (*tval == 
d320: 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74  0xff) {....lengt
d330: 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20  h = (tval[2] << 
d340: 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09  8) | tval[1];...
d350: 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74  .tval += 3;....t
d360: 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c  len -= 3;...} el
d370: 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d  se {....length =
d380: 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b   *tval;....tval+
d390: 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09  +;....tlen--;...
d3a0: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
d3b0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25  G_PRINTF("Tag: %
d3c0: 73 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45  s (%02x)", CACKE
d3d0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
d3e0: 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75  _TO_STR(tag), (u
d3f0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67  nsigned int) tag
d400: 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
d410: 47 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75  G_PRINTBUF("Valu
d420: 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  e:", vval, lengt
d430: 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69  h);....curr_enti
d440: 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69  ty = NULL;...swi
d450: 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63  tch (tag) {....c
d460: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
d470: 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f  RDURL:.....curr_
d480: 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
d490: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
d4a0: 69 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f  ity));.....curr_
d4b0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
d4c0: 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  rdurl = malloc(s
d4d0: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
d4e0: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
d4f0: 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79  l));......memcpy
d500: 28 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  (curr_entity->va
d510: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
d520: 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09  , vval, 5);.....
d530: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
d540: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
d550: 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09  ype = vval[5];..
d560: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
d570: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
d580: 62 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b  bjectid = (vval[
d590: 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b  6] << 8) | vval[
d5a0: 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  7];.....curr_ent
d5b0: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
d5c0: 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61  rl->appid = (vva
d5d0: 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61  l[8] << 8) | vva
d5e0: 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f  l[9];......curr_
d5f0: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
d600: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
d610: 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c  ty->_next = NULL
d620: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
d630: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
d640: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63  ACR_TABLE:.....c
d650: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
d660: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
d670: 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74  _entity));.....t
d680: 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c  mpbuf = malloc(l
d690: 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d  ength);......mem
d6a0: 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c  cpy(tmpbuf, vval
d6b0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09  , length);......
d6c0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
d6d0: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
d6e0: 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20  _entity->length 
d6f0: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75  = length;.....cu
d700: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
d710: 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63   = tmpbuf;.....c
d720: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78  urr_entity->_nex
d730: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62  t = NULL;......b
d740: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53  reak;....case GS
d750: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
d760: 41 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e  ATE:.....curr_en
d770: 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
d780: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
d790: 79 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56  y));..#ifdef HAV
d7a0: 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75  E_LIBZ.....tmpbu
d7b0: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20  flen = length * 
d7c0: 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20  2;.....tmpbuf = 
d7d0: 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e  malloc(tmpbuflen
d7e0: 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65  );......uncompre
d7f0: 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72  ss_ret = uncompr
d800: 65 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70  ess(tmpbuf, &tmp
d810: 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65  buflen, vval, le
d820: 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75  ngth);.....if (u
d830: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d  ncompress_ret !=
d840: 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41   Z_OK) {......CA
d850: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d860: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63  F("Failed to dec
d870: 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72  ompress, uncompr
d880: 65 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 25  ess() returned %
d890: 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74  i -- resorting t
d8a0: 6f 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20  o direct copy", 
d8b0: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b  uncompress_ret);
d8c0: 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  .......tmpbuflen
d8d0: 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09   = length;......
d8e0: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
d8f0: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09  val, length);...
d900: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
d910: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
d920: 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a  Decompressed to:
d930: 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75  ", tmpbuf, tmpbu
d940: 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09  flen);.#else....
d950: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d960: 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c  INTF("Missing ZL
d970: 49 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73  IB Support, this
d980: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
d990: 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e  likely useless..
d9a0: 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66  .");......tmpbuf
d9b0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  len = length;...
d9c0: 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c  ..memcpy(tmpbuf,
d9d0: 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a   vval, length);.
d9e0: 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72  #endif......curr
d9f0: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
da00: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
da10: 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d  ity->length = tm
da20: 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72  pbuflen;.....cur
da30: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20  r_entity->value 
da40: 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75  = tmpbuf;.....cu
da50: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
da60: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
da70: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
da80: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09  IS_TAG_PKCS15:..
da90: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
daa0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
dab0: 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a  curr_entity));..
dac0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
dad0: 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09  >tag = tag;.....
dae0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
daf0: 75 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30  ue_byte = vval[0
db00: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
db10: 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c  ty->_next = NULL
db20: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
db30: 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e  }....vval += len
db40: 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c  gth;...vlen -= l
db50: 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75  ength;....if (cu
db60: 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c  rr_entity != NUL
db70: 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74  L) {....if (root
db80: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
db90: 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  root = curr_enti
dba0: 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ty;....}.....if 
dbb0: 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b  (last != NULL) {
dbc0: 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74  .....last->_next
dbd0: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
dbe0: 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20  ...}.....last = 
dbf0: 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d  curr_entity;...}
dc00: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f  ..}...return(roo
dc10: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  t);.}../*. * SYN
dc20: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
dc30: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
dc40: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
dc50: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
dc60: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
dc70: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
dc80: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
dc90: 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f  oid cackey_free_
dca0: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
dcb0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
dcc0: 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74  y *start, size_t
dcd0: 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65   count, int free
dce0: 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f  _start) {..size_
dcf0: 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61  t idx;...if (sta
dd00: 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
dd10: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72  return;..}...for
dd20: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
dd30: 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b   count; idx++) {
dd40: 0a 09 09 69 66 20 28 73 74 61 72 74 5b 69 64 78  ...if (start[idx
dd50: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 20 7b  ].certificate) {
dd60: 0a 09 09 09 66 72 65 65 28 73 74 61 72 74 5b 69  ....free(start[i
dd70: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29  dx].certificate)
dd80: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66  ;...}..}...if (f
dd90: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66  ree_start) {...f
dda0: 72 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a  ree(start);..}..
ddb0: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
ddc0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
ddd0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
dde0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
ddf0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
de00: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
de10: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
de20: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
de30: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
de40: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
de50: 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72  *cackey_read_cer
de60: 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  ts(struct cackey
de70: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72  _slot *slot, str
de80: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
de90: 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c  identity *certs,
dea0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a   unsigned long *
deb0: 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74  count) {..struct
dec0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
ded0: 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a  ntity *curr_id;.
dee0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
def0: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74  lv_entity *ccc_t
df00: 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a  lv, *ccc_curr, *
df10: 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75  app_tlv, *app_cu
df20: 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  rr;..unsigned ch
df30: 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b  ar ccc_aid[] = {
df40: 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a  GSCIS_AID_CCC};.
df50: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
df60: 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73  urr_aid[7];..uns
df70: 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64  igned long outid
df80: 78 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 72  x = 0;..cackey_r
df90: 65 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72  et transaction_r
dfa0: 65 74 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f 72  et;..int certs_r
dfb0: 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73  esizable;..int s
dfc0: 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f  end_ret, select_
dfd0: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
dfe0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
dff0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75  ed.");...if (cou
e000: 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
e010: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e020: 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55  NTF("count is NU
e030: 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  LL, returning in
e040: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e050: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
e060: 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e  ..if (certs != N
e070: 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f  ULL) {...if (*co
e080: 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43  unt == 0) {....C
e090: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e0a0: 54 46 28 22 52 65 71 75 65 73 74 65 64 20 77 65  TF("Requested we
e0b0: 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74   return 0 object
e0c0: 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  s, short-circuit
e0d0: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  ");.....return(c
e0e0: 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  erts);...}..}...
e0f0: 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d 61 72 74  /* Begin a Smart
e100: 43 61 72 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  Card transaction
e110: 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e   */..transaction
e120: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 62 65  _ret = cackey_be
e130: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
e140: 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74 72 61 6e  slot);..if (tran
e150: 73 61 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43  saction_ret != C
e160: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
e170: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e180: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
e190: 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
e1a0: 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  on, returning in
e1b0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e1c0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
e1d0: 0a 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
e1e0: 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ULL) {...certs =
e1f0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
e200: 63 65 72 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a  certs) * 5);...*
e210: 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72  count = 5;...cer
e220: 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 31  ts_resizable = 1
e230: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65  ;..} else {...ce
e240: 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20  rts_resizable = 
e250: 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63  0;..}.../* Selec
e260: 74 20 74 68 65 20 43 43 43 20 41 70 70 6c 65 74  t the CCC Applet
e270: 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20   */..send_ret = 
e280: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
e290: 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61  plet(slot, ccc_a
e2a0: 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61  id, sizeof(ccc_a
e2b0: 69 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f  id));..if (send_
e2c0: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
e2d0: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
e2e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e2f0: 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65  ("Unable to sele
e300: 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72  ct CCC Applet, r
e310: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
e320: 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20 54 65 72  ure");..../* Ter
e330: 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64  minate SmartCard
e340: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
e350: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
e360: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
e370: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
e380: 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64 20 61 6c  ..}.../* Read al
e390: 6c 20 74 68 65 20 61 70 70 6c 65 74 73 20 66 72  l the applets fr
e3a0: 6f 6d 20 74 68 65 20 43 43 43 27 73 20 54 4c 56  om the CCC's TLV
e3b0: 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20 3d 20 63   */..ccc_tlv = c
e3c0: 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73  ackey_read_tlv(s
e3d0: 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20  lot);.../* Look 
e3e0: 66 6f 72 20 43 41 52 44 55 52 4c 73 20 74 68 61  for CARDURLs tha
e3f0: 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20  t coorespond to 
e400: 50 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09  PKI applets */..
e410: 66 6f 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20  for (ccc_curr = 
e420: 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72  ccc_tlv; ccc_cur
e430: 72 3b 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63  r; ccc_curr = cc
e440: 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  c_curr->_next) {
e450: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e460: 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61  PRINTF("Found ta
e470: 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43  g: %s ... ", CAC
e480: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54  KEY_DEBUG_FUNC_T
e490: 41 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  AG_TO_STR(ccc_cu
e4a0: 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 69 66  rr->tag));....if
e4b0: 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20   (ccc_curr->tag 
e4c0: 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  != GSCIS_TAG_CAR
e4d0: 44 55 52 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  DURL) {....CACKE
e4e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e4f0: 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
e500: 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
e510: 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22  about CARDURLs)"
e520: 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  );.....continue;
e530: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 63 63 63  ...}....if ((ccc
e540: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
e550: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20  durl->apptype & 
e560: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
e570: 4b 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c  KI) != CACKEY_TL
e580: 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09  V_APP_PKI) {....
e590: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e5a0: 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
e5b0: 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
e5c0: 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61  care about PKI a
e5d0: 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70  pplets, this app
e5e0: 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73  let supports: %s
e5f0: 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  /%02x)", CACKEY_
e600: 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59  DEBUG_FUNC_APPTY
e610: 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  PE_TO_STR(ccc_cu
e620: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
e630: 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e  l->apptype), (un
e640: 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f  signed int) ccc_
e650: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
e660: 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a  url->apptype);..
e670: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
e680: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
e690: 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22  _PRINTBUF("RID:"
e6a0: 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
e6b0: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
e6c0: 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d  sizeof(ccc_curr-
e6d0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
e6e0: 72 69 64 29 29 3b 0a 09 09 43 41 43 4b 45 59 5f  rid));...CACKEY_
e6f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 70  DEBUG_PRINTF("Ap
e700: 70 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c  pID = %s/%04lx",
e710: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
e720: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
e730: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
e740: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c  cardurl->appid),
e750: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
e760: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
e770: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29  _cardurl->appid)
e780: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
e790: 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74 49  _PRINTF("ObjectI
e7a0: 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43  D = %s/%04lx", C
e7b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
e7c0: 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63  _OBJID_TO_STR(cc
e7d0: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
e7e0: 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
e7f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e800: 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  ) ccc_curr->valu
e810: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
e820: 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28  tid);....memcpy(
e830: 63 75 72 72 5f 61 69 64 2c 20 63 63 63 5f 63 75  curr_aid, ccc_cu
e840: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
e850: 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63  l->rid, sizeof(c
e860: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
e870: 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09  ardurl->rid));..
e880: 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66  .curr_aid[sizeof
e890: 28 63 75 72 72 5f 61 69 64 29 20 2d 20 32 5d 20  (curr_aid) - 2] 
e8a0: 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  = (ccc_curr->val
e8b0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
e8c0: 64 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  d >> 8) & 0xff;.
e8d0: 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f  ..curr_aid[sizeo
e8e0: 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20 31 5d  f(curr_aid) - 1]
e8f0: 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   = ccc_curr->val
e900: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
e910: 64 20 26 20 30 78 66 66 3b 0a 0a 09 09 2f 2a 20  d & 0xff;..../* 
e920: 53 65 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70  Select found app
e930: 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 73 65 6c  let ... */...sel
e940: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
e950: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
e960: 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73  lot, curr_aid, s
e970: 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29  izeof(curr_aid))
e980: 3b 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72  ;...if (select_r
e990: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
e9a0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
e9b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e9c0: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65  ("Failed to sele
e9d0: 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70  ct applet, skipp
e9e0: 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
e9f0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
ea00: 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
ea10: 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64  .}..../* ... and
ea20: 20 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a   object (file) *
ea30: 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  /...select_ret =
ea40: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
ea50: 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75  ile(slot, ccc_cu
ea60: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
ea70: 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09  l->objectid);...
ea80: 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21  if (select_ret !
ea90: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
eaa0: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
eab0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
eac0: 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66  iled to select f
ead0: 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72  ile, skipping pr
eae0: 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73  ocessing of this
eaf0: 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63   object");.....c
eb00: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
eb10: 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 20  /* Process this 
eb20: 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69  file's TLV looki
eb30: 6e 67 20 66 6f 72 20 63 65 72 74 69 66 69 63 61  ng for certifica
eb40: 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f 74 6c 76  tes */...app_tlv
eb50: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74   = cackey_read_t
eb60: 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 66 6f 72  lv(slot);....for
eb70: 20 28 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70   (app_curr = app
eb80: 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72 72 3b 20  _tlv; app_curr; 
eb90: 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 63  app_curr = app_c
eba0: 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  urr->_next) {...
ebb0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ebc0: 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a  INTF("Found tag:
ebd0: 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
ebe0: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
ebf0: 54 52 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67  TR(app_curr->tag
ec00: 29 29 3b 0a 09 09 09 69 66 20 28 61 70 70 5f 63  ));....if (app_c
ec10: 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49  urr->tag != GSCI
ec20: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
ec30: 45 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  E) {.....CACKEY_
ec40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
ec50: 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20  ... skipping it 
ec60: 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62  (we only care ab
ec70: 6f 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73  out CERTIFICATEs
ec80: 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e  )");......contin
ec90: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72  ue;....}.....cur
eca0: 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75  r_id = &certs[ou
ecb0: 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78  tidx];....outidx
ecc0: 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63  ++;.....memcpy(c
ecd0: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
ece0: 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66  curr_aid, sizeof
ecf0: 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74  (curr_id->applet
ed00: 29 29 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  ));....curr_id->
ed10: 66 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 2d  file = ccc_curr-
ed20: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
ed30: 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09 63 75 72  objectid;....cur
ed40: 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20  r_id->keysize = 
ed50: 2d 31 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  -1;.....CACKEY_D
ed60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c  EBUG_PRINTF("Fil
ed70: 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 61 70  ling curr_id->ap
ed80: 70 6c 65 74 20 28 25 70 29 20 77 69 74 68 20 25  plet (%p) with %
ed90: 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72  lu bytes:", curr
eda0: 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 28 75 6e  _id->applet, (un
edb0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
edc0: 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
edd0: 6c 65 74 29 29 3b 0a 09 09 09 43 41 43 4b 45 59  let));....CACKEY
ede0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
edf0: 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d  "VAL:", curr_id-
ee00: 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28  >applet, sizeof(
ee10: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29  curr_id->applet)
ee20: 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  );.....curr_id->
ee30: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
ee40: 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67  = app_curr->leng
ee50: 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  th;.....curr_id-
ee60: 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  >certificate = m
ee70: 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63  alloc(curr_id->c
ee80: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
ee90: 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
eea0: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  id->certificate,
eeb0: 20 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65   app_curr->value
eec0: 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  , curr_id->certi
eed0: 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09  ficate_len);....
eee0: 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a  .if (outidx >= *
eef0: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 69 66 20  count) {.....if 
ef00: 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  (certs_resizable
ef10: 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75 6e 74 20  ) {......*count 
ef20: 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65 72 74 73  *= 2;......certs
ef30: 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73   = realloc(certs
ef40: 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  , sizeof(*certs)
ef50: 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09   * (*count));...
ef60: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
ef70: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09  break;.....}....
ef80: 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  }...}....cackey_
ef90: 66 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76  free_tlv(app_tlv
efa0: 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74 69 64 78  );....if (outidx
efb0: 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09   >= *count) {...
efc0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
efd0: 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
efe0: 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09 2a 63 6f  (ccc_tlv);...*co
eff0: 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09  unt = outidx;...
f000: 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
f010: 62 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ble) {...certs =
f020: 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20   realloc(certs, 
f030: 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
f040: 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a   (*count));..}..
f050: 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
f060: 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
f070: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
f080: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
f090: 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63  lot);...return(c
f0a0: 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  erts);.}../*. * 
f0b0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
f0c0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
f0d0: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
f0e0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
f0f0: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
f100: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
f110: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
f120: 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
f130: 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73 74 72  _signdecrypt(str
f140: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
f150: 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61  *slot, struct ca
f160: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
f170: 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
f180: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a  d char *buf, siz
f190: 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69  e_t buflen, unsi
f1a0: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75  gned char *outbu
f1b0: 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66  f, size_t outbuf
f1c0: 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75  len, int padInpu
f1d0: 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70  t, int unpadOutp
f1e0: 75 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  ut) {..unsigned 
f1f0: 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74  char *tmpbuf, *t
f200: 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66  mpbuf_s, *outbuf
f210: 5f 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  _s;..unsigned ch
f220: 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  ar bytes_to_send
f230: 2c 20 70 31 3b 0a 09 75 6e 73 69 67 6e 65 64 20  , p1;..unsigned 
f240: 63 68 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a  char blocktype;.
f250: 09 63 61 63 6b 65 79 5f 72 65 74 20 73 65 6e 64  .cackey_ret send
f260: 5f 72 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20  _ret;..uint16_t 
f270: 72 65 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65  respcode;..ssize
f280: 5f 74 20 72 65 74 76 61 6c 20 3d 20 30 2c 20 75  _t retval = 0, u
f290: 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a  npadoffset;..siz
f2a0: 65 5f 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70  e_t tmpbuflen, p
f2b0: 61 64 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66  adlen, tmpoutbuf
f2c0: 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74  len;..int free_t
f2d0: 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20  mpbuf = 0;..int 
f2e0: 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  le;...CACKEY_DEB
f2f0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
f300: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  d.");...if (slot
f310: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
f320: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f330: 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20  F("Error.  slot 
f340: 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
f350: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
f360: 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  f (buf == NULL) 
f370: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
f380: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
f390: 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a   buf is NULL");.
f3a0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
f3b0: 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d  }...if (outbuf =
f3c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
f3d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f3e0: 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20  "Error.  outbuf 
f3f0: 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
f400: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
f410: 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
f420: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
f430: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
f440: 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69  ror.  identity i
f450: 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
f460: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
f470: 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
f480: 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  _identity == NUL
f490: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
f4a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
f4b0: 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  r.  identity->pc
f4c0: 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e  sc_identity is N
f4d0: 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
f4e0: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  (-1);..}.../* De
f4f0: 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79  termine identity
f500: 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66   Key size */..if
f510: 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
f520: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
f530: 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e  ze < 0) {...iden
f540: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
f550: 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78  ity->keysize = x
f560: 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69  509_to_keysize(i
f570: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
f580: 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
f590: 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ate, identity->p
f5a0: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
f5b0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
f5c0: 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73  .}.../* Pad mess
f5d0: 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20  age to key size 
f5e0: 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74  */..if (padInput
f5f0: 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69  ) {...if (identi
f600: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
f610: 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20  y->keysize > 0) 
f620: 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  {....if (buflen 
f630: 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  != identity->pcs
f640: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
f650: 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62  ize) {.....if (b
f660: 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74  uflen > (identit
f670: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
f680: 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29 29 20  ->keysize + 3)) 
f690: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
f6a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
f6b0: 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74  r.  Message is t
f6c0: 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e  oo large to sign
f6d0: 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09  /decrypt");.....
f6e0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
f6f0: 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ..}......tmpbufl
f700: 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  en = identity->p
f710: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
f720: 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75  ysize;.....tmpbu
f730: 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
f740: 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f  flen);.....free_
f750: 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09  tmpbuf = 1;.....
f760: 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66  .padlen = tmpbuf
f770: 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33  len - buflen - 3
f780: 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b  ;....../* RSA PK
f790: 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d  CS#1 EMSA-PKCS1-
f7a0: 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a  v1_5 Padding */.
f7b0: 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20  ....tmpbuf[0] = 
f7c0: 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66  0x00;.....tmpbuf
f7d0: 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09  [1] = 0x01;.....
f7e0: 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32  memset(&tmpbuf[2
f7f0: 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29  ], 0xFF, padlen)
f800: 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64  ;.....tmpbuf[pad
f810: 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a  len + 2]= 0x00;.
f820: 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62  ....memcpy(&tmpb
f830: 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20  uf[padlen + 3], 
f840: 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09  buf, buflen);...
f850: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f860: 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64  PRINTBUF("Unpadd
f870: 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65  ed:", buf, bufle
f880: 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  n);.....CACKEY_D
f890: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
f8a0: 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c  added:", tmpbuf,
f8b0: 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09   tmpbuflen);....
f8c0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70  } else {.....tmp
f8d0: 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74  buf = buf;.....t
f8e0: 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65  mpbuflen = bufle
f8f0: 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62  n;.....free_tmpb
f900: 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c  uf = 0;.....padl
f910: 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  en = 0;....}...}
f920: 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
f930: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f940: 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  Unable to determ
f950: 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f  ine key size, ho
f960: 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65  ping the message
f970: 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64   is properly pad
f980: 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62  ded!");.....tmpb
f990: 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70  uf = buf;....tmp
f9a0: 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b  buflen = buflen;
f9b0: 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
f9c0: 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d  = 0;....padlen =
f9d0: 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20   0;...}..} else 
f9e0: 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  {...tmpbuf = buf
f9f0: 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ;...tmpbuflen = 
fa00: 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74  buflen;...free_t
fa10: 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64  mpbuf = 0;...pad
fa20: 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  len = 0;..}.../*
fa30: 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   Begin transacti
fa40: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
fa50: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
fa60: 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65  slot);.../* Sele
fa70: 63 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c 65  ct correct apple
fa80: 74 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42  t */..CACKEY_DEB
fa90: 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63  UG_PRINTF("Selec
faa0: 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 6e  ting applet foun
fab0: 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64  d at %p ...", id
fac0: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
fad0: 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 29 3b 0a  ntity->applet);.
fae0: 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61  .cackey_select_a
faf0: 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e  pplet(slot, iden
fb00: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
fb10: 69 74 79 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a  ity->applet, siz
fb20: 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  eof(identity->pc
fb30: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70  sc_identity->app
fb40: 6c 65 74 29 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65  let));.../* Sele
fb50: 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20  ct correct file 
fb60: 2a 2f 0a 09 63 61 63 6b 65 79 5f 73 65 6c 65 63  */..cackey_selec
fb70: 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65  t_file(slot, ide
fb80: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
fb90: 74 69 74 79 2d 3e 66 69 6c 65 29 3b 0a 0a 09 74  tity->file);...t
fba0: 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66  mpbuf_s = tmpbuf
fbb0: 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75  ;..outbuf_s = ou
fbc0: 74 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d  tbuf;..while (tm
fbd0: 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 69 66 20  pbuflen) {...if 
fbe0: 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 32 34 35  (tmpbuflen > 245
fbf0: 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f  ) {....bytes_to_
fc00: 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09 09 09 70  send = 245;....p
fc10: 31 20 3d 20 30 78 38 30 3b 0a 09 09 09 6c 65 20  1 = 0x80;....le 
fc20: 3d 20 30 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65  = 0x00;...} else
fc30: 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73   {....bytes_to_s
fc40: 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b  end = tmpbuflen;
fc50: 0a 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09  ....p1 = 0x00;..
fc60: 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 7d  ..le = 0x00;...}
fc70: 0a 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e  ....tmpoutbuflen
fc80: 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09   = outbuflen;...
fc90: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
fca0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
fcb0: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
fcc0: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
fcd0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e  GSCIS_INSTR_SIGN
fce0: 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30  DECRYPT, p1, 0x0
fcf0: 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  0, bytes_to_send
fd00: 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72  , tmpbuf, le, &r
fd10: 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c  espcode, outbuf,
fd20: 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b   &tmpoutbuflen);
fd30: 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
fd40: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
fd50: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
fd60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
fd70: 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c  DPU Sending Fail
fd80: 65 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20  ed -- returning 
fd90: 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09  in error.");....
fda0: 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66  .if (free_tmpbuf
fdb0: 29 20 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62  ) {.....if (tmpb
fdc0: 75 66 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65  uf_s) {......fre
fdd0: 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09  e(tmpbuf_s);....
fde0: 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45  .}....}...../* E
fdf0: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nd transaction *
fe00: 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  /....cackey_end_
fe10: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
fe20: 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 73 70 63  );.....if (respc
fe30: 6f 64 65 20 3d 3d 20 30 78 36 39 38 32 29 20 7b  ode == 0x6982) {
fe40: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
fe50: 47 5f 50 52 49 4e 54 46 28 22 53 65 63 75 72 69  G_PRINTF("Securi
fe60: 74 79 20 73 74 61 74 75 73 20 6e 6f 74 20 73 61  ty status not sa
fe70: 74 69 73 69 66 69 65 64 2e 20 20 52 65 74 75 72  tisified.  Retur
fe80: 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22 29  ning NEEDLOGIN")
fe90: 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61  ;......cackey_ma
fea0: 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
feb0: 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  ot);......return
fec0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  (CACKEY_PCSC_E_N
fed0: 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a  EEDLOGIN);....}.
fee0: 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
fef0: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
ff00: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b  E_TOKENABSENT) {
ff10: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
ff20: 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20  G_PRINTF("Token 
ff30: 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  absent.  Returni
ff40: 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29  ng TOKENABSENT")
ff50: 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61  ;......cackey_ma
ff60: 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
ff70: 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  ot);......return
ff80: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
ff90: 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09  OKENABSENT);....
ffa0: 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  }.....return(-1)
ffb0: 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66 20  ;...}....tmpbuf 
ffc0: 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  += bytes_to_send
ffd0: 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d 3d  ;...tmpbuflen -=
ffe0: 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a   bytes_to_send;.
fff0: 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d 70  ...outbuf += tmp
10000 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75 74  outbuflen;...out
10010 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75 74  buflen -= tmpout
10020 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61 6c  buflen;...retval
10030 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e   += tmpoutbuflen
10040 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f  ;..}...if (free_
10050 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20 28  tmpbuf) {...if (
10060 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 66  tmpbuf_s) {....f
10070 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09  ree(tmpbuf_s);..
10080 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20 3d  .}..}...outbuf =
10090 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20   outbuf_s;.../* 
100a0 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  End transaction 
100b0 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
100c0 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
100d0 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  ;..#ifdef CACKEY
100e0 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
100f0 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
10100 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66 6c  MAX..if (outbufl
10110 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  en > _POSIX_SSIZ
10120 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
10130 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10140 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65 64  Outbuflen exceed
10150 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c  s maximum value,
10160 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
10170 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c  ilure. (max = %l
10180 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25  i, outbuflen = %
10190 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
101a0 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
101b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
101c0 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65  utbuflen);....re
101d0 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
101e0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 2f  endif.#endif.../
101f0 2a 20 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f  * Unpad reply */
10200 0a 09 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75  ..if (unpadOutpu
10210 74 29 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61  t) {...if (retva
10220 6c 20 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b  l < 3) {....CACK
10230 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10240 22 52 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d  "Reply is too sm
10250 61 6c 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20  all, we are not 
10260 61 62 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d  able to unpad --
10270 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e   passing back an
10280 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65  d hoping for the
10290 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41   best!");.....CA
102a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
102b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
102c0 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20  success, retval 
102d0 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20  = %li (bytes)", 
102e0 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a  (long) retval);.
102f0 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
10300 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75  );...}....if (ou
10310 74 62 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29  tbuf[0] != 0x00)
10320 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
10330 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63  UG_PRINTF("Unrec
10340 6f 67 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20  ognized padding 
10350 73 63 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e  scheme -- passin
10360 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e  g back and hopin
10370 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22  g for the best!"
10380 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
10390 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
103a0 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
103b0 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28  , retval = %li (
103c0 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20  bytes)", (long) 
103d0 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75  retval);....retu
103e0 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a  rn(retval);...}.
103f0 0a 09 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f  ...blocktype = o
10400 75 74 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61  utbuf[1];...unpa
10410 64 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09  doffset = 0;....
10420 73 77 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70  switch (blocktyp
10430 65 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30  e) {....case 0x0
10440 30 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e  0:...../* Paddin
10450 67 20 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20  g Scheme 1, the 
10460 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62  first non-zero b
10470 79 74 65 20 69 73 20 74 68 65 20 73 74 61 72 74  yte is the start
10480 20 6f 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09   of data */.....
10490 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74  for (unpadoffset
104a0 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65   = 2; unpadoffse
104b0 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61  t < retval; unpa
104c0 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09  doffset++) {....
104d0 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70  ..if (outbuf[unp
104e0 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30  adoffset] != 0x0
104f0 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  0) {.......break
10500 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
10510 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
10520 65 20 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50  e 0x01:...../* P
10530 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c  adding Scheme 2,
10540 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20 30   pad bytes are 0
10550 78 46 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  xFF followed by 
10560 30 78 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20  0x00 */.....for 
10570 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32  (unpadoffset = 2
10580 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20  ; unpadoffset < 
10590 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66  retval; unpadoff
105a0 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66  set++) {......if
105b0 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66   (outbuf[unpadof
105c0 66 73 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b  fset] != 0xFF) {
105d0 0a 09 09 09 09 09 09 69 66 20 28 6f 75 74 62 75  .......if (outbu
105e0 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d  f[unpadoffset] =
105f0 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09  = 0x00) {.......
10600 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a  .unpadoffset++;.
10610 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
10620 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
10630 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10640 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
10650 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66  d padding data f
10660 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  ound, returning 
10670 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75  in failure, shou
10680 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 30  ld have been 0x0
10690 30 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c  0 found 0x%02x",
106a0 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
106b0 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
106c0 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65  et]);.........re
106d0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09  turn(-1);.......
106e0 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  }......} else {.
106f0 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
10700 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
10710 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20  id padding data 
10720 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67  found, returning
10730 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f   in failure, sho
10740 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78  uld have been 0x
10750 46 46 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22  FF found 0x%02x"
10760 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
10770 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66   outbuf[unpadoff
10780 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65  set]);........re
10790 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d  turn(-1);......}
107a0 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
107b0 3b 0a 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a  ;....case 0x02:.
107c0 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53  ..../* Padding S
107d0 63 68 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74  cheme 3, pad byt
107e0 65 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20  es are non-zero 
107f0 66 69 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20  first zero byte 
10800 66 6f 75 6e 64 20 69 73 20 74 68 65 20 73 65 70  found is the sep
10810 65 72 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09  erator byte */..
10820 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66  ...for (unpadoff
10830 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66  set = 2; unpadof
10840 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75  fset < retval; u
10850 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a  npadoffset++) {.
10860 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
10870 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20  unpadoffset] == 
10880 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e  0x00) {.......un
10890 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09  padoffset++;....
108a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
108b0 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  }.....}.....brea
108c0 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e  k;...}....if (un
108d0 70 61 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76  padoffset > retv
108e0 61 6c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  al) {....CACKEY_
108f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66  DEBUG_PRINTF("Of
10900 66 73 65 74 20 67 72 65 61 74 65 72 20 74 68 61  fset greater tha
10910 6e 20 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62  n reply size, ab
10920 6f 72 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f  orting.  (unpado
10930 66 66 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74  ffset = %lu, ret
10940 76 61 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e  val = %lu)", (un
10950 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70  signed long) unp
10960 61 64 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67  adoffset, (unsig
10970 6e 65 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c  ned long) retval
10980 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
10990 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
109a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
109b0 22 50 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75  "Padded:", outbu
109c0 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72  f, retval);....r
109d0 65 74 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66  etval -= unpadof
109e0 66 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28  fset;...memmove(
109f0 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b  outbuf, outbuf +
10a00 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65   unpadoffset, re
10a10 74 76 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59  tval);....CACKEY
10a20 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
10a30 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74  "Unpadded:", out
10a40 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d  buf, retval);..}
10a50 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10a60 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
10a70 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72  ng in success, r
10a80 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74  etval = %li (byt
10a90 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74  es)", (long) ret
10aa0 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
10ab0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  etval);.}../*. *
10ac0 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
10ad0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
10ae0 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
10af0 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
10b00 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
10b10 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
10b20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
10b30 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
10b40 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63  ckey_login(struc
10b50 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
10b60 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
10b70 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65  ar *pin, unsigne
10b80 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20  d long pin_len, 
10b90 69 6e 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69  int *tries_remai
10ba0 6e 69 6e 67 5f 70 29 20 7b 0a 09 75 6e 73 69 67  ning_p) {..unsig
10bb0 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e  ned char cac_pin
10bc0 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46  [8] = {0xFF, 0xF
10bd0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
10be0 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
10bf0 20 30 78 46 46 7d 3b 0a 09 75 69 6e 74 31 36 5f   0xFF};..uint16_
10c00 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b  t response_code;
10c10 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61  ..int tries_rema
10c20 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64  ining;..int send
10c30 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63  _ret;.../* Indic
10c40 61 74 65 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ate that we do n
10c50 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68 6f  ot know about ho
10c60 77 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72 65  w many tries are
10c70 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 69   remaining */..i
10c80 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  f (tries_remaini
10c90 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65 73  ng_p) {...*tries
10ca0 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 2d  _remaining_p = -
10cb0 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 72  1;..}.../* Appar
10cc0 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73 20  ently, CAC PINs 
10cd0 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38 20  are *EXACTLY* 8 
10ce0 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61  bytes long -- pa
10cf0 64 20 77 69 74 68 20 30 78 46 46 20 69 66 20 74  d with 0xFF if t
10d00 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20  oo short */..if 
10d10 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b  (pin_len >= 8) {
10d20 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69  ...memcpy(cac_pi
10d30 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65  n, pin, 8);..} e
10d40 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63  lse {...memcpy(c
10d50 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e  ac_pin, pin, pin
10d60 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49  _len);..}.../* I
10d70 73 73 75 65 20 50 49 4e 20 56 65 72 69 66 79 20  ssue PIN Verify 
10d80 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  */..send_ret = c
10d90 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
10da0 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
10db0 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
10dc0 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30  _INSTR_VERIFY, 0
10dd0 78 30 30 2c 20 30 78 30 30 2c 20 73 69 7a 65 6f  x00, 0x00, sizeo
10de0 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f  f(cac_pin), cac_
10df0 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70  pin, 0x00, &resp
10e00 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c  onse_code, NULL,
10e10 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e   NULL);..if (sen
10e20 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
10e30 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69  PCSC_S_OK) {...i
10e40 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  f ((response_cod
10e50 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30  e & 0x63C0) == 0
10e60 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65  x63C0) {....trie
10e70 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72  s_remaining = (r
10e80 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30  esponse_code & 0
10e90 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  xF);.....CACKEY_
10ea0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
10eb0 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
10ec0 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20  ailed, %i tries 
10ed0 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65  remaining", trie
10ee0 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09  s_remaining);...
10ef0 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61  ..if (tries_rema
10f00 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a  ining_p) {.....*
10f10 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
10f20 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  p = tries_remain
10f30 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  ing;....}.....re
10f40 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
10f50 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a  _E_BADPIN);...}.
10f60 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f  ...if (response_
10f70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20  code == 0x6983) 
10f80 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
10f90 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
10fa0 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65  rification faile
10fb0 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63  d, device is loc
10fc0 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ked");.....retur
10fd0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
10fe0 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09  LOCKED);...}....
10ff0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
11000 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
11010 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
11020 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72  _PRINTF("PIN Ver
11030 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65  ification succee
11040 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ded");...return(
11050 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
11060 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
11070 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
11080 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
11090 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
110a0 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
110b0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
110c0 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
110d0 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
110e0 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
110f0 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74  token_present(st
11100 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
11110 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65   *slot) {..cacke
11120 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65  y_ret pcsc_conne
11130 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72  ct_ret;..DWORD r
11140 65 61 64 65 72 5f 6c 65 6e 2c 20 73 74 61 74 65  eader_len, state
11150 2c 20 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 5f  , protocol, atr_
11160 6c 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d  len;..BYTE atr[M
11170 41 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c  AX_ATR_SIZE];..L
11180 4f 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20  ONG status_ret, 
11190 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
111a0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
111b0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
111c0 22 29 3b 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  ");...pcsc_conne
111d0 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
111e0 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
111f0 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  t);..if (pcsc_co
11200 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
11210 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
11220 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11230 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
11240 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
11250 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  d, returning tok
11260 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
11270 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
11280 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
11290 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c 65 6e 20  );..}...atr_len 
112a0 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09  = sizeof(atr);..
112b0 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61  status_ret = SCa
112c0 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70  rdStatus(slot->p
112d0 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20  csc_card, NULL, 
112e0 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74  &reader_len, &st
112f0 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20  ate, &protocol, 
11300 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a  atr, &atr_len);.
11310 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74  ..if (status_ret
11320 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e 56 41   == SCARD_E_INVA
11330 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09  LID_HANDLE) {...
11340 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11350 4e 54 46 28 22 53 43 61 72 64 53 74 61 74 75 73  NTF("SCardStatus
11360 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
11370 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44  D_E_INVALID_HAND
11380 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 69 73 20 6e  LE, marking is n
11390 6f 74 20 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65  ot already conne
113a0 63 74 65 64 20 61 6e 64 20 74 72 79 69 6e 67 20  cted and trying 
113b0 61 67 61 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65  again");...cacke
113c0 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
113d0 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63  t(slot);....pcsc
113e0 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
113f0 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
11400 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28  rd(slot);...if (
11410 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
11420 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
11430 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
11440 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11450 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
11460 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
11470 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
11480 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t");.....return(
11490 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
114a0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a  KENABSENT);...}.
114b0 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a  ...atr_len = siz
114c0 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74  eof(atr);...stat
114d0 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
114e0 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
114f0 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
11500 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
11510 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
11520 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a   &atr_len);..}..
11530 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
11540 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
11550 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  SS) {...cackey_m
11560 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
11570 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61  lot);....if (sta
11580 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  tus_ret == SCARD
11590 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b  _W_RESET_CARD) {
115a0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
115b0 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72  _PRINTF("Reset r
115c0 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20  equired, please 
115d0 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  hold...");.....s
115e0 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
115f0 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  = cackey_reconne
11600 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43  ct_card(slot, SC
11610 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
11620 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
11630 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  _T1, &protocol);
11640 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65  ....if (scard_re
11650 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
11660 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
11670 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f  .../* Update pro
11680 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f  tocol */.....slo
11690 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72  t->protocol = pr
116a0 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20  otocol;....../* 
116b0 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
116c0 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
116d0 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
116e0 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
116f0 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
11700 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
11710 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
11720 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  th--;......slot-
11730 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
11740 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09  d_hw_lock = 1;..
11750 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  ....cackey_begin
11760 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
11770 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  t);.....}......C
11780 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11790 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73  TF("Reset succes
117a0 73 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67  sful, requerying
117b0 22 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72  ");.....status_r
117c0 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
117d0 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
117e0 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
117f0 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
11800 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
11810 72 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28  r_len);.....if (
11820 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43  status_ret != SC
11830 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
11840 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
11850 55 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c  UG_PRINTF("Still
11860 20 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79   unable to query
11870 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65   card status, re
11880 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
11890 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74  sent.  SCardStat
118a0 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b  us() = %s", CACK
118b0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
118c0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74  ARDERR_TO_STR(st
118d0 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09  atus_ret));.....
118e0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
118f0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
11900 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  NT);.....}....} 
11910 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
11920 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11930 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e  Unable to reconn
11940 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
11950 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
11960 65 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e  ent.  SCardRecon
11970 6e 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41  nect() = %s", CA
11980 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
11990 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
119a0 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
119b0 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ));......return(
119c0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
119d0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d  KENABSENT);....}
119e0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
119f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11a00 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75  TF("Unable to qu
11a10 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c  ery card status,
11a20 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
11a30 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53   absent.  SCardS
11a40 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43  tatus() = %s", C
11a50 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
11a60 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
11a70 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a  (status_ret));..
11a80 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
11a90 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
11aa0 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ENT);...}..}...i
11ab0 66 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52  f ((state & SCAR
11ac0 44 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41  D_ABSENT) == SCA
11ad0 52 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43  RD_ABSENT) {...C
11ae0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11af0 54 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65  TF("Card is abse
11b00 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  nt, returning to
11b10 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09  ken absent");...
11b20 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
11b30 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
11b40 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  T);..}...CACKEY_
11b50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
11b60 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72  turning token pr
11b70 65 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75  esent.");...retu
11b80 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
11b90 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a  _TOKENPRESENT);.
11ba0 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
11bb0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
11bc0 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
11bd0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
11be0 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
11bf0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
11c00 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
11c10 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
11c20 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  _t cackey_pcsc_i
11c30 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c  dentity_to_label
11c40 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
11c50 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  csc_identity *id
11c60 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
11c70 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66   char *label_buf
11c80 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
11c90 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b  label_buf_len) {
11ca0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
11cb0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
11cc0 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73  ..void *label_as
11cd0 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69  n1;..void *certi
11ce0 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30  ficate;..int x50
11cf0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65  9_read_ret;...ce
11d00 72 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e  rtificate = iden
11d10 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
11d20 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f  e;..certificate_
11d30 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  len = identity->
11d40 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
11d50 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
11d60 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  te_len < 0) {...
11d70 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
11d80 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
11d90 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
11da0 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
11db0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28  rtificate_len, (
11dc0 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f  void **) &label_
11dd0 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39  asn1);..if (x509
11de0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
11df0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11e00 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65  }...x509_read_re
11e10 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73  t = x509_dn_to_s
11e20 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31  tring(label_asn1
11e30 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c  , x509_read_ret,
11e40 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f   (char *) label_
11e50 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  buf, label_buf_l
11e60 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28  en, "CN");..if (
11e70 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d  x509_read_ret <=
11e80 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61   0) {...x509_rea
11e90 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f  d_ret = x509_dn_
11ea0 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f  to_string(label_
11eb0 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  asn1, x509_read_
11ec0 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61  ret, (char *) la
11ed0 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62  bel_buf, label_b
11ee0 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a  uf_len, NULL);..
11ef0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
11f00 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72  ret <= 0) {....r
11f10 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
11f20 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
11f30 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
11f40 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
11f50 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65  MAX..if (x509_re
11f60 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f  ad_ret > _POSIX_
11f70 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
11f80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11f90 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65  TF("x509_read_re
11fa0 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75  t exceeds maximu
11fb0 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69  m value, returni
11fc0 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28  ng in failure. (
11fd0 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f  max = %li, x509_
11fe0 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22  read_ret = %lu)"
11ff0 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
12000 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
12010 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f  gned long) x509_
12020 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65  read_ret);....re
12030 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
12040 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72  endif.#endif...r
12050 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f  eturn(x509_read_
12060 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  ret);.}../* Retu
12070 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
12080 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
12090 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61  ackey_mutex_crea
120a0 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29  te(void **mutex)
120b0 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
120c0 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
120d0 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
120e0 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
120f0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
12100 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12110 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
12120 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
12130 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
12140 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
12150 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
12160 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
12170 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28  _mutex = malloc(
12180 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f  sizeof(*pthread_
12190 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21  mutex));...if (!
121a0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b  pthread_mutex) {
121b0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
121c0 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
121d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
121e0 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ry.");.....retur
121f0 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74  n(-1);...}....pt
12200 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
12210 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
12220 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c  t(pthread_mutex,
12230 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74   NULL);...if (pt
12240 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
12250 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
12260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
12270 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28  read_mutex_init(
12280 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
12290 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
122a0 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
122b0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
122c0 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61  .*mutex = pthrea
122d0 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65  d_mutex;..} else
122e0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
122f0 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
12300 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
12310 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
12320 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d  gs.CreateMutex(m
12330 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
12340 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
12350 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
12360 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12370 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43  F("cackey_args.C
12380 72 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74  reateMutex() ret
12390 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69  urned error (%li
123a0 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74  ).", (long) cust
123b0 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  om_retval);.....
123c0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
123d0 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  }...}..}...CACKE
123e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
123f0 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73  Returning sucess
12400 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72  fully (0)");...r
12410 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
12420 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
12430 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
12440 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
12450 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78  lock(void *mutex
12460 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
12470 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
12480 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
12490 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
124a0 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
124b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
124c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
124d0 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
124e0 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
124f0 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
12500 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
12510 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
12520 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b  d_mutex = mutex;
12530 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
12540 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
12550 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f  ex_lock(pthread_
12560 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74  mutex);...if (pt
12570 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
12580 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
12590 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
125a0 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
125b0 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
125c0 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
125d0 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
125e0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
125f0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
12600 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
12610 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
12620 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
12630 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28  _args.LockMutex(
12640 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
12650 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
12660 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
12670 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12680 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
12690 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75  LockMutex() retu
126a0 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
126b0 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
126c0 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
126d0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
126e0 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
126f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
12700 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
12710 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
12720 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
12730 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
12740 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
12750 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  t cackey_mutex_u
12760 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65  nlock(void *mute
12770 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  x) {..pthread_mu
12780 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d  tex_t *pthread_m
12790 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65  utex;..int pthre
127a0 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ad_retval;..CK_R
127b0 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b  V custom_retval;
127c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
127d0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
127e0 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79  );...if ((cackey
127f0 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b  _args.flags & CK
12800 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
12810 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49   == CKF_OS_LOCKI
12820 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65  NG_OK) {...pthre
12830 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78  ad_mutex = mutex
12840 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  ;....pthread_ret
12850 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
12860 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65  tex_unlock(pthre
12870 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20  ad_mutex);...if 
12880 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  (pthread_retval 
12890 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
128a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
128b0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
128c0 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20  lock() returned 
128d0 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
128e0 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
128f0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
12900 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
12910 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  f (cackey_args.U
12920 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09  nlockMutex) {...
12930 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d  .custom_retval =
12940 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c   cackey_args.Unl
12950 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ockMutex(mutex);
12960 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
12970 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
12980 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
12990 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
129a0 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
129b0 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20  utex() returned 
129c0 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28  error (%li).", (
129d0 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74  long) custom_ret
129e0 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  val);......retur
129f0 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  n(-1);....}...}.
12a00 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
12a10 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
12a20 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20  ing sucessfully 
12a30 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  (0)");...return(
12a40 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b  0);.}..static CK
12a50 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63  _ATTRIBUTE_PTR c
12a60 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
12a70 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  utes(CK_OBJECT_C
12a80 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73  LASS objectclass
12a90 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  , struct cackey_
12aa0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69  pcsc_identity *i
12ab0 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
12ac0 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f  d long identity_
12ad0 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  num, CK_ULONG_PT
12ae0 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73  R pulCount) {..s
12af0 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63  tatic CK_BBOOL c
12b00 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61  k_true = 1;..sta
12b10 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f  tic CK_BBOOL ck_
12b20 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74  false = 0;..stat
12b30 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74  ic CK_TRUST ck_t
12b40 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53  rusted = CK_TRUS
12b50 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09  TED_DELEGATOR;..
12b60 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72  CK_ULONG numattr
12b70 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f  s = 0, retval_co
12b80 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  unt;..CK_ATTRIBU
12b90 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74  TE_TYPE curr_att
12ba0 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52  r_type;..CK_ATTR
12bb0 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c  IBUTE curr_attr,
12bc0 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f   *retval;..CK_VO
12bd0 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
12be0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
12bf0 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f  Len;..CK_OBJECT_
12c00 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f  CLASS ck_object_
12c10 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49  class;..CK_CERTI
12c20 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63  FICATE_TYPE ck_c
12c30 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
12c40 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b  ..CK_KEY_TYPE ck
12c50 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55  _key_type;..CK_U
12c60 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66  TF8CHAR ucTmpBuf
12c70 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e  [1024];..SHA1Con
12c80 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09  text sha1_ctx;..
12c90 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b  MD5_CTX md5_ctx;
12ca0 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68  ..uint8_t sha1_h
12cb0 61 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65  ash[SHA1HashSize
12cc0 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f  ];..uint8_t md5_
12cd0 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65  hash[MD5HashSize
12ce0 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ];..unsigned cha
12cf0 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a  r *certificate;.
12d00 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69  .ssize_t certifi
12d10 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78  cate_len = -1, x
12d20 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69  509_read_ret;..i
12d30 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a  nt pValue_free;.
12d40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12d50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f  RINTF("Called (o
12d60 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75  bjectClass = %lu
12d70 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d  , identity_num =
12d80 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
12d90 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63  ed long) objectc
12da0 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e  lass, identity_n
12db0 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  um);...*pulCount
12dc0 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65   = 0;...if (obje
12dd0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
12de0 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62  ERTIFICATE && ob
12df0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
12e00 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f  _PUBLIC_KEY && o
12e10 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
12e20 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26  O_PRIVATE_KEY &&
12e30 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
12e40 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
12e50 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ST) {...CACKEY_D
12e60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
12e70 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
12e80 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
12e90 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b   object class");
12ea0 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
12eb0 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65  ;..}.../* Get Ce
12ec0 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74  rt */..if (ident
12ed0 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
12ee0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12ef0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
12f00 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
12f10 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69  , invalid identi
12f20 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09  y provided");...
12f30 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
12f40 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20  }...certificate 
12f50 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
12f60 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66  ificate;..certif
12f70 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e  icate_len = iden
12f80 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
12f90 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72  e_len;...if (cer
12fa0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20  tificate_len == 
12fb0 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74  -1 || certificat
12fc0 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
12fd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12fe0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
12ff0 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
13000 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f  this identity do
13010 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58  es not have an X
13020 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
13030 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13040 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74   it and will not
13050 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75   work");....retu
13060 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
13070 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65  * Verify that ce
13080 72 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e  rtificate is ASN
13090 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39  .1 encoded X.509
130a0 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
130b0 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72  .if (x509_to_ser
130c0 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c  ial(certificate,
130d0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
130e0 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09  , NULL) < 0) {..
130f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13100 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
13110 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
13120 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74  , the X.509 cert
13130 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
13140 65 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65  ed with this ide
13150 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c  ntity is not val
13160 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  id");....return(
13170 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76  NULL);..}...retv
13180 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09  al_count = 64;..
13190 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28  retval = malloc(
131a0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
131b0 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
131c0 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
131d0 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72  r_type = 0; curr
131e0 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63  _attr_type < 0xc
131f0 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74  e5363bf; curr_at
13200 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69  tr_type++) {...i
13210 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  f (curr_attr_typ
13220 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09  e == 0x800) {...
13230 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  .curr_attr_type 
13240 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09  = 0xce536300;...
13250 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65  }....pValue_free
13260 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d   = 0;...pValue =
13270 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65   NULL;...ulValue
13280 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
13290 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  -1;....switch (c
132a0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b  urr_attr_type) {
132b0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  ....case CKA_CLA
132c0 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SS:.....CACKEY_D
132d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
132e0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
132f0 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25  e CKA_CLASS (0x%
13300 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
13310 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
13320 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
13330 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  ..ck_object_clas
13340 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b  s = objectclass;
13350 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
13360 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b  ck_object_class;
13370 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
13380 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65  = sizeof(ck_obje
13390 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09  ct_class);......
133a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
133b0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
133c0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
133d0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
133e0 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f  g) *((CK_OBJECT_
133f0 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29  CLASS *) pValue)
13400 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
13410 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
13420 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13430 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
13440 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  OKEN:.....CACKEY
13450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13460 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
13470 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30  ute CKA_TOKEN (0
13480 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13490 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
134a0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
134b0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
134c0 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _true;.....ulVal
134d0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
134e0 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41  k_true);......CA
134f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13500 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
13510 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
13520 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13530 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
13540 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
13550 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13560 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
13570 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
13580 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09  e CKA_PRIVATE:..
13590 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
135a0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
135b0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
135c0 5f 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c  _PRIVATE (0x%08l
135d0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
135e0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
135f0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
13600 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
13610 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
13620 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
13630 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13640 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
13650 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
13660 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e  e we are not a N
13670 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
13680 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
13690 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
136a0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
136b0 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
136c0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
136d0 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
136e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
136f0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
13700 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
13710 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
13720 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
13730 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
13740 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
13750 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
13760 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
13770 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09  CKA_TRUSTED:....
13780 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13790 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
137a0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
137b0 52 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29  RUSTED (0x%08lx)
137c0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
137d0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
137e0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
137f0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
13800 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
13810 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
13820 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13830 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
13840 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
13850 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
13860 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
13870 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
13880 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65  ...}......pValue
13890 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
138a0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
138b0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
138c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
138d0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
138e0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
138f0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
13900 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
13910 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
13920 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
13930 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
13940 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
13950 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49  ...case CKA_MODI
13960 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b  FIABLE:.....CACK
13970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13980 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
13990 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49  ibute CKA_MODIFI
139a0 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ABLE (0x%08lx) .
139b0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
139c0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
139d0 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
139e0 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
139f0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
13a00 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
13a10 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
13a20 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
13a30 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
13a40 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
13a50 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
13a60 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
13a70 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
13a80 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
13a90 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13aa0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c  k;....case CKA_L
13ab0 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABEL:.....CACKEY
13ac0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13ad0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
13ae0 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30  ute CKA_LABEL (0
13af0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13b00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
13b10 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
13b20 09 09 09 09 2f 2a 20 58 58 58 3a 20 44 65 74 65  ..../* XXX: Dete
13b30 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09  rmine name */...
13b40 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
13b50 6e 70 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29  nprintf((char *)
13b60 20 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f   ucTmpBuf, sizeo
13b70 66 28 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64  f(ucTmpBuf), "Id
13b80 65 6e 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75  entity #%lu", (u
13b90 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
13ba0 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09  entity_num);....
13bb0 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42  .pValue = ucTmpB
13bc0 75 66 3b 0a 0a 09 09 09 09 69 66 20 28 75 6c 56  uf;......if (ulV
13bd0 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f  alueLen >= sizeo
13be0 66 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09  f(ucTmpBuf)) {..
13bf0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
13c00 20 30 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20   0;......pValue 
13c10 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09  = NULL;.....}...
13c20 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13c30 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
13c40 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22  urning (%p/%lu)"
13c50 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
13c60 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
13c70 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13c80 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56  k;....case CKA_V
13c90 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ALUE:.....CACKEY
13ca0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13cb0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
13cc0 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30  ute CKA_VALUE (0
13cd0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13ce0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
13cf0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
13d00 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65  ....switch (obje
13d10 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09  ctclass) {......
13d20 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45  case CKO_PRIVATE
13d30 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b  _KEY:.......CACK
13d40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13d50 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
13d60 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
13d70 20 77 65 20 61 72 65 20 61 20 70 72 69 76 61 74   we are a privat
13d80 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09  e key.");.......
13d90 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
13da0 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  e CKO_NETSCAPE_T
13db0 52 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b  RUST:.......CACK
13dc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13dd0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
13de0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
13df0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
13e00 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
13e10 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  );........break;
13e20 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50  ......case CKO_P
13e30 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09  UBLIC_KEY:......
13e40 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
13e50 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
13e60 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
13e70 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b  t = x509_to_pubk
13e80 65 79 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  ey(certificate, 
13e90 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
13ea0 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
13eb0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
13ec0 72 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 09  ret < 0) { .....
13ed0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
13ee0 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65  L;........} else
13ef0 20 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61 6c   {.........ulVal
13f00 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
13f10 64 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a  d_ret;........}.
13f20 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 62  ......}........b
13f30 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
13f40 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a  CKO_CERTIFICATE:
13f50 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
13f60 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09  certificate;....
13f70 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
13f80 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
13f90 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
13fa0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
13fb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
13fc0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
13fd0 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
13fe0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
13ff0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
14000 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14010 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09  CKA_ISSUER:.....
14020 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14030 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
14040 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53  attribute CKA_IS
14050 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e  SUER (0x%08lx) .
14060 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
14070 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
14080 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
14090 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
140a0 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26  O_CERTIFICATE &&
140b0 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
140c0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
140d0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
140e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
140f0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
14100 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
14110 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
14120 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73  tificate or Nets
14130 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
14140 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
14150 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
14160 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
14170 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
14180 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
14190 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72  09_to_issuer(cer
141a0 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
141b0 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
141c0 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
141d0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
141e0 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
141f0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
14200 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
14210 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
14220 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
14230 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
14240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
14250 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
14260 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
14270 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
14280 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
14290 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
142a0 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45  CKA_SERIAL_NUMBE
142b0 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
142c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
142d0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
142e0 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
142f0 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ER (0x%08lx) ...
14300 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
14310 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
14320 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
14330 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
14340 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f  CERTIFICATE && o
14350 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
14360 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
14370 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
14380 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
14390 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
143a0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
143b0 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
143c0 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61  ficate or Netsca
143d0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
143e0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
143f0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
14400 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
14410 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
14420 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
14430 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69  _to_serial(certi
14440 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
14450 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
14460 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
14470 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
14480 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
14490 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
144a0 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
144b0 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
144c0 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
144d0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
144e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
144f0 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
14500 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
14510 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
14520 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
14530 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14540 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09  CKA_SUBJECT:....
14550 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14560 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
14570 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
14580 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29  UBJECT (0x%08lx)
14590 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
145a0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
145b0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
145c0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
145d0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29  CKO_CERTIFICATE)
145e0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
145f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
14600 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
14610 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
14620 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
14630 69 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 62  icate");.......b
14640 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
14650 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
14660 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
14670 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
14680 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63  = x509_to_subjec
14690 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  t(certificate, c
146a0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
146b0 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
146c0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
146d0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
146e0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
146f0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
14700 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
14710 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
14720 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
14730 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14740 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
14750 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
14760 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
14770 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
14780 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
14790 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09  case CKA_ID:....
147a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
147b0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
147c0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49   attribute CKA_I
147d0 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  D (0x%08lx) ..."
147e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
147f0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
14800 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
14810 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
14820 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
14830 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14840 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
14850 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
14860 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
14870 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
14880 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
14890 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
148a0 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d  .....ucTmpBuf[0]
148b0 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75   = ((identity_nu
148c0 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30  m + 1) >> 8) & 0
148d0 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75  xff;.....ucTmpBu
148e0 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74  f[1] =  (identit
148f0 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66  y_num + 1) & 0xf
14900 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  f;......pValue =
14910 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09   &ucTmpBuf;.....
14920 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a  ulValueLen = 2;.
14930 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14940 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
14950 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
14960 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
14970 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
14980 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
14990 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43  k;....case CKA_C
149a0 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
149b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
149c0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
149d0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
149e0 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  KA_CERTIFICATE_T
149f0 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPE (0x%08lx) ..
14a00 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
14a10 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
14a20 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
14a30 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
14a40 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
14a50 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14a60 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
14a70 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
14a80 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
14a90 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
14aa0 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  te.");.......bre
14ab0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
14ac0 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
14ad0 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74  t one certificat
14ae0 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b  e type */.....ck
14af0 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
14b00 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a  e = CKC_X_509;..
14b10 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
14b20 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
14b30 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
14b40 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65  n = sizeof(ck_ce
14b50 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b  rtificate_type);
14b60 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14b70 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
14b80 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f  returning CKC_X_
14b90 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c  509 (%lu) (%p/%l
14ba0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
14bb0 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49  ong) *((CK_CERTI
14bc0 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70  FICATE_TYPE *) p
14bd0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
14be0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14bf0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
14c00 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
14c10 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09   CKA_KEY_TYPE:..
14c20 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14c30 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
14c40 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
14c50 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 38  _KEY_TYPE (0x%08
14c60 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
14c70 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
14c80 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
14c90 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
14ca0 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  != CKO_PRIVATE_K
14cb0 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
14cc0 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  s != CKO_PUBLIC_
14cd0 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  KEY) {......CACK
14ce0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14cf0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
14d00 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
14d10 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65   we are not a ke
14d20 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  y.");.......brea
14d30 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
14d40 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
14d50 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f   one key type */
14d60 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65  .....ck_key_type
14d70 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09   = CKK_RSA;.....
14d80 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65  .pValue = &ck_ke
14d90 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61  y_type;.....ulVa
14da0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
14db0 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09  ck_key_type);...
14dc0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14dd0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
14de0 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28  urning CKK_RSA (
14df0 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20  %lu) (%p/%lu)", 
14e00 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14e10 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54  *((CK_CERTIFICAT
14e20 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65  E_TYPE *) pValue
14e30 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
14e40 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
14e50 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
14e60 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
14e70 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  SIGN:.....CACKEY
14e80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14e90 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
14ea0 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78  ute CKA_SIGN (0x
14eb0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
14ec0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
14ed0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
14ee0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
14ef0 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
14f00 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
14f10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14f20 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
14f30 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
14f40 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
14f50 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
14f60 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
14f70 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
14f80 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
14f90 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
14fa0 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
14fb0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
14fc0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
14fd0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
14fe0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
14ff0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
15000 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
15010 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
15020 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
15030 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15040 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
15050 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
15060 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
15070 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
15080 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
15090 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
150a0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
150b0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
150c0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49  ;....case CKA_SI
150d0 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09  GN_RECOVER:.....
150e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
150f0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
15100 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49  attribute CKA_SI
15110 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30  GN_RECOVER (0x%0
15120 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
15130 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
15140 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
15150 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
15160 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
15170 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
15180 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15190 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
151a0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
151b0 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
151c0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
151d0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
151e0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
151f0 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   We currently on
15200 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69 67 6e  ly support "Sign
15210 20 77 69 74 68 20 41 70 70 65 6e 64 69 78 22 20   with Appendix" 
15220 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  */.....pValue = 
15230 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75  &ck_false;.....u
15240 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
15250 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09  of(ck_false);...
15260 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15270 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
15280 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
15290 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
152a0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
152b0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
152c0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
152d0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
152e0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
152f0 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59  ..case CKA_DECRY
15300 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PT:.....CACKEY_D
15310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
15320 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
15330 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30  e CKA_DECRYPT (0
15340 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
15350 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
15360 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
15370 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
15380 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
15390 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
153a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
153b0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
153c0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
153d0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
153e0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
153f0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
15400 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
15410 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
15420 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
15430 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61  KEY || objectcla
15440 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss == CKO_PUBLIC
15450 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61  _KEY) {......pVa
15460 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
15470 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
15480 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
15490 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
154a0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
154b0 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c  k_false;......ul
154c0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
154d0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09  f(ck_false);....
154e0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
154f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
15500 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
15510 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
15520 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
15530 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
15540 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
15550 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
15560 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
15570 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
15580 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 43  SENSITIVE:.....C
15590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
155a0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
155b0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 4e  ttribute CKA_SEN
155c0 53 49 54 49 56 45 20 28 30 78 25 30 38 6c 78 29  SITIVE (0x%08lx)
155d0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
155e0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
155f0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
15600 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15610 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
15620 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
15630 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15640 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
15650 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
15660 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
15670 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
15680 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
15690 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62  ...}......if (ob
156a0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
156b0 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a  _PRIVATE_KEY) {.
156c0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
156d0 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56  k_true;......ulV
156e0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
156f0 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d  (ck_true);.....}
15700 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61   else {......pVa
15710 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
15720 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
15730 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
15740 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
15750 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15760 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
15770 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
15780 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15790 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
157a0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
157b0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
157c0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
157d0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
157e0 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41  ase CKA_EXTRACTA
157f0 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BLE:.....CACKEY_
15800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15810 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
15820 74 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42  te CKA_EXTRACTAB
15830 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  LE (0x%08lx) ...
15840 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15850 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
15860 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
15870 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
15880 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
15890 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
158a0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
158b0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
158c0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
158d0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
158e0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
158f0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
15900 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
15910 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
15920 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09  VATE_KEY) {.....
15930 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
15940 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
15950 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
15960 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
15970 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
15980 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
15990 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
159a0 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
159b0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
159c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
159d0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
159e0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
159f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
15a00 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
15a10 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
15a20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
15a30 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
15a40 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
15a50 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09  CKA_MODULUS:....
15a60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15a70 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
15a80 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d   attribute CKA_M
15a90 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29  ODULUS (0x%08lx)
15aa0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
15ab0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
15ac0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
15ad0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15ae0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
15af0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
15b00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15b10 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
15b20 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
15b30 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
15b40 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
15b50 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
15b60 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
15b70 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
15b80 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
15b90 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
15ba0 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69  to_modulus(certi
15bb0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
15bc0 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
15bd0 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
15be0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
15bf0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
15c00 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
15c10 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
15c20 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
15c30 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
15c40 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
15c50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
15c60 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
15c70 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
15c80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
15c90 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
15ca0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
15cb0 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
15cc0 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ENT:.....CACKEY_
15cd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15ce0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
15cf0 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58  te CKA_PUBLIC_EX
15d00 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29  PONENT (0x%08lx)
15d10 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
15d20 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
15d30 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
15d40 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15d50 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
15d60 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
15d70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15d80 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
15d90 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
15da0 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
15db0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
15dc0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
15dd0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
15de0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
15df0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
15e00 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
15e10 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74  to_exponent(cert
15e20 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
15e30 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
15e40 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
15e50 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
15e60 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
15e70 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
15e80 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
15e90 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
15ea0 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
15eb0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
15ec0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
15ed0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
15ee0 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
15ef0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15f00 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
15f10 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
15f20 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54   CKA_TRUST_DIGIT
15f30 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09  AL_SIGNATURE:...
15f40 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
15f50 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a  NON_REPUDIATION:
15f60 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
15f70 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d  ST_KEY_ENCIPHERM
15f80 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ENT:....case CKA
15f90 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49  _TRUST_DATA_ENCI
15fa0 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73  PHERMENT:....cas
15fb0 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f  e CKA_TRUST_KEY_
15fc0 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61  AGREEMENT:....ca
15fd0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59  se CKA_TRUST_KEY
15fe0 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63  _CERT_SIGN:....c
15ff0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52  ase CKA_TRUST_CR
16000 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20  L_SIGN:....case 
16010 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52  CKA_TRUST_SERVER
16020 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43  _AUTH:....case C
16030 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f  KA_TRUST_CLIENT_
16040 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b  AUTH:....case CK
16050 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
16060 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 4b  NING:....case CK
16070 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52  A_TRUST_EMAIL_PR
16080 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41  OTECTION:.....CA
16090 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
160a0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
160b0 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53  tribute CKA_TRUS
160c0 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 20  T_... (0x%08lx) 
160d0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
160e0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
160f0 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
16100 75 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 64  ue = &ck_trusted
16110 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
16120 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
16130 73 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b  sted);......CACK
16140 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16150 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
16160 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
16170 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
16180 28 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 56  ((CK_TRUST *) pV
16190 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
161a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
161b0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
161c0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
161d0 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41  CKA_CERT_SHA1_HA
161e0 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SH:.....CACKEY_D
161f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
16200 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
16210 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f  e CKA_CERT_SHA1_
16220 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e  HASH (0x%08lx) .
16230 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
16240 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
16250 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
16260 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
16270 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
16280 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
16290 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
162a0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
162b0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
162c0 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63   are not a Netsc
162d0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
162e0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
162f0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 31  .....}......SHA1
16300 52 65 73 65 74 28 26 73 68 61 31 5f 63 74 78 29  Reset(&sha1_ctx)
16310 3b 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74 28  ;.....SHA1Input(
16320 26 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74 69  &sha1_ctx, certi
16330 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
16340 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48  ate_len);.....SH
16350 41 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f 63  A1Result(&sha1_c
16360 74 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b 0a  tx, sha1_hash);.
16370 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73 68  .....pValue = sh
16380 61 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56  a1_hash;.....ulV
16390 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
163a0 28 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09  (sha1_hash);....
163b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
163c0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
163d0 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
163e0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
163f0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
16400 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
16410 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54  ...case CKA_CERT
16420 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 43  _MD5_HASH:.....C
16430 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16440 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
16450 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
16460 54 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25 30  T_MD5_HASH (0x%0
16470 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
16480 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
16490 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
164a0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
164b0 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
164c0 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
164d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
164e0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
164f0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
16500 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
16510 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
16520 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
16530 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
16540 09 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f 63  ..MD5Init(&md5_c
16550 74 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 61  tx);.....MD5Upda
16560 74 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 72  te(&md5_ctx, cer
16570 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
16580 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09  icate_len);.....
16590 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73  MD5Final(md5_has
165a0 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09  h, &md5_ctx);...
165b0 09 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f  ...pValue = md5_
165c0 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75  hash;.....ulValu
165d0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64  eLen = sizeof(md
165e0 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41  5_hash);......CA
165f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16600 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
16610 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
16620 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
16630 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
16640 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64  .....break;....d
16650 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c  efault:.....pVal
16660 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75  ue = NULL;.....u
16670 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
16680 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72  LONG) -1;.....br
16690 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  eak;...}....if (
166a0 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c  ((CK_LONG) ulVal
166b0 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c  ueLen) != ((CK_L
166c0 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f  ONG) -1)) {..../
166d0 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74 74 72  * Push curr_attr
166e0 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
166f0 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  */....curr_attr.
16700 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72  type = curr_attr
16710 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61  _type;....curr_a
16720 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ttr.ulValueLen =
16730 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09   ulValueLen;....
16740 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75  .curr_attr.pValu
16750 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f  e = malloc(curr_
16760 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  attr.ulValueLen)
16770 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  ;....memcpy(curr
16780 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56  _attr.pValue, pV
16790 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e  alue, curr_attr.
167a0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
167b0 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65  .if (pValue_free
167c0 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09   && pValue) {...
167d0 09 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a  ..free(pValue);.
167e0 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d  ...}.....if (num
167f0 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f  attrs >= retval_
16800 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74  count) {.....ret
16810 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65  val = realloc(re
16820 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75  tval, retval_cou
16830 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
16840 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  val));....}.....
16850 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e  memcpy(&retval[n
16860 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f  umattrs], &curr_
16870 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72  attr, sizeof(cur
16880 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d  r_attr));....num
16890 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  attrs++;...}..}.
168a0 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21  ..if (numattrs !
168b0 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f  = 0) {...retval_
168c0 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73  count = numattrs
168d0 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ;...retval = rea
168e0 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
168f0 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
16900 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d  of(*retval));..}
16910 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72   else {...free(r
16920 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61  etval);....retva
16930 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a  l = NULL;..}...*
16940 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74  pulCount = numat
16950 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  trs;...CACKEY_DE
16960 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
16970 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74  rning %lu object
16980 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74  s (%p).", numatt
16990 72 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65 74  rs, (void *) ret
169a0 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
169b0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
169c0 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
169d0 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74  ee_identities(st
169e0 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
169f0 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
16a00 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
16a10 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
16a20 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  ) {..CK_ATTRIBUT
16a30 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75  E *curr_attr;..u
16a40 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f  nsigned long id_
16a50 69 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a  idx, attr_idx;..
16a60 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20  .if (identities 
16a70 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74  == NULL || ident
16a80 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30  ities_count == 0
16a90 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
16aa0 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d  ...for (id_idx =
16ab0 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65   0; id_idx < ide
16ac0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69  ntities_count; i
16ad0 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  d_idx++) {...if 
16ae0 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
16af0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20  dx].attributes) 
16b00 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69  {....for (attr_i
16b10 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78  dx = 0; attr_idx
16b20 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64   < identities[id
16b30 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
16b40 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78  _count; attr_idx
16b50 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61  ++) {.....curr_a
16b60 74 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65  ttr = &identitie
16b70 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
16b80 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a  utes[attr_idx];.
16b90 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74  .....if (curr_at
16ba0 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09  tr->pValue) {...
16bb0 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 74  ...free(curr_att
16bc0 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  r->pValue);.....
16bd0 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69  }....}.....if (i
16be0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
16bf0 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a  ].attributes) {.
16c00 09 09 09 09 66 72 65 65 28 69 64 65 6e 74 69 74  ....free(identit
16c10 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
16c20 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09  ibutes);....}...
16c30 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
16c40 72 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69  rts(identities[i
16c50 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
16c60 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d  tity, 1, 1);...}
16c70 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74  ..}...free(ident
16c80 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69  ities);.}..stati
16c90 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
16ca0 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79  identity *cackey
16cb0 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73  _read_identities
16cc0 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
16cd0 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
16ce0 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f  ned long *ids_fo
16cf0 75 6e 64 29 20 7b 0a 09 73 74 72 75 63 74 20 63  und) {..struct c
16d00 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
16d10 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
16d20 74 69 65 73 3b 0a 09 73 74 72 75 63 74 20 63 61  ties;..struct ca
16d30 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
16d40 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69  dentities;..unsi
16d50 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64  gned long num_id
16d60 73 2c 20 69 64 5f 69 64 78 2c 20 63 75 72 72 5f  s, id_idx, curr_
16d70 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e  id_type;..unsign
16d80 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74  ed long num_cert
16d90 73 2c 20 6e 75 6d 5f 65 78 74 72 61 5f 63 65 72  s, num_extra_cer
16da0 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09 69  ts, cert_idx;..i
16db0 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  nt include_extra
16dc0 5f 63 65 72 74 73 20 3d 20 31 3b 0a 0a 09 43 41  _certs = 1;...CA
16dd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16de0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
16df0 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
16e00 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54  EY_NO_EXTRA_CERT
16e10 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  S") != NULL) {..
16e20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16e30 49 4e 54 46 28 22 41 73 6b 65 64 20 6e 6f 74 20  INTF("Asked not 
16e40 74 6f 20 69 6e 63 6c 75 64 65 20 65 78 74 72 61  to include extra
16e50 20 28 44 6f 44 29 20 63 65 72 74 69 66 69 63 61   (DoD) certifica
16e60 74 65 73 22 29 3b 0a 0a 09 09 69 6e 63 6c 75 64  tes");....includ
16e70 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20  e_extra_certs = 
16e80 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 6e 63 6c  0;..}...if (incl
16e90 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29  ude_extra_certs)
16ea0 20 7b 0a 09 09 6e 75 6d 5f 65 78 74 72 61 5f 63   {...num_extra_c
16eb0 65 72 74 73 20 3d 20 73 69 7a 65 6f 66 28 65 78  erts = sizeof(ex
16ec0 74 72 61 5f 63 65 72 74 73 29 20 2f 20 73 69 7a  tra_certs) / siz
16ed0 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 5b  eof(extra_certs[
16ee0 30 5d 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  0]);....CACKEY_D
16ef0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63  EBUG_PRINTF("Inc
16f00 6c 75 64 69 6e 67 20 25 6c 69 20 44 6f 44 20 43  luding %li DoD C
16f10 65 72 74 69 66 69 63 61 74 65 73 20 61 73 20 6f  ertificates as o
16f20 62 6a 65 63 74 73 20 6f 6e 20 74 68 69 73 20 74  bjects on this t
16f30 6f 6b 65 6e 22 2c 20 6e 75 6d 5f 65 78 74 72 61  oken", num_extra
16f40 5f 63 65 72 74 73 29 3b 0a 09 7d 20 65 6c 73 65  _certs);..} else
16f50 20 7b 0a 09 09 6e 75 6d 5f 65 78 74 72 61 5f 63   {...num_extra_c
16f60 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  erts = 0;..}...i
16f70 66 20 28 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20  f (ids_found == 
16f80 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
16f90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
16fa0 72 72 6f 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64  rror.  ids_found
16fb0 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
16fc0 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
16fd0 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  ..pcsc_identitie
16fe0 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
16ff0 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c  certs(slot, NULL
17000 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09  , &num_certs);..
17010 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  if (pcsc_identit
17020 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
17030 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62  ./* Convert numb
17040 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f 20 6e  er of Certs to n
17050 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
17060 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20   */...num_ids = 
17070 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59  (CKO_PRIVATE_KEY
17080 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41   - CKO_CERTIFICA
17090 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63 65  TE + 1) * num_ce
170a0 72 74 73 3b 0a 09 09 6e 75 6d 5f 69 64 73 20 2b  rts;...num_ids +
170b0 3d 20 6e 75 6d 5f 65 78 74 72 61 5f 63 65 72 74  = num_extra_cert
170c0 73 20 2a 20 33 3b 0a 0a 09 09 69 64 65 6e 74 69  s * 3;....identi
170d0 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75  ties = malloc(nu
170e0 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a  m_ids * sizeof(*
170f0 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09  identities));...
17100 09 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69 63  ./* Add certific
17110 61 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65 79  ates, public key
17120 73 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20 6b  s, and private k
17130 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d 61  eys from the sma
17140 72 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f 69  rtcard */...id_i
17150 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63  dx = 0;...for (c
17160 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72  ert_idx = 0; cer
17170 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74  t_idx < num_cert
17180 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b  s; cert_idx++) {
17190 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64  ....for (curr_id
171a0 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54  _type = CKO_CERT
171b0 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64  IFICATE; curr_id
171c0 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49  _type <= CKO_PRI
171d0 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69  VATE_KEY; curr_i
171e0 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09  d_type++) {.....
171f0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
17200 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
17210 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
17220 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79  butes(curr_id_ty
17230 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69  pe, &pcsc_identi
17240 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  ties[cert_idx], 
17250 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
17260 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
17270 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
17280 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73  ......identities
17290 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
172a0 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
172b0 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
172c0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
172d0 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09  identity));.....
172e0 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65  memcpy(identitie
172f0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
17300 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69  dentity, &pcsc_i
17310 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
17320 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65  dx], sizeof(*ide
17330 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
17340 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b  pcsc_identity));
17350 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73  ......identities
17360 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
17370 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
17380 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73  ate = malloc(pcs
17390 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
173a0 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t_idx].certifica
173b0 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d  te_len);.....mem
173c0 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69  cpy(identities[i
173d0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
173e0 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
173f0 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69  e, pcsc_identiti
17400 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72  es[cert_idx].cer
17410 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69  tificate, pcsc_i
17420 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
17430 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
17440 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64  len);......id_id
17450 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  x++;....}...}...
17460 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
17470 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ts(pcsc_identiti
17480 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31  es, num_certs, 1
17490 29 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 44 6f 44  );..../* Add DoD
174a0 20 43 65 72 74 69 66 69 63 61 74 65 73 20 61 6e   Certificates an
174b0 64 20 4e 65 74 73 63 61 70 65 20 54 72 75 73 74  d Netscape Trust
174c0 20 4f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 66 6f   Objects */...fo
174d0 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b  r (cert_idx = 0;
174e0 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f   cert_idx < num_
174f0 65 78 74 72 61 5f 63 65 72 74 73 3b 20 63 65 72  extra_certs; cer
17500 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 64  t_idx++) {....id
17510 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
17520 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  .pcsc_identity =
17530 20 4e 55 4c 4c 3b 0a 09 09 09 69 64 65 6e 74 69   NULL;....identi
17540 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
17550 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
17560 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
17570 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 2c  CKO_CERTIFICATE,
17580 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65   &extra_certs[ce
17590 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20  rt_idx], 0xf000 
175a0 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65  | cert_idx, &ide
175b0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
175c0 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
175d0 29 3b 0a 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  );....id_idx++;.
175e0 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
175f0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
17600 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  tity = NULL;....
17610 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
17620 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
17630 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
17640 62 75 74 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43  butes(CKO_PUBLIC
17650 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f 63 65 72  _KEY, &extra_cer
17660 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78  ts[cert_idx], 0x
17670 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c  f000 | cert_idx,
17680 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
17690 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
176a0 63 6f 75 6e 74 29 3b 0a 09 09 09 69 64 5f 69 64  count);....id_id
176b0 78 2b 2b 3b 0a 0a 09 09 09 69 64 65 6e 74 69 74  x++;.....identit
176c0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
176d0 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  _identity = NULL
176e0 3b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  ;....identities[
176f0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
17700 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
17710 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e  attributes(CKO_N
17720 45 54 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26  ETSCAPE_TRUST, &
17730 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74  extra_certs[cert
17740 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20  _idx], 0xf000 | 
17750 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
17760 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
17770 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
17780 0a 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09  ....id_idx++;...
17790 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20  }....*ids_found 
177a0 3d 20 6e 75 6d 5f 69 64 73 3b 0a 09 09 72 65 74  = num_ids;...ret
177b0 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b  urn(identities);
177c0 0a 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64  ..}...*ids_found
177d0 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55   = 0;..return(NU
177e0 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  LL);.}..CK_DEFIN
177f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
17800 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28  , C_Initialize)(
17810 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69  CK_VOID_PTR pIni
17820 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49  tArgs) {..CK_C_I
17830 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43  NITIALIZE_ARGS C
17840 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e  K_PTR args;..uin
17850 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20  t32_t idx;..int 
17860 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a  mutex_init_ret;.
17870 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17880 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
17890 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69  ;...if (cackey_i
178a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
178b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
178c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72  NTF("Error.  Alr
178d0 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64  eady initialized
178e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
178f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45  KR_CRYPTOKI_ALRE
17900 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  ADY_INITIALIZED)
17910 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74  ;..}...if (pInit
17920 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Args != NULL) {.
17930 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72  ..args = pInitAr
17940 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61  gs;...memcpy(&ca
17950 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c  ckey_args, args,
17960 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61   sizeof(cackey_a
17970 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72  rgs));....if (ar
17980 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20  gs->CreateMutex 
17990 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  == NULL || args-
179a0 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d  >DestroyMutex ==
179b0 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c   NULL || args->L
179c0 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ockMutex == NULL
179d0 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b   || args->Unlock
179e0 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Mutex == NULL) {
179f0 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72  ....if (args->Cr
17a00 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c  eateMutex != NUL
17a10 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72  L || args->Destr
17a20 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20  oyMutex != NULL 
17a30 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74  || args->LockMut
17a40 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex != NULL || ar
17a50 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  gs->UnlockMutex 
17a60 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43  != NULL) {.....C
17a70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17a80 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c  TF("Error. Some,
17a90 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72   but not All thr
17aa0 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65  eading primitive
17ab0 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a  s provided.");..
17ac0 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
17ad0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
17ae0 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  ..}...}..} else 
17af0 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  {...cackey_args.
17b00 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55  CreateMutex = NU
17b10 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
17b20 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d  s.DestroyMutex =
17b30 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
17b40 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d  args.LockMutex =
17b50 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
17b60 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78  args.UnlockMutex
17b70 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
17b80 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30  y_args.flags = 0
17b90 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
17ba0 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
17bb0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
17bc0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
17bd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
17be0 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61  ); idx++) {...ca
17bf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
17c00 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  x].active = 0;..
17c10 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
17c20 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
17c30 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
17c40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
17c50 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ots[0])); idx++)
17c60 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74   {...cackey_slot
17c70 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20  s[idx].active = 
17c80 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
17c90 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
17ca0 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  er = NULL;...cac
17cb0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
17cc0 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
17cd0 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
17ce0 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
17cf0 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
17d00 63 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ck = 0;...cackey
17d10 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74  _slots[idx].slot
17d20 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61  _reset = 0;...ca
17d30 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
17d40 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b  token_flags = 0;
17d50 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
17d60 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c  idx].label = NUL
17d70 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69  L;..}...cackey_i
17d80 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a  nitialized = 1;.
17d90 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69  ..if (!cackey_bi
17da0 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09  glock_init) {...
17db0 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d  mutex_init_ret =
17dc0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72   cackey_mutex_cr
17dd0 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67  eate(&cackey_big
17de0 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75  lock);....if (mu
17df0 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20  tex_init_ret != 
17e00 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
17e10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
17e20 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69  or.  Mutex initi
17e30 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64  alization failed
17e40 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
17e50 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a  CKR_CANT_LOCK);.
17e60 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69  ..}....cackey_bi
17e70 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a  glock_init = 1;.
17e80 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
17e90 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
17ea0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
17eb0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
17ec0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
17ed0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
17ee0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61  ON(CK_RV, C_Fina
17ef0 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54  lize)(CK_VOID_PT
17f00 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09  R pReserved) {..
17f10 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09  uint32_t idx;...
17f20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17f30 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
17f40 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20  ..if (pReserved 
17f50 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
17f60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17f70 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
17f80 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
17f90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
17fa0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
17fb0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
17fc0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
17fd0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17fe0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
17ff0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
18000 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
18010 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
18020 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
18030 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
18040 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
18050 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
18060 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
18070 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
18080 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
18090 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
180a0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43  ].active) {....C
180b0 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64  _CloseSession(id
180c0 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63  x);...}..}...cac
180d0 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
180e0 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f  nect_all();...fo
180f0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
18100 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
18110 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
18120 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
18130 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
18140 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
18150 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  idx].pcsc_reader
18160 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
18170 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
18180 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a  sc_reader);...}.
18190 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  .}...cackey_pcsc
181a0 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a  _disconnect();..
181b0 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  .cackey_initiali
181c0 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  zed = 0;...CACKE
181d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
181e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
181f0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
18200 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
18210 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
18220 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
18230 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e  C_GetInfo)(CK_IN
18240 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
18250 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
18260 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72  HAR manufacturer
18270 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76  ID[] = "U.S. Gov
18280 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69  ernment";..stati
18290 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69  c CK_UTF8CHAR li
182a0 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
182b0 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a  [] = "CACKey";..
182c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
182d0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
182e0 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
182f0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
18300 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18310 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
18320 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
18330 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
18340 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
18350 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
18360 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
18370 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18380 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
18390 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
183a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
183b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
183c0 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72  ;..}...pInfo->cr
183d0 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61  yptokiVersion.ma
183e0 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  jor = ((CACKEY_C
183f0 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
18400 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30  CODE) >> 16) & 0
18410 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79  xff;..pInfo->cry
18420 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e  ptokiVersion.min
18430 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
18440 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
18450 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66  ODE) >> 8) & 0xf
18460 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  f;...memset(pInf
18470 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
18480 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
18490 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
184a0 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
184b0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
184c0 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
184d0 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
184e0 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
184f0 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  1);...pInfo->fla
18500 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d  gs = 0x00;...mem
18510 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  set(pInfo->libra
18520 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  ryDescription, '
18530 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
18540 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
18550 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28  tion));..memcpy(
18560 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
18570 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61  scription, libra
18580 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  ryDescription, s
18590 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73  izeof(libraryDes
185a0 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a  cription) - 1);.
185b0 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  ..pInfo->library
185c0 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
185d0 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
185e0 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
185f0 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72  ff;..pInfo->libr
18600 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  aryVersion.minor
18610 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
18620 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
18630 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0xff;...CACKEY_D
18640 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
18650 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
18660 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
18670 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
18680 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73  }../*. * Process
18690 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73   list of readers
186a0 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70  , and create map
186b0 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61  ping between rea
186c0 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f  der name and slo
186d0 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49  t ID. */.CK_DEFI
186e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
186f0 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74  V, C_GetSlotList
18700 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e  )(CK_BBOOL token
18710 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54  Present, CK_SLOT
18720 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73  _ID_PTR pSlotLis
18730 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
18740 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e 74  pulCount) {..int
18750 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
18760 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  int pcsc_connect
18770 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  _ret;..CK_ULONG 
18780 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e  count, slot_coun
18790 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74 3b  t = 0, currslot;
187a0 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
187b0 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64  ders, *pcsc_read
187c0 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61  ers_s, *pcsc_rea
187d0 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70  ders_e;..DWORD p
187e0 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b  csc_readers_len;
187f0 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73  ..LONG scard_lis
18800 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73  treaders_ret;..s
18810 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65  ize_t curr_reade
18820 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f  r_len;...CACKEY_
18830 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
18840 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
18850 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ulCount == NULL)
18860 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
18870 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
18880 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c   pulCount is NUL
18890 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
188a0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
188b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
188c0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
188d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
188e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
188f0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
18900 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
18910 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
18920 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
18930 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
18940 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
18950 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
18960 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
18970 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
18980 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18990 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
189a0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
189b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
189c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
189d0 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c  ..}.../* Clear l
189e0 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a  ist of slots */.
189f0 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20  .if (pSlotList) 
18a00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18a10 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67  _PRINTF("Purging
18a20 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   all slot inform
18a30 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 2f 2a 20  ation.");..../* 
18a40 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20  Only update the 
18a50 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66  list of slots if
18a60 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79   we are actually
18a70 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68   being supply th
18a80 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  e slot informati
18a90 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 73  on */...cackey_s
18aa0 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
18ab0 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72 20 28 63  all();....for (c
18ac0 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
18ad0 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
18ae0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
18af0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
18b00 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
18b10 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63  ot++) {....if (c
18b20 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
18b30 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
18b40 72 29 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61  r) {.....free(ca
18b50 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
18b60 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
18b70 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  );......cackey_s
18b80 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70  lots[currslot].p
18b90 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c  csc_reader = NUL
18ba0 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  L;....}.....if (
18bb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
18bc0 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a  rslot].label) {.
18bd0 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
18be0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
18bf0 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09 63 61 63  label);......cac
18c00 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
18c10 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ot].label = NULL
18c20 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  ;....}.....cacke
18c30 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
18c40 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09  ].active = 0;...
18c50 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  }..}.../* Determ
18c60 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64  ine list of read
18c70 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e  ers */..pcsc_con
18c80 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
18c90 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
18ca0 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
18cb0 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
18cc0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
18cd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18ce0 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
18cf0 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64   to PC/SC failed
18d00 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c  , assuming no sl
18d10 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63  ots");....slot_c
18d20 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73  ount = 0;..} els
18d30 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65  e {...pcsc_reade
18d40 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73  rs_len = 0;....s
18d50 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
18d60 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
18d70 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
18d80 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
18d90 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72  L, NULL, &pcsc_r
18da0 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09  eaders_len);....
18db0 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
18dc0 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
18dd0 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29  RD_F_COMM_ERROR)
18de0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
18df0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18e00 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  . SCardListReade
18e10 72 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  rs() returned SC
18e20 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52  ARD_F_COMM_ERROR
18e30 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65  , assuming Conne
18e40 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77  ction to PC/SC w
18e50 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e  ent away. Reconn
18e60 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63  ecting.");.....c
18e70 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
18e80 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b  nnect();....cack
18e90 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
18ea0 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
18eb0 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69  BUG_PRINTF("Tryi
18ec0 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  ng SCardListRead
18ed0 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09  ers() again");..
18ee0 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ..scard_listread
18ef0 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c  ers_ret = SCardL
18f00 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b  istReaders(*cack
18f10 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
18f20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73  NULL, NULL, &pcs
18f30 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
18f40 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64  ..}....if (scard
18f50 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
18f60 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   == SCARD_S_SUCC
18f70 45 53 53 20 26 26 20 70 63 73 63 5f 72 65 61 64  ESS && pcsc_read
18f80 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a  ers_len != 0) {.
18f90 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20  ...pcsc_readers 
18fa0 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65  = malloc(pcsc_re
18fb0 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70  aders_len);....p
18fc0 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20  csc_readers_s = 
18fd0 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09  pcsc_readers;...
18fe0 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ..scard_listread
18ff0 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c  ers_ret = SCardL
19000 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b  istReaders(*cack
19010 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
19020 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65  NULL, pcsc_reade
19030 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72  rs, &pcsc_reader
19040 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73  s_len);....if (s
19050 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
19060 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
19070 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70  SUCCESS) {.....p
19080 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20  csc_readers_e = 
19090 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70  pcsc_readers + p
190a0 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b  csc_readers_len;
190b0 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77  ....../* Start w
190c0 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74  ith Slot ID 1, t
190d0 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e  o avoid a bug in
190e0 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a   GDM on RHEL */.
190f0 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31  ..../* Bug 59491
19100 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  1: https://bugzi
19110 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73  lla.redhat.com/s
19120 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35  how_bug.cgi?id=5
19130 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72  94911 */.....cur
19140 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 77  rslot = 1;.....w
19150 68 69 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65  hile (pcsc_reade
19160 72 73 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72  rs < pcsc_reader
19170 73 5f 65 29 20 7b 0a 09 09 09 09 09 63 75 72 72  s_e) {......curr
19180 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74  _reader_len = st
19190 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72  rlen(pcsc_reader
191a0 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70  s);.......if ((p
191b0 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75  csc_readers + cu
191c0 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e  rr_reader_len) >
191d0 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29   pcsc_readers_e)
191e0 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
191f0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
19200 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e  (curr_reader_len
19210 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62   == 0) {.......b
19220 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  reak;......}....
19230 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20  ...if (currslot 
19240 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
19250 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
19260 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
19270 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ]))) {.......CAC
19280 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19290 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61  ("Found more rea
192a0 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20  ders than slots 
192b0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29  are available!")
192c0 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
192d0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43  .....}.......CAC
192e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
192f0 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20  ("Found reader: 
19300 25 73 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72  %s", pcsc_reader
19310 73 29 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c  s);......./* Onl
19320 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73  y update the lis
19330 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65  t of slots if we
19340 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65   are actually be
19350 69 6e 67 20 61 73 6b 65 64 20 73 75 70 70 6c 79  ing asked supply
19360 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   the slot inform
19370 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 66  ation */......if
19380 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09   (pSlotList) {..
19390 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
193a0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
193b0 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 63 61  ve = 1;.......ca
193c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
193d0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
193e0 20 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72   = strdup(pcsc_r
193f0 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 63  eaders);.......c
19400 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
19410 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f  slot].pcsc_card_
19420 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
19430 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
19440 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e  s[currslot].tran
19450 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
19460 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  0;.......cackey_
19470 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
19480 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
19490 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
194a0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
194b0 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  [currslot].token
194c0 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 09 09  _flags = 0;.....
194d0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
194e0 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d  urrslot].label =
194f0 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 63 61   NULL;........ca
19500 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
19510 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  eset(&cackey_slo
19520 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29 3b 0a 09  ts[currslot]);..
19530 09 09 09 09 7d 0a 09 09 09 09 09 63 75 72 72 73  ....}......currs
19540 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73  lot++;.......pcs
19550 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72  c_readers += cur
19560 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31  r_reader_len + 1
19570 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
19580 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20  Start with Slot 
19590 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61  ID 1, to avoid a
195a0 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52   bug in GDM on R
195b0 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75  HEL */...../* Bu
195c0 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a  g 594911: https:
195d0 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61  //bugzilla.redha
195e0 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63  t.com/show_bug.c
195f0 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a  gi?id=594911 */.
19600 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74  ....if (currslot
19610 20 3e 20 31 29 20 7b 0a 09 09 09 09 09 2f 2a 20   > 1) {....../* 
19620 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20  Start with Slot 
19630 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61  ID 1, to avoid a
19640 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52   bug in GDM on R
19650 48 45 4c 20 2a 2f 0a 09 09 09 09 09 2f 2a 20 42  HEL */....../* B
19660 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 73  ug 594911: https
19670 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68  ://bugzilla.redh
19680 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e  at.com/show_bug.
19690 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f  cgi?id=594911 */
196a0 0a 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  ......slot_count
196b0 20 3d 20 63 75 72 72 73 6c 6f 74 20 2d 20 31 3b   = currslot - 1;
196c0 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
196d0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
196e0 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63 6f  BUG_PRINTF("Seco
196f0 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64  nd call to SCard
19700 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69 6c  ListReaders fail
19710 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c  ed, return %s/%l
19720 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  i", CACKEY_DEBUG
19730 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
19740 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74  O_STR(scard_list
19750 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c  readers_ret), (l
19760 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72  ong) scard_listr
19770 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 09  eaders_ret);....
19780 7d 0a 0a 09 09 09 66 72 65 65 28 70 63 73 63 5f  }.....free(pcsc_
19790 72 65 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d 20  readers_s);...} 
197a0 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
197b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
197c0 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 53 43 61  irst call to SCa
197d0 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 61  rdListReaders fa
197e0 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f  iled, return %s/
197f0 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  %li", CACKEY_DEB
19800 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
19810 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69  _TO_STR(scard_li
19820 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20  streaders_ret), 
19830 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73  (long) scard_lis
19840 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09  treaders_ret);..
19850 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  .}..}...mutex_re
19860 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
19870 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
19880 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
19890 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
198a0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
198b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
198c0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
198d0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
198e0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
198f0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
19900 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55  (pSlotList == NU
19910 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e  LL) {...*pulCoun
19920 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a  t = slot_count;.
19930 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19940 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
19950 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20  g CKR_OK (%i).  
19960 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72  Found %lu reader
19970 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f 72 69  s, but not stori
19980 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c 69 73  ng IDs (pSlotLis
19990 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b 52  t == NULL)", CKR
199a0 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  _OK, (unsigned l
199b0 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  ong) slot_count)
199c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
199d0 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20  OK);..}...count 
199e0 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69 66  = *pulCount;..if
199f0 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f 63   (count < slot_c
19a00 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  ount) {...CACKEY
19a10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19a20 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63  rror. User alloc
19a30 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65 73  ated %lu entries
19a40 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 25 6c  , but we have %l
19a50 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f 75  u entries.", cou
19a60 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b  nt, slot_count);
19a70 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42  ....return(CKR_B
19a80 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
19a90 3b 09 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72  ;...}...for (cur
19aa0 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73  rslot = 0; currs
19ab0 6c 6f 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74  lot < slot_count
19ac0 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
19ad0 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20  ../* Start with 
19ae0 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76  Slot ID 1, to av
19af0 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d  oid a bug in GDM
19b00 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 2f 2a   on RHEL */.../*
19b10 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74   Bug 594911: htt
19b20 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65  ps://bugzilla.re
19b30 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75  dhat.com/show_bu
19b40 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20  g.cgi?id=594911 
19b50 2a 2f 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b 63  */...pSlotList[c
19b60 75 72 72 73 6c 6f 74 5d 20 3d 20 63 75 72 72 73  urrslot] = currs
19b70 6c 6f 74 20 2b 20 31 3b 0a 09 7d 0a 0a 09 2a 70  lot + 1;..}...*p
19b80 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63  ulCount = slot_c
19b90 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ount;...CACKEY_D
19ba0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
19bb0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
19bc0 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72  i).  Found %lu r
19bd0 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b  eaders.", CKR_OK
19be0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19bf0 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a  ) slot_count);..
19c00 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
19c10 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20  ...tokenPresent 
19c20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20  = tokenPresent; 
19c30 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
19c40 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
19c50 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49  ng */.}..CK_DEFI
19c60 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
19c70 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f  V, C_GetSlotInfo
19c80 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
19c90 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46  tID, CK_SLOT_INF
19ca0 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
19cb0 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
19cc0 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69  AR slotDescripti
19cd0 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53  on[] = "CACKey S
19ce0 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78  lot";..int mutex
19cf0 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79  _retval;..int by
19d00 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43  tes_to_copy;...C
19d10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19d20 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
19d30 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
19d40 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
19d50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19d60 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
19d70 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
19d80 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
19d90 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
19da0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
19db0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19dc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19dd0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
19de0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
19df0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
19e00 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
19e10 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
19e20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
19e30 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
19e40 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
19e50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
19e60 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
19e70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
19e80 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
19e90 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
19ea0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
19eb0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
19ec0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
19ed0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
19ee0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
19ef0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
19f00 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
19f10 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
19f20 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
19f30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19f40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19f50 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking 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 63 61 63  R);..}...if (cac
19f90 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
19fa0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
19fb0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19fc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
19fd0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
19fe0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
19ff0 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
1a000 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
1a010 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
1a020 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1a030 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
1a040 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1a050 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70  INVALID);..}...p
1a060 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b  Info->flags = CK
1a070 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49  F_REMOVABLE_DEVI
1a080 43 45 20 7c 20 43 4b 46 5f 48 57 5f 53 4c 4f 54  CE | CKF_HW_SLOT
1a090 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74  ;...if (cackey_t
1a0a0 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61  oken_present(&ca
1a0b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1a0c0 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  D]) == CACKEY_PC
1a0d0 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
1a0e0 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c  T) {...pInfo->fl
1a0f0 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e  ags |= CKF_TOKEN
1a100 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62  _PRESENT;..}...b
1a110 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73  ytes_to_copy = s
1a120 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f  trlen(cackey_slo
1a130 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f  ts[slotID].pcsc_
1a140 72 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69  reader);..if (si
1a150 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1a160 66 61 63 74 75 72 65 72 49 44 29 20 3c 20 62 79  facturerID) < by
1a170 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09  tes_to_copy) {..
1a180 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
1a190 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
1a1a0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a  anufacturerID);.
1a1b0 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  .}..memcpy(pInfo
1a1c0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1a1d0 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  , cackey_slots[s
1a1e0 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64  lotID].pcsc_read
1a1f0 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  er, bytes_to_cop
1a200 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y);...mutex_retv
1a210 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1a220 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1a230 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1a240 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1a250 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a260 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a270 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1a280 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1a290 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1a2a0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65  ROR);..}...memse
1a2b0 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  t(pInfo->slotDes
1a2c0 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73  cription, ' ', s
1a2d0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f  izeof(pInfo->slo
1a2e0 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a  tDescription));.
1a2f0 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73  .memcpy(pInfo->s
1a300 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  lotDescription, 
1a310 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c  slotDescription,
1a320 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63   sizeof(slotDesc
1a330 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a  ription) - 1);..
1a340 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d  .memset(pInfo->m
1a350 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27  anufacturerID, '
1a360 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1a370 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1a380 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  ));...pInfo->har
1a390 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  dwareVersion.maj
1a3a0 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1a3b0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
1a3c0 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
1a3d0 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
1a3e0 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
1a3f0 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
1a400 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49   8) & 0xff;...pI
1a410 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
1a420 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30  sion.major = 0x0
1a430 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  0;..pInfo->firmw
1a440 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
1a450 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45   = 0x00;...CACKE
1a460 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a470 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1a480 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1a490 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1a4a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1a4b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1a4c0 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28  C_GetTokenInfo)(
1a4d0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1a4e0 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f  D, CK_TOKEN_INFO
1a4f0 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
1a500 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
1a510 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  R manufacturerID
1a520 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72  [] = "U.S. Gover
1a530 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20  nment";..static 
1a540 43 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66 61  CK_UTF8CHAR defa
1a550 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e  ultLabel[] = "Un
1a560 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73  known Token";..s
1a570 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
1a580 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43  R model[] = "CAC
1a590 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74   Token";..struct
1a5a0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
1a5b0 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
1a5c0 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65  tities;..unsigne
1a5d0 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
1a5e0 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c  ;..ssize_t label
1a5f0 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  _ret;..int mutex
1a600 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73  _retval;..int us
1a610 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b  e_default_label;
1a620 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a630 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1a640 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
1a650 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1a660 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a670 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
1a680 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1a690 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1a6a0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1a6b0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1a6c0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1a6d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a6e0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1a6f0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1a700 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1a710 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1a720 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
1a730 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
1a740 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
1a750 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1a760 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1a770 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1a780 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a790 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1a7a0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1a7b0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
1a7c0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
1a7d0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
1a7e0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1a7f0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1a800 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1a810 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1a820 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1a830 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1a840 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1a850 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a860 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1a870 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1a880 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1a890 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1a8a0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1a8b0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
1a8c0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1a8d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a8e0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1a8f0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1a900 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
1a910 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
1a920 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1a930 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1a940 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1a950 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
1a960 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
1a970 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  ...if (cackey_to
1a980 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
1a990 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1a9a0 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) != CACKEY_PCS
1a9b0 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
1a9c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a9d0 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f  UG_PRINTF("No to
1a9e0 6b 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69  ken is present i
1a9f0 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c  n slotID = %lu",
1aa00 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
1aa10 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1aa20 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1aa30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1aa40 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e  TOKEN_NOT_PRESEN
1aa50 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  T);..}...mutex_r
1aa60 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1aa70 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1aa80 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1aa90 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1aaa0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1aab0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1aac0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1aad0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1aae0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1aaf0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a  _ERROR);..}.../*
1ab00 20 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e   Determine token
1ab10 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74   label from cert
1ab20 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d  ificates */..mem
1ab30 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  set(pInfo->label
1ab40 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1ab50 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75  nfo->label));..u
1ab60 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
1ab70 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b   = 1;...if (cack
1ab80 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1ab90 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20  .label == NULL) 
1aba0 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74  {...pcsc_identit
1abb0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
1abc0 64 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f  d_certs(&cackey_
1abd0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e  slots[slotID], N
1abe0 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29  ULL, &num_certs)
1abf0 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 69 64 65  ;...if (pcsc_ide
1ac00 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
1ac10 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65   {....if (num_ce
1ac20 72 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c  rts > 0) {.....l
1ac30 61 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65  abel_ret = cacke
1ac40 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f  y_pcsc_identity_
1ac50 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64  to_label(pcsc_id
1ac60 65 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d  entities, pInfo-
1ac70 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  >label, sizeof(p
1ac80 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09  Info->label));..
1ac90 09 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74  ...if (label_ret
1aca0 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65   > 0) {......use
1acb0 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
1acc0 20 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79   0;.......cackey
1acd0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
1ace0 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  abel = malloc(si
1acf0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
1ad00 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70  l));.......memcp
1ad10 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  y(cackey_slots[s
1ad20 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49  lotID].label, pI
1ad30 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65  nfo->label, size
1ad40 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
1ad50 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
1ad60 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
1ad70 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
1ad80 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
1ad90 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  1);...}..} else 
1ada0 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  {...memcpy(pInfo
1adb0 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f  ->label, cackey_
1adc0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
1add0 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  bel, sizeof(pInf
1ade0 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75  o->label));....u
1adf0 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
1ae00 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75   = 0;..}...if (u
1ae10 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
1ae20 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e  ) {...memcpy(pIn
1ae30 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75  fo->label, defau
1ae40 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  ltLabel, sizeof(
1ae50 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20  defaultLabel) - 
1ae60 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  1);..}...memset(
1ae70 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1ae80 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
1ae90 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
1aea0 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
1aeb0 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
1aec0 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
1aed0 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
1aee0 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
1aef0 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
1af00 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27  (pInfo->model, '
1af10 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1af20 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63  ->model));..memc
1af30 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c  py(pInfo->model,
1af40 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d   model, sizeof(m
1af50 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  odel) - 1);...me
1af60 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69  mset(pInfo->seri
1af70 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73  alNumber, ' ', s
1af80 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72  izeof(pInfo->ser
1af90 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d  ialNumber));...m
1afa0 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63  emset(pInfo->utc
1afb0 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f  Time, ' ', sizeo
1afc0 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65  f(pInfo->utcTime
1afd0 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  ));...pInfo->har
1afe0 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  dwareVersion.maj
1aff0 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1b000 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
1b010 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
1b020 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
1b030 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
1b040 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
1b050 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49   8) & 0xff;...pI
1b060 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
1b070 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30  sion.major = 0x0
1b080 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  0;..pInfo->firmw
1b090 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
1b0a0 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f   = 0x00;...pInfo
1b0b0 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52  ->flags = CKF_WR
1b0c0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20  ITE_PROTECTED | 
1b0d0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49  CKF_USER_PIN_INI
1b0e0 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54  TIALIZED | CKF_T
1b0f0 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44  OKEN_INITIALIZED
1b100 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   | cackey_slots[
1b110 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
1b120 61 67 73 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c  ags;...pInfo->ul
1b130 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  MaxSessionCount 
1b140 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1b150 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1b160 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1b170 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70  ons[0])) - 1;..p
1b180 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43  Info->ulSessionC
1b190 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49  ount = CK_UNAVAI
1b1a0 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
1b1b0 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  N;..pInfo->ulMax
1b1c0 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  RwSessionCount =
1b1d0 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77   0;..pInfo->ulRw
1b1e0 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43  SessionCount = C
1b1f0 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
1b200 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
1b210 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d  o->ulMaxPinLen =
1b220 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   128;..pInfo->ul
1b230 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09  MinPinLen = 0;..
1b240 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75  pInfo->ulTotalPu
1b250 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  blicMemory = CK_
1b260 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
1b270 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
1b280 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d  >ulFreePublicMem
1b290 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
1b2a0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
1b2b0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61  ;..pInfo->ulTota
1b2c0 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d  lPrivateMemory =
1b2d0 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
1b2e0 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
1b2f0 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61  nfo->ulFreePriva
1b300 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  teMemory = CK_UN
1b310 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
1b320 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f  ATION;...CACKEY_
1b330 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1b340 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1b350 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1b360 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1b370 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1b380 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1b390 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
1b3a0 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  )(CK_FLAGS flags
1b3b0 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52  , CK_SLOT_ID_PTR
1b3c0 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49   pSlotID, CK_VOI
1b3d0 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
1b3e0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1b3f0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1b400 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
1b410 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
1b420 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b430 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
1b440 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
1b450 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1b460 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1b470 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
1b480 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1b490 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1b4a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b4b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1b4c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1b4d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1b4e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1b4f0 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 4f  ..}.../* XXX: TO
1b500 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68  DO: Implement th
1b510 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b 45 59  is... */..CACKEY
1b520 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1b530 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1b540 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1b550 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1b560 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1b570 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1b580 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1b590 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1b5a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1b5b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1b5c0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28 43  MechanismList)(C
1b5d0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
1b5e0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  , CK_MECHANISM_T
1b5f0 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  YPE_PTR pMechani
1b600 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  smList, CK_ULONG
1b610 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b  _PTR pulCount) {
1b620 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b630 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1b640 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1b650 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1b660 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b670 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1b680 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1b690 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1b6a0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1b6b0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1b6c0 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20  if (pulCount == 
1b6d0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1b6e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b6f0 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20  rror.  pulCount 
1b700 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1b710 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1b720 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1b730 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  f (pMechanismLis
1b740 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a  t == NULL) {...*
1b750 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09  pulCount = 1;...
1b760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b770 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1b780 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1b790 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
1b7a0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
1b7b0 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 31  f (*pulCount < 1
1b7c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b7d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b7e0 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73 6d  .  Buffer too sm
1b7f0 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  all.");....retur
1b800 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  n(CKR_BUFFER_TOO
1b810 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d  _SMALL);..}...pM
1b820 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20  echanismList[0] 
1b830 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a  = CKM_RSA_PKCS;.
1b840 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a  .*pulCount = 1;.
1b850 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b860 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1b870 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1b880 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1b890 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1b8a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1b8b0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68  CK_RV, C_GetMech
1b8c0 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c  anismInfo)(CK_SL
1b8d0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
1b8e0 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20  _MECHANISM_TYPE 
1b8f0 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  type, CK_MECHANI
1b900 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  SM_INFO_PTR pInf
1b910 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  o) {..int mutex_
1b920 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1b930 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1b940 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1b950 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pInfo == NULL) {
1b960 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b970 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1b980 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  Info is NULL.");
1b990 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1b9a0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1b9b0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1b9c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1b9d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b9e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1b9f0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1ba00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ba10 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1ba20 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1ba30 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
1ba40 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
1ba50 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1ba60 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1ba70 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
1ba80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ba90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1baa0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1bab0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
1bac0 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
1bad0 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
1bae0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
1baf0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
1bb00 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1bb10 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1bb20 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1bb30 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1bb40 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1bb50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bb60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1bb70 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1bb80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1bb90 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1bba0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
1bbb0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
1bbc0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
1bbd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bbe0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1bbf0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1bc00 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
1bc10 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1bc20 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1bc30 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1bc40 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1bc50 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
1bc60 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
1bc70 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1bc80 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1bc90 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1bca0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1bcb0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1bcc0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1bcd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1bce0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1bcf0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1bd00 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1bd10 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
1bd20 77 69 74 63 68 20 28 74 79 70 65 29 20 7b 0a 09  witch (type) {..
1bd30 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
1bd40 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c  CS:....pInfo->ul
1bd50 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32  MinKeySize = 512
1bd60 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ;....pInfo->ulMa
1bd70 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b  xKeySize = 8192;
1bd80 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  ....pInfo->flags
1bd90 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f   = CKF_HW | CKF_
1bda0 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45  ENCRYPT | CKF_DE
1bdb0 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e  CRYPT | CKF_SIGN
1bdc0 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09   | CKF_VERIFY;..
1bdd0 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41  ..break;..}...CA
1bde0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bdf0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1be00 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1be10 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1be20 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  _OK);.}../* We d
1be30 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
1be40 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
1be50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1be60 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b  CK_RV, C_InitTok
1be70 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  en)(CK_SLOT_ID s
1be80 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 43 48  lotID, CK_UTF8CH
1be90 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
1bea0 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20  ULONG ulPinLen, 
1beb0 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
1bec0 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45  pLabel) {..CACKE
1bed0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bee0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1bef0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1bf00 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1bf10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1bf20 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1bf30 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1bf40 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1bf50 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1bf60 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1bf70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1bf80 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45  turning CKR_TOKE
1bf90 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
1bfa0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b  D (%i)", CKR_TOK
1bfb0 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
1bfc0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1bfd0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
1bfe0 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20  OTECTED);.}../* 
1bff0 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74  We don't support
1c000 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f   this method. */
1c010 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1c020 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69  ION(CK_RV, C_Ini
1c030 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tPIN)(CK_SESSION
1c040 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1c050 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
1c060 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  R pPin, CK_ULONG
1c070 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41   ulPinLen) {..CA
1c080 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c090 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1c0a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1c0b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1c0c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c0d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1c0e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1c0f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1c100 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1c110 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1c120 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c130 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54  "Returning CKR_T
1c140 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
1c150 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  CTED (%i)", CKR_
1c160 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
1c170 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ECTED);...return
1c180 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45  (CKR_TOKEN_WRITE
1c190 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a  _PROTECTED);.}..
1c1a0 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
1c1b0 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
1c1c0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
1c1d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1c1e0 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49  SetPIN)(CK_SESSI
1c1f0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1c200 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  on, CK_UTF8CHAR_
1c210 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f  PTR pOldPin, CK_
1c220 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65  ULONG ulOldPinLe
1c230 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
1c240 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55  TR pNewPin, CK_U
1c250 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e  LONG ulNewPinLen
1c260 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1c270 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1c280 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1c290 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1c2a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c2b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c2c0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1c2d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1c2e0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1c2f0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1c300 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c310 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1c320 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1c330 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1c340 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1c350 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1c360 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1c370 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1c380 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1c390 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1c3a0 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f  RV, C_OpenSessio
1c3b0 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  n)(CK_SLOT_ID sl
1c3c0 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66  otID, CK_FLAGS f
1c3d0 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54  lags, CK_VOID_PT
1c3e0 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20  R pApplication, 
1c3f0 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79  CK_NOTIFY notify
1c400 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  , CK_SESSION_HAN
1c410 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73 69 6f  DLE_PTR phSessio
1c420 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n) {..unsigned l
1c430 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  ong idx;..int mu
1c440 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
1c450 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d   found_session =
1c460 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   0;...CACKEY_DEB
1c470 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1c480 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61  d.");...if ((fla
1c490 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f  gs & CKF_SERIAL_
1c4a0 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f  SESSION) != CKF_
1c4b0 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20  SERIAL_SESSION) 
1c4c0 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  {...return(CKR_S
1c4d0 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f  ESSION_PARALLEL_
1c4e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1c4f0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1c500 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1c510 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c520 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1c530 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1c540 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c550 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1c560 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1c570 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
1c580 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
1c590 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1c5a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1c5b0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
1c5c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c5d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1c5e0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1c5f0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
1c600 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
1c610 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
1c620 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
1c630 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
1c640 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1c650 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1c660 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1c670 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1c680 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1c690 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c6a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1c6b0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1c6c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c6d0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1c6e0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1c6f0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
1c700 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
1c710 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c720 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1c730 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1c740 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
1c750 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
1c760 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
1c770 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1c780 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1c790 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
1c7a0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
1c7b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65  LID);..}.../* Ve
1c7c0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 61  rify that the ca
1c7d0 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69  rd is actually i
1c7e0 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09  n the slot. */..
1c7f0 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 74 6f  /* XXX: Check to
1c800 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   make sure this 
1c810 69 73 20 69 6e 20 74 68 65 20 50 4b 43 53 23 31  is in the PKCS#1
1c820 31 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  1 specification 
1c830 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74  */..if (cackey_t
1c840 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61  oken_present(&ca
1c850 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1c860 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  D]) != CACKEY_PC
1c870 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
1c880 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
1c890 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c8a0 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65  r.  Card not pre
1c8b0 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  sent.  Returning
1c8c0 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f   CKR_DEVICE_REMO
1c8d0 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79  VED");....cackey
1c8e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1c8f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1c900 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56  ..return(CKR_DEV
1c910 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d  ICE_REMOVED);..}
1c920 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b  ...for (idx = 1;
1c930 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
1c940 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1c950 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1c960 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
1c970 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63  dx++) {...if (!c
1c980 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1c990 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
1c9a0 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d  .found_session =
1c9b0 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69   1;.....*phSessi
1c9c0 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61  on = idx;.....ca
1c9d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1c9e0 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  x].active = 1;..
1c9f0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1ca00 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20  s[idx].slotID = 
1ca10 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65  slotID;....cacke
1ca20 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1ca30 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50  state = CKS_RO_P
1ca40 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09  UBLIC_SESSION;..
1ca50 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1ca60 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66  s[idx].flags = f
1ca70 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f  lags;....cackey_
1ca80 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c  sessions[idx].ul
1ca90 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b  DeviceError = 0;
1caa0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
1cab0 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63  ons[idx].pApplic
1cac0 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61  ation = pApplica
1cad0 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f  tion;....cackey_
1cae0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f  sessions[idx].No
1caf0 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a  tify = notify;..
1cb00 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1cb10 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
1cb20 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61  es = NULL;....ca
1cb30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1cb40 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  x].identities_co
1cb50 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  unt = 0;.....cac
1cb60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1cb70 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
1cb80 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
1cb90 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69  sessions[idx].si
1cba0 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  gn_active = 0;..
1cbb0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1cbc0 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f  ns[idx].decrypt_
1cbd0 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
1cbe0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1cbf0 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  idx].identities 
1cc00 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64  = cackey_read_id
1cc10 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79  entities(&cackey
1cc20 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
1cc30 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
1cc40 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
1cc50 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72  _count);......br
1cc60 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  eak;...}..}...mu
1cc70 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1cc80 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1cc90 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1cca0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1ccb0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1ccc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ccd0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1cce0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1ccf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1cd00 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1cd10 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 65  ...if (!found_se
1cd20 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45  ssion) {...CACKE
1cd30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cd40 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45  Returning CKR_SE
1cd50 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29  SSION_COUNT (%i)
1cd60 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  ", CKR_SESSION_C
1cd70 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e  OUNT);....return
1cd80 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55  (CKR_SESSION_COU
1cd90 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  NT);..}...CACKEY
1cda0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1cdb0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1cdc0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1cdd0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1cde0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1cdf0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1ce00 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 43  _CloseSession)(C
1ce10 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1ce20 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e   hSession) {..in
1ce30 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1ce40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ce50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1ce60 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1ce70 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1ce80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ce90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1cea0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1ceb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1cec0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1ced0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1cee0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1cef0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1cf00 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1cf10 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1cf20 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1cf30 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1cf40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cf50 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1cf60 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1cf70 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1cf80 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1cf90 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1cfa0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1cfb0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1cfc0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1cfd0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1cfe0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1cff0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d000 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1d010 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1d020 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1d030 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1d040 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1d050 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1d060 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
1d070 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1d080 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1d090 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1d0a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d0b0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
1d0c0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1d0d0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1d0e0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1d0f0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
1d100 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1d110 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 63 61  .active = 0;..ca
1d120 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
1d130 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73  ties(cackey_sess
1d140 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1d150 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65  dentities, cacke
1d160 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1d170 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
1d180 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f  count);...mutex_
1d190 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1d1a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1d1b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1d1c0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1d1d0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1d1e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d1f0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1d200 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1d210 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1d220 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
1d230 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d240 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1d250 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1d260 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1d270 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1d280 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1d290 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65  RV, C_CloseAllSe
1d2a0 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f  ssions)(CK_SLOT_
1d2b0 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69  ID slotID) {..ui
1d2c0 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74  nt32_t idx;..int
1d2d0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
1d2e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d2f0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1d300 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1d310 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1d320 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d330 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1d340 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1d350 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1d360 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1d370 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1d380 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
1d390 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
1d3a0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1d3b0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1d3c0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
1d3d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d3e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1d3f0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1d400 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
1d410 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
1d420 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1d430 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
1d440 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
1d450 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1d460 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1d470 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1d480 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1d490 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1d4a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d4b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1d4c0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1d4d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1d4e0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1d4f0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1d500 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
1d510 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
1d520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d530 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
1d540 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
1d550 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
1d560 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
1d570 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
1d580 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1d590 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1d5a0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
1d5b0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
1d5c0 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  D);..}...for (id
1d5d0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
1d5e0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1d5f0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1d600 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1d610 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
1d620 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
1d630 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ons[idx].active)
1d640 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79   {....if (cackey
1d650 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
1d660 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44 29  lotID != slotID)
1d670 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
1d680 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
1d690 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1d6a0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1d6b0 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ..C_CloseSession
1d6c0 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65 79  (idx);....cackey
1d6d0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1d6e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d  ey_biglock);...}
1d6f0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1d700 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1d710 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1d720 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1d730 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1d740 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d750 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d760 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1d770 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1d780 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1d790 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1d7a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d7b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1d7c0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1d7d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1d7e0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1d7f0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1d800 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
1d810 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1d820 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1d830 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54  _SESSION_INFO_PT
1d840 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20  R pInfo) {..int 
1d850 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
1d860 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d870 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1d880 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
1d890 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1d8a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d8b0 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
1d8c0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1d8d0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1d8e0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
1d8f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1d900 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1d910 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d920 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1d930 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1d940 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1d950 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1d960 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
1d970 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
1d980 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
1d990 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1d9a0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1d9b0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
1d9c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d9d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1d9e0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
1d9f0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
1da00 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1da10 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1da20 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1da30 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1da40 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1da50 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1da60 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1da70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1da80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1da90 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1daa0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1dab0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1dac0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1dad0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1dae0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
1daf0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1db00 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1db10 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1db20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1db30 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1db40 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1db50 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1db60 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1db70 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  VALID);..}...pIn
1db80 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63  fo->slotID = cac
1db90 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1dba0 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09  ssion].slotID;..
1dbb0 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63  pInfo->state = c
1dbc0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1dbd0 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a  Session].state;.
1dbe0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
1dbf0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1dc00 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b  hSession].flags;
1dc10 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63  ..pInfo->ulDevic
1dc20 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f  eError = cackey_
1dc30 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1dc40 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  n].ulDeviceError
1dc50 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
1dc60 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1dc70 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1dc80 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1dc90 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1dca0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1dcb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1dcc0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1dcd0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1dce0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1dcf0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1dd00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1dd10 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1dd20 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1dd30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1dd40 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1dd50 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1dd60 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  GetOperationStat
1dd70 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
1dd80 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1dd90 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72  K_BYTE_PTR pOper
1dda0 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55  ationState, CK_U
1ddb0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65 72  LONG_PTR pulOper
1ddc0 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b  ationStateLen) {
1ddd0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1dde0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1ddf0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1de00 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1de10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1de20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1de30 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1de40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1de50 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1de60 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1de70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1de80 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1de90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1dea0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1deb0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1dec0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1ded0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1dee0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1def0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
1df00 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1df10 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_SetOperationS
1df20 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tate)(CK_SESSION
1df30 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1df40 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f  , CK_BYTE_PTR pO
1df50 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43  perationState, C
1df60 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74  K_ULONG ulOperat
1df70 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f  ionStateLen, CK_
1df80 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 45  OBJECT_HANDLE hE
1df90 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b  ncryptionKey, CK
1dfa0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
1dfb0 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65  AuthenticationKe
1dfc0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
1dfd0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1dfe0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1dff0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1e000 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e010 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e020 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1e030 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1e040 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1e050 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1e060 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1e070 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1e080 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1e090 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1e0a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1e0b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1e0c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1e0d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1e0e0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1e0f0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1e100 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b  _RV, C_Login)(CK
1e110 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1e120 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45  hSession, CK_USE
1e130 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c  R_TYPE userType,
1e140 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
1e150 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
1e160 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f  ulPinLen) {..CK_
1e170 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
1e180 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1e190 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65  l;..int tries_re
1e1a0 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f  maining;..int lo
1e1b0 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  gin_ret;...CACKE
1e1c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e1d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1e1e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1e1f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1e200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e210 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1e220 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1e230 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1e240 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1e250 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1e260 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1e270 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1e280 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1e290 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1e2a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1e2b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e2c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e2d0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1e2e0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1e2f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1e300 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1e310 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73  ID);..}...if (us
1e320 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53  erType != CKU_US
1e330 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ER) {...CACKEY_D
1e340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e350 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70  or.  We only sup
1e360 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20  port USER mode, 
1e370 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f  asked for %lu mo
1e380 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  de.", (unsigned 
1e390 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a  long) userType).
1e3a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53  ...return(CKR_US
1e3b0 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29  ER_TYPE_INVALID)
1e3c0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1e3d0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1e3e0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1e3f0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1e400 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1e410 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e420 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e430 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1e440 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1e450 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1e460 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1e470 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1e480 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
1e490 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1e4a0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1e4b0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1e4c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e4d0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1e4e0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1e4f0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1e500 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1e510 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  VALID);..}...slo
1e520 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
1e530 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1e540 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
1e550 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
1e560 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
1e570 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1e580 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1e590 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1e5a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e5b0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1e5c0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1e5d0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
1e5e0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
1e5f0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
1e600 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1e610 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
1e620 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1e630 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
1e640 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e650 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e660 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1e670 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
1e680 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
1e690 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
1e6a0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
1e6b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1e6c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
1e6d0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1e6e0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c  L_ERROR);..}...l
1e6f0 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  ogin_ret = cacke
1e700 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f  y_login(&cackey_
1e710 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70  slots[slotID], p
1e720 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26  Pin, ulPinLen, &
1e730 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29  tries_remaining)
1e740 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74  ;..if (login_ret
1e750 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
1e760 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b 65 79  S_OK) {...cackey
1e770 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1e780 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1e790 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20  ..if (login_ret 
1e7a0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
1e7b0 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41  _LOCKED) {....CA
1e7c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e7d0 46 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e  F("Error.  Token
1e7e0 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a   is locked.");..
1e7f0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1e800 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
1e810 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f  ags |= CKF_USER_
1e820 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09  PIN_LOCKED;.....
1e830 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c  return(CKR_PIN_L
1e840 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65  OCKED);...} else
1e850 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d   if (login_ret =
1e860 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
1e870 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43  BADPIN) {....CAC
1e880 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e890 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69  ("Error.  Invali
1e8a0 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61  d PIN.");.....ca
1e8b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1e8c0 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c  D].token_flags |
1e8d0 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43  = CKF_USER_PIN_C
1e8e0 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66  OUNT_LOW;.....if
1e8f0 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e   (tries_remainin
1e900 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61  g == 1) {.....ca
1e910 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1e920 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c  D].token_flags |
1e930 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46  = CKF_USER_PIN_F
1e940 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a  INAL_TRY;....}..
1e950 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
1e960 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09  N_INCORRECT);...
1e970 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
1e980 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e990 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20    Unknown error 
1e9a0 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61  returned from ca
1e9b0 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69  ckey_login() (%i
1e9c0 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a  )", login_ret);.
1e9d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1e9e0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1e9f0 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1ea00 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
1ea10 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45  ags &= ~(CKF_USE
1ea20 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43  R_PIN_LOCKED | C
1ea30 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
1ea40 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49  T_LOW | CKF_LOGI
1ea50 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46  N_REQUIRED | CKF
1ea60 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f  _USER_PIN_FINAL_
1ea70 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73  TRY);...cackey_s
1ea80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ea90 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
1eaa0 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b  _USER_FUNCTIONS;
1eab0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1eac0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1ead0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1eae0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1eaf0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1eb00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1eb10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1eb20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1eb30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1eb40 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1eb50 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1eb60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1eb70 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1eb80 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1eb90 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1eba0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1ebb0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c  CTION(CK_RV, C_L
1ebc0 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f  ogout)(CK_SESSIO
1ebd0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1ebe0 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  n) {..CK_SLOT_ID
1ebf0 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75   slotID;..int mu
1ec00 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
1ec10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ec20 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1ec30 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1ec40 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1ec50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ec60 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1ec70 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1ec80 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1ec90 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1eca0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1ecb0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
1ecc0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
1ecd0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1ece0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1ecf0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1ed00 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1ed10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ed20 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
1ed30 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
1ed40 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1ed50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1ed60 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1ed70 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1ed80 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1ed90 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1eda0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1edb0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1edc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1edd0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1ede0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1edf0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1ee00 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1ee10 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1ee20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
1ee30 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1ee40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1ee50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1ee60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ee70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1ee80 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
1ee90 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1eea0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1eeb0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1eec0 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
1eed0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1eee0 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
1eef0 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
1ef00 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
1ef10 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1ef20 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1ef30 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
1ef40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ef50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1ef60 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1ef70 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
1ef80 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
1ef90 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
1efa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1efb0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1efc0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1efd0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
1efe0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
1eff0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f000 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1f010 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1f020 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
1f030 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
1f040 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
1f050 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1f060 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1f070 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f080 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1f090 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
1f0a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1f0b0 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55  tate = CKS_RO_PU
1f0c0 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 63  BLIC_SESSION;..c
1f0d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1f0e0 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
1f0f0 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
1f100 49 52 45 44 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  IRED;...mutex_re
1f110 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1f120 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1f130 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1f140 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1f150 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1f160 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f170 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1f180 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1f190 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1f1a0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1f1b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f1c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1f1d0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1f1e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1f1f0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1f200 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1f210 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74  , C_CreateObject
1f220 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1f230 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1f240 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
1f250 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
1f260 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f  NG ulCount, CK_O
1f270 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
1f280 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41   phObject) {..CA
1f290 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f2a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1f2b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1f2c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1f2d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f2e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1f2f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1f300 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1f310 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1f320 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1f330 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f340 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1f350 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1f360 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1f370 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f380 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1f390 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1f3a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1f3b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1f3c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
1f3d0 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  opyObject)(CK_SE
1f3e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1f3f0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
1f400 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
1f410 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
1f420 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
1f430 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
1f440 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
1f450 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29  PTR phNewObject)
1f460 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1f470 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1f480 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1f490 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1f4a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f4b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f4c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1f4d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f4e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1f4f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1f500 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f510 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1f520 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1f530 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1f540 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1f550 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1f560 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1f570 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1f580 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1f590 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1f5a0 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  V, C_DestroyObje
1f5b0 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
1f5c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1f5d0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1f5e0 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43   hObject) {..CAC
1f5f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f600 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1f610 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1f620 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1f630 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f640 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1f650 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1f660 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1f670 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1f680 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1f690 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f6a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1f6b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1f6c0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1f6d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1f6e0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1f6f0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1f700 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1f710 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1f720 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1f730 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f  tObjectSize)(CK_
1f740 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1f750 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
1f760 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
1f770 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
1f780 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b  pulSize) {..CACK
1f790 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f7a0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1f7b0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1f7c0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1f7d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f7e0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1f7f0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1f800 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1f810 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1f820 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1f830 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1f840 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1f850 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1f860 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1f870 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1f880 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1f890 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1f8a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1f8b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1f8c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1f8d0 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28  AttributeValue)(
1f8e0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1f8f0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
1f900 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
1f910 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ject, CK_ATTRIBU
1f920 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
1f930 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
1f940 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42  nt) {..CK_ATTRIB
1f950 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
1f960 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
1f970 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
1f980 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y;..unsigned lon
1f990 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20  g identity_idx, 
1f9a0 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61  attr_idx, sess_a
1f9b0 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73  ttr_idx, num_ids
1f9c0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1f9d0 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  val;..CK_RV retv
1f9e0 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b  al = CKR_OK;..CK
1f9f0 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65  _VOID_PTR pValue
1fa00 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61  ;..CK_ULONG ulVa
1fa10 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59  lueLen;...CACKEY
1fa20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1fa30 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1fa40 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1fa50 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1fa60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1fa70 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1fa80 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1fa90 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1faa0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1fab0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
1fac0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
1fad0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
1fae0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1faf0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1fb00 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
1fb10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fb20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fb30 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
1fb40 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1fb50 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1fb60 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1fb70 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62  D);..}...if (hOb
1fb80 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43  ject == 0) {...C
1fb90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fba0 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
1fbb0 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
1fbc0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1fbd0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43  return(CKR_OBJEC
1fbe0 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  T_HANDLE_INVALID
1fbf0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f  );..}...if (ulCo
1fc00 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  unt == 0) {.../*
1fc10 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20   Short circuit, 
1fc20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20  if zero objects 
1fc30 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72  were specified r
1fc40 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73  eturn zero items
1fc50 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
1fc60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fc70 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1fc80 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
1fc90 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
1fca0 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
1fcb0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
1fcc0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d  if (pTemplate ==
1fcd0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1fce0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fcf0 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74  Error.  pTemplat
1fd00 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  e is NULL.");...
1fd10 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1fd20 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1fd30 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20  .identity_idx = 
1fd40 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d  hObject - 1;...m
1fd50 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1fd60 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1fd70 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1fd80 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1fd90 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1fda0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fdb0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1fdc0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1fdd0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1fde0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1fdf0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1fe00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
1fe10 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1fe20 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1fe30 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1fe40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fe50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1fe60 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
1fe70 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1fe80 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1fe90 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1fea0 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63  .}...num_ids = c
1feb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1fec0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1fed0 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20  ies_count;...if 
1fee0 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d  (identity_idx >=
1fef0 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61   num_ids) {...ca
1ff00 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1ff10 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1ff20 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1ff30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ff40 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65  .  Object handle
1ff50 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
1ff60 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25  identity_idx = %
1ff70 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c  lu, num_ids = %l
1ff80 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u.", (unsigned l
1ff90 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64  ong) identity_id
1ffa0 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x, (unsigned lon
1ffb0 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09  g) num_ids);....
1ffc0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43  return(CKR_OBJEC
1ffd0 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  T_HANDLE_INVALID
1ffe0 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79  );..}...identity
1fff0 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
20000 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
20010 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74  entities[identit
20020 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61  y_idx];...for (a
20030 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74  ttr_idx = 0; att
20040 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b  r_idx < ulCount;
20050 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09   attr_idx++) {..
20060 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54  .curr_attr = &pT
20070 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78  emplate[attr_idx
20080 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e  ];....pValue = N
20090 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65  ULL;...ulValueLe
200a0 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
200b0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
200c0 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e  G_PRINTF("Lookin
200d0 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20  g for attribute 
200e0 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74  0x%08lx (identit
200f0 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e  y:%lu) ...", (un
20100 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
20110 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75  r_attr->type, (u
20120 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
20130 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09  entity_idx);....
20140 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69  for (sess_attr_i
20150 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74  dx = 0; sess_att
20160 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79  r_idx < identity
20170 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ->attributes_cou
20180 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64  nt; sess_attr_id
20190 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64  x++) {....if (id
201a0 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
201b0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
201c0 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61  ].type == curr_a
201d0 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09  ttr->type) {....
201e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
201f0 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64  INTF(" ... found
20200 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70   it, pValue = %p
20210 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25  , ulValueLen = %
20220 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61  lu", identity->a
20230 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
20240 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c  ttr_idx].pValue,
20250 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
20260 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
20270 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
20280 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75  ;..........pValu
20290 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  e = identity->at
202a0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
202b0 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a  tr_idx].pValue;.
202c0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
202d0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
202e0 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
202f0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b  idx].ulValueLen;
20300 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
20310 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
20320 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a  ue && pValue) {.
20330 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
20340 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20  ->ulValueLen >= 
20350 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
20360 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74  ..memcpy(curr_at
20370 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c  tr->pValue, pVal
20380 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ue, ulValueLen);
20390 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
203a0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
203b0 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09  K_LONG) -1;.....
203c0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  .retval = CKR_BU
203d0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a  FFER_TOO_SMALL;.
203e0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72  ...}...}....curr
203f0 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
20400 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  n = ulValueLen;.
20410 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
20420 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
20430 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
20440 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
20450 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
20460 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20470 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20480 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
20490 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
204a0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
204b0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  OR);..}...if (re
204c0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52  tval == CKR_ATTR
204d0 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c  IBUTE_TYPE_INVAL
204e0 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ID) {...CACKEY_D
204f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20500 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49  urning CKR_ATTRI
20510 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
20520 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  D (%i)", (int) r
20530 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
20540 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
20550 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
20560 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
20570 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20580 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45  urning CKR_BUFFE
20590 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29  R_TOO_SMALL (%i)
205a0 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
205b0 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65  ;..} else if (re
205c0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20  tval == CKR_OK) 
205d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
205e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
205f0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
20600 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
20610 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b  .} else {...CACK
20620 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20630 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
20640 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
20650 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
20660 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  l);.}..CK_DEFINE
20670 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
20680 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56   C_SetAttributeV
20690 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  alue)(CK_SESSION
206a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
206b0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
206c0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
206d0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
206e0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
206f0 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43   ulCount) {..CAC
20700 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20710 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
20720 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
20730 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
20740 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20750 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
20760 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
20770 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
20780 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
20790 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
207a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
207b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
207c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
207d0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
207e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
207f0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
20800 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
20810 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
20820 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
20830 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
20840 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43  ndObjectsInit)(C
20850 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
20860 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54   hSession, CK_AT
20870 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
20880 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
20890 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53  ulCount) {..CK_S
208a0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
208b0 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69  CK_ULONG idx;..i
208c0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
208d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
208e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
208f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
20900 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
20910 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20920 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
20930 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
20940 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20950 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
20960 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
20970 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
20980 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
20990 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
209a0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
209b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
209c0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
209d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
209e0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
209f0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
20a00 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
20a10 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
20a20 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
20a30 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
20a40 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
20a50 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20a60 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
20a70 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
20a80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20a90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
20aa0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
20ab0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
20ac0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
20ad0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
20ae0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
20af0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
20b00 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
20b10 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
20b20 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
20b30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20b40 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
20b50 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
20b60 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
20b70 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
20b80 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
20b90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20ba0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
20bb0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
20bc0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
20bd0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
20be0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20bf0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
20c00 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74  arch already act
20c10 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
20c20 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
20c30 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
20c40 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
20c50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20c60 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
20c70 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
20c80 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
20c90 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
20ca0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
20cb0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
20cc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20cd0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
20ce0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
20cf0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
20d00 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
20d10 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
20d20 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
20d30 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
20d40 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
20d50 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
20d60 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
20d70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20d80 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
20d90 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
20da0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
20db0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
20dc0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
20dd0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
20de0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
20df0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
20e00 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
20e10 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
20e20 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f  ts[slotID].slot_
20e30 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45  reset) {...CACKE
20e40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20e50 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65  The slot has bee
20e60 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65  n reset since we
20e70 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72   last looked for
20e80 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72   identities -- r
20e90 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09  escanning");....
20ea0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
20eb0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
20ec0 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
20ed0 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  ) {....cackey_fr
20ee0 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61  ee_identities(ca
20ef0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20f00 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
20f10 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  es, cackey_sessi
20f20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
20f30 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
20f40 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
20f50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
20f60 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c  dentities = NULL
20f70 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
20f80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
20f90 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
20fa0 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  = 0;...}....if (
20fb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
20fc0 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55  tID].label != NU
20fd0 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  LL) {....free(ca
20fe0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
20ff0 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61  D].label);....ca
21000 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
21010 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  D].label = NULL;
21020 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ...}....cackey_m
21030 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26  ark_slot_reset(&
21040 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
21050 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f  tID]);...cackey_
21060 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c  slots[slotID].sl
21070 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d  ot_reset = 0;..}
21080 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
21090 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
210a0 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e  .identities == N
210b0 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
210c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
210d0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20  n].identities = 
210e0 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e  cackey_read_iden
210f0 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73  tities(&cackey_s
21100 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63  lots[slotID], &c
21110 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21120 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
21130 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a  ies_count);..}..
21140 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21  .if (pTemplate !
21150 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
21160 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
21170 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
21180 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
21190 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
211a0 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61  = ulCount;....ca
211b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
211c0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
211d0 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c  uery = malloc(ul
211e0 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  Count * sizeof(*
211f0 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09  pTemplate));....
21200 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
21210 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21220 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20  ].search_query, 
21230 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75  pTemplate, ulCou
21240 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
21250 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72  mplate));....for
21260 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
21270 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29   ulCount; idx++)
21280 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70   {.....if (pTemp
21290 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75  late[idx].ulValu
212a0 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09  eLen == 0) {....
212b0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
212c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
212d0 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
212e0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  alue = NULL;....
212f0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
21300 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  .}......cackey_s
21310 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21320 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
21330 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c  dx].pValue = mal
21340 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64  loc(pTemplate[id
21350 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
21360 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
21370 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21380 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
21390 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09  idx].pValue) {..
213a0 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
213b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
213c0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
213d0 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70  y[idx].pValue, p
213e0 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56  Template[idx].pV
213f0 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b  alue, pTemplate[
21400 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
21410 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d  ;.....}....}...}
21420 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65   else {....cacke
21430 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
21440 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
21450 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09  y_count = 0;....
21460 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21470 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
21480 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09  _query = NULL;..
21490 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
214a0 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29  f (ulCount != 0)
214b0 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74   {....cackey_mut
214c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
214d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43  _biglock);.....C
214e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
214f0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
21500 63 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69  ch query specifi
21510 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20  ed as NULL, but 
21520 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20  number of query 
21530 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66  terms not specif
21540 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09  ied as 0.");....
21550 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
21560 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a  MENTS_BAD);...}.
21570 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
21580 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
21590 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
215a0 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65  = 0;...cackey_se
215b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
215c0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
215d0 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  NULL;..}...cacke
215e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
215f0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
21600 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f  ve = 1;..cackey_
21610 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21620 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
21630 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72  d = 0;...mutex_r
21640 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
21650 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21660 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
21670 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
21680 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
21690 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
216a0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
216b0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
216c0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
216d0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
216e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
216f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21700 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
21710 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
21720 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  _OK);.}..static 
21730 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31  int cackey_pkcs1
21740 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62  1_compare_attrib
21750 75 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54  utes(CK_ATTRIBUT
21760 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55  E *a, CK_ATTRIBU
21770 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e  TE *b) {..unsign
21780 65 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75  ed char *smallbu
21790 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73  f, *largebuf;..s
217a0 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c  ize_t smallbuf_l
217b0 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e  en, largebuf_len
217c0 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20  ;...if (a->type 
217d0 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09  != b->type) {...
217e0 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09  return(0);..}...
217f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21800 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75  NTF("    ... fou
21810 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65  nd matching type
21820 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59   ...");...CACKEY
21830 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
21840 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c  "    ... our val
21850 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c  ue:", a->pValue,
21860 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b   a->ulValueLen);
21870 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65  ...if (b->pValue
21880 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
21890 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
218a0 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
218b0 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74  und wildcard mat
218c0 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ch");....return(
218d0 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e  1);..}...if (a->
218e0 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20  pValue == NULL) 
218f0 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  {...return(0);..
21900 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61  }.. .if (b->ulVa
21910 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56  lueLen == a->ulV
21920 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d  alueLen && memcm
21930 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e  p(a->pValue, b->
21940 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c  pValue, b->ulVal
21950 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09  ueLen) == 0) {..
21960 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21970 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e  INTF("       ...
21980 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74   found exact mat
21990 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ch");....return(
219a0 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  1);..}...switch 
219b0 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61  (a->type) {...ca
219c0 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a  se CKA_MODULUS:.
219d0 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75  ...if (a->ulValu
219e0 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c  eLen == b->ulVal
219f0 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65  ueLen) {.....bre
21a00 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ak;....}.....if 
21a10 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e  (a->ulValueLen >
21a20 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
21a30 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d  {.....smallbuf =
21a40 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   b->pValue;.....
21a50 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62  smallbuf_len = b
21a60 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  ->ulValueLen;...
21a70 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d  ...largebuf = a-
21a80 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72  >pValue;.....lar
21a90 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75  gebuf_len = a->u
21aa0 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20  lValueLen;....} 
21ab0 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c  else {.....small
21ac0 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b  buf = a->pValue;
21ad0 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65  .....smallbuf_le
21ae0 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = a->ulValueLe
21af0 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66  n;......largebuf
21b00 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = b->pValue;...
21b10 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d  ..largebuf_len =
21b20 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   b->ulValueLen;.
21b30 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20  ...}.....for (; 
21b40 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20  largebuf_len != 
21b50 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61  smallbuf_len; la
21b60 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75  rgebuf++,largebu
21b70 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69  f_len--) {.....i
21b80 66 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21  f (largebuf[0] !
21b90 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 0) {......brea
21ba0 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  k;.....}....}...
21bb0 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c  ..if (largebuf_l
21bc0 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c  en != smallbuf_l
21bd0 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  en) {.....break;
21be0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65  ....}.....if (me
21bf0 6d 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73  mcmp(largebuf, s
21c00 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75  mallbuf, smallbu
21c10 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09  f_len) == 0) {..
21c20 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21c30 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
21c40 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69  .. found approxi
21c50 6d 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09  mate match");...
21c60 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09  ...return(1);...
21c70 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
21c80 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
21c90 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
21ca0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
21cb0 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53  dObjects)(CK_SES
21cc0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
21cd0 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
21ce0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a  HANDLE_PTR phObj
21cf0 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ect, CK_ULONG ul
21d00 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20  MaxObjectCount, 
21d10 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
21d20 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09  ObjectCount) {..
21d30 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
21d40 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b  entity *curr_id;
21d50 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
21d60 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55  curr_attr;..CK_U
21d70 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78  LONG curr_id_idx
21d80 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  , curr_out_id_id
21d90 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78  x, curr_attr_idx
21da0 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b  , sess_attr_idx;
21db0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68  ..CK_ULONG match
21dc0 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d  ed_count, prev_m
21dd0 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69  atched_count;..i
21de0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
21df0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21e00 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
21e10 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
21e20 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
21e30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21e40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
21e50 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
21e60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21e70 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
21e80 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
21e90 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f  .if (pulObjectCo
21ea0 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  unt == NULL) {..
21eb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21ec0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75  INTF("Error.  pu
21ed0 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 73 20  lObjectCount is 
21ee0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
21ef0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
21f00 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
21f10 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c  phObject == NULL
21f20 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43   && ulMaxObjectC
21f30 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  ount == 0) {.../
21f40 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c  * Short circuit,
21f50 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73   if zero objects
21f60 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20   were specified 
21f70 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d  return zero item
21f80 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f  s immediately */
21f90 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75  ...*pulObjectCou
21fa0 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45  nt = 0;....CACKE
21fb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21fc0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
21fd0 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
21fe0 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
21ff0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
22000 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f  K);..}...if (phO
22010 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  bject == NULL) {
22020 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22030 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22040 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c  phObject is NULL
22050 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22060 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
22070 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61  );..}...if (ulMa
22080 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20  xObjectCount == 
22090 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
220a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
220b0 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62  r.  Maximum numb
220c0 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 73 70  er of objects sp
220d0 65 63 69 66 69 65 64 20 61 73 20 7a 65 72 6f 2e  ecified as zero.
220e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
220f0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
22100 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
22110 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
22120 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
22130 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
22140 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
22150 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
22160 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22170 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22180 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
22190 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
221a0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
221b0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
221c0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
221d0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
221e0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
221f0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
22200 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
22210 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22220 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22230 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
22240 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22250 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
22260 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
22270 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
22280 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
22290 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
222a0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
222b0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
222c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
222d0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
222e0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
222f0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
22300 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
22310 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
22320 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
22330 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
22340 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  rch_active) {...
22350 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
22360 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22370 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
22380 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22390 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20  or.  Search not 
223a0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
223b0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
223c0 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
223d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 75 72 72  IZED);..}...curr
223e0 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b  _out_id_idx = 0;
223f0 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69  ..for (curr_id_i
22400 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  dx = cackey_sess
22410 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22420 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63  earch_curr_id; c
22430 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63  urr_id_idx < cac
22440 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22450 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
22460 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78  s_count && ulMax
22470 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72  ObjectCount; cur
22480 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  r_id_idx++) {...
22490 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65  curr_id = &cacke
224a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
224b0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
224c0 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09  curr_id_idx];...
224d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
224e0 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67  INTF("Processing
224f0 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20   identity:%lu", 
22500 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
22510 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09  curr_id_idx);...
22520 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  .matched_count =
22530 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72   0;....for (curr
22540 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63  _attr_idx = 0; c
22550 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63  urr_attr_idx < c
22560 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22570 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
22580 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72  query_count; cur
22590 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  r_attr_idx++) {.
225a0 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  ...prev_matched_
225b0 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f  count = matched_
225c0 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f  count;.....curr_
225d0 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73  attr = &cackey_s
225e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
225f0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63  ].search_query[c
22600 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  urr_attr_idx];..
22610 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22620 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69  PRINTF("  Checki
22630 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65  ng for attribute
22640 20 25 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e   %s (0x%08lx) in
22650 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22   identity:%i..."
22660 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
22670 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
22680 5f 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e  _STR(curr_attr->
22690 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64  type), (unsigned
226a0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
226b0 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75  ->type, (int) cu
226c0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43  rr_id_idx);....C
226d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
226e0 54 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20  TBUF("    Value 
226f0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63  looking for:", c
22700 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
22710 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56  , curr_attr->ulV
22720 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f  alueLen);.....fo
22730 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78  r (sess_attr_idx
22740 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f   = 0; sess_attr_
22750 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61  idx < curr_id->a
22760 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
22770 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b   sess_attr_idx++
22780 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b  ) {.....if (cack
22790 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72  ey_pkcs11_compar
227a0 65 5f 61 74 74 72 69 62 75 74 65 73 28 26 63 75  e_attributes(&cu
227b0 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
227c0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
227d0 2c 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a  , curr_attr)) {.
227e0 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75  .....matched_cou
227f0 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61  nt++;.......brea
22800 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  k;.....}....}...
22810 09 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72  ../* If the attr
22820 69 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20  ibute could not 
22830 62 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e  be matched, do n
22840 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  ot try to match 
22850 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69  additional attri
22860 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28  butes */....if (
22870 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
22880 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f  nt == matched_co
22890 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  unt) {.....break
228a0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
228b0 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20   (matched_count 
228c0 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  == cackey_sessio
228d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
228e0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29  rch_query_count)
228f0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
22900 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
22910 20 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74   All %i attribut
22920 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66  es checked for f
22930 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65  ound, adding ide
22940 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75  ntity:%i to retu
22950 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74  rned list", (int
22960 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
22970 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
22980 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20  ch_query_count, 
22990 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
229a0 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74  x);.....phObject
229b0 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  [curr_out_id_idx
229c0 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20  ] = curr_id_idx 
229d0 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62  + 1;.....ulMaxOb
229e0 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09  jectCount--;....
229f0 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  .curr_out_id_idx
22a00 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ++;...} else {..
22a10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22a20 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74  RINTF("  ... Not
22a30 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f   all %i (only fo
22a40 75 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74  und %i) attribut
22a50 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66  es checked for f
22a60 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67  ound, not adding
22a70 20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28   identity:%i", (
22a80 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73  int) cackey_sess
22a90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22aa0 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
22ab0 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64  t, (int) matched
22ac0 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75  _count, (int) cu
22ad0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a  rr_id_idx);...}.
22ae0 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  .}..cackey_sessi
22af0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
22b00 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63  arch_curr_id = c
22b10 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75  urr_id_idx;..*pu
22b20 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63  lObjectCount = c
22b30 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a  urr_out_id_idx;.
22b40 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
22b50 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
22b60 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22b70 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
22b80 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
22b90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22ba0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
22bb0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
22bc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22bd0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
22be0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
22bf0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
22c00 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
22c10 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d  ), num objects =
22c20 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a   %lu", CKR_OK, *
22c30 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b  pulObjectCount);
22c40 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
22c50 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
22c60 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
22c70 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  C_FindObjectsFin
22c80 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
22c90 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
22ca0 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b  {..CK_ULONG idx;
22cb0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
22cc0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
22cd0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
22ce0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
22cf0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
22d00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22d10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22d20 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
22d30 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22d40 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
22d50 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
22d60 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
22d70 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
22d80 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
22d90 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
22da0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
22db0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
22dc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22dd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
22de0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
22df0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
22e00 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
22e10 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
22e20 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
22e30 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
22e40 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
22e50 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
22e60 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
22e70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22e80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22e90 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
22ea0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22eb0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
22ec0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
22ed0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22ee0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
22ef0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
22f00 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22f10 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
22f20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22f30 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
22f40 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
22f50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
22f60 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
22f70 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
22f80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22f90 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
22fa0 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
22fb0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
22fc0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22fd0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
22fe0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22ff0 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74    Search not act
23000 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
23010 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
23020 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
23030 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
23040 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
23050 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
23060 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28 69 64 78   = 0;...for (idx
23070 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 61 63 6b   = 0; idx < cack
23080 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23090 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
230a0 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29  ry_count; idx++)
230b0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
230c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
230d0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
230e0 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09  idx].pValue) {..
230f0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65  ..free(cackey_se
23100 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23110 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
23120 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09 09 7d 0a  x].pValue);...}.
23130 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
23140 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
23150 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 29  n].search_query)
23160 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
23170 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23180 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
23190 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
231a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
231b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
231c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
231d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
231e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
231f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23200 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
23210 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
23220 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
23230 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
23240 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23250 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
23260 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
23270 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
23280 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
23290 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
232a0 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 29  , C_EncryptInit)
232b0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
232c0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
232d0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
232e0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
232f0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
23300 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
23310 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
23320 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
23330 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
23340 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23350 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23360 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
23370 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
23380 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
23390 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
233a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
233b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
233c0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
233d0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
233e0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
233f0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
23400 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
23410 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23420 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
23430 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
23440 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28 43 4b  V, C_Encrypt)(CK
23450 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
23460 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
23470 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
23480 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
23490 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
234a0 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f  cryptedData, CK_
234b0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
234c0 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29 20 7b  ryptedDataLen) {
234d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
234e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
234f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
23500 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
23510 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23520 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
23530 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
23540 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23550 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
23560 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
23570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23580 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23590 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
235a0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
235b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
235c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
235d0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
235e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
235f0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
23600 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23610 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65   C_EncryptUpdate
23620 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
23630 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
23640 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
23650 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
23660 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
23670 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
23680 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
23690 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
236a0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
236b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
236c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
236d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
236e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
236f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23700 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
23710 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23720 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
23730 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
23740 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
23750 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23760 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
23770 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
23780 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
23790 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
237a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
237b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
237c0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
237d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
237e0 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 46 69  _RV, C_EncryptFi
237f0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
23800 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
23810 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61   CK_BYTE_PTR pLa
23820 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c  stEncryptedPart,
23830 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
23840 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61  lLastEncryptedPa
23850 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
23860 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
23870 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
23880 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
23890 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
238a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
238b0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
238c0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
238d0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
238e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
238f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
23900 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23910 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
23920 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23930 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
23940 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23950 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
23960 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23970 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
23980 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
23990 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
239a0 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  ptInit)(CK_SESSI
239b0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
239c0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
239d0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
239e0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
239f0 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d  E hKey) {..int m
23a00 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68  utex_retval;...h
23a10 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f  Key--;...CACKEY_
23a20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23a30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23a40 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23a50 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23a60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23a70 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23a80 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23a90 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23aa0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23ab0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
23ac0 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b  anism == NULL) {
23ad0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23ae0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
23af0 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c  Mechanism is NUL
23b00 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
23b10 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
23b20 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
23b30 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
23b40 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b  sm != CKM_RSA_PK
23b50 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  CS) {...CACKEY_D
23b60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23b70 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  or. pMechanism->
23b80 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70  mechanism not sp
23b90 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52  ecified as CKM_R
23ba0 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65  SA_PKCS");....re
23bb0 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49  turn(CKR_MECHANI
23bc0 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44  SM_PARAM_INVALID
23bd0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
23be0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
23bf0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
23c00 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
23c10 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
23c20 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
23c30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23c40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23c50 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
23c60 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
23c70 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
23c80 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
23c90 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
23ca0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
23cb0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
23cc0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
23cd0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
23ce0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23cf0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23d00 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
23d10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23d20 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23d30 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
23d40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23d50 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
23d60 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
23d70 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23d80 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
23d90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23da0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
23db0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
23dc0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
23dd0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
23de0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
23df0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
23e00 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
23e10 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09  rypt_active) {..
23e20 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
23e30 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23e40 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
23e50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23e60 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 61 6c  ror.  Decrypt al
23e70 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73  ready in progres
23e80 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  s.");......retur
23e90 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
23ea0 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66  ACTIVE);..}...if
23eb0 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79   (hKey >= cackey
23ec0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23ed0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
23ee0 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  ount) {...cackey
23ef0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
23f00 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
23f10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23f20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b  RINTF("Error.  K
23f30 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ey handle out of
23f40 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65   range (requeste
23f50 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20  d key %lu, only 
23f60 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61  %lu identities a
23f70 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e  vailable).", (un
23f80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65  signed long) hKe
23f90 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y, (unsigned lon
23fa0 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  g) cackey_sessio
23fb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
23fc0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
23fd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45  ...return(CKR_KE
23fe0 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  Y_HANDLE_INVALID
23ff0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
24000 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24010 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
24020 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
24030 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24040 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e  ].decrypt_mechan
24050 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  ism = pMechanism
24060 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63 61  ->mechanism;..ca
24070 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24080 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
24090 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65 63  mech_parm = pMec
240a0 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65 74  hanism->pParamet
240b0 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  er;..cackey_sess
240c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
240d0 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
240e0 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  len = pMechanism
240f0 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c 65 6e  ->ulParameterLen
24100 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
24110 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
24120 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20 3d 20  rypt_identity = 
24130 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
24140 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
24150 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d  ities[hKey];...m
24160 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
24170 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
24180 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
24190 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
241a0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
241b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
241c0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
241d0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
241e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
241f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
24200 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
24210 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24220 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
24230 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
24240 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
24250 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
24260 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
24270 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  pt)(CK_SESSION_H
24280 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
24290 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
242a0 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f 55  ryptedData, CK_U
242b0 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
242c0 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
242d0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
242e0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61  LONG_PTR pulData
242f0 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47  Len) {..CK_ULONG
24300 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 2c   datalen_update,
24310 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a   datalen_final;.
24320 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74 5f 72  .CK_RV decrypt_r
24330 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  et;..int mutex_r
24340 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
24350 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
24360 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
24370 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
24380 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
24390 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
243a0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
243b0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
243c0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
243d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
243e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61  ;..}...if (pulDa
243f0 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  taLen == NULL) {
24400 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24410 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
24420 75 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c  ulDataLen is NUL
24430 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
24440 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
24450 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e  D);..}...datalen
24460 5f 75 70 64 61 74 65 20 3d 20 2a 70 75 6c 44 61  _update = *pulDa
24470 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74  taLen;...decrypt
24480 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74  _ret = C_Decrypt
24490 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c  Update(hSession,
244a0 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c   pEncryptedData,
244b0 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61   ulEncryptedData
244c0 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74  Len, pData, &dat
244d0 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69  alen_update);..i
244e0 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21  f (decrypt_ret !
244f0 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41  = CKR_OK) {...CA
24500 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24510 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
24520 70 74 55 70 64 61 74 65 28 29 20 72 65 74 75 72  ptUpdate() retur
24530 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20  ned failure (rv 
24540 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
24550 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70  ned long) decryp
24560 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 64  t_ret);....if (d
24570 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b  ecrypt_ret != CK
24580 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
24590 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54 65 72 6d  LL) {..../* Term
245a0 69 6e 61 74 65 20 64 65 63 72 79 70 74 69 6f 6e  inate decryption
245b0 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09   operation */...
245c0 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
245d0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
245e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
245f0 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
24600 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
24610 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
24620 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24630 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
24640 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
24650 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
24660 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  R);....}.....if 
24670 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
24680 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
24690 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ve) {.....cackey
246a0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
246b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
246c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
246d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
246e0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
246f0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
24700 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
24710 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
24720 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
24730 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
24740 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
24750 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09  pt_active) {....
24760 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
24770 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
24780 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
24790 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
247a0 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
247b0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
247c0 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
247d0 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
247e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09  NITIALIZED);....
247f0 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  }.....cackey_ses
24800 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
24810 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
24820 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65   0;.....mutex_re
24830 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
24840 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
24850 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69  y_biglock);....i
24860 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
24870 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  != 0) {.....CACK
24880 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24890 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
248a0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
248b0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
248c0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  NERAL_ERROR);...
248d0 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  .}...}....return
248e0 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09  (decrypt_ret);..
248f0 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29 20 7b  }...if (pData) {
24900 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61 74 61  ...pData += data
24910 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a 09  len_update;..}..
24920 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20  datalen_final = 
24930 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64 61  *pulDataLen - da
24940 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a 09  talen_update;...
24950 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f  decrypt_ret = C_
24960 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68 53 65  DecryptFinal(hSe
24970 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26 64  ssion, pData, &d
24980 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09  atalen_final);..
24990 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20  if (decrypt_ret 
249a0 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
249b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
249c0 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
249d0 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74 75 72  yptFinal() retur
249e0 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20  ned failure (rv 
249f0 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
24a00 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70  ned long) decryp
24a10 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  t_ret);....retur
24a20 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  n(decrypt_ret);.
24a30 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65 6e  .}...*pulDataLen
24a40 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74   = datalen_updat
24a50 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61  e + datalen_fina
24a60 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
24a70 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24a80 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
24a90 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
24aa0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
24ab0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
24ac0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
24ad0 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
24ae0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
24af0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
24b00 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
24b10 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
24b20 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
24b30 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
24b40 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
24b50 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 73  pulPartLen) {..s
24b60 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 62 75  tatic CK_BYTE bu
24b70 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a 65  f[16384];..ssize
24b80 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53  _t buflen;..CK_S
24b90 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
24ba0 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43  CK_RV retval = C
24bb0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
24bc0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
24bd0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
24be0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
24bf0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
24c00 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
24c10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24c20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24c30 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
24c40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
24c50 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
24c60 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
24c70 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
24c80 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
24c90 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
24ca0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
24cb0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
24cc0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
24cd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24ce0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
24cf0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
24d00 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
24d10 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
24d20 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
24d30 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79  ..}...if (pEncry
24d40 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  ptedPart == NULL
24d50 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64 50   && ulEncryptedP
24d60 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
24d70 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
24d80 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65  t if we are aske
24d90 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f 74  d to decrypt not
24da0 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43  hing... */...CAC
24db0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24dc0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24dd0 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
24de0 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
24df0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24e00 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
24e10 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d  EncryptedPart ==
24e20 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
24e30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24e40 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74 65  Error. pEncrypte
24e50 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62  dPart is NULL, b
24e60 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  ut ulEncryptedPa
24e70 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22  rtLen is not 0."
24e80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24e90 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
24ea0 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63 72  ..}...if (ulEncr
24eb0 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20  yptedPartLen == 
24ec0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
24ed0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24ee0 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  r. ulEncryptedPa
24ef0 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20  rtLen is 0, but 
24f00 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  pPart is not NUL
24f10 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
24f20 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
24f30 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
24f40 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  PartLen == NULL)
24f50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24f60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24f70 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 4e   pulPartLen is N
24f80 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
24f90 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
24fa0 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
24fb0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24fc0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
24fd0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
24fe0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
24ff0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
25000 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25010 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
25020 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
25030 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
25040 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
25050 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
25060 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
25070 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
25080 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
25090 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
250a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
250b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
250c0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
250d0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
250e0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
250f0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
25100 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
25110 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25120 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
25130 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
25140 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
25150 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
25160 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25170 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
25180 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
25190 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
251a0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
251b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
251c0 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  .slotID = cackey
251d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
251e0 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66  on].slotID;...if
251f0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
25200 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
25210 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
25220 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
25230 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
25240 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25250 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
25260 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
25270 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
25280 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
25290 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
252a0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
252b0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
252c0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
252d0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
252e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
252f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25300 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
25310 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
25320 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
25330 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
25340 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
25350 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25360 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25370 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
25380 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
25390 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65  ...switch (cacke
253a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
253b0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
253c0 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65  hanism) {...case
253d0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
253e0 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f  ../* Ask card to
253f0 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 62   decrypt */....b
25400 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73  uflen = cackey_s
25410 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b  igndecrypt(&cack
25420 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
25430 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
25440 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
25450 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20 70 45  ypt_identity, pE
25460 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 75 6c  ncryptedPart, ul
25470 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
25480 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75  , buf, sizeof(bu
25490 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09 09 69  f), 0, 1);.....i
254a0 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b  f (buflen < 0) {
254b0 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69  ...../* Decrypti
254c0 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09  on failed. */...
254d0 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20  ..if (buflen == 
254e0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
254f0 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09  EDLOGIN) {......
25500 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45  retval = CKR_USE
25510 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b  R_NOT_LOGGED_IN;
25520 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  .....} else if (
25530 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
25540 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
25550 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76  ENT) {......retv
25560 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f  al = CKR_DEVICE_
25570 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65  REMOVED;.....} e
25580 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61  lse {......retva
25590 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
255a0 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09  ERROR;.....}....
255b0 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73  } else if (((uns
255c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c  igned long) bufl
255d0 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c 65  en) > *pulPartLe
255e0 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a 09 09  n && pPart) {...
255f0 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64 20 64  ../* Decrypted d
25600 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f  ata too large */
25610 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
25620 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
25630 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  LL;....} else {.
25640 09 09 09 09 69 66 20 28 70 50 61 72 74 29 20 7b  ....if (pPart) {
25650 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 50 61  ......memcpy(pPa
25660 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29  rt, buf, buflen)
25670 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75  ;.....}......*pu
25680 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c 65  lPartLen = bufle
25690 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  n;......retval =
256a0 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09   CKR_OK;....}...
256b0 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75  ..break;..}...mu
256c0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
256d0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
256e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
256f0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
25700 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
25710 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25720 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
25730 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
25740 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
25750 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
25760 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25770 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
25780 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74  g %i", (int) ret
25790 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
257a0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  etval);.}..CK_DE
257b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
257c0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 46 69  _RV, C_DecryptFi
257d0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
257e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
257f0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61   CK_BYTE_PTR pLa
25800 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  stPart, CK_ULONG
25810 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61 72 74  _PTR pulLastPart
25820 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  Len) {..int mute
25830 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74  x_retval;..int t
25840 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
25850 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 1;...CACKEY_D
25860 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
25870 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
25880 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
25890 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
258a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
258b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
258c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
258d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
258e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
258f0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
25900 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
25910 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
25920 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
25930 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
25940 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
25950 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25960 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25970 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
25980 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
25990 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
259a0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
259b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c 61  ;..}...if (pulLa
259c0 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c  stPartLen == NUL
259d0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
259e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
259f0 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  r. pulLastPartLe
25a00 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
25a10 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
25a20 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
25a30 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
25a40 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
25a50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25a60 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
25a70 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
25a80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25a90 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
25aa0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
25ab0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
25ac0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
25ad0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
25ae0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25af0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
25b00 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
25b10 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25b20 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
25b30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25b40 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
25b50 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
25b60 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
25b70 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
25b80 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
25b90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25ba0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
25bb0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
25bc0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
25bd0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
25be0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25bf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
25c00 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76  ecrypt not activ
25c10 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
25c20 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
25c30 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
25c40 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 50  ;..}...*pulLastP
25c50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 66  artLen = 0;...if
25c60 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d 20 4e   (pLastPart == N
25c70 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e 61  ULL) {...termina
25c80 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30 3b 0a  te_decrypt = 0;.
25c90 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61  .}...if (termina
25ca0 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a 09 09  te_decrypt) {...
25cb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25cc0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
25cd0 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d  t_active = 0;..}
25ce0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
25cf0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
25d00 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25d10 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
25d20 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
25d30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25d40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25d50 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
25d60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
25d70 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25d80 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
25d90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
25da0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
25db0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
25dc0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
25dd0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
25de0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
25df0 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f 53 45  igestInit)(CK_SE
25e00 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
25e10 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
25e20 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
25e30 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  sm) {..CACKEY_DE
25e40 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
25e50 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
25e60 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
25e70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25e80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25e90 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
25ea0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
25eb0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
25ec0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
25ed0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
25ee0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
25ef0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
25f00 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
25f10 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
25f20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
25f30 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
25f40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25f50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
25f60 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
25f70 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 29 28  K_RV, C_Digest)(
25f80 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
25f90 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
25fa0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
25fb0 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
25fc0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
25fd0 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Digest, CK_ULONG
25fe0 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65  _PTR pulDigestLe
25ff0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
26000 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
26010 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
26020 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
26030 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26040 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26050 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
26060 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
26070 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
26080 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
26090 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
260a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
260b0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
260c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
260d0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
260e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
260f0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
26100 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
26110 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
26120 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
26130 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55 70 64  _RV, C_DigestUpd
26140 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
26150 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
26160 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
26170 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
26180 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
26190 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
261a0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
261b0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
261c0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
261d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
261e0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
261f0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
26200 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
26210 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
26220 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
26230 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
26240 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
26250 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26260 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
26270 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26280 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
26290 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
262a0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
262b0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
262c0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
262d0 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  stKey)(CK_SESSIO
262e0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
262f0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
26300 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
26310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26320 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
26330 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
26340 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
26350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26360 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
26370 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
26380 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
26390 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
263a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
263b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
263c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
263d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
263e0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
263f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26400 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
26410 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
26420 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
26430 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
26440 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
26450 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45  gestFinal)(CK_SE
26460 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
26470 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
26480 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55  TR pDigest, CK_U
26490 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65  LONG_PTR pulDige
264a0 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  stLen) {..CACKEY
264b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
264c0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
264d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
264e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
264f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26500 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
26510 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
26520 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
26530 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
26540 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
26550 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
26560 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
26570 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26580 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
26590 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
265a0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
265b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
265c0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
265d0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
265e0 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 49  N(CK_RV, C_SignI
265f0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
26600 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
26610 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
26620 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
26630 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
26640 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  Key) {..int mute
26650 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79  x_retval;...hKey
26660 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  --;...CACKEY_DEB
26670 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
26680 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
26690 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
266a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
266b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
266c0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
266d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
266e0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
266f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
26700 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
26710 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  sm == NULL) {...
26720 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26730 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
26740 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22  hanism is NULL."
26750 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26760 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
26770 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
26780 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20  nism->mechanism 
26790 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29  != CKM_RSA_PKCS)
267a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
267b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
267c0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
267d0 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69  hanism not speci
267e0 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f  fied as CKM_RSA_
267f0 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72  PKCS");....retur
26800 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f  n(CKR_MECHANISM_
26810 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a  PARAM_INVALID);.
26820 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
26830 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
26840 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
26850 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
26860 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
26870 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
26880 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26890 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
268a0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
268b0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
268c0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
268d0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
268e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
268f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
26900 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
26910 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
26920 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
26930 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26940 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26950 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
26960 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
26970 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
26980 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
26990 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
269a0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
269b0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
269c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
269d0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
269e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
269f0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
26a00 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
26a10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
26a20 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
26a30 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
26a40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26a50 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
26a60 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
26a70 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
26a80 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
26a90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26aa0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26ab0 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e 20  Sign already in 
26ac0 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a  progress.");....
26ad0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
26ae0 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a  RATION_ACTIVE);.
26af0 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d  .}...if (hKey >=
26b00 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
26b10 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
26b20 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  ities_count) {..
26b30 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
26b40 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
26b50 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
26b60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26b70 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65  ror.  Key handle
26b80 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72   out of range (r
26b90 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75  equested key %lu
26ba0 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74  , only %lu ident
26bb0 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29  ities available)
26bc0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
26bd0 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67  ng) hKey, (unsig
26be0 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79  ned long) cackey
26bf0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26c00 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
26c10 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
26c20 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f  (CKR_KEY_HANDLE_
26c30 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
26c40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26c50 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
26c60 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b  tive = 1;...cack
26c70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26c80 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61  sion].sign_mecha
26c90 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  nism = pMechanis
26ca0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a 09  m->mechanism;...
26cb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26cc0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
26cd0 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63 61  uflen = 128;..ca
26ce0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26cf0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
26d00 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b 65  used = 0;..cacke
26d10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26d20 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20  ion].sign_buf = 
26d30 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
26d40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26d50 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
26d60 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73  f) * cackey_sess
26d70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
26d80 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09 43  ign_buflen);...C
26d90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26da0 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c 75 20  TF("Session %lu 
26db0 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 69 73  sign_identity is
26dc0 20 25 70 20 28 69 64 65 6e 74 69 74 79 20 23 25   %p (identity #%
26dd0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
26de0 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c 20  long) hSession, 
26df0 28 76 6f 69 64 20 2a 29 20 26 63 61 63 6b 65 79  (void *) &cackey
26e00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26e10 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68  on].identities[h
26e20 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20  Key], (unsigned 
26e30 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63 61  long) hKey);..ca
26e40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26e50 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
26e60 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
26e70 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26e80 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
26e90 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ey];...mutex_ret
26ea0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
26eb0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
26ec0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
26ed0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
26ee0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
26ef0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26f00 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
26f10 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
26f20 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
26f30 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
26f40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26f50 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
26f60 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
26f70 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
26f80 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
26f90 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
26fa0 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53   C_Sign)(CK_SESS
26fb0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
26fc0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
26fd0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
26fe0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
26ff0 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
27000 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
27010 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
27020 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ) {..unsigned lo
27030 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75  ng start_sign_bu
27040 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20 73 69  fused;..CK_RV si
27050 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74  gn_ret;..int mut
27060 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
27070 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27080 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
27090 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
270a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
270b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
270c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
270d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
270e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
270f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
27100 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
27110 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
27120 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
27130 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
27140 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
27150 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
27160 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
27170 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27180 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
27190 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
271a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
271b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
271c0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61 72  ALID);..}...star
271d0 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  t_sign_bufused =
271e0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
271f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
27200 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e 5f  bufused;...sign_
27210 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61  ret = C_SignUpda
27220 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61  te(hSession, pDa
27230 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a  ta, ulDataLen);.
27240 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d  .if (sign_ret !=
27250 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
27260 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27270 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70  ("Error.  SignUp
27280 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20  date() returned 
27290 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
272a0 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
272b0 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
272c0 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74  ....if (sign_ret
272d0 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   != CKR_BUFFER_T
272e0 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 6d  OO_SMALL) {....m
272f0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
27300 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
27310 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27320 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ....if (mutex_re
27330 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
27340 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27350 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
27360 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
27370 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
27380 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
27390 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
273a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
273b0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
273c0 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75   {.....cackey_mu
273d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
273e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
273f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27400 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
27410 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
27420 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75  .");........retu
27430 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
27440 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
27450 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61  ...}.....if (!ca
27460 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27470 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
27480 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ive) {.....cacke
27490 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
274a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
274b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
274c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
274d0 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76    Sign not activ
274e0 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74  e.");........ret
274f0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
27500 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
27510 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  D);....}.....cac
27520 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27530 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
27540 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65  ve = 0;.....mute
27550 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
27560 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
27570 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27580 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ...if (mutex_ret
27590 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  val != 0) {.....
275a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
275b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
275c0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
275d0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
275e0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
275f0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65  ;....}...}....re
27600 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a  turn(sign_ret);.
27610 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  .}...sign_ret = 
27620 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73  C_SignFinal(hSes
27630 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65  sion, pSignature
27640 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  , pulSignatureLe
27650 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65  n);..if (sign_re
27660 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
27670 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 3d 3d  .if (sign_ret ==
27680 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
27690 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b  SMALL) {....CACK
276a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
276b0 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74  "SignFinal() ret
276c0 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46 45 52  urned CKR_BUFFER
276d0 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20 3d  _TOO_SMALL (rv =
276e0 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20 43   %lu), undoing C
276f0 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 2c 20  _SignUpdate()", 
27700 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
27710 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 63  sign_ret);.....c
27720 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27730 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
27740 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69  fused = start_si
27750 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 09  gn_bufused;.....
27760 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
27770 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
27780 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27790 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28  ror.  SignFinal(
277a0 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
277b0 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
277c0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
277d0 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72   sign_ret);....r
277e0 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b  eturn(sign_ret);
277f0 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69 67 6e 61  ..}...if (pSigna
27800 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ture == NULL) {.
27810 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27820 52 49 4e 54 46 28 22 70 53 69 67 6e 61 74 75 72  RINTF("pSignatur
27830 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  e specified as N
27840 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53  ULL, undoing C_S
27850 69 67 6e 55 70 64 61 74 65 28 29 22 29 3b 0a 0a  ignUpdate()");..
27860 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
27870 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
27880 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74  _bufused = start
27890 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a  _sign_bufused;..
278a0 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
278b0 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  t);..}...CACKEY_
278c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
278d0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
278e0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
278f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
27900 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
27910 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
27920 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b 5f 53  SignUpdate)(CK_S
27930 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
27940 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
27950 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
27960 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b  ONG ulPartLen) {
27970 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
27980 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
27990 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
279a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
279b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
279c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
279d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
279e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
279f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
27a00 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
27a10 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
27a20 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
27a30 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
27a40 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
27a50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
27a60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
27a70 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
27a80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27a90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
27aa0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
27ab0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
27ac0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
27ad0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
27ae0 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d  .}...if (pPart =
27af0 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72 74  = NULL && ulPart
27b00 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  Len == 0) {.../*
27b10 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 20 69   Short circuit i
27b20 66 20 77 65 20 61 72 65 20 61 73 6b 65 64 20 74  f we are asked t
27b30 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e  o sign nothing..
27b40 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  . */...CACKEY_DE
27b50 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
27b60 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
27b70 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
27b80 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
27b90 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
27ba0 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d  .}...if (pPart =
27bb0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
27bc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27bd0 22 45 72 72 6f 72 2e 20 70 50 61 72 74 20 69 73  "Error. pPart is
27be0 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72   NULL, but ulPar
27bf0 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29  tLen is not 0.")
27c00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27c10 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
27c20 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72 74 4c  .}...if (ulPartL
27c30 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  en == 0) {...CAC
27c40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27c50 28 22 45 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c  ("Error. ulPartL
27c60 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50 61  en is 0, but pPa
27c70 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  rt is not NULL."
27c80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27c90 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
27ca0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
27cb0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
27cc0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
27cd0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
27ce0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
27cf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27d00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27d10 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
27d20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27d30 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27d40 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
27d50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
27d60 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
27d70 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
27d80 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
27d90 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
27da0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27db0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
27dc0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
27dd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
27de0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
27df0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
27e00 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
27e10 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
27e20 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
27e30 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27e40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27e50 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
27e60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27e70 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65   Sign not active
27e80 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
27e90 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
27ea0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
27eb0 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61  ..}...switch (ca
27ec0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27ed0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63  ession].sign_mec
27ee0 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65  hanism) {...case
27ef0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
27f00 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20  ../* Accumulate 
27f10 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09 69  directly */....i
27f20 66 20 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69  f ((cackey_sessi
27f30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
27f40 67 6e 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50  gn_bufused + ulP
27f50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79  artLen) > cackey
27f60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27f70 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
27f80 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65   {.....cackey_se
27f90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27fa0 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20  .sign_buflen *= 
27fb0 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  2;......cackey_s
27fc0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27fd0 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61  ].sign_buf = rea
27fe0 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73  lloc(cackey_sess
27ff0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
28000 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  ign_buf, sizeof(
28010 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  *cackey_sessions
28020 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
28030 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65  buf) * cackey_se
28040 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28050 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09  .sign_buflen);..
28060 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63  ..}.....memcpy(c
28070 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28080 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
28090 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73 69  f + cackey_sessi
280a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
280b0 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61 72  gn_bufused, pPar
280c0 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a  t, ulPartLen);..
280d0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
280e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
280f0 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c 50  n_bufused += ulP
28100 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61  artLen;.....brea
28110 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
28120 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
28130 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28140 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
28150 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
28160 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
28170 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28180 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
28190 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
281a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
281b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
281c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
281d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
281e0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
281f0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
28200 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
28210 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
28220 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43  , C_SignFinal)(C
28230 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
28240 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
28250 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
28260 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
28270 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
28280 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59   {..static CK_BY
28290 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b  TE sigbuf[1024];
282a0 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66  ..ssize_t sigbuf
282b0 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  len;..CK_SLOT_ID
282c0 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20   slotID;..CK_RV 
282d0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
282e0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74  ERAL_ERROR;..int
282f0 20 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20   terminate_sign 
28300 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  = 1;..int mutex_
28310 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
28320 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
28330 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
28340 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
28350 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
28360 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28370 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
28380 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
28390 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
283a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
283b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53  );..}...if (pulS
283c0 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e  ignatureLen == N
283d0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
283e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
283f0 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72  ror. pulSignatur
28400 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  eLen is NULL.");
28410 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
28420 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
28430 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
28440 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
28450 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
28460 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
28470 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
28480 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
28490 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
284a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
284b0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
284c0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
284d0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
284e0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
284f0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
28500 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
28510 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
28520 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
28530 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
28540 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28550 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28560 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
28570 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28580 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
28590 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
285a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
285b0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
285c0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
285d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
285e0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....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 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
28610 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
28620 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
28630 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
28640 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
28650 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28660 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
28670 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
28680 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28690 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
286a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
286b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
286c0 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  Sign not active.
286d0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
286e0 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
286f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
28700 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
28710 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
28720 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
28730 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
28740 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
28750 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
28760 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
28770 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
28780 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28790 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
287a0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
287b0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
287c0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
287d0 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
287e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
287f0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
28800 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
28810 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
28820 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
28830 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28840 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
28850 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
28860 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
28870 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
28880 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
28890 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
288a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
288b0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
288c0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
288d0 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63  ;..}...switch (c
288e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
288f0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65  Session].sign_me
28900 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
28910 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
28920 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74  .../* Ask card t
28930 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43  o sign */....CAC
28940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28950 28 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67 6e  ("Asking to sign
28960 20 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20 25   from identity %
28970 70 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75  p in session %lu
28980 22 2c 20 28 76 6f 69 64 20 2a 29 20 63 61 63 6b  ", (void *) cack
28990 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
289a0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
289b0 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ity, (unsigned l
289c0 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a  ong) hSession);.
289d0 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63  ...sigbuflen = c
289e0 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
289f0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
28a00 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f  slotID], cackey_
28a10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28a20 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  n].sign_identity
28a30 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
28a40 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
28a50 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73  _buf, cackey_ses
28a60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28a70 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73 69  sign_bufused, si
28a80 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 67  gbuf, sizeof(sig
28a90 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09 09  buf), 1, 0);....
28aa0 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c  .if (sigbuflen <
28ab0 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67   0) {...../* Sig
28ac0 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a  ning failed. */.
28ad0 09 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65  ....if (sigbufle
28ae0 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
28af0 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a  _E_NEEDLOGIN) {.
28b00 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
28b10 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45  R_USER_NOT_LOGGE
28b20 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65  D_IN;.....} else
28b30 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d   if (sigbuflen =
28b40 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
28b50 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09  TOKENABSENT) {..
28b60 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
28b70 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b  _DEVICE_REMOVED;
28b80 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
28b90 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
28ba0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
28bb0 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69  ...}....} else i
28bc0 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  f (((unsigned lo
28bd0 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20 3e  ng) sigbuflen) >
28be0 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65   *pulSignatureLe
28bf0 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72 65 29  n && pSignature)
28c00 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 64   {...../* Signed
28c10 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20   data too large 
28c20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  */.....CACKEY_DE
28c30 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65 74 76  BUG_PRINTF("retv
28c40 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
28c50 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62  TOO_SMALL;  sigb
28c60 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c  uflen = %lu, pul
28c70 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25  SignatureLen = %
28c80 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
28c90 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 2c 20  ong) sigbuflen, 
28ca0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
28cb0 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  *pulSignatureLen
28cc0 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  );......retval =
28cd0 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
28ce0 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d  SMALL;......term
28cf0 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a  inate_sign = 0;.
28d00 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
28d10 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
28d20 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69   0;......if (pSi
28d30 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09  gnature) {......
28d40 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72  memcpy(pSignatur
28d50 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62 75  e, sigbuf, sigbu
28d60 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72  flen);.......ter
28d70 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b  minate_sign = 1;
28d80 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c  .....}......*pul
28d90 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73  SignatureLen = s
28da0 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72  igbuflen;......r
28db0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
28dc0 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
28dd0 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61  .}...if (termina
28de0 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20  te_sign) {...if 
28df0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
28e00 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
28e10 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63  buf) {....free(c
28e20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28e30 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
28e40 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  f);...}....cacke
28e50 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28e60 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
28e70 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78   = 0;..}...mutex
28e80 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
28e90 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
28ea0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
28eb0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
28ec0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
28ed0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28ee0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
28ef0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
28f00 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28f10 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
28f20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28f30 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25  NTF("Returning %
28f40 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  i", (int) retval
28f50 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
28f60 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  al);.}..CK_DEFIN
28f70 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
28f80 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49  , C_SignRecoverI
28f90 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
28fa0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
28fb0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
28fc0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
28fd0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
28fe0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
28ff0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
29000 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
29010 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
29020 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
29030 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29040 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
29050 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
29060 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
29070 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
29080 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29090 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
290a0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
290b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
290c0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
290d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
290e0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
290f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29100 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
29110 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
29120 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63  CK_RV, C_SignRec
29130 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e  over)(CK_SESSION
29140 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
29150 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
29160 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
29170 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
29180 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
29190 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
291a0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
291b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
291c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
291d0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
291e0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
291f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29200 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
29210 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
29220 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29230 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
29240 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
29250 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29260 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
29270 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29280 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
29290 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
292a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
292b0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
292c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
292d0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
292e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
292f0 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43   C_VerifyInit)(C
29300 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
29310 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
29320 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
29330 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
29340 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
29350 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29360 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
29370 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
29380 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
29390 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
293a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
293b0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
293c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
293d0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
293e0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
293f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29400 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
29410 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29420 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
29430 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29440 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
29450 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
29460 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29470 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
29480 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
29490 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45   C_Verify)(CK_SE
294a0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
294b0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
294c0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
294d0 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
294e0 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
294f0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
29500 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
29510 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29520 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
29530 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
29540 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
29550 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29560 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
29570 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
29580 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29590 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
295a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
295b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
295c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
295d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
295e0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
295f0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29600 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
29610 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
29620 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29630 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
29640 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
29650 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 29   C_VerifyUpdate)
29660 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
29670 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
29680 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
29690 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
296a0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
296b0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
296c0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
296d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
296e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
296f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29700 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
29710 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29720 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
29730 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
29740 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
29750 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29760 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
29770 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
29780 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
29790 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
297a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
297b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
297c0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
297d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
297e0 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69  K_RV, C_VerifyFi
297f0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
29800 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
29810 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
29820 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
29830 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
29840 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
29850 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
29860 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
29870 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
29880 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29890 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
298a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
298b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
298c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
298d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
298e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
298f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
29900 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
29910 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
29920 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
29930 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
29940 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
29950 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29960 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
29970 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
29980 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f  RV, C_VerifyReco
29990 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  verInit)(CK_SESS
299a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
299b0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
299c0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
299d0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
299e0 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
299f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29a00 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
29a10 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
29a20 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
29a30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29a40 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
29a50 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
29a60 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
29a70 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
29a80 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
29a90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29aa0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
29ab0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29ac0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
29ad0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29ae0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
29af0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
29b00 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
29b10 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
29b20 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
29b30 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53  ifyRecover)(CK_S
29b40 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
29b50 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
29b60 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
29b70 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
29b80 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  tureLen, CK_BYTE
29b90 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
29ba0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61  LONG_PTR pulData
29bb0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
29bc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
29bd0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
29be0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
29bf0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
29c00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29c10 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
29c20 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
29c30 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
29c40 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
29c50 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29c60 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29c70 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
29c80 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
29c90 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
29ca0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29cb0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
29cc0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29cd0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
29ce0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
29cf0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45  CK_RV, C_DigestE
29d00 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ncryptUpdate)(CK
29d10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
29d20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
29d30 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
29d40 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c  ULONG ulPartLen,
29d50 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
29d60 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
29d70 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
29d80 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
29d90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29da0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
29db0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
29dc0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
29dd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29de0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
29df0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
29e00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29e10 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
29e20 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
29e30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29e40 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
29e50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29e60 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
29e70 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29e80 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
29e90 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
29ea0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29eb0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
29ec0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
29ed0 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74   C_DecryptDigest
29ee0 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
29ef0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29f00 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
29f10 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
29f20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
29f30 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  ptedPartLen, CK_
29f40 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
29f50 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
29f60 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
29f70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29f80 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
29f90 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
29fa0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
29fb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29fc0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
29fd0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
29fe0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
29ff0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2a000 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2a010 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2a020 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2a030 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a040 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2a050 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a060 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2a070 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2a080 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2a090 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2a0a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2a0b0 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28  nEncryptUpdate)(
2a0c0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2a0d0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2a0e0 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
2a0f0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
2a100 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2a110 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
2a120 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
2a130 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
2a140 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2a150 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2a160 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2a170 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2a180 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a190 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a1a0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2a1b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2a1c0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2a1d0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2a1e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a1f0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2a200 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2a210 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2a220 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2a230 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2a240 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2a250 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a260 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2a270 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2a280 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72 69  V, C_DecryptVeri
2a290 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  fyUpdate)(CK_SES
2a2a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2a2b0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2a2c0 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
2a2d0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
2a2e0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43  ryptedPartLen, C
2a2f0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2a300 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2a310 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
2a320 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a330 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2a340 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2a350 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2a360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a370 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2a380 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2a390 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2a3a0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2a3b0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2a3c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a3d0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2a3e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a3f0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2a400 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2a410 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2a420 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2a430 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2a440 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2a450 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
2a460 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53  enerateKey)(CK_S
2a470 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2a480 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2a490 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2a4a0 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ism, CK_ATTRIBUT
2a4b0 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
2a4c0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
2a4d0 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
2a4e0 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
2a4f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a500 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2a510 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2a520 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2a530 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a540 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2a550 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2a560 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2a570 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2a580 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2a590 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a5a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2a5b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a5c0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2a5d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2a5e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2a5f0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2a600 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a610 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2a620 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2a630 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61   C_GenerateKeyPa
2a640 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ir)(CK_SESSION_H
2a650 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2a660 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2a670 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2a680 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50  ATTRIBUTE_PTR pP
2a690 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65  ublicKeyTemplate
2a6a0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62  , CK_ULONG ulPub
2a6b0 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74 65 43  licKeyAttributeC
2a6c0 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ount, CK_ATTRIBU
2a6d0 54 45 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b  TE_PTR pPrivateK
2a6e0 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55  eyTemplate, CK_U
2a6f0 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65  LONG ulPrivateKe
2a700 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  yAttributeCount,
2a710 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2a720 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65  E_PTR phPublicKe
2a730 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
2a740 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61 74  DLE_PTR phPrivat
2a750 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eKey) {..CACKEY_
2a760 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2a770 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2a780 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2a790 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2a7a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a7b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2a7c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2a7d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2a7e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2a7f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2a800 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2a810 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2a820 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a830 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2a840 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2a850 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2a860 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2a870 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2a880 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2a890 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65  (CK_RV, C_WrapKe
2a8a0 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
2a8b0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2a8c0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2a8d0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
2a8e0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72  BJECT_HANDLE hWr
2a8f0 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42  appingKey, CK_OB
2a900 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
2a910 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57  , CK_BYTE_PTR pW
2a920 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c  rappedKey, CK_UL
2a930 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70  ONG_PTR pulWrapp
2a940 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43  edKeyLen) {..CAC
2a950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a960 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2a970 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2a980 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2a990 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a9a0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2a9b0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2a9c0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2a9d0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2a9e0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2a9f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2aa00 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2aa10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2aa20 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2aa30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2aa40 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2aa50 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2aa60 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2aa70 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2aa80 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e  TION(CK_RV, C_Un
2aa90 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53  wrapKey)(CK_SESS
2aaa0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2aab0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2aac0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2aad0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2aae0 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65  LE hUnwrappingKe
2aaf0 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  y, CK_BYTE_PTR p
2ab00 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55  WrappedKey, CK_U
2ab10 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65  LONG ulWrappedKe
2ab20 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55  yLen, CK_ATTRIBU
2ab30 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
2ab40 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74  , CK_ULONG ulAtt
2ab50 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
2ab60 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
2ab70 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  R phKey) {..CACK
2ab80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ab90 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2aba0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2abb0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2abc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2abd0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2abe0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2abf0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2ac00 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2ac10 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2ac20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2ac30 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2ac40 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2ac50 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2ac60 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2ac70 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2ac80 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2ac90 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2aca0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2acb0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72  ION(CK_RV, C_Der
2acc0 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  iveKey)(CK_SESSI
2acd0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2ace0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2acf0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2ad00 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2ad10 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41  E hBaseKey, CK_A
2ad20 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
2ad30 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
2ad40 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e   ulAttributeCoun
2ad50 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
2ad60 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
2ad70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ad80 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2ad90 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2ada0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2adb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2adc0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2add0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2ade0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2adf0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2ae00 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2ae10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ae20 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2ae30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ae40 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2ae50 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2ae60 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2ae70 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2ae80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2ae90 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2aea0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2aeb0 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43   C_SeedRandom)(C
2aec0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2aed0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2aee0 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b  TE_PTR pSeed, CK
2aef0 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e  _ULONG ulSeedLen
2af00 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2af10 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2af20 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2af30 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2af40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2af50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2af60 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2af70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2af80 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2af90 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2afa0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2afb0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2afc0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2afd0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2afe0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2aff0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2b000 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2b010 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2b020 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2b030 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2b040 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61  RV, C_GenerateRa
2b050 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ndom)(CK_SESSION
2b060 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2b070 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52  , CK_BYTE_PTR pR
2b080 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c  andomData, CK_UL
2b090 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29  ONG ulRandomLen)
2b0a0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2b0b0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2b0c0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2b0d0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2b0e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b0f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2b100 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2b110 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2b120 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2b130 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2b140 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b150 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2b160 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2b170 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2b180 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2b190 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2b1a0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2b1b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2b1c0 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72  TED);.}../* Depr
2b1d0 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20  ecated Function 
2b1e0 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
2b1f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
2b200 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73  etFunctionStatus
2b210 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2b220 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
2b230 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b240 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2b250 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b260 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2b270 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2b280 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29  OT_PARALLEL (%i)
2b290 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2b2a0 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
2b2b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2b2c0 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
2b2d0 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d  L);...hSession =
2b2e0 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75   hSession; /* Su
2b2f0 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72  press unused var
2b300 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f  iable warning */
2b310 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65  .}../* Deprecate
2b320 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b  d Function */.CK
2b330 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2b340 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c  (CK_RV, C_Cancel
2b350 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53  Function)(CK_SES
2b360 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2b370 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  sion) {..CACKEY_
2b380 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2b390 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
2b3a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b3b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2b3c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
2b3d0 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  LEL (%i)", CKR_F
2b3e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
2b3f0 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  LLEL);...return(
2b400 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2b410 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53  _PARALLEL);...hS
2b420 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f  ession = hSessio
2b430 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  n; /* Supress un
2b440 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
2b450 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
2b460 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2b470 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74  K_RV, C_GetFunct
2b480 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43  ionList)(CK_FUNC
2b490 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54  TION_LIST_PTR_PT
2b4a0 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  R ppFunctionList
2b4b0 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e  ) {..CK_FUNCTION
2b4c0 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63 74  _LIST_PTR pFunct
2b4d0 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45  ionList;...CACKE
2b4e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b4f0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2b500 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  (ppFunctionList 
2b510 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2b520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b530 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63 74  ("Error. ppFunct
2b540 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e  ionList is NULL.
2b550 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2b560 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2b570 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e  ;..}...pFunction
2b580 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  List = malloc(si
2b590 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c  zeof(*pFunctionL
2b5a0 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69  ist));...pFuncti
2b5b0 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e  onList->version.
2b5c0 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  major = ((CACKEY
2b5d0 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
2b5e0 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26  N_CODE) >> 16) &
2b5f0 20 30 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f   0xff;..pFunctio
2b600 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d  nList->version.m
2b610 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  inor = ((CACKEY_
2b620 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
2b630 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30  _CODE) >> 8) & 0
2b640 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e  xff;...pFunction
2b650 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69  List->C_Initiali
2b660 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a  ze = C_Initializ
2b670 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2b680 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20  t->C_Finalize = 
2b690 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75  C_Finalize;..pFu
2b6a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2b6b0 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66  tInfo = C_GetInf
2b6c0 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
2b6d0 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74  t->C_GetSlotList
2b6e0 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74   = C_GetSlotList
2b6f0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2b700 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20  ->C_GetSlotInfo 
2b710 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b  = C_GetSlotInfo;
2b720 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2b730 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20  >C_GetTokenInfo 
2b740 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f  = C_GetTokenInfo
2b750 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2b760 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45  ->C_WaitForSlotE
2b770 76 65 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f 72  vent = C_WaitFor
2b780 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e  SlotEvent;..pFun
2b790 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2b7a0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20  MechanismList = 
2b7b0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
2b7c0 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
2b7d0 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69  st->C_GetMechani
2b7e0 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65  smInfo = C_GetMe
2b7f0 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46  chanismInfo;..pF
2b800 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
2b810 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69  nitToken = C_Ini
2b820 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69  tToken;..pFuncti
2b830 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49  onList->C_InitPI
2b840 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09  N = C_InitPIN;..
2b850 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2b860 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 50  _SetPIN = C_SetP
2b870 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
2b880 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f  st->C_OpenSessio
2b890 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f  n = C_OpenSessio
2b8a0 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
2b8b0 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  t->C_CloseSessio
2b8c0 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69  n = C_CloseSessi
2b8d0 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
2b8e0 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65  st->C_CloseAllSe
2b8f0 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65  ssions = C_Close
2b900 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46  AllSessions;..pF
2b910 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2b920 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20  etSessionInfo = 
2b930 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
2b940 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2b950 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_GetOperation
2b960 53 74 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 65  State = C_GetOpe
2b970 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
2b980 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
2b990 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
2b9a0 20 3d 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f   = C_SetOperatio
2b9b0 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  nState;..pFuncti
2b9c0 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20  onList->C_Login 
2b9d0 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e  = C_Login;..pFun
2b9e0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67  ctionList->C_Log
2b9f0 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a  out = C_Logout;.
2ba00 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2ba10 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 20 3d  C_CreateObject =
2ba20 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 3b   C_CreateObject;
2ba30 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2ba40 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20  >C_CopyObject = 
2ba50 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70  C_CopyObject;..p
2ba60 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2ba70 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20  DestroyObject = 
2ba80 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b  C_DestroyObject;
2ba90 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2baa0 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65  >C_GetObjectSize
2bab0 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69   = C_GetObjectSi
2bac0 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ze;..pFunctionLi
2bad0 73 74 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 75  st->C_GetAttribu
2bae0 74 65 56 61 6c 75 65 20 3d 20 43 5f 47 65 74 41  teValue = C_GetA
2baf0 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
2bb00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2bb10 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _SetAttributeVal
2bb20 75 65 20 3d 20 43 5f 53 65 74 41 74 74 72 69 62  ue = C_SetAttrib
2bb30 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63  uteValue;..pFunc
2bb40 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64  tionList->C_Find
2bb50 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d 20 43 5f  ObjectsInit = C_
2bb60 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b  FindObjectsInit;
2bb70 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2bb80 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d  >C_FindObjects =
2bb90 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a   C_FindObjects;.
2bba0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2bbb0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  C_FindObjectsFin
2bbc0 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  al = C_FindObjec
2bbd0 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  tsFinal;..pFunct
2bbe0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
2bbf0 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79  ptInit = C_Encry
2bc00 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  ptInit;..pFuncti
2bc10 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70  onList->C_Encryp
2bc20 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09  t = C_Encrypt;..
2bc30 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2bc40 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d  _EncryptUpdate =
2bc50 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65   C_EncryptUpdate
2bc60 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2bc70 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c  ->C_EncryptFinal
2bc80 20 3d 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61   = C_EncryptFina
2bc90 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
2bca0 74 2d 3e 43 5f 44 65 63 72 79 70 74 49 6e 69 74  t->C_DecryptInit
2bcb0 20 3d 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74   = C_DecryptInit
2bcc0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2bcd0 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d 20 43 5f  ->C_Decrypt = C_
2bce0 44 65 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74  Decrypt;..pFunct
2bcf0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
2bd00 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63  ptUpdate = C_Dec
2bd10 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
2bd20 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
2bd30 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44  cryptFinal = C_D
2bd40 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46  ecryptFinal;..pF
2bd50 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
2bd60 69 67 65 73 74 49 6e 69 74 20 3d 20 43 5f 44 69  igestInit = C_Di
2bd70 67 65 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63  gestInit;..pFunc
2bd80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
2bd90 73 74 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09  st = C_Digest;..
2bda0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2bdb0 5f 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20  _DigestUpdate = 
2bdc0 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a  C_DigestUpdate;.
2bdd0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2bde0 43 5f 44 69 67 65 73 74 4b 65 79 20 3d 20 43 5f  C_DigestKey = C_
2bdf0 44 69 67 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e  DigestKey;..pFun
2be00 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
2be10 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67  estFinal = C_Dig
2be20 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  estFinal;..pFunc
2be30 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
2be40 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69  Init = C_SignIni
2be50 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2be60 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69  t->C_Sign = C_Si
2be70 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  gn;..pFunctionLi
2be80 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74 65  st->C_SignUpdate
2be90 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65 3b   = C_SignUpdate;
2bea0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2beb0 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43  >C_SignFinal = C
2bec0 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75  _SignFinal;..pFu
2bed0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
2bee0 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20  gnRecoverInit = 
2bef0 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
2bf00 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2bf10 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  t->C_SignRecover
2bf20 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72   = C_SignRecover
2bf30 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2bf40 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69 74 20 3d  ->C_VerifyInit =
2bf50 20 43 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a 09   C_VerifyInit;..
2bf60 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2bf70 5f 56 65 72 69 66 79 20 3d 20 43 5f 56 65 72 69  _Verify = C_Veri
2bf80 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fy;..pFunctionLi
2bf90 73 74 2d 3e 43 5f 56 65 72 69 66 79 55 70 64 61  st->C_VerifyUpda
2bfa0 74 65 20 3d 20 43 5f 56 65 72 69 66 79 55 70 64  te = C_VerifyUpd
2bfb0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2bfc0 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e  ist->C_VerifyFin
2bfd0 61 6c 20 3d 20 43 5f 56 65 72 69 66 79 46 69 6e  al = C_VerifyFin
2bfe0 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
2bff0 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f  st->C_VerifyReco
2c000 76 65 72 49 6e 69 74 20 3d 20 43 5f 56 65 72 69  verInit = C_Veri
2c010 66 79 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09  fyRecoverInit;..
2c020 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2c030 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 20 3d  _VerifyRecover =
2c040 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
2c050 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c060 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70  ->C_DigestEncryp
2c070 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65  tUpdate = C_Dige
2c080 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b  stEncryptUpdate;
2c090 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2c0a0 3e 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74  >C_DecryptDigest
2c0b0 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79  Update = C_Decry
2c0c0 70 74 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a  ptDigestUpdate;.
2c0d0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c0e0 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
2c0f0 61 74 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72  ate = C_SignEncr
2c100 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  yptUpdate;..pFun
2c110 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
2c120 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65  ryptVerifyUpdate
2c130 20 3d 20 43 5f 44 65 63 72 79 70 74 56 65 72 69   = C_DecryptVeri
2c140 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
2c150 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65  tionList->C_Gene
2c160 72 61 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65  rateKey = C_Gene
2c170 72 61 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74  rateKey;..pFunct
2c180 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72  ionList->C_Gener
2c190 61 74 65 4b 65 79 50 61 69 72 20 3d 20 43 5f 47  ateKeyPair = C_G
2c1a0 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 3b 0a  enerateKeyPair;.
2c1b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c1c0 43 5f 57 72 61 70 4b 65 79 20 3d 20 43 5f 57 72  C_WrapKey = C_Wr
2c1d0 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  apKey;..pFunctio
2c1e0 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b  nList->C_UnwrapK
2c1f0 65 79 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79  ey = C_UnwrapKey
2c200 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c210 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79 20 3d 20  ->C_DeriveKey = 
2c220 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a 09 70 46  C_DeriveKey;..pF
2c230 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
2c240 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65  eedRandom = C_Se
2c250 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63  edRandom;..pFunc
2c260 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65  tionList->C_Gene
2c270 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47  rateRandom = C_G
2c280 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09  enerateRandom;..
2c290 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2c2a0 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74  _GetFunctionStat
2c2b0 75 73 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69  us = C_GetFuncti
2c2c0 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46 75 6e 63  onStatus;..pFunc
2c2d0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63  tionList->C_Canc
2c2e0 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43  elFunction = C_C
2c2f0 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09  ancelFunction;..
2c300 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2c310 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74  _GetFunctionList
2c320 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e   = C_GetFunction
2c330 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 74  List;...*ppFunct
2c340 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63 74  ionList = pFunct
2c350 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45  ionList;...CACKE
2c360 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c370 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2c380 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2c390 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2c3a0 29 3b 0a 7d 0a 0a                                );.}..