Hex Artifact Content

Artifact c41337ffcbb5403f394e43a57c29b7dc30667d2d:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64  VE_ZLIB_H.#  ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e    include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73  h>.#  endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  e.#  ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20  LIBZ.#    undef 
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64  HAVE_LIBZ.#  end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  if.#endif..#defi
02f0: 6e 65 20 43 4b 5f 50 54 52 20 2a 0a 23 64 65 66  ne CK_PTR *.#def
0300: 69 6e 65 20 43 4b 5f 44 45 46 49 4e 45 5f 46 55  ine CK_DEFINE_FU
0310: 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70  NCTION(returnTyp
0320: 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54  e, name) returnT
0330: 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65  ype name.#define
0340: 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43   CK_DECLARE_FUNC
0350: 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70 65 2c  TION(returnType,
0360: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70   name) returnTyp
0370: 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65 20 43  e name.#define C
0380: 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43 54 49  K_DECLARE_FUNCTI
0390: 4f 4e 5f 50 4f 49 4e 54 45 52 28 72 65 74 75 72  ON_POINTER(retur
03a0: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
03b0: 75 72 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29  urnType (* name)
03c0: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 43 41 4c 4c  .#define CK_CALL
03d0: 42 41 43 4b 5f 46 55 4e 43 54 49 4f 4e 28 72 65  BACK_FUNCTION(re
03e0: 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20  turnType, name) 
03f0: 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e 61  returnType (* na
0400: 6d 65 29 0a 23 69 66 6e 64 65 66 20 4e 55 4c 4c  me).#ifndef NULL
0410: 5f 50 54 52 0a 23 20 20 64 65 66 69 6e 65 20 4e  _PTR.#  define N
0420: 55 4c 4c 5f 50 54 52 20 30 0a 23 65 6e 64 69 66  ULL_PTR 0.#endif
0430: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73  ..#include "pkcs
0440: 31 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  11.h".#include "
0450: 70 6b 63 73 31 31 6e 2e 68 22 0a 23 69 6e 63 6c  pkcs11n.h".#incl
0460: 75 64 65 20 22 61 73 6e 31 2d 78 35 30 39 2e 68  ude "asn1-x509.h
0470: 22 0a 23 69 6e 63 6c 75 64 65 20 22 73 68 61 31  ".#include "sha1
0480: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64  .h".#include "md
0490: 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 49 6e 63 6c  5.h"../*. * Incl
04a0: 75 64 65 20 74 68 65 73 65 20 73 6f 75 72 63 65  ude these source
04b0: 20 66 69 6c 65 73 20 69 6e 20 74 68 69 73 20 74   files in this t
04c0: 72 61 6e 73 6c 61 74 69 6f 6e 20 75 6e 69 74 20  ranslation unit 
04d0: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 62  so that we can b
04e0: 69 6e 64 20 74 6f 0a 20 2a 20 66 75 6e 63 74 69  ind to. * functi
04f0: 6f 6e 73 20 61 6e 64 20 6e 6f 74 20 69 6e 63 6c  ons and not incl
0500: 75 64 65 20 61 6e 79 20 73 79 6d 62 6f 6c 73 20  ude any symbols 
0510: 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  in the output sh
0520: 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 2a 2f  ared object.. */
0530: 0a 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d  .#include "asn1-
0540: 78 35 30 39 2e 63 22 0a 23 69 6e 63 6c 75 64 65  x509.c".#include
0550: 20 22 73 68 61 31 2e 63 22 0a 23 69 6e 63 6c 75   "sha1.c".#inclu
0560: 64 65 20 22 6d 64 35 2e 63 22 0a 0a 23 69 66 6e  de "md5.c"..#ifn
0570: 64 65 66 20 43 41 43 4b 45 59 5f 43 52 59 50 54  def CACKEY_CRYPT
0580: 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45  OKI_VERSION_CODE
0590: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
05a0: 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
05b0: 4f 4e 5f 43 4f 44 45 20 30 78 30 32 31 65 30 30  ON_CODE 0x021e00
05c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 47 53 43 2d  .#endif../* GSC-
05d0: 49 53 20 76 32 2e 31 20 44 65 66 69 6e 69 74 69  IS v2.1 Definiti
05e0: 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43 6c 61 73 73  ons */./** Class
05f0: 65 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  es **/.#define G
0600: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
0610: 31 36 20 20 20 20 20 20 20 20 20 20 20 30 78 30  16           0x0
0620: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0630: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41  CLASS_GLOBAL_PLA
0640: 54 46 4f 52 4d 20 20 20 30 78 38 30 0a 0a 2f 2a  TFORM   0x80../*
0650: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a  * Instructions *
0660: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0670: 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f  _INSTR_GET_RESPO
0680: 4e 53 45 20 20 20 20 20 20 30 78 43 30 0a 23 64  NSE      0xC0.#d
0690: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
06a0: 52 5f 52 45 41 44 5f 42 49 4e 41 52 59 20 20 20  R_READ_BINARY   
06b0: 20 20 20 20 30 78 42 30 0a 23 64 65 66 69 6e 65      0xB0.#define
06c0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 55 50 44   GSCIS_INSTR_UPD
06d0: 41 54 45 5f 42 49 4e 41 52 59 20 20 20 20 20 30  ATE_BINARY     0
06e0: 78 44 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xD6.#define GSCI
06f0: 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 20 20  S_INSTR_SELECT  
0700: 20 20 20 20 20 20 20 20 20 20 30 78 41 34 0a 23            0xA4.#
0710: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0720: 54 52 5f 45 58 54 45 52 4e 41 4c 5f 41 55 54 48  TR_EXTERNAL_AUTH
0730: 20 20 20 20 20 30 78 38 32 0a 23 64 65 66 69 6e       0x82.#defin
0740: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0750: 54 5f 43 48 41 4c 4c 45 4e 47 45 20 20 20 20 20  T_CHALLENGE     
0760: 30 78 38 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x84.#define GSC
0770: 49 53 5f 49 4e 53 54 52 5f 49 4e 54 45 52 4e 41  IS_INSTR_INTERNA
0780: 4c 5f 41 55 54 48 20 20 20 20 20 30 78 38 38 0a  L_AUTH     0x88.
0790: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
07a0: 53 54 52 5f 56 45 52 49 46 59 20 20 20 20 20 20  STR_VERIFY      
07b0: 20 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69        0x20.#defi
07c0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
07d0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
07e0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53   0x2A.#define GS
07f0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52  CIS_INSTR_GET_PR
0800: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36  OP          0x56
0810: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
0820: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20  NSTR_GET_ACR    
0830: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66         0x4C.#def
0840: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0850: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20  READ_BUFFER     
0860: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47    0x52.#define G
0870: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
0880: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34  ECRYPT       0x4
0890: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  2..#define GSCIS
08a0: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
08b0: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f  PLET     0x04../
08c0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a  ** Tags **/./***
08d0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23   CCC Tags ***/.#
08e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08f0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20  _CARDID         
0900: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e       0xF0.#defin
0910: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
0920: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VER             
0930: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF1.#define GSC
0940: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20  IS_TAG_CCG_VER  
0950: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a             0xF2.
0960: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0970: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20  G_CARDURL       
0980: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69        0xF3.#defi
0990: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  ne GSCIS_TAG_PKC
09a0: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20  S15             
09b0: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53   0xF4.#define GS
09c0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
09d0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35  _MODEL      0xF5
09e0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09f0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20  AG_ACR_TABLE    
0a00: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66         0xF6.#def
0a10: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
0a20: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20  RD_APDU         
0a30: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47    0xF7.#define G
0a40: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43  SCIS_TAG_REDIREC
0a50: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46  TION         0xF
0a60: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  A.#define GSCIS_
0a70: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20  TAG_CT          
0a80: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65          0xFB.#de
0a90: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0aa0: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
0ab0: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20     0xFC.#define 
0ac0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
0ad0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78  C             0x
0ae0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c  FD../*** General
0af0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a   - EF 2200 ***/.
0b00: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0b10: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_FNAME         
0b20: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69        0x01.#defi
0b30: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  ne GSCIS_TAG_MNA
0b40: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0b50: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53   0x02.#define GS
0b60: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20  CIS_TAG_LNAME   
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33              0x03
0b80: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b90: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20  AG_SUFFIX       
0ba0: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66         0x04.#def
0bb0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ine GSCIS_TAG_GO
0bc0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20  VT_AGENCY       
0bd0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47    0x05.#define G
0be0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20  SCIS_TAG_BUREAU 
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0c00: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  6.#define GSCIS_
0c10: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20  TAG_BUREAU_CODE 
0c20: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65          0x07.#de
0c30: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
0c40: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EPT_CODE        
0c50: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20     0x08.#define 
0c60: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20  GSCIS_TAG_TITLE 
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0c80: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  09.#define GSCIS
0c90: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20  _TAG_BUILDING   
0ca0: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64           0x10.#d
0cb0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0cc0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20  OFFICE_ADDR1    
0cd0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65      0x11.#define
0ce0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cf0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30  E_ADDR2        0
0d00: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x12.#define GSCI
0d10: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
0d20: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23  Y         0x13.#
0d30: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0d40: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20  _OFFICE_STATE   
0d50: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e       0x14.#defin
0d60: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0d70: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20  CE_ZIP          
0d80: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0x15.#define GSC
0d90: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f  IS_TAG_OFFICE_CO
0da0: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a  UNTRY      0x16.
0db0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0dc0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20  G_OFFICE_PHONE  
0dd0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69        0x17.#defi
0de0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0df0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20  ICE_PHONE_EXT   
0e00: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53   0x18.#define GS
0e10: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
0e20: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39  AX          0x19
0e30: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0e40: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20  AG_OFFICE_EMAIL 
0e50: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66         0x1A.#def
0e60: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0e70: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20  FICE_ROOM       
0e80: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47    0x1B.#define G
0e90: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
0ea0: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31  AGENCY       0x1
0eb0: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  C.#define GSCIS_
0ec0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
0ed0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a  OR      0x1D../*
0ee0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30  ** PII - EF 2100
0ef0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20  CIS_TAG_SSN     
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30              0x20
0f20: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f30: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20  AG_DOB          
0f40: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66         0x21.#def
0f50: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45  ine GSCIS_TAG_GE
0f60: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NDER            
0f70: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67    0x22../*** Log
0f80: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  in Information -
0f90: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 4000 ***/.#d
0fa0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0fb0: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20  USERID          
0fc0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65      0x40.#define
0fd0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
0fe0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  N              0
0ff0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x41.#define GSCI
1000: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20  S_TAG_PASSWORD  
1010: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a            0x42..
1020: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d  /*** Card Inform
1030: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20  ation - EF 5000 
1040: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
1050: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20  IS_TAG_ISSUERID 
1060: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a             0x50.
1070: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1080: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20  G_SERNO         
1090: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69        0x51.#defi
10a0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53  ne GSCIS_TAG_ISS
10b0: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  UE_DATE         
10c0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
10d0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
10e0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33  ATE         0x53
10f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1100: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20  AG_CARD_TYPE    
1110: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66         0x54.#def
1120: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ine GSCIS_TAG_SE
1130: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20  CURITY_CODE     
1140: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47    0x57.#define G
1150: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
1160: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35  AID          0x5
1170: 38 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f  8../*** PKI Info
1180: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30  rmation - EF 700
1190: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
11a0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
11b0: 43 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37  CATE         0x7
11c0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
11d0: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
11e0: 41 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65  ATE     0x71.#de
11f0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43  fine GSCIS_TAG_C
1200: 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20  ERT_EXPIRE_DATE 
1210: 20 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70     0x72../** App
1220: 6c 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66  let IDs **/.#def
1230: 69 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43  ine GSCIS_AID_CC
1240: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C               
1250: 20 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78    0xA0, 0x00, 0x
1260: 30 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20  00, 0x01, 0x16, 
1270: 30 78 44 42 2c 20 30 78 30 30 0a 0a 2f 2a 20 4d  0xDB, 0x00../* M
1280: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 64  aximum size of d
1290: 61 74 61 20 70 6f 72 74 69 6f 6e 20 6f 66 20 41  ata portion of A
12a0: 50 44 55 73 20 2a 2f 0a 2f 2a 2a 20 44 6f 20 6e  PDUs */./** Do n
12b0: 6f 74 20 73 65 74 20 74 68 69 73 20 61 62 6f 76  ot set this abov
12c0: 65 20 32 35 30 20 2a 2a 2f 0a 23 64 65 66 69 6e  e 250 **/.#defin
12d0: 65 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  e CACKEY_APDU_MT
12e0: 55 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  U               
12f0: 32 35 30 0a 0a 2f 2a 20 41 54 52 20 49 66 20 6e  250../* ATR If n
1300: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
1310: 23 69 66 6e 64 65 66 20 4d 41 58 5f 41 54 52 5f  #ifndef MAX_ATR_
1320: 53 49 5a 45 0a 23 64 65 66 69 6e 65 20 4d 41 58  SIZE.#define MAX
1330: 5f 41 54 52 5f 53 49 5a 45 20 31 30 32 34 0a 23  _ATR_SIZE 1024.#
1340: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 43 41  endif..#ifdef CA
1350: 43 4b 45 59 5f 44 45 42 55 47 0a 23 20 20 69 66  CKEY_DEBUG.#  if
1360: 64 65 66 20 48 41 56 45 5f 54 49 4d 45 5f 48 0a  def HAVE_TIME_H.
1370: 23 20 20 20 20 69 6e 63 6c 75 64 65 20 3c 74 69  #    include <ti
1380: 6d 65 2e 68 3e 0a 73 74 61 74 69 63 20 74 69 6d  me.h>.static tim
1390: 65 5f 74 20 63 61 63 6b 65 79 5f 64 65 62 75 67  e_t cackey_debug
13a0: 5f 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 30 3b  _start_time = 0;
13b0: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 43 41 43  .#    define CAC
13c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
13d0: 49 4d 45 20 7b 20 69 66 20 28 63 61 63 6b 65 79  IME { if (cackey
13e0: 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d  _debug_start_tim
13f0: 65 20 3d 3d 20 30 29 20 7b 20 63 61 63 6b 65 79  e == 0) { cackey
1400: 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d  _debug_start_tim
1410: 65 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 20  e = time(NULL); 
1420: 7d 3b 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65  }; fprintf(cacke
1430: 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b  y_debug_fd(), "[
1440: 25 6c 75 5d 3a 20 22 2c 20 28 75 6e 73 69 67 6e  %lu]: ", (unsign
1450: 65 64 20 6c 6f 6e 67 29 20 28 74 69 6d 65 28 4e  ed long) (time(N
1460: 55 4c 4c 29 20 2d 20 63 61 63 6b 65 79 5f 64 65  ULL) - cackey_de
1470: 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 29 29  bug_start_time))
1480: 3b 20 7d 0a 23 20 20 65 6c 73 65 0a 23 20 20 20  ; }.#  else.#   
1490: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
14a0: 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 20 2f  EBUG_PRINTTIME /
14b0: 2a 2a 2f 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20  **/.#  endif..# 
14c0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
14d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e  EBUG_PRINTF(x...
14e0: 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ) { CACKEY_DEBUG
14f0: 5f 50 52 49 4e 54 54 49 4d 45 3b 20 66 70 72 69  _PRINTTIME; fpri
1500: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1510: 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a  _fd(), "%s():%i:
1520: 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f   ", __func__, __
1530: 4c 49 4e 45 5f 5f 29 3b 20 66 70 72 69 6e 74 66  LINE__); fprintf
1540: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
1550: 28 29 2c 20 78 29 3b 20 66 70 72 69 6e 74 66 28  (), x); fprintf(
1560: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
1570: 29 2c 20 22 5c 6e 22 29 3b 20 66 66 6c 75 73 68  ), "\n"); fflush
1580: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
1590: 28 29 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65  ()); }.#  define
15a0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
15b0: 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20  INTBUF(f, x, y) 
15c0: 7b 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  { unsigned char 
15d0: 2a 54 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e 65  *TMPBUF; unsigne
15e0: 64 20 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50 42  d long idx; TMPB
15f0: 55 46 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  UF = (unsigned c
1600: 68 61 72 20 2a 29 20 28 78 29 3b 20 43 41 43 4b  har *) (x); CACK
1610: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 49  EY_DEBUG_PRINTTI
1620: 4d 45 3b 20 66 70 72 69 6e 74 66 28 63 61 63 6b  ME; fprintf(cack
1630: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1640: 25 73 28 29 3a 25 69 3a 20 25 73 20 20 28 25 73  %s():%i: %s  (%s
1650: 2f 25 6c 75 20 3d 20 7b 25 30 32 78 22 2c 20 5f  /%lu = {%02x", _
1660: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1670: 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67  _, f, #x, (unsig
1680: 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54  ned long) (y), T
1690: 4d 50 42 55 46 5b 30 5d 29 3b 20 66 6f 72 20 28  MPBUF[0]); for (
16a0: 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28  idx = 1; idx < (
16b0: 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20 66 70 72  y); idx++) { fpr
16c0: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
16d0: 67 5f 66 64 28 29 2c 20 22 2c 20 25 30 32 78 22  g_fd(), ", %02x"
16e0: 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20  , TMPBUF[idx]); 
16f0: 7d 3b 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65  }; fprintf(cacke
1700: 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 7d  y_debug_fd(), "}
1710: 29 5c 6e 22 29 3b 20 66 66 6c 75 73 68 28 63 61  )\n"); fflush(ca
1720: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29  ckey_debug_fd())
1730: 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ; }.#  define CA
1740: 43 4b 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f  CKEY_DEBUG_PERRO
1750: 52 28 78 29 20 7b 20 66 70 72 69 6e 74 66 28 63  R(x) { fprintf(c
1760: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1770: 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f  , "%s():%i: ", _
1780: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1790: 5f 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55 47  _); CACKEY_DEBUG
17a0: 5f 50 52 49 4e 54 54 49 4d 45 3b 20 70 65 72 72  _PRINTTIME; perr
17b0: 6f 72 28 78 29 3b 20 66 66 6c 75 73 68 28 63 61  or(x); fflush(ca
17c0: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29  ckey_debug_fd())
17d0: 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 66 72  ; }.#  define fr
17e0: 65 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f 44  ee(x) { CACKEY_D
17f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52 45  EBUG_PRINTF("FRE
1800: 45 28 25 70 29 20 28 25 73 29 22 2c 20 28 76 6f  E(%p) (%s)", (vo
1810: 69 64 20 2a 29 20 78 2c 20 23 78 29 3b 20 66 72  id *) x, #x); fr
1820: 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69 63  ee(x); }..static
1830: 20 46 49 4c 45 20 2a 63 61 63 6b 65 79 5f 64 65   FILE *cackey_de
1840: 62 75 67 5f 66 64 28 76 6f 69 64 29 20 7b 0a 09  bug_fd(void) {..
1850: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 64 20  static FILE *fd 
1860: 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6c  = NULL;..char *l
1870: 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20 28 66 64  ogfile;...if (fd
1880: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   != NULL) {...re
1890: 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09 2f  turn(fd);..}.../
18a0: 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20 73 74 64  *.. * Log to std
18b0: 65 72 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 6f  err initially so
18c0: 20 77 65 20 63 61 6e 20 75 73 65 20 64 65 62 75   we can use debu
18d0: 67 67 69 6e 67 20 77 69 74 68 69 6e 0a 09 20 2a  gging within.. *
18e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
18f0: 69 74 68 6f 75 74 20 67 65 74 74 69 6e 67 20 69  ithout getting i
1900: 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65 20  nto an infinite 
1910: 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64 20 3d 20  loop.. */..fd = 
1920: 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67 66 69 6c  stderr;...logfil
1930: 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43 4b  e = getenv("CACK
1940: 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45  EY_DEBUG_LOGFILE
1950: 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65  ");..if (logfile
1960: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   != NULL) {...CA
1970: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1980: 46 28 22 46 6f 75 6e 64 20 65 6e 76 69 72 6f 6e  F("Found environ
1990: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 3a 20 25  ment variable: %
19a0: 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09  s", logfile);...
19b0: 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74 72 63 68  .logfile = strch
19c0: 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d 27 29 3b  r(logfile, '=');
19d0: 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 3d  ...if (logfile =
19e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67  = NULL) {....log
19f0: 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43  file = getenv("C
1a00: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1a10: 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c 73 65 20  ILE");...} else 
1a20: 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b 0a  {....logfile++;.
1a30: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f 67  ..}..}...if (log
1a40: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
1a50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a60: 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6c 6f 67  RINTF("Found log
1a70: 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c 6f 67 66   file: %s", logf
1a80: 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d 20 66 6f  ile);....fd = fo
1a90: 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20 22 61 22  pen(logfile, "a"
1aa0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d  );..}...if (fd =
1ab0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 64 20 3d  = NULL) {...fd =
1ac0: 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a 09 69 66   stderr;..}...if
1ad0: 20 28 66 64 20 3d 3d 20 73 74 64 65 72 72 29 20   (fd == stderr) 
1ae0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1af0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1b00: 6e 67 20 73 74 64 65 72 72 22 29 3b 0a 09 7d 20  ng stderr");..} 
1b10: 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f  else {...CACKEY_
1b20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1b30: 74 75 72 6e 69 6e 67 20 25 70 22 2c 20 28 76 6f  turning %p", (vo
1b40: 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d 0a 0a 09  id *) fd);..}...
1b50: 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a 73  return(fd);.}..s
1b60: 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b  tatic void *CACK
1b70: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41  EY_DEBUG_FUNC_MA
1b80: 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65  LLOC(size_t size
1b90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75  , const char *fu
1ba0: 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a  nc, int line) {.
1bb0: 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a  .void *retval;..
1bc0: 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63  .retval = malloc
1bd0: 28 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59  (size);...CACKEY
1be0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45  _DEBUG_PRINTTIME
1bf0: 3b 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65  ;..fprintf(cacke
1c00: 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 25  y_debug_fd(), "%
1c10: 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c  s():%i: ", func,
1c20: 20 6c 69 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66   line);..fprintf
1c30: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
1c40: 28 29 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 3d 20  (), "MALLOC() = 
1c50: 25 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66  %p", retval);..f
1c60: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1c70: 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b  bug_fd(), "\n");
1c80: 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
1c90: 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72  debug_fd());...r
1ca0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
1cb0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43  ..static void *C
1cc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
1cd0: 5f 52 45 41 4c 4c 4f 43 28 76 6f 69 64 20 2a 70  _REALLOC(void *p
1ce0: 74 72 2c 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c  tr, size_t size,
1cf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e   const char *fun
1d00: 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09  c, int line) {..
1d10: 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09  void *retval;...
1d20: 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63  retval = realloc
1d30: 28 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 69  (ptr, size);...i
1d40: 66 20 28 72 65 74 76 61 6c 20 21 3d 20 70 74 72  f (retval != ptr
1d50: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d60: 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 0a 09 09  UG_PRINTTIME;...
1d70: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
1d80: 65 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28 29  ebug_fd(), "%s()
1d90: 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69  :%i: ", func, li
1da0: 6e 65 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 63  ne);...fprintf(c
1db0: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1dc0: 2c 20 22 52 45 41 4c 4c 4f 43 28 25 70 29 20 3d  , "REALLOC(%p) =
1dd0: 20 25 70 22 2c 20 70 74 72 2c 20 72 65 74 76 61   %p", ptr, retva
1de0: 6c 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 63 61  l);...fprintf(ca
1df0: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
1e00: 20 22 5c 6e 22 29 3b 0a 09 09 66 66 6c 75 73 68   "\n");...fflush
1e10: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
1e20: 28 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  ());..}...if (re
1e30: 74 76 61 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tval == NULL) {.
1e40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e50: 52 49 4e 54 46 28 22 20 2a 2a 2a 20 45 52 52 4f  RINTF(" *** ERRO
1e60: 52 20 2a 2a 2a 20 72 65 61 6c 6c 6f 63 20 72 65  R *** realloc re
1e70: 74 75 72 6e 65 64 20 4e 55 4c 4c 20 28 73 69 7a  turned NULL (siz
1e80: 65 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  e = %lu)", (unsi
1e90: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29  gned long) size)
1ea0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
1eb0: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
1ec0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
1ed0: 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28  BUG_FUNC_STRDUP(
1ee0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 74 72 2c  const char *ptr,
1ef0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e   const char *fun
1f00: 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09  c, int line) {..
1f10: 63 68 61 72 20 2a 72 65 74 76 61 6c 3b 0a 0a 09  char *retval;...
1f20: 72 65 74 76 61 6c 20 3d 20 73 74 72 64 75 70 28  retval = strdup(
1f30: 70 74 72 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ptr);...CACKEY_D
1f40: 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 0a  EBUG_PRINTTIME;.
1f50: 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f  .fprintf(cackey_
1f60: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28  debug_fd(), "%s(
1f70: 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c  ):%i: ", func, l
1f80: 69 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 63  ine);..fprintf(c
1f90: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1fa0: 2c 20 22 53 54 52 44 55 50 5f 4d 41 4c 4c 4f 43  , "STRDUP_MALLOC
1fb0: 28 29 20 3d 20 25 70 22 2c 20 72 65 74 76 61 6c  () = %p", retval
1fc0: 29 3b 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b  );..fprintf(cack
1fd0: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1fe0: 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 63 61  \n");..fflush(ca
1ff0: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29  ckey_debug_fd())
2000: 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
2010: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f  l);.}..static co
2020: 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59  nst char *CACKEY
2030: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f  _DEBUG_FUNC_TAG_
2040: 54 4f 5f 53 54 52 28 75 6e 73 69 67 6e 65 64 20  TO_STR(unsigned 
2050: 63 68 61 72 20 74 61 67 29 20 7b 0a 09 73 77 69  char tag) {..swi
2060: 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 63 61  tch (tag) {...ca
2070: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
2080: 44 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DID:....return("
2090: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
20a0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
20b0: 5f 54 41 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09  _TAG_CCC_VER:...
20c0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
20d0: 41 47 5f 43 43 43 5f 56 45 52 22 29 3b 0a 09 09  AG_CCC_VER");...
20e0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
20f0: 43 47 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72  CG_VER:....retur
2100: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 47  n("GSCIS_TAG_CCG
2110: 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47  _VER");...case G
2120: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
2130: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2140: 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 22 29  IS_TAG_CARDURL")
2150: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2160: 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 72 65  AG_PKCS15:....re
2170: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2180: 50 4b 43 53 31 35 22 29 3b 0a 09 09 63 61 73 65  PKCS15");...case
2190: 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44   GSCIS_TAG_REG_D
21a0: 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65  ATA_MODEL:....re
21b0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
21c0: 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29  REG_DATA_MODEL")
21d0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
21e0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
21f0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2200: 41 47 5f 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a  AG_ACR_TABLE");.
2210: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2220: 5f 43 41 52 44 5f 41 50 44 55 3a 0a 09 09 09 72  _CARD_APDU:....r
2230: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2240: 5f 43 41 52 44 5f 41 50 44 55 22 29 3b 0a 09 09  _CARD_APDU");...
2250: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52  case GSCIS_TAG_R
2260: 45 44 49 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72  EDIRECTION:....r
2270: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2280: 5f 52 45 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a  _REDIRECTION");.
2290: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
22a0: 5f 43 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  _CT:....return("
22b0: 47 53 43 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a  GSCIS_TAG_CT");.
22c0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
22d0: 5f 53 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  _ST:....return("
22e0: 47 53 43 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a  GSCIS_TAG_ST");.
22f0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2300: 5f 4e 45 58 54 43 43 43 3a 0a 09 09 09 72 65 74  _NEXTCCC:....ret
2310: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e  urn("GSCIS_TAG_N
2320: 45 58 54 43 43 43 22 29 3b 0a 09 09 63 61 73 65  EXTCCC");...case
2330: 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45   GSCIS_TAG_FNAME
2340: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2350: 49 53 5f 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a  IS_TAG_FNAME");.
2360: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2370: 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72  _MNAME:....retur
2380: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  n("GSCIS_TAG_MNA
2390: 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ME");...case GSC
23a0: 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09  IS_TAG_LNAME:...
23b0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
23c0: 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61  AG_LNAME");...ca
23d0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46  se GSCIS_TAG_SUF
23e0: 46 49 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  FIX:....return("
23f0: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
2400: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2410: 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59  _TAG_GOVT_AGENCY
2420: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2430: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e  IS_TAG_GOVT_AGEN
2440: 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  CY");...case GSC
2450: 49 53 5f 54 41 47 5f 42 55 52 45 41 55 3a 0a 09  IS_TAG_BUREAU:..
2460: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2470: 54 41 47 5f 42 55 52 45 41 55 22 29 3b 0a 09 09  TAG_BUREAU");...
2480: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42  case GSCIS_TAG_B
2490: 55 52 45 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72  UREAU_CODE:....r
24a0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
24b0: 5f 42 55 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a  _BUREAU_CODE");.
24c0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
24d0: 5f 44 45 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72  _DEPT_CODE:....r
24e0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
24f0: 5f 44 45 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09  _DEPT_CODE");...
2500: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 54  case GSCIS_TAG_T
2510: 49 54 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ITLE:....return(
2520: 22 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45  "GSCIS_TAG_TITLE
2530: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2540: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09  _TAG_BUILDING:..
2550: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2560: 54 41 47 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a  TAG_BUILDING");.
2570: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2580: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 3a 0a 09  _OFFICE_ADDR1:..
2590: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
25a0: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31  TAG_OFFICE_ADDR1
25b0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
25c0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
25d0: 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  2:....return("GS
25e0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
25f0: 44 44 52 32 22 29 3b 0a 09 09 63 61 73 65 20 47  DDR2");...case G
2600: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2610: 43 49 54 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  CITY:....return(
2620: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2630: 45 5f 43 49 54 59 22 29 3b 0a 09 09 63 61 73 65  E_CITY");...case
2640: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2650: 45 5f 53 54 41 54 45 3a 0a 09 09 09 72 65 74 75  E_STATE:....retu
2660: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2670: 46 49 43 45 5f 53 54 41 54 45 22 29 3b 0a 09 09  FICE_STATE");...
2680: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2690: 46 46 49 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65  FFICE_ZIP:....re
26a0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
26b0: 4f 46 46 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09  OFFICE_ZIP");...
26c0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
26d0: 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09  FFICE_COUNTRY:..
26e0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
26f0: 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54  TAG_OFFICE_COUNT
2700: 52 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  RY");...case GSC
2710: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
2720: 4f 4e 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ONE:....return("
2730: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2740: 5f 50 48 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65  _PHONE");...case
2750: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2760: 45 5f 50 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09  E_PHONE_EXT:....
2770: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2780: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45  G_OFFICE_PHONE_E
2790: 58 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  XT");...case GSC
27a0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41  IS_TAG_OFFICE_FA
27b0: 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  X:....return("GS
27c0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
27d0: 41 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  AX");...case GSC
27e0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
27f0: 41 49 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AIL:....return("
2800: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2810: 5f 45 4d 41 49 4c 22 29 3b 0a 09 09 63 61 73 65  _EMAIL");...case
2820: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2830: 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72  E_ROOM:....retur
2840: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2850: 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61  ICE_ROOM");...ca
2860: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  se GSCIS_TAG_NON
2870: 47 4f 56 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72  GOV_AGENCY:....r
2880: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2890: 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29  _NONGOV_AGENCY")
28a0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
28b0: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f  AG_SSN_DESIGNATO
28c0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  R:....return("GS
28d0: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
28e0: 47 4e 41 54 4f 52 22 29 3b 0a 09 09 63 61 73 65  GNATOR");...case
28f0: 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a   GSCIS_TAG_SSN:.
2900: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2910: 5f 54 41 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61  _TAG_SSN");...ca
2920: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42  se GSCIS_TAG_DOB
2930: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2940: 49 53 5f 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09  IS_TAG_DOB");...
2950: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47  case GSCIS_TAG_G
2960: 45 4e 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  ENDER:....return
2970: 28 22 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44  ("GSCIS_TAG_GEND
2980: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ER");...case GSC
2990: 49 53 5f 54 41 47 5f 55 53 45 52 49 44 3a 0a 09  IS_TAG_USERID:..
29a0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
29b0: 54 41 47 5f 55 53 45 52 49 44 22 29 3b 0a 09 09  TAG_USERID");...
29c0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44  case GSCIS_TAG_D
29d0: 4f 4d 41 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e  OMAIN:....return
29e0: 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41  ("GSCIS_TAG_DOMA
29f0: 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  IN");...case GSC
2a00: 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 3a  IS_TAG_PASSWORD:
2a10: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2a20: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 22 29  S_TAG_PASSWORD")
2a30: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2a40: 41 47 5f 49 53 53 55 45 52 49 44 3a 0a 09 09 09  AG_ISSUERID:....
2a50: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2a60: 47 5f 49 53 53 55 45 52 49 44 22 29 3b 0a 09 09  G_ISSUERID");...
2a70: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
2a80: 45 52 4e 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERNO:....return(
2a90: 22 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f  "GSCIS_TAG_SERNO
2aa0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2ab0: 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45 3a  _TAG_ISSUE_DATE:
2ac0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2ad0: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
2ae0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2af0: 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45  _TAG_EXPIRE_DATE
2b00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2b10: 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41  IS_TAG_EXPIRE_DA
2b20: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  TE");...case GSC
2b30: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
2b40: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2b50: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
2b60: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2b70: 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f  _TAG_SECURITY_CO
2b80: 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  DE:....return("G
2b90: 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54  SCIS_TAG_SECURIT
2ba0: 59 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65  Y_CODE");...case
2bb0: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49   GSCIS_TAG_CARDI
2bc0: 44 5f 41 49 44 3a 0a 09 09 09 72 65 74 75 72 6e  D_AID:....return
2bd0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  ("GSCIS_TAG_CARD
2be0: 49 44 5f 41 49 44 22 29 3b 0a 09 09 63 61 73 65  ID_AID");...case
2bf0: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
2c00: 46 49 43 41 54 45 3a 0a 09 09 09 72 65 74 75 72  FICATE:....retur
2c10: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52  n("GSCIS_TAG_CER
2c20: 54 49 46 49 43 41 54 45 22 29 3b 0a 09 09 63 61  TIFICATE");...ca
2c30: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  se GSCIS_TAG_CER
2c40: 54 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09  T_ISSUE_DATE:...
2c50: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2c60: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
2c70: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  TE");...case GSC
2c80: 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49  IS_TAG_CERT_EXPI
2c90: 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  RE_DATE:....retu
2ca0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45  rn("GSCIS_TAG_CE
2cb0: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29  RT_EXPIRE_DATE")
2cc0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55  ;..}...return("U
2cd0: 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61  NKNOWN");.}..sta
2ce0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2cf0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2d00: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
2d10: 52 28 4c 4f 4e 47 20 72 65 74 63 6f 64 65 29 20  R(LONG retcode) 
2d20: 7b 0a 09 73 77 69 74 63 68 20 28 72 65 74 63 6f  {..switch (retco
2d30: 64 65 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41  de) {...case SCA
2d40: 52 44 5f 53 5f 53 55 43 43 45 53 53 3a 0a 09 09  RD_S_SUCCESS:...
2d50: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 53  .return("SCARD_S
2d60: 5f 53 55 43 43 45 53 53 22 29 3b 0a 09 09 63 61  _SUCCESS");...ca
2d70: 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 43 45  se SCARD_E_CANCE
2d80: 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  LLED:....return(
2d90: 22 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c  "SCARD_E_CANCELL
2da0: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
2db0: 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53  RD_E_CANT_DISPOS
2dc0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
2dd0: 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f  ARD_E_CANT_DISPO
2de0: 53 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  SE");...case SCA
2df0: 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e  RD_E_INSUFFICIEN
2e00: 54 5f 42 55 46 46 45 52 3a 0a 09 09 09 72 65 74  T_BUFFER:....ret
2e10: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 53  urn("SCARD_E_INS
2e20: 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52  UFFICIENT_BUFFER
2e30: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2e40: 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a  _E_INVALID_ATR:.
2e50: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2e60: 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 22 29  _E_INVALID_ATR")
2e70: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2e80: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a  _INVALID_HANDLE:
2e90: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2ea0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44  D_E_INVALID_HAND
2eb0: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  LE");...case SCA
2ec0: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52  RD_E_INVALID_PAR
2ed0: 41 4d 45 54 45 52 3a 0a 09 09 09 72 65 74 75 72  AMETER:....retur
2ee0: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
2ef0: 49 44 5f 50 41 52 41 4d 45 54 45 52 22 29 3b 0a  ID_PARAMETER");.
2f00: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49  ..case SCARD_E_I
2f10: 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09  NVALID_TARGET:..
2f20: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2f30: 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 54  E_INVALID_TARGET
2f40: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2f50: 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45  _E_INVALID_VALUE
2f60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2f70: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c  RD_E_INVALID_VAL
2f80: 55 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  UE");...case SCA
2f90: 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a  RD_E_NO_MEMORY:.
2fa0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2fb0: 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a  _E_NO_MEMORY");.
2fc0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55  ..case SCARD_E_U
2fd0: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09  NKNOWN_READER:..
2fe0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2ff0: 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52  E_UNKNOWN_READER
3000: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3010: 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72  _E_TIMEOUT:....r
3020: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 54  eturn("SCARD_E_T
3030: 49 4d 45 4f 55 54 22 29 3b 0a 09 09 63 61 73 65  IMEOUT");...case
3040: 20 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47   SCARD_E_SHARING
3050: 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72  _VIOLATION:....r
3060: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53  eturn("SCARD_E_S
3070: 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e  HARING_VIOLATION
3080: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3090: 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a  _E_NO_SMARTCARD:
30a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
30b0: 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44  D_E_NO_SMARTCARD
30c0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
30d0: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a  _E_UNKNOWN_CARD:
30e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
30f0: 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44  D_E_UNKNOWN_CARD
3100: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3110: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
3120: 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  H:....return("SC
3130: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
3140: 41 54 43 48 22 29 3b 0a 09 09 63 61 73 65 20 53  ATCH");...case S
3150: 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59  CARD_E_NOT_READY
3160: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3170: 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29  RD_E_NOT_READY")
3180: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3190: 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45  _SYSTEM_CANCELLE
31a0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
31b0: 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e  ARD_E_SYSTEM_CAN
31c0: 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65  CELLED");...case
31d0: 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41   SCARD_E_NOT_TRA
31e0: 4e 53 41 43 54 45 44 3a 0a 09 09 09 72 65 74 75  NSACTED:....retu
31f0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f  rn("SCARD_E_NOT_
3200: 54 52 41 4e 53 41 43 54 45 44 22 29 3b 0a 09 09  TRANSACTED");...
3210: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45 41  case SCARD_E_REA
3220: 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a  DER_UNAVAILABLE:
3230: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3240: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41  D_E_READER_UNAVA
3250: 49 4c 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65  ILABLE");...case
3260: 20 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f   SCARD_W_UNSUPPO
3270: 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65  RTED_CARD:....re
3280: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e  turn("SCARD_W_UN
3290: 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44 22 29  SUPPORTED_CARD")
32a0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57  ;...case SCARD_W
32b0: 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41  _UNRESPONSIVE_CA
32c0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
32d0: 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53  CARD_W_UNRESPONS
32e0: 49 56 45 5f 43 41 52 44 22 29 3b 0a 09 09 63 61  IVE_CARD");...ca
32f0: 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  se SCARD_W_UNPOW
3300: 45 52 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65  ERED_CARD:....re
3310: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e  turn("SCARD_W_UN
3320: 50 4f 57 45 52 45 44 5f 43 41 52 44 22 29 3b 0a  POWERED_CARD");.
3330: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52  ..case SCARD_W_R
3340: 45 53 45 54 5f 43 41 52 44 3a 0a 09 09 09 72 65  ESET_CARD:....re
3350: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45  turn("SCARD_W_RE
3360: 53 45 54 5f 43 41 52 44 22 29 3b 0a 09 09 63 61  SET_CARD");...ca
3370: 73 65 20 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56  se SCARD_W_REMOV
3380: 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ED_CARD:....retu
3390: 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f  rn("SCARD_W_REMO
33a0: 56 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61  VED_CARD");...ca
33b0: 73 65 20 53 43 41 52 44 5f 45 5f 50 43 49 5f 54  se SCARD_E_PCI_T
33c0: 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74  OO_SMALL:....ret
33d0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 43 49  urn("SCARD_E_PCI
33e0: 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09  _TOO_SMALL");...
33f0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45 41  case SCARD_E_REA
3400: 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a  DER_UNSUPPORTED:
3410: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3420: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50  D_E_READER_UNSUP
3430: 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73 65  PORTED");...case
3440: 20 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41   SCARD_E_DUPLICA
3450: 54 45 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65  TE_READER:....re
3460: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 44 55  turn("SCARD_E_DU
3470: 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52 22 29  PLICATE_READER")
3480: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3490: 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45  _CARD_UNSUPPORTE
34a0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
34b0: 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50  ARD_E_CARD_UNSUP
34c0: 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73 65  PORTED");...case
34d0: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56   SCARD_E_NO_SERV
34e0: 49 43 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ICE:....return("
34f0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49  SCARD_E_NO_SERVI
3500: 43 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  CE");...case SCA
3510: 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f  RD_E_SERVICE_STO
3520: 50 50 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  PPED:....return(
3530: 22 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45  "SCARD_E_SERVICE
3540: 5f 53 54 4f 50 50 45 44 22 29 3b 0a 09 09 63 61  _STOPPED");...ca
3550: 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 53 55 50  se SCARD_E_UNSUP
3560: 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 3a 0a  PORTED_FEATURE:.
3570: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3580: 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46  _E_UNSUPPORTED_F
3590: 45 41 54 55 52 45 22 29 3b 0a 23 69 66 64 65 66  EATURE");.#ifdef
35a0: 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45   SCARD_W_INSERTE
35b0: 44 5f 43 41 52 44 0a 09 09 63 61 73 65 20 53 43  D_CARD...case SC
35c0: 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43  ARD_W_INSERTED_C
35d0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
35e0: 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44  SCARD_W_INSERTED
35f0: 5f 43 41 52 44 22 29 3b 0a 23 65 6e 64 69 66 0a  _CARD");.#endif.
3600: 23 69 66 64 65 66 20 53 43 41 52 44 5f 45 5f 4e  #ifdef SCARD_E_N
3610: 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41  O_READERS_AVAILA
3620: 42 4c 45 0a 09 09 63 61 73 65 20 53 43 41 52 44  BLE...case SCARD
3630: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56  _E_NO_READERS_AV
3640: 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  AILABLE:....retu
3650: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  rn("SCARD_E_NO_R
3660: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
3670: 22 29 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09  ");.#endif..}...
3680: 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22  return("UNKNOWN"
3690: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e  );.}..static con
36a0: 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f  st char *CACKEY_
36b0: 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
36c0: 5f 54 4f 5f 53 54 52 28 75 69 6e 74 31 36 5f 74  _TO_STR(uint16_t
36d0: 20 6f 62 6a 69 64 29 20 7b 0a 09 73 77 69 74 63   objid) {..switc
36e0: 68 20 28 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61  h (objid) {...ca
36f0: 73 65 20 30 78 32 30 30 30 3a 0a 09 09 09 72 65  se 0x2000:....re
3700: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3710: 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e  _OBJID_GENERALIN
3720: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 32  FO");...case 0x2
3730: 31 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  100:....return("
3740: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3750: 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f  _PROPERSONALINFO
3760: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 33 30 30  ");...case 0x300
3770: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3780: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41  CKEY_TLV_OBJID_A
3790: 43 43 45 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a  CCESSCONTROL");.
37a0: 09 09 63 61 73 65 20 30 78 34 30 30 30 3a 0a 09  ..case 0x4000:..
37b0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
37c0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e  _TLV_OBJID_LOGIN
37d0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 35 30 30  ");...case 0x500
37e0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
37f0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
3800: 41 52 44 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73  ARDINFO");...cas
3810: 65 20 30 78 36 30 30 30 3a 0a 09 09 09 72 65 74  e 0x6000:....ret
3820: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3830: 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53  OBJID_BIOMETRICS
3840: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 37 30 30  ");...case 0x700
3850: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3860: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44  CKEY_TLV_OBJID_D
3870: 49 47 49 54 41 4c 53 49 47 43 45 52 54 22 29 3b  IGITALSIGCERT");
3880: 0a 09 09 63 61 73 65 20 30 78 30 32 30 30 3a 0a  ...case 0x0200:.
3890: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
38a0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
38b0: 50 45 52 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65  PERSON");...case
38c0: 20 30 78 30 32 30 32 3a 0a 09 09 09 72 65 74 75   0x0202:....retu
38d0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
38e0: 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54  BJID_CAC_BENEFIT
38f0: 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  S");...case 0x02
3900: 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  03:....return("C
3910: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3920: 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54  CAC_OTHERBENEFIT
3930: 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  S");...case 0x02
3940: 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  01:....return("C
3950: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3960: 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b  CAC_PERSONNEL");
3970: 0a 09 09 63 61 73 65 20 30 78 30 32 46 45 3a 0a  ...case 0x02FE:.
3980: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3990: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
39a0: 50 4b 49 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a  PKICERT");..}...
39b0: 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e  .return("UNKNOWN
39c0: 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f  ");.}..static co
39d0: 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59  nst char *CACKEY
39e0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54  _DEBUG_FUNC_APPT
39f0: 59 50 45 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38  YPE_TO_STR(uint8
3a00: 5f 74 20 61 70 70 74 79 70 65 29 20 7b 0a 09 73  _t apptype) {..s
3a10: 77 69 74 63 68 20 28 61 70 70 74 79 70 65 29 20  witch (apptype) 
3a20: 7b 0a 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09  {...case 0x00:..
3a30: 09 09 72 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29  ..return("NONE")
3a40: 3b 0a 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09  ;...case 0x01:..
3a50: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3a60: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
3a70: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 3a  ");...case 0x02:
3a80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3a90: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29  EY_TLV_APP_SKI")
3aa0: 3b 0a 09 09 63 61 73 65 20 30 78 30 33 3a 0a 09  ;...case 0x03:..
3ab0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3ac0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
3ad0: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
3ae0: 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_SKI");...case 
3af0: 30 78 30 34 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x04:....return(
3b00: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3b10: 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  PKI");...case 0x
3b20: 30 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  05:....return("C
3b30: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45  ACKEY_TLV_APP_GE
3b40: 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54  NERIC | CACKEY_T
3b50: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
3b60: 63 61 73 65 20 30 78 30 36 3a 0a 09 09 09 72 65  case 0x06:....re
3b70: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3b80: 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45  _APP_SKI | CACKE
3b90: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b  Y_TLV_APP_PKI");
3ba0: 0a 09 09 63 61 73 65 20 30 78 30 37 3a 0a 09 09  ...case 0x07:...
3bb0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3bc0: 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20  TLV_APP_GENERIC 
3bd0: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
3be0: 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c  _SKI | CACKEY_TL
3bf0: 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a  V_APP_PKI");..}.
3c00: 0a 09 72 65 74 75 72 6e 28 22 49 4e 56 41 4c 49  ..return("INVALI
3c10: 44 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  D");.}..static c
3c20: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
3c30: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54  Y_DEBUG_FUNC_ATT
3c40: 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 43 4b  RIBUTE_TO_STR(CK
3c50: 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 20  _ATTRIBUTE_TYPE 
3c60: 61 74 74 72 29 20 7b 0a 09 73 77 69 74 63 68 20  attr) {..switch 
3c70: 28 61 74 74 72 29 20 7b 0a 09 09 63 61 73 65 20  (attr) {...case 
3c80: 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 72 65  CKA_CLASS:....re
3c90: 74 75 72 6e 28 22 43 4b 41 5f 43 4c 41 53 53 22  turn("CKA_CLASS"
3ca0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 54 4f  );...case CKA_TO
3cb0: 4b 45 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  KEN:....return("
3cc0: 43 4b 41 5f 54 4f 4b 45 4e 22 29 3b 0a 09 09 63  CKA_TOKEN");...c
3cd0: 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a  ase CKA_PRIVATE:
3ce0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3cf0: 50 52 49 56 41 54 45 22 29 3b 0a 09 09 63 61 73  PRIVATE");...cas
3d00: 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09  e CKA_LABEL:....
3d10: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 41 42 45  return("CKA_LABE
3d20: 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  L");...case CKA_
3d30: 41 50 50 4c 49 43 41 54 49 4f 4e 3a 0a 09 09 09  APPLICATION:....
3d40: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 50 50 4c  return("CKA_APPL
3d50: 49 43 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  ICATION");...cas
3d60: 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09  e CKA_VALUE:....
3d70: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55  return("CKA_VALU
3d80: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
3d90: 4f 42 4a 45 43 54 5f 49 44 3a 0a 09 09 09 72 65  OBJECT_ID:....re
3da0: 74 75 72 6e 28 22 43 4b 41 5f 4f 42 4a 45 43 54  turn("CKA_OBJECT
3db0: 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  _ID");...case CK
3dc0: 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  A_CERTIFICATE_TY
3dd0: 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  PE:....return("C
3de0: 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  KA_CERTIFICATE_T
3df0: 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  YPE");...case CK
3e00: 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 72 65 74  A_ISSUER:....ret
3e10: 75 72 6e 28 22 43 4b 41 5f 49 53 53 55 45 52 22  urn("CKA_ISSUER"
3e20: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45  );...case CKA_SE
3e30: 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09  RIAL_NUMBER:....
3e40: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 52 49  return("CKA_SERI
3e50: 41 4c 5f 4e 55 4d 42 45 52 22 29 3b 0a 09 09 63  AL_NUMBER");...c
3e60: 61 73 65 20 43 4b 41 5f 41 43 5f 49 53 53 55 45  ase CKA_AC_ISSUE
3e70: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
3e80: 41 5f 41 43 5f 49 53 53 55 45 52 22 29 3b 0a 09  A_AC_ISSUER");..
3e90: 09 63 61 73 65 20 43 4b 41 5f 4f 57 4e 45 52 3a  .case CKA_OWNER:
3ea0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3eb0: 4f 57 4e 45 52 22 29 3b 0a 09 09 63 61 73 65 20  OWNER");...case 
3ec0: 43 4b 41 5f 41 54 54 52 5f 54 59 50 45 53 3a 0a  CKA_ATTR_TYPES:.
3ed0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
3ee0: 54 54 52 5f 54 59 50 45 53 22 29 3b 0a 09 09 63  TTR_TYPES");...c
3ef0: 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45 44 3a  ase CKA_TRUSTED:
3f00: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3f10: 54 52 55 53 54 45 44 22 29 3b 0a 09 09 63 61 73  TRUSTED");...cas
3f20: 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a  e CKA_KEY_TYPE:.
3f30: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b  ...return("CKA_K
3f40: 45 59 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73  EY_TYPE");...cas
3f50: 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09  e CKA_SUBJECT:..
3f60: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55  ..return("CKA_SU
3f70: 42 4a 45 43 54 22 29 3b 0a 09 09 63 61 73 65 20  BJECT");...case 
3f80: 43 4b 41 5f 49 44 3a 0a 09 09 09 72 65 74 75 72  CKA_ID:....retur
3f90: 6e 28 22 43 4b 41 5f 49 44 22 29 3b 0a 09 09 63  n("CKA_ID");...c
3fa0: 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56  ase CKA_SENSITIV
3fb0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
3fc0: 41 5f 53 45 4e 53 49 54 49 56 45 22 29 3b 0a 09  A_SENSITIVE");..
3fd0: 09 63 61 73 65 20 43 4b 41 5f 45 4e 43 52 59 50  .case CKA_ENCRYP
3fe0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
3ff0: 41 5f 45 4e 43 52 59 50 54 22 29 3b 0a 09 09 63  A_ENCRYPT");...c
4000: 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50 54 3a  ase CKA_DECRYPT:
4010: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4020: 44 45 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73  DECRYPT");...cas
4030: 65 20 43 4b 41 5f 57 52 41 50 3a 0a 09 09 09 72  e CKA_WRAP:....r
4040: 65 74 75 72 6e 28 22 43 4b 41 5f 57 52 41 50 22  eturn("CKA_WRAP"
4050: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 55 4e  );...case CKA_UN
4060: 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e 28  WRAP:....return(
4070: 22 43 4b 41 5f 55 4e 57 52 41 50 22 29 3b 0a 09  "CKA_UNWRAP");..
4080: 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a  .case CKA_SIGN:.
4090: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
40a0: 49 47 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  IGN");...case CK
40b0: 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a  A_SIGN_RECOVER:.
40c0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
40d0: 49 47 4e 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09  IGN_RECOVER");..
40e0: 09 63 61 73 65 20 43 4b 41 5f 56 45 52 49 46 59  .case CKA_VERIFY
40f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4100: 5f 56 45 52 49 46 59 22 29 3b 0a 09 09 63 61 73  _VERIFY");...cas
4110: 65 20 43 4b 41 5f 56 45 52 49 46 59 5f 52 45 43  e CKA_VERIFY_REC
4120: 4f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  OVER:....return(
4130: 22 43 4b 41 5f 56 45 52 49 46 59 5f 52 45 43 4f  "CKA_VERIFY_RECO
4140: 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  VER");...case CK
4150: 41 5f 44 45 52 49 56 45 3a 0a 09 09 09 72 65 74  A_DERIVE:....ret
4160: 75 72 6e 28 22 43 4b 41 5f 44 45 52 49 56 45 22  urn("CKA_DERIVE"
4170: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 54  );...case CKA_ST
4180: 41 52 54 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  ART_DATE:....ret
4190: 75 72 6e 28 22 43 4b 41 5f 53 54 41 52 54 5f 44  urn("CKA_START_D
41a0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ATE");...case CK
41b0: 41 5f 45 4e 44 5f 44 41 54 45 3a 0a 09 09 09 72  A_END_DATE:....r
41c0: 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 44 5f 44  eturn("CKA_END_D
41d0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ATE");...case CK
41e0: 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 72 65  A_MODULUS:....re
41f0: 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55  turn("CKA_MODULU
4200: 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  S");...case CKA_
4210: 4d 4f 44 55 4c 55 53 5f 42 49 54 53 3a 0a 09 09  MODULUS_BITS:...
4220: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44  .return("CKA_MOD
4230: 55 4c 55 53 5f 42 49 54 53 22 29 3b 0a 09 09 63  ULUS_BITS");...c
4240: 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45  ase CKA_PUBLIC_E
4250: 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75  XPONENT:....retu
4260: 72 6e 28 22 43 4b 41 5f 50 55 42 4c 49 43 5f 45  rn("CKA_PUBLIC_E
4270: 58 50 4f 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73  XPONENT");...cas
4280: 65 20 43 4b 41 5f 50 52 49 56 41 54 45 5f 45 58  e CKA_PRIVATE_EX
4290: 50 4f 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75 72  PONENT:....retur
42a0: 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45 5f 45  n("CKA_PRIVATE_E
42b0: 58 50 4f 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73  XPONENT");...cas
42c0: 65 20 43 4b 41 5f 50 52 49 4d 45 5f 31 3a 0a 09  e CKA_PRIME_1:..
42d0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52  ..return("CKA_PR
42e0: 49 4d 45 5f 31 22 29 3b 0a 09 09 63 61 73 65 20  IME_1");...case 
42f0: 43 4b 41 5f 50 52 49 4d 45 5f 32 3a 0a 09 09 09  CKA_PRIME_2:....
4300: 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d  return("CKA_PRIM
4310: 45 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  E_2");...case CK
4320: 41 5f 45 58 50 4f 4e 45 4e 54 5f 31 3a 0a 09 09  A_EXPONENT_1:...
4330: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50  .return("CKA_EXP
4340: 4f 4e 45 4e 54 5f 31 22 29 3b 0a 09 09 63 61 73  ONENT_1");...cas
4350: 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32  e CKA_EXPONENT_2
4360: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4370: 5f 45 58 50 4f 4e 45 4e 54 5f 32 22 29 3b 0a 09  _EXPONENT_2");..
4380: 09 63 61 73 65 20 43 4b 41 5f 43 4f 45 46 46 49  .case CKA_COEFFI
4390: 43 49 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e  CIENT:....return
43a0: 28 22 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e  ("CKA_COEFFICIEN
43b0: 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  T");...case CKA_
43c0: 50 52 49 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e  PRIME:....return
43d0: 28 22 43 4b 41 5f 50 52 49 4d 45 22 29 3b 0a 09  ("CKA_PRIME");..
43e0: 09 63 61 73 65 20 43 4b 41 5f 53 55 42 50 52 49  .case CKA_SUBPRI
43f0: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ME:....return("C
4400: 4b 41 5f 53 55 42 50 52 49 4d 45 22 29 3b 0a 09  KA_SUBPRIME");..
4410: 09 63 61 73 65 20 43 4b 41 5f 42 41 53 45 3a 0a  .case CKA_BASE:.
4420: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 42  ...return("CKA_B
4430: 41 53 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ASE");...case CK
4440: 41 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09  A_PRIME_BITS:...
4450: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
4460: 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73  ME_BITS");...cas
4470: 65 20 43 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f  e CKA_SUB_PRIME_
4480: 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  BITS:....return(
4490: 22 43 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42  "CKA_SUB_PRIME_B
44a0: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ITS");...case CK
44b0: 41 5f 56 41 4c 55 45 5f 42 49 54 53 3a 0a 09 09  A_VALUE_BITS:...
44c0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c  .return("CKA_VAL
44d0: 55 45 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73  UE_BITS");...cas
44e0: 65 20 43 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 3a  e CKA_VALUE_LEN:
44f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4500: 56 41 4c 55 45 5f 4c 45 4e 22 29 3b 0a 09 09 63  VALUE_LEN");...c
4510: 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41  ase CKA_EXTRACTA
4520: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
4530: 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 22  CKA_EXTRACTABLE"
4540: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c 4f  );...case CKA_LO
4550: 43 41 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  CAL:....return("
4560: 43 4b 41 5f 4c 4f 43 41 4c 22 29 3b 0a 09 09 63  CKA_LOCAL");...c
4570: 61 73 65 20 43 4b 41 5f 4e 45 56 45 52 5f 45 58  ase CKA_NEVER_EX
4580: 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 72 65  TRACTABLE:....re
4590: 74 75 72 6e 28 22 43 4b 41 5f 4e 45 56 45 52 5f  turn("CKA_NEVER_
45a0: 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09  EXTRACTABLE");..
45b0: 09 63 61 73 65 20 43 4b 41 5f 41 4c 57 41 59 53  .case CKA_ALWAYS
45c0: 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 72  _SENSITIVE:....r
45d0: 65 74 75 72 6e 28 22 43 4b 41 5f 41 4c 57 41 59  eturn("CKA_ALWAY
45e0: 53 5f 53 45 4e 53 49 54 49 56 45 22 29 3b 0a 09  S_SENSITIVE");..
45f0: 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 47 45  .case CKA_KEY_GE
4600: 4e 5f 4d 45 43 48 41 4e 49 53 4d 3a 0a 09 09 09  N_MECHANISM:....
4610: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f  return("CKA_KEY_
4620: 47 45 4e 5f 4d 45 43 48 41 4e 49 53 4d 22 29 3b  GEN_MECHANISM");
4630: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49  ...case CKA_MODI
4640: 46 49 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  FIABLE:....retur
4650: 6e 28 22 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c  n("CKA_MODIFIABL
4660: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4670: 45 43 44 53 41 5f 50 41 52 41 4d 53 3a 0a 09 09  ECDSA_PARAMS:...
4680: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 44  .return("CKA_ECD
4690: 53 41 5f 50 41 52 41 4d 53 22 29 3b 0a 09 09 63  SA_PARAMS");...c
46a0: 61 73 65 20 43 4b 41 5f 45 43 5f 50 4f 49 4e 54  ase CKA_EC_POINT
46b0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
46c0: 5f 45 43 5f 50 4f 49 4e 54 22 29 3b 0a 09 09 63  _EC_POINT");...c
46d0: 61 73 65 20 43 4b 41 5f 53 45 43 4f 4e 44 41 52  ase CKA_SECONDAR
46e0: 59 5f 41 55 54 48 3a 0a 09 09 09 72 65 74 75 72  Y_AUTH:....retur
46f0: 6e 28 22 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59  n("CKA_SECONDARY
4700: 5f 41 55 54 48 22 29 3b 0a 09 09 63 61 73 65 20  _AUTH");...case 
4710: 43 4b 41 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41  CKA_AUTH_PIN_FLA
4720: 47 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  GS:....return("C
4730: 4b 41 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47  KA_AUTH_PIN_FLAG
4740: 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  S");...case CKA_
4750: 48 57 5f 46 45 41 54 55 52 45 5f 54 59 50 45 3a  HW_FEATURE_TYPE:
4760: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4770: 48 57 5f 46 45 41 54 55 52 45 5f 54 59 50 45 22  HW_FEATURE_TYPE"
4780: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 52 45  );...case CKA_RE
4790: 53 45 54 5f 4f 4e 5f 49 4e 49 54 3a 0a 09 09 09  SET_ON_INIT:....
47a0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 52 45 53 45  return("CKA_RESE
47b0: 54 5f 4f 4e 5f 49 4e 49 54 22 29 3b 0a 09 09 63  T_ON_INIT");...c
47c0: 61 73 65 20 43 4b 41 5f 48 41 53 5f 52 45 53 45  ase CKA_HAS_RESE
47d0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
47e0: 41 5f 48 41 53 5f 52 45 53 45 54 22 29 3b 0a 09  A_HAS_RESET");..
47f0: 09 63 61 73 65 20 43 4b 41 5f 56 45 4e 44 4f 52  .case CKA_VENDOR
4800: 5f 44 45 46 49 4e 45 44 3a 0a 09 09 09 72 65 74  _DEFINED:....ret
4810: 75 72 6e 28 22 43 4b 41 5f 56 45 4e 44 4f 52 5f  urn("CKA_VENDOR_
4820: 44 45 46 49 4e 45 44 22 29 3b 0a 09 7d 0a 0a 09  DEFINED");..}...
4830: 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22  return("UNKNOWN"
4840: 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20  );.}..#  define 
4850: 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43 4b 45 59  malloc(x) CACKEY
4860: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
4870: 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  OC(x, __func__, 
4880: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66  __LINE__).#  def
4890: 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79  ine realloc(x, y
48a0: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
48b0: 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79  UNC_REALLOC(x, y
48c0: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
48d0: 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65 66 20 73  NE__).#  ifdef s
48e0: 74 72 64 75 70 0a 23 20 20 20 20 75 6e 64 65 66  trdup.#    undef
48f0: 20 73 74 72 64 75 70 0a 23 20 20 65 6e 64 69 66   strdup.#  endif
4900: 0a 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75  .#  define strdu
4910: 70 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55  p(x) CACKEY_DEBU
4920: 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 78 2c  G_FUNC_STRDUP(x,
4930: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
4940: 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 20 64 65  E__).#else.#  de
4950: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4960: 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f  G_PRINTF(x...) /
4970: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41  **/.#  define CA
4980: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4990: 42 55 46 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a  BUF(f, x, y) /**
49a0: 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  /.#  define CACK
49b0: 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28  EY_DEBUG_PERROR(
49c0: 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  x) /**/.#  defin
49d0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
49e0: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 78  UNC_TAG_TO_STR(x
49f0: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
4a00: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
4a10: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
4a20: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 78  CARDERR_TO_STR(x
4a30: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
4a40: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
4a50: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f  KEY_DEBUG_FUNC_O
4a60: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 29 20 22  BJID_TO_STR(x) "
4a70: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
4a80: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
4a90: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54  _DEBUG_FUNC_APPT
4aa0: 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  YPE_TO_STR(x) "D
4ab0: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
4ac0: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4ad0: 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49  DEBUG_FUNC_ATTRI
4ae0: 42 55 54 45 5f 54 4f 5f 53 54 52 28 78 29 20 22  BUTE_TO_STR(x) "
4af0: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
4b00: 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 63  #endif..struct c
4b10: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
4b20: 69 74 79 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  ity {..unsigned 
4b30: 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a  char applet[7];.
4b40: 09 75 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b 0a  .uint16_t file;.
4b50: 0a 09 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69  ..size_t certifi
4b60: 63 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73 69 67  cate_len;..unsig
4b70: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66  ned char *certif
4b80: 69 63 61 74 65 3b 0a 0a 09 73 73 69 7a 65 5f 74  icate;...ssize_t
4b90: 20 6b 65 79 73 69 7a 65 3b 0a 7d 3b 0a 0a 73 74   keysize;.};..st
4ba0: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
4bb0: 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74 20 63  tity {..struct c
4bc0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
4bd0: 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
4be0: 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42 55  ty;...CK_ATTRIBU
4bf0: 54 45 20 2a 61 74 74 72 69 62 75 74 65 73 3b 0a  TE *attributes;.
4c00: 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69 62  .CK_ULONG attrib
4c10: 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a  utes_count;.};..
4c20: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65  struct cackey_se
4c30: 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63 74  ssion {..int act
4c40: 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49  ive;...CK_SLOT_I
4c50: 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53  D slotID;...CK_S
4c60: 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43 4b 5f  TATE state;..CK_
4c70: 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 4b  FLAGS flags;..CK
4c80: 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65 45  _ULONG ulDeviceE
4c90: 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  rror;..CK_VOID_P
4ca0: 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b  TR pApplication;
4cb0: 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74 69  ..CK_NOTIFY Noti
4cc0: 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63  fy;...struct cac
4cd0: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
4ce0: 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
4cf0: 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
4d00: 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74  ies_count;...int
4d10: 20 73 65 61 72 63 68 5f 61 63 74 69 76 65 3b 0a   search_active;.
4d20: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54  .CK_ATTRIBUTE_PT
4d30: 52 20 73 65 61 72 63 68 5f 71 75 65 72 79 3b 0a  R search_query;.
4d40: 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63 68  .CK_ULONG search
4d50: 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09 75  _query_count;..u
4d60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65 61  nsigned long sea
4d70: 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09 69  rch_curr_id;...i
4d80: 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65 3b 0a  nt sign_active;.
4d90: 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59  .CK_MECHANISM_TY
4da0: 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  PE sign_mechanis
4db0: 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52 20  m;..CK_BYTE_PTR 
4dc0: 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69 67  sign_buf;..unsig
4dd0: 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75  ned long sign_bu
4de0: 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20  flen;..unsigned 
4df0: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 73 65  long sign_bufuse
4e00: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
4e10: 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 67 6e  y_identity *sign
4e20: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e 74  _identity;...int
4e30: 20 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b   decrypt_active;
4e40: 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  ..CK_MECHANISM_T
4e50: 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68  YPE decrypt_mech
4e60: 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f  anism;..CK_VOID_
4e70: 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68  PTR decrypt_mech
4e80: 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  _parm;..CK_ULONG
4e90: 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61   decrypt_mech_pa
4ea0: 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20 63  rmlen;..struct c
4eb0: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
4ec0: 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
4ed0: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
4ee0: 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74 20  key_slot {..int 
4ef0: 61 63 74 69 76 65 3b 0a 09 69 6e 74 20 69 6e 74  active;..int int
4f00: 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20 2a 70  ernal;...char *p
4f10: 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69 6e  csc_reader;...in
4f20: 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  t pcsc_card_conn
4f30: 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41 4e  ected;..SCARDHAN
4f40: 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a 0a  DLE pcsc_card;..
4f50: 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  .int transaction
4f60: 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72 61  _depth;..int tra
4f70: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
4f80: 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f  _lock;...int slo
4f90: 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c  t_reset;...CK_FL
4fa0: 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b  AGS token_flags;
4fb0: 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
4fc0: 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52 44   *label;...DWORD
4fd0: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 7d 3b 0a 0a 74   protocol;.};..t
4fe0: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
4ff0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45  ACKEY_TLV_APP_GE
5000: 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09 43  NERIC = 0x01,..C
5010: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
5020: 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09 43  I     = 0x02,..C
5030: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
5040: 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20 63  I     = 0x04.} c
5050: 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70  ackey_tlv_apptyp
5060: 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  e;..typedef enum
5070: 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f   {..CACKEY_TLV_O
5080: 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f  BJID_GENERALINFO
5090: 20 20 20 20 20 20 20 3d 20 30 78 32 30 30 30 2c         = 0x2000,
50a0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
50b0: 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e  ID_PROPERSONALIN
50c0: 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a 09  FO   = 0x2100,..
50d0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
50e0: 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20 20  _ACCESSCONTROL  
50f0: 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43 41     = 0x3000,..CA
5100: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c  CKEY_TLV_OBJID_L
5110: 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20 20 20  OGIN            
5120: 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43 4b   = 0x4000,..CACK
5130: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52  EY_TLV_OBJID_CAR
5140: 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20 3d  DINFO          =
5150: 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x5000,..CACKEY
5160: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45  _TLV_OBJID_BIOME
5170: 54 52 49 43 53 20 20 20 20 20 20 20 20 3d 20 30  TRICS        = 0
5180: 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x6000,..CACKEY_T
5190: 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c  LV_OBJID_DIGITAL
51a0: 53 49 47 43 45 52 54 20 20 20 20 3d 20 30 78 37  SIGCERT    = 0x7
51b0: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
51c0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
51d0: 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30 32 30  N        = 0x020
51e0: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
51f0: 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54  BJID_CAC_BENEFIT
5200: 53 20 20 20 20 20 20 3d 20 30 78 30 32 30 32 2c  S      = 0x0202,
5210: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5220: 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45  ID_CAC_OTHERBENE
5230: 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a 09  FITS = 0x0203,..
5240: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5250: 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20 20  _CAC_PERSONNEL  
5260: 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43 41     = 0x0201,..CA
5270: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
5280: 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20 20  AC_PKICERT      
5290: 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63 6b   = 0x02FE.} cack
52a0: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 3b  ey_tlv_objectid;
52b0: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
52c0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  ..CACKEY_PCSC_S_
52d0: 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20 20  TOKENPRESENT    
52e0: 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53  = 1,..CACKEY_PCS
52f0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  C_S_OK          
5300: 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45 59      = 0,..CACKEY
5310: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
5320: 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09 43          = -1,..C
5330: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
5340: 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20 2d  PIN          = -
5350: 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  2,..CACKEY_PCSC_
5360: 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20  E_LOCKED        
5370: 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59 5f    = -3,..CACKEY_
5380: 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
5390: 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43 41         = -4,..CA
53a0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
53b0: 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d 36  NABSENT     = -6
53c0: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
53d0: 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 20 20  _RETRY          
53e0: 20 3d 20 2d 37 0a 7d 20 63 61 63 6b 65 79 5f 72   = -7.} cackey_r
53f0: 65 74 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  et;..struct cack
5400: 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b  ey_tlv_cardurl {
5410: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
5420: 20 20 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09         rid[5];..
5430: 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79  cackey_tlv_appty
5440: 70 65 20 20 20 61 70 70 74 79 70 65 3b 0a 09 63  pe   apptype;..c
5450: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5460: 69 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63  id  objectid;..c
5470: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5480: 69 64 20 20 61 70 70 69 64 3b 0a 09 75 6e 73 69  id  appid;..unsi
5490: 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20  gned char       
54a0: 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75   pinid;.};..stru
54b0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
54c0: 74 69 74 79 3b 0a 73 74 72 75 63 74 20 63 61 63  tity;.struct cac
54d0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b  key_tlv_entity {
54e0: 0a 09 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09  ..uint8_t tag;..
54f0: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a  size_t length;..
5500: 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20  .union {...void 
5510: 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72 75 63 74  *value;...struct
5520: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64   cackey_tlv_card
5530: 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64 75  url *value_cardu
5540: 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76 61  rl;...uint8_t va
5550: 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09  lue_byte;..};...
5560: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
5570: 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b  v_entity *_next;
5580: 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47  .};../* CACKEY G
5590: 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f  lobal Handles */
55a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 61  .static void *ca
55b0: 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e  ckey_biglock = N
55c0: 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74 72 75  ULL;.static stru
55d0: 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ct cackey_sessio
55e0: 6e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  n cackey_session
55f0: 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 73  s[128];.static s
5600: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
5610: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31  t cackey_slots[1
5620: 32 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  28];.static int 
5630: 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
5640: 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69  ed = 0;.static i
5650: 6e 74 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  nt cackey_bigloc
5660: 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43  k_init = 0;.CK_C
5670: 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53  _INITIALIZE_ARGS
5680: 20 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f   cackey_args;../
5690: 2a 2a 20 45 78 74 72 61 20 63 65 72 74 69 66 69  ** Extra certifi
56a0: 63 61 74 65 73 20 74 6f 20 69 6e 63 6c 75 64 65  cates to include
56b0: 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73 74   in token **/.st
56c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
56d0: 5f 69 64 65 6e 74 69 74 79 20 65 78 74 72 61 5f  _identity extra_
56e0: 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e 63  certs[] = {.#inc
56f0: 6c 75 64 65 20 22 63 61 63 6b 65 79 5f 62 75 69  lude "cackey_bui
5700: 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d 3b  ltin_certs.h".};
5710: 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c  ../* PCSC Global
5720: 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74   Handles */.stat
5730: 69 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 58  ic LPSCARDCONTEX
5740: 54 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  T cackey_pcsc_ha
5750: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74  ndle = NULL;..st
5760: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f  atic unsigned lo
5770: 6e 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65 72  ng cackey_getver
5780: 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74  sion(void) {..st
5790: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f  atic unsigned lo
57a0: 6e 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35 3b  ng retval = 255;
57b0: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
57c0: 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69  major = 0;..unsi
57d0: 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20  gned long minor 
57e0: 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f  = 0;..char *majo
57f0: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63  r_str = NULL;..c
5800: 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d  har *minor_str =
5810: 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f   NULL;...CACKEY_
5820: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
5830: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72  lled.");...if (r
5840: 65 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a  etval != 255) {.
5850: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5860: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
5870: 20 30 78 25 6c 78 20 28 63 61 63 68 65 64 29 2e   0x%lx (cached).
5880: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72  ", retval);....r
5890: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09  eturn(retval);..
58a0: 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a  }...retval = 0;.
58b0: 0a 23 69 66 64 65 66 20 50 41 43 4b 41 47 45 5f  .#ifdef PACKAGE_
58c0: 56 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 20  VERSION.        
58d0: 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b  major_str = PACK
58e0: 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66  AGE_VERSION;..if
58f0: 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09   (major_str) {..
5900: 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20          major = 
5910: 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74  strtoul(major_st
5920: 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31  r, &minor_str, 1
5930: 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72  0);....if (minor
5940: 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72  _str) {....minor
5950: 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72   = strtoul(minor
5960: 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20  _str + 1, NULL, 
5970: 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65  10);...}..}...re
5980: 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c  tval = (major <<
5990: 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c   16) | (minor <<
59a0: 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41   8);.#endif...CA
59b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
59c0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25  F("Returning 0x%
59d0: 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  lx", retval);...
59e0: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
59f0: 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61  }../* PC/SC Rela
5a00: 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f  ted Functions */
5a10: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
5a20: 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b   *     void cack
5a30: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
5a40: 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20  ect_all(void);. 
5a50: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
5a60: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
5a70: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
5a80: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
5a90: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
5aa0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f  s function disco
5ab0: 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20  nnects from all 
5ac0: 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  cards.. *. */.st
5ad0: 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
5ae0: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
5af0: 74 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75  t_all(void) {..u
5b00: 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43  int32_t idx;...C
5b10: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5b20: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
5b30: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
5b40: 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
5b50: 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
5b60: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
5b70: 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
5b80: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
5b90: 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c  ts[idx].internal
5ba0: 29 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69  ) {..../* Skip i
5bb0: 6e 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f  nternal slots */
5bc0: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
5bd0: 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
5be0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
5bf0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
5c00: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
5c10: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44  G_PRINTF("SCardD
5c20: 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63  isconnect(%lu) c
5c30: 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65  alled", (unsigne
5c40: 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09  d long) idx);...
5c50: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
5c60: 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  t(cackey_slots[i
5c70: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53  dx].pcsc_card, S
5c80: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
5c90: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
5ca0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
5cb0: 61 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28  abel) {....free(
5cc0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
5cd0: 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61  ].label);.....ca
5ce0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
5cf0: 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
5d00: 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  }....cackey_slot
5d10: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
5d20: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
5d30: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
5d40: 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
5d50: 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63  depth = 0;...cac
5d60: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
5d70: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
5d80: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09  hw_lock = 0;....
5d90: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
5da0: 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
5db0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5dc0: 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20  PRINTF("Marking 
5dd0: 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20  active slot %lu 
5de0: 61 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c  as being reset",
5df0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
5e00: 20 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61   idx);...}....ca
5e10: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
5e20: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
5e30: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
5e40: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
5e50: 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  ing");...return;
5e60: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
5e70: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
5e80: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
5e90: 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a  _connect(void);.
5ea0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
5eb0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
5ec0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
5ed0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
5ee0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
5ef0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
5f00: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
5f10: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
5f20: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
5f30: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
5f40: 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20  ion connects to 
5f50: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63  the PC/SC Connec
5f60: 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64  tion Manager and
5f70: 20 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20   updates the. * 
5f80: 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c      global handl
5f90: 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  e.. *. */.static
5fa0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5fb0: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
5fc0: 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  void) {..LONG sc
5fd0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
5fe0: 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45  ret;.#ifdef HAVE
5ff0: 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e  _SCARDISVALIDCON
6000: 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64  TEXT..LONG scard
6010: 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65  _isvalid_ret;.#e
6020: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
6030: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6040: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63  ed.");...if (cac
6050: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6060: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  == NULL) {...cac
6070: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6080: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
6090: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
60a0: 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63  dle));...if (cac
60b0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
60c0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41  == NULL) {....CA
60d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
60e0: 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f  F("Call to mallo
60f0: 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75  c() failed, retu
6100: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
6110: 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
6120: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
6130: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
6140: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
6150: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09  GENERIC);...}...
6160: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6170: 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62  INTF("SCardEstab
6180: 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61  lishContext() ca
6190: 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f  lled");...scard_
61a0: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
61b0: 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  = SCardEstablish
61c0: 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43  Context(SCARD_SC
61d0: 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c  OPE_SYSTEM, NULL
61e0: 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70  , NULL, cackey_p
61f0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69  csc_handle);...i
6200: 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  f (scard_est_con
6210: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52  text_ret != SCAR
6220: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
6230: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6240: 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53  RINTF("Call to S
6250: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
6260: 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74  text failed (ret
6270: 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72  urned %s/%li), r
6280: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
6290: 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ure", CACKEY_DEB
62a0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
62b0: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73  _TO_STR(scard_es
62c0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20  t_context_ret), 
62d0: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74  (long) scard_est
62e0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a  _context_ret);..
62f0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70  ...free(cackey_p
6300: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09  csc_handle);....
6310: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6320: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63  le = NULL;.....c
6330: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
6340: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
6350: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6360: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
6370: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
6380: 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49  HAVE_SCARDISVALI
6390: 44 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59  DCONTEXT..CACKEY
63a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
63b0: 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65  CardIsValidConte
63c0: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
63d0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
63e0: 74 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64  t = SCardIsValid
63f0: 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f  Context(*cackey_
6400: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69  pcsc_handle);..i
6410: 66 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64  f (scard_isvalid
6420: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
6430: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
6440: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6450: 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63  ("Handle has bec
6460: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61  ome invalid (SCa
6470: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74  rdIsValidContext
6480: 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69   = %s/%li), tryi
6490: 6e 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69  ng to re-establi
64a0: 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44  sh...", CACKEY_D
64b0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
64c0: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
64d0: 69 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c  isvalid_ret), (l
64e0: 6f 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c  ong) scard_isval
64f0: 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b  id_ret);....CACK
6500: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6510: 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43  "SCardEstablishC
6520: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22  ontext() called"
6530: 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63  );...scard_est_c
6540: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
6550: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6560: 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53  xt(SCARD_SCOPE_S
6570: 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  YSTEM, NULL, NUL
6580: 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  L, cackey_pcsc_h
6590: 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63  andle);...if (sc
65a0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
65b0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
65c0: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43  UCCESS) {....CAC
65d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
65e0: 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45  ("Call to SCardE
65f0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20  stablishContext 
6600: 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64  failed (returned
6610: 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e   %s/%li), return
6620: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c  ing in failure",
6630: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
6640: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
6650: 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  TR(scard_est_con
6660: 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  text_ret), (long
6670: 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ) scard_est_cont
6680: 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72  ext_ret);.....fr
6690: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
66a0: 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65  andle);....cacke
66b0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
66c0: 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79  NULL;.....cackey
66d0: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
66e0: 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74  t_all();.....ret
66f0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6700: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
6710: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6720: 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68  PRINTF("Handle h
6730: 61 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62  as been re-estab
6740: 6c 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e  lished");..}.#en
6750: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
6760: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73  UG_PRINTF("Suces
6770: 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64  sfully connected
6780: 20 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72   to PC/SC, retur
6790: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22  ning in success"
67a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
67b0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
67c0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
67d0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
67e0: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  et cackey_pcsc_d
67f0: 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b  isconnect(void);
6800: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
6810: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
6820: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
6830: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
6840: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
6850: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
6860: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
6870: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
6880: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
6890: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
68a0: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
68b0: 20 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20   from the PC/SC 
68c0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  Connection manag
68d0: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20  er and updates. 
68e0: 2a 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c  *     the global
68f0: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a   handle.. *. */.
6900: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
6910: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  t cackey_pcsc_di
6920: 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b  sconnect(void) {
6930: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c  ..LONG scard_rel
6940: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09  _context_ret;...
6950: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6960: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
6970: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
6980: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
6990: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43  ) {...return(CAC
69a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
69b0: 09 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63  .}...scard_rel_c
69c0: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
69d0: 72 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74  rdReleaseContext
69e0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
69f0: 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63  ndle);...if (cac
6a00: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6a10: 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
6a20: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
6a30: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
6a40: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  andle = NULL;..}
6a50: 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c  ...if (scard_rel
6a60: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20  _context_ret != 
6a70: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
6a80: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
6a90: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6aa0: 43 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  C);..}...return(
6ab0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
6ac0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
6ad0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64  OSIS. *     void
6ae0: 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f   cackey_mark_slo
6af0: 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63  t_reset(struct c
6b00: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
6b10: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
6b20: 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  TS. *     None. 
6b30: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
6b40: 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  E. *     None. *
6b50: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
6b60: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
6b70: 61 72 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20  arks a slot has 
6b80: 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65  having been rese
6b90: 74 2c 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63  t, to later be c
6ba0: 6c 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20  leaned up.. *   
6bb0: 20 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68    Cleanup only h
6bc0: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b  appens when a PK
6bd0: 43 53 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c  CS#11 client cal
6be0: 6c 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  ls C_FindObjects
6bf0: 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  Init.. *. */.sta
6c00: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
6c10: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
6c20: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6c30: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20  ot *slot) {..if 
6c40: 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (slot == NULL) {
6c50: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
6c60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6c70: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
6c80: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63  ..if (slot->pcsc
6c90: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
6ca0: 20 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e   {...SCardDiscon
6cb0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
6cc0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
6cd0: 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c  E_CARD);..}...sl
6ce0: 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ot->slot_reset =
6cf0: 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f   1;..slot->pcsc_
6d00: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
6d10: 20 30 3b 0a 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e   0;..slot->token
6d20: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
6d30: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 43  IN_REQUIRED;...C
6d40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6d50: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 2e 22 29  TF("Returning.")
6d60: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
6d70: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
6d80: 20 20 20 20 20 4c 4f 4e 47 20 63 61 63 6b 65 79       LONG cackey
6d90: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  _reconnect_card(
6da0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6db0: 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20  ot *slot, DWORD 
6dc0: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c  default_protocol
6dd0: 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 74  , LPDWORD select
6de0: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a  ed_protocol);. *
6df0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
6e00: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
6e10: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
6e20: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
6e30: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
6e40: 20 20 20 20 20 44 57 4f 52 44 20 64 65 66 61 75       DWORD defau
6e50: 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20  lt_protocol. *  
6e60: 20 20 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c 20         Protocol 
6e70: 74 6f 20 61 74 74 65 6d 70 74 20 66 69 72 73 74  to attempt first
6e80: 0a 20 2a 0a 20 2a 20 20 20 20 20 4c 50 44 57 4f  . *. *     LPDWO
6e90: 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  RD selected_prot
6ea0: 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20  ocol. *         
6eb0: 5b 4f 55 54 5d 20 50 72 6f 74 6f 63 6f 6c 20 73  [OUT] Protocol s
6ec0: 65 6c 65 63 74 65 64 0a 20 2a 0a 20 2a 20 52 45  elected. *. * RE
6ed0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
6ee0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
6ef0: 75 65 20 66 72 6f 6d 20 53 43 61 72 64 52 65 63  ue from SCardRec
6f00: 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 4e  onnect(). *. * N
6f10: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
6f20: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
6f30: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 53 43  rapper around SC
6f40: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20  ardReconnect(). 
6f50: 2a 0a 20 2a 20 20 20 20 20 54 68 65 20 53 43 61  *. *     The SCa
6f60: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 66 75  rdReconnect() fu
6f70: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c  nction call will
6f80: 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
6f90: 20 77 69 74 68 20 74 68 65 0a 20 2a 20 20 20 20   with the. *    
6fa0: 20 64 77 50 72 65 66 65 72 72 65 64 50 72 6f 74   dwPreferredProt
6fb0: 6f 63 6f 6c 73 20 6f 66 20 22 64 65 66 61 75 6c  ocols of "defaul
6fc0: 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20 20 49 66  t_protocol".  If
6fd0: 20 74 68 61 74 20 63 61 6c 6c 20 72 65 74 75 72   that call retur
6fe0: 6e 73 0a 20 2a 20 20 20 20 20 53 43 41 52 44 5f  ns. *     SCARD_
6ff0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
7000: 20 74 72 79 20 61 67 61 69 6e 20 77 69 74 68 20   try again with 
7010: 61 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d  a protocol of T=
7020: 30 2c 20 61 6e 64 20 66 61 69 6c 69 6e 67 0a 20  0, and failing. 
7030: 2a 20 20 20 20 20 74 68 61 74 20 54 3d 31 2e 0a  *     that T=1..
7040: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 4c 4f   *. */.static LO
7050: 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e  NG cackey_reconn
7060: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
7070: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
7080: 74 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74  t, DWORD default
7090: 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f  _protocol, LPDWO
70a0: 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  RD selected_prot
70b0: 6f 63 6f 6c 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  ocol) {..LONG sc
70c0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09  ard_conn_ret;...
70d0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
70e0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
70f0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7100: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
7110: 52 45 44 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f  RED, default_pro
7120: 74 6f 63 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53  tocol, SCARD_RES
7130: 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65  ET_CARD, selecte
7140: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69  d_protocol);...i
7150: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7160: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7170: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7180: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7190: 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e  INTF("SCardRecon
71a0: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
71b0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
71c0: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
71d0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
71e0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
71f0: 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  = SCardReconnect
7200: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7210: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
7220: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
7230: 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52  OCOL_T0, SCARD_R
7240: 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63  ESET_CARD, selec
7250: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  ted_protocol);..
7260: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7270: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7280: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7290: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
72a0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52  G_PRINTF("SCardR
72b0: 65 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  econnect() retur
72c0: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
72d0: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
72e0: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31  ng with just T=1
72f0: 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ")....scard_conn
7300: 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f  _ret = SCardReco
7310: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
7320: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41  _card, SCARD_SHA
7330: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
7340: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43  _PROTOCOL_T1, SC
7350: 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20  ARD_RESET_CARD, 
7360: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
7370: 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  l);...}..}...ret
7380: 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  urn(scard_conn_r
7390: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  et);.}../*. * SY
73a0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
73b0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
73c0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
73d0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
73e0: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
73f0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
7400: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7410: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
7420: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
7430: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
7440: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
7450: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
7460: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
7470: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
7480: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
7490: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
74a0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
74b0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
74c0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
74d0: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
74e0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
74f0: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
7500: 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f  ckey_ret pcsc_co
7510: 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52  nnect_ret;..DWOR
7520: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e  D protocol;..LON
7530: 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  G scard_conn_ret
7540: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
7550: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
7560: 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29  ");...if (!slot)
7570: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7580: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
7590: 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64  d slot specified
75a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
75b0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
75c0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
75d0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
75e0: 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
75f0: 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
7600: 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28  connect();..if (
7610: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
7620: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
7630: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
7640: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
7650: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
7660: 53 43 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  SC failed, retur
7670: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
7680: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
7690: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
76a0: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e  IC);..}.../* Con
76b0: 6e 65 63 74 20 74 6f 20 72 65 61 64 65 72 2c 20  nect to reader, 
76c0: 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66  if needed */..if
76d0: 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61   (!slot->pcsc_ca
76e0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a  rd_connected) {.
76f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7700: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
7710: 65 63 74 28 25 73 29 20 63 61 6c 6c 65 64 22 2c  ect(%s) called",
7720: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
7730: 65 72 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e  er);...scard_con
7740: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
7750: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
7760: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
7770: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
7780: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
7790: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
77a0: 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
77b0: 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T1, &slot->p
77c0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
77d0: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
77e0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
77f0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7800: 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b  MATCH) {....CACK
7810: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7820: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
7830: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
7840: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
7850: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
7860: 74 20 54 3d 30 22 29 0a 09 09 09 73 63 61 72 64  t T=0")....scard
7870: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
7880: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
7890: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
78a0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
78b0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
78c0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
78d0: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
78e0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
78f0: 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63  col);.....if (sc
7900: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
7910: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7920: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41  SMATCH) {.....CA
7930: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7940: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
7950: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
7960: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
7970: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
7980: 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 73 63  ust T=1").....sc
7990: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
79a0: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
79b0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
79c0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
79d0: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
79e0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
79f0: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
7a00: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
7a10: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09  otocol);....}...
7a20: 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  }....if (scard_c
7a30: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
7a40: 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52  _W_UNPOWERED_CAR
7a50: 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
7a60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
7a70: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
7a80: 72 6e 65 64 20 53 43 41 52 44 5f 57 5f 55 4e 50  rned SCARD_W_UNP
7a90: 4f 57 45 52 45 44 5f 43 41 52 44 2c 20 74 72 79  OWERED_CARD, try
7aa0: 69 6e 67 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63  ing to re-connec
7ab0: 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  t...");.....scar
7ac0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7ad0: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
7ae0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
7af0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
7b00: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 44 49  , SCARD_SHARE_DI
7b10: 52 45 43 54 2c 20 53 43 41 52 44 5f 50 52 4f 54  RECT, SCARD_PROT
7b20: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
7b30: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
7b40: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
7b50: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
7b60: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7b70: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7b80: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7b90: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7ba0: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
7bb0: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
7bc0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7bd0: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
7be0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
7bf0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7c00: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
7c10: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
7c20: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
7c30: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
7c40: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
7c50: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
7c60: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
7c70: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
7c80: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
7c90: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
7ca0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
7cb0: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
7cc0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
7cd0: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
7ce0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
7cf0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
7d00: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
7d10: 31 22 29 0a 09 09 09 09 09 73 63 61 72 64 5f 63  1")......scard_c
7d20: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
7d30: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
7d40: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
7d50: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
7d60: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
7d70: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
7d80: 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T1, &slot->pcs
7d90: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
7da0: 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  l);.....}....}..
7db0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7dc0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
7dd0: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
7de0: 70 72 6f 74 6f 63 6f 6c 2c 20 26 70 72 6f 74 6f  protocol, &proto
7df0: 63 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  col);...}....if 
7e00: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7e10: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
7e20: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
7e30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
7e40: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64  nnection to card
7e50: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
7e60: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53  ng in failure (S
7e70: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20  CardConnect() = 
7e80: 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59  %s/%li)", CACKEY
7e90: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
7ea0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
7eb0: 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f  d_conn_ret), (lo
7ec0: 6e 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ng) scard_conn_r
7ed0: 65 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  et);.....return(
7ee0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7ef0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73  NERIC);...}....s
7f00: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
7f10: 6f 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09  onnected = 1;...
7f20: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7f30: 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73  n_depth = 0;...s
7f40: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
7f50: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
7f60: 30 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f  0;...slot->proto
7f70: 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a  col = protocol;.
7f80: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  .}...return(CACK
7f90: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
7fa0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
7fb0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
7fc0: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  et cackey_begin_
7fd0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
7fe0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7ff0: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  slot);. *. * ARG
8000: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
8010: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
8020: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
8030: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
8040: 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e   to. *. * RETURN
8050: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
8060: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
8070: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
8080: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
8090: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
80a0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
80b0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
80c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 68  e transaction sh
80d0: 6f 75 6c 64 20 62 65 20 74 65 72 6d 69 6e 61 74  ould be terminat
80e0: 65 64 20 75 73 69 6e 67 20 22 63 61 63 6b 65 79  ed using "cackey
80f0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
8100: 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ". *. */.static 
8110: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8120: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
8130: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
8140: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
8150: 09 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b  .cackey_ret cack
8160: 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f  ey_conn_ret;..LO
8170: 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  NG scard_trans_r
8180: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
8190: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
81a0: 64 2e 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63  d.");...cackey_c
81b0: 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  onn_ret = cackey
81c0: 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  _connect_card(sl
81d0: 6f 74 29 3b 0a 09 69 66 20 28 63 61 63 6b 65 79  ot);..if (cackey
81e0: 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43  _conn_ret != CAC
81f0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
8200: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8210: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
8220: 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
8230: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
8240: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
8250: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
8260: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
8270: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8280: 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20  n_depth++;...if 
8290: 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
82a0: 6f 6e 5f 64 65 70 74 68 20 3e 20 31 20 26 26 20  on_depth > 1 && 
82b0: 21 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  !slot->transacti
82c0: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 29  on_need_hw_lock)
82d0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
82e0: 47 5f 50 52 49 4e 54 46 28 22 41 6c 72 65 61 64  G_PRINTF("Alread
82f0: 79 20 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  y in a transacti
8300: 6f 6e 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e  on, performing n
8310: 6f 20 61 63 74 69 6f 6e 20 28 6e 65 77 20 64 65  o action (new de
8320: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
8330: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8340: 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  pth);....return(
8350: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8360: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
8370: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
8380: 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73 63  w_lock = 0;...sc
8390: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20  ard_trans_ret = 
83a0: 53 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61  SCardBeginTransa
83b0: 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63  ction(slot->pcsc
83c0: 5f 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61  _card);..if (sca
83d0: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20  rd_trans_ret != 
83e0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
83f0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
8400: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
8410: 20 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61   to begin transa
8420: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
8430: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
8440: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8450: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
8460: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
8470: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
8480: 75 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73  ully began trans
8490: 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28  action on slot (
84a0: 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  %s)", slot->pcsc
84b0: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75  _reader);...retu
84c0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
84d0: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
84e0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
84f0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8500: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
8510: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8520: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
8530: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
8540: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
8550: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
8560: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
8570: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
8580: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
8590: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
85a0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
85b0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
85c0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
85d0: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
85e0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
85f0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
8600: 20 72 65 71 75 69 72 65 73 20 22 63 61 63 6b 65   requires "cacke
8610: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
8620: 69 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65  ion" to be calle
8630: 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73  d first. *. */.s
8640: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
8650: 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e   cackey_end_tran
8660: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
8670: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8680: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
8690: 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43  trans_ret;...CAC
86a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
86b0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
86c0: 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  f (!slot->pcsc_c
86d0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
86e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
86f0: 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20  PRINTF("Card is 
8700: 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75  not connected, u
8710: 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61  nable to end tra
8720: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 63 61 72 64  nsaction on card
8730: 22 29 3b 0a 0a 09 09 69 66 20 28 73 6c 6f 74 2d  ");....if (slot-
8740: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8750: 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 43 41 43  th > 0) {....CAC
8760: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8770: 28 22 44 65 63 72 65 61 73 69 6e 67 20 74 72 61  ("Decreasing tra
8780: 6e 73 61 63 74 69 6f 6e 20 64 65 70 74 68 20 61  nsaction depth a
8790: 6e 64 20 61 73 6b 69 6e 67 20 66 6f 72 20 61 20  nd asking for a 
87a0: 68 61 72 64 77 61 72 65 20 6c 6f 63 6b 20 6f 6e  hardware lock on
87b0: 20 74 68 65 20 6e 65 78 74 20 62 65 67 69 6e 20   the next begin 
87c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72  transaction (cur
87d0: 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29  rent depth = %i)
87e0: 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ", slot->transac
87f0: 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09  tion_depth);....
8800: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8810: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 09 09  on_depth--;.....
8820: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
8830: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
8840: 20 7b 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61   {.....slot->tra
8850: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
8860: 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a  _lock = 1;....}.
8870: 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ..}....return(CA
8880: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
8890: 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  RIC);..}...if (s
88a0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
88b0: 5f 64 65 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09  _depth == 0) {..
88c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
88d0: 49 4e 54 46 28 22 54 65 72 6d 69 6e 61 74 69 6e  INTF("Terminatin
88e0: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
88f0: 74 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65 67  that has not beg
8900: 75 6e 21 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  un!");....return
8910: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
8920: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c  ENERIC);..}...sl
8930: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8940: 64 65 70 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73  depth--;...if (s
8950: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8960: 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09  _depth > 0) {...
8970: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8980: 4e 54 46 28 22 54 72 61 6e 73 61 63 74 69 6f 6e  NTF("Transaction
8990: 73 20 73 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72  s still in progr
89a0: 65 73 73 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61  ess, not termina
89b0: 74 69 6e 67 20 6f 6e 2d 63 61 72 64 20 54 72 61  ting on-card Tra
89c0: 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e  nsaction (curren
89d0: 74 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20  t depth = %i)", 
89e0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
89f0: 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74  n_depth);....ret
8a00: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8a10: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72  S_OK);..}...scar
8a20: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43  d_trans_ret = SC
8a30: 61 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  ardEndTransactio
8a40: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
8a50: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
8a60: 41 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64  ARD);..if (scard
8a70: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43  _trans_ret != SC
8a80: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
8a90: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8aa0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
8ab0: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  o end transactio
8ac0: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
8ad0: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
8ae0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
8af0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
8b00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8b10: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
8b20: 20 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e   terminated tran
8b30: 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20  saction on slot 
8b40: 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73  (%s)", slot->pcs
8b50: 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74  c_reader);...ret
8b60: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8b70: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44  S_OK);.}../* APD
8b80: 55 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69  U Related Functi
8b90: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e  ons */./*. * SYN
8ba0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
8bb0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
8bc0: 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20  end_apdu(struct 
8bd0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8be0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
8bf0: 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64   class, unsigned
8c00: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
8c10: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
8c20: 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p1, unsigned ch
8c30: 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20  ar p2, unsigned 
8c40: 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65  char lc, unsigne
8c50: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
8c60: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20  signed char le, 
8c70: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
8c80: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
8c90: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
8ca0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
8cb0: 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  n);. *. * ARGUME
8cc0: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
8cd0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8ce0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8cf0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8d00: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
8d10: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20  ned char class. 
8d20: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 43  *         APDU C
8d30: 6c 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53  lass (GSCIS_CLAS
8d40: 53 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43  S_ISO7816 or GSC
8d50: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
8d60: 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20  PLATFORM. *     
8d70: 20 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43      usually), (C
8d80: 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  LA). *. *     un
8d90: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
8da0: 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20  ruction. *      
8db0: 20 20 20 41 50 44 55 20 49 6e 73 74 72 75 63 74     APDU Instruct
8dc0: 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20  ion (INS). *. * 
8dd0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
8de0: 72 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20  r p1. *         
8df0: 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 31  APDU Parameter 1
8e00: 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20   (P1). *. *     
8e10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32  unsigned char p2
8e20: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
8e30: 20 50 61 72 61 6d 65 74 65 72 20 32 20 28 50 32   Parameter 2 (P2
8e40: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
8e50: 67 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20  gned char lc. * 
8e60: 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e          APDU Len
8e70: 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28  gth of Content (
8e80: 4c 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Lc) -- this is t
8e90: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61  he length of "da
8ea0: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70  ta". *         p
8eb0: 61 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64  arameter.  If "d
8ec0: 61 74 61 22 20 69 73 20 73 70 65 63 69 66 69 65  ata" is specifie
8ed0: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
8ee0: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20  parameter will. 
8ef0: 2a 20 20 20 20 20 20 20 20 20 62 65 20 69 67 6e  *         be ign
8f00: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
8f10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
8f20: 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50  ata. *         P
8f30: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
8f40: 20 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68   to send.  It sh
8f50: 6f 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74  ould be "Lc" byt
8f60: 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20  es long.  If. * 
8f70: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
8f80: 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20  d as NULL, "Lc" 
8f90: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74  will not be sent
8fa0: 2c 20 61 6e 64 20 74 68 69 73 20 62 75 66 66 65  , and this buffe
8fb0: 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20  r will be. *    
8fc0: 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a       ignored.. *
8fd0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
8fe0: 20 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20   char le. *     
8ff0: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
9000: 6f 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28  of Expectation (
9010: 4c 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Le) -- this is t
9020: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
9030: 0a 20 2a 20 20 20 20 20 20 20 20 20 65 78 70 65  . *         expe
9040: 63 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20  cted reply.  If 
9050: 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65  this is specifie
9060: 64 20 61 73 20 30 20 74 68 65 6e 20 69 74 20 77  d as 0 then it w
9070: 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20  ill not. *      
9080: 20 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20     be sent.. *. 
9090: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a  *     uint16_t *
90a0: 72 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20  respcode. *     
90b0: 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65      [OUT] Pointe
90c0: 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20  r to storage of 
90d0: 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f  APDU response co
90e0: 64 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a  de.  If this is.
90f0: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69   *         speci
9100: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
9110: 65 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20  e response code 
9120: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65  will be discarde
9130: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
9140: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
9150: 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20  data. *         
9160: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
9170: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
9180: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20   response data. 
9190: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
91a0: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
91b0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
91c0: 73 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c  sponse data will
91d0: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20   be discarded.  
91e0: 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68  If. *         th
91f0: 65 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22  e "respdata_len"
9200: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 70   parameter is sp
9210: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
9220: 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20   this buffer. * 
9230: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74          will not
9240: 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a   be updated.. *.
9250: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72   *     size_t *r
9260: 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20  espdata_len. *  
9270: 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d         [IN, OUT]
9280: 20 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c   Pointer initial
9290: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
92a0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22  he size of the "
92b0: 72 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20  respdata". *    
92c0: 20 20 20 20 20 62 75 66 66 65 72 2e 20 20 42 65       buffer.  Be
92d0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
92e0: 74 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76  the pointed to v
92f0: 61 6c 75 65 20 69 73 20 75 70 64 61 74 65 64 20  alue is updated 
9300: 74 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  to the. *       
9310: 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    number of byte
9320: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
9330: 20 62 75 66 66 65 72 2e 20 20 49 66 20 74 68 69   buffer.  If thi
9340: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
9350: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c  s. *         NUL
9360: 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  L, it will not b
9370: 65 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22  e updated, and "
9380: 72 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62  respdata" will b
9390: 65 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e  e ignored causin
93a0: 67 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65  g. *         the
93b0: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74   response data t
93c0: 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  o be discarded..
93d0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
93e0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
93f0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
9400: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
9410: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
9420: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
9430: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20    On error. *   
9440: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
9450: 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 49 66 20  TOKENABSENT  If 
9460: 74 68 65 20 73 65 6e 64 69 6e 67 20 66 61 69 6c  the sending fail
9470: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 20 74  ed because the t
9480: 6f 6b 65 6e 20 69 73 0a 20 2a 20 20 20 20 20 20  oken is. *      
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94a0: 20 20 20 20 20 20 20 20 20 20 61 62 73 65 6e 74            absent
94b0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
94c0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
94d0: 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74  n will connect t
94e0: 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  o the PC/SC Conn
94f0: 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76  ection Manager v
9500: 69 61 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  ia. *     cackey
9510: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20  _pcsc_connect() 
9520: 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a  if needed.. *. *
9530: 20 20 20 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e       It will con
9540: 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 64  nect to the card
9550: 20 69 6e 20 74 68 65 20 72 65 61 64 65 72 20 61   in the reader a
9560: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 73  ttached to the s
9570: 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 65 63 69  lot. *     speci
9580: 66 69 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 72  fied.  It will r
9590: 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20  econnect to the 
95a0: 63 61 72 64 20 69 66 20 74 68 65 20 63 6f 6e 6e  card if the conn
95b0: 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f  ection. *     go
95c0: 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a  es away.. *. */.
95d0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
95e0: 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  t cackey_send_ap
95f0: 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  du(struct cackey
9600: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
9610: 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73  igned char class
9620: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9630: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73  instruction, uns
9640: 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75  igned char p1, u
9650: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c  nsigned char p2,
9660: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
9670: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  c, unsigned char
9680: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64   *data, unsigned
9690: 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36   char le, uint16
96a0: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e  _t *respcode, un
96b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
96c0: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72  pdata, size_t *r
96d0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
96e0: 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63  uint8_t major_rc
96f0: 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a  , minor_rc;..siz
9700: 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  e_t bytes_to_cop
9710: 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  y, tmp_respdata_
9720: 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52 44 5f 49  len;..LPCSCARD_I
9730: 4f 5f 52 45 51 55 45 53 54 20 70 69 6f 53 65 6e  O_REQUEST pioSen
9740: 64 50 63 69 3b 0a 09 44 57 4f 52 44 20 70 72 6f  dPci;..DWORD pro
9750: 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44 20 78 6d  tocol;..DWORD xm
9760: 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e  it_len, recv_len
9770: 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d  ;..LONG scard_xm
9780: 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65  it_ret, scard_re
9790: 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20  conn_ret;..BYTE 
97a0: 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20  xmit_buf[1024], 
97b0: 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a  recv_buf[1024];.
97c0: 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  .int pcsc_connec
97d0: 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 74 72  t_ret, pcsc_getr
97e0: 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64  esp_ret;..int id
97f0: 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
9800: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
9810: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74  .");...if (!slot
9820: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9830: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
9840: 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65  id slot specifie
9850: 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
9860: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9870: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73  NERIC);..}...pcs
9880: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
9890: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
98a0: 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28  ard(slot);..if (
98b0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
98c0: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
98d0: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
98e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
98f0: 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74  nable to connect
9900: 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
9910: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
9920: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9930: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9940: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  C);..}.../* Dete
9950: 72 6d 69 6e 65 20 77 68 69 63 68 20 70 72 6f 74  rmine which prot
9960: 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 75 73 69  ocol to send usi
9970: 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 73  ng */..switch (s
9980: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b  lot->protocol) {
9990: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52  ...case SCARD_PR
99a0: 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 70 69  OTOCOL_T0:....pi
99b0: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44  oSendPci = SCARD
99c0: 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65  _PCI_T0;.....bre
99d0: 61 6b 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ak;...case SCARD
99e0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09  _PROTOCOL_T1:...
99f0: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
9a00: 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09  ARD_PCI_T1;.....
9a10: 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74  break;...default
9a20: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
9a30: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
9a40: 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64  d protocol found
9a50: 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a  , aborting.");..
9a60: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9a70: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9a80: 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d  ;..}.../* Transm
9a90: 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20  it */..xmit_len 
9aa0: 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  = 0;..xmit_buf[x
9ab0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61  mit_len++] = cla
9ac0: 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  ss;..xmit_buf[xm
9ad0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74  it_len++] = inst
9ae0: 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62  ruction;..xmit_b
9af0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
9b00: 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78   p1;..xmit_buf[x
9b10: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b  mit_len++] = p2;
9b20: 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09  ..if (data) {...
9b30: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
9b40: 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 66 6f 72  n++] = lc;...for
9b50: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
9b60: 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09   lc; idx++) {...
9b70: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
9b80: 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78  en++] = data[idx
9b90: 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  ];...}..}...if (
9ba0: 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  le != 0x00) {...
9bb0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
9bc0: 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d 0a 0a 09  n++] = le;..}...
9bd0: 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61  /* Begin Smartca
9be0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
9bf0: 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  /..cackey_begin_
9c00: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
9c10: 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d  );...if (class =
9c20: 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  = GSCIS_CLASS_IS
9c30: 4f 37 38 31 36 20 26 26 20 69 6e 73 74 72 75 63  O7816 && instruc
9c40: 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e  tion == GSCIS_IN
9c50: 53 54 52 5f 56 45 52 49 46 59 20 26 26 20 70 31  STR_VERIFY && p1
9c60: 20 3d 3d 20 30 78 30 30 20 26 26 20 70 32 20 3d   == 0x00 && p2 =
9c70: 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41 43 4b  = 0x00) {...CACK
9c80: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9c90: 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 20 3c  "Sending APDU: <
9ca0: 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b 0a 09  <censored>>");..
9cb0: 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
9cc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
9cd0: 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 22  ("Sending APDU:"
9ce0: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74  , xmit_buf, xmit
9cf0: 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 63 76  _len);..}...recv
9d00: 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65  _len = sizeof(re
9d10: 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 72 64 5f  cv_buf);..scard_
9d20: 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64  xmit_ret = SCard
9d30: 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70  Transmit(slot->p
9d40: 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e  csc_card, pioSen
9d50: 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20  dPci, xmit_buf, 
9d60: 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20  xmit_len, NULL, 
9d70: 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f  recv_buf, &recv_
9d80: 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 63 61 72  len);...if (scar
9d90: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43  d_xmit_ret == SC
9da0: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
9db0: 43 54 45 44 29 20 7b 0a 09 09 43 41 43 4b 45 59  CTED) {...CACKEY
9dc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
9dd0: 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50  ailed to send AP
9de0: 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72  DU to card (SCar
9df0: 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73  dTransmit() = %s
9e00: 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20  /%lx), will ask 
9e10: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
9e20: 20 74 6f 20 72 65 74 72 79 20 28 6e 6f 74 20 72   to retry (not r
9e30: 65 73 65 74 74 69 6e 67 20 63 61 72 64 29 2e 2e  esetting card)..
9e40: 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  .", CACKEY_DEBUG
9e50: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
9e60: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
9e70: 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64  _ret), (unsigned
9e80: 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69   long) scard_xmi
9e90: 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20 42 65  t_ret);..../* Be
9ea0: 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20 54 72  gin Smartcard Tr
9eb0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63  ansaction */...c
9ec0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
9ed0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
9ee0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
9ef0: 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a  SC_E_RETRY);..}.
9f00: 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
9f10: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
9f20: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
9f30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9f40: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64  ("Failed to send
9f50: 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53   APDU to card (S
9f60: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d  CardTransmit() =
9f70: 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45   %s/%lx)", CACKE
9f80: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
9f90: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
9fa0: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75  rd_xmit_ret), (u
9fb0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63  nsigned long) sc
9fc0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
9fd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9fe0: 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 73  RINTF("Marking s
9ff0: 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20 62 65  lot as having be
a000: 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 63 61  en reset");...ca
a010: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
a020: 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69  eset(slot);....i
a030: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
a040: 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53  t == SCARD_W_RES
a050: 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ET_CARD) {....CA
a060: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a070: 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65  F("Reset require
a080: 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e  d, please hold..
a090: 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72  .");.....scard_r
a0a0: 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  econn_ret = cack
a0b0: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
a0c0: 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52  d(slot, SCARD_PR
a0d0: 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
a0e0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
a0f0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
a100: 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  f (scard_reconn_
a110: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53  ret == SCARD_S_S
a120: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a  UCCESS) {...../*
a130: 20 55 70 64 61 74 65 20 70 72 6f 74 6f 63 6f 6c   Update protocol
a140: 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 72   */.....slot->pr
a150: 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f  otocol = protoco
a160: 6c 3b 0a 09 09 09 09 73 77 69 74 63 68 20 28 73  l;.....switch (s
a170: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b  lot->protocol) {
a180: 0a 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44  ......case SCARD
a190: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09  _PROTOCOL_T0:...
a1a0: 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d  ....pioSendPci =
a1b0: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a   SCARD_PCI_T0;..
a1c0: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
a1d0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f  ..case SCARD_PRO
a1e0: 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09  TOCOL_T1:.......
a1f0: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
a200: 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09  RD_PCI_T1;......
a210: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 65  ..break;......de
a220: 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 43 41 43  fault:.......CAC
a230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a240: 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63  ("Invalid protoc
a250: 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f  ol found, but to
a260: 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20 61 6e 79  o late to do any
a270: 74 68 69 6e 67 20 61 62 6f 75 74 20 69 74 20 6e  thing about it n
a280: 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79  ow -- trying any
a290: 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62  way.");........b
a2a0: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
a2b0: 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68  ./* Re-establish
a2c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
a2d0: 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20   it was present 
a2e0: 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d  */.....if (slot-
a2f0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
a300: 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73  th > 0) {......s
a310: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
a320: 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73  _depth--;......s
a330: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
a340: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
a350: 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62  1;......cackey_b
a360: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
a370: 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09  (slot);.....}...
a380: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a390: 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75  PRINTF("Reset su
a3a0: 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e  ccessful, retran
a3b0: 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09  smitting");.....
a3c0: 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65  .recv_len = size
a3d0: 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 09  of(recv_buf);...
a3e0: 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ..scard_xmit_ret
a3f0: 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74   = SCardTransmit
a400: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
a410: 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d  , pioSendPci, xm
a420: 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e  it_buf, xmit_len
a430: 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66  , NULL, recv_buf
a440: 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  , &recv_len);...
a450: 09 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69  ...if (scard_xmi
a460: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
a470: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
a480: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a490: 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74  INTF("Retransmit
a4a0: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
a4b0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66  ng in failure af
a4c0: 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e  ter disconnectin
a4d0: 67 20 74 68 65 20 63 61 72 64 20 28 53 43 61 72  g the card (SCar
a4e0: 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25  dTransmit = %s/%
a4f0: 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  li)", CACKEY_DEB
a500: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
a510: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d  _TO_STR(scard_xm
a520: 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  it_ret), (long) 
a530: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
a540: 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69 73 63  .......SCardDisc
a550: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
a560: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
a570: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 09  AVE_CARD);......
a580: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
a590: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a  connected = 0;..
a5a0: 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
a5b0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
a5c0: 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  n */......slot->
a5d0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
a5e0: 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b  h = 1;......cack
a5f0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
a600: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09  on(slot);.......
a610: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
a620: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
a630: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c  );.....}....} el
a640: 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  se {.....CACKEY_
a650: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69  DEBUG_PRINTF("Di
a660: 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64  sconnecting card
a670: 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69  ");......SCardDi
a680: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
a690: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
a6a0: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09  LEAVE_CARD);....
a6b0: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
a6c0: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
a6d0: 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
a6e0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
a6f0: 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74  n */.....slot->t
a700: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
a710: 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79   = 1;.....cackey
a720: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
a730: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43  (slot);......CAC
a740: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a750: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  ("Returning in f
a760: 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65  ailure");.....re
a770: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
a780: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
a790: 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
a7a0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a7b0: 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e  _PRINTF("Disconn
a7c0: 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a  ecting card");..
a7d0: 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  ...SCardDisconne
a7e0: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
a7f0: 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f  rd, SCARD_LEAVE_
a800: 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e  CARD);....slot->
a810: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
a820: 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20  ted = 0;...../* 
a830: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
a840: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
a850: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
a860: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
a870: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
a880: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
a890: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a8a0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
a8b0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09   in failure");..
a8c0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
a8d0: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
a8e0: 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  NT);...}..}...CA
a8f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a900: 42 55 46 28 22 52 65 74 75 72 6e 65 64 20 56 61  BUF("Returned Va
a910: 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c  lue:", recv_buf,
a920: 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66   recv_len);...if
a930: 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20   (recv_len < 2) 
a940: 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72  {.../* Minimal r
a950: 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69  esponse length i
a960: 73 20 32 20 62 79 74 65 73 2c 20 72 65 74 75 72  s 2 bytes, retur
a970: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
a980: 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
a990: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e  G_PRINTF("Respon
a9a0: 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65  se too small, re
a9b0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
a9c0: 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25  re (recv_len = %
a9d0: 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
a9e0: 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b  long) recv_len);
a9f0: 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
aa00: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
aa10: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
aa20: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
aa30: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  t);....return(CA
aa40: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
aa50: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  RIC);..}.../* De
aa60: 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63  termine result c
aa70: 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63  ode */..major_rc
aa80: 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76   = recv_buf[recv
aa90: 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f  _len - 2];..mino
aaa0: 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b  r_rc = recv_buf[
aab0: 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09  recv_len - 1];..
aac0: 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a  if (respcode) {.
aad0: 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d  ..*respcode = (m
aae0: 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20  ajor_rc << 8) | 
aaf0: 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f  minor_rc;..}.../
ab00: 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65  * Adjust message
ab10: 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76   buffer */..recv
ab20: 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20  _len -= 2;.../* 
ab30: 41 64 64 20 62 79 74 65 73 20 74 6f 20 72 65 74  Add bytes to ret
ab40: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d  urn value */..tm
ab50: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d  p_respdata_len =
ab60: 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74   0;..if (respdat
ab70: 61 20 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65  a && respdata_le
ab80: 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64  n) {...tmp_respd
ab90: 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64  ata_len = *respd
aba0: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65  ata_len;....byte
abb0: 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73  s_to_copy = *res
abc0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66  pdata_len;....if
abd0: 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74   (recv_len < byt
abe0: 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09  es_to_copy) {...
abf0: 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
ac00: 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a   recv_len;...}..
ac10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ac20: 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25  RINTF("Copying %
ac30: 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68 65 20  lu bytes to the 
ac40: 62 75 66 66 65 72 20 28 72 65 63 76 27 64 20 25  buffer (recv'd %
ac50: 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e  lu bytes, but on
ac60: 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66  ly %lu bytes lef
ac70: 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29  t in our buffer)
ac80: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
ac90: 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  g) bytes_to_copy
aca0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
acb0: 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73  ) recv_len, (uns
acc0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73  igned long) *res
acd0: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d  pdata_len);....m
ace0: 65 6d 63 70 79 28 72 65 73 70 64 61 74 61 2c 20  emcpy(respdata, 
acf0: 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f  recv_buf, bytes_
ad00: 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70  to_copy);...resp
ad10: 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f  data += bytes_to
ad20: 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64  _copy;....*respd
ad30: 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f  ata_len = bytes_
ad40: 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72  to_copy;...tmp_r
ad50: 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62  espdata_len -= b
ad60: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d  ytes_to_copy;..}
ad70: 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65   else {...if (re
ad80: 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09  cv_len != 0) {..
ad90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ada0: 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20  RINTF("Throwing 
adb0: 61 77 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20  away %lu bytes, 
adc0: 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74 20 74  nowhere to put t
add0: 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64  hem!", (unsigned
ade0: 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29   long) recv_len)
adf0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d  ;...}..}...if (m
ae00: 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29  ajor_rc == 0x61)
ae10: 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20   {.../* We need 
ae20: 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43  to READ */...CAC
ae30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ae40: 28 22 42 75 66 66 65 72 20 72 65 61 64 20 72 65  ("Buffer read re
ae50: 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20  quired");....if 
ae60: 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30  (minor_rc == 0x0
ae70: 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63  0) {....minor_rc
ae80: 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d   = CACKEY_APDU_M
ae90: 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f  TU;...}....pcsc_
aea0: 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61  getresp_ret = ca
aeb0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
aec0: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
aed0: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
aee0: 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e  INSTR_GET_RESPON
aef0: 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  SE, 0x00, 0x00, 
af00: 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72  0, NULL, minor_r
af10: 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73  c, respcode, res
af20: 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70  pdata, &tmp_resp
af30: 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66  data_len);....if
af40: 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72   (pcsc_getresp_r
af50: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
af60: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
af70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
af80: 28 22 42 75 66 66 65 72 20 72 65 61 64 20 66 61  ("Buffer read fa
af90: 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67  iled!  Returning
afa0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
afb0: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
afc0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
afd0: 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
afe0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
aff0: 74 29 3b 0a 0a 09 09 09 69 66 20 28 70 63 73 63  t);.....if (pcsc
b000: 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 3d 20  _getresp_ret == 
b010: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
b020: 54 52 59 29 20 7b 0a 09 09 09 09 72 65 74 75 72  TRY) {.....retur
b030: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
b040: 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09  RETRY);....}....
b050: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b060: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
b070: 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64  ..}....if (respd
b080: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72  ata_len) {....*r
b090: 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74  espdata_len += t
b0a0: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  mp_respdata_len;
b0b0: 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53  ...}..../* End S
b0c0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b0d0: 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79  tion */...cackey
b0e0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
b0f0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45  (slot);....CACKE
b100: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b110: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
b120: 63 65 73 73 20 28 62 75 66 66 65 72 20 72 65 61  cess (buffer rea
b130: 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09  d complete)");..
b140: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b150: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
b160: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b170: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b180: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
b190: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
b1a0: 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d  .if (major_rc ==
b1b0: 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75   0x90) {.../* Su
b1c0: 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45  ccess */...CACKE
b1d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b1e0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
b1f0: 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d  cess (major_rc =
b200: 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74   0x90)");....ret
b210: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b220: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43  S_OK);..}....CAC
b230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b240: 28 22 41 50 44 55 20 52 65 74 75 72 6e 65 64 20  ("APDU Returned 
b250: 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  an error, return
b260: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
b270: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
b280: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
b290: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
b2a0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a  OSIS. *     ssiz
b2b0: 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  e_t cackey_read_
b2c0: 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61  buffer(struct ca
b2d0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
b2e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b2f0: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63  buffer, size_t c
b300: 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  ount, unsigned c
b310: 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65  har t_or_v, size
b320: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  _t initial_offse
b330: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
b340: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
b350: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
b360: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
b370: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
b380: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
b390: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b3a0: 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20  *buffer. *      
b3b0: 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a     [OUT] Buffer.
b3c0: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
b3d0: 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20   count. *       
b3e0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
b3f0: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  s to attempt to 
b400: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75  read. *. *     u
b410: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
b420: 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53  r_v. *         S
b430: 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66 66  elect the T-buff
b440: 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66  er (01) or V-buf
b450: 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61 64  fer (02) to read
b460: 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20   from.  . *. *  
b470: 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61     size_t initia
b480: 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20  l_offset. *     
b490: 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65 20      Specify the 
b4a0: 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20  offset to begin 
b4b0: 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a  the read from. *
b4c0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
b4d0: 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20  LUE. *     This 
b4e0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
b4f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
b500: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
b510: 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72  ad, or -1 on err
b520: 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  or.. *. * NOTES.
b530: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
b540: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
b550: 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  t cackey_read_bu
b560: 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b  ffer(struct cack
b570: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
b580: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
b590: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75  ffer, size_t cou
b5a0: 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nt, unsigned cha
b5b0: 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74  r t_or_v, size_t
b5c0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29   initial_offset)
b5d0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
b5e0: 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a  r *init_buffer;.
b5f0: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75  .size_t init_cou
b600: 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74  nt;..size_t init
b610: 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b  _initial_offset;
b620: 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74  ...size_t offset
b630: 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74   = 0, max_offset
b640: 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e  , max_count;..un
b650: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b  signed char cmd[
b660: 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  2];..uint16_t re
b670: 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e  spcode;..int sen
b680: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
b690: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
b6a0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f  lled.");...init_
b6b0: 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 3b  buffer = buffer;
b6c0: 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63  ..init_count = c
b6d0: 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74  ount;..init_init
b6e0: 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69  ial_offset = ini
b6f0: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d  tial_offset;...m
b700: 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e  ax_offset = coun
b710: 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20  t;..max_count = 
b720: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b  CACKEY_APDU_MTU;
b730: 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d  ...if (t_or_v !=
b740: 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20   1 && t_or_v != 
b750: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  2) {...CACKEY_DE
b760: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
b770: 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d  lid T or V param
b780: 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c 20  eter specified, 
b790: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b7a0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
b7b0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b  n(-1);..}...cmd[
b7c0: 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77  0] = t_or_v;...w
b7d0: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20  hile (1) {...if 
b7e0: 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f  (offset >= max_o
b7f0: 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b  ffset) {....CACK
b800: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b810: 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c  "Buffer too smal
b820: 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61  l, returning wha
b830: 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a  t we got...");..
b840: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
b850: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66  .count = max_off
b860: 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09  set - offset;...
b870: 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f  if (count > max_
b880: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e  count) {....coun
b890: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09  t = max_count;..
b8a0: 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63  .}....cmd[1] = c
b8b0: 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65  ount;....send_re
b8c0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
b8d0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
b8e0: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
b8f0: 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e  ATFORM, GSCIS_IN
b900: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c  STR_READ_BUFFER,
b910: 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65   ((initial_offse
b920: 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38  t + offset) >> 8
b930: 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69  ) & 0xff, (initi
b940: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
b950: 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65  et) & 0xff, size
b960: 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78  of(cmd), cmd, 0x
b970: 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62  00, &respcode, b
b980: 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20  uffer + offset, 
b990: 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28  &count);....if (
b9a0: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
b9b0: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
b9c0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
b9d0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
b9e0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
b9f0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
ba00: 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74 75  ffer");.....retu
ba10: 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  rn(cackey_read_b
ba20: 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74  uffer(slot, init
ba30: 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f  _buffer, init_co
ba40: 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69  unt, t_or_v, ini
ba50: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t_initial_offset
ba60: 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ));...}....if (s
ba70: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
ba80: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
ba90: 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d  ..if (respcode =
baa0: 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09  = 0x6A86) {.....
bab0: 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d  if (max_count ==
bac0: 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b   1) {......break
bad0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78  ;.....}......max
bae0: 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75  _count = max_cou
baf0: 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e  nt / 2;......con
bb00: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
bb10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bb20: 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64  NTF("cackey_send
bb30: 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20  _apdu() failed, 
bb40: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
bb50: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75  lure");.....retu
bb60: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f  rn(-1);...}....o
bb70: 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a  ffset += count;.
bb80: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d  ...if (count < m
bb90: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  ax_count) {....C
bba0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bbb0: 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d  TF("Short read -
bbc0: 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d  - count = %i, cm
bbd0: 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74  d[1] = %i", (int
bbe0: 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  ) count, (int) c
bbf0: 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61  md[1]);.....brea
bc00: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  k;...}..}..#ifde
bc10: 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49  f CACKEY_PARANOI
bc20: 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49  D.#  ifdef _POSI
bc30: 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20  X_SSIZE_MAX..if 
bc40: 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58  (offset > _POSIX
bc50: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
bc60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bc70: 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63 65  NTF("Offset exce
bc80: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
bc90: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
bca0: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
bcb0: 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c  %li, offset = %l
bcc0: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53  u)", (long) _POS
bcd0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75  IX_SSIZE_MAX, (u
bce0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66  nsigned long) of
bcf0: 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  fset);....return
bd00: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
bd10: 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  f.#endif...CACKE
bd20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bd30: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
bd40: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62  cess, read %lu b
bd50: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  ytes", (unsigned
bd60: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
bd70: 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29  ..return(offset)
bd80: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
bd90: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
bda0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c  y_ret cackey_sel
bdb0: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63  ect_applet(struc
bdc0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
bdd0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
bde0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20  ar *aid, size_t 
bdf0: 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20  aid_len);. *. * 
be00: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
be10: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
be20: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
be30: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
be40: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
be50: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
be60: 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20   char *aid. *   
be70: 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e        Buffer con
be80: 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49  taining Applet I
be90: 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20  D to select. *. 
bea0: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64  *     size_t aid
beb0: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  _len. *         
bec0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
bed0: 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 70  in the "aid" (Ap
bee0: 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 74  plet ID) paramet
bef0: 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  er. *. * RETURN 
bf00: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
bf10: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
bf20: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
bf30: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
bf40: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
bf50: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
bf60: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  NOTES. *     Non
bf70: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  e. *. */.static 
bf80: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
bf90: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
bfa0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
bfb0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
bfc0: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69  ed char *aid, si
bfd0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a  ze_t aid_len) {.
bfe0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
bff0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c000: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
c010: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c020: 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74  PRINTBUF("Select
c030: 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69  ing applet:", ai
c040: 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73  d, aid_len);...s
c050: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
c060: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
c070: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
c080: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
c090: 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f  R_SELECT, GSCIS_
c0a0: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50  PARAM_SELECT_APP
c0b0: 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c  LET, 0x00, aid_l
c0c0: 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e  en, aid, 0x00, N
c0d0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
c0e0: 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ;...if (send_ret
c0f0: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
c100: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43  E_RETRY) {...CAC
c110: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c120: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66  ("ADPU Sending f
c130: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20  ailed, retrying 
c140: 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29 3b  select applet");
c150: 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
c160: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
c170: 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c  slot, aid, aid_l
c180: 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  en));..}...if (s
c190: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
c1a0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
c1b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c1c0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
c1d0: 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74  open applet, ret
c1e0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
c1f0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
c200: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
c210: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
c220: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c230: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
c240: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
c250: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
c260: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
c270: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
c280: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
c290: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
c2a0: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
c2b0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
c2c0: 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20  16_t ef);. *. * 
c2d0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
c2e0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
c2f0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
c300: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
c310: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
c320: 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74  . *     uint16_t
c330: 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45   ef. *         E
c340: 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f  lemental File to
c350: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45   select. *. * RE
c360: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
c370: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
c380: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
c390: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
c3a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
c3b0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
c3c0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
c3d0: 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20 61    This selects a
c3e0: 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c  n Elementary Fil
c3f0: 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68 65  e (EF) under the
c400: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63   currently selec
c410: 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63  ted. *     Dedic
c420: 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20  ated File (DF). 
c430: 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c  *. *     Typical
c440: 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  ly this is calle
c450: 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e  d after selectin
c460: 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41 70  g the correct Ap
c470: 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20  plet (using. *  
c480: 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74     cackey_select
c490: 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20  _applet) for VM 
c4a0: 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61  cards. *. */.sta
c4b0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
c4c0: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
c4d0: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
c4e0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
c4f0: 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69  16_t ef) {..unsi
c500: 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62 75  gned char fid_bu
c510: 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  f[2];..int send_
c520: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
c530: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
c540: 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e  ed.");.../* Open
c550: 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20   the elementary 
c560: 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66  file */..fid_buf
c570: 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20  [0] = (ef >> 8) 
c580: 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66  & 0xff;..fid_buf
c590: 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b  [1] = ef & 0xff;
c5a0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c5b0: 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e  PRINTF("Selectin
c5c0: 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20  g file: %04lx", 
c5d0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c5e0: 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  ef);...send_ret 
c5f0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
c600: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
c610: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
c620: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
c630: 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69  , 0x02, 0x0C, si
c640: 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66  zeof(fid_buf), f
c650: 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55  id_buf, 0x00, NU
c660: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
c670: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
c680: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
c690: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
c6a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
c6b0: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  led to open file
c6c0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
c6d0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
c6e0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
c6f0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
c700: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c710: 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
c720: 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65  ly selected file
c730: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
c740: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
c750: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
c760: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
c770: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74  ckey_free_tlv(st
c780: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
c790: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20  entity *root);. 
c7a0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
c7b0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
c7c0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
c7d0: 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  root. *         
c7e0: 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20  Root of the TLV 
c7f0: 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66 72  list to start fr
c800: 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55  eeing. *. * RETU
c810: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
c820: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
c830: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
c840: 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20  ction frees the 
c850: 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65  TLV linked liste
c860: 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a  d returned from.
c870: 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72   *     "cackey_r
c880: 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a  ead_tlv". *. */.
c890: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
c8a0: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75  ey_free_tlv(stru
c8b0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
c8c0: 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73  tity *root) {..s
c8d0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
c8e0: 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a  _entity *curr, *
c8f0: 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74  next;...if (root
c900: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
c910: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
c920: 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72  curr = root; cur
c930: 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20  r; curr = next) 
c940: 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d  {...next = curr-
c950: 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63  >_next;....switc
c960: 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a  h (curr->tag) {.
c970: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
c980: 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09  G_ACR_TABLE:....
c990: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
c9a0: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
c9b0: 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29  if (curr->value)
c9c0: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
c9d0: 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d  r->value);.....}
c9e0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
c9f0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
ca00: 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63  RDURL:.....if (c
ca10: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
ca20: 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  rl) {......free(
ca30: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
ca40: 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  url);.....}.....
ca50: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72  break;...}....fr
ca60: 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72  ee(curr);..}...r
ca70: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
ca80: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
ca90: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
caa0: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
cab0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
cac0: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
cad0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
cae0: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
caf0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
cb00: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b  tlv_entity *cack
cb10: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75  ey_read_tlv(stru
cb20: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
cb30: 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20  slot) {..struct 
cb40: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
cb50: 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20  y *curr_entity, 
cb60: 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c  *root = NULL, *l
cb70: 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73  ast = NULL;..uns
cb80: 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f  igned char tlen_
cb90: 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66  buf[2], tval_buf
cba0: 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09  [1024], *tval;..
cbb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c  unsigned char vl
cbc0: 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f  en_buf[2], vval_
cbd0: 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c  buf[8192], *vval
cbe0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
cbf0: 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67   *tmpbuf;..unsig
cc00: 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c  ned long tmpbufl
cc10: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65  en;..ssize_t tle
cc20: 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f  n, vlen;..ssize_
cc30: 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a  t read_ret;..siz
cc40: 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30  e_t offset_t = 0
cc50: 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a  , offset_v = 0;.
cc60: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  .unsigned char t
cc70: 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67  ag;..size_t leng
cc80: 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  th;.#ifdef HAVE_
cc90: 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70  LIBZ..int uncomp
cca0: 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66  ress_ret;.#endif
ccb0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ccc0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
ccd0: 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  );...read_ret = 
cce0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
ccf0: 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75  er(slot, tlen_bu
cd00: 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62  f, sizeof(tlen_b
cd10: 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  uf), 1, offset_t
cd20: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
cd30: 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f   != sizeof(tlen_
cd40: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
cd50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
cd60: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ead failed, retu
cd70: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
cd80: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
cd90: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d  LL);..}...tlen =
cda0: 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c   (tlen_buf[1] <<
cdb0: 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30   8) | tlen_buf[0
cdc0: 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  ];...read_ret = 
cdd0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
cde0: 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75  er(slot, vlen_bu
cdf0: 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62  f, sizeof(vlen_b
ce00: 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  uf), 2, offset_v
ce10: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
ce20: 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f   != sizeof(vlen_
ce30: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
ce40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
ce50: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ead failed, retu
ce60: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
ce70: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
ce80: 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d  LL);..}...vlen =
ce90: 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c   (vlen_buf[1] <<
cea0: 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30   8) | vlen_buf[0
ceb0: 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ];...CACKEY_DEBU
cec0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65  G_PRINTF("Tag Le
ced0: 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75  ngth = %lu, Valu
cee0: 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c  e Length = %lu",
cef0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
cf00: 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64   tlen, (unsigned
cf10: 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09   long) vlen);...
cf20: 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09  offset_t += 2;..
cf30: 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a  offset_v += 2;..
cf40: 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65  .if (tlen > size
cf50: 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a  of(tval_buf)) {.
cf60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cf70: 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74  RINTF("Tag lengt
cf80: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  h is too large, 
cf90: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
cfa0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
cfb0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
cfc0: 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28   (vlen > sizeof(
cfd0: 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43  vval_buf)) {...C
cfe0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
cff0: 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68  TF("Value length
d000: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72   is too large, r
d010: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
d020: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
d030: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61  (NULL);..}...rea
d040: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
d050: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
d060: 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c   tval_buf, tlen,
d070: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09   1, offset_t);..
d080: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
d090: 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  tlen) {...CACKEY
d0a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
d0b0: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e  nable to read en
d0c0: 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72  tire T-buffer, r
d0d0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
d0e0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
d0f0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61  (NULL);..}...rea
d100: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
d110: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
d120: 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c   vval_buf, vlen,
d130: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09   2, offset_v);..
d140: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
d150: 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  vlen) {...CACKEY
d160: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
d170: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e  nable to read en
d180: 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72  tire V-buffer, r
d190: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
d1a0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
d1b0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61  (NULL);..}...tva
d1c0: 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76  l = tval_buf;..v
d1d0: 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a  val = vval_buf;.
d1e0: 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30  .while (tlen > 0
d1f0: 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a   && vlen > 0) {.
d200: 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09  ..tag = *tval;..
d210: 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d  .tval++;...tlen-
d220: 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20  -;....if (*tval 
d230: 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65  == 0xff) {....le
d240: 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20  ngth = (tval[2] 
d250: 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b  << 8) | tval[1];
d260: 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09  ....tval += 3;..
d270: 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d  ..tlen -= 3;...}
d280: 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74   else {....lengt
d290: 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76  h = *tval;....tv
d2a0: 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b  al++;....tlen--;
d2b0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
d2c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
d2d0: 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43 41  : %s (%02x)", CA
d2e0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
d2f0: 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c  TAG_TO_STR(tag),
d300: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
d310: 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44  tag);...CACKEY_D
d320: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56  EBUG_PRINTBUF("V
d330: 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65  alue:", vval, le
d340: 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65  ngth);....curr_e
d350: 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
d360: 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09  switch (tag) {..
d370: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
d380: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75  _CARDURL:.....cu
d390: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
d3a0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
d3b0: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75  entity));.....cu
d3c0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
d3d0: 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f  _cardurl = mallo
d3e0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
d3f0: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
d400: 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d  durl));......mem
d410: 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d  cpy(curr_entity-
d420: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
d430: 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09  rid, vval, 5);..
d440: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
d450: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
d460: 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d  pptype = vval[5]
d470: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
d480: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
d490: 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76  ->objectid = (vv
d4a0: 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76  al[6] << 8) | vv
d4b0: 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[7];.....curr_
d4c0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
d4d0: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28  rdurl->appid = (
d4e0: 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20  vval[8] << 8) | 
d4f0: 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75  vval[9];......cu
d500: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
d510: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
d520: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
d530: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
d540: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
d550: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
d560: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
d570: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
d580: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
d590: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
d5a0: 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09  c(length);......
d5b0: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
d5c0: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09  val, length);...
d5d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
d5e0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
d5f0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
d600: 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09  th = length;....
d610: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
d620: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  lue = tmpbuf;...
d630: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
d640: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
d650: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
d660: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
d670: 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72  FICATE:.....curr
d680: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  _entity = malloc
d690: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
d6a0: 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66 20  tity));..#ifdef 
d6b0: 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d  HAVE_LIBZ.....tm
d6c0: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
d6d0: 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66   * 2;.....tmpbuf
d6e0: 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66   = malloc(tmpbuf
d6f0: 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d  len);......uncom
d700: 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f  press_ret = unco
d710: 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26  mpress(tmpbuf, &
d720: 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c  tmpbuflen, vval,
d730: 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66   length);.....if
d740: 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74   (uncompress_ret
d750: 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09   != Z_OK) {.....
d760: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d770: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
d780: 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f  decompress, unco
d790: 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e 65  mpress() returne
d7a0: 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e  d %i -- resortin
d7b0: 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79  g to direct copy
d7c0: 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ", uncompress_re
d7d0: 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66  t);.......tmpbuf
d7e0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  len = length;...
d7f0: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
d800: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
d810: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
d820: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
d830: 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20  F("Decompressed 
d840: 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d  to:", tmpbuf, tm
d850: 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a  pbuflen);.#else.
d860: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d870: 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67  _PRINTF("Missing
d880: 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74   ZLIB Support, t
d890: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20  his certificate 
d8a0: 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73  is likely useles
d8b0: 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70  s...");......tmp
d8c0: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b  buflen = length;
d8d0: 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62  .....memcpy(tmpb
d8e0: 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  uf, vval, length
d8f0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63  );.#endif......c
d900: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
d910: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
d920: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
d930: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09   tmpbuflen;.....
d940: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
d950: 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09  ue = tmpbuf;....
d960: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e  .curr_entity->_n
d970: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ext = NULL;.....
d980: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
d990: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
d9a0: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
d9b0: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
d9c0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
d9d0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
d9e0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
d9f0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
da00: 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61  value_byte = vva
da10: 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[0];.....curr_e
da20: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
da30: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
da40: 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20  ...}....vval += 
da50: 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d  length;...vlen -
da60: 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20  = length;....if 
da70: 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20  (curr_entity != 
da80: 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72  NULL) {....if (r
da90: 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  oot == NULL) {..
daa0: 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65  ...root = curr_e
dab0: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
dac0: 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c  if (last != NULL
dad0: 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e  ) {.....last->_n
dae0: 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  ext = curr_entit
daf0: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74  y;....}.....last
db00: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
db10: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ..}..}...return(
db20: 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  root);.}../*. * 
db30: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
db40: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
db50: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
db60: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
db70: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
db80: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
db90: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
dba0: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
dbb0: 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74 20  ee_certs(struct 
dbc0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
dbd0: 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a  tity *start, siz
dbe0: 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66  e_t count, int f
dbf0: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69  ree_start) {..si
dc00: 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28  ze_t idx;...if (
dc10: 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  start == NULL) {
dc20: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
dc30: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
dc40: 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  x < count; idx++
dc50: 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b  ) {...if (start[
dc60: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
dc70: 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72  ) {....free(star
dc80: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
dc90: 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  te);...}..}...if
dca0: 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a   (free_start) {.
dcb0: 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09  ..free(start);..
dcc0: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }...return;.}../
dcd0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
dce0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
dcf0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
dd00: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
dd10: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
dd20: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
dd30: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
dd40: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
dd50: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
dd60: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
dd70: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
dd80: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
dd90: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
dda0: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72  sc_identity *cer
ddb0: 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ts, unsigned lon
ddc0: 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72  g *count) {..str
ddd0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
dde0: 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69  identity *curr_i
ddf0: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
de00: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63  y_tlv_entity *cc
de10: 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72  c_tlv, *ccc_curr
de20: 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70  , *app_tlv, *app
de30: 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64  _curr;..unsigned
de40: 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20   char ccc_aid[] 
de50: 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43  = {GSCIS_AID_CCC
de60: 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
de70: 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09  r curr_aid[7];..
de80: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75  unsigned long ou
de90: 74 69 64 78 20 3d 20 30 3b 0a 09 63 61 63 6b 65  tidx = 0;..cacke
dea0: 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74 69 6f  y_ret transactio
deb0: 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 63 65 72 74  n_ret;..int cert
dec0: 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e  s_resizable;..in
ded0: 74 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65  t send_ret, sele
dee0: 63 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ct_ret;...CACKEY
def0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
df00: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
df10: 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  count == NULL) {
df20: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
df30: 50 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73  PRINTF("count is
df40: 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67   NULL, returning
df50: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
df60: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
df70: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21  .}...if (certs !
df80: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
df90: 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  *count == 0) {..
dfa0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dfb0: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64  RINTF("Requested
dfc0: 20 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a   we return 0 obj
dfd0: 65 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63  ects, short-circ
dfe0: 75 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  uit");.....retur
dff0: 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
e000: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d  .../* Begin a Sm
e010: 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74  artCard transact
e020: 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74  ion */..transact
e030: 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ion_ret = cackey
e040: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
e050: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74  on(slot);..if (t
e060: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21  ransaction_ret !
e070: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
e080: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
e090: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
e0a0: 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ble begin transa
e0b0: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
e0c0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e0d0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
e0e0: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d  .}...if (certs =
e0f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74  = NULL) {...cert
e100: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
e110: 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a  f(*certs) * 5);.
e120: 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09  ..*count = 5;...
e130: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
e140: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
e150: 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
e160: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65   = 0;..}.../* Se
e170: 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70  lect the CCC App
e180: 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  let */..send_ret
e190: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
e1a0: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63  _applet(slot, cc
e1b0: 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  c_aid, sizeof(cc
e1c0: 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65  c_aid));..if (se
e1d0: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
e1e0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
e1f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e200: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73  NTF("Unable to s
e210: 65 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74  elect CCC Applet
e220: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
e230: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20  ailure");..../* 
e240: 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
e250: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
e260: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
e270: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
e280: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
e290: 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64  L);..}.../* Read
e2a0: 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73   all the applets
e2b0: 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20   from the CCC's 
e2c0: 54 4c 56 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20  TLV */..ccc_tlv 
e2d0: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c  = cackey_read_tl
e2e0: 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f  v(slot);.../* Lo
e2f0: 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20  ok for CARDURLs 
e300: 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20  that coorespond 
e310: 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a  to PKI applets *
e320: 2f 0a 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72  /..for (ccc_curr
e330: 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f   = ccc_tlv; ccc_
e340: 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d  curr; ccc_curr =
e350: 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74   ccc_curr->_next
e360: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
e370: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
e380: 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20   tag: %s ... ", 
e390: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
e3a0: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 63  C_TAG_TO_STR(ccc
e3b0: 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09  _curr->tag));...
e3c0: 09 69 66 20 28 63 63 63 5f 63 75 72 72 2d 3e 74  .if (ccc_curr->t
e3d0: 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
e3e0: 43 41 52 44 55 52 4c 29 20 7b 0a 09 09 09 43 41  CARDURL) {....CA
e3f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e400: 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
e410: 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
e420: 72 65 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c  re about CARDURL
e430: 73 29 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  s)");.....contin
e440: 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  ue;...}....if ((
e450: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
e460: 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
e470: 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   & CACKEY_TLV_AP
e480: 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59  P_PKI) != CACKEY
e490: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a  _TLV_APP_PKI) {.
e4a0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e4b0: 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
e4c0: 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
e4d0: 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b  ly care about PK
e4e0: 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20  I applets, this 
e4f0: 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a  applet supports:
e500: 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b   %s/%02x)", CACK
e510: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
e520: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63  PTYPE_TO_STR(ccc
e530: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
e540: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20  durl->apptype), 
e550: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63  (unsigned int) c
e560: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
e570: 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29  ardurl->apptype)
e580: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
e590: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
e5a0: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
e5b0: 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
e5c0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
e5d0: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
e5e0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
e5f0: 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 43 41 43 4b  l->rid));...CACK
e600: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e610: 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c  "AppID = %s/%04l
e620: 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
e630: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
e640: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
e650: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
e660: 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
e670: 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
e680: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
e690: 69 64 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45  id);...CACKEY_DE
e6a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65  BUG_PRINTF("Obje
e6b0: 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ctID = %s/%04lx"
e6c0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
e6d0: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
e6e0: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
e6f0: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
e700: 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
e710: 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
e720: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
e730: 6a 65 63 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63  jectid);....memc
e740: 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63  py(curr_aid, ccc
e750: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
e760: 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
e770: 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
e780: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
e790: 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a  ;...curr_aid[siz
e7a0: 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20  eof(curr_aid) - 
e7b0: 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e  2] = (ccc_curr->
e7c0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
e7d0: 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66  ppid >> 8) & 0xf
e7e0: 66 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69  f;...curr_aid[si
e7f0: 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d  zeof(curr_aid) -
e800: 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e   1] = ccc_curr->
e810: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
e820: 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09  ppid & 0xff;....
e830: 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20  /* Select found 
e840: 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09  applet ... */...
e850: 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63  select_ret = cac
e860: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
e870: 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64  t(slot, curr_aid
e880: 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  , sizeof(curr_ai
e890: 64 29 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63  d));...if (selec
e8a0: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
e8b0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
e8c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e8d0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
e8e0: 65 6c 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b  elect applet, sk
e8f0: 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
e900: 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
e910: 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  ");.....continue
e920: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20  ;...}..../* ... 
e930: 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65  and object (file
e940: 29 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65  ) */...select_re
e950: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
e960: 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63  t_file(slot, ccc
e970: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
e980: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b  durl->objectid);
e990: 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
e9a0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
e9b0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
e9c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e9d0: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63  "Failed to selec
e9e0: 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67  t file, skipping
e9f0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
ea00: 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  his object");...
ea10: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
ea20: 0a 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .../* Process th
ea30: 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f  is file's TLV lo
ea40: 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66  oking for certif
ea50: 69 63 61 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f  icates */...app_
ea60: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
ea70: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
ea80: 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20  for (app_curr = 
ea90: 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72  app_tlv; app_cur
eaa0: 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70  r; app_curr = ap
eab0: 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  p_curr->_next) {
eac0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ead0: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
eae0: 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ag: %s", CACKEY_
eaf0: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
eb00: 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e  O_STR(app_curr->
eb10: 74 61 67 29 29 3b 0a 09 09 09 69 66 20 28 61 70  tag));....if (ap
eb20: 70 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47  p_curr->tag != G
eb30: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
eb40: 43 41 54 45 29 20 7b 0a 09 09 09 09 43 41 43 4b  CATE) {.....CACK
eb50: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
eb60: 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
eb70: 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
eb80: 20 61 62 6f 75 74 20 43 45 52 54 49 46 49 43 41   about CERTIFICA
eb90: 54 45 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e  TEs)");......con
eba0: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
ebb0: 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73  curr_id = &certs
ebc0: 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74  [outidx];....out
ebd0: 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70  idx++;.....memcp
ebe0: 79 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65  y(curr_id->apple
ebf0: 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
ec00: 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
ec10: 6c 65 74 29 29 3b 0a 09 09 09 63 75 72 72 5f 69  let));....curr_i
ec20: 64 2d 3e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75  d->file = ccc_cu
ec30: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
ec40: 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09  l->objectid;....
ec50: 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65  curr_id->keysize
ec60: 20 3d 20 2d 31 3b 0a 0a 09 09 09 43 41 43 4b 45   = -1;.....CACKE
ec70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ec80: 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d  Filling curr_id-
ec90: 3e 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74  >applet (%p) wit
eca0: 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63  h %lu bytes:", c
ecb0: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
ecc0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
ecd0: 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e  sizeof(curr_id->
ece0: 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 43 41 43  applet));....CAC
ecf0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
ed00: 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f  UF("VAL:", curr_
ed10: 69 64 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65  id->applet, size
ed20: 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c  of(curr_id->appl
ed30: 65 74 29 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69  et));.....curr_i
ed40: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
ed50: 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c  en = app_curr->l
ed60: 65 6e 67 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f  ength;.....curr_
ed70: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
ed80: 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
ed90: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
eda0: 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75  n);....memcpy(cu
edb0: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
edc0: 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61  te, app_curr->va
edd0: 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  lue, curr_id->ce
ede0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
edf0: 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e  ....if (outidx >
ee00: 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  = *count) {.....
ee10: 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
ee20: 62 6c 65 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75  ble) {......*cou
ee30: 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65  nt *= 2;......ce
ee40: 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65  rts = realloc(ce
ee50: 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72  rts, sizeof(*cer
ee60: 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b  ts) * (*count));
ee70: 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
ee80: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
ee90: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ...}...}....cack
eea0: 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f  ey_free_tlv(app_
eeb0: 74 6c 76 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74  tlv);....if (out
eec0: 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
eed0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
eee0: 7d 0a 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  }...cackey_free_
eef0: 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09  tlv(ccc_tlv);...
ef00: 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b  *count = outidx;
ef10: 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
ef20: 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74  izable) {...cert
ef30: 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74  s = realloc(cert
ef40: 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  s, sizeof(*certs
ef50: 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09  ) * (*count));..
ef60: 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  }.../* Terminate
ef70: 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73   SmartCard Trans
ef80: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
ef90: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
efa0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72  n(slot);...retur
efb0: 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a  n(certs);.}../*.
efc0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
efd0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
efe0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
eff0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
f000: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
f010: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
f020: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
f030: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
f040: 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
f050: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
f060: 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
f070: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
f080: 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
f090: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
f0a0: 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75  size_t buflen, u
f0b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
f0c0: 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74  tbuf, size_t out
f0d0: 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49  buflen, int padI
f0e0: 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f  nput, int unpadO
f0f0: 75 74 70 75 74 29 20 7b 0a 09 75 6e 73 69 67 6e  utput) {..unsign
f100: 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c  ed char *tmpbuf,
f110: 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74   *tmpbuf_s, *out
f120: 62 75 66 5f 73 3b 0a 09 75 6e 73 69 67 6e 65 64  buf_s;..unsigned
f130: 20 63 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73   char bytes_to_s
f140: 65 6e 64 2c 20 70 31 3b 0a 09 75 6e 73 69 67 6e  end, p1;..unsign
f150: 65 64 20 63 68 61 72 20 62 6c 6f 63 6b 74 79 70  ed char blocktyp
f160: 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 73  e;..cackey_ret s
f170: 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74 31 36  end_ret;..uint16
f180: 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 73 73  _t respcode;..ss
f190: 69 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d 20 30  ize_t retval = 0
f1a0: 2c 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09  , unpadoffset;..
f1b0: 73 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65 6e  size_t tmpbuflen
f1c0: 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f 75 74  , padlen, tmpout
f1d0: 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65  buflen;..int fre
f1e0: 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69  e_tmpbuf = 0;..i
f1f0: 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f  nt le;...CACKEY_
f200: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
f210: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73  lled.");...if (s
f220: 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  lot == NULL) {..
f230: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f240: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73 6c  INTF("Error.  sl
f250: 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  ot is NULL");...
f260: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
f270: 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c  ..if (buf == NUL
f280: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
f290: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
f2a0: 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c 22  r.  buf is NULL"
f2b0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
f2c0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75  ;..}...if (outbu
f2d0: 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  f == NULL) {...C
f2e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f2f0: 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 62  TF("Error.  outb
f300: 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  uf is NULL");...
f310: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
f320: 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d  ..if (identity =
f330: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
f340: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f350: 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74  "Error.  identit
f360: 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  y is NULL");....
f370: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
f380: 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  .if (identity->p
f390: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20  csc_identity == 
f3a0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
f3b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
f3c0: 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d  rror.  identity-
f3d0: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69  >pcsc_identity i
f3e0: 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
f3f0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  urn(-1);..}.../*
f400: 20 44 65 74 65 72 6d 69 6e 65 20 69 64 65 6e 74   Determine ident
f410: 69 74 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a  ity Key size */.
f420: 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  .if (identity->p
f430: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
f440: 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69  ysize < 0) {...i
f450: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
f460: 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
f470: 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a  = x509_to_keysiz
f480: 65 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  e(identity->pcsc
f490: 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
f4a0: 66 69 63 61 74 65 2c 20 69 64 65 6e 74 69 74 79  ficate, identity
f4b0: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
f4c0: 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
f4d0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d  );..}.../* Pad m
f4e0: 65 73 73 61 67 65 20 74 6f 20 6b 65 79 20 73 69  essage to key si
f4f0: 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e  ze */..if (padIn
f500: 70 75 74 29 20 7b 0a 09 09 69 66 20 28 69 64 65  put) {...if (ide
f510: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
f520: 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20  tity->keysize > 
f530: 30 29 20 7b 0a 09 09 09 69 66 20 28 62 75 66 6c  0) {....if (bufl
f540: 65 6e 20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e  en != identity->
f550: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
f560: 65 79 73 69 7a 65 29 20 7b 0a 09 09 09 09 69 66  eysize) {.....if
f570: 20 28 62 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e   (buflen > (iden
f580: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
f590: 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33  ity->keysize + 3
f5a0: 29 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  )) {......CACKEY
f5b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
f5c0: 72 72 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69  rror.  Message i
f5d0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73  s too large to s
f5e0: 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a  ign/decrypt");..
f5f0: 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
f600: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62  .....}......tmpb
f610: 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79  uflen = identity
f620: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
f630: 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d  >keysize;.....tm
f640: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d  pbuf = malloc(tm
f650: 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72  pbuflen);.....fr
f660: 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a  ee_tmpbuf = 1;..
f670: 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70  ....padlen = tmp
f680: 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20  buflen - buflen 
f690: 2d 20 33 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41  - 3;....../* RSA
f6a0: 20 50 4b 43 53 23 31 20 45 4d 53 41 2d 50 4b 43   PKCS#1 EMSA-PKC
f6b0: 53 31 2d 76 31 5f 35 20 50 61 64 64 69 6e 67 20  S1-v1_5 Padding 
f6c0: 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66 5b 30 5d  */.....tmpbuf[0]
f6d0: 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 74 6d 70   = 0x00;.....tmp
f6e0: 62 75 66 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09  buf[1] = 0x01;..
f6f0: 09 09 09 6d 65 6d 73 65 74 28 26 74 6d 70 62 75  ...memset(&tmpbu
f700: 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c  f[2], 0xFF, padl
f710: 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b  en);.....tmpbuf[
f720: 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30  padlen + 2]= 0x0
f730: 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 26 74  0;.....memcpy(&t
f740: 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33  mpbuf[padlen + 3
f750: 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  ], buf, buflen);
f760: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
f770: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70  UG_PRINTBUF("Unp
f780: 61 64 64 65 64 3a 22 2c 20 62 75 66 2c 20 62 75  added:", buf, bu
f790: 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45  flen);.....CACKE
f7a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
f7b0: 28 22 50 61 64 64 65 64 3a 22 2c 20 74 6d 70 62  ("Padded:", tmpb
f7c0: 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a  uf, tmpbuflen);.
f7d0: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
f7e0: 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09  tmpbuf = buf;...
f7f0: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75  ..tmpbuflen = bu
f800: 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74  flen;.....free_t
f810: 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 09 70  mpbuf = 0;.....p
f820: 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a  adlen = 0;....}.
f830: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
f840: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f850: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 74  F("Unable to det
f860: 65 72 6d 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c  ermine key size,
f870: 20 68 6f 70 69 6e 67 20 74 68 65 20 6d 65 73 73   hoping the mess
f880: 61 67 65 20 69 73 20 70 72 6f 70 65 72 6c 79 20  age is properly 
f890: 70 61 64 64 65 64 21 22 29 3b 0a 0a 09 09 09 74  padded!");.....t
f8a0: 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09  mpbuf = buf;....
f8b0: 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c  tmpbuflen = bufl
f8c0: 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62  en;....free_tmpb
f8d0: 75 66 20 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65  uf = 0;....padle
f8e0: 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n = 0;...}..} el
f8f0: 73 65 20 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20  se {...tmpbuf = 
f900: 62 75 66 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e  buf;...tmpbuflen
f910: 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65   = buflen;...fre
f920: 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09  e_tmpbuf = 0;...
f930: 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a  padlen = 0;..}..
f940: 09 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61  ./* Begin transa
f950: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
f960: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
f970: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53  on(slot);.../* S
f980: 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20 61 70  elect correct ap
f990: 70 6c 65 74 20 2a 2f 0a 09 43 41 43 4b 45 59 5f  plet */..CACKEY_
f9a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
f9b0: 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66  lecting applet f
f9c0: 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c  ound at %p ...",
f9d0: 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
f9e0: 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74  identity->applet
f9f0: 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 6c 65 63  );..cackey_selec
fa00: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69  t_applet(slot, i
fa10: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
fa20: 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 2c 20  entity->applet, 
fa30: 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d  sizeof(identity-
fa40: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
fa50: 61 70 70 6c 65 74 29 29 3b 0a 0a 09 2f 2a 20 53  applet));.../* S
fa60: 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20 66 69  elect correct fi
fa70: 6c 65 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 73 65  le */..cackey_se
fa80: 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20  lect_file(slot, 
fa90: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
faa0: 64 65 6e 74 69 74 79 2d 3e 66 69 6c 65 29 3b 0a  dentity->file);.
fab0: 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70  ..tmpbuf_s = tmp
fac0: 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d  buf;..outbuf_s =
fad0: 20 6f 75 74 62 75 66 3b 0a 09 77 68 69 6c 65 20   outbuf;..while 
fae0: 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09  (tmpbuflen) {...
faf0: 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20  if (tmpbuflen > 
fb00: 32 34 35 29 20 7b 0a 09 09 09 62 79 74 65 73 5f  245) {....bytes_
fb10: 74 6f 5f 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09  to_send = 245;..
fb20: 09 09 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 09  ..p1 = 0x80;....
fb30: 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 7d 20 65  le = 0x00;...} e
fb40: 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73 5f 74  lse {....bytes_t
fb50: 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c  o_send = tmpbufl
fb60: 65 6e 3b 0a 09 09 09 70 31 20 3d 20 30 78 30 30  en;....p1 = 0x00
fb70: 3b 0a 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  ;....le = 0x00;.
fb80: 09 09 7d 0a 0a 09 09 74 6d 70 6f 75 74 62 75 66  ..}....tmpoutbuf
fb90: 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b  len = outbuflen;
fba0: 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
fbb0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
fbc0: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
fbd0: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
fbe0: 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  M, GSCIS_INSTR_S
fbf0: 49 47 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20  IGNDECRYPT, p1, 
fc00: 30 78 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73  0x00, bytes_to_s
fc10: 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c  end, tmpbuf, le,
fc20: 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62   &respcode, outb
fc30: 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65  uf, &tmpoutbufle
fc40: 6e 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  n);...if (send_r
fc50: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
fc60: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
fc70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
fc80: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46  ("ADPU Sending F
fc90: 61 69 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e 69  ailed -- returni
fca0: 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a  ng in error.");.
fcb0: 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70  ....if (free_tmp
fcc0: 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28 74  buf) {.....if (t
fcd0: 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09 09  mpbuf_s) {......
fce0: 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a  free(tmpbuf_s);.
fcf0: 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f  ....}....}...../
fd00: 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  * End transactio
fd10: 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65  n */....cackey_e
fd20: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
fd30: 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 72 65  lot);.....if (re
fd40: 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 32  spcode == 0x6982
fd50: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
fd60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63  EBUG_PRINTF("Sec
fd70: 75 72 69 74 79 20 73 74 61 74 75 73 20 6e 6f 74  urity status not
fd80: 20 73 61 74 69 73 69 66 69 65 64 2e 20 20 52 65   satisified.  Re
fd90: 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49  turning NEEDLOGI
fda0: 4e 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  N");......cackey
fdb0: 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
fdc0: 28 73 6c 6f 74 29 3b 0a 09 09 09 09 73 6c 6f 74  (slot);.....slot
fdd0: 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ->token_flags = 
fde0: 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
fdf0: 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ED;......return(
fe00: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
fe10: 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a  EDLOGIN);....}..
fe20: 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
fe30: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
fe40: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a  _TOKENABSENT) {.
fe50: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
fe60: 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61  _PRINTF("Token a
fe70: 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  bsent.  Returnin
fe80: 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b  g TOKENABSENT");
fe90: 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72  ......cackey_mar
fea0: 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
feb0: 74 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 6f  t);.....slot->to
fec0: 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
fed0: 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
fee0: 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
fef0: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
ff00: 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 0a 09 09  BSENT);....}....
ff10: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
ff20: 0a 0a 09 09 74 6d 70 62 75 66 20 2b 3d 20 62 79  ....tmpbuf += by
ff30: 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09 74  tes_to_send;...t
ff40: 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 62 79 74 65  mpbuflen -= byte
ff50: 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75  s_to_send;....ou
ff60: 74 62 75 66 20 2b 3d 20 74 6d 70 6f 75 74 62 75  tbuf += tmpoutbu
ff70: 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 75 66 6c 65  flen;...outbufle
ff80: 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65  n -= tmpoutbufle
ff90: 6e 3b 0a 09 09 72 65 74 76 61 6c 20 2b 3d 20 74  n;...retval += t
ffa0: 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a  mpoutbuflen;..}.
ffb0: 0a 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75  ..if (free_tmpbu
ffc0: 66 29 20 7b 0a 09 09 69 66 20 28 74 6d 70 62 75  f) {...if (tmpbu
ffd0: 66 5f 73 29 20 7b 0a 09 09 09 66 72 65 65 28 74  f_s) {....free(t
ffe0: 6d 70 62 75 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d  mpbuf_s);...}..}
fff0: 0a 0a 09 6f 75 74 62 75 66 20 3d 20 6f 75 74 62  ...outbuf = outb
10000 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74  uf_s;.../* End t
10010 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
10020 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
10030 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69  ction(slot);..#i
10040 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
10050 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
10060 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
10070 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e 20  if (outbuflen > 
10080 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
10090 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
100a0 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62 75  UG_PRINTF("Outbu
100b0 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61 78  flen exceeds max
100c0 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75  imum value, retu
100d0 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
100e0 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 75  . (max = %li, ou
100f0 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c  tbuflen = %lu)",
10100 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
10110 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
10120 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66  ned long) outbuf
10130 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
10140 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66  -1);..}.#  endif
10150 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 55 6e 70  .#endif.../* Unp
10160 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20  ad reply */..if 
10170 28 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a  (unpadOutput) {.
10180 09 09 69 66 20 28 72 65 74 76 61 6c 20 3c 20 33  ..if (retval < 3
10190 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
101a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 70 6c  BUG_PRINTF("Repl
101b0 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  y is too small, 
101c0 77 65 20 61 72 65 20 6e 6f 74 20 61 62 6c 65 20  we are not able 
101d0 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70 61 73 73  to unpad -- pass
101e0 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70  ing back and hop
101f0 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74  ing for the best
10200 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  !");.....CACKEY_
10210 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10220 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
10230 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69  ss, retval = %li
10240 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67   (bytes)", (long
10250 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65  ) retval);....re
10260 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09  turn(retval);...
10270 7d 0a 0a 09 09 69 66 20 28 6f 75 74 62 75 66 5b  }....if (outbuf[
10280 30 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  0] != 0x00) {...
10290 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
102a0 49 4e 54 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a  INTF("Unrecogniz
102b0 65 64 20 70 61 64 64 69 6e 67 20 73 63 68 65 6d  ed padding schem
102c0 65 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63  e -- passing bac
102d0 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72  k and hoping for
102e0 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09   the best!");...
102f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10300 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
10310 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
10320 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
10330 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
10340 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
10350 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c  tval);...}....bl
10360 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74 62 75 66  ocktype = outbuf
10370 5b 31 5d 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73  [1];...unpadoffs
10380 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63  et = 0;....switc
10390 68 20 28 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  h (blocktype) {.
103a0 09 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09  ...case 0x00:...
103b0 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
103c0 65 6d 65 20 31 2c 20 74 68 65 20 66 69 72 73 74  eme 1, the first
103d0 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69   non-zero byte i
103e0 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 64  s the start of d
103f0 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28  ata */.....for (
10400 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b  unpadoffset = 2;
10410 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72   unpadoffset < r
10420 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73  etval; unpadoffs
10430 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20  et++) {......if 
10440 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
10450 73 65 74 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a  set] != 0x00) {.
10460 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10470 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  ..}.....}.....br
10480 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30  eak;....case 0x0
10490 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e  1:...../* Paddin
104a0 67 20 53 63 68 65 6d 65 20 32 2c 20 70 61 64 20  g Scheme 2, pad 
104b0 62 79 74 65 73 20 61 72 65 20 30 78 46 46 20 66  bytes are 0xFF f
104c0 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78 30 30 20  ollowed by 0x00 
104d0 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
104e0 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
104f0 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
10500 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
10510 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
10520 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
10530 20 21 3d 20 30 78 46 46 29 20 7b 0a 09 09 09 09   != 0xFF) {.....
10540 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70  ..if (outbuf[unp
10550 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78 30  adoffset] == 0x0
10560 30 29 20 7b 0a 09 09 09 09 09 09 09 75 6e 70 61  0) {........unpa
10570 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09  doffset++;......
10580 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09  ...break;.......
10590 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09  } else {........
105a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
105b0 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64  NTF("Invalid pad
105c0 64 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c  ding data found,
105d0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
105e0 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61  ilure, should ha
105f0 76 65 20 62 65 65 6e 20 30 78 30 30 20 66 6f 75  ve been 0x00 fou
10600 6e 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73  nd 0x%02x", (uns
10610 69 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75  igned int) outbu
10620 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b  f[unpadoffset]);
10630 0a 0a 09 09 09 09 09 09 09 72 65 74 75 72 6e 28  .........return(
10640 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  -1);.......}....
10650 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
10660 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10670 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61  INTF("Invalid pa
10680 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64  dding data found
10690 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
106a0 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68  ailure, should h
106b0 61 76 65 20 62 65 65 6e 20 30 78 46 46 20 66 6f  ave been 0xFF fo
106c0 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e  und 0x%02x", (un
106d0 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62  signed int) outb
106e0 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29  uf[unpadoffset])
106f0 3b 0a 0a 09 09 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
10700 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  -1);......}.....
10710 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  }.....break;....
10720 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 09 2f  case 0x02:...../
10730 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65  * Padding Scheme
10740 20 33 2c 20 70 61 64 20 62 79 74 65 73 20 61 72   3, pad bytes ar
10750 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74  e non-zero first
10760 20 7a 65 72 6f 20 62 79 74 65 20 66 6f 75 6e 64   zero byte found
10770 20 69 73 20 74 68 65 20 73 65 70 65 72 61 74 6f   is the seperato
10780 72 20 62 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f  r byte */.....fo
10790 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  r (unpadoffset =
107a0 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20   2; unpadoffset 
107b0 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f  < retval; unpado
107c0 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09  ffset++) {......
107d0 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
107e0 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29  offset] == 0x00)
107f0 20 7b 0a 09 09 09 09 09 09 75 6e 70 61 64 6f 66   {.......unpadof
10800 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62  fset++;........b
10810 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  reak;......}....
10820 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
10830 7d 0a 0a 09 09 69 66 20 28 75 6e 70 61 64 6f 66  }....if (unpadof
10840 66 73 65 74 20 3e 20 72 65 74 76 61 6c 29 20 7b  fset > retval) {
10850 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10860 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20  _PRINTF("Offset 
10870 67 72 65 61 74 65 72 20 74 68 61 6e 20 72 65 70  greater than rep
10880 6c 79 20 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e  ly size, abortin
10890 67 2e 20 20 28 75 6e 70 61 64 6f 66 66 73 65 74  g.  (unpadoffset
108a0 20 3d 20 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d   = %lu, retval =
108b0 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
108c0 64 20 6c 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66  d long) unpadoff
108d0 73 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  set, (unsigned l
108e0 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  ong) retval);...
108f0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
10900 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
10910 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64  G_PRINTBUF("Padd
10920 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65  ed:", outbuf, re
10930 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c  tval);....retval
10940 20 2d 3d 20 75 6e 70 61 64 6f 66 66 73 65 74 3b   -= unpadoffset;
10950 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75  ...memmove(outbu
10960 66 2c 20 6f 75 74 62 75 66 20 2b 20 75 6e 70 61  f, outbuf + unpa
10970 64 6f 66 66 73 65 74 2c 20 72 65 74 76 61 6c 29  doffset, retval)
10980 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
10990 47 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61  G_PRINTBUF("Unpa
109a0 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20  dded:", outbuf, 
109b0 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43  retval);..}....C
109c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
109d0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
109e0 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c   success, retval
109f0 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c   = %li (bytes)",
10a00 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b   (long) retval);
10a10 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
10a20 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
10a30 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
10a40 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
10a50 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
10a60 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
10a70 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
10a80 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
10a90 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
10aa0 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
10ab0 6c 6f 67 69 6e 28 73 74 72 75 63 74 20 63 61 63  login(struct cac
10ac0 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
10ad0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
10ae0 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  in, unsigned lon
10af0 67 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a  g pin_len, int *
10b00 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
10b10 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  p) {..unsigned c
10b20 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d  har cac_pin[8] =
10b30 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78   {0xFF, 0xFF, 0x
10b40 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
10b50 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
10b60 7d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73  };..uint16_t res
10b70 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74  ponse_code;..int
10b80 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
10b90 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
10ba0 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74  .../* Indicate t
10bb0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  hat we do not kn
10bc0 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e  ow about how man
10bd0 79 20 74 72 69 65 73 20 61 72 65 20 72 65 6d 61  y tries are rema
10be0 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72  ining */..if (tr
10bf0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
10c00 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61   {...*tries_rema
10c10 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d  ining_p = -1;..}
10c20 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79  .../* Apparently
10c30 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a  , CAC PINs are *
10c40 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73  EXACTLY* 8 bytes
10c50 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74   long -- pad wit
10c60 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68  h 0xFF if too sh
10c70 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f  ort */..if (pin_
10c80 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65  len >= 8) {...me
10c90 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69  mcpy(cac_pin, pi
10ca0 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  n, 8);..} else {
10cb0 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69  ...memcpy(cac_pi
10cc0 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29  n, pin, pin_len)
10cd0 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20  ;..}.../* Issue 
10ce0 50 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73  PIN Verify */..s
10cf0 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
10d00 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
10d10 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
10d20 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
10d30 52 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20  R_VERIFY, 0x00, 
10d40 30 78 30 30 2c 20 73 69 7a 65 6f 66 28 63 61 63  0x00, sizeof(cac
10d50 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20  _pin), cac_pin, 
10d60 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f  0x00, &response_
10d70 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  code, NULL, NULL
10d80 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  );..if (send_ret
10d90 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
10da0 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72  S_OK) {...if ((r
10db0 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30  esponse_code & 0
10dc0 78 36 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30  x63C0) == 0x63C0
10dd0 29 20 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d  ) {....tries_rem
10de0 61 69 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e  aining = (respon
10df0 73 65 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a  se_code & 0xF);.
10e00 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10e10 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72  _PRINTF("PIN Ver
10e20 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64  ification failed
10e30 2c 20 25 69 20 74 72 69 65 73 20 72 65 6d 61 69  , %i tries remai
10e40 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d  ning", tries_rem
10e50 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20  aining);.....if 
10e60 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  (tries_remaining
10e70 5f 70 29 20 7b 0a 09 09 09 09 2a 74 72 69 65 73  _p) {.....*tries
10e80 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74  _remaining_p = t
10e90 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
10ea0 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28  ...}.....return(
10eb0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
10ec0 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  DPIN);...}....if
10ed0 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20   (response_code 
10ee0 3d 3d 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09  == 0x6983) {....
10ef0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10f00 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63  NTF("PIN Verific
10f10 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65  ation failed, de
10f20 76 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 22 29  vice is locked")
10f30 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
10f40 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45  KEY_PCSC_E_LOCKE
10f50 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  D);...}....retur
10f60 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
10f70 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
10f80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10f90 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
10fa0 74 69 6f 6e 20 73 75 63 63 65 65 64 65 64 22 29  tion succeeded")
10fb0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
10fc0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
10fd0 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
10fe0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
10ff0 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
11000 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
11010 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
11020 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
11030 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
11040 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
11050 72 65 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  ret cackey_token
11060 5f 70 72 65 73 65 6e 74 28 73 74 72 75 63 74 20  _present(struct 
11070 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
11080 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74  t) {..cackey_ret
11090 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
110a0 74 3b 0a 09 44 57 4f 52 44 20 72 65 61 64 65 72  t;..DWORD reader
110b0 5f 6c 65 6e 2c 20 73 74 61 74 65 2c 20 70 72 6f  _len, state, pro
110c0 74 6f 63 6f 6c 2c 20 61 74 72 5f 6c 65 6e 3b 0a  tocol, atr_len;.
110d0 09 42 59 54 45 20 61 74 72 5b 4d 41 58 5f 41 54  .BYTE atr[MAX_AT
110e0 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73  R_SIZE];..LONG s
110f0 74 61 74 75 73 5f 72 65 74 2c 20 73 63 61 72 64  tatus_ret, scard
11100 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43  _reconn_ret;...C
11110 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11120 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
11130 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72  .if (slot->inter
11140 6e 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  nal) {...CACKEY_
11150 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
11160 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72  turning token pr
11170 65 73 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20  esent (internal 
11180 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74  token)");....ret
11190 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
111a0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b  S_TOKENPRESENT);
111b0 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  ..}...pcsc_conne
111c0 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
111d0 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
111e0 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  t);..if (pcsc_co
111f0 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
11200 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
11210 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11220 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
11230 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
11240 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  d, returning tok
11250 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
11260 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
11270 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
11280 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c 65 6e 20  );..}...atr_len 
11290 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09  = sizeof(atr);..
112a0 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61  status_ret = SCa
112b0 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70  rdStatus(slot->p
112c0 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20  csc_card, NULL, 
112d0 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74  &reader_len, &st
112e0 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20  ate, &protocol, 
112f0 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a  atr, &atr_len);.
11300 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74  ..if (status_ret
11310 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e 56 41   == SCARD_E_INVA
11320 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09  LID_HANDLE) {...
11330 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11340 4e 54 46 28 22 53 43 61 72 64 53 74 61 74 75 73  NTF("SCardStatus
11350 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
11360 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44  D_E_INVALID_HAND
11370 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 69 73 20 6e  LE, marking is n
11380 6f 74 20 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65  ot already conne
11390 63 74 65 64 20 61 6e 64 20 74 72 79 69 6e 67 20  cted and trying 
113a0 61 67 61 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65  again");...cacke
113b0 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
113c0 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63  t(slot);....pcsc
113d0 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
113e0 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
113f0 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28  rd(slot);...if (
11400 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
11410 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
11420 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
11430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11440 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
11450 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
11460 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
11470 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t");.....return(
11480 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
11490 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a  KENABSENT);...}.
114a0 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a  ...atr_len = siz
114b0 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74  eof(atr);...stat
114c0 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
114d0 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
114e0 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
114f0 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
11500 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
11510 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a   &atr_len);..}..
11520 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
11530 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
11540 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  SS) {...cackey_m
11550 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
11560 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61  lot);....if (sta
11570 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  tus_ret == SCARD
11580 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b  _W_RESET_CARD) {
11590 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
115a0 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72  _PRINTF("Reset r
115b0 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20  equired, please 
115c0 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  hold...");.....s
115d0 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
115e0 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  = cackey_reconne
115f0 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43  ct_card(slot, SC
11600 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
11610 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
11620 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  _T1, &protocol);
11630 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65  ....if (scard_re
11640 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
11650 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
11660 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f  .../* Update pro
11670 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f  tocol */.....slo
11680 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72  t->protocol = pr
11690 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20  otocol;....../* 
116a0 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
116b0 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
116c0 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
116d0 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
116e0 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
116f0 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
11700 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
11710 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  th--;......slot-
11720 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
11730 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09  d_hw_lock = 1;..
11740 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  ....cackey_begin
11750 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
11760 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  t);.....}......C
11770 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11780 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73  TF("Reset succes
11790 73 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67  sful, requerying
117a0 22 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72  ");.....status_r
117b0 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
117c0 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
117d0 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
117e0 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
117f0 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
11800 72 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28  r_len);.....if (
11810 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43  status_ret != SC
11820 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
11830 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
11840 55 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c  UG_PRINTF("Still
11850 20 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79   unable to query
11860 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65   card status, re
11870 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
11880 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74  sent.  SCardStat
11890 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b  us() = %s", CACK
118a0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
118b0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74  ARDERR_TO_STR(st
118c0 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09  atus_ret));.....
118d0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
118e0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
118f0 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  NT);.....}....} 
11900 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
11910 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11920 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e  Unable to reconn
11930 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
11940 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
11950 65 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e  ent.  SCardRecon
11960 6e 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41  nect() = %s", CA
11970 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
11980 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
11990 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
119a0 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ));......return(
119b0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
119c0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d  KENABSENT);....}
119d0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
119e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
119f0 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75  TF("Unable to qu
11a00 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c  ery card status,
11a10 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
11a20 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53   absent.  SCardS
11a30 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43  tatus() = %s", C
11a40 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
11a50 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
11a60 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a  (status_ret));..
11a70 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
11a80 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
11a90 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ENT);...}..}...i
11aa0 66 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52  f ((state & SCAR
11ab0 44 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41  D_ABSENT) == SCA
11ac0 52 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43  RD_ABSENT) {...C
11ad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11ae0 54 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65  TF("Card is abse
11af0 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  nt, returning to
11b00 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09  ken absent");...
11b10 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
11b20 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
11b30 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  T);..}...CACKEY_
11b40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
11b50 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72  turning token pr
11b60 65 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75  esent.");...retu
11b70 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
11b80 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a  _TOKENPRESENT);.
11b90 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
11ba0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
11bb0 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
11bc0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
11bd0 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
11be0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
11bf0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
11c00 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
11c10 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  _t cackey_pcsc_i
11c20 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c  dentity_to_label
11c30 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
11c40 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  csc_identity *id
11c50 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
11c60 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66   char *label_buf
11c70 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
11c80 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b  label_buf_len) {
11c90 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
11ca0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
11cb0 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73  ..void *label_as
11cc0 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69  n1;..void *certi
11cd0 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30  ficate;..int x50
11ce0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65  9_read_ret;...ce
11cf0 72 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e  rtificate = iden
11d00 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
11d10 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f  e;..certificate_
11d20 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  len = identity->
11d30 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
11d40 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
11d50 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  te_len < 0) {...
11d60 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
11d70 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
11d80 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
11d90 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
11da0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28  rtificate_len, (
11db0 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f  void **) &label_
11dc0 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39  asn1);..if (x509
11dd0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
11de0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11df0 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65  }...x509_read_re
11e00 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73  t = x509_dn_to_s
11e10 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31  tring(label_asn1
11e20 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c  , x509_read_ret,
11e30 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f   (char *) label_
11e40 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  buf, label_buf_l
11e50 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28  en, "CN");..if (
11e60 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d  x509_read_ret <=
11e70 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61   0) {...x509_rea
11e80 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f  d_ret = x509_dn_
11e90 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f  to_string(label_
11ea0 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  asn1, x509_read_
11eb0 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61  ret, (char *) la
11ec0 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62  bel_buf, label_b
11ed0 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a  uf_len, NULL);..
11ee0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
11ef0 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72  ret <= 0) {....r
11f00 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
11f10 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
11f20 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
11f30 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
11f40 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65  MAX..if (x509_re
11f50 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f  ad_ret > _POSIX_
11f60 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
11f70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11f80 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65  TF("x509_read_re
11f90 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75  t exceeds maximu
11fa0 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69  m value, returni
11fb0 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28  ng in failure. (
11fc0 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f  max = %li, x509_
11fd0 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22  read_ret = %lu)"
11fe0 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
11ff0 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
12000 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f  gned long) x509_
12010 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65  read_ret);....re
12020 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
12030 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72  endif.#endif...r
12040 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f  eturn(x509_read_
12050 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  ret);.}../* Retu
12060 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
12070 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
12080 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61  ackey_mutex_crea
12090 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29  te(void **mutex)
120a0 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
120b0 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
120c0 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
120d0 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
120e0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
120f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12100 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
12110 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
12120 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
12130 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
12140 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
12150 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
12160 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28  _mutex = malloc(
12170 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f  sizeof(*pthread_
12180 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21  mutex));...if (!
12190 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b  pthread_mutex) {
121a0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
121b0 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
121c0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
121d0 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ry.");.....retur
121e0 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74  n(-1);...}....pt
121f0 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
12200 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
12210 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c  t(pthread_mutex,
12220 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74   NULL);...if (pt
12230 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
12240 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
12250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
12260 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28  read_mutex_init(
12270 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
12280 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
12290 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
122a0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
122b0 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61  .*mutex = pthrea
122c0 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65  d_mutex;..} else
122d0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
122e0 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
122f0 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
12300 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
12310 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d  gs.CreateMutex(m
12320 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
12330 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
12340 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
12350 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12360 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43  F("cackey_args.C
12370 72 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74  reateMutex() ret
12380 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69  urned error (%li
12390 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74  ).", (long) cust
123a0 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  om_retval);.....
123b0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
123c0 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  }...}..}...CACKE
123d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
123e0 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73  Returning sucess
123f0 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72  fully (0)");...r
12400 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
12410 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
12420 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
12430 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
12440 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78  lock(void *mutex
12450 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
12460 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
12470 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
12480 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
12490 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
124a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
124b0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
124c0 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
124d0 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
124e0 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
124f0 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
12500 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
12510 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b  d_mutex = mutex;
12520 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
12530 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
12540 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f  ex_lock(pthread_
12550 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74  mutex);...if (pt
12560 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
12570 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
12580 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
12590 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
125a0 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
125b0 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
125c0 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
125d0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
125e0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
125f0 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
12600 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
12610 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
12620 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28  _args.LockMutex(
12630 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
12640 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
12650 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
12660 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12670 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
12680 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75  LockMutex() retu
12690 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
126a0 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
126b0 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
126c0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
126d0 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
126e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
126f0 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
12700 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
12710 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
12720 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
12730 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
12740 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  t cackey_mutex_u
12750 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65  nlock(void *mute
12760 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  x) {..pthread_mu
12770 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d  tex_t *pthread_m
12780 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65  utex;..int pthre
12790 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ad_retval;..CK_R
127a0 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b  V custom_retval;
127b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
127c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
127d0 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79  );...if ((cackey
127e0 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b  _args.flags & CK
127f0 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
12800 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49   == CKF_OS_LOCKI
12810 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65  NG_OK) {...pthre
12820 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78  ad_mutex = mutex
12830 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  ;....pthread_ret
12840 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
12850 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65  tex_unlock(pthre
12860 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20  ad_mutex);...if 
12870 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  (pthread_retval 
12880 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
12890 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
128a0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
128b0 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20  lock() returned 
128c0 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
128d0 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
128e0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
128f0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
12900 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  f (cackey_args.U
12910 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09  nlockMutex) {...
12920 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d  .custom_retval =
12930 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c   cackey_args.Unl
12940 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ockMutex(mutex);
12950 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
12960 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
12970 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
12980 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
12990 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
129a0 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20  utex() returned 
129b0 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28  error (%li).", (
129c0 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74  long) custom_ret
129d0 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  val);......retur
129e0 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  n(-1);....}...}.
129f0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
12a00 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
12a10 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20  ing sucessfully 
12a20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  (0)");...return(
12a30 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b  0);.}..static CK
12a40 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63  _ATTRIBUTE_PTR c
12a50 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
12a60 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  utes(CK_OBJECT_C
12a70 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73  LASS objectclass
12a80 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  , struct cackey_
12a90 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69  pcsc_identity *i
12aa0 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
12ab0 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f  d long identity_
12ac0 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  num, CK_ULONG_PT
12ad0 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73  R pulCount) {..s
12ae0 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63  tatic CK_BBOOL c
12af0 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61  k_true = 1;..sta
12b00 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f  tic CK_BBOOL ck_
12b10 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74  false = 0;..stat
12b20 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74  ic CK_TRUST ck_t
12b30 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53  rusted = CK_TRUS
12b40 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09  TED_DELEGATOR;..
12b50 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72  CK_ULONG numattr
12b60 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f  s = 0, retval_co
12b70 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  unt;..CK_ATTRIBU
12b80 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74  TE_TYPE curr_att
12b90 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52  r_type;..CK_ATTR
12ba0 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c  IBUTE curr_attr,
12bb0 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f   *retval;..CK_VO
12bc0 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
12bd0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
12be0 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f  Len;..CK_OBJECT_
12bf0 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f  CLASS ck_object_
12c00 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49  class;..CK_CERTI
12c10 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63  FICATE_TYPE ck_c
12c20 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
12c30 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b  ..CK_KEY_TYPE ck
12c40 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55  _key_type;..CK_U
12c50 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66  TF8CHAR ucTmpBuf
12c60 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e  [1024];..SHA1Con
12c70 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09  text sha1_ctx;..
12c80 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b  MD5_CTX md5_ctx;
12c90 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68  ..uint8_t sha1_h
12ca0 61 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65  ash[SHA1HashSize
12cb0 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f  ];..uint8_t md5_
12cc0 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65  hash[MD5HashSize
12cd0 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ];..unsigned cha
12ce0 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a  r *certificate;.
12cf0 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69  .ssize_t certifi
12d00 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78  cate_len = -1, x
12d10 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69  509_read_ret;..i
12d20 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a  nt pValue_free;.
12d30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12d40 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f  RINTF("Called (o
12d50 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75  bjectClass = %lu
12d60 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d  , identity_num =
12d70 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
12d80 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63  ed long) objectc
12d90 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e  lass, identity_n
12da0 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  um);...*pulCount
12db0 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65   = 0;...if (obje
12dc0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
12dd0 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62  ERTIFICATE && ob
12de0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
12df0 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f  _PUBLIC_KEY && o
12e00 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
12e10 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26  O_PRIVATE_KEY &&
12e20 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
12e30 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
12e40 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ST) {...CACKEY_D
12e50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
12e60 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
12e70 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
12e80 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b   object class");
12e90 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
12ea0 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65  ;..}.../* Get Ce
12eb0 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74  rt */..if (ident
12ec0 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
12ed0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12ee0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
12ef0 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
12f00 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69  , invalid identi
12f10 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09  y provided");...
12f20 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
12f30 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20  }...certificate 
12f40 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
12f50 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66  ificate;..certif
12f60 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e  icate_len = iden
12f70 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
12f80 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72  e_len;...if (cer
12f90 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20  tificate_len == 
12fa0 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74  -1 || certificat
12fb0 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
12fc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12fd0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
12fe0 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
12ff0 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f  this identity do
13000 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58  es not have an X
13010 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
13020 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13030 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74   it and will not
13040 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75   work");....retu
13050 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
13060 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65  * Verify that ce
13070 72 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e  rtificate is ASN
13080 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39  .1 encoded X.509
13090 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
130a0 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72  .if (x509_to_ser
130b0 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c  ial(certificate,
130c0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
130d0 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09  , NULL) < 0) {..
130e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
130f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
13100 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
13110 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74  , the X.509 cert
13120 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
13130 65 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65  ed with this ide
13140 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c  ntity is not val
13150 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  id");....return(
13160 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76  NULL);..}...retv
13170 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09  al_count = 64;..
13180 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28  retval = malloc(
13190 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
131a0 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
131b0 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
131c0 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72  r_type = 0; curr
131d0 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63  _attr_type < 0xc
131e0 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74  e5363bf; curr_at
131f0 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69  tr_type++) {...i
13200 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  f (curr_attr_typ
13210 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09  e == 0x800) {...
13220 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  .curr_attr_type 
13230 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09  = 0xce536300;...
13240 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65  }....pValue_free
13250 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d   = 0;...pValue =
13260 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65   NULL;...ulValue
13270 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
13280 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  -1;....switch (c
13290 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b  urr_attr_type) {
132a0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  ....case CKA_CLA
132b0 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SS:.....CACKEY_D
132c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
132d0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
132e0 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25  e CKA_CLASS (0x%
132f0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
13300 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
13310 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
13320 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  ..ck_object_clas
13330 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b  s = objectclass;
13340 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
13350 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b  ck_object_class;
13360 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
13370 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65  = sizeof(ck_obje
13380 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09  ct_class);......
13390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
133a0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
133b0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
133c0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
133d0 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f  g) *((CK_OBJECT_
133e0 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29  CLASS *) pValue)
133f0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
13400 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
13410 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13420 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
13430 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  OKEN:.....CACKEY
13440 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13450 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
13460 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30  ute CKA_TOKEN (0
13470 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13480 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
13490 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
134a0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
134b0 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _true;.....ulVal
134c0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
134d0 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41  k_true);......CA
134e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
134f0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
13500 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
13510 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13520 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
13530 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
13540 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13550 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
13560 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
13570 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09  e CKA_PRIVATE:..
13580 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13590 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
135a0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
135b0 5f 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c  _PRIVATE (0x%08l
135c0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
135d0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
135e0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
135f0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
13600 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
13610 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
13620 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13630 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
13640 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
13650 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e  e we are not a N
13660 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
13670 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
13680 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
13690 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
136a0 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
136b0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
136c0 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
136d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
136e0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
136f0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
13700 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
13710 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
13720 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
13730 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
13740 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
13750 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
13760 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09  CKA_TRUSTED:....
13770 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13780 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
13790 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
137a0 52 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29  RUSTED (0x%08lx)
137b0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
137c0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
137d0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
137e0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
137f0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
13800 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
13810 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13820 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
13830 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
13840 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
13850 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
13860 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
13870 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65  ...}......pValue
13880 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
13890 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
138a0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
138b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
138c0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
138d0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
138e0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
138f0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
13900 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
13910 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
13920 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
13930 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
13940 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49  ...case CKA_MODI
13950 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b  FIABLE:.....CACK
13960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13970 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
13980 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49  ibute CKA_MODIFI
13990 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ABLE (0x%08lx) .
139a0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
139b0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
139c0 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
139d0 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
139e0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
139f0 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
13a00 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
13a10 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
13a20 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
13a30 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
13a40 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
13a50 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
13a60 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
13a70 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
13a80 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13a90 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c  k;....case CKA_L
13aa0 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABEL:.....CACKEY
13ab0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13ac0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
13ad0 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30  ute CKA_LABEL (0
13ae0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13af0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
13b00 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
13b10 09 09 09 09 2f 2a 20 58 58 58 3a 20 44 65 74 65  ..../* XXX: Dete
13b20 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09  rmine name */...
13b30 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
13b40 6e 70 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29  nprintf((char *)
13b50 20 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f   ucTmpBuf, sizeo
13b60 66 28 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64  f(ucTmpBuf), "Id
13b70 65 6e 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75  entity #%lu", (u
13b80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
13b90 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09  entity_num);....
13ba0 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42  .pValue = ucTmpB
13bb0 75 66 3b 0a 0a 09 09 09 09 69 66 20 28 75 6c 56  uf;......if (ulV
13bc0 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f  alueLen >= sizeo
13bd0 66 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09  f(ucTmpBuf)) {..
13be0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
13bf0 20 30 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20   0;......pValue 
13c00 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09  = NULL;.....}...
13c10 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13c20 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
13c30 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22  urning (%p/%lu)"
13c40 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
13c50 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
13c60 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13c70 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56  k;....case CKA_V
13c80 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ALUE:.....CACKEY
13c90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13ca0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
13cb0 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30  ute CKA_VALUE (0
13cc0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13cd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
13ce0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
13cf0 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65  ....switch (obje
13d00 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09  ctclass) {......
13d10 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45  case CKO_PRIVATE
13d20 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b  _KEY:.......CACK
13d30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13d40 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
13d50 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
13d60 20 77 65 20 61 72 65 20 61 20 70 72 69 76 61 74   we are a privat
13d70 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09  e key.");.......
13d80 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
13d90 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  e CKO_NETSCAPE_T
13da0 52 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b  RUST:.......CACK
13db0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13dc0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
13dd0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
13de0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
13df0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
13e00 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  );........break;
13e10 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50  ......case CKO_P
13e20 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09  UBLIC_KEY:......
13e30 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
13e40 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
13e50 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
13e60 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b  t = x509_to_pubk
13e70 65 79 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  ey(certificate, 
13e80 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
13e90 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
13ea0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
13eb0 72 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 09  ret < 0) { .....
13ec0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
13ed0 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65  L;........} else
13ee0 20 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61 6c   {.........ulVal
13ef0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
13f00 64 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a  d_ret;........}.
13f10 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 62  ......}........b
13f20 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
13f30 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a  CKO_CERTIFICATE:
13f40 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
13f50 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09  certificate;....
13f60 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
13f70 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
13f80 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
13f90 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
13fa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
13fb0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
13fc0 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
13fd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
13fe0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
13ff0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14000 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09  CKA_ISSUER:.....
14010 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14020 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
14030 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53  attribute CKA_IS
14040 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e  SUER (0x%08lx) .
14050 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
14060 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
14070 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
14080 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
14090 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26  O_CERTIFICATE &&
140a0 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
140b0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
140c0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
140d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
140e0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
140f0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
14100 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
14110 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73  tificate or Nets
14120 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
14130 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
14140 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
14150 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
14160 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
14170 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
14180 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72  09_to_issuer(cer
14190 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
141a0 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
141b0 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
141c0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
141d0 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
141e0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
141f0 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
14200 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
14210 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
14220 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
14230 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
14240 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
14250 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
14260 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
14270 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
14280 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14290 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45  CKA_SERIAL_NUMBE
142a0 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
142b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
142c0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
142d0 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
142e0 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ER (0x%08lx) ...
142f0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
14300 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
14310 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
14320 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
14330 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f  CERTIFICATE && o
14340 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
14350 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
14360 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
14370 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
14380 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
14390 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
143a0 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
143b0 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61  ficate or Netsca
143c0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
143d0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
143e0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
143f0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
14400 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
14410 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
14420 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69  _to_serial(certi
14430 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
14440 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
14450 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
14460 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
14470 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
14480 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
14490 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
144a0 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
144b0 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
144c0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
144d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
144e0 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
144f0 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
14500 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
14510 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
14520 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14530 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09  CKA_SUBJECT:....
14540 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14550 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
14560 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
14570 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29  UBJECT (0x%08lx)
14580 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
14590 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
145a0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
145b0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
145c0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29  CKO_CERTIFICATE)
145d0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
145e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
145f0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
14600 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
14610 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
14620 69 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 62  icate");.......b
14630 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
14640 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
14650 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
14660 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
14670 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63  = x509_to_subjec
14680 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  t(certificate, c
14690 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
146a0 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
146b0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
146c0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
146d0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
146e0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
146f0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
14700 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
14710 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
14720 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14730 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
14740 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
14750 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
14760 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
14770 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
14780 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09  case CKA_ID:....
14790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
147a0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
147b0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49   attribute CKA_I
147c0 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  D (0x%08lx) ..."
147d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
147e0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
147f0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
14800 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
14810 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
14820 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14830 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
14840 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
14850 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
14860 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
14870 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
14880 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
14890 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d  .....ucTmpBuf[0]
148a0 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75   = ((identity_nu
148b0 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30  m + 1) >> 8) & 0
148c0 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75  xff;.....ucTmpBu
148d0 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74  f[1] =  (identit
148e0 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66  y_num + 1) & 0xf
148f0 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  f;......pValue =
14900 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09   &ucTmpBuf;.....
14910 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a  ulValueLen = 2;.
14920 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14930 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
14940 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
14950 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
14960 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
14970 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
14980 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43  k;....case CKA_C
14990 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
149a0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
149b0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
149c0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
149d0 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  KA_CERTIFICATE_T
149e0 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPE (0x%08lx) ..
149f0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
14a00 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
14a10 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
14a20 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
14a30 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
14a40 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14a50 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
14a60 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
14a70 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
14a80 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
14a90 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  te.");.......bre
14aa0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
14ab0 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
14ac0 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74  t one certificat
14ad0 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b  e type */.....ck
14ae0 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
14af0 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a  e = CKC_X_509;..
14b00 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
14b10 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
14b20 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
14b30 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65  n = sizeof(ck_ce
14b40 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b  rtificate_type);
14b50 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14b60 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
14b70 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f  returning CKC_X_
14b80 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c  509 (%lu) (%p/%l
14b90 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
14ba0 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49  ong) *((CK_CERTI
14bb0 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70  FICATE_TYPE *) p
14bc0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
14bd0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14be0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
14bf0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
14c00 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09   CKA_KEY_TYPE:..
14c10 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14c20 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
14c30 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
14c40 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 38  _KEY_TYPE (0x%08
14c50 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
14c60 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
14c70 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
14c80 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
14c90 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  != CKO_PRIVATE_K
14ca0 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
14cb0 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  s != CKO_PUBLIC_
14cc0 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  KEY) {......CACK
14cd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14ce0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
14cf0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
14d00 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65   we are not a ke
14d10 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  y.");.......brea
14d20 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
14d30 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
14d40 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f   one key type */
14d50 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65  .....ck_key_type
14d60 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09   = CKK_RSA;.....
14d70 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65  .pValue = &ck_ke
14d80 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61  y_type;.....ulVa
14d90 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
14da0 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09  ck_key_type);...
14db0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14dc0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
14dd0 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28  urning CKK_RSA (
14de0 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20  %lu) (%p/%lu)", 
14df0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14e00 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54  *((CK_CERTIFICAT
14e10 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65  E_TYPE *) pValue
14e20 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
14e30 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
14e40 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
14e50 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
14e60 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  SIGN:.....CACKEY
14e70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14e80 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
14e90 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78  ute CKA_SIGN (0x
14ea0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
14eb0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
14ec0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
14ed0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
14ee0 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
14ef0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
14f00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14f10 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
14f20 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
14f30 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
14f40 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
14f50 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
14f60 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
14f70 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
14f80 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
14f90 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
14fa0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
14fb0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
14fc0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
14fd0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
14fe0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
14ff0 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
15000 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
15010 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
15020 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15030 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
15040 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
15050 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
15060 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
15070 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
15080 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
15090 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
150a0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
150b0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49  ;....case CKA_SI
150c0 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09  GN_RECOVER:.....
150d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
150e0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
150f0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49  attribute CKA_SI
15100 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30  GN_RECOVER (0x%0
15110 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
15120 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
15130 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
15140 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
15150 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
15160 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
15170 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15180 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
15190 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
151a0 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
151b0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
151c0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
151d0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
151e0 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   We currently on
151f0 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69 67 6e  ly support "Sign
15200 20 77 69 74 68 20 41 70 70 65 6e 64 69 78 22 20   with Appendix" 
15210 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  */.....pValue = 
15220 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75  &ck_false;.....u
15230 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
15240 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09  of(ck_false);...
15250 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15260 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
15270 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
15280 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
15290 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
152a0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
152b0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
152c0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
152d0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
152e0 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59  ..case CKA_DECRY
152f0 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PT:.....CACKEY_D
15300 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
15310 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
15320 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30  e CKA_DECRYPT (0
15330 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
15340 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
15350 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
15360 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
15370 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
15380 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
15390 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
153a0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
153b0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
153c0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
153d0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
153e0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
153f0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
15400 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
15410 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
15420 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61  KEY || objectcla
15430 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss == CKO_PUBLIC
15440 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61  _KEY) {......pVa
15450 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
15460 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
15470 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
15480 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
15490 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
154a0 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c  k_false;......ul
154b0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
154c0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09  f(ck_false);....
154d0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
154e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
154f0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
15500 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
15510 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
15520 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
15530 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
15540 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
15550 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
15560 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
15570 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 43  SENSITIVE:.....C
15580 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15590 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
155a0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 4e  ttribute CKA_SEN
155b0 53 49 54 49 56 45 20 28 30 78 25 30 38 6c 78 29  SITIVE (0x%08lx)
155c0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
155d0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
155e0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
155f0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15600 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
15610 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
15620 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15630 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
15640 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
15650 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
15660 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
15670 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
15680 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62  ...}......if (ob
15690 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
156a0 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a  _PRIVATE_KEY) {.
156b0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
156c0 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56  k_true;......ulV
156d0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
156e0 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d  (ck_true);.....}
156f0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61   else {......pVa
15700 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
15710 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
15720 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
15730 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
15740 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15750 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
15760 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
15770 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15780 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
15790 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
157a0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
157b0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
157c0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
157d0 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41  ase CKA_EXTRACTA
157e0 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BLE:.....CACKEY_
157f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15800 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
15810 74 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42  te CKA_EXTRACTAB
15820 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  LE (0x%08lx) ...
15830 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15840 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
15850 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
15860 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
15870 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
15880 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
15890 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
158a0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
158b0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
158c0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
158d0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
158e0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
158f0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
15900 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
15910 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09  VATE_KEY) {.....
15920 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
15930 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
15940 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
15950 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
15960 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
15970 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
15980 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
15990 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
159a0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
159b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
159c0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
159d0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
159e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
159f0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
15a00 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
15a10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
15a20 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
15a30 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
15a40 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09  CKA_MODULUS:....
15a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15a60 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
15a70 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d   attribute CKA_M
15a80 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29  ODULUS (0x%08lx)
15a90 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
15aa0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
15ab0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
15ac0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15ad0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
15ae0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
15af0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15b00 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
15b10 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
15b20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
15b30 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
15b40 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
15b50 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
15b60 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
15b70 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
15b80 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
15b90 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69  to_modulus(certi
15ba0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
15bb0 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
15bc0 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
15bd0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
15be0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
15bf0 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
15c00 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
15c10 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
15c20 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
15c30 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
15c40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
15c50 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
15c60 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
15c70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
15c80 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
15c90 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
15ca0 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
15cb0 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ENT:.....CACKEY_
15cc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15cd0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
15ce0 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58  te CKA_PUBLIC_EX
15cf0 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29  PONENT (0x%08lx)
15d00 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
15d10 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
15d20 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
15d30 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15d40 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
15d50 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
15d60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15d70 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
15d80 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
15d90 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
15da0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
15db0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
15dc0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
15dd0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
15de0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
15df0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
15e00 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74  to_exponent(cert
15e10 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
15e20 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
15e30 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
15e40 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
15e50 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
15e60 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
15e70 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
15e80 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
15e90 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
15ea0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
15eb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
15ec0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
15ed0 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
15ee0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15ef0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
15f00 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
15f10 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54   CKA_TRUST_DIGIT
15f20 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09  AL_SIGNATURE:...
15f30 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
15f40 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a  NON_REPUDIATION:
15f50 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
15f60 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d  ST_KEY_ENCIPHERM
15f70 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ENT:....case CKA
15f80 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49  _TRUST_DATA_ENCI
15f90 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73  PHERMENT:....cas
15fa0 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f  e CKA_TRUST_KEY_
15fb0 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61  AGREEMENT:....ca
15fc0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59  se CKA_TRUST_KEY
15fd0 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63  _CERT_SIGN:....c
15fe0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52  ase CKA_TRUST_CR
15ff0 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20  L_SIGN:....case 
16000 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52  CKA_TRUST_SERVER
16010 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43  _AUTH:....case C
16020 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f  KA_TRUST_CLIENT_
16030 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b  AUTH:....case CK
16040 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
16050 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 4b  NING:....case CK
16060 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52  A_TRUST_EMAIL_PR
16070 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41  OTECTION:.....CA
16080 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16090 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
160a0 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53  tribute CKA_TRUS
160b0 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 20  T_... (0x%08lx) 
160c0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
160d0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
160e0 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
160f0 75 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 64  ue = &ck_trusted
16100 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
16110 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
16120 73 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b  sted);......CACK
16130 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16140 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
16150 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
16160 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
16170 28 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 56  ((CK_TRUST *) pV
16180 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
16190 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
161a0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
161b0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
161c0 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41  CKA_CERT_SHA1_HA
161d0 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SH:.....CACKEY_D
161e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
161f0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
16200 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f  e CKA_CERT_SHA1_
16210 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e  HASH (0x%08lx) .
16220 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
16230 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
16240 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
16250 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
16260 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
16270 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
16280 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
16290 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
162a0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
162b0 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63   are not a Netsc
162c0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
162d0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
162e0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 31  .....}......SHA1
162f0 52 65 73 65 74 28 26 73 68 61 31 5f 63 74 78 29  Reset(&sha1_ctx)
16300 3b 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74 28  ;.....SHA1Input(
16310 26 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74 69  &sha1_ctx, certi
16320 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
16330 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48  ate_len);.....SH
16340 41 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f 63  A1Result(&sha1_c
16350 74 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b 0a  tx, sha1_hash);.
16360 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73 68  .....pValue = sh
16370 61 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56  a1_hash;.....ulV
16380 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
16390 28 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09  (sha1_hash);....
163a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
163b0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
163c0 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
163d0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
163e0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
163f0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
16400 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54  ...case CKA_CERT
16410 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 43  _MD5_HASH:.....C
16420 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16430 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
16440 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
16450 54 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25 30  T_MD5_HASH (0x%0
16460 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
16470 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
16480 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
16490 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
164a0 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
164b0 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
164c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
164d0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
164e0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
164f0 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
16500 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
16510 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
16520 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
16530 09 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f 63  ..MD5Init(&md5_c
16540 74 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 61  tx);.....MD5Upda
16550 74 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 72  te(&md5_ctx, cer
16560 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
16570 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09  icate_len);.....
16580 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73  MD5Final(md5_has
16590 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09  h, &md5_ctx);...
165a0 09 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f  ...pValue = md5_
165b0 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75  hash;.....ulValu
165c0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64  eLen = sizeof(md
165d0 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41  5_hash);......CA
165e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
165f0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
16600 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
16610 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
16620 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
16630 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64  .....break;....d
16640 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c  efault:.....pVal
16650 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75  ue = NULL;.....u
16660 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
16670 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72  LONG) -1;.....br
16680 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  eak;...}....if (
16690 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c  ((CK_LONG) ulVal
166a0 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c  ueLen) != ((CK_L
166b0 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f  ONG) -1)) {..../
166c0 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74 74 72  * Push curr_attr
166d0 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
166e0 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  */....curr_attr.
166f0 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72  type = curr_attr
16700 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61  _type;....curr_a
16710 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ttr.ulValueLen =
16720 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09   ulValueLen;....
16730 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75  .curr_attr.pValu
16740 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f  e = malloc(curr_
16750 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  attr.ulValueLen)
16760 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  ;....memcpy(curr
16770 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56  _attr.pValue, pV
16780 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e  alue, curr_attr.
16790 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
167a0 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65  .if (pValue_free
167b0 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09   && pValue) {...
167c0 09 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a  ..free(pValue);.
167d0 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d  ...}.....if (num
167e0 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f  attrs >= retval_
167f0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74  count) {.....ret
16800 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65  val = realloc(re
16810 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75  tval, retval_cou
16820 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
16830 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  val));....}.....
16840 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e  memcpy(&retval[n
16850 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f  umattrs], &curr_
16860 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72  attr, sizeof(cur
16870 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d  r_attr));....num
16880 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  attrs++;...}..}.
16890 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21  ..if (numattrs !
168a0 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f  = 0) {...retval_
168b0 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73  count = numattrs
168c0 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ;...retval = rea
168d0 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
168e0 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
168f0 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d  of(*retval));..}
16900 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72   else {...free(r
16910 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61  etval);....retva
16920 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a  l = NULL;..}...*
16930 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74  pulCount = numat
16940 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  trs;...CACKEY_DE
16950 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
16960 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74  rning %lu object
16970 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74  s (%p).", numatt
16980 72 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65 74  rs, (void *) ret
16990 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
169a0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
169b0 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
169c0 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74  ee_identities(st
169d0 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
169e0 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
169f0 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
16a00 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
16a10 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  ) {..CK_ATTRIBUT
16a20 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75  E *curr_attr;..u
16a30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f  nsigned long id_
16a40 69 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a  idx, attr_idx;..
16a50 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20  .if (identities 
16a60 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74  == NULL || ident
16a70 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30  ities_count == 0
16a80 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
16a90 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d  ...for (id_idx =
16aa0 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65   0; id_idx < ide
16ab0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69  ntities_count; i
16ac0 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  d_idx++) {...if 
16ad0 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
16ae0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20  dx].attributes) 
16af0 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69  {....for (attr_i
16b00 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78  dx = 0; attr_idx
16b10 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64   < identities[id
16b20 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
16b30 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78  _count; attr_idx
16b40 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61  ++) {.....curr_a
16b50 74 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65  ttr = &identitie
16b60 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
16b70 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a  utes[attr_idx];.
16b80 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74  .....if (curr_at
16b90 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09  tr->pValue) {...
16ba0 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 74  ...free(curr_att
16bb0 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  r->pValue);.....
16bc0 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69  }....}.....if (i
16bd0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
16be0 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a  ].attributes) {.
16bf0 09 09 09 09 66 72 65 65 28 69 64 65 6e 74 69 74  ....free(identit
16c00 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
16c10 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09  ibutes);....}...
16c20 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
16c30 72 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69  rts(identities[i
16c40 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
16c50 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d  tity, 1, 1);...}
16c60 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74  ..}...free(ident
16c70 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69  ities);.}..stati
16c80 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  c unsigned long 
16c90 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
16ca0 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63  identities(struc
16cb0 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
16cc0 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75  y *identities, u
16cd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
16ce0 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 75  _dod_certs) {..u
16cf0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72  nsigned long cer
16d00 74 5f 69 64 78 2c 20 69 64 5f 69 64 78 20 3d 20  t_idx, id_idx = 
16d10 30 3b 0a 0a 09 66 6f 72 20 28 63 65 72 74 5f 69  0;...for (cert_i
16d20 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78  dx = 0; cert_idx
16d30 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73   < num_dod_certs
16d40 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a  ; cert_idx++) {.
16d50 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
16d60 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
16d70 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65  ty = NULL;...ide
16d80 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
16d90 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63  attributes = cac
16da0 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
16db0 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  es(CKO_CERTIFICA
16dc0 54 45 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73  TE, &extra_certs
16dd0 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30  [cert_idx], 0xf0
16de0 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26  00 | cert_idx, &
16df0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
16e00 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
16e10 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b  unt);...id_idx++
16e20 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  ;....identities[
16e30 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
16e40 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
16e50 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
16e60 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
16e70 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
16e80 62 75 74 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43  butes(CKO_PUBLIC
16e90 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f 63 65 72  _KEY, &extra_cer
16ea0 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78  ts[cert_idx], 0x
16eb0 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c  f000 | cert_idx,
16ec0 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
16ed0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
16ee0 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78  count);...id_idx
16ef0 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65  ++;....identitie
16f00 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
16f10 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a  dentity = NULL;.
16f20 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
16f30 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
16f40 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74  = cackey_get_att
16f50 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e 45 54 53  ributes(CKO_NETS
16f60 43 41 50 45 5f 54 52 55 53 54 2c 20 26 65 78 74  CAPE_TRUST, &ext
16f70 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64  ra_certs[cert_id
16f80 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72  x], 0xf000 | cer
16f90 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69  t_idx, &identiti
16fa0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
16fb0 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  butes_count);...
16fc0 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72  id_idx++;..}...r
16fd0 65 74 75 72 6e 28 69 64 5f 69 64 78 29 3b 0a 7d  eturn(id_idx);.}
16fe0 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
16ff0 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
17000 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65  *cackey_read_ide
17010 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63  ntities(struct c
17020 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
17030 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
17040 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73  *ids_found) {..s
17050 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
17060 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
17070 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74  _identities;..st
17080 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
17090 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
170a0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
170b0 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78   num_ids, id_idx
170c0 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a  , curr_id_type;.
170d0 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
170e0 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d 5f 64 6f  um_certs, num_do
170f0 64 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69 64  d_certs, cert_id
17100 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f  x;..int include_
17110 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b  extra_certs = 0;
17120 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17130 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
17140 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75  );...if (ids_fou
17150 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd == NULL) {...
17160 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17170 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73  NTF("Error.  ids
17180 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29  _found is NULL")
17190 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
171a0 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  );..}..#ifdef CA
171b0 43 4b 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49  CKEY_CARD_SLOT_I
171c0 4e 43 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52  NCLUDE_EXTRA_CER
171d0 54 53 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72  TS..include_extr
171e0 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e  a_certs = 1;.#en
171f0 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  dif...if (getenv
17200 28 22 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52  ("CACKEY_DOD_CER
17210 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29  TS_ON_HW_SLOTS")
17220 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
17230 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
17240 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28  s = 1;..}...if (
17250 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e  getenv("CACKEY_N
17260 4f 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48  O_DOD_CERTS_ON_H
17270 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c  W_SLOTS") != NUL
17280 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65  L) {...include_e
17290 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a  xtra_certs = 0;.
172a0 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  .}...if (getenv(
172b0 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41  "CACKEY_NO_EXTRA
172c0 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c  _CERTS") != NULL
172d0 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65  ) {...num_dod_ce
172e0 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65  rts = 0;..} else
172f0 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72   {...num_dod_cer
17300 74 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 72  ts = sizeof(extr
17310 61 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65 6f  a_certs) / sizeo
17320 66 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30 5d  f(extra_certs[0]
17330 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
17340 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ->internal) {...
17350 6e 75 6d 5f 69 64 73 20 3d 20 6e 75 6d 5f 64 6f  num_ids = num_do
17360 64 5f 63 65 72 74 73 20 2a 20 33 3b 0a 0a 09 09  d_certs * 3;....
17370 69 66 20 28 6e 75 6d 5f 69 64 73 20 21 3d 20 30  if (num_ids != 0
17380 29 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65  ) {....identitie
17390 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69  s = malloc(num_i
173a0 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65  ds * sizeof(*ide
173b0 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09 09 63  ntities));.....c
173c0 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69  ackey_read_dod_i
173d0 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69  dentities(identi
173e0 74 69 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65  ties, num_dod_ce
173f0 72 74 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  rts);...} else {
17400 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d  ....identities =
17410 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69   NULL;...}....*i
17420 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69  ds_found = num_i
17430 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64  ds;....return(id
17440 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09  entities);..}...
17450 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
17460 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65  = cackey_read_ce
17470 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20  rts(slot, NULL, 
17480 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66  &num_certs);..if
17490 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   (pcsc_identitie
174a0 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f  s != NULL) {.../
174b0 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72  * Convert number
174c0 20 6f 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d   of Certs to num
174d0 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a  ber of objects *
174e0 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43  /...num_ids = (C
174f0 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d  KO_PRIVATE_KEY -
17500 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
17510 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74   + 1) * num_cert
17520 73 3b 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64  s;....if (includ
17530 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b  e_extra_certs) {
17540 0a 09 09 09 6e 75 6d 5f 69 64 73 20 2b 3d 20 6e  ....num_ids += n
17550 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20 33  um_dod_certs * 3
17560 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74 69 74  ;...}....identit
17570 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d  ies = malloc(num
17580 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69  _ids * sizeof(*i
17590 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09  dentities));....
175a0 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69 63 61  /* Add certifica
175b0 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65 79 73  tes, public keys
175c0 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20 6b 65  , and private ke
175d0 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d 61 72  ys from the smar
175e0 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f 69 64  tcard */...id_id
175f0 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63 65  x = 0;...for (ce
17600 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74  rt_idx = 0; cert
17610 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73  _idx < num_certs
17620 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a  ; cert_idx++) {.
17630 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f  ...for (curr_id_
17640 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49  type = CKO_CERTI
17650 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64 5f  FICATE; curr_id_
17660 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56  type <= CKO_PRIV
17670 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64  ATE_KEY; curr_id
17680 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69  _type++) {.....i
17690 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
176a0 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
176b0 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
176c0 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79 70  utes(curr_id_typ
176d0 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74  e, &pcsc_identit
176e0 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63  ies[cert_idx], c
176f0 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69  ert_idx, &identi
17700 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
17710 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a  ributes_count);.
17720 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
17730 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
17740 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
17750 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
17760 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
17770 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d  dentity));.....m
17780 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73  emcpy(identities
17790 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
177a0 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64  entity, &pcsc_id
177b0 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
177c0 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e  x], sizeof(*iden
177d0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
177e0 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a  csc_identity));.
177f0 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
17800 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
17810 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
17820 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63  te = malloc(pcsc
17830 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
17840 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
17850 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63  e_len);.....memc
17860 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  py(identities[id
17870 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
17880 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
17890 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  , pcsc_identitie
178a0 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74  s[cert_idx].cert
178b0 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64  ificate, pcsc_id
178c0 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
178d0 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  x].certificate_l
178e0 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78  en);......id_idx
178f0 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ++;....}...}....
17900 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72  if (include_extr
17910 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 43 41  a_certs) {....CA
17920 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17930 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44  F("Including DoD
17940 20 43 65 72 74 69 66 69 63 61 74 65 73 20 6f 6e   Certificates on
17950 20 68 61 72 64 77 61 72 65 20 73 6c 6f 74 22 29   hardware slot")
17960 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61  ;.....cackey_rea
17970 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73  d_dod_identities
17980 28 69 64 65 6e 74 69 74 69 65 73 20 2b 20 69 64  (identities + id
17990 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65  _idx, num_dod_ce
179a0 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  rts);...}....cac
179b0 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70  key_free_certs(p
179c0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
179d0 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 0a  num_certs, 1);..
179e0 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e  ..*ids_found = n
179f0 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72  um_ids;....retur
17a00 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09  n(identities);..
17a10 7d 0a 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20  }....*ids_found 
17a20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c  = 0;..return(NUL
17a30 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  L);.}..CK_DEFINE
17a40 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
17a50 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28 43   C_Initialize)(C
17a60 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69 74  K_VOID_PTR pInit
17a70 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e  Args) {..CK_C_IN
17a80 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b  ITIALIZE_ARGS CK
17a90 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e 74  _PTR args;..uint
17aa0 33 32 5f 74 20 69 64 78 2c 20 68 69 67 68 65 73  32_t idx, highes
17ab0 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20 6d 75 74  t_slot;..int mut
17ac0 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a 09 43  ex_init_ret;...C
17ad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17ae0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
17af0 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 74  .if (cackey_init
17b00 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
17b10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17b20 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 64  ("Error.  Alread
17b30 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  y initialized.")
17b40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
17b50 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59  CRYPTOKI_ALREADY
17b60 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
17b70 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67  }...if (pInitArg
17b80 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61  s != NULL) {...a
17b90 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b  rgs = pInitArgs;
17ba0 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65  ...memcpy(&cacke
17bb0 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69  y_args, args, si
17bc0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73  zeof(cackey_args
17bd0 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d  ));....if (args-
17be0 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20  >CreateMutex == 
17bf0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65  NULL || args->De
17c00 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55  stroyMutex == NU
17c10 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b  LL || args->Lock
17c20 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
17c30 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74   args->UnlockMut
17c40 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ex == NULL) {...
17c50 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74  .if (args->Creat
17c60 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  eMutex != NULL |
17c70 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d  | args->DestroyM
17c80 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20  utex != NULL || 
17c90 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20  args->LockMutex 
17ca0 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
17cb0 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20  >UnlockMutex != 
17cc0 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b  NULL) {.....CACK
17cd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17ce0 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75  "Error. Some, bu
17cf0 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64  t not All thread
17d00 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70  ing primitives p
17d10 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09  rovided.");.....
17d20 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
17d30 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d  MENTS_BAD);....}
17d40 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
17d50 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65  .cackey_args.Cre
17d60 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ateMutex = NULL;
17d70 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 44  ...cackey_args.D
17d80 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55  estroyMutex = NU
17d90 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
17da0 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55  s.LockMutex = NU
17db0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
17dc0 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20  s.UnlockMutex = 
17dd0 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
17de0 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09  rgs.flags = 0;..
17df0 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
17e00 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
17e10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
17e20 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
17e30 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
17e40 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65  idx++) {...cacke
17e50 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
17e60 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
17e70 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
17e80 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
17e90 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
17ea0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
17eb0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
17ec0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
17ed0 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
17ee0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
17ef0 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  dx].pcsc_reader 
17f00 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
17f10 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
17f20 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
17f30 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
17f40 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
17f50 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
17f60 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
17f70 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65  ots[idx].slot_re
17f80 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  set = 0;...cacke
17f90 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b  y_slots[idx].tok
17fa0 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09  en_flags = 0;...
17fb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
17fc0 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
17fd0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
17fe0 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30  dx].internal = 0
17ff0 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e  ;..}...if (geten
18000 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54  v("CACKEY_NO_EXT
18010 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55  RA_CERTS") != NU
18020 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
18030 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b  EBUG_PRINTF("Ask
18040 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64  ed not to includ
18050 65 20 44 6f 44 20 63 65 72 74 69 66 69 63 61 74  e DoD certificat
18060 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  es");..} else {.
18070 09 09 68 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d  ..highest_slot =
18080 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
18090 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
180a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
180b0 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59  ) - 1;....CACKEY
180c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
180d0 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20 63 65 72  ncluding DoD cer
180e0 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c  ts in slot %lu",
180f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18100 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a   highest_slot);.
18110 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
18120 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63  highest_slot].ac
18130 74 69 76 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b  tive = 1;...cack
18140 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
18150 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20  _slot].internal 
18160 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 1;...cackey_sl
18170 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
18180 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e 73 69 67  ].label = (unsig
18190 6e 65 64 20 63 68 61 72 20 2a 29 20 22 44 6f 44  ned char *) "DoD
181a0 20 43 65 72 74 69 66 69 63 61 74 65 73 22 3b 0a   Certificates";.
181b0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68  ..cackey_slots[h
181c0 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 70 63 73  ighest_slot].pcs
181d0 63 5f 72 65 61 64 65 72 20 3d 20 22 43 41 43 4b  c_reader = "CACK
181e0 65 79 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  ey";...cackey_sl
181f0 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
18200 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ].token_flags = 
18210 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69  0;..}...cackey_i
18220 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a  nitialized = 1;.
18230 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69  ..if (!cackey_bi
18240 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09  glock_init) {...
18250 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d  mutex_init_ret =
18260 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72   cackey_mutex_cr
18270 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67  eate(&cackey_big
18280 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75  lock);....if (mu
18290 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20  tex_init_ret != 
182a0 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
182b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
182c0 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69  or.  Mutex initi
182d0 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64  alization failed
182e0 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
182f0 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a  CKR_CANT_LOCK);.
18300 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69  ..}....cackey_bi
18310 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a  glock_init = 1;.
18320 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
18330 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
18340 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
18350 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
18360 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
18370 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
18380 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61  ON(CK_RV, C_Fina
18390 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54  lize)(CK_VOID_PT
183a0 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09  R pReserved) {..
183b0 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09  uint32_t idx;...
183c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
183d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
183e0 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20  ..if (pReserved 
183f0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
18400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18410 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
18420 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
18430 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18440 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
18450 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
18460 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
18470 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18480 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
18490 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
184a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
184b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
184c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
184d0 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
184e0 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
184f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
18500 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
18510 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
18520 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
18530 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
18540 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43  ].active) {....C
18550 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64  _CloseSession(id
18560 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63  x);...}..}...cac
18570 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
18580 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f  nect_all();...fo
18590 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
185a0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
185b0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
185c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
185d0 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
185e0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
185f0 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  idx].internal) {
18600 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
18610 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
18620 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
18630 72 65 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65  reader) {....fre
18640 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  e(cackey_slots[i
18650 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  dx].pcsc_reader)
18660 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65  ;...}..}...cacke
18670 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63  y_pcsc_disconnec
18680 74 28 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e  t();...cackey_in
18690 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a  itialized = 0;..
186a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
186b0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
186c0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
186d0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
186e0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
186f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
18700 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29  K_RV, C_GetInfo)
18710 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  (CK_INFO_PTR pIn
18720 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  fo) {..static CK
18730 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61  _UTF8CHAR manufa
18740 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e  cturerID[] = "U.
18750 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a  S. Government";.
18760 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
18770 48 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72  HAR libraryDescr
18780 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
18790 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ey";...CACKEY_DE
187a0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
187b0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
187c0 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
187d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
187e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
187f0 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
18800 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
18810 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
18820 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
18830 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
18840 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18850 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
18860 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
18870 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
18880 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
18890 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  LIZED);..}...pIn
188a0 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73  fo->cryptokiVers
188b0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41  ion.major = ((CA
188c0 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
188d0 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31  RSION_CODE) >> 1
188e0 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66  6) & 0xff;..pInf
188f0 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69  o->cryptokiVersi
18900 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43  on.minor = ((CAC
18910 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
18920 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29  SION_CODE) >> 8)
18930 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65   & 0xff;...memse
18940 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  t(pInfo->manufac
18950 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69  turerID, ' ', si
18960 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
18970 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d  facturerID));..m
18980 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emcpy(pInfo->man
18990 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e  ufacturerID, man
189a0 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a  ufacturerID, siz
189b0 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72  eof(manufacturer
189c0 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66  ID) - 1);...pInf
189d0 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b  o->flags = 0x00;
189e0 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
189f0 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  >libraryDescript
18a00 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ion, ' ', sizeof
18a10 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44  (pInfo->libraryD
18a20 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d  escription));..m
18a30 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62  emcpy(pInfo->lib
18a40 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c  raryDescription,
18a50 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74   libraryDescript
18a60 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72  ion, sizeof(libr
18a70 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20  aryDescription) 
18a80 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c  - 1);...pInfo->l
18a90 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61  ibraryVersion.ma
18aa0 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  jor = (cackey_ge
18ab0 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36  tversion() >> 16
18ac0 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
18ad0 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e  ->libraryVersion
18ae0 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
18af0 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
18b00 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41   8) & 0xff;...CA
18b10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18b20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
18b30 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
18b40 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
18b50 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50  _OK);.}../*. * P
18b60 72 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72  rocess list of r
18b70 65 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61  eaders, and crea
18b80 74 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65  te mapping betwe
18b90 65 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61  en reader name a
18ba0 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43  nd slot ID. */.C
18bb0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
18bc0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c  N(CK_RV, C_GetSl
18bd0 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c  otList)(CK_BBOOL
18be0 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43   tokenPresent, C
18bf0 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53  K_SLOT_ID_PTR pS
18c00 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e  lotList, CK_ULON
18c10 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
18c20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
18c30 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63  val;..int pcsc_c
18c40 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f  onnect_ret;..CK_
18c50 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f  ULONG count, slo
18c60 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72  t_count = 0, cur
18c70 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78 3b  rslot, slot_idx;
18c80 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
18c90 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64  ders, *pcsc_read
18ca0 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61  ers_s, *pcsc_rea
18cb0 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70  ders_e;..DWORD p
18cc0 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b  csc_readers_len;
18cd0 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73  ..LONG scard_lis
18ce0 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73  treaders_ret;..s
18cf0 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65  ize_t curr_reade
18d00 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f  r_len;...CACKEY_
18d10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
18d20 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
18d30 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ulCount == NULL)
18d40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
18d50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
18d60 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c   pulCount is NUL
18d70 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
18d80 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
18d90 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
18da0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
18db0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
18dc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18dd0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
18de0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
18df0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
18e00 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
18e10 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
18e20 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
18e30 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
18e40 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
18e50 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
18e60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18e70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
18e80 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
18e90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18ea0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
18eb0 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c  ..}.../* Clear l
18ec0 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a  ist of slots */.
18ed0 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20  .if (pSlotList) 
18ee0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18ef0 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67  _PRINTF("Purging
18f00 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   all slot inform
18f10 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 2f 2a 20  ation.");..../* 
18f20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20  Only update the 
18f30 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66  list of slots if
18f40 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79   we are actually
18f50 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68   being supply th
18f60 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  e slot informati
18f70 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 73  on */...cackey_s
18f80 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
18f90 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72 20 28 63  all();....for (c
18fa0 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
18fb0 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
18fc0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
18fd0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
18fe0 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
18ff0 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63  ot++) {....if (c
19000 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
19010 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20  slot].internal) 
19020 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
19030 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63  ...}.....if (cac
19040 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
19050 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ot].pcsc_reader)
19060 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b   {.....free(cack
19070 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
19080 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t].pcsc_reader);
19090 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
190a0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
190b0 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b  c_reader = NULL;
190c0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61  ....}.....if (ca
190d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
190e0 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09  lot].label) {...
190f0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
19100 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61  ots[currslot].la
19110 62 65 6c 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  bel);......cacke
19120 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
19130 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
19140 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
19150 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
19160 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a  active = 0;...}.
19170 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
19180 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  e list of reader
19190 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  s */..pcsc_conne
191a0 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
191b0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
191c0 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
191d0 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
191e0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
191f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19200 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  TF("Connection t
19210 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20  o PC/SC failed, 
19220 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74  assuming no slot
19230 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75  s");....slot_cou
19240 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  nt = 0;..} else 
19250 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  {...pcsc_readers
19260 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61  _len = 0;....sca
19270 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
19280 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65  et = SCardListRe
19290 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63  aders(*cackey_pc
192a0 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c  sc_handle, NULL,
192b0 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61   NULL, &pcsc_rea
192c0 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66  ders_len);....if
192d0 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
192e0 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
192f0 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b  _F_COMM_ERROR) {
19300 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19310 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19320 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
19330 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
19340 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20  D_F_COMM_ERROR, 
19350 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 74  assuming Connect
19360 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65 6e  ion to PC/SC wen
19370 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65 63  t away. Reconnec
19380 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61 63  ting.");.....cac
19390 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
193a0 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65 79  ect();....cackey
193b0 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b  _pcsc_connect();
193c0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
193d0 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67  G_PRINTF("Trying
193e0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
193f0 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09 09  s() again");....
19400 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
19410 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
19420 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
19430 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
19440 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f  LL, NULL, &pcsc_
19450 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09  readers_len);...
19460 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c  }....if (scard_l
19470 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
19480 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
19490 53 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 72  S && pcsc_reader
194a0 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09  s_len != 0) {...
194b0 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d 20  .pcsc_readers = 
194c0 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 64  malloc(pcsc_read
194d0 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73  ers_len);....pcs
194e0 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 63  c_readers_s = pc
194f0 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 09  sc_readers;.....
19500 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
19510 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
19520 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
19530 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
19540 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73  LL, pcsc_readers
19550 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
19560 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 61  len);....if (sca
19570 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
19580 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
19590 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 73  CCESS) {.....pcs
195a0 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 63  c_readers_e = pc
195b0 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 73  sc_readers + pcs
195c0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a  c_readers_len;..
195d0 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74  ..../* Start wit
195e0 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20  h Slot ID 1, to 
195f0 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47  avoid a bug in G
19600 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09  DM on RHEL */...
19610 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a  ../* Bug 594911:
19620 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
19630 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f  a.redhat.com/sho
19640 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34  w_bug.cgi?id=594
19650 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 73  911 */.....currs
19660 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 73 6c 6f  lot = 1;.....slo
19670 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09  t_count = 0;....
19680 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65 61  .while (pcsc_rea
19690 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61 64  ders < pcsc_read
196a0 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 2f 2a  ers_e) {....../*
196b0 20 46 69 6e 64 20 6e 65 78 74 20 61 76 61 69 6c   Find next avail
196c0 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09 09 09  able slot */....
196d0 09 09 66 6f 72 20 28 3b 20 63 75 72 72 73 6c 6f  ..for (; currslo
196e0 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
196f0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
19700 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
19710 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
19720 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 21 63  ) {.......if (!c
19730 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
19740 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
19750 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
19760 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09  ....}......}....
19770 09 09 09 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  ...curr_reader_l
19780 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63 73 63  en = strlen(pcsc
19790 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09  _readers);......
197a0 09 69 66 20 28 28 70 63 73 63 5f 72 65 61 64 65  .if ((pcsc_reade
197b0 72 73 20 2b 20 63 75 72 72 5f 72 65 61 64 65 72  rs + curr_reader
197c0 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72 65 61  _len) > pcsc_rea
197d0 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 09  ders_e) {.......
197e0 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09  break;......}...
197f0 09 09 09 09 69 66 20 28 63 75 72 72 5f 72 65 61  ....if (curr_rea
19800 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a  der_len == 0) {.
19810 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
19820 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75  ..}.......if (cu
19830 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 6f  rrslot >= (sizeo
19840 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
19850 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
19860 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
19870 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19880 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6d  _PRINTF("Found m
19890 6f 72 65 20 72 65 61 64 65 72 73 20 74 68 61 6e  ore readers than
198a0 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c   slots are avail
198b0 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09 09  able!");........
198c0 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09  break;......}...
198d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
198e0 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 72  _PRINTF("Found r
198f0 65 61 64 65 72 3a 20 25 73 22 2c 20 70 63 73 63  eader: %s", pcsc
19900 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09  _readers);......
19910 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20  ./* Only update 
19920 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  the list of slot
19930 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75  s if we are actu
19940 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64  ally being asked
19950 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74   supply the slot
19960 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
19970 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69  .....if (pSlotLi
19980 73 74 29 20 7b 0a 09 09 09 09 09 09 63 61 63 6b  st) {.......cack
19990 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
199a0 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  t].active = 1;..
199b0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
199c0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65  s[currslot].inte
199d0 72 6e 61 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09  rnal = 0;.......
199e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
199f0 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
19a00 65 72 20 3d 20 73 74 72 64 75 70 28 70 63 73 63  er = strdup(pcsc
19a10 5f 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09  _readers);......
19a20 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
19a30 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72  rrslot].pcsc_car
19a40 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
19a50 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
19a60 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72  ots[currslot].tr
19a70 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
19a80 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65  = 0;.......cacke
19a90 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
19aa0 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ].transaction_ne
19ab0 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
19ac0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
19ad0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f  ts[currslot].slo
19ae0 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 09  t_reset = 1;....
19af0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
19b00 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f  currslot].token_
19b10 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
19b20 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09  N_REQUIRED;.....
19b30 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
19b40 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d  urrslot].label =
19b50 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 63 61   NULL;........ca
19b60 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
19b70 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  eset(&cackey_slo
19b80 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29 3b 0a 09  ts[currslot]);..
19b90 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
19ba0 09 09 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c  .../* Artificial
19bb0 6c 79 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ly increase the 
19bc0 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65  number of active
19bd0 20 73 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77   slots by what w
19be0 69 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76  ill become activ
19bf0 65 20 2a 2f 0a 09 09 09 09 09 09 73 6c 6f 74 5f  e */.......slot_
19c00 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a  count++;......}.
19c10 09 09 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b  .....currslot++;
19c20 0a 0a 09 09 09 09 09 70 63 73 63 5f 72 65 61 64  .......pcsc_read
19c30 65 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64  ers += curr_read
19c40 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09  er_len + 1;.....
19c50 7d 0a 0a 09 09 09 09 66 6f 72 20 28 63 75 72 72  }......for (curr
19c60 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c  slot = 0; currsl
19c70 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  ot < (sizeof(cac
19c80 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
19c90 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
19ca0 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b  [0])); currslot+
19cb0 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 63 61  +) {......if (ca
19cc0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
19cd0 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  lot].active) {..
19ce0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19cf0 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20  G_PRINTF("Found 
19d00 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 22  active slot %lu"
19d10 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19d20 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09  ) currslot);....
19d30 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b  ....slot_count++
19d40 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
19d50 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43  ..} else {.....C
19d60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19d70 54 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20  TF("Second call 
19d80 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  to SCardListRead
19d90 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ers failed, retu
19da0 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b  rn %s/%li", CACK
19db0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
19dc0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
19dd0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
19de0 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
19df0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
19e00 65 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72  et);....}.....fr
19e10 65 65 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ee(pcsc_readers_
19e20 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  s);...} else {..
19e30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19e40 52 49 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c  RINTF("First cal
19e50 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65  l to SCardListRe
19e60 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65  aders failed, re
19e70 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41  turn %s/%li", CA
19e80 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
19e90 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
19ea0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
19eb0 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  s_ret), (long) s
19ec0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
19ed0 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  _ret);...}..}...
19ee0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
19ef0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
19f00 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
19f10 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
19f20 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
19f30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19f40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
19f50 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
19f60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
19f70 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
19f80 09 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69  .}...if (pSlotLi
19f90 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
19fa0 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74  *pulCount = slot
19fb0 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45  _count;....CACKE
19fc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19fd0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
19fe0 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c   (%i).  Found %l
19ff0 75 20 72 65 61 64 65 72 73 2c 20 62 75 74 20 6e  u readers, but n
1a000 6f 74 20 73 74 6f 72 69 6e 67 20 49 44 73 20 28  ot storing IDs (
1a010 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c  pSlotList == NUL
1a020 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e  L)", CKR_OK, (un
1a030 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f  signed long) slo
1a040 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74  t_count);....ret
1a050 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
1a060 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f  ..count = *pulCo
1a070 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20  unt;..if (count 
1a080 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a  < slot_count) {.
1a090 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a0a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73  RINTF("Error. Us
1a0b0 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75  er allocated %lu
1a0c0 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65   entries, but we
1a0d0 20 68 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65   have %lu entrie
1a0e0 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74  s.", count, slot
1a0f0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b  _count);....CACK
1a100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a110 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42  "Returning CKR_B
1a120 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22  UFFER_TOO_SMALL"
1a130 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1a140 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
1a150 4c 29 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  L);...}...mutex_
1a160 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1a170 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1a180 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1a190 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1a1a0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1a1b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a1c0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1a1d0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1a1e0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1a1f0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f  ROR);..}...slot_
1a200 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63  idx = 0;..for (c
1a210 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75  urrslot = 0; (cu
1a220 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
1a230 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1a240 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1a250 6c 6f 74 73 5b 30 5d 29 29 29 3b 20 63 75 72 72  lots[0]))); curr
1a260 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28  slot++) {...if (
1a270 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  !cackey_slots[cu
1a280 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20  rrslot].active) 
1a290 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  {....continue;..
1a2a0 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69  .}....if (slot_i
1a2b0 64 78 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09  dx >= count) {..
1a2c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a2d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73  RINTF("Error. Us
1a2e0 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75  er allocated %lu
1a2f0 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65   entries, but we
1a300 20 6a 75 73 74 20 74 72 69 65 64 20 74 6f 20 77   just tried to w
1a310 72 69 74 65 20 74 6f 20 74 68 65 20 25 6c 75 20  rite to the %lu 
1a320 69 6e 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e  index -- ignorin
1a330 67 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  g", count, slot_
1a340 69 64 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  idx);.....contin
1a350 75 65 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74  ue;...}....pSlot
1a360 4c 69 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d  List[slot_idx] =
1a370 20 63 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f   currslot;...slo
1a380 74 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75  t_idx++;..}...mu
1a390 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1a3a0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1a3b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1a3c0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1a3d0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1a3e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a3f0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1a400 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1a410 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1a420 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1a430 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73  ...*pulCount = s
1a440 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43  lot_count;...CAC
1a450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a460 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1a470 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20  OK (%i).  Found 
1a480 25 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43  %lu readers.", C
1a490 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64  KR_OK, (unsigned
1a4a0 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e   long) slot_coun
1a4b0 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  t);...return(CKR
1a4c0 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65  _OK);...tokenPre
1a4d0 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73  sent = tokenPres
1a4e0 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20  ent; /* Supress 
1a4f0 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20  unused variable 
1a500 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b  warning */.}..CK
1a510 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1a520 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f  (CK_RV, C_GetSlo
1a530 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49  tInfo)(CK_SLOT_I
1a540 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f  D slotID, CK_SLO
1a550 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  T_INFO_PTR pInfo
1a560 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
1a570 54 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63  TF8CHAR slotDesc
1a580 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43  ription[] = "CAC
1a590 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20  Key Slot";..int 
1a5a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
1a5b0 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  nt bytes_to_copy
1a5c0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1a5d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1a5e0 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
1a5f0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1a600 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a610 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
1a620 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1a630 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1a640 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1a650 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1a660 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1a670 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a680 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1a690 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1a6a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1a6b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1a6c0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
1a6d0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
1a6e0 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
1a6f0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1a700 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1a710 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1a720 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a730 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1a740 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1a750 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
1a760 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
1a770 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
1a780 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1a790 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1a7a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1a7b0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1a7c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1a7d0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1a7e0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1a7f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a800 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1a810 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1a820 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1a830 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1a840 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
1a850 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
1a860 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1a870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a880 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1a890 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1a8a0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
1a8b0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
1a8c0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
1a8d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1a8e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1a8f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
1a900 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
1a910 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  }...pInfo->flags
1a920 20 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a   = CKF_HW_SLOT;.
1a930 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c  ..if (!cackey_sl
1a940 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65  ots[slotID].inte
1a950 72 6e 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d  rnal) {...pInfo-
1a960 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45  >flags |= CKF_RE
1a970 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a  MOVABLE_DEVICE;.
1a980 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1a990 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63  token_present(&c
1a9a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1a9b0 49 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50  ID]) == CACKEY_P
1a9c0 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
1a9d0 4e 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66  NT) {...pInfo->f
1a9e0 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45  lags |= CKF_TOKE
1a9f0 4e 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09  N_PRESENT;..}...
1aa00 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
1aa10 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c  strlen(cackey_sl
1aa20 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63  ots[slotID].pcsc
1aa30 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73  _reader);..if (s
1aa40 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
1aa50 75 66 61 63 74 75 72 65 72 49 44 29 20 3c 20 62  ufacturerID) < b
1aa60 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a  ytes_to_copy) {.
1aa70 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20  ..bytes_to_copy 
1aa80 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  = sizeof(pInfo->
1aa90 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b  manufacturerID);
1aaa0 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66  ..}..memcpy(pInf
1aab0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1aac0 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  D, cackey_slots[
1aad0 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61  slotID].pcsc_rea
1aae0 64 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f  der, bytes_to_co
1aaf0 70 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  py);...mutex_ret
1ab00 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1ab10 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ab20 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1ab30 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1ab40 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1ab50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ab60 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1ab70 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ab80 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ab90 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73  RROR);..}...mems
1aba0 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  et(pInfo->slotDe
1abb0 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20  scription, ' ', 
1abc0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c  sizeof(pInfo->sl
1abd0 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b  otDescription));
1abe0 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
1abf0 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c  slotDescription,
1ac00 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e   slotDescription
1ac10 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73  , sizeof(slotDes
1ac20 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a  cription) - 1);.
1ac30 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
1ac40 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1ac50 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
1ac60 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1ac70 44 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61  D));...pInfo->ha
1ac80 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61  rdwareVersion.ma
1ac90 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  jor = (cackey_ge
1aca0 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36  tversion() >> 16
1acb0 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
1acc0 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
1acd0 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65  n.minor = (cacke
1ace0 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1acf0 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70  > 8) & 0xff;...p
1ad00 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
1ad10 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78  rsion.major = 0x
1ad20 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d  00;..pInfo->firm
1ad30 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
1ad40 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b  r = 0x00;...CACK
1ad50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ad60 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1ad70 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1ad80 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1ad90 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1ada0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1adb0 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29   C_GetTokenInfo)
1adc0 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
1add0 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46  ID, CK_TOKEN_INF
1ade0 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
1adf0 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
1ae00 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49  AR manufacturerI
1ae10 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65  D[] = "U.S. Gove
1ae20 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63  rnment";..static
1ae30 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66   CK_UTF8CHAR def
1ae40 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55  aultLabel[] = "U
1ae50 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09  nknown Token";..
1ae60 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
1ae70 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41  AR model[] = "CA
1ae80 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63  C Token";..struc
1ae90 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
1aea0 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
1aeb0 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e  ntities;..unsign
1aec0 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74  ed long num_cert
1aed0 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65  s;..ssize_t labe
1aee0 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65  l_ret;..int mute
1aef0 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75  x_retval;..int u
1af00 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
1af10 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1af20 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1af30 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
1af40 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1af50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1af60 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
1af70 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1af80 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1af90 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1afa0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1afb0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1afc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1afd0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1afe0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1aff0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1b000 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1b010 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
1b020 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
1b030 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
1b040 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1b050 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1b060 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1b070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b080 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1b090 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1b0a0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
1b0b0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
1b0c0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
1b0d0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1b0e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1b0f0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1b100 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1b110 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1b120 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1b130 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1b140 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b150 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1b160 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1b170 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1b180 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1b190 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
1b1a0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
1b1b0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1b1c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b1d0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1b1e0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1b1f0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
1b200 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
1b210 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
1b220 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1b230 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1b240 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
1b250 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
1b260 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74  }...if (cackey_t
1b270 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61  oken_present(&ca
1b280 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1b290 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  D]) != CACKEY_PC
1b2a0 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
1b2b0 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
1b2c0 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74  BUG_PRINTF("No t
1b2d0 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20  oken is present 
1b2e0 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22  in slotID = %lu"
1b2f0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
1b300 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1b310 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1b320 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1b330 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45  _TOKEN_NOT_PRESE
1b340 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  NT);..}...mutex_
1b350 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1b360 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1b370 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1b380 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1b390 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1b3a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b3b0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1b3c0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1b3d0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1b3e0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f  L_ERROR);..}.../
1b3f0 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65  * Determine toke
1b400 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 72  n label from cer
1b410 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65  tificates */..me
1b420 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  mset(pInfo->labe
1b430 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  l, ' ', sizeof(p
1b440 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09  Info->label));..
1b450 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
1b460 6c 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 63  l = 1;...if (cac
1b470 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1b480 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29  ].label == NULL)
1b490 20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69   {...pcsc_identi
1b4a0 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
1b4b0 61 64 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79  ad_certs(&cackey
1b4c0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
1b4d0 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73  NULL, &num_certs
1b4e0 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 69 64  );...if (pcsc_id
1b4f0 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
1b500 29 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63  ) {....if (num_c
1b510 65 72 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 09  erts > 0) {.....
1b520 6c 61 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b  label_ret = cack
1b530 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
1b540 5f 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69  _to_label(pcsc_i
1b550 64 65 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 6f  dentities, pInfo
1b560 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  ->label, sizeof(
1b570 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a  pInfo->label));.
1b580 09 09 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 65  ....if (label_re
1b590 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 73  t > 0) {......us
1b5a0 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20  e_default_label 
1b5b0 3d 20 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65  = 0;.......cacke
1b5c0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1b5d0 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  label = malloc(s
1b5e0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
1b5f0 65 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63  el));.......memc
1b600 70 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  py(cackey_slots[
1b610 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70  slotID].label, p
1b620 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a  Info->label, siz
1b630 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
1b640 29 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  ));.....}....}..
1b650 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
1b660 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
1b670 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
1b680 20 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65   1);...}..} else
1b690 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66   {...memcpy(pInf
1b6a0 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79  o->label, cackey
1b6b0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
1b6c0 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e  abel, sizeof(pIn
1b6d0 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09  fo->label));....
1b6e0 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
1b6f0 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  l = 0;..}...if (
1b700 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
1b710 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49  l) {...memcpy(pI
1b720 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61  nfo->label, defa
1b730 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  ultLabel, sizeof
1b740 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d  (defaultLabel) -
1b750 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74   1);..}...memset
1b760 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1b770 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a  urerID, ' ', siz
1b780 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
1b790 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65  acturerID));..me
1b7a0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
1b7b0 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75  facturerID, manu
1b7c0 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65  facturerID, size
1b7d0 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49  of(manufacturerI
1b7e0 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  D) - 1);...memse
1b7f0 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20  t(pInfo->model, 
1b800 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
1b810 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d  o->model));..mem
1b820 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c  cpy(pInfo->model
1b830 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28  , model, sizeof(
1b840 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d  model) - 1);...m
1b850 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72  emset(pInfo->ser
1b860 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20  ialNumber, ' ', 
1b870 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65  sizeof(pInfo->se
1b880 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09  rialNumber));...
1b890 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74  memset(pInfo->ut
1b8a0 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65  cTime, ' ', size
1b8b0 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d  of(pInfo->utcTim
1b8c0 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61  e));...pInfo->ha
1b8d0 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61  rdwareVersion.ma
1b8e0 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  jor = (cackey_ge
1b8f0 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36  tversion() >> 16
1b900 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
1b910 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
1b920 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65  n.minor = (cacke
1b930 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1b940 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70  > 8) & 0xff;...p
1b950 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
1b960 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78  rsion.major = 0x
1b970 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d  00;..pInfo->firm
1b980 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
1b990 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66  r = 0x00;...pInf
1b9a0 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57  o->flags = CKF_W
1b9b0 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c  RITE_PROTECTED |
1b9c0 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e   CKF_USER_PIN_IN
1b9d0 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f  ITIALIZED | CKF_
1b9e0 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45  TOKEN_INITIALIZE
1b9f0 44 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  D | cackey_slots
1ba00 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
1ba10 6c 61 67 73 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75  lags;...pInfo->u
1ba20 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74  lMaxSessionCount
1ba30 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   = (sizeof(cacke
1ba40 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1ba50 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1ba60 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09  ions[0])) - 1;..
1ba70 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e  pInfo->ulSession
1ba80 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41  Count = CK_UNAVA
1ba90 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
1baa0 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ON;..pInfo->ulMa
1bab0 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  xRwSessionCount 
1bac0 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52  = 0;..pInfo->ulR
1bad0 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  wSessionCount = 
1bae0 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1baf0 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
1bb00 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20  fo->ulMaxPinLen 
1bb10 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75  = 128;..pInfo->u
1bb20 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a  lMinPinLen = 0;.
1bb30 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50  .pInfo->ulTotalP
1bb40 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b  ublicMemory = CK
1bb50 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
1bb60 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
1bb70 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65  ->ulFreePublicMe
1bb80 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
1bb90 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
1bba0 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74  N;..pInfo->ulTot
1bbb0 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20  alPrivateMemory 
1bbc0 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
1bbd0 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
1bbe0 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76  Info->ulFreePriv
1bbf0 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  ateMemory = CK_U
1bc00 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
1bc10 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59  MATION;...CACKEY
1bc20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1bc30 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1bc40 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1bc50 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1bc60 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1bc70 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1bc80 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e  _WaitForSlotEven
1bc90 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  t)(CK_FLAGS flag
1bca0 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54  s, CK_SLOT_ID_PT
1bcb0 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f  R pSlotID, CK_VO
1bcc0 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64  ID_PTR pReserved
1bcd0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1bce0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1bcf0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65  .");...if (pRese
1bd00 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  rved != NULL) {.
1bd10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bd20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52  RINTF("Error. pR
1bd30 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e  eserved is not N
1bd40 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1bd50 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1bd60 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
1bd70 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1bd80 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1bd90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1bda0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1bdb0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1bdc0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1bdd0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1bde0 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54  ;..}.../* XXX: T
1bdf0 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20 74  ODO: Implement t
1be00 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b 45  his... */..CACKE
1be10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1be20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1be30 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1be40 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1be50 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1be60 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1be70 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1be80 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1be90 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1bea0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1beb0 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28  tMechanismList)(
1bec0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1bed0 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  D, CK_MECHANISM_
1bee0 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e  TYPE_PTR pMechan
1bef0 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e  ismList, CK_ULON
1bf00 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
1bf10 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1bf20 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1bf30 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1bf40 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1bf50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bf60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1bf70 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1bf80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1bf90 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1bfa0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1bfb0 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d  .if (pulCount ==
1bfc0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1bfd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bfe0 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74  Error.  pulCount
1bff0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1c000 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1c010 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1c020 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69  if (pMechanismLi
1c030 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
1c040 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a  *pulCount = 1;..
1c050 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c060 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1c070 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1c080 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
1c090 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
1c0a0 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20  if (*pulCount < 
1c0b0 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  1) {...CACKEY_DE
1c0c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c0d0 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73  r.  Buffer too s
1c0e0 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  mall.");....retu
1c0f0 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  rn(CKR_BUFFER_TO
1c100 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70  O_SMALL);..}...p
1c110 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d  MechanismList[0]
1c120 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b   = CKM_RSA_PKCS;
1c130 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b  ..*pulCount = 1;
1c140 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c150 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1c160 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1c170 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1c180 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1c190 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1c1a0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63  (CK_RV, C_GetMec
1c1b0 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53  hanismInfo)(CK_S
1c1c0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
1c1d0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45  K_MECHANISM_TYPE
1c1e0 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e   type, CK_MECHAN
1c1f0 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  ISM_INFO_PTR pIn
1c200 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  fo) {..int mutex
1c210 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
1c220 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c230 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1c240 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
1c250 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c260 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c270 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
1c280 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c290 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1c2a0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1c2b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1c2c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c2d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1c2e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1c2f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c300 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1c310 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1c320 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
1c330 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
1c340 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1c350 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1c360 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
1c370 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c380 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1c390 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1c3a0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
1c3b0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
1c3c0 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
1c3d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
1c3e0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
1c3f0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1c400 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1c410 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1c420 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1c430 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1c440 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c450 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1c460 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1c470 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c480 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1c490 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1c4a0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
1c4b0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
1c4c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c4d0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1c4e0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1c4f0 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
1c500 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
1c510 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
1c520 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1c530 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1c540 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
1c550 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
1c560 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1c570 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1c580 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1c590 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1c5a0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1c5b0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1c5c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c5d0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1c5e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1c5f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1c600 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1c610 73 77 69 74 63 68 20 28 74 79 70 65 29 20 7b 0a  switch (type) {.
1c620 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
1c630 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75  KCS:....pInfo->u
1c640 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31  lMinKeySize = 51
1c650 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d  2;....pInfo->ulM
1c660 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32  axKeySize = 8192
1c670 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  ;....pInfo->flag
1c680 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46  s = CKF_HW | CKF
1c690 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44  _ENCRYPT | CKF_D
1c6a0 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47  ECRYPT | CKF_SIG
1c6b0 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a  N | CKF_VERIFY;.
1c6c0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43  ...break;..}...C
1c6d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c6e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1c6f0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1c700 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1c710 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20  R_OK);.}../* We 
1c720 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68  don't support th
1c730 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b  is method. */.CK
1c740 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1c750 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f  (CK_RV, C_InitTo
1c760 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ken)(CK_SLOT_ID 
1c770 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 43  slotID, CK_UTF8C
1c780 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
1c790 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c  _ULONG ulPinLen,
1c7a0 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
1c7b0 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b   pLabel) {..CACK
1c7c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c7d0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1c7e0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1c7f0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1c800 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c810 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1c820 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1c830 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1c840 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1c850 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1c860 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1c870 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b  eturning CKR_TOK
1c880 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
1c890 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f  ED (%i)", CKR_TO
1c8a0 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
1c8b0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1c8c0 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
1c8d0 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a  ROTECTED);.}../*
1c8e0 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72   We don't suppor
1c8f0 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a  t this method. *
1c900 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
1c910 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e  TION(CK_RV, C_In
1c920 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f  itPIN)(CK_SESSIO
1c930 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1c940 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
1c950 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
1c960 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43  G ulPinLen) {..C
1c970 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c980 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1c990 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1c9a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1c9b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c9c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1c9d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1c9e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1c9f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1ca00 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1ca10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ca20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1ca30 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
1ca40 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ECTED (%i)", CKR
1ca50 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
1ca60 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  TECTED);...retur
1ca70 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  n(CKR_TOKEN_WRIT
1ca80 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a  E_PROTECTED);.}.
1ca90 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70  ./* We don't sup
1caa0 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64  port this method
1cab0 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  . */.CK_DEFINE_F
1cac0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1cad0 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53 53  _SetPIN)(CK_SESS
1cae0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1caf0 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ion, CK_UTF8CHAR
1cb00 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b  _PTR pOldPin, CK
1cb10 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c  _ULONG ulOldPinL
1cb20 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  en, CK_UTF8CHAR_
1cb30 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f  PTR pNewPin, CK_
1cb40 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65  ULONG ulNewPinLe
1cb50 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
1cb60 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1cb70 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1cb80 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1cb90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1cba0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1cbb0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1cbc0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1cbd0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1cbe0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1cbf0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1cc00 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1cc10 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1cc20 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1cc30 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1cc40 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1cc50 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1cc60 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1cc70 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1cc80 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1cc90 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69  _RV, C_OpenSessi
1cca0 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  on)(CK_SLOT_ID s
1ccb0 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20  lotID, CK_FLAGS 
1ccc0 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50  flags, CK_VOID_P
1ccd0 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c  TR pApplication,
1cce0 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66   CK_NOTIFY notif
1ccf0 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y, CK_SESSION_HA
1cd00 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73 69  NDLE_PTR phSessi
1cd10 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  on) {..unsigned 
1cd20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d  long idx;..int m
1cd30 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
1cd40 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20  t found_session 
1cd50 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  = 0;...CACKEY_DE
1cd60 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1cd70 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c  ed.");...if ((fl
1cd80 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41 4c  ags & CKF_SERIAL
1cd90 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46  _SESSION) != CKF
1cda0 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29  _SERIAL_SESSION)
1cdb0 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f   {...return(CKR_
1cdc0 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c  SESSION_PARALLEL
1cdd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1cde0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1cdf0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1ce00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ce10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ce20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1ce30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ce40 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1ce50 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1ce60 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
1ce70 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
1ce80 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1ce90 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1cea0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
1ceb0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1cec0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ced0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1cee0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
1cef0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
1cf00 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
1cf10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
1cf20 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
1cf30 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1cf40 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1cf50 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1cf60 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1cf70 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1cf80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cf90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1cfa0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1cfb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1cfc0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1cfd0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1cfe0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
1cff0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
1d000 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d010 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1d020 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1d030 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
1d040 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
1d050 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
1d060 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1d070 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1d080 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1d090 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1d0a0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56  ALID);..}.../* V
1d0b0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
1d0c0 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ard is actually 
1d0d0 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a  in the slot. */.
1d0e0 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 74  ./* XXX: Check t
1d0f0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73  o make sure this
1d100 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43 53 23   is in the PKCS#
1d110 31 31 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  11 specification
1d120 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f   */..if (cackey_
1d130 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63  token_present(&c
1d140 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1d150 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50  ID]) != CACKEY_P
1d160 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
1d170 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  NT) {...CACKEY_D
1d180 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d190 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72  or.  Card not pr
1d1a0 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  esent.  Returnin
1d1b0 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  g CKR_DEVICE_REM
1d1c0 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65  OVED");....cacke
1d1d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1d1e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1d1f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45  ...return(CKR_DE
1d200 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09  VICE_REMOVED);..
1d210 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31  }...for (idx = 1
1d220 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
1d230 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
1d240 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1d250 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
1d260 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21  idx++) {...if (!
1d270 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d280 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
1d290 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20  ..found_session 
1d2a0 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73  = 1;.....*phSess
1d2b0 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63  ion = idx;.....c
1d2c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1d2d0 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a  dx].active = 1;.
1d2e0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1d2f0 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d  ns[idx].slotID =
1d300 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b   slotID;....cack
1d310 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1d320 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f  .state = CKS_RO_
1d330 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a  PUBLIC_SESSION;.
1d340 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1d350 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20  ns[idx].flags = 
1d360 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79  flags;....cackey
1d370 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75  _sessions[idx].u
1d380 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30  lDeviceError = 0
1d390 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1d3a0 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69  ions[idx].pAppli
1d3b0 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63  cation = pApplic
1d3c0 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79  ation;....cackey
1d3d0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e  _sessions[idx].N
1d3e0 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a  otify = notify;.
1d3f0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
1d400 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74  ons[idx].identit
1d410 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63  ies = NULL;....c
1d420 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1d430 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  dx].identities_c
1d440 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61  ount = 0;.....ca
1d450 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1d460 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  x].search_active
1d470 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
1d480 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
1d490 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ign_active = 0;.
1d4a0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
1d4b0 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74  ons[idx].decrypt
1d4c0 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
1d4d0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1d4e0 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
1d4f0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69   = cackey_read_i
1d500 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65  dentities(&cacke
1d510 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
1d520 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
1d530 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65  s[idx].identitie
1d540 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62  s_count);......b
1d550 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  reak;...}..}...m
1d560 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1d570 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1d580 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1d590 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1d5a0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1d5b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d5c0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1d5d0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1d5e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1d5f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1d600 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73  }...if (!found_s
1d610 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b  ession) {...CACK
1d620 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d630 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53  "Returning CKR_S
1d640 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69  ESSION_COUNT (%i
1d650 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  )", CKR_SESSION_
1d660 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72  COUNT);....retur
1d670 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f  n(CKR_SESSION_CO
1d680 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  UNT);..}...CACKE
1d690 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d6a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1d6b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1d6c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1d6d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1d6e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1d6f0 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28  C_CloseSession)(
1d700 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1d710 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69  E hSession) {..i
1d720 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1d730 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d740 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1d750 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1d760 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1d770 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d780 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1d790 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1d7a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d7b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1d7c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1d7d0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
1d7e0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
1d7f0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1d800 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1d810 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1d820 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
1d830 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d840 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1d850 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
1d860 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1d870 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1d880 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1d890 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1d8a0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1d8b0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1d8c0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1d8d0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1d8e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d8f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1d900 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1d910 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1d920 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1d930 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1d940 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1d950 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
1d960 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1d970 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1d980 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1d990 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d9a0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
1d9b0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1d9c0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1d9d0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1d9e0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
1d9f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1da00 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 63  ].active = 0;..c
1da10 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74  ackey_free_ident
1da20 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73  ities(cackey_ses
1da30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1da40 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b  identities, cack
1da50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1da60 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1da70 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78  _count);...mutex
1da80 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1da90 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1daa0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1dab0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1dac0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1dad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1dae0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1daf0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1db00 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1db10 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1db20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1db30 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1db40 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1db50 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1db60 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1db70 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1db80 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53  _RV, C_CloseAllS
1db90 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54  essions)(CK_SLOT
1dba0 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75  _ID slotID) {..u
1dbb0 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e  int32_t idx;..in
1dbc0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1dbd0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1dbe0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1dbf0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1dc00 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1dc10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1dc20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1dc30 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1dc40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1dc50 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1dc60 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1dc70 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
1dc80 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
1dc90 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1dca0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1dcb0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
1dcc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1dcd0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1dce0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1dcf0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
1dd00 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
1dd10 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
1dd20 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
1dd30 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
1dd40 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1dd50 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1dd60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1dd70 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1dd80 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1dd90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1dda0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1ddb0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1ddc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1ddd0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1dde0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
1ddf0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
1de00 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
1de10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1de20 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1de30 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1de40 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
1de50 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1de60 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1de70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1de80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1de90 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
1dea0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
1deb0 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  ID);..}...for (i
1dec0 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
1ded0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1dee0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1def0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1df00 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
1df10 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
1df20 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
1df30 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65  ) {....if (cacke
1df40 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1df50 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44  slotID != slotID
1df60 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  ) {.....continue
1df70 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  ;....}.....cacke
1df80 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1df90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1dfa0 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  ...C_CloseSessio
1dfb0 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65  n(idx);....cacke
1dfc0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1dfd0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
1dfe0 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  }..}...mutex_ret
1dff0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1e000 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1e010 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1e020 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1e030 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1e040 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e050 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1e060 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1e070 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1e080 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1e090 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e0a0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1e0b0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1e0c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1e0d0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1e0e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1e0f0 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66   C_GetSessionInf
1e100 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  o)(CK_SESSION_HA
1e110 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1e120 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50  K_SESSION_INFO_P
1e130 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74  TR pInfo) {..int
1e140 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
1e150 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e160 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1e170 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
1e180 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1e190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e1a0 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
1e1b0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1e1c0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1e1d0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
1e1e0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1e1f0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1e200 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e210 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1e220 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1e230 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1e240 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1e250 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
1e260 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
1e270 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
1e280 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
1e290 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1e2a0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
1e2b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e2c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e2d0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
1e2e0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
1e2f0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1e300 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1e310 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1e320 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1e330 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1e340 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1e350 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1e360 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e370 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e380 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1e390 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1e3a0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1e3b0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
1e3c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1e3d0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
1e3e0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1e3f0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1e400 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1e410 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e420 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1e430 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1e440 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1e450 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1e460 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49  NVALID);..}...pI
1e470 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61  nfo->slotID = ca
1e480 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1e490 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
1e4a0 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20  .pInfo->state = 
1e4b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1e4c0 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b  hSession].state;
1e4d0 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
1e4e0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
1e4f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73  [hSession].flags
1e500 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69  ;..pInfo->ulDevi
1e510 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79  ceError = cackey
1e520 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1e530 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f  on].ulDeviceErro
1e540 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  r;...mutex_retva
1e550 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1e560 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1e570 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1e580 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1e590 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e5a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e5b0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1e5c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e5d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1e5e0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
1e5f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1e600 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1e610 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1e620 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1e630 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1e640 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1e650 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _GetOperationSta
1e660 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
1e670 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1e680 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65  CK_BYTE_PTR pOpe
1e690 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f  rationState, CK_
1e6a0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65  ULONG_PTR pulOpe
1e6b0 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20  rationStateLen) 
1e6c0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1e6d0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1e6e0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1e6f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1e700 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e710 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1e720 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1e730 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e740 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1e750 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1e760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e770 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1e780 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1e790 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1e7a0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1e7b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1e7c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1e7d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1e7e0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1e7f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1e800 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  , C_SetOperation
1e810 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  State)(CK_SESSIO
1e820 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1e830 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1e840 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20  OperationState, 
1e850 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61  CK_ULONG ulOpera
1e860 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b  tionStateLen, CK
1e870 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
1e880 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43  EncryptionKey, C
1e890 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
1e8a0 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b  hAuthenticationK
1e8b0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
1e8c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1e8d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1e8e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1e8f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e900 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e910 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1e920 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e930 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1e940 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1e950 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1e960 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1e970 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1e980 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1e990 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1e9a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e9b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1e9c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1e9d0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1e9e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1e9f0 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43  K_RV, C_Login)(C
1ea00 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1ea10 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53   hSession, CK_US
1ea20 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65  ER_TYPE userType
1ea30 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
1ea40 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  R pPin, CK_ULONG
1ea50 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b   ulPinLen) {..CK
1ea60 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
1ea70 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1ea80 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72  al;..int tries_r
1ea90 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c  emaining;..int l
1eaa0 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  ogin_ret;...CACK
1eab0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1eac0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1ead0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1eae0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1eaf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1eb00 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1eb10 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1eb20 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1eb30 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1eb40 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
1eb50 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
1eb60 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
1eb70 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1eb80 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1eb90 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1eba0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1ebb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ebc0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
1ebd0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
1ebe0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1ebf0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1ec00 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  LID);..}...if (u
1ec10 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55  serType != CKU_U
1ec20 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  SER) {...CACKEY_
1ec30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ec40 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75  ror.  We only su
1ec50 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c  pport USER mode,
1ec60 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d   asked for %lu m
1ec70 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  ode.", (unsigned
1ec80 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29   long) userType)
1ec90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55  ....return(CKR_U
1eca0 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  SER_TYPE_INVALID
1ecb0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1ecc0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1ecd0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1ece0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1ecf0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1ed00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ed10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ed20 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1ed30 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1ed40 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1ed50 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
1ed60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1ed70 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
1ed80 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1ed90 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1eda0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1edb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1edc0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1edd0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1ede0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1edf0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1ee00 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c  NVALID);..}...sl
1ee10 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
1ee20 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1ee30 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
1ee40 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
1ee50 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
1ee60 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1ee70 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1ee80 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
1ee90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1eea0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
1eeb0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
1eec0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
1eed0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
1eee0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
1eef0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ef00 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1ef10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1ef20 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
1ef30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ef40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ef50 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1ef60 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1ef70 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
1ef80 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
1ef90 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
1efa0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1efb0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1efc0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1efd0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1efe0 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  login_ret = cack
1eff0 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79  ey_login(&cackey
1f000 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
1f010 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20  pPin, ulPinLen, 
1f020 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  &tries_remaining
1f030 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65  );..if (login_re
1f040 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
1f050 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b 65  _S_OK) {...cacke
1f060 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1f070 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1f080 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74  ...if (login_ret
1f090 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
1f0a0 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43  E_LOCKED) {....C
1f0b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f0c0 54 46 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65  TF("Error.  Toke
1f0d0 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a  n is locked.");.
1f0e0 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1f0f0 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
1f100 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52  lags |= CKF_USER
1f110 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09  _PIN_LOCKED;....
1f120 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f  .return(CKR_PIN_
1f130 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73  LOCKED);...} els
1f140 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20  e if (login_ret 
1f150 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
1f160 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41  _BADPIN) {....CA
1f170 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f180 46 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c  F("Error.  Inval
1f190 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63  id PIN.");.....c
1f1a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1f1b0 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
1f1c0 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f  |= CKF_USER_PIN_
1f1d0 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69  COUNT_LOW;.....i
1f1e0 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  f (tries_remaini
1f1f0 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63  ng == 1) {.....c
1f200 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1f210 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
1f220 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f  |= CKF_USER_PIN_
1f230 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a  FINAL_TRY;....}.
1f240 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
1f250 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09  IN_INCORRECT);..
1f260 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
1f270 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f280 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  .  Unknown error
1f290 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63   returned from c
1f2a0 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25  ackey_login() (%
1f2b0 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b  i)", login_ret);
1f2c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1f2d0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1f2e0 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  }...cackey_slots
1f2f0 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
1f300 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53  lags &= ~(CKF_US
1f310 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20  ER_PIN_LOCKED | 
1f320 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55  CKF_USER_PIN_COU
1f330 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47  NT_LOW | CKF_LOG
1f340 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b  IN_REQUIRED | CK
1f350 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c  F_USER_PIN_FINAL
1f360 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f  _TRY);...cackey_
1f370 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f380 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52  n].state = CKS_R
1f390 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53  O_USER_FUNCTIONS
1f3a0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
1f3b0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1f3c0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1f3d0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1f3e0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1f3f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f400 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f410 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1f420 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f430 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1f440 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1f450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1f460 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1f470 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1f480 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1f490 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1f4a0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1f4b0 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49  Logout)(CK_SESSI
1f4c0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1f4d0 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  on) {..CK_SLOT_I
1f4e0 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d  D slotID;..int m
1f4f0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
1f500 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f510 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1f520 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1f530 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1f540 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f550 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1f560 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1f570 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1f580 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1f590 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1f5a0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
1f5b0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
1f5c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1f5d0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1f5e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f5f0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1f600 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f610 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
1f620 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
1f630 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1f640 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1f650 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1f660 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1f670 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1f680 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1f690 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1f6a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1f6b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f6c0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1f6d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1f6e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1f6f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1f700 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1f710 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1f720 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1f730 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1f740 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1f750 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f760 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1f770 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1f780 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1f790 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1f7a0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1f7b0 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63  }...slotID = cac
1f7c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1f7d0 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a  ssion].slotID;..
1f7e0 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
1f7f0 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
1f800 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1f810 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1f820 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
1f830 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f840 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1f850 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1f860 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
1f870 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
1f880 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
1f890 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1f8a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1f8b0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1f8c0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
1f8d0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
1f8e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f8f0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1f900 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1f910 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
1f920 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
1f930 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
1f940 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1f950 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f960 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f970 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1f980 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
1f990 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1f9a0 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50  state = CKS_RO_P
1f9b0 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09  UBLIC_SESSION;..
1f9c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1f9d0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
1f9e0 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   = CKF_LOGIN_REQ
1f9f0 55 49 52 45 44 3b 0a 0a 09 6d 75 74 65 78 5f 72  UIRED;...mutex_r
1fa00 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1fa10 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1fa20 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1fa30 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1fa40 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1fa50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1fa60 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1fa70 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1fa80 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1fa90 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
1faa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fab0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1fac0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1fad0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1fae0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1faf0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1fb00 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63  V, C_CreateObjec
1fb10 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
1fb20 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1fb30 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
1fb40 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
1fb50 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f  ONG ulCount, CK_
1fb60 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
1fb70 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43  R phObject) {..C
1fb80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fb90 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1fba0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1fbb0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1fbc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fbd0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1fbe0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1fbf0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1fc00 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1fc10 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1fc20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fc30 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1fc40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1fc50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1fc60 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1fc70 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1fc80 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1fc90 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1fca0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1fcb0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1fcc0 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53  CopyObject)(CK_S
1fcd0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1fce0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
1fcf0 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
1fd00 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
1fd10 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
1fd20 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20  _ULONG ulCount, 
1fd30 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1fd40 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74  _PTR phNewObject
1fd50 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1fd60 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1fd70 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1fd80 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1fd90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fda0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fdb0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1fdc0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1fdd0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1fde0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1fdf0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fe00 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1fe10 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1fe20 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1fe30 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1fe40 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1fe50 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1fe60 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1fe70 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1fe80 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1fe90 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a  RV, C_DestroyObj
1fea0 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ect)(CK_SESSION_
1feb0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1fec0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
1fed0 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41  E hObject) {..CA
1fee0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fef0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1ff00 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1ff10 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1ff20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ff30 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1ff40 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1ff50 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1ff60 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1ff70 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1ff80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ff90 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1ffa0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1ffb0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1ffc0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1ffd0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1ffe0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1fff0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
20000 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
20010 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
20020 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b  etObjectSize)(CK
20030 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
20040 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
20050 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
20060 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ct, CK_ULONG_PTR
20070 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43   pulSize) {..CAC
20080 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20090 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
200a0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
200b0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
200c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
200d0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
200e0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
200f0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
20100 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
20110 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
20120 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20130 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
20140 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
20150 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
20160 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
20170 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
20180 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
20190 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
201a0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
201b0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
201c0 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29  tAttributeValue)
201d0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
201e0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
201f0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
20200 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42  bject, CK_ATTRIB
20210 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
20220 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
20230 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49  unt) {..CK_ATTRI
20240 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b  BUTE *curr_attr;
20250 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
20260 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
20270 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ty;..unsigned lo
20280 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c  ng identity_idx,
20290 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f   attr_idx, sess_
202a0 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64  attr_idx, num_id
202b0 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  s;..int mutex_re
202c0 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74  tval;..CK_RV ret
202d0 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43  val = CKR_OK;..C
202e0 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75  K_VOID_PTR pValu
202f0 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56  e;..CK_ULONG ulV
20300 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45  alueLen;...CACKE
20310 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20320 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
20330 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
20340 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
20350 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20360 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
20370 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20380 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20390 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
203a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
203b0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
203c0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
203d0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
203e0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
203f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
20400 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20410 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20420 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
20430 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
20440 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
20450 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
20460 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f  ID);..}...if (hO
20470 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09  bject == 0) {...
20480 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20490 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a  NTF("Error.  Obj
204a0 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ect handle out o
204b0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
204c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45  .return(CKR_OBJE
204d0 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  CT_HANDLE_INVALI
204e0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43  D);..}...if (ulC
204f0 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  ount == 0) {.../
20500 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c  * Short circuit,
20510 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73   if zero objects
20520 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20   were specified 
20530 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d  return zero item
20540 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f  s immediately */
20550 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20560 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
20570 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73  g CKR_OK (%i) (s
20580 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20  hort circuit)", 
20590 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
205a0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
205b0 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d  .if (pTemplate =
205c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
205d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
205e0 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61  "Error.  pTempla
205f0 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  te is NULL.");..
20600 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
20610 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
20620 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d  ..identity_idx =
20630 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09   hObject - 1;...
20640 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
20650 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
20660 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
20670 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
20680 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
20690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
206a0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
206b0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
206c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
206d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
206e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
206f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20700 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
20710 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20720 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20730 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
20740 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20750 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
20760 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
20770 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
20780 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
20790 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20  ..}...num_ids = 
207a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
207b0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
207c0 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66  ties_count;...if
207d0 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e   (identity_idx >
207e0 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63  = num_ids) {...c
207f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20800 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20810 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
20820 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20830 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c  r.  Object handl
20840 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  e out of range. 
20850 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20   identity_idx = 
20860 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25  %lu, num_ids = %
20870 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu.", (unsigned 
20880 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69  long) identity_i
20890 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  dx, (unsigned lo
208a0 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09  ng) num_ids);...
208b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45  .return(CKR_OBJE
208c0 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  CT_HANDLE_INVALI
208d0 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74  D);..}...identit
208e0 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  y = &cackey_sess
208f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
20900 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69  dentities[identi
20910 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28  ty_idx];...for (
20920 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74  attr_idx = 0; at
20930 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74  tr_idx < ulCount
20940 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  ; attr_idx++) {.
20950 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70  ..curr_attr = &p
20960 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64  Template[attr_id
20970 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20  x];....pValue = 
20980 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c  NULL;...ulValueL
20990 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
209a0 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  1;....CACKEY_DEB
209b0 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69  UG_PRINTF("Looki
209c0 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65  ng for attribute
209d0 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69   0x%08lx (identi
209e0 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75  ty:%lu) ...", (u
209f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
20a00 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28  rr_attr->type, (
20a10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
20a20 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09  dentity_idx);...
20a30 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f  .for (sess_attr_
20a40 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74  idx = 0; sess_at
20a50 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74  tr_idx < identit
20a60 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  y->attributes_co
20a70 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  unt; sess_attr_i
20a80 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69  dx++) {....if (i
20a90 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
20aa0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
20ab0 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f  x].type == curr_
20ac0 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09  attr->type) {...
20ad0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20ae0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e  RINTF(" ... foun
20af0 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25  d it, pValue = %
20b00 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  p, ulValueLen = 
20b10 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e  %lu", identity->
20b20 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
20b30 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65  attr_idx].pValue
20b40 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  , identity->attr
20b50 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
20b60 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
20b70 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c  );..........pVal
20b80 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61  ue = identity->a
20b90 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
20ba0 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b  ttr_idx].pValue;
20bb0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
20bc0 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  = identity->attr
20bd0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
20be0 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
20bf0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
20c00 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61   (curr_attr->pVa
20c10 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b  lue && pValue) {
20c20 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
20c30 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d  r->ulValueLen >=
20c40 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09   ulValueLen) {..
20c50 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
20c60 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61  ttr->pValue, pVa
20c70 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29  lue, ulValueLen)
20c80 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
20c90 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
20ca0 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
20cb0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ..retval = CKR_B
20cc0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
20cd0 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72  ....}...}....cur
20ce0 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
20cf0 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  en = ulValueLen;
20d00 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
20d10 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
20d20 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
20d30 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
20d40 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
20d50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20d60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20d70 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
20d80 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
20d90 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
20da0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72  ROR);..}...if (r
20db0 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54  etval == CKR_ATT
20dc0 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41  RIBUTE_TYPE_INVA
20dd0 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  LID) {...CACKEY_
20de0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20df0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52  turning CKR_ATTR
20e00 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c  IBUTE_TYPE_INVAL
20e10 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  ID (%i)", (int) 
20e20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
20e30 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43   if (retval == C
20e40 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
20e50 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ALL) {...CACKEY_
20e60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20e70 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46  turning CKR_BUFF
20e80 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69  ER_TOO_SMALL (%i
20e90 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  )", (int) retval
20ea0 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72  );..} else if (r
20eb0 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29  etval == CKR_OK)
20ec0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20ed0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20ee0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
20ef0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
20f00 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
20f10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20f20 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
20f30 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
20f40 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  .}...return(retv
20f50 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  al);.}..CK_DEFIN
20f60 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
20f70 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  , C_SetAttribute
20f80 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f  Value)(CK_SESSIO
20f90 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
20fa0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
20fb0 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
20fc0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
20fd0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
20fe0 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41  G ulCount) {..CA
20ff0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21000 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21010 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
21020 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
21030 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21040 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
21050 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
21060 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
21070 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
21080 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
21090 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
210a0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
210b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
210c0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
210d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
210e0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
210f0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
21100 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
21110 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
21120 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
21130 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28  indObjectsInit)(
21140 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
21150 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41  E hSession, CK_A
21160 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
21170 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
21180 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f   ulCount) {..CK_
21190 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
211a0 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09  .CK_ULONG idx;..
211b0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
211c0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
211d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
211e0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
211f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
21200 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21210 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21220 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
21230 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21240 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
21250 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
21260 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
21270 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
21280 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
21290 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
212a0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
212b0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
212c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
212d0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
212e0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
212f0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
21300 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
21310 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
21320 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
21330 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
21340 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21350 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
21360 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
21370 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21380 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
21390 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
213a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
213b0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
213c0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
213d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
213e0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
213f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
21400 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
21410 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
21420 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21430 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
21440 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
21450 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
21460 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
21470 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
21480 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
21490 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
214a0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
214b0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
214c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
214d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
214e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
214f0 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63  earch already ac
21500 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
21510 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
21520 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
21530 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  .slotID = cackey
21540 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21550 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66  on].slotID;...if
21560 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
21570 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
21580 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
21590 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
215a0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
215b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
215c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
215d0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
215e0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
215f0 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
21600 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
21610 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
21620 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
21630 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
21640 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
21650 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
21660 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21670 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
21680 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
21690 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
216a0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
216b0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
216c0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
216d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
216e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
216f0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
21700 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
21710 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74  ots[slotID].slot
21720 5f 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b  _reset) {...CACK
21730 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21740 22 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65  "The slot has be
21750 65 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 77  en reset since w
21760 65 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f  e last looked fo
21770 72 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20  r identities -- 
21780 72 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09  rescanning");...
21790 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
217a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
217b0 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c  dentities != NUL
217c0 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66  L) {....cackey_f
217d0 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63  ree_identities(c
217e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
217f0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
21800 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ies, cackey_sess
21810 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
21820 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
21830 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
21840 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21850 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c  identities = NUL
21860 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  L;....cackey_ses
21870 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21880 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
21890 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20   = 0;...}....if 
218a0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
218b0 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e  otID].label != N
218c0 55 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63  ULL) {....free(c
218d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
218e0 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63  ID].label);....c
218f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
21900 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ID].label = NULL
21910 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
21920 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
21930 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
21940 6f 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79  otID]);...cackey
21950 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73  _slots[slotID].s
21960 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09  lot_reset = 0;..
21970 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
21980 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21990 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20  ].identities == 
219a0 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
219b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
219c0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  on].identities =
219d0 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65   cackey_read_ide
219e0 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f  ntities(&cackey_
219f0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26  slots[slotID], &
21a00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21a10 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
21a20 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a  ties_count);..}.
21a30 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20  ..if (pTemplate 
21a40 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20  != NULL) {...if 
21a50 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b  (ulCount != 0) {
21a60 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21a70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
21a80 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
21a90 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63   = ulCount;....c
21aa0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21ab0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
21ac0 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75  query = malloc(u
21ad0 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28  lCount * sizeof(
21ae0 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09  *pTemplate));...
21af0 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f  ..memcpy(cackey_
21b00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21b10 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c  n].search_query,
21b20 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f   pTemplate, ulCo
21b30 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54  unt * sizeof(*pT
21b40 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f  emplate));....fo
21b50 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
21b60 3c 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b  < ulCount; idx++
21b70 29 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d  ) {.....if (pTem
21b80 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c  plate[idx].ulVal
21b90 75 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  ueLen == 0) {...
21ba0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
21bb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
21bc0 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
21bd0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  Value = NULL;...
21be0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
21bf0 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ..}......cackey_
21c00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21c10 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
21c20 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61  idx].pValue = ma
21c30 6c 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69  lloc(pTemplate[i
21c40 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
21c50 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  ......if (cackey
21c60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21c70 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
21c80 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a  [idx].pValue) {.
21c90 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b  .....memcpy(cack
21ca0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21cb0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
21cc0 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  ry[idx].pValue, 
21cd0 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70  pTemplate[idx].p
21ce0 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65  Value, pTemplate
21cf0 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  [idx].ulValueLen
21d00 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09  );.....}....}...
21d10 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b  } else {....cack
21d20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21d30 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
21d40 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  ry_count = 0;...
21d50 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
21d60 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
21d70 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a  h_query = NULL;.
21d80 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
21d90 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30  if (ulCount != 0
21da0 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  ) {....cackey_mu
21db0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21dc0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
21dd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21de0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
21df0 72 63 68 20 71 75 65 72 79 20 73 70 65 63 69 66  rch query specif
21e00 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74  ied as NULL, but
21e10 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79   number of query
21e20 20 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69   terms not speci
21e30 66 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09  fied as 0.");...
21e40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
21e50 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d  UMENTS_BAD);...}
21e60 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21e70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
21e80 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
21e90 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
21ea0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21eb0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d  ].search_query =
21ec0 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b   NULL;..}...cack
21ed0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21ee0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
21ef0 69 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79  ive = 1;..cackey
21f00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21f10 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
21f20 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f  id = 0;...mutex_
21f30 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
21f40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21f50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21f60 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21f70 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21f80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21f90 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
21fa0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
21fb0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
21fc0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
21fd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21fe0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
21ff0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
22000 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
22010 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  R_OK);.}..static
22020 20 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73   int cackey_pkcs
22030 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69  11_compare_attri
22040 62 75 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55  butes(CK_ATTRIBU
22050 54 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42  TE *a, CK_ATTRIB
22060 55 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67  UTE *b) {..unsig
22070 6e 65 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62  ned char *smallb
22080 75 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09  uf, *largebuf;..
22090 73 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f  size_t smallbuf_
220a0 6c 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65  len, largebuf_le
220b0 6e 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65  n;...if (a->type
220c0 20 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09   != b->type) {..
220d0 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a  .return(0);..}..
220e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
220f0 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f  INTF("    ... fo
22100 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70  und matching typ
22110 65 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  e ...");...CACKE
22120 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
22130 28 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61  ("    ... our va
22140 6c 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65  lue:", a->pValue
22150 2c 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29  , a->ulValueLen)
22160 3b 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75  ;...if (b->pValu
22170 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
22180 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22190 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
221a0 6f 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61  ound wildcard ma
221b0 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  tch");....return
221c0 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d  (1);..}...if (a-
221d0 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29  >pValue == NULL)
221e0 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a   {...return(0);.
221f0 09 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56  .}.. .if (b->ulV
22200 61 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c  alueLen == a->ul
22210 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63  ValueLen && memc
22220 6d 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d  mp(a->pValue, b-
22230 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61  >pValue, b->ulVa
22240 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a  lueLen) == 0) {.
22250 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22260 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e  RINTF("       ..
22270 2e 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61  . found exact ma
22280 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  tch");....return
22290 28 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  (1);..}...switch
222a0 20 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63   (a->type) {...c
222b0 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a  ase CKA_MODULUS:
222c0 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c  ....if (a->ulVal
222d0 75 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61  ueLen == b->ulVa
222e0 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72  lueLen) {.....br
222f0 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  eak;....}.....if
22300 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20   (a->ulValueLen 
22310 3e 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29  > b->ulValueLen)
22320 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20   {.....smallbuf 
22330 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09  = b->pValue;....
22340 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20  .smallbuf_len = 
22350 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a  b->ulValueLen;..
22360 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61  ....largebuf = a
22370 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61  ->pValue;.....la
22380 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e  rgebuf_len = a->
22390 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d  ulValueLen;....}
223a0 20 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c   else {.....smal
223b0 6c 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65  lbuf = a->pValue
223c0 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c  ;.....smallbuf_l
223d0 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c  en = a->ulValueL
223e0 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75  en;......largebu
223f0 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09  f = b->pValue;..
22400 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20  ...largebuf_len 
22410 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b  = b->ulValueLen;
22420 0a 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b  ....}.....for (;
22430 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d   largebuf_len !=
22440 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c   smallbuf_len; l
22450 61 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62  argebuf++,largeb
22460 75 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09  uf_len--) {.....
22470 69 66 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20  if (largebuf[0] 
22480 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65  != 0) {......bre
22490 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  ak;.....}....}..
224a0 09 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f  ...if (largebuf_
224b0 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f  len != smallbuf_
224c0 6c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  len) {.....break
224d0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d  ;....}.....if (m
224e0 65 6d 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20  emcmp(largebuf, 
224f0 73 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62  smallbuf, smallb
22500 75 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a  uf_len) == 0) {.
22510 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
22520 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20  _PRINTF("       
22530 2e 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78  ... found approx
22540 69 6d 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a  imate match");..
22550 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
22560 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
22570 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  }...return(0);.}
22580 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
22590 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
225a0 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45  ndObjects)(CK_SE
225b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
225c0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
225d0 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62  _HANDLE_PTR phOb
225e0 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ject, CK_ULONG u
225f0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c  lMaxObjectCount,
22600 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
22610 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a  lObjectCount) {.
22620 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
22630 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64  dentity *curr_id
22640 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  ;..CK_ATTRIBUTE 
22650 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f  *curr_attr;..CK_
22660 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64  ULONG curr_id_id
22670 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  x, curr_out_id_i
22680 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64  dx, curr_attr_id
22690 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  x, sess_attr_idx
226a0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63  ;..CK_ULONG matc
226b0 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f  hed_count, prev_
226c0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09  matched_count;..
226d0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
226e0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
226f0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22700 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
22710 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
22720 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22730 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22740 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22750 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22760 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22770 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22780 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 43  ..if (pulObjectC
22790 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
227a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
227b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
227c0 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 73  ulObjectCount is
227d0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
227e0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
227f0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
22800 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c  (phObject == NUL
22810 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74  L && ulMaxObject
22820 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  Count == 0) {...
22830 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
22840 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74  , if zero object
22850 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
22860 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65   return zero ite
22870 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a  ms immediately *
22880 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  /...*pulObjectCo
22890 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b  unt = 0;....CACK
228a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
228b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
228c0 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
228d0 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
228e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
228f0 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68  OK);..}...if (ph
22900 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20  Object == NULL) 
22910 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22920 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22930 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c   phObject is NUL
22940 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
22950 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
22960 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d  D);..}...if (ulM
22970 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d  axObjectCount ==
22980 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
22990 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
229a0 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d  or.  Maximum num
229b0 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 73  ber of objects s
229c0 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72 6f  pecified as zero
229d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
229e0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
229f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
22a00 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
22a10 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
22a20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22a30 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
22a40 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
22a50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22a60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22a70 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
22a80 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
22a90 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
22aa0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
22ab0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
22ac0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
22ad0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
22ae0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
22af0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
22b00 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
22b10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22b20 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
22b30 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22b40 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
22b50 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
22b60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22b70 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
22b80 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
22b90 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
22ba0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
22bb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22bc0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
22bd0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
22be0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
22bf0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
22c00 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
22c10 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
22c20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
22c30 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
22c40 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
22c50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22c60 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
22c70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22c80 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74  ror.  Search not
22c90 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
22ca0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
22cb0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
22cc0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 75 72  LIZED);..}...cur
22cd0 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30  r_out_id_idx = 0
22ce0 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f  ;..for (curr_id_
22cf0 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  idx = cackey_ses
22d00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
22d10 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20  search_curr_id; 
22d20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61  curr_id_idx < ca
22d30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
22d40 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
22d50 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61  es_count && ulMa
22d60 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75  xObjectCount; cu
22d70 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09  rr_id_idx++) {..
22d80 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b  .curr_id = &cack
22d90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22da0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
22db0 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a  [curr_id_idx];..
22dc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22dd0 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e  RINTF("Processin
22de0 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c  g identity:%lu",
22df0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
22e00 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a   curr_id_idx);..
22e10 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20  ..matched_count 
22e20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72  = 0;....for (cur
22e30 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20  r_attr_idx = 0; 
22e40 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20  curr_attr_idx < 
22e50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22e60 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
22e70 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75  _query_count; cu
22e80 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  rr_attr_idx++) {
22e90 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64  ....prev_matched
22ea0 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64  _count = matched
22eb0 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72  _count;.....curr
22ec0 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f  _attr = &cackey_
22ed0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
22ee0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
22ef0 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a  curr_attr_idx];.
22f00 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
22f10 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b  _PRINTF("  Check
22f20 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74  ing for attribut
22f30 65 20 25 73 20 28 30 78 25 30 38 6c 78 29 20 69  e %s (0x%08lx) i
22f40 6e 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e  n identity:%i...
22f50 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
22f60 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54  FUNC_ATTRIBUTE_T
22f70 4f 5f 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d  O_STR(curr_attr-
22f80 3e 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65  >type), (unsigne
22f90 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
22fa0 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63  r->type, (int) c
22fb0 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09  urr_id_idx);....
22fc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22fd0 4e 54 42 55 46 28 22 20 20 20 20 56 61 6c 75 65  NTBUF("    Value
22fe0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20   looking for:", 
22ff0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
23000 65 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c  e, curr_attr->ul
23010 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66  ValueLen);.....f
23020 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64  or (sess_attr_id
23030 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72  x = 0; sess_attr
23040 5f 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e  _idx < curr_id->
23050 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
23060 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b  ; sess_attr_idx+
23070 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63  +) {.....if (cac
23080 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61  key_pkcs11_compa
23090 72 65 5f 61 74 74 72 69 62 75 74 65 73 28 26 63  re_attributes(&c
230a0 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
230b0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
230c0 5d 2c 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b  ], curr_attr)) {
230d0 0a 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f  ......matched_co
230e0 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65  unt++;.......bre
230f0 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  ak;.....}....}..
23100 09 09 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74  .../* If the att
23110 72 69 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74  ribute could not
23120 20 62 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20   be matched, do 
23130 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68  not try to match
23140 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72   additional attr
23150 69 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20  ibutes */....if 
23160 28 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f  (prev_matched_co
23170 75 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63  unt == matched_c
23180 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61  ount) {.....brea
23190 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  k;....}...}....i
231a0 66 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  f (matched_count
231b0 20 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69   == cackey_sessi
231c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
231d0 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
231e0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
231f0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
23200 2e 20 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75  . All %i attribu
23210 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20  tes checked for 
23220 66 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64  found, adding id
23230 65 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74  entity:%i to ret
23240 75 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e  urned list", (in
23250 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  t) cackey_sessio
23260 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
23270 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c  rch_query_count,
23280 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
23290 64 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63  dx);.....phObjec
232a0 74 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  t[curr_out_id_id
232b0 78 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78  x] = curr_id_idx
232c0 20 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f   + 1;.....ulMaxO
232d0 62 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09  bjectCount--;...
232e0 09 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  ..curr_out_id_id
232f0 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  x++;...} else {.
23300 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23310 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f  PRINTF("  ... No
23320 74 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66  t all %i (only f
23330 6f 75 6e 64 20 25 69 29 20 61 74 74 72 69 62 75  ound %i) attribu
23340 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20  tes checked for 
23350 66 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e  found, not addin
23360 67 20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20  g identity:%i", 
23370 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73  (int) cackey_ses
23380 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
23390 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
233a0 6e 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65  nt, (int) matche
233b0 64 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  d_count, (int) c
233c0 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d  urr_id_idx);...}
233d0 0a 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  ..}..cackey_sess
233e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
233f0 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20  earch_curr_id = 
23400 63 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70  curr_id_idx;..*p
23410 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20  ulObjectCount = 
23420 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b  curr_out_id_idx;
23430 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
23440 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
23450 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
23460 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
23470 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
23480 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23490 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
234a0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
234b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
234c0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
234d0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
234e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
234f0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
23500 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20  i), num objects 
23510 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20  = %lu", CKR_OK, 
23520 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29  *pulObjectCount)
23530 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
23540 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
23550 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23560 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69   C_FindObjectsFi
23570 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
23580 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
23590 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78   {..CK_ULONG idx
235a0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
235b0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
235c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
235d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
235e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
235f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23600 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23610 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
23620 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23630 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
23640 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
23650 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
23660 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
23670 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
23680 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
23690 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
236a0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
236b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
236c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
236d0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
236e0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
236f0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
23700 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
23710 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
23720 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
23730 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
23740 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
23750 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
23760 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23770 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23780 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
23790 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
237a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
237b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
237c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
237d0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
237e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
237f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
23800 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
23810 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23820 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
23830 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
23840 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
23850 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
23860 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
23870 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
23880 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
23890 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  h_active) {...ca
238a0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
238b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
238c0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
238d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
238e0 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63  .  Search not ac
238f0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
23900 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
23910 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
23920 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ED);..}...cackey
23930 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23940 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
23950 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28 69 64  e = 0;...for (id
23960 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 61 63  x = 0; idx < cac
23970 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
23980 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
23990 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  ery_count; idx++
239a0 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
239b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
239c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
239d0 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a  [idx].pValue) {.
239e0 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
239f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23a00 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
23a10 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09 09 7d  dx].pValue);...}
23a20 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
23a30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23a40 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
23a50 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65  ) {...free(cacke
23a60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23a70 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
23a80 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  y);..}...mutex_r
23a90 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
23aa0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23ab0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
23ac0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
23ad0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
23ae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23af0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
23b00 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
23b10 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
23b20 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
23b30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23b40 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
23b50 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
23b60 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
23b70 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
23b80 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
23b90 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74  V, C_EncryptInit
23ba0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
23bb0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
23bc0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
23bd0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
23be0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
23bf0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
23c00 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
23c10 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
23c20 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
23c30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23c40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23c50 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
23c60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23c70 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
23c80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
23c90 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23ca0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
23cb0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
23cc0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
23cd0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
23ce0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
23cf0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
23d00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23d10 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
23d20 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23d30 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28 43  RV, C_Encrypt)(C
23d40 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
23d50 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
23d60 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
23d70 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
23d80 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
23d90 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b  ncryptedData, CK
23da0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e  _ULONG_PTR pulEn
23db0 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29 20  cryptedDataLen) 
23dc0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
23dd0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
23de0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
23df0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
23e00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23e10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
23e20 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
23e30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23e40 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
23e50 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
23e60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23e70 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
23e80 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23e90 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
23ea0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
23eb0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
23ec0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
23ed0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23ee0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
23ef0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
23f00 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  , C_EncryptUpdat
23f10 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
23f20 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
23f30 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
23f40 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
23f50 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
23f60 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
23f70 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
23f80 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
23f90 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
23fa0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
23fb0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
23fc0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
23fd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23fe0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23ff0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
24000 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
24010 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
24020 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
24030 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
24040 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24050 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
24060 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
24070 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
24080 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
24090 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
240a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
240b0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
240c0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
240d0 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 46  K_RV, C_EncryptF
240e0 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
240f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
24100 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c  , CK_BYTE_PTR pL
24110 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74  astEncryptedPart
24120 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
24130 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50  ulLastEncryptedP
24140 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
24150 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24160 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
24170 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
24180 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
24190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
241a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
241b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
241c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
241d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
241e0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
241f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
24200 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
24210 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24220 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
24230 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24240 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
24250 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
24260 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
24270 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
24280 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
24290 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  yptInit)(CK_SESS
242a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
242b0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
242c0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
242d0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
242e0 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20  LE hKey) {..int 
242f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
24300 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59  hKey--;...CACKEY
24310 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
24320 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
24330 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
24340 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
24350 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24360 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
24370 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
24380 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
24390 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
243a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
243b0 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20  hanism == NULL) 
243c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
243d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
243e0 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55  pMechanism is NU
243f0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
24400 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
24410 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
24420 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
24430 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50  ism != CKM_RSA_P
24440 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  KCS) {...CACKEY_
24450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24460 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d  ror. pMechanism-
24470 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73  >mechanism not s
24480 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f  pecified as CKM_
24490 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72  RSA_PKCS");....r
244a0 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e  eturn(CKR_MECHAN
244b0 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49  ISM_PARAM_INVALI
244c0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
244d0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
244e0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
244f0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
24500 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
24510 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
24520 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24530 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24540 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
24550 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
24560 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
24570 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
24580 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
24590 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
245a0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
245b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
245c0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
245d0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
245e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
245f0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
24600 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
24610 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
24620 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
24630 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24640 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
24650 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
24660 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
24670 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
24680 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24690 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
246a0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
246b0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
246c0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
246d0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
246e0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
246f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
24700 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
24710 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
24720 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24730 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
24740 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24750 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 61  rror.  Decrypt a
24760 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65  lready in progre
24770 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ss.");......retu
24780 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
24790 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69  _ACTIVE);..}...i
247a0 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65  f (hKey >= cacke
247b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
247c0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
247d0 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65  count) {...cacke
247e0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
247f0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24800 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24810 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24820 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  Key handle out o
24830 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74  f range (request
24840 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79  ed key %lu, only
24850 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20   %lu identities 
24860 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75  available).", (u
24870 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
24880 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ey, (unsigned lo
24890 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ng) cackey_sessi
248a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
248b0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
248c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b  ....return(CKR_K
248d0 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  EY_HANDLE_INVALI
248e0 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
248f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24900 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
24910 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f  e = 1;...cackey_
24920 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24930 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61  n].decrypt_mecha
24940 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  nism = pMechanis
24950 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63  m->mechanism;..c
24960 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
24970 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
24980 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65  _mech_parm = pMe
24990 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65  chanism->pParame
249a0 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ter;..cackey_ses
249b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
249c0 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
249d0 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73  mlen = pMechanis
249e0 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c 65  m->ulParameterLe
249f0 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  n;..cackey_sessi
24a00 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
24a10 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20 3d  crypt_identity =
24a20 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
24a30 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
24a40 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09  tities[hKey];...
24a50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
24a60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
24a70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24a80 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
24a90 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
24aa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24ab0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
24ac0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
24ad0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24ae0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
24af0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
24b00 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24b10 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
24b20 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
24b30 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
24b40 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
24b50 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
24b60 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ypt)(CK_SESSION_
24b70 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
24b80 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
24b90 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f  cryptedData, CK_
24ba0 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
24bb0 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  dDataLen, CK_BYT
24bc0 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
24bd0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74  ULONG_PTR pulDat
24be0 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e  aLen) {..CK_ULON
24bf0 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  G datalen_update
24c00 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b  , datalen_final;
24c10 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74 5f  ..CK_RV decrypt_
24c20 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ret;..int mutex_
24c30 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
24c40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
24c50 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
24c60 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
24c70 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
24c80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24c90 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
24ca0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
24cb0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
24cc0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
24cd0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44  );..}...if (pulD
24ce0 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20  ataLen == NULL) 
24cf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24d00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24d10 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e 55  pulDataLen is NU
24d20 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
24d30 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
24d40 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65  AD);..}...datale
24d50 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75 6c 44  n_update = *pulD
24d60 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70  ataLen;...decryp
24d70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70  t_ret = C_Decryp
24d80 74 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e  tUpdate(hSession
24d90 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61  , pEncryptedData
24da0 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74  , ulEncryptedDat
24db0 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26 64 61  aLen, pData, &da
24dc0 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09  talen_update);..
24dd0 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20  if (decrypt_ret 
24de0 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
24df0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24e00 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
24e10 79 70 74 55 70 64 61 74 65 28 29 20 72 65 74 75  yptUpdate() retu
24e20 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
24e30 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
24e40 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79  gned long) decry
24e50 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28  pt_ret);....if (
24e60 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43  decrypt_ret != C
24e70 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
24e80 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54 65 72  ALL) {..../* Ter
24e90 6d 69 6e 61 74 65 20 64 65 63 72 79 70 74 69 6f  minate decryptio
24ea0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  n operation */..
24eb0 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
24ec0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
24ed0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
24ee0 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
24ef0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
24f00 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
24f10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24f20 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
24f30 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
24f40 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
24f50 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  OR);....}.....if
24f60 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
24f70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
24f80 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ive) {.....cacke
24f90 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
24fa0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24fb0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
24fc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24fd0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
24fe0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09  tive.");........
24ff0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
25000 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
25010 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  D);....}.....if 
25020 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
25030 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
25040 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ypt_active) {...
25050 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25060 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25070 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
25080 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25090 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
250a0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
250b0 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
250c0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
250d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09  INITIALIZED);...
250e0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  .}.....cackey_se
250f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25100 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
25110 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72  = 0;.....mutex_r
25120 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
25130 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
25140 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
25150 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
25160 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43   != 0) {.....CAC
25170 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25180 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
25190 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
251a0 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
251b0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
251c0 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  ..}...}....retur
251d0 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  n(decrypt_ret);.
251e0 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29 20  .}...if (pData) 
251f0 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61 74  {...pData += dat
25200 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a  alen_update;..}.
25210 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d  .datalen_final =
25220 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64   *pulDataLen - d
25230 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a  atalen_update;..
25240 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43  .decrypt_ret = C
25250 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68 53  _DecryptFinal(hS
25260 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26  ession, pData, &
25270 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a  datalen_final);.
25280 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74  .if (decrypt_ret
25290 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
252a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
252b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
252c0 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74 75  ryptFinal() retu
252d0 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
252e0 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
252f0 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79  gned long) decry
25300 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  pt_ret);....retu
25310 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b  rn(decrypt_ret);
25320 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65  ..}...*pulDataLe
25330 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61  n = datalen_upda
25340 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e  te + datalen_fin
25350 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
25360 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
25370 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
25380 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
25390 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
253a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
253b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
253c0 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
253d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
253e0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
253f0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
25400 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  rt, CK_ULONG ulE
25410 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c  ncryptedPartLen,
25420 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
25430 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
25440 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09   pulPartLen) {..
25450 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 62  static CK_BYTE b
25460 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a  uf[16384];..ssiz
25470 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f  e_t buflen;..CK_
25480 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
25490 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20  .CK_RV retval = 
254a0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
254b0 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  R;..int mutex_re
254c0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
254d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
254e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
254f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
25500 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
25510 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25520 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
25530 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
25540 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
25550 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
25560 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
25570 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
25580 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
25590 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
255a0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
255b0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
255c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
255d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
255e0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
255f0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
25600 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
25610 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
25620 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72  ;..}...if (pEncr
25630 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c  yptedPart == NUL
25640 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64  L && ulEncrypted
25650 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
25660 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
25670 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b  it if we are ask
25680 65 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f  ed to decrypt no
25690 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41  thing... */...CA
256a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
256b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
256c0 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
256d0 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
256e0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
256f0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
25700 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d  pEncryptedPart =
25710 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
25720 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25730 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74  "Error. pEncrypt
25740 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20  edPart is NULL, 
25750 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50  but ulEncryptedP
25760 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e  artLen is not 0.
25770 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
25780 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
25790 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63  ;..}...if (ulEnc
257a0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d  ryptedPartLen ==
257b0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
257c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
257d0 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50  or. ulEncryptedP
257e0 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74  artLen is 0, but
257f0 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55   pPart is not NU
25800 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
25810 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
25820 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  AD);..}...if (pu
25830 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c  lPartLen == NULL
25840 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25850 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25860 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  . pulPartLen is 
25870 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
25880 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
25890 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  _BAD);..}...mute
258a0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
258b0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
258c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
258d0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
258e0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
258f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25900 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
25910 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
25920 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
25930 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
25940 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
25950 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
25960 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
25970 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
25980 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
25990 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
259a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
259b0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
259c0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
259d0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
259e0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
259f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
25a00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25a10 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
25a20 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
25a30 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25a40 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
25a50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25a60 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
25a70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  t not active.");
25a80 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
25a90 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
25aa0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
25ab0 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
25ac0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25ad0 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
25ae0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
25af0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
25b00 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
25b10 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
25b20 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
25b30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25b40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
25b50 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
25b60 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
25b70 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
25b80 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
25b90 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
25ba0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
25bb0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
25bc0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
25bd0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
25be0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25bf0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
25c00 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
25c10 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
25c20 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
25c30 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
25c40 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25c50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25c60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
25c70 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
25c80 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b  }...switch (cack
25c90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25ca0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
25cb0 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
25cc0 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
25cd0 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74  .../* Ask card t
25ce0 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09  o decrypt */....
25cf0 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f  buflen = cackey_
25d00 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63  signdecrypt(&cac
25d10 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
25d20 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ], cackey_sessio
25d30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
25d40 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20 70  rypt_identity, p
25d50 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 75  EncryptedPart, u
25d60 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
25d70 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62  n, buf, sizeof(b
25d80 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09 09  uf), 0, 1);.....
25d90 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29 20  if (buflen < 0) 
25da0 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74  {...../* Decrypt
25db0 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09  ion failed. */..
25dc0 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d  ...if (buflen ==
25dd0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e   CACKEY_PCSC_E_N
25de0 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09  EEDLOGIN) {.....
25df0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53  .retval = CKR_US
25e00 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e  ER_NOT_LOGGED_IN
25e10 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20  ;.....} else if 
25e20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45  (buflen == CACKE
25e30 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
25e40 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74  SENT) {......ret
25e50 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45  val = CKR_DEVICE
25e60 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20  _REMOVED;.....} 
25e70 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76  else {......retv
25e80 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c  al = CKR_GENERAL
25e90 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09  _ERROR;.....}...
25ea0 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e  .} else if (((un
25eb0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66  signed long) buf
25ec0 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c  len) > *pulPartL
25ed0 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a 09  en && pPart) {..
25ee0 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64 20  .../* Decrypted 
25ef0 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a  data too large *
25f00 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  /.....retval = C
25f10 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
25f20 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ALL;....} else {
25f30 0a 09 09 09 09 69 66 20 28 70 50 61 72 74 29 20  .....if (pPart) 
25f40 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 50  {......memcpy(pP
25f50 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e  art, buf, buflen
25f60 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70  );.....}......*p
25f70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c  ulPartLen = bufl
25f80 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  en;......retval 
25f90 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a  = CKR_OK;....}..
25fa0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d  ...break;..}...m
25fb0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
25fc0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
25fd0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25fe0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
25ff0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
26000 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26010 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
26020 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
26030 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
26040 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
26050 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
26060 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
26070 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65  ng %i", (int) re
26080 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
26090 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
260a0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
260b0 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 46  K_RV, C_DecryptF
260c0 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
260d0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
260e0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c  , CK_BYTE_PTR pL
260f0 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  astPart, CK_ULON
26100 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61 72  G_PTR pulLastPar
26110 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  tLen) {..int mut
26120 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
26130 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70  terminate_decryp
26140 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f  t = 1;...CACKEY_
26150 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
26160 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
26170 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
26180 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
26190 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
261a0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
261b0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
261c0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
261d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
261e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
261f0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
26200 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
26210 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
26220 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
26230 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
26240 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26250 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26260 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
26270 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
26280 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
26290 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
262a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c  );..}...if (pulL
262b0 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55  astPartLen == NU
262c0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
262d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
262e0 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74 4c  or. pulLastPartL
262f0 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
26300 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
26310 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
26320 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
26330 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
26340 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26350 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
26360 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
26370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26380 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
26390 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
263a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
263b0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
263c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
263d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
263e0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
263f0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
26400 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
26410 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
26420 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26430 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
26440 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
26450 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
26460 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
26470 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
26480 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26490 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
264a0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
264b0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
264c0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
264d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
264e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
264f0 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69  Decrypt not acti
26500 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
26510 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
26520 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
26530 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74  );..}...*pulLast
26540 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69  PartLen = 0;...i
26550 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d 20  f (pLastPart == 
26560 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e  NULL) {...termin
26570 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30 3b  ate_decrypt = 0;
26580 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e  ..}...if (termin
26590 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a 09  ate_decrypt) {..
265a0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
265b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
265c0 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  pt_active = 0;..
265d0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
265e0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
265f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
26600 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
26610 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
26620 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26630 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26640 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
26650 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
26660 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
26670 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
26680 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
26690 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
266a0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
266b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
266c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
266d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
266e0 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f 53  DigestInit)(CK_S
266f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
26700 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
26710 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
26720 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ism) {..CACKEY_D
26730 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
26740 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
26750 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
26760 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
26770 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26780 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
26790 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
267a0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
267b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
267c0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
267d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
267e0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
267f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
26800 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
26810 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26820 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
26830 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
26840 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
26850 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
26860 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 29  CK_RV, C_Digest)
26870 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
26880 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
26890 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
268a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
268b0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
268c0 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e  pDigest, CK_ULON
268d0 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c  G_PTR pulDigestL
268e0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
268f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
26900 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
26910 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
26920 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26930 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26940 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
26950 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26960 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
26970 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
26980 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
26990 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
269a0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
269b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
269c0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
269d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
269e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
269f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26a00 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
26a10 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
26a20 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55 70  K_RV, C_DigestUp
26a30 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
26a40 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
26a50 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
26a60 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
26a70 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
26a80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26a90 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
26aa0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
26ab0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
26ac0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26ad0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
26ae0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
26af0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
26b00 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
26b10 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
26b20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
26b30 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
26b40 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
26b50 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
26b60 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
26b70 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
26b80 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
26b90 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
26ba0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
26bb0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
26bc0 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  estKey)(CK_SESSI
26bd0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
26be0 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
26bf0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
26c00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26c10 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
26c20 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
26c30 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
26c40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26c50 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
26c60 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
26c70 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
26c80 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
26c90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
26ca0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26cb0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
26cc0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
26cd0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
26ce0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
26cf0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
26d00 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
26d10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
26d20 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
26d30 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
26d40 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53  igestFinal)(CK_S
26d50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
26d60 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
26d70 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f  PTR pDigest, CK_
26d80 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67  ULONG_PTR pulDig
26d90 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  estLen) {..CACKE
26da0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26db0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
26dc0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
26dd0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
26de0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26df0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
26e00 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
26e10 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
26e20 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
26e30 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
26e40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
26e50 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
26e60 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26e70 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
26e80 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26e90 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
26ea0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26eb0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
26ec0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
26ed0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
26ee0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
26ef0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
26f00 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
26f10 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
26f20 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
26f30 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74  hKey) {..int mut
26f40 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65  ex_retval;...hKe
26f50 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  y--;...CACKEY_DE
26f60 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
26f70 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
26f80 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
26f90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26fa0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26fb0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
26fc0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26fd0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
26fe0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
26ff0 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
27000 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ism == NULL) {..
27010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27020 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
27030 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e  chanism is NULL.
27040 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27050 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
27060 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
27070 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
27080 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   != CKM_RSA_PKCS
27090 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
270a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
270b0 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  . pMechanism->me
270c0 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63  chanism not spec
270d0 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41  ified as CKM_RSA
270e0 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75  _PKCS");....retu
270f0 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d  rn(CKR_MECHANISM
27100 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b  _PARAM_INVALID);
27110 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
27120 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
27130 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
27140 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
27150 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
27160 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
27170 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27180 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27190 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
271a0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
271b0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
271c0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
271d0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
271e0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
271f0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
27200 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
27210 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
27220 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27230 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27240 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
27250 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
27260 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
27270 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
27280 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27290 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
272a0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
272b0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
272c0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
272d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
272e0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
272f0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
27300 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
27310 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
27320 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
27330 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
27340 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
27350 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
27360 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27370 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27380 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
27390 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
273a0 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e   Sign already in
273b0 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09   progress.");...
273c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
273d0 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
273e0 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e  ..}...if (hKey >
273f0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
27400 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
27410 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a  tities_count) {.
27420 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
27430 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
27440 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
27450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27460 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c  rror.  Key handl
27470 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28  e out of range (
27480 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c  requested key %l
27490 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e  u, only %lu iden
274a0 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65  tities available
274b0 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
274c0 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69  ong) hKey, (unsi
274d0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65  gned long) cacke
274e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
274f0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
27500 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
27510 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45  n(CKR_KEY_HANDLE
27520 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
27530 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27540 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
27550 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63  ctive = 1;...cac
27560 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27570 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68  ssion].sign_mech
27580 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69  anism = pMechani
27590 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a  sm->mechanism;..
275a0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
275b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
275c0 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63  buflen = 128;..c
275d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
275e0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
275f0 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b  fused = 0;..cack
27600 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
27610 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
27620 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
27630 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27640 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
27650 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73  uf) * cackey_ses
27660 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27670 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09  sign_buflen);...
27680 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27690 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c 75  NTF("Session %lu
276a0 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 69   sign_identity i
276b0 73 20 25 70 20 28 69 64 65 6e 74 69 74 79 20 23  s %p (identity #
276c0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
276d0 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c   long) hSession,
276e0 20 28 76 6f 69 64 20 2a 29 20 26 63 61 63 6b 65   (void *) &cacke
276f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27700 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
27710 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64  hKey], (unsigned
27720 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63   long) hKey);..c
27730 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27740 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64  Session].sign_id
27750 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79  entity = &cackey
27760 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27770 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68  on].identities[h
27780 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  Key];...mutex_re
27790 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
277a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
277b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
277c0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
277d0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
277e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
277f0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
27800 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
27810 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
27820 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
27830 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27840 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
27850 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
27860 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
27870 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
27880 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
27890 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53  , C_Sign)(CK_SES
278a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
278b0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
278c0 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
278d0 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
278e0 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
278f0 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ure, CK_ULONG_PT
27900 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  R pulSignatureLe
27910 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n) {..unsigned l
27920 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f 62  ong start_sign_b
27930 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20 73  ufused;..CK_RV s
27940 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  ign_ret;..int mu
27950 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
27960 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27970 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
27980 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
27990 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
279a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
279b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
279c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
279d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
279e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
279f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
27a00 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
27a10 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
27a20 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
27a30 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
27a40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
27a50 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
27a60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27a70 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
27a80 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
27a90 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
27aa0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
27ab0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61  VALID);..}...sta
27ac0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20  rt_sign_bufused 
27ad0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
27ae0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
27af0 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e  _bufused;...sign
27b00 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64  _ret = C_SignUpd
27b10 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44  ate(hSession, pD
27b20 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b  ata, ulDataLen);
27b30 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21  ..if (sign_ret !
27b40 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41  = CKR_OK) {...CA
27b50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27b60 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55  F("Error.  SignU
27b70 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64  pdate() returned
27b80 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
27b90 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
27ba0 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
27bb0 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65  ;....if (sign_re
27bc0 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  t != CKR_BUFFER_
27bd0 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09  TOO_SMALL) {....
27be0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
27bf0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
27c00 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
27c10 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72  ;....if (mutex_r
27c20 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
27c30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27c40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
27c50 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
27c60 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
27c70 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27c80 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21  ;....}.....if (!
27c90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27ca0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
27cb0 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  ) {.....cackey_m
27cc0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
27cd0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
27ce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27cf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
27d00 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
27d10 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74  e.");........ret
27d20 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
27d30 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
27d40 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
27d50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27d60 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
27d70 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
27d80 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27d90 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27da0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
27db0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27dc0 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
27dd0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65  ve.");........re
27de0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
27df0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
27e00 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ED);....}.....ca
27e10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27e20 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
27e30 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74  ive = 0;.....mut
27e40 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
27e50 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27e60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27e70 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ....if (mutex_re
27e80 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
27e90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27ea0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
27eb0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
27ec0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
27ed0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
27ee0 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  );....}...}....r
27ef0 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b  eturn(sign_ret);
27f00 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d  ..}...sign_ret =
27f10 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65   C_SignFinal(hSe
27f20 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72  ssion, pSignatur
27f30 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  e, pulSignatureL
27f40 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72  en);..if (sign_r
27f50 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
27f60 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 3d  ..if (sign_ret =
27f70 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
27f80 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43  _SMALL) {....CAC
27f90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27fa0 28 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65  ("SignFinal() re
27fb0 74 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46 45  turned CKR_BUFFE
27fc0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20  R_TOO_SMALL (rv 
27fd0 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20  = %lu), undoing 
27fe0 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 2c  C_SignUpdate()",
27ff0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
28000 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09   sign_ret);.....
28010 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28020 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
28030 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73  ufused = start_s
28040 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09  ign_bufused;....
28050 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
28060 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
28070 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28080 72 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c  rror.  SignFinal
28090 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
280a0 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
280b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
280c0 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09  ) sign_ret);....
280d0 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
280e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69 67 6e  ;..}...if (pSign
280f0 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ature == NULL) {
28100 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28110 50 52 49 4e 54 46 28 22 70 53 69 67 6e 61 74 75  PRINTF("pSignatu
28120 72 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20  re specified as 
28130 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43 5f  NULL, undoing C_
28140 53 69 67 6e 55 70 64 61 74 65 28 29 22 29 3b 0a  SignUpdate()");.
28150 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
28160 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
28170 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61 72  n_bufused = star
28180 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a  t_sign_bufused;.
28190 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
281a0 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  et);..}...CACKEY
281b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
281c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
281d0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
281e0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
281f0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
28200 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
28210 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b 5f  _SignUpdate)(CK_
28220 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
28230 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
28240 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
28250 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
28260 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
28270 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
28280 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
28290 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
282a0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
282b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
282c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
282d0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
282e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
282f0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
28300 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
28310 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
28320 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
28330 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
28340 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
28350 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
28360 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
28370 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28380 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
28390 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
283a0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
283b0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
283c0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
283d0 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20  ..}...if (pPart 
283e0 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72  == NULL && ulPar
283f0 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  tLen == 0) {.../
28400 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 20  * Short circuit 
28410 69 66 20 77 65 20 61 72 65 20 61 73 6b 65 64 20  if we are asked 
28420 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e  to sign nothing.
28430 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  .. */...CACKEY_D
28440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
28450 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
28460 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
28470 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
28480 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
28490 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20  ..}...if (pPart 
284a0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
284b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
284c0 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74 20 69  ("Error. pPart i
284d0 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61  s NULL, but ulPa
284e0 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22  rtLen is not 0."
284f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28500 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
28510 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72 74  ..}...if (ulPart
28520 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  Len == 0) {...CA
28530 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28540 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61 72 74  F("Error. ulPart
28550 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50  Len is 0, but pP
28560 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  art is not NULL.
28570 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
28580 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
28590 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
285a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
285b0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
285c0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
285d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
285e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
285f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28600 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
28610 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
28620 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
28630 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
28640 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28650 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
28660 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
28670 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
28680 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
28690 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
286a0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
286b0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
286c0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
286d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
286e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
286f0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
28700 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
28710 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
28720 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
28730 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28740 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
28750 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28760 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76    Sign not activ
28770 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
28780 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
28790 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
287a0 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63  ;..}...switch (c
287b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
287c0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65  Session].sign_me
287d0 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
287e0 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
287f0 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65  .../* Accumulate
28800 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09   directly */....
28810 69 66 20 28 28 63 61 63 6b 65 79 5f 73 65 73 73  if ((cackey_sess
28820 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
28830 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 20 75 6c  ign_bufused + ul
28840 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65  PartLen) > cacke
28850 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28860 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
28870 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  ) {.....cackey_s
28880 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28890 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d  ].sign_buflen *=
288a0 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f   2;......cackey_
288b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
288c0 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65  n].sign_buf = re
288d0 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73  alloc(cackey_ses
288e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
288f0 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66  sign_buf, sizeof
28900 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (*cackey_session
28910 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
28920 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73  _buf) * cackey_s
28930 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28940 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a  ].sign_buflen);.
28950 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28  ...}.....memcpy(
28960 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28970 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
28980 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73  uf + cackey_sess
28990 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
289a0 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61  ign_bufused, pPa
289b0 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a  rt, ulPartLen);.
289c0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
289d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
289e0 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c  gn_bufused += ul
289f0 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65  PartLen;.....bre
28a00 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ak;..}...mutex_r
28a10 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
28a20 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28a30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
28a40 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
28a50 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
28a60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28a70 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
28a80 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
28a90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
28aa0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
28ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28ac0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
28ad0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
28ae0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
28af0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
28b00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
28b10 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28  V, C_SignFinal)(
28b20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
28b30 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
28b40 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
28b50 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
28b60 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
28b70 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
28b80 59 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d  YTE sigbuf[1024]
28b90 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75  ;..ssize_t sigbu
28ba0 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  flen;..CK_SLOT_I
28bb0 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56  D slotID;..CK_RV
28bc0 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45   retval = CKR_GE
28bd0 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e  NERAL_ERROR;..in
28be0 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  t terminate_sign
28bf0 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78   = 1;..int mutex
28c00 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
28c10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28c20 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
28c30 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
28c40 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
28c50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28c60 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
28c70 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
28c80 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
28c90 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
28ca0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
28cb0 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20  SignatureLen == 
28cc0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
28cd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28ce0 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75  rror. pulSignatu
28cf0 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  reLen is NULL.")
28d00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
28d10 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
28d20 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
28d30 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
28d40 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
28d50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
28d60 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
28d70 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
28d80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28d90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
28da0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
28db0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
28dc0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
28dd0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
28de0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
28df0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
28e00 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
28e10 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
28e20 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
28e30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28e40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28e50 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
28e60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
28e70 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
28e80 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
28e90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28ea0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
28eb0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
28ec0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
28ed0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
28ee0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28ef0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
28f00 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
28f10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
28f20 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
28f30 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
28f40 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
28f50 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
28f60 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
28f70 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28f80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28f90 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
28fa0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28fb0 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65   Sign not active
28fc0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
28fd0 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
28fe0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
28ff0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
29000 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29010 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
29020 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
29030 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
29040 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
29050 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
29060 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
29070 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29080 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29090 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
290a0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
290b0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
290c0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
290d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
290e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
290f0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
29100 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
29110 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
29120 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29130 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
29140 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
29150 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
29160 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
29170 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
29180 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
29190 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
291a0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
291b0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
291c0 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
291d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
291e0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
291f0 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
29200 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
29210 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20  ..../* Ask card 
29220 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41  to sign */....CA
29230 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29240 46 28 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67  F("Asking to sig
29250 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20  n from identity 
29260 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c  %p in session %l
29270 75 22 2c 20 28 76 6f 69 64 20 2a 29 20 63 61 63  u", (void *) cac
29280 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29290 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
292a0 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  tity, (unsigned 
292b0 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b  long) hSession);
292c0 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20  ....sigbuflen = 
292d0 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
292e0 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
292f0 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
29300 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29310 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74  on].sign_identit
29320 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  y, cackey_sessio
29330 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
29340 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65  n_buf, cackey_se
29350 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29360 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73  .sign_bufused, s
29370 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69  igbuf, sizeof(si
29380 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09  gbuf), 1, 0);...
29390 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
293a0 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69  < 0) {...../* Si
293b0 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f  gning failed. */
293c0 0a 09 09 09 09 69 66 20 28 73 69 67 62 75 66 6c  .....if (sigbufl
293d0 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
293e0 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b  C_E_NEEDLOGIN) {
293f0 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
29400 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47  KR_USER_NOT_LOGG
29410 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73  ED_IN;.....} els
29420 65 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  e if (sigbuflen 
29430 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
29440 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a  _TOKENABSENT) {.
29450 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
29460 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
29470 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
29480 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
29490 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
294a0 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
294b0 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  if (((unsigned l
294c0 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20  ong) sigbuflen) 
294d0 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  > *pulSignatureL
294e0 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72 65  en && pSignature
294f0 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65  ) {...../* Signe
29500 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65  d data too large
29510 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f 44   */.....CACKEY_D
29520 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65 74  EBUG_PRINTF("ret
29530 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
29540 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67  _TOO_SMALL;  sig
29550 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75  buflen = %lu, pu
29560 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20  lSignatureLen = 
29570 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
29580 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 2c  long) sigbuflen,
29590 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
295a0 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65   *pulSignatureLe
295b0 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  n);......retval 
295c0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
295d0 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72  _SMALL;......ter
295e0 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b  minate_sign = 0;
295f0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
29600 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
29610 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53  = 0;......if (pS
29620 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09  ignature) {.....
29630 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75  .memcpy(pSignatu
29640 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62  re, sigbuf, sigb
29650 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65  uflen);.......te
29660 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31  rminate_sign = 1
29670 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75  ;.....}......*pu
29680 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20  lSignatureLen = 
29690 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09  sigbuflen;......
296a0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
296b0 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
296c0 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e  ..}...if (termin
296d0 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66  ate_sign) {...if
296e0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
296f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
29700 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28  _buf) {....free(
29710 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29720 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
29730 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  uf);...}....cack
29740 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29750 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
29760 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65  e = 0;..}...mute
29770 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
29780 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
29790 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
297a0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
297b0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
297c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
297d0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
297e0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
297f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
29800 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
29810 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29820 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
29830 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  %i", (int) retva
29840 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
29850 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  val);.}..CK_DEFI
29860 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
29870 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  V, C_SignRecover
29880 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
29890 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
298a0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
298b0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
298c0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
298d0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
298e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
298f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
29900 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
29910 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
29920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29930 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
29940 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
29950 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
29960 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
29970 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
29980 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29990 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
299a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
299b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
299c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
299d0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
299e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
299f0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
29a00 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
29a10 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65  (CK_RV, C_SignRe
29a20 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f  cover)(CK_SESSIO
29a30 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
29a40 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
29a50 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
29a60 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
29a70 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
29a80 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
29a90 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
29aa0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
29ab0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
29ac0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
29ad0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
29ae0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29af0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
29b00 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
29b10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29b20 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
29b30 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
29b40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29b50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
29b60 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29b70 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
29b80 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
29b90 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
29ba0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
29bb0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29bc0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
29bd0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
29be0 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28  , C_VerifyInit)(
29bf0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
29c00 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
29c10 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
29c20 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
29c30 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
29c40 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
29c50 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
29c60 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
29c70 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
29c80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29c90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
29ca0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
29cb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29cc0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
29cd0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
29ce0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29cf0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
29d00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29d10 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
29d20 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
29d30 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
29d40 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
29d50 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29d60 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
29d70 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
29d80 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53  , C_Verify)(CK_S
29d90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
29da0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
29db0 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
29dc0 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
29dd0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
29de0 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
29df0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
29e00 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
29e10 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
29e20 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
29e30 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
29e40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29e50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
29e60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
29e70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29e80 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
29e90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
29ea0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29eb0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
29ec0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29ed0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
29ee0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
29ef0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
29f00 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
29f10 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29f20 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
29f30 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
29f40 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65  , C_VerifyUpdate
29f50 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
29f60 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
29f70 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
29f80 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
29f90 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
29fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
29fb0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
29fc0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
29fd0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
29fe0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29ff0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2a000 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2a010 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2a020 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2a030 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2a040 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2a050 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2a060 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2a070 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2a080 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a090 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2a0a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2a0b0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2a0c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2a0d0 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46  CK_RV, C_VerifyF
2a0e0 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
2a0f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2a100 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
2a110 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
2a120 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  NG ulSignatureLe
2a130 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2a140 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2a150 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2a160 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2a170 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a180 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a190 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2a1a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2a1b0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2a1c0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2a1d0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2a1e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2a1f0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2a200 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2a210 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2a220 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2a230 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2a240 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a250 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2a260 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2a270 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63  _RV, C_VerifyRec
2a280 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53  overInit)(CK_SES
2a290 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2a2a0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2a2b0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2a2c0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2a2d0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
2a2e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a2f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2a300 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2a310 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2a320 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a330 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2a340 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2a350 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2a360 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2a370 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2a380 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a390 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2a3a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2a3b0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2a3c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a3d0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2a3e0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2a3f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2a400 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2a410 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
2a420 72 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f  rifyRecover)(CK_
2a430 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2a440 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2a450 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
2a460 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e   CK_ULONG ulSign
2a470 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54  atureLen, CK_BYT
2a480 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
2a490 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74  ULONG_PTR pulDat
2a4a0 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  aLen) {..CACKEY_
2a4b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2a4c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2a4d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2a4e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2a4f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a500 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2a510 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2a520 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2a530 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2a540 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2a550 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2a560 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2a570 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a580 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2a590 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2a5a0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2a5b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2a5c0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2a5d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2a5e0 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
2a5f0 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43  EncryptUpdate)(C
2a600 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2a610 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2a620 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
2a630 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
2a640 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
2a650 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
2a660 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e  _ULONG_PTR pulEn
2a670 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
2a680 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2a690 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2a6a0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2a6b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2a6c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a6d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2a6e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2a6f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a700 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2a710 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2a720 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a730 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2a740 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2a750 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2a760 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2a770 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2a780 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2a790 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2a7a0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2a7b0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2a7c0 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73  , C_DecryptDiges
2a7d0 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
2a7e0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2a7f0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2a800 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
2a810 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72   CK_ULONG ulEncr
2a820 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b  yptedPartLen, CK
2a830 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
2a840 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2a850 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
2a860 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a870 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2a880 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2a890 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2a8a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a8b0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2a8c0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2a8d0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2a8e0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2a8f0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2a900 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a910 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2a920 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2a930 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2a940 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a950 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2a960 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2a970 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2a980 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2a990 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
2a9a0 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 29  gnEncryptUpdate)
2a9b0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2a9c0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2a9d0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
2a9e0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
2a9f0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2aa00 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
2aa10 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2aa20 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2aa30 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2aa40 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2aa50 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2aa60 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2aa70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2aa80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2aa90 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2aaa0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2aab0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2aac0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2aad0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2aae0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2aaf0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2ab00 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2ab10 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ab20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ab30 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2ab40 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ab50 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2ab60 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2ab70 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72  RV, C_DecryptVer
2ab80 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45  ifyUpdate)(CK_SE
2ab90 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2aba0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2abb0 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
2abc0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
2abd0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
2abe0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
2abf0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
2ac00 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  pulPartLen) {..C
2ac10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ac20 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2ac30 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2ac40 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2ac50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ac60 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2ac70 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2ac80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2ac90 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2aca0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2acb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2acc0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2acd0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ace0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2acf0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2ad00 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2ad10 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2ad20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ad30 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2ad40 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2ad50 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f  GenerateKey)(CK_
2ad60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2ad70 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2ad80 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2ad90 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55  nism, CK_ATTRIBU
2ada0 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
2adb0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
2adc0 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
2add0 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
2ade0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2adf0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2ae00 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2ae10 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2ae20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ae30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2ae40 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2ae50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2ae60 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2ae70 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2ae80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ae90 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2aea0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2aeb0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2aec0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2aed0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2aee0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2aef0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2af00 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2af10 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2af20 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  , C_GenerateKeyP
2af30 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  air)(CK_SESSION_
2af40 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2af50 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
2af60 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
2af70 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
2af80 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74  PublicKeyTemplat
2af90 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75  e, CK_ULONG ulPu
2afa0 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74 65  blicKeyAttribute
2afb0 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42  Count, CK_ATTRIB
2afc0 55 54 45 5f 50 54 52 20 70 50 72 69 76 61 74 65  UTE_PTR pPrivate
2afd0 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  KeyTemplate, CK_
2afe0 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b  ULONG ulPrivateK
2aff0 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  eyAttributeCount
2b000 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2b010 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b  LE_PTR phPublicK
2b020 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  ey, CK_OBJECT_HA
2b030 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61  NDLE_PTR phPriva
2b040 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  teKey) {..CACKEY
2b050 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2b060 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2b070 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2b080 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2b090 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b0a0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2b0b0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2b0c0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2b0d0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2b0e0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2b0f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2b100 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2b110 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2b120 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2b130 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2b140 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2b150 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2b160 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2b170 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2b180 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b  N(CK_RV, C_WrapK
2b190 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
2b1a0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2b1b0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2b1c0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2b1d0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57  OBJECT_HANDLE hW
2b1e0 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f  rappingKey, CK_O
2b1f0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
2b200 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  y, CK_BYTE_PTR p
2b210 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55  WrappedKey, CK_U
2b220 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70  LONG_PTR pulWrap
2b230 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41  pedKeyLen) {..CA
2b240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b250 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2b260 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2b270 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2b280 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b290 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2b2a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2b2b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2b2c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2b2d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2b2e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b2f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2b300 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2b310 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2b320 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2b330 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2b340 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2b350 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2b360 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2b370 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55  CTION(CK_RV, C_U
2b380 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53  nwrapKey)(CK_SES
2b390 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2b3a0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2b3b0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2b3c0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2b3d0 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b  DLE hUnwrappingK
2b3e0 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  ey, CK_BYTE_PTR 
2b3f0 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f  pWrappedKey, CK_
2b400 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b  ULONG ulWrappedK
2b410 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42  eyLen, CK_ATTRIB
2b420 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
2b430 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74  e, CK_ULONG ulAt
2b440 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
2b450 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
2b460 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43  TR phKey) {..CAC
2b470 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b480 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2b490 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2b4a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2b4b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b4c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2b4d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2b4e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2b4f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2b500 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2b510 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b520 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2b530 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2b540 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2b550 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2b560 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2b570 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2b580 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2b590 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2b5a0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
2b5b0 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53  riveKey)(CK_SESS
2b5c0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2b5d0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2b5e0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2b5f0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2b600 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f  LE hBaseKey, CK_
2b610 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
2b620 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
2b630 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75  G ulAttributeCou
2b640 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
2b650 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
2b660 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2b670 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2b680 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2b690 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2b6a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b6b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2b6c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2b6d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2b6e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2b6f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2b700 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b710 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2b720 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2b730 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2b740 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2b750 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2b760 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2b770 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2b780 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2b790 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2b7a0 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28  , C_SeedRandom)(
2b7b0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2b7c0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2b7d0 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43  YTE_PTR pSeed, C
2b7e0 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65  K_ULONG ulSeedLe
2b7f0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2b800 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2b810 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2b820 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2b830 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2b840 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2b850 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2b860 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2b870 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2b880 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2b890 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2b8a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2b8b0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2b8c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2b8d0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2b8e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2b8f0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2b900 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2b910 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2b920 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2b930 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52  _RV, C_GenerateR
2b940 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f  andom)(CK_SESSIO
2b950 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2b960 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2b970 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55  RandomData, CK_U
2b980 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e  LONG ulRandomLen
2b990 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2b9a0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2b9b0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2b9c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2b9d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b9e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b9f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2ba00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ba10 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2ba20 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2ba30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ba40 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2ba50 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2ba60 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2ba70 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ba80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ba90 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2baa0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2bab0 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70  RTED);.}../* Dep
2bac0 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e  recated Function
2bad0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
2bae0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2baf0 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75  GetFunctionStatu
2bb00 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  s)(CK_SESSION_HA
2bb10 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
2bb20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2bb30 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2bb40 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2bb50 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2bb60 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2bb70 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69  NOT_PARALLEL (%i
2bb80 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2bb90 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a  _NOT_PARALLEL);.
2bba0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2bbb0 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
2bbc0 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20  EL);...hSession 
2bbd0 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53  = hSession; /* S
2bbe0 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61  upress unused va
2bbf0 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a  riable warning *
2bc00 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74  /.}../* Deprecat
2bc10 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43  ed Function */.C
2bc20 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2bc30 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65  N(CK_RV, C_Cance
2bc40 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45  lFunction)(CK_SE
2bc50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2bc60 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59  ssion) {..CACKEY
2bc70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2bc80 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b  alled.");...CACK
2bc90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bca0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2bcb0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
2bcc0 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f  LLEL (%i)", CKR_
2bcd0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
2bce0 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e  ALLEL);...return
2bcf0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2bd00 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68  T_PARALLEL);...h
2bd10 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69  Session = hSessi
2bd20 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  on; /* Supress u
2bd30 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
2bd40 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
2bd50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2bd60 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63  CK_RV, C_GetFunc
2bd70 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e  tionList)(CK_FUN
2bd80 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50  CTION_LIST_PTR_P
2bd90 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  TR ppFunctionLis
2bda0 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f  t) {..CK_FUNCTIO
2bdb0 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63  N_LIST_PTR pFunc
2bdc0 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b  tionList;...CACK
2bdd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bde0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2bdf0 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74   (ppFunctionList
2be00 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2be10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2be20 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63  F("Error. ppFunc
2be30 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c  tionList is NULL
2be40 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2be50 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2be60 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f  );..}...pFunctio
2be70 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73  nList = malloc(s
2be80 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e  izeof(*pFunction
2be90 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74  List));...pFunct
2bea0 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e  ionList->version
2beb0 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45  .major = ((CACKE
2bec0 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
2bed0 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20  ON_CODE) >> 16) 
2bee0 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 63 74 69  & 0xff;..pFuncti
2bef0 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e  onList->version.
2bf00 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  minor = ((CACKEY
2bf10 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
2bf20 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20  N_CODE) >> 8) & 
2bf30 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f  0xff;...pFunctio
2bf40 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c  nList->C_Initial
2bf50 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69  ize = C_Initiali
2bf60 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ze;..pFunctionLi
2bf70 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d  st->C_Finalize =
2bf80 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46   C_Finalize;..pF
2bf90 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2bfa0 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e  etInfo = C_GetIn
2bfb0 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
2bfc0 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73  st->C_GetSlotLis
2bfd0 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73  t = C_GetSlotLis
2bfe0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2bff0 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f  t->C_GetSlotInfo
2c000 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f   = C_GetSlotInfo
2c010 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c020 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f  ->C_GetTokenInfo
2c030 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66   = C_GetTokenInf
2c040 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
2c050 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74  t->C_WaitForSlot
2c060 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f  Event = C_WaitFo
2c070 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75  rSlotEvent;..pFu
2c080 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2c090 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d  tMechanismList =
2c0a0 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c   C_GetMechanismL
2c0b0 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ist;..pFunctionL
2c0c0 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e  ist->C_GetMechan
2c0d0 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d  ismInfo = C_GetM
2c0e0 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70  echanismInfo;..p
2c0f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2c100 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e  InitToken = C_In
2c110 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74  itToken;..pFunct
2c120 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50  ionList->C_InitP
2c130 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a  IN = C_InitPIN;.
2c140 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c150 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53 65 74  C_SetPIN = C_Set
2c160 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  PIN;..pFunctionL
2c170 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69  ist->C_OpenSessi
2c180 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69  on = C_OpenSessi
2c190 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
2c1a0 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69  st->C_CloseSessi
2c1b0 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73  on = C_CloseSess
2c1c0 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ion;..pFunctionL
2c1d0 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53  ist->C_CloseAllS
2c1e0 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73  essions = C_Clos
2c1f0 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70  eAllSessions;..p
2c200 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2c210 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d  GetSessionInfo =
2c220 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66   C_GetSessionInf
2c230 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
2c240 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74 69 6f  t->C_GetOperatio
2c250 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 74 4f 70  nState = C_GetOp
2c260 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70  erationState;..p
2c270 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2c280 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  SetOperationStat
2c290 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 61 74 69  e = C_SetOperati
2c2a0 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74  onState;..pFunct
2c2b0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e  ionList->C_Login
2c2c0 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75   = C_Login;..pFu
2c2d0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f  nctionList->C_Lo
2c2e0 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b  gout = C_Logout;
2c2f0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2c300 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 20  >C_CreateObject 
2c310 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74  = C_CreateObject
2c320 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c330 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d  ->C_CopyObject =
2c340 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09   C_CopyObject;..
2c350 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2c360 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d  _DestroyObject =
2c370 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74   C_DestroyObject
2c380 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c390 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a  ->C_GetObjectSiz
2c3a0 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74 53  e = C_GetObjectS
2c3b0 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ize;..pFunctionL
2c3c0 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 72 69 62  ist->C_GetAttrib
2c3d0 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 47 65 74  uteValue = C_Get
2c3e0 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a  AttributeValue;.
2c3f0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c400 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
2c410 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 74 72 69  lue = C_SetAttri
2c420 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e  buteValue;..pFun
2c430 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
2c440 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d 20 43  dObjectsInit = C
2c450 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
2c460 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c470 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20  ->C_FindObjects 
2c480 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b  = C_FindObjects;
2c490 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2c4a0 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69  >C_FindObjectsFi
2c4b0 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  nal = C_FindObje
2c4c0 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  ctsFinal;..pFunc
2c4d0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72  tionList->C_Encr
2c4e0 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72  yptInit = C_Encr
2c4f0 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  yptInit;..pFunct
2c500 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
2c510 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a  pt = C_Encrypt;.
2c520 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c530 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 20  C_EncryptUpdate 
2c540 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  = C_EncryptUpdat
2c550 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2c560 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e 61  t->C_EncryptFina
2c570 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 46 69 6e  l = C_EncryptFin
2c580 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
2c590 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 49 6e 69  st->C_DecryptIni
2c5a0 74 20 3d 20 43 5f 44 65 63 72 79 70 74 49 6e 69  t = C_DecryptIni
2c5b0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2c5c0 74 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d 20 43  t->C_Decrypt = C
2c5d0 5f 44 65 63 72 79 70 74 3b 0a 09 70 46 75 6e 63  _Decrypt;..pFunc
2c5e0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
2c5f0 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65  yptUpdate = C_De
2c600 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46  cryptUpdate;..pF
2c610 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
2c620 65 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f  ecryptFinal = C_
2c630 44 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70  DecryptFinal;..p
2c640 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2c650 44 69 67 65 73 74 49 6e 69 74 20 3d 20 43 5f 44  DigestInit = C_D
2c660 69 67 65 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e  igestInit;..pFun
2c670 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
2c680 65 73 74 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a  est = C_Digest;.
2c690 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c6a0 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 20 3d  C_DigestUpdate =
2c6b0 20 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 3b   C_DigestUpdate;
2c6c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2c6d0 3e 43 5f 44 69 67 65 73 74 4b 65 79 20 3d 20 43  >C_DigestKey = C
2c6e0 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09 70 46 75  _DigestKey;..pFu
2c6f0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
2c700 67 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69  gestFinal = C_Di
2c710 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  gestFinal;..pFun
2c720 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
2c730 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e  nInit = C_SignIn
2c740 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
2c750 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53  st->C_Sign = C_S
2c760 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ign;..pFunctionL
2c770 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74  ist->C_SignUpdat
2c780 65 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65  e = C_SignUpdate
2c790 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c7a0 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20  ->C_SignFinal = 
2c7b0 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46  C_SignFinal;..pF
2c7c0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
2c7d0 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 20 3d  ignRecoverInit =
2c7e0 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e   C_SignRecoverIn
2c7f0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
2c800 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65  st->C_SignRecove
2c810 72 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  r = C_SignRecove
2c820 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r;..pFunctionLis
2c830 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69 74 20  t->C_VerifyInit 
2c840 3d 20 43 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a  = C_VerifyInit;.
2c850 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c860 43 5f 56 65 72 69 66 79 20 3d 20 43 5f 56 65 72  C_Verify = C_Ver
2c870 69 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ify;..pFunctionL
2c880 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 55 70 64  ist->C_VerifyUpd
2c890 61 74 65 20 3d 20 43 5f 56 65 72 69 66 79 55 70  ate = C_VerifyUp
2c8a0 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
2c8b0 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 46 69  List->C_VerifyFi
2c8c0 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66 79 46 69  nal = C_VerifyFi
2c8d0 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
2c8e0 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63  ist->C_VerifyRec
2c8f0 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 56 65 72  overInit = C_Ver
2c900 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a  ifyRecoverInit;.
2c910 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c920 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 20  C_VerifyRecover 
2c930 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  = C_VerifyRecove
2c940 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r;..pFunctionLis
2c950 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63 72 79  t->C_DigestEncry
2c960 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67  ptUpdate = C_Dig
2c970 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65  estEncryptUpdate
2c980 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2c990 2d 3e 43 5f 44 65 63 72 79 70 74 44 69 67 65 73  ->C_DecryptDiges
2c9a0 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72  tUpdate = C_Decr
2c9b0 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65 3b  yptDigestUpdate;
2c9c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2c9d0 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70  >C_SignEncryptUp
2c9e0 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63  date = C_SignEnc
2c9f0 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
2ca00 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
2ca10 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74  cryptVerifyUpdat
2ca20 65 20 3d 20 43 5f 44 65 63 72 79 70 74 56 65 72  e = C_DecryptVer
2ca30 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  ifyUpdate;..pFun
2ca40 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e  ctionList->C_Gen
2ca50 65 72 61 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e  erateKey = C_Gen
2ca60 65 72 61 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63  erateKey;..pFunc
2ca70 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65  tionList->C_Gene
2ca80 72 61 74 65 4b 65 79 50 61 69 72 20 3d 20 43 5f  rateKeyPair = C_
2ca90 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 3b  GenerateKeyPair;
2caa0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2cab0 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20 43 5f 57  >C_WrapKey = C_W
2cac0 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  rapKey;..pFuncti
2cad0 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70  onList->C_Unwrap
2cae0 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65  Key = C_UnwrapKe
2caf0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
2cb00 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79 20 3d  t->C_DeriveKey =
2cb10 20 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a 09 70   C_DeriveKey;..p
2cb20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2cb30 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53  SeedRandom = C_S
2cb40 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e  eedRandom;..pFun
2cb50 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e  ctionList->C_Gen
2cb60 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f  erateRandom = C_
2cb70 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a  GenerateRandom;.
2cb80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2cb90 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
2cba0 74 75 73 20 3d 20 43 5f 47 65 74 46 75 6e 63 74  tus = C_GetFunct
2cbb0 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46 75 6e  ionStatus;..pFun
2cbc0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e  ctionList->C_Can
2cbd0 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f  celFunction = C_
2cbe0 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a  CancelFunction;.
2cbf0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2cc00 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73  C_GetFunctionLis
2cc10 74 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  t = C_GetFunctio
2cc20 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63  nList;...*ppFunc
2cc30 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63  tionList = pFunc
2cc40 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b  tionList;...CACK
2cc50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cc60 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2cc70 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
2cc80 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
2cc90 4b 29 3b 0a 7d 0a 0a                             K);.}..