Hex Artifact Content

Artifact 556e3f52579936672dac1766c0a4a9ba369aecbc:


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 78 2c 20  E(%p) (%s)", x, 
1810: 23 78 29 3b 20 66 72 65 65 28 78 29 3b 20 7d 0a  #x); free(x); }.
1820: 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 63 61  .static FILE *ca
1830: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 76 6f  ckey_debug_fd(vo
1840: 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 46 49  id) {..static FI
1850: 4c 45 20 2a 66 64 20 3d 20 4e 55 4c 4c 3b 0a 09  LE *fd = NULL;..
1860: 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65 3b 0a 0a  char *logfile;..
1870: 09 69 66 20 28 66 64 20 21 3d 20 4e 55 4c 4c 29  .if (fd != NULL)
1880: 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64 29 3b   {...return(fd);
1890: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4c 6f 67  ..}.../*.. * Log
18a0: 20 74 6f 20 73 74 64 65 72 72 20 69 6e 69 74 69   to stderr initi
18b0: 61 6c 6c 79 20 73 6f 20 77 65 20 63 61 6e 20 75  ally so we can u
18c0: 73 65 20 64 65 62 75 67 67 69 6e 67 20 77 69 74  se debugging wit
18d0: 68 69 6e 0a 09 20 2a 20 74 68 69 73 20 66 75 6e  hin.. * this fun
18e0: 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 67 65  ction without ge
18f0: 74 74 69 6e 67 20 69 6e 74 6f 20 61 6e 20 69 6e  tting into an in
1900: 66 69 6e 69 74 65 20 6c 6f 6f 70 0a 09 20 2a 2f  finite loop.. */
1910: 0a 09 66 64 20 3d 20 73 74 64 65 72 72 3b 0a 0a  ..fd = stderr;..
1920: 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65 6e  .logfile = geten
1930: 76 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  v("CACKEY_DEBUG_
1940: 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 69 66 20 28  LOGFILE");..if (
1950: 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  logfile != NULL)
1960: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1970: 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20  G_PRINTF("Found 
1980: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
1990: 61 62 6c 65 3a 20 25 73 22 2c 20 6c 6f 67 66 69  able: %s", logfi
19a0: 6c 65 29 3b 0a 0a 09 09 6c 6f 67 66 69 6c 65 20  le);....logfile 
19b0: 3d 20 73 74 72 63 68 72 28 6c 6f 67 66 69 6c 65  = strchr(logfile
19c0: 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20 28 6c 6f  , '=');...if (lo
19d0: 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  gfile == NULL) {
19e0: 0a 09 09 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65  ....logfile = ge
19f0: 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 45 42  tenv("CACKEY_DEB
1a00: 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 09  UG_LOGFILE");...
1a10: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f 67 66  } else {....logf
1a20: 69 6c 65 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  ile++;...}..}...
1a30: 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e  if (logfile != N
1a40: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1a50: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
1a60: 75 6e 64 20 6c 6f 67 20 66 69 6c 65 3a 20 25 73  und log file: %s
1a70: 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 09  ", logfile);....
1a80: 66 64 20 3d 20 66 6f 70 65 6e 28 6c 6f 67 66 69  fd = fopen(logfi
1a90: 6c 65 2c 20 22 61 22 29 3b 0a 09 7d 0a 0a 09 69  le, "a");..}...i
1aa0: 66 20 28 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  f (fd == NULL) {
1ab0: 0a 09 09 66 64 20 3d 20 73 74 64 65 72 72 3b 0a  ...fd = stderr;.
1ac0: 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d 20 73  .}...if (fd == s
1ad0: 74 64 65 72 72 29 20 7b 0a 09 09 43 41 43 4b 45  tderr) {...CACKE
1ae0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1af0: 52 65 74 75 72 6e 69 6e 67 20 73 74 64 65 72 72  Returning stderr
1b00: 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ");..} else {...
1b10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b20: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25  NTF("Returning %
1b30: 70 22 2c 20 66 64 29 3b 0a 09 7d 0a 0a 09 72 65  p", fd);..}...re
1b40: 74 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a 73 74 61  turn(fd);.}..sta
1b50: 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59  tic void *CACKEY
1b60: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
1b70: 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  OC(size_t size, 
1b80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63  const char *func
1b90: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76  , int line) {..v
1ba0: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
1bb0: 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  etval = malloc(s
1bc0: 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ize);...CACKEY_D
1bd0: 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 0a  EBUG_PRINTTIME;.
1be0: 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f  .fprintf(cackey_
1bf0: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28  debug_fd(), "%s(
1c00: 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c  ):%i: ", func, l
1c10: 69 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 63  ine);..fprintf(c
1c20: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1c30: 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70  , "MALLOC() = %p
1c40: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 72  ", retval);..fpr
1c50: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
1c60: 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b 0a 09  g_fd(), "\n");..
1c70: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
1c80: 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74  bug_fd());...ret
1c90: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
1ca0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43  static void *CAC
1cb0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52  KEY_DEBUG_FUNC_R
1cc0: 45 41 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72  EALLOC(void *ptr
1cd0: 2c 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63  , size_t size, c
1ce0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c  onst char *func,
1cf0: 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f   int line) {..vo
1d00: 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65  id *retval;...re
1d10: 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 70  tval = realloc(p
1d20: 74 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 20  tr, size);...if 
1d30: 28 72 65 74 76 61 6c 20 21 3d 20 70 74 72 29 20  (retval != ptr) 
1d40: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d50: 5f 50 52 49 4e 54 54 49 4d 45 3b 0a 09 09 66 70  _PRINTTIME;...fp
1d60: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
1d70: 75 67 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25  ug_fd(), "%s():%
1d80: 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65  i: ", func, line
1d90: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 63 61 63  );...fprintf(cac
1da0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
1db0: 22 52 45 41 4c 4c 4f 43 28 25 70 29 20 3d 20 25  "REALLOC(%p) = %
1dc0: 70 22 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29  p", ptr, retval)
1dd0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 63 61 63 6b  ;...fprintf(cack
1de0: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1df0: 5c 6e 22 29 3b 0a 09 09 66 66 6c 75 73 68 28 63  \n");...fflush(c
1e00: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1e10: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76  );..}...if (retv
1e20: 61 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  al == NULL) {...
1e30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e40: 4e 54 46 28 22 20 2a 2a 2a 20 45 52 52 4f 52 20  NTF(" *** ERROR 
1e50: 2a 2a 2a 20 72 65 61 6c 6c 6f 63 20 72 65 74 75  *** realloc retu
1e60: 72 6e 65 64 20 4e 55 4c 4c 20 28 73 69 7a 65 20  rned NULL (size 
1e70: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  = %lu)", (unsign
1e80: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a  ed long) size);.
1e90: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  .}...return(retv
1ea0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  al);.}..static c
1eb0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
1ec0: 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 63 6f  G_FUNC_STRDUP(co
1ed0: 6e 73 74 20 63 68 61 72 20 2a 70 74 72 2c 20 63  nst char *ptr, c
1ee0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c  onst char *func,
1ef0: 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 63 68   int line) {..ch
1f00: 61 72 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65  ar *retval;...re
1f10: 74 76 61 6c 20 3d 20 73 74 72 64 75 70 28 70 74  tval = strdup(pt
1f20: 72 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  r);...CACKEY_DEB
1f30: 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 0a 09 66  UG_PRINTTIME;..f
1f40: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1f50: 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28 29 3a  bug_fd(), "%s():
1f60: 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e  %i: ", func, lin
1f70: 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 63 61 63  e);..fprintf(cac
1f80: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
1f90: 22 53 54 52 44 55 50 5f 4d 41 4c 4c 4f 43 28 29  "STRDUP_MALLOC()
1fa0: 20 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29 3b   = %p", retval);
1fb0: 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ..fprintf(cackey
1fc0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e  _debug_fd(), "\n
1fd0: 22 29 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b  ");..fflush(cack
1fe0: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a  ey_debug_fd());.
1ff0: 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
2000: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
2010: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
2020: 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f  EBUG_FUNC_TAG_TO
2030: 5f 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68  _STR(unsigned ch
2040: 61 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63  ar tag) {..switc
2050: 68 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65  h (tag) {...case
2060: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49   GSCIS_TAG_CARDI
2070: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
2080: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29  CIS_TAG_CARDID")
2090: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
20a0: 41 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72  AG_CCC_VER:....r
20b0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
20c0: 5f 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61  _CCC_VER");...ca
20d0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47  se GSCIS_TAG_CCG
20e0: 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  _VER:....return(
20f0: 22 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56  "GSCIS_TAG_CCG_V
2100: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ER");...case GSC
2110: 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a  IS_TAG_CARDURL:.
2120: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2130: 5f 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a  _TAG_CARDURL");.
2140: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2150: 5f 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75  _PKCS15:....retu
2160: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b  rn("GSCIS_TAG_PK
2170: 43 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47  CS15");...case G
2180: 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54  SCIS_TAG_REG_DAT
2190: 41 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75  A_MODEL:....retu
21a0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45  rn("GSCIS_TAG_RE
21b0: 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a  G_DATA_MODEL");.
21c0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
21d0: 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72  _ACR_TABLE:....r
21e0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
21f0: 5f 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09  _ACR_TABLE");...
2200: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
2210: 41 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74  ARD_APDU:....ret
2220: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
2230: 41 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61  ARD_APDU");...ca
2240: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44  se GSCIS_TAG_RED
2250: 49 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74  IRECTION:....ret
2260: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52  urn("GSCIS_TAG_R
2270: 45 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09  EDIRECTION");...
2280: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
2290: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  T:....return("GS
22a0: 43 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09  CIS_TAG_CT");...
22b0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
22c0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  T:....return("GS
22d0: 43 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09  CIS_TAG_ST");...
22e0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e  case GSCIS_TAG_N
22f0: 45 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72  EXTCCC:....retur
2300: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58  n("GSCIS_TAG_NEX
2310: 54 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47  TCCC");...case G
2320: 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a  SCIS_TAG_FNAME:.
2330: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2340: 5f 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09  _TAG_FNAME");...
2350: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d  case GSCIS_TAG_M
2360: 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  NAME:....return(
2370: 22 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45  "GSCIS_TAG_MNAME
2380: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2390: 5f 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72  _TAG_LNAME:....r
23a0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
23b0: 5f 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65  _LNAME");...case
23c0: 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49   GSCIS_TAG_SUFFI
23d0: 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  X:....return("GS
23e0: 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29  CIS_TAG_SUFFIX")
23f0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2400: 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a  AG_GOVT_AGENCY:.
2410: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2420: 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59  _TAG_GOVT_AGENCY
2430: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2440: 5f 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09  _TAG_BUREAU:....
2450: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2460: 47 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61  G_BUREAU");...ca
2470: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  se GSCIS_TAG_BUR
2480: 45 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74  EAU_CODE:....ret
2490: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42  urn("GSCIS_TAG_B
24a0: 55 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09  UREAU_CODE");...
24b0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44  case GSCIS_TAG_D
24c0: 45 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74  EPT_CODE:....ret
24d0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44  urn("GSCIS_TAG_D
24e0: 45 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61  EPT_CODE");...ca
24f0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54  se GSCIS_TAG_TIT
2500: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  LE:....return("G
2510: 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29  SCIS_TAG_TITLE")
2520: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2530: 41 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09  AG_BUILDING:....
2540: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2550: 47 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09  G_BUILDING");...
2560: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2570: 46 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09  FFICE_ADDR1:....
2580: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2590: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29  G_OFFICE_ADDR1")
25a0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
25b0: 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a  AG_OFFICE_ADDR2:
25c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
25d0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44  S_TAG_OFFICE_ADD
25e0: 52 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  R2");...case GSC
25f0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49  IS_TAG_OFFICE_CI
2600: 54 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TY:....return("G
2610: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2620: 43 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47  CITY");...case G
2630: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2640: 53 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  STATE:....return
2650: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2660: 43 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61  CE_STATE");...ca
2670: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2680: 49 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75  ICE_ZIP:....retu
2690: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
26a0: 46 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61  FICE_ZIP");...ca
26b0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
26c0: 49 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09  ICE_COUNTRY:....
26d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
26e0: 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59  G_OFFICE_COUNTRY
26f0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2700: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e  _TAG_OFFICE_PHON
2710: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2720: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
2730: 48 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47  HONE");...case G
2740: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2750: 50 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65  PHONE_EXT:....re
2760: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2770: 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54  OFFICE_PHONE_EXT
2780: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2790: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a  _TAG_OFFICE_FAX:
27a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
27b0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58  S_TAG_OFFICE_FAX
27c0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
27d0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49  _TAG_OFFICE_EMAI
27e0: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  L:....return("GS
27f0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45  CIS_TAG_OFFICE_E
2800: 4d 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47  MAIL");...case G
2810: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2820: 52 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28  ROOM:....return(
2830: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2840: 45 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65  E_ROOM");...case
2850: 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f   GSCIS_TAG_NONGO
2860: 56 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74  V_AGENCY:....ret
2870: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e  urn("GSCIS_TAG_N
2880: 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a  ONGOV_AGENCY");.
2890: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
28a0: 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a  _SSN_DESIGNATOR:
28b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
28c0: 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e  S_TAG_SSN_DESIGN
28d0: 41 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47  ATOR");...case G
28e0: 53 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09  SCIS_TAG_SSN:...
28f0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2900: 41 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65  AG_SSN");...case
2910: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a   GSCIS_TAG_DOB:.
2920: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2930: 5f 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61  _TAG_DOB");...ca
2940: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e  se GSCIS_TAG_GEN
2950: 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DER:....return("
2960: 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52  GSCIS_TAG_GENDER
2970: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2980: 5f 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09  _TAG_USERID:....
2990: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
29a0: 47 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61  G_USERID");...ca
29b0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d  se GSCIS_TAG_DOM
29c0: 41 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AIN:....return("
29d0: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e  GSCIS_TAG_DOMAIN
29e0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
29f0: 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09  _TAG_PASSWORD:..
2a00: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2a10: 54 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a  TAG_PASSWORD");.
2a20: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2a30: 5f 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65  _ISSUERID:....re
2a40: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2a50: 49 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61  ISSUERID");...ca
2a60: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52  se GSCIS_TAG_SER
2a70: 4e 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  NO:....return("G
2a80: 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29  SCIS_TAG_SERNO")
2a90: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2aa0: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09  AG_ISSUE_DATE:..
2ab0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2ac0: 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29  TAG_ISSUE_DATE")
2ad0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2ae0: 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a  AG_EXPIRE_DATE:.
2af0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2b00: 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45  _TAG_EXPIRE_DATE
2b10: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2b20: 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a  _TAG_CARD_TYPE:.
2b30: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2b40: 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29  _TAG_CARD_TYPE")
2b50: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2b60: 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45  AG_SECURITY_CODE
2b70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2b80: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f  IS_TAG_SECURITY_
2b90: 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47  CODE");...case G
2ba0: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
2bb0: 41 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AID:....return("
2bc0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
2bd0: 5f 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47  _AID");...case G
2be0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
2bf0: 43 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  CATE:....return(
2c00: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49  "GSCIS_TAG_CERTI
2c10: 46 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65  FICATE");...case
2c20: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f   GSCIS_TAG_CERT_
2c30: 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72  ISSUE_DATE:....r
2c40: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2c50: 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45  _CERT_ISSUE_DATE
2c60: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2c70: 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45  _TAG_CERT_EXPIRE
2c80: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
2c90: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  ("GSCIS_TAG_CERT
2ca0: 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a  _EXPIRE_DATE");.
2cb0: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b  .}...return("UNK
2cc0: 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69  NOWN");.}..stati
2cd0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
2ce0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
2cf0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
2d00: 4c 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a  LONG retcode) {.
2d10: 09 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65  .switch (retcode
2d20: 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ) {...case SCARD
2d30: 5f 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72  _S_SUCCESS:....r
2d40: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53  eturn("SCARD_S_S
2d50: 55 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65  UCCESS");...case
2d60: 20 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c   SCARD_E_CANCELL
2d70: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
2d80: 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44  CARD_E_CANCELLED
2d90: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2da0: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a  _E_CANT_DISPOSE:
2db0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2dc0: 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45  D_E_CANT_DISPOSE
2dd0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2de0: 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f  _E_INSUFFICIENT_
2df0: 42 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72  BUFFER:....retur
2e00: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46  n("SCARD_E_INSUF
2e10: 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29  FICIENT_BUFFER")
2e20: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2e30: 5f 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09  _INVALID_ATR:...
2e40: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2e50: 5f 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a  _INVALID_ATR");.
2e60: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49  ..case SCARD_E_I
2e70: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09  NVALID_HANDLE:..
2e80: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2e90: 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  E_INVALID_HANDLE
2ea0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2eb0: 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d  _E_INVALID_PARAM
2ec0: 45 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ETER:....return(
2ed0: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
2ee0: 5f 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09  _PARAMETER");...
2ef0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56  case SCARD_E_INV
2f00: 41 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09  ALID_TARGET:....
2f10: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2f20: 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29  INVALID_TARGET")
2f30: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2f40: 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a  _INVALID_VALUE:.
2f50: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2f60: 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45  _E_INVALID_VALUE
2f70: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2f80: 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09  _E_NO_MEMORY:...
2f90: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2fa0: 5f 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09  _NO_MEMORY");...
2fb0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b  case SCARD_E_UNK
2fc0: 4e 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09  NOWN_READER:....
2fd0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2fe0: 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29  UNKNOWN_READER")
2ff0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3000: 5f 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74  _TIMEOUT:....ret
3010: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d  urn("SCARD_E_TIM
3020: 45 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53  EOUT");...case S
3030: 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56  CARD_E_SHARING_V
3040: 49 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74  IOLATION:....ret
3050: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41  urn("SCARD_E_SHA
3060: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29  RING_VIOLATION")
3070: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3080: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09  _NO_SMARTCARD:..
3090: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
30a0: 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29  E_NO_SMARTCARD")
30b0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
30c0: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09  _UNKNOWN_CARD:..
30d0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
30e0: 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29  E_UNKNOWN_CARD")
30f0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3100: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a  _PROTO_MISMATCH:
3110: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3120: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
3130: 43 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  CH");...case SCA
3140: 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a  RD_E_NOT_READY:.
3150: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3160: 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a  _E_NOT_READY");.
3170: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53  ..case SCARD_E_S
3180: 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a  YSTEM_CANCELLED:
3190: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
31a0: 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45  D_E_SYSTEM_CANCE
31b0: 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53  LLED");...case S
31c0: 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53  CARD_E_NOT_TRANS
31d0: 41 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ACTED:....return
31e0: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52  ("SCARD_E_NOT_TR
31f0: 41 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61  ANSACTED");...ca
3200: 73 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45  se SCARD_E_READE
3210: 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09  R_UNAVAILABLE:..
3220: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3230: 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c  E_READER_UNAVAIL
3240: 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53  ABLE");...case S
3250: 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54  CARD_W_UNSUPPORT
3260: 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ED_CARD:....retu
3270: 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55  rn("SCARD_W_UNSU
3280: 50 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a  PPORTED_CARD");.
3290: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55  ..case SCARD_W_U
32a0: 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44  NRESPONSIVE_CARD
32b0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
32c0: 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56  RD_W_UNRESPONSIV
32d0: 45 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65  E_CARD");...case
32e0: 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52   SCARD_W_UNPOWER
32f0: 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ED_CARD:....retu
3300: 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f  rn("SCARD_W_UNPO
3310: 57 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09  WERED_CARD");...
3320: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53  case SCARD_W_RES
3330: 45 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ET_CARD:....retu
3340: 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45  rn("SCARD_W_RESE
3350: 54 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65  T_CARD");...case
3360: 20 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44   SCARD_W_REMOVED
3370: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
3380: 28 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45  ("SCARD_W_REMOVE
3390: 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65  D_CARD");...case
33a0: 20 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f   SCARD_E_PCI_TOO
33b0: 5f 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72  _SMALL:....retur
33c0: 6e 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54  n("SCARD_E_PCI_T
33d0: 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61  OO_SMALL");...ca
33e0: 73 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45  se SCARD_E_READE
33f0: 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09  R_UNSUPPORTED:..
3400: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3410: 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f  E_READER_UNSUPPO
3420: 52 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53  RTED");...case S
3430: 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45  CARD_E_DUPLICATE
3440: 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75  _READER:....retu
3450: 72 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c  rn("SCARD_E_DUPL
3460: 49 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a  ICATE_READER");.
3470: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43  ..case SCARD_E_C
3480: 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a  ARD_UNSUPPORTED:
3490: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
34a0: 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f  D_E_CARD_UNSUPPO
34b0: 52 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53  RTED");...case S
34c0: 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43  CARD_E_NO_SERVIC
34d0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
34e0: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
34f0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3500: 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50  _E_SERVICE_STOPP
3510: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
3520: 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53  CARD_E_SERVICE_S
3530: 54 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65  TOPPED");...case
3540: 20 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f   SCARD_E_UNSUPPO
3550: 52 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09 09  RTED_FEATURE:...
3560: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3570: 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41  _UNSUPPORTED_FEA
3580: 54 55 52 45 22 29 3b 0a 23 69 66 64 65 66 20 53  TURE");.#ifdef S
3590: 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f  CARD_W_INSERTED_
35a0: 43 41 52 44 0a 09 09 63 61 73 65 20 53 43 41 52  CARD...case SCAR
35b0: 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52  D_W_INSERTED_CAR
35c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
35d0: 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43  ARD_W_INSERTED_C
35e0: 41 52 44 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ARD");.#endif.#i
35f0: 66 64 65 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f  fdef SCARD_E_NO_
3600: 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c  READERS_AVAILABL
3610: 45 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  E...case SCARD_E
3620: 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49  _NO_READERS_AVAI
3630: 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  LABLE:....return
3640: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41  ("SCARD_E_NO_REA
3650: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 22 29  DERS_AVAILABLE")
3660: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65  ;.#endif..}...re
3670: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
3680: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
3690: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
36a0: 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54  BUG_FUNC_OBJID_T
36b0: 4f 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f  O_STR(uint16_t o
36c0: 62 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20  bjid) {..switch 
36d0: 28 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65  (objid) {...case
36e0: 20 30 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75   0x2000:....retu
36f0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3700: 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f  BJID_GENERALINFO
3710: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30  ");...case 0x210
3720: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3730: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50  CKEY_TLV_OBJID_P
3740: 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29  ROPERSONALINFO")
3750: 3b 0a 09 09 63 61 73 65 20 30 78 33 30 30 30 3a  ;...case 0x3000:
3760: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3770: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43  EY_TLV_OBJID_ACC
3780: 45 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09  ESSCONTROL");...
3790: 63 61 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09  case 0x4000:....
37a0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
37b0: 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29  LV_OBJID_LOGIN")
37c0: 3b 0a 09 09 63 61 73 65 20 30 78 35 30 30 30 3a  ;...case 0x5000:
37d0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
37e0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52  EY_TLV_OBJID_CAR
37f0: 44 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20  DINFO");...case 
3800: 30 78 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x6000:....retur
3810: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3820: 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29  JID_BIOMETRICS")
3830: 3b 0a 09 09 63 61 73 65 20 30 78 37 30 30 30 3a  ;...case 0x7000:
3840: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3850: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47  EY_TLV_OBJID_DIG
3860: 49 54 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09  ITALSIGCERT");..
3870: 09 63 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09  .case 0x0200:...
3880: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3890: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
38a0: 52 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30  RSON");...case 0
38b0: 78 30 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e  x0202:....return
38c0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
38d0: 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22  ID_CAC_BENEFITS"
38e0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 33  );...case 0x0203
38f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3900: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3910: 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22  C_OTHERBENEFITS"
3920: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 31  );...case 0x0201
3930: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3940: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3950: 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09  C_PERSONNEL");..
3960: 09 63 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09  .case 0x02FE:...
3970: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3980: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b  TLV_OBJID_CAC_PK
3990: 49 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72  ICERT");..}....r
39a0: 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29  eturn("UNKNOWN")
39b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
39c0: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
39d0: 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
39e0: 45 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74  E_TO_STR(uint8_t
39f0: 20 61 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69   apptype) {..swi
3a00: 74 63 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a  tch (apptype) {.
3a10: 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09  ..case 0x00:....
3a20: 72 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a  return("NONE");.
3a30: 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09  ..case 0x01:....
3a40: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3a50: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29  LV_APP_GENERIC")
3a60: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09  ;...case 0x02:..
3a70: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3a80: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a  _TLV_APP_SKI");.
3a90: 09 09 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09  ..case 0x03:....
3aa0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3ab0: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c  LV_APP_GENERIC |
3ac0: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
3ad0: 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SKI");...case 0x
3ae0: 30 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  04:....return("C
3af0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
3b00: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35  I");...case 0x05
3b10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3b20: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45  KEY_TLV_APP_GENE
3b30: 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  RIC | CACKEY_TLV
3b40: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61  _APP_PKI");...ca
3b50: 73 65 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75  se 0x06:....retu
3b60: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
3b70: 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f  PP_SKI | CACKEY_
3b80: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
3b90: 09 63 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72  .case 0x07:....r
3ba0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3bb0: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
3bc0: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
3bd0: 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  KI | CACKEY_TLV_
3be0: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09  APP_PKI");..}...
3bf0: 72 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22  return("INVALID"
3c00: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e  );.}..static con
3c10: 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f  st char *CACKEY_
3c20: 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49  DEBUG_FUNC_ATTRI
3c30: 42 55 54 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41  BUTE_TO_STR(CK_A
3c40: 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 61 74  TTRIBUTE_TYPE at
3c50: 74 72 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61  tr) {..switch (a
3c60: 74 74 72 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ttr) {...case CK
3c70: 41 5f 43 4c 41 53 53 3a 0a 09 09 09 72 65 74 75  A_CLASS:....retu
3c80: 72 6e 28 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b  rn("CKA_CLASS");
3c90: 0a 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45  ...case CKA_TOKE
3ca0: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  N:....return("CK
3cb0: 41 5f 54 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73  A_TOKEN");...cas
3cc0: 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09  e CKA_PRIVATE:..
3cd0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52  ..return("CKA_PR
3ce0: 49 56 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  IVATE");...case 
3cf0: 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65  CKA_LABEL:....re
3d00: 74 75 72 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22  turn("CKA_LABEL"
3d10: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 50  );...case CKA_AP
3d20: 50 4c 49 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65  PLICATION:....re
3d30: 74 75 72 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43  turn("CKA_APPLIC
3d40: 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20  ATION");...case 
3d50: 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65  CKA_VALUE:....re
3d60: 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22  turn("CKA_VALUE"
3d70: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 42  );...case CKA_OB
3d80: 4a 45 43 54 5f 49 44 3a 0a 09 09 09 72 65 74 75  JECT_ID:....retu
3d90: 72 6e 28 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49  rn("CKA_OBJECT_I
3da0: 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  D");...case CKA_
3db0: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
3dc0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
3dd0: 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
3de0: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
3df0: 49 53 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72  ISSUER:....retur
3e00: 6e 28 22 43 4b 41 5f 49 53 53 55 45 52 22 29 3b  n("CKA_ISSUER");
3e10: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49  ...case CKA_SERI
3e20: 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65  AL_NUMBER:....re
3e30: 74 75 72 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c  turn("CKA_SERIAL
3e40: 5f 4e 55 4d 42 45 52 22 29 3b 0a 09 09 63 61 73  _NUMBER");...cas
3e50: 65 20 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a  e CKA_AC_ISSUER:
3e60: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3e70: 41 43 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63  AC_ISSUER");...c
3e80: 61 73 65 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09  ase CKA_OWNER:..
3e90: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57  ..return("CKA_OW
3ea0: 4e 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  NER");...case CK
3eb0: 41 5f 41 54 54 52 5f 54 59 50 45 53 3a 0a 09 09  A_ATTR_TYPES:...
3ec0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 54 54  .return("CKA_ATT
3ed0: 52 5f 54 59 50 45 53 22 29 3b 0a 09 09 63 61 73  R_TYPES");...cas
3ee0: 65 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09  e CKA_TRUSTED:..
3ef0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 52  ..return("CKA_TR
3f00: 55 53 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20  USTED");...case 
3f10: 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09  CKA_KEY_TYPE:...
3f20: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59  .return("CKA_KEY
3f30: 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20  _TYPE");...case 
3f40: 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09  CKA_SUBJECT:....
3f50: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a  return("CKA_SUBJ
3f60: 45 43 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ECT");...case CK
3f70: 41 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  A_ID:....return(
3f80: 22 43 4b 41 5f 49 44 22 29 3b 0a 09 09 63 61 73  "CKA_ID");...cas
3f90: 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a  e CKA_SENSITIVE:
3fa0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3fb0: 53 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63  SENSITIVE");...c
3fc0: 61 73 65 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a  ase CKA_ENCRYPT:
3fd0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3fe0: 45 4e 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73  ENCRYPT");...cas
3ff0: 65 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09  e CKA_DECRYPT:..
4000: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45  ..return("CKA_DE
4010: 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20  CRYPT");...case 
4020: 43 4b 41 5f 57 52 41 50 3a 0a 09 09 09 72 65 74  CKA_WRAP:....ret
4030: 75 72 6e 28 22 43 4b 41 5f 57 52 41 50 22 29 3b  urn("CKA_WRAP");
4040: 0a 09 09 63 61 73 65 20 43 4b 41 5f 55 4e 57 52  ...case CKA_UNWR
4050: 41 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  AP:....return("C
4060: 4b 41 5f 55 4e 57 52 41 50 22 29 3b 0a 09 09 63  KA_UNWRAP");...c
4070: 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09  ase CKA_SIGN:...
4080: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47  .return("CKA_SIG
4090: 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  N");...case CKA_
40a0: 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09  SIGN_RECOVER:...
40b0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47  .return("CKA_SIG
40c0: 4e 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63  N_RECOVER");...c
40d0: 61 73 65 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a  ase CKA_VERIFY:.
40e0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56  ...return("CKA_V
40f0: 45 52 49 46 59 22 29 3b 0a 09 09 63 61 73 65 20  ERIFY");...case 
4100: 43 4b 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56  CKA_VERIFY_RECOV
4110: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ER:....return("C
4120: 4b 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45  KA_VERIFY_RECOVE
4130: 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  R");...case CKA_
4140: 44 45 52 49 56 45 3a 0a 09 09 09 72 65 74 75 72  DERIVE:....retur
4150: 6e 28 22 43 4b 41 5f 44 45 52 49 56 45 22 29 3b  n("CKA_DERIVE");
4160: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 54 41 52  ...case CKA_STAR
4170: 54 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  T_DATE:....retur
4180: 6e 28 22 43 4b 41 5f 53 54 41 52 54 5f 44 41 54  n("CKA_START_DAT
4190: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
41a0: 45 4e 44 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  END_DATE:....ret
41b0: 75 72 6e 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54  urn("CKA_END_DAT
41c0: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
41d0: 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 72 65 74 75  MODULUS:....retu
41e0: 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22  rn("CKA_MODULUS"
41f0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  );...case CKA_MO
4200: 44 55 4c 55 53 5f 42 49 54 53 3a 0a 09 09 09 72  DULUS_BITS:....r
4210: 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c  eturn("CKA_MODUL
4220: 55 53 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73  US_BITS");...cas
4230: 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50  e CKA_PUBLIC_EXP
4240: 4f 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e  ONENT:....return
4250: 28 22 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50  ("CKA_PUBLIC_EXP
4260: 4f 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20  ONENT");...case 
4270: 43 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f  CKA_PRIVATE_EXPO
4280: 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  NENT:....return(
4290: 22 43 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50  "CKA_PRIVATE_EXP
42a0: 4f 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20  ONENT");...case 
42b0: 43 4b 41 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09  CKA_PRIME_1:....
42c0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d  return("CKA_PRIM
42d0: 45 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  E_1");...case CK
42e0: 41 5f 50 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65  A_PRIME_2:....re
42f0: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f  turn("CKA_PRIME_
4300: 32 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  2");...case CKA_
4310: 45 58 50 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72  EXPONENT_1:....r
4320: 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e  eturn("CKA_EXPON
4330: 45 4e 54 5f 31 22 29 3b 0a 09 09 63 61 73 65 20  ENT_1");...case 
4340: 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a  CKA_EXPONENT_2:.
4350: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4360: 58 50 4f 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63  XPONENT_2");...c
4370: 61 73 65 20 43 4b 41 5f 43 4f 45 46 46 49 43 49  ase CKA_COEFFICI
4380: 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ENT:....return("
4390: 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 22  CKA_COEFFICIENT"
43a0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52  );...case CKA_PR
43b0: 49 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IME:....return("
43c0: 43 4b 41 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63  CKA_PRIME");...c
43d0: 61 73 65 20 43 4b 41 5f 53 55 42 50 52 49 4d 45  ase CKA_SUBPRIME
43e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
43f0: 5f 53 55 42 50 52 49 4d 45 22 29 3b 0a 09 09 63  _SUBPRIME");...c
4400: 61 73 65 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09  ase CKA_BASE:...
4410: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 42 41 53  .return("CKA_BAS
4420: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4430: 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72  PRIME_BITS:....r
4440: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45  eturn("CKA_PRIME
4450: 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  _BITS");...case 
4460: 43 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49  CKA_SUB_PRIME_BI
4470: 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  TS:....return("C
4480: 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54  KA_SUB_PRIME_BIT
4490: 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  S");...case CKA_
44a0: 56 41 4c 55 45 5f 42 49 54 53 3a 0a 09 09 09 72  VALUE_BITS:....r
44b0: 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45  eturn("CKA_VALUE
44c0: 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  _BITS");...case 
44d0: 43 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09  CKA_VALUE_LEN:..
44e0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41  ..return("CKA_VA
44f0: 4c 55 45 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73  LUE_LEN");...cas
4500: 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  e CKA_EXTRACTABL
4510: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4520: 41 5f 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b  A_EXTRACTABLE");
4530: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41  ...case CKA_LOCA
4540: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  L:....return("CK
4550: 41 5f 4c 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73  A_LOCAL");...cas
4560: 65 20 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52  e CKA_NEVER_EXTR
4570: 41 43 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  ACTABLE:....retu
4580: 72 6e 28 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58  rn("CKA_NEVER_EX
4590: 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63  TRACTABLE");...c
45a0: 61 73 65 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53  ase CKA_ALWAYS_S
45b0: 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74  ENSITIVE:....ret
45c0: 75 72 6e 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f  urn("CKA_ALWAYS_
45d0: 53 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63  SENSITIVE");...c
45e0: 61 73 65 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f  ase CKA_KEY_GEN_
45f0: 4d 45 43 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65  MECHANISM:....re
4600: 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45  turn("CKA_KEY_GE
4610: 4e 5f 4d 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09  N_MECHANISM");..
4620: 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49  .case CKA_MODIFI
4630: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
4640: 22 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22  "CKA_MODIFIABLE"
4650: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43  );...case CKA_EC
4660: 44 53 41 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72  DSA_PARAMS:....r
4670: 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 44 53 41  eturn("CKA_ECDSA
4680: 5f 50 41 52 41 4d 53 22 29 3b 0a 09 09 63 61 73  _PARAMS");...cas
4690: 65 20 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a  e CKA_EC_POINT:.
46a0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
46b0: 43 5f 50 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73  C_POINT");...cas
46c0: 65 20 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f  e CKA_SECONDARY_
46d0: 41 55 54 48 3a 0a 09 09 09 72 65 74 75 72 6e 28  AUTH:....return(
46e0: 22 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41  "CKA_SECONDARY_A
46f0: 55 54 48 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  UTH");...case CK
4700: 41 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53  A_AUTH_PIN_FLAGS
4710: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4720: 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22  _AUTH_PIN_FLAGS"
4730: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 57  );...case CKA_HW
4740: 5f 46 45 41 54 55 52 45 5f 54 59 50 45 3a 0a 09  _FEATURE_TYPE:..
4750: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 57  ..return("CKA_HW
4760: 5f 46 45 41 54 55 52 45 5f 54 59 50 45 22 29 3b  _FEATURE_TYPE");
4770: 0a 09 09 63 61 73 65 20 43 4b 41 5f 52 45 53 45  ...case CKA_RESE
4780: 54 5f 4f 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65  T_ON_INIT:....re
4790: 74 75 72 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f  turn("CKA_RESET_
47a0: 4f 4e 5f 49 4e 49 54 22 29 3b 0a 09 09 63 61 73  ON_INIT");...cas
47b0: 65 20 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a  e CKA_HAS_RESET:
47c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
47d0: 48 41 53 5f 52 45 53 45 54 22 29 3b 0a 09 09 63  HAS_RESET");...c
47e0: 61 73 65 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44  ase CKA_VENDOR_D
47f0: 45 46 49 4e 45 44 3a 0a 09 09 09 72 65 74 75 72  EFINED:....retur
4800: 6e 28 22 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45  n("CKA_VENDOR_DE
4810: 46 49 4e 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65  FINED");..}...re
4820: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
4830: 0a 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20 6d 61  .}..#  define ma
4840: 6c 6c 6f 63 28 78 29 20 43 41 43 4b 45 59 5f 44  lloc(x) CACKEY_D
4850: 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43  EBUG_FUNC_MALLOC
4860: 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f  (x, __func__, __
4870: 4c 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e  LINE__).#  defin
4880: 65 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20  e realloc(x, y) 
4890: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
48a0: 43 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20  C_REALLOC(x, y, 
48b0: 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45  __func__, __LINE
48c0: 5f 5f 29 0a 23 20 20 69 66 64 65 66 20 73 74 72  __).#  ifdef str
48d0: 64 75 70 0a 23 20 20 20 20 75 6e 64 65 66 20 73  dup.#    undef s
48e0: 74 72 64 75 70 0a 23 20 20 65 6e 64 69 66 0a 23  trdup.#  endif.#
48f0: 20 20 64 65 66 69 6e 65 20 73 74 72 64 75 70 28    define strdup(
4900: 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  x) CACKEY_DEBUG_
4910: 46 55 4e 43 5f 53 54 52 44 55 50 28 78 2c 20 5f  FUNC_STRDUP(x, _
4920: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
4930: 5f 29 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  _).#else.#  defi
4940: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4950: 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a  PRINTF(x...) /**
4960: 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  /.#  define CACK
4970: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
4980: 46 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a  F(f, x, y) /**/.
4990: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
49a0: 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28 78 29  _DEBUG_PERROR(x)
49b0: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20   /**/.#  define 
49c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
49d0: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 78 29 20  C_TAG_TO_STR(x) 
49e0: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22  "DEBUG_DISABLED"
49f0: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4a00: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
4a10: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 78 29 20  RDERR_TO_STR(x) 
4a20: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22  "DEBUG_DISABLED"
4a30: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4a40: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a  Y_DEBUG_FUNC_OBJ
4a50: 49 44 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45  ID_TO_STR(x) "DE
4a60: 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20  BUG_DISABLED".# 
4a70: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
4a80: 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
4a90: 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42  E_TO_STR(x) "DEB
4aa0: 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20  UG_DISABLED".#  
4ab0: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4ac0: 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55  BUG_FUNC_ATTRIBU
4ad0: 54 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45  TE_TO_STR(x) "DE
4ae0: 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 65  BUG_DISABLED".#e
4af0: 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 63 61 63  ndif..struct cac
4b00: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
4b10: 79 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  y {..unsigned ch
4b20: 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a 09 75  ar applet[7];..u
4b30: 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b 0a 0a 09  int16_t file;...
4b40: 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61  size_t certifica
4b50: 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65  te_len;..unsigne
4b60: 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63  d char *certific
4b70: 61 74 65 3b 0a 0a 09 73 73 69 7a 65 5f 74 20 6b  ate;...ssize_t k
4b80: 65 79 73 69 7a 65 3b 0a 7d 3b 0a 0a 73 74 72 75  eysize;.};..stru
4b90: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
4ba0: 74 79 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  ty {..struct cac
4bb0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
4bc0: 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y *pcsc_identity
4bd0: 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  ;...CK_ATTRIBUTE
4be0: 20 2a 61 74 74 72 69 62 75 74 65 73 3b 0a 09 43   *attributes;..C
4bf0: 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69 62 75 74  K_ULONG attribut
4c00: 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74  es_count;.};..st
4c10: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73  ruct cackey_sess
4c20: 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63 74 69 76  ion {..int activ
4c30: 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  e;...CK_SLOT_ID 
4c40: 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53 54 41  slotID;...CK_STA
4c50: 54 45 20 73 74 61 74 65 3b 0a 09 43 4b 5f 46 4c  TE state;..CK_FL
4c60: 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 4b 5f 55  AGS flags;..CK_U
4c70: 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65 45 72 72  LONG ulDeviceErr
4c80: 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52  or;..CK_VOID_PTR
4c90: 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09   pApplication;..
4ca0: 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74 69 66 79  CK_NOTIFY Notify
4cb0: 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  ;...struct cacke
4cc0: 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
4cd0: 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65  tities;..unsigne
4ce0: 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65  d long identitie
4cf0: 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20 73  s_count;...int s
4d00: 65 61 72 63 68 5f 61 63 74 69 76 65 3b 0a 09 43  earch_active;..C
4d10: 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
4d20: 73 65 61 72 63 68 5f 71 75 65 72 79 3b 0a 09 43  search_query;..C
4d30: 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63 68 5f 71  K_ULONG search_q
4d40: 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73  uery_count;..uns
4d50: 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65 61 72 63  igned long searc
4d60: 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09 69 6e 74  h_curr_id;...int
4d70: 20 73 69 67 6e 5f 61 63 74 69 76 65 3b 0a 09 43   sign_active;..C
4d80: 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45  K_MECHANISM_TYPE
4d90: 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 3b   sign_mechanism;
4da0: 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52 20 73 69  ..CK_BYTE_PTR si
4db0: 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65  gn_buf;..unsigne
4dc0: 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 6c  d long sign_bufl
4dd0: 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  en;..unsigned lo
4de0: 6e 67 20 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  ng sign_bufused;
4df0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
4e00: 69 64 65 6e 74 69 74 79 20 2a 73 69 67 6e 5f 69  identity *sign_i
4e10: 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e 74 20 64  dentity;...int d
4e20: 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b 0a 09  ecrypt_active;..
4e30: 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50  CK_MECHANISM_TYP
4e40: 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e  E decrypt_mechan
4e50: 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54  ism;..CK_VOID_PT
4e60: 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70  R decrypt_mech_p
4e70: 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64  arm;..CK_ULONG d
4e80: 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
4e90: 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20 63 61 63  len;..struct cac
4ea0: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 64 65  key_identity *de
4eb0: 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 3b 0a  crypt_identity;.
4ec0: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
4ed0: 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74 20 61 63  y_slot {..int ac
4ee0: 74 69 76 65 3b 0a 0a 09 63 68 61 72 20 2a 70 63  tive;...char *pc
4ef0: 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69 6e 74  sc_reader;...int
4f00: 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65   pcsc_card_conne
4f10: 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41 4e 44  cted;..SCARDHAND
4f20: 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a 0a 09  LE pcsc_card;...
4f30: 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f  int transaction_
4f40: 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72 61 6e  depth;..int tran
4f50: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
4f60: 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74  lock;...int slot
4f70: 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41  _reset;...CK_FLA
4f80: 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a  GS token_flags;.
4f90: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
4fa0: 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52 44 20  *label;...DWORD 
4fb0: 70 72 6f 74 6f 63 6f 6c 3b 0a 7d 3b 0a 0a 74 79  protocol;.};..ty
4fc0: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41  pedef enum {..CA
4fd0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
4fe0: 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09 43 41  ERIC = 0x01,..CA
4ff0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
5000: 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09 43 41       = 0x02,..CA
5010: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
5020: 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20 63 61       = 0x04.} ca
5030: 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65  ckey_tlv_apptype
5040: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  ;..typedef enum 
5050: 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  {..CACKEY_TLV_OB
5060: 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 20  JID_GENERALINFO 
5070: 20 20 20 20 20 20 3d 20 30 78 32 30 30 30 2c 0a        = 0x2000,.
5080: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5090: 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46  D_PROPERSONALINF
50a0: 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a 09 43  O   = 0x2100,..C
50b0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
50c0: 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20 20 20  ACCESSCONTROL   
50d0: 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43 41 43    = 0x3000,..CAC
50e0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f  KEY_TLV_OBJID_LO
50f0: 47 49 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  GIN             
5100: 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x4000,..CACKE
5110: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44  Y_TLV_OBJID_CARD
5120: 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20 3d 20  INFO          = 
5130: 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x5000,..CACKEY_
5140: 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54  TLV_OBJID_BIOMET
5150: 52 49 43 53 20 20 20 20 20 20 20 20 3d 20 30 78  RICS        = 0x
5160: 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  6000,..CACKEY_TL
5170: 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53  V_OBJID_DIGITALS
5180: 49 47 43 45 52 54 20 20 20 20 3d 20 30 78 37 30  IGCERT    = 0x70
5190: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
51a0: 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e  OBJID_CAC_PERSON
51b0: 20 20 20 20 20 20 20 20 3d 20 30 78 30 32 30 30          = 0x0200
51c0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
51d0: 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53  JID_CAC_BENEFITS
51e0: 20 20 20 20 20 20 3d 20 30 78 30 32 30 32 2c 0a        = 0x0202,.
51f0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5200: 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46  D_CAC_OTHERBENEF
5210: 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a 09 43  ITS = 0x0203,..C
5220: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5230: 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20 20 20  CAC_PERSONNEL   
5240: 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43 41 43    = 0x0201,..CAC
5250: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5260: 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20 20 20  C_PKICERT       
5270: 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63 6b 65  = 0x02FE.} cacke
5280: 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 3b 0a  y_tlv_objectid;.
5290: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a  .typedef enum {.
52a0: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54  .CACKEY_PCSC_S_T
52b0: 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20 20 3d  OKENPRESENT    =
52c0: 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43   1,..CACKEY_PCSC
52d0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20  _S_OK           
52e0: 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45 59 5f     = 0,..CACKEY_
52f0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
5300: 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09 43 41         = -1,..CA
5310: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
5320: 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20 2d 32  IN          = -2
5330: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
5340: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20  _LOCKED         
5350: 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59 5f 50   = -3,..CACKEY_P
5360: 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20  CSC_E_NEEDLOGIN 
5370: 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43 41 43        = -4,..CAC
5380: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
5390: 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d 36 2c  ABSENT     = -6,
53a0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
53b0: 52 45 54 52 59 20 20 20 20 20 20 20 20 20 20 20  RETRY           
53c0: 3d 20 2d 37 0a 7d 20 63 61 63 6b 65 79 5f 72 65  = -7.} cackey_re
53d0: 74 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  t;..struct cacke
53e0: 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b 0a  y_tlv_cardurl {.
53f0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20  .unsigned char  
5400: 20 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09 63        rid[5];..c
5410: 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70  ackey_tlv_apptyp
5420: 65 20 20 20 61 70 70 74 79 70 65 3b 0a 09 63 61  e   apptype;..ca
5430: 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69  ckey_tlv_objecti
5440: 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63 61  d  objectid;..ca
5450: 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69  ckey_tlv_objecti
5460: 64 20 20 61 70 70 69 64 3b 0a 09 75 6e 73 69 67  d  appid;..unsig
5470: 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20  ned char        
5480: 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63  pinid;.};..struc
5490: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
54a0: 69 74 79 3b 0a 73 74 72 75 63 74 20 63 61 63 6b  ity;.struct cack
54b0: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b 0a  ey_tlv_entity {.
54c0: 09 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09 73  .uint8_t tag;..s
54d0: 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a 09  ize_t length;...
54e0: 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20 2a  union {...void *
54f0: 76 61 6c 75 65 3b 0a 09 09 73 74 72 75 63 74 20  value;...struct 
5500: 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75  cackey_tlv_cardu
5510: 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64 75 72  rl *value_cardur
5520: 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76 61 6c  l;...uint8_t val
5530: 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73  ue_byte;..};...s
5540: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
5550: 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b 0a  _entity *_next;.
5560: 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47 6c  };../* CACKEY Gl
5570: 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a  obal Handles */.
5580: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 61 63  static void *cac
5590: 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e 55  key_biglock = NU
55a0: 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63  LL;.static struc
55b0: 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  t cackey_session
55c0: 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
55d0: 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 73 74  [128];.static st
55e0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
55f0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31 32   cackey_slots[12
5600: 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63  8];.static int c
5610: 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
5620: 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  d = 0;.static in
5630: 74 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  t cackey_biglock
5640: 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f  _init = 0;.CK_C_
5650: 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20  INITIALIZE_ARGS 
5660: 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a  cackey_args;../*
5670: 2a 20 45 78 74 72 61 20 63 65 72 74 69 66 69 63  * Extra certific
5680: 61 74 65 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  ates to include 
5690: 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73 74 72  in token **/.str
56a0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
56b0: 69 64 65 6e 74 69 74 79 20 65 78 74 72 61 5f 63  identity extra_c
56c0: 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c  erts[] = {.#incl
56d0: 75 64 65 20 22 63 61 63 6b 65 79 5f 62 75 69 6c  ude "cackey_buil
56e0: 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d 3b 0a  tin_certs.h".};.
56f0: 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c 20  ./* PCSC Global 
5700: 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69  Handles */.stati
5710: 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 58 54  c LPSCARDCONTEXT
5720: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e   cackey_pcsc_han
5730: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61  dle = NULL;..sta
5740: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  tic unsigned lon
5750: 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73  g cackey_getvers
5760: 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74 61  ion(void) {..sta
5770: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  tic unsigned lon
5780: 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a  g retval = 255;.
5790: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d  .unsigned long m
57a0: 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67  ajor = 0;..unsig
57b0: 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d  ned long minor =
57c0: 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72   0;..char *major
57d0: 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68  _str = NULL;..ch
57e0: 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20  ar *minor_str = 
57f0: 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  NULL;...CACKEY_D
5800: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
5810: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65  led.");...if (re
5820: 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09  tval != 255) {..
5830: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5840: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
5850: 30 78 25 6c 78 20 28 63 61 63 68 65 64 29 2e 22  0x%lx (cached)."
5860: 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65  , retval);....re
5870: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d  turn(retval);..}
5880: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a  ...retval = 0;..
5890: 23 69 66 64 65 66 20 50 41 43 4b 41 47 45 5f 56  #ifdef PACKAGE_V
58a0: 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d  ERSION.        m
58b0: 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b 41  ajor_str = PACKA
58c0: 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20  GE_VERSION;..if 
58d0: 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20  (major_str) {.. 
58e0: 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73         major = s
58f0: 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72  trtoul(major_str
5900: 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30  , &minor_str, 10
5910: 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f  );....if (minor_
5920: 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20  str) {....minor 
5930: 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f  = strtoul(minor_
5940: 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31  str + 1, NULL, 1
5950: 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  0);...}..}...ret
5960: 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20  val = (major << 
5970: 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20  16) | (minor << 
5980: 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  8);.#endif...CAC
5990: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
59a0: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c  ("Returning 0x%l
59b0: 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  x", retval);...r
59c0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
59d0: 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61 74  ../* PC/SC Relat
59e0: 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ed Functions */.
59f0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
5a00: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65  *     void cacke
5a10: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
5a20: 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a  ct_all(void);. *
5a30: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
5a40: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
5a50: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
5a60: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e      None. *. * N
5a70: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
5a80: 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e   function discon
5a90: 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63  nects from all c
5aa0: 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  ards.. *. */.sta
5ab0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
5ac0: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
5ad0: 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75 69  _all(void) {..ui
5ae0: 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41  nt32_t idx;...CA
5af0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5b00: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
5b10: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
5b20: 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
5b30: 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
5b40: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
5b50: 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
5b60: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
5b70: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
5b80: 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09  _connected) {...
5b90: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5ba0: 49 4e 54 46 28 22 53 43 61 72 64 44 69 73 63 6f  INTF("SCardDisco
5bb0: 6e 6e 65 63 74 28 25 6c 75 29 20 63 61 6c 6c 65  nnect(%lu) calle
5bc0: 64 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d", (unsigned lo
5bd0: 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09 09 53 43  ng) idx);.....SC
5be0: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 63 61  ardDisconnect(ca
5bf0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
5c00: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
5c10: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09  _LEAVE_CARD);...
5c20: 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
5c30: 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
5c40: 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
5c50: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61  ey_slots[idx].la
5c60: 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  bel);.....cackey
5c70: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65  _slots[idx].labe
5c80: 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  l = NULL;...}...
5c90: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
5ca0: 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  x].pcsc_card_con
5cb0: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 63 61  nected = 0;...ca
5cc0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
5cd0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
5ce0: 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  h = 0;...cackey_
5cf0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
5d00: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
5d10: 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28  ock = 0;....if (
5d20: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
5d30: 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43  ].active) {....C
5d40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5d50: 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 63 74 69  TF("Marking acti
5d60: 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 73 20 62  ve slot %lu as b
5d70: 65 69 6e 67 20 72 65 73 65 74 22 2c 20 28 75 6e  eing reset", (un
5d80: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78  signed long) idx
5d90: 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
5da0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74  _slots[idx].slot
5db0: 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a  _reset = 1;..}..
5dc0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5dd0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 22  INTF("Returning"
5de0: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );...return;.}..
5df0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
5e00: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
5e10: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
5e20: 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20  nect(void);. *. 
5e30: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
5e40: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45     None. *. * RE
5e50: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
5e60: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
5e70: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
5e80: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
5e90: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
5ea0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
5eb0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
5ec0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
5ed0: 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 65 20  connects to the 
5ee0: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
5ef0: 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64   Manager and upd
5f00: 61 74 65 73 20 74 68 65 0a 20 2a 20 20 20 20 20  ates the. *     
5f10: 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20  global handle.. 
5f20: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
5f30: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
5f40: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64  csc_connect(void
5f50: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
5f60: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b  est_context_ret;
5f70: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41  .#ifdef HAVE_SCA
5f80: 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54  RDISVALIDCONTEXT
5f90: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73 76  ..LONG scard_isv
5fa0: 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66  alid_ret;.#endif
5fb0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5fc0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
5fd0: 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
5fe0: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e  pcsc_handle == N
5ff0: 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
6000: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61  pcsc_handle = ma
6010: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63  lloc(sizeof(*cac
6020: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6030: 29 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
6040: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e  pcsc_handle == N
6050: 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ULL) {....CACKEY
6060: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6070: 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20  all to malloc() 
6080: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
6090: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
60a0: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
60b0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
60c0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
60d0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
60e0: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  RIC);...}....CAC
60f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6100: 28 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  ("SCardEstablish
6110: 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64  Context() called
6120: 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f  ");...scard_est_
6130: 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43  context_ret = SC
6140: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6150: 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f  ext(SCARD_SCOPE_
6160: 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55  SYSTEM, NULL, NU
6170: 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  LL, cackey_pcsc_
6180: 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73  handle);...if (s
6190: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
61a0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
61b0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41  SUCCESS) {....CA
61c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
61d0: 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64  F("Call to SCard
61e0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
61f0: 20 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65   failed (returne
6200: 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72  d %s/%li), retur
6210: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
6220: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
6230: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
6240: 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  STR(scard_est_co
6250: 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e  ntext_ret), (lon
6260: 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  g) scard_est_con
6270: 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66  text_ret);.....f
6280: 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  ree(cackey_pcsc_
6290: 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b  handle);....cack
62a0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
62b0: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65   NULL;.....cacke
62c0: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
62d0: 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65  ct_all();.....re
62e0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
62f0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
6300: 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45  ..}..#ifdef HAVE
6310: 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e  _SCARDISVALIDCON
6320: 54 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 45 42  TEXT..CACKEY_DEB
6330: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
6340: 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 29  IsValidContext()
6350: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72   called");..scar
6360: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 3d 20  d_isvalid_ret = 
6370: 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74  SCardIsValidCont
6380: 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ext(*cackey_pcsc
6390: 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73  _handle);..if (s
63a0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
63b0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
63c0: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
63d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61  DEBUG_PRINTF("Ha
63e0: 6e 64 6c 65 20 68 61 73 20 62 65 63 6f 6d 65 20  ndle has become 
63f0: 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64 49 73  invalid (SCardIs
6400: 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20 25  ValidContext = %
6410: 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 20 74  s/%li), trying t
6420: 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e  o re-establish..
6430: 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  .", CACKEY_DEBUG
6440: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
6450: 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 73 76 61  O_STR(scard_isva
6460: 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  lid_ret), (long)
6470: 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72   scard_isvalid_r
6480: 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  et);....CACKEY_D
6490: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
64a0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
64b0: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
64c0: 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  .scard_est_conte
64d0: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73  xt_ret = SCardEs
64e0: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53  tablishContext(S
64f0: 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45  CARD_SCOPE_SYSTE
6500: 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63  M, NULL, NULL, c
6510: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6520: 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f  e);...if (scard_
6530: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
6540: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6550: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
6560: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6570: 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62  ll to SCardEstab
6580: 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c  lishContext fail
6590: 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f  ed (returned %s/
65a0: 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20  %li), returning 
65b0: 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43  in failure", CAC
65c0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
65d0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
65e0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
65f0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
6600: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
6610: 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63  ret);.....free(c
6620: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6630: 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63  e);....cackey_pc
6640: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c  sc_handle = NULL
6650: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
6660: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
6670: 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  l();.....return(
6680: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6690: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43  NERIC);...}....C
66a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
66b0: 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62  TF("Handle has b
66c0: 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68  een re-establish
66d0: 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  ed");..}.#endif.
66e0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
66f0: 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c  RINTF("Sucessful
6700: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ly connected to 
6710: 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e 67  PC/SC, returning
6720: 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a   in success");..
6730: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6740: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
6750: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
6760: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
6770: 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
6780: 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a  nnect(void);. *.
6790: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
67a0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52      None. *. * R
67b0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
67c0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
67d0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
67e0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
67f0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
6800: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
6810: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
6820: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
6830: 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f   disconnects fro
6840: 6d 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  m the PC/SC Conn
6850: 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61  ection manager a
6860: 6e 64 20 75 70 64 61 74 65 73 0a 20 2a 20 20 20  nd updates. *   
6870: 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e    the global han
6880: 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  dle.. *. */.stat
6890: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
68a0: 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
68b0: 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f  nect(void) {..LO
68c0: 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e  NG scard_rel_con
68d0: 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  text_ret;...CACK
68e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
68f0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
6900: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
6910: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ndle == NULL) {.
6920: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6930: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
6940: 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65  .scard_rel_conte
6950: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  xt_ret = SCardRe
6960: 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 2a 63 61  leaseContext(*ca
6970: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6980: 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
6990: 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09  pcsc_handle) {..
69a0: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73  .free(cackey_pcs
69b0: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63  c_handle);.....c
69c0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
69d0: 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69  e = NULL;..}...i
69e0: 66 20 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e  f (scard_rel_con
69f0: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52  text_ret != SCAR
6a00: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
6a10: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6a20: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
6a30: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  .}...return(CACK
6a40: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
6a50: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
6a60: 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63  . *     void cac
6a70: 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
6a80: 73 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  set(struct cacke
6a90: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
6aa0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
6ab0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
6ac0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
6ad0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
6ae0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
6af0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73  s function marks
6b00: 20 61 20 73 6c 6f 74 20 68 61 73 20 68 61 76 69   a slot has havi
6b10: 6e 67 20 62 65 65 6e 20 72 65 73 65 74 2c 20 74  ng been reset, t
6b20: 6f 20 6c 61 74 65 72 20 62 65 20 63 6c 65 61 6e  o later be clean
6b30: 65 64 20 75 70 2e 0a 20 2a 20 20 20 20 20 43 6c  ed up.. *     Cl
6b40: 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61 70 70 65  eanup only happe
6b50: 6e 73 20 77 68 65 6e 20 61 20 50 4b 43 53 23 31  ns when a PKCS#1
6b60: 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c 73 20 43  1 client calls C
6b70: 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
6b80: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
6b90: 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b  void cackey_mark
6ba0: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75  _slot_reset(stru
6bb0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
6bc0: 73 6c 6f 74 29 20 7b 0a 09 69 66 20 28 73 6c 6f  slot) {..if (slo
6bd0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
6be0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b  eturn;..}...CACK
6bf0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6c00: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
6c10: 20 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   (slot->pcsc_car
6c20: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
6c30: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
6c40: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
6c50: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
6c60: 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  RD);..}...slot->
6c70: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
6c80: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
6c90: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
6ca0: 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61  .slot->token_fla
6cb0: 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
6cc0: 45 51 55 49 52 45 44 3b 0a 0a 09 43 41 43 4b 45  EQUIRED;...CACKE
6cd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6ce0: 52 65 74 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09  Returning.");...
6cf0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
6d00: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
6d10: 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63   LONG cackey_rec
6d20: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
6d30: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
6d40: 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61  slot, DWORD defa
6d50: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50  ult_protocol, LP
6d60: 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f 70  DWORD selected_p
6d70: 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20  rotocol);. *. * 
6d80: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
6d90: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
6da0: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
6db0: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
6dc0: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
6dd0: 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70   DWORD default_p
6de0: 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20  rotocol. *      
6df0: 20 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61     Protocol to a
6e00: 74 74 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a  ttempt first. *.
6e10: 20 2a 20 20 20 20 20 4c 50 44 57 4f 52 44 20 73   *     LPDWORD s
6e20: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
6e30: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
6e40: 5d 20 50 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  ] Protocol selec
6e50: 74 65 64 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ted. *. * RETURN
6e60: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68   VALUE. *     Th
6e70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  e return value f
6e80: 72 6f 6d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  rom SCardReconne
6e90: 63 74 28 29 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  ct(). *. * NOTES
6ea0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
6eb0: 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
6ec0: 65 72 20 61 72 6f 75 6e 64 20 53 43 61 72 64 52  er around SCardR
6ed0: 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a  econnect(). *. *
6ee0: 20 20 20 20 20 54 68 65 20 53 43 61 72 64 52 65       The SCardRe
6ef0: 63 6f 6e 6e 65 63 74 28 29 20 66 75 6e 63 74 69  connect() functi
6f00: 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20  on call will be 
6f10: 63 61 6c 6c 65 64 20 66 69 72 73 74 20 77 69 74  called first wit
6f20: 68 20 74 68 65 0a 20 2a 20 20 20 20 20 64 77 50  h the. *     dwP
6f30: 72 65 66 65 72 72 65 64 50 72 6f 74 6f 63 6f 6c  referredProtocol
6f40: 73 20 6f 66 20 22 64 65 66 61 75 6c 74 5f 70 72  s of "default_pr
6f50: 6f 74 6f 63 6f 6c 22 2e 20 20 49 66 20 74 68 61  otocol".  If tha
6f60: 74 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  t call returns. 
6f70: 2a 20 20 20 20 20 53 43 41 52 44 5f 45 5f 50 52  *     SCARD_E_PR
6f80: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 20 74 72 79  OTO_MISMATCH try
6f90: 20 61 67 61 69 6e 20 77 69 74 68 20 61 20 70 72   again with a pr
6fa0: 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d 30 2c 20 61  otocol of T=0, a
6fb0: 6e 64 20 66 61 69 6c 69 6e 67 0a 20 2a 20 20 20  nd failing. *   
6fc0: 20 20 74 68 61 74 20 54 3d 31 2e 0a 20 2a 0a 20    that T=1.. *. 
6fd0: 2a 2f 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 63  */.static LONG c
6fe0: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
6ff0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
7000: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44  ey_slot *slot, D
7010: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f  WORD default_pro
7020: 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52 44 20 73  tocol, LPDWORD s
7030: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
7040: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
7050: 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 73 63 61 72  conn_ret;...scar
7060: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7070: 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  rdReconnect(slot
7080: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
7090: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
70a0: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
70b0: 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  l, SCARD_RESET_C
70c0: 41 52 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72  ARD, selected_pr
70d0: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28 73  otocol);...if (s
70e0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
70f0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7100: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41 43  ISMATCH) {...CAC
7110: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7120: 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  ("SCardReconnect
7130: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
7140: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
7150: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
7160: 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63 61  just T=0")...sca
7170: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
7180: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f  ardReconnect(slo
7190: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
71a0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
71b0: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
71c0: 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45 54  _T0, SCARD_RESET
71d0: 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64 5f  _CARD, selected_
71e0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66  protocol);....if
71f0: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
7200: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
7210: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
7220: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7230: 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e  INTF("SCardRecon
7240: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
7250: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7260: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
7270: 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09  ith just T=1")..
7280: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
7290: 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63   = SCardReconnec
72a0: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
72b0: 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  d, SCARD_SHARE_S
72c0: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
72d0: 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44 5f  TOCOL_T1, SCARD_
72e0: 52 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65  RESET_CARD, sele
72f0: 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a  cted_protocol);.
7300: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ..}..}...return(
7310: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b  scard_conn_ret);
7320: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
7330: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
7340: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
7350: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
7360: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
7370: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
7380: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
7390: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
73a0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
73b0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
73c0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
73d0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
73e0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
73f0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
7400: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
7410: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
7420: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
7430: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
7440: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
7450: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
7460: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
7470: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7480: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
7490: 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  _ret pcsc_connec
74a0: 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 70 72  t_ret;..DWORD pr
74b0: 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63  otocol;..LONG sc
74c0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09  ard_conn_ret;...
74d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
74e0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
74f0: 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09  ..if (!slot) {..
7500: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7510: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c  INTF("Invalid sl
7520: 6f 74 20 73 70 65 63 69 66 69 65 64 2c 20 72 65  ot specified, re
7530: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
7540: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
7550: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7560: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73  NERIC);..}...pcs
7570: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
7580: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
7590: 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63  ect();..if (pcsc
75a0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
75b0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
75c0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
75d0: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65  UG_PRINTF("Conne
75e0: 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66  ction to PC/SC f
75f0: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
7600: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
7610: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7620: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
7630: 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74  ..}.../* Connect
7640: 20 74 6f 20 72 65 61 64 65 72 2c 20 69 66 20 6e   to reader, if n
7650: 65 65 64 65 64 20 2a 2f 0a 09 69 66 20 28 21 73  eeded */..if (!s
7660: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
7670: 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41  onnected) {...CA
7680: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7690: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
76a0: 25 73 29 20 63 61 6c 6c 65 64 22 2c 20 73 6c 6f  %s) called", slo
76b0: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t->pcsc_reader);
76c0: 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
76d0: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
76e0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
76f0: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
7700: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
7710: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
7720: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c  RD_PROTOCOL_T0 |
7730: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
7740: 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T1, &slot->pcsc_
7750: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
7760: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  ;....if (scard_c
7770: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
7780: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
7790: 48 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  H) {....CACKEY_D
77a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
77b0: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
77c0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
77d0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
77e0: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
77f0: 30 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e  0")....scard_con
7800: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
7810: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
7820: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
7830: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
7840: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
7850: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
7860: 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T0, &slot->pcsc_
7870: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
7880: 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  ;.....if (scard_
7890: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
78a0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
78b0: 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  CH) {.....CACKEY
78c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
78d0: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65  CardConnect() re
78e0: 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50  turned SCARD_E_P
78f0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74  ROTO_MISMATCH, t
7900: 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20  rying with just 
7910: 54 3d 31 22 29 0a 09 09 09 09 73 63 61 72 64 5f  T=1").....scard_
7920: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
7930: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f  Connect(*cackey_
7940: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f  pcsc_handle, slo
7950: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  t->pcsc_reader, 
7960: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
7970: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
7980: 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63  OL_T1, &slot->pc
7990: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63  sc_card, &protoc
79a0: 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  ol);....}...}...
79b0: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
79c0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 55  ret == SCARD_W_U
79d0: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 29 20 7b  NPOWERED_CARD) {
79e0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
79f0: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
7a00: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
7a10: 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52   SCARD_W_UNPOWER
7a20: 45 44 5f 43 41 52 44 2c 20 74 72 79 69 6e 67 20  ED_CARD, trying 
7a30: 74 6f 20 72 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e  to re-connect...
7a40: 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f  ");.....scard_co
7a50: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
7a60: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
7a70: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
7a80: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
7a90: 41 52 44 5f 53 48 41 52 45 5f 44 49 52 45 43 54  ARD_SHARE_DIRECT
7aa0: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
7ab0: 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54  _T0 | SCARD_PROT
7ac0: 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e  OCOL_T1, &slot->
7ad0: 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74  pcsc_card, &prot
7ae0: 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73  ocol);.....if (s
7af0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
7b00: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7b10: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43  ISMATCH) {.....C
7b20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7b30: 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74  TF("SCardConnect
7b40: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
7b50: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
7b60: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
7b70: 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 09 73  just T=0").....s
7b80: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
7b90: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
7ba0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7bb0: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
7bc0: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
7bd0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7be0: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f  ROTOCOL_T0, &slo
7bf0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
7c00: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 09 69  rotocol);......i
7c10: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7c20: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7c30: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7c40: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7c50: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
7c60: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
7c70: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7c80: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
7c90: 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a  with just T=1").
7ca0: 09 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  .....scard_conn_
7cb0: 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65  ret = SCardConne
7cc0: 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  ct(*cackey_pcsc_
7cd0: 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63  handle, slot->pc
7ce0: 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44  sc_reader, SCARD
7cf0: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
7d00: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
7d10: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
7d20: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
7d30: 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 73  ....}....}.....s
7d40: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
7d50: 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
7d60: 5f 63 61 72 64 28 73 6c 6f 74 2c 20 70 72 6f 74  _card(slot, prot
7d70: 6f 63 6f 6c 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  ocol, &protocol)
7d80: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61  ;...}....if (sca
7d90: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53  rd_conn_ret != S
7da0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
7db0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
7dc0: 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
7dd0: 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69  tion to card fai
7de0: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
7df0: 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 64  n failure (SCard
7e00: 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25  Connect() = %s/%
7e10: 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  li)", CACKEY_DEB
7e20: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
7e30: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f  _TO_STR(scard_co
7e40: 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  nn_ret), (long) 
7e50: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b  scard_conn_ret);
7e60: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
7e70: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7e80: 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d  C);...}....slot-
7e90: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
7ea0: 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74  cted = 1;...slot
7eb0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
7ec0: 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d  pth = 0;...slot-
7ed0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
7ee0: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09  d_hw_lock = 0;..
7ef0: 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20  .slot->protocol 
7f00: 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a  = protocol;..}..
7f10: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7f20: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
7f30: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
7f40: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
7f50: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
7f60: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
7f70: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7f80: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
7f90: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
7fa0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
7fb0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
7fc0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
7fd0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
7fe0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
7ff0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
8000: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
8010: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
8020: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
8030: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
8040: 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72  ES. *     The tr
8050: 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64  ansaction should
8060: 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75   be terminated u
8070: 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64  sing "cackey_end
8080: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a  _transaction". *
8090: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
80a0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65  ey_ret cackey_be
80b0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
80c0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
80d0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
80e0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
80f0: 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73  onn_ret;..LONG s
8100: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a  card_trans_ret;.
8110: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8120: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
8130: 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ;...cackey_conn_
8140: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
8150: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
8160: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e  ..if (cackey_con
8170: 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
8180: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
8190: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
81a0: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
81b0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
81c0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
81d0: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
81e0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
81f0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ERIC);..}...slot
8200: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8210: 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f  pth++;...if (slo
8220: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8230: 65 70 74 68 20 3e 20 31 20 26 26 20 21 73 6c 6f  epth > 1 && !slo
8240: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
8250: 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09  eed_hw_lock) {..
8260: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8270: 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20 69 6e  INTF("Already in
8280: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
8290: 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63  performing no ac
82a0: 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74 68 20  tion (new depth 
82b0: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
82c0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
82d0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
82e0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
82f0: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  }...slot->transa
8300: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
8310: 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f  ck = 0;...scard_
8320: 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72  trans_ret = SCar
8330: 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  dBeginTransactio
8340: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
8350: 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74  d);..if (scard_t
8360: 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52  rans_ret != SCAR
8370: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
8380: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8390: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
83a0: 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
83b0: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
83c0: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
83d0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
83e0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
83f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8400: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
8410: 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69   began transacti
8420: 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22  on on slot (%s)"
8430: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
8440: 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  der);...return(C
8450: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
8460: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
8470: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
8480: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64  y_ret cackey_end
8490: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
84a0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
84b0: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
84c0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
84d0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
84e0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
84f0: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
8500: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
8510: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
8520: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
8530: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
8540: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
8550: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
8560: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
8570: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
8580: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71  his function req
8590: 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65  uires "cackey_be
85a0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  gin_transaction"
85b0: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69   to be called fi
85c0: 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  rst. *. */.stati
85d0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
85e0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
85f0: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
8600: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
8610: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e  .LONG scard_tran
8620: 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  s_ret;...CACKEY_
8630: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
8640: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
8650: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
8660: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43  connected) {...C
8670: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8680: 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20  TF("Card is not 
8690: 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c  connected, unabl
86a0: 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63  e to end transac
86b0: 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a  tion on card");.
86c0: 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
86d0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
86e0: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
86f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65  DEBUG_PRINTF("De
8700: 63 72 65 61 73 69 6e 67 20 74 72 61 6e 73 61 63  creasing transac
8710: 74 69 6f 6e 20 64 65 70 74 68 20 61 6e 64 20 61  tion depth and a
8720: 73 6b 69 6e 67 20 66 6f 72 20 61 20 68 61 72 64  sking for a hard
8730: 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ware lock on the
8740: 20 6e 65 78 74 20 62 65 67 69 6e 20 74 72 61 6e   next begin tran
8750: 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74  saction (current
8760: 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73   depth = %i)", s
8770: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8780: 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f  _depth);.....slo
8790: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
87a0: 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28  epth--;.....if (
87b0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
87c0: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
87d0: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
87e0: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
87f0: 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a  k = 1;....}...}.
8800: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
8810: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
8820: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  ;..}...if (slot-
8830: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8840: 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  th == 0) {...CAC
8850: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8860: 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20  ("Terminating a 
8870: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
8880: 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22   has not begun!"
8890: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
88a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
88b0: 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  IC);..}...slot->
88c0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
88d0: 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  h--;...if (slot-
88e0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
88f0: 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b  th > 0) {...CACK
8900: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8910: 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74  "Transactions st
8920: 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ill in progress,
8930: 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67   not terminating
8940: 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63   on-card Transac
8950: 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65  tion (current de
8960: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
8970: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8980: 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  pth);....return(
8990: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
89a0: 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72  );..}...scard_tr
89b0: 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ans_ret = SCardE
89c0: 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  ndTransaction(sl
89d0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
89e0: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
89f0: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61  ;..if (scard_tra
8a00: 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  ns_ret != SCARD_
8a10: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
8a20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8a30: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e  TF("Unable to en
8a40: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  d transaction, r
8a50: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
8a60: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
8a70: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8a80: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
8a90: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8aa0: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72  "Sucessfully ter
8ab0: 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74  minated transact
8ac0: 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29  ion on slot (%s)
8ad0: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  ", slot->pcsc_re
8ae0: 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ader);...return(
8af0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8b00: 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65  );.}../* APDU Re
8b10: 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20  lated Functions 
8b20: 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  */./*. * SYNPOSI
8b30: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
8b40: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  ret cackey_send_
8b50: 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b  apdu(struct cack
8b60: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
8b70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61  nsigned char cla
8b80: 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ss, unsigned cha
8b90: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75  r instruction, u
8ba0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c  nsigned char p1,
8bb0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
8bc0: 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  2, unsigned char
8bd0: 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   lc, unsigned ch
8be0: 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e  ar *data, unsign
8bf0: 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74  ed char le, uint
8c00: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20  16_t *respcode, 
8c10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
8c20: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20  espdata, size_t 
8c30: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a  *respdata_len);.
8c40: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
8c50: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
8c60: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
8c70: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
8c80: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
8c90: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
8ca0: 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20  char class. *   
8cb0: 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73 73        APDU Class
8cc0: 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53   (GSCIS_CLASS_IS
8cd0: 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43  O7816 or GSCIS_C
8ce0: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
8cf0: 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20  FORM. *         
8d00: 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a  usually), (CLA).
8d10: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
8d20: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
8d30: 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41  ion. *         A
8d40: 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20  PDU Instruction 
8d50: 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20  (INS). *. *     
8d60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
8d70: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
8d80: 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50 31   Parameter 1 (P1
8d90: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
8da0: 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20  gned char p2. * 
8db0: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
8dc0: 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a  ameter 2 (P2). *
8dd0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
8de0: 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20   char lc. *     
8df0: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
8e00: 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20  of Content (Lc) 
8e10: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  -- this is the l
8e20: 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a  ength of "data".
8e30: 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61 6d   *         param
8e40: 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61 22  eter.  If "data"
8e50: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
8e60: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61   NULL, this para
8e70: 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20  meter will. *   
8e80: 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64        be ignored
8e90: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  .. *. *     unsi
8ea0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a  gned char *data.
8eb0: 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74   *         Point
8ec0: 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20  er to buffer to 
8ed0: 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64  send.  It should
8ee0: 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c   be "Lc" bytes l
8ef0: 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20  ong.  If. *     
8f00: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
8f10: 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c   NULL, "Lc" will
8f20: 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e   not be sent, an
8f30: 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77 69  d this buffer wi
8f40: 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20  ll be. *        
8f50: 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20   ignored.. *. * 
8f60: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
8f70: 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20  r le. *         
8f80: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45  APDU Length of E
8f90: 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20  xpectation (Le) 
8fa0: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  -- this is the l
8fb0: 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20  ength of the. * 
8fc0: 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65 64          expected
8fd0: 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73   reply.  If this
8fe0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
8ff0: 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20   0 then it will 
9000: 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62  not. *         b
9010: 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20  e sent.. *. *   
9020: 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70    uint16_t *resp
9030: 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20  code. *         
9040: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
9050: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
9060: 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20   response code. 
9070: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
9080: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
9090: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
90a0: 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c  sponse code will
90b0: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
90c0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
90d0: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61  d char *respdata
90e0: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
90f0: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
9100: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
9110: 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20  ponse data.  If 
9120: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
9130: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
9140: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
9150: 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20  se data will be 
9160: 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20  discarded.  If. 
9170: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22 72  *         the "r
9180: 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72  espdata_len" par
9190: 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69 66  ameter is specif
91a0: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69  ied as NULL, thi
91b0: 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20  s buffer. *     
91c0: 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20      will not be 
91d0: 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20  updated.. *. *  
91e0: 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64     size_t *respd
91f0: 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20  ata_len. *      
9200: 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69     [IN, OUT] Poi
9210: 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20  nter initialing 
9220: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
9230: 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73 70  ize of the "resp
9240: 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20  data". *        
9250: 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65   buffer.  Before
9260: 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20   returning, the 
9270: 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65  pointed to value
9280: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 74   is updated to t
9290: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75  he. *         nu
92a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
92b0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66  itten to the buf
92c0: 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69 73  fer.  If this is
92d0: 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a   specified as. *
92e0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69           NULL, i
92f0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70  t will not be up
9300: 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70  dated, and "resp
9310: 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67  data" will be ig
9320: 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a  nored causing. *
9330: 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73           the res
9340: 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65  ponse data to be
9350: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20   discarded.. *. 
9360: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
9370: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
9380: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  C_S_OK          
9390: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
93a0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
93b0: 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 4f 6e  _GENERIC      On
93c0: 20 65 72 72 6f 72 0a 20 2a 20 20 20 20 20 43 41   error. *     CA
93d0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
93e0: 4e 41 42 53 45 4e 54 20 20 49 66 20 74 68 65 20  NABSENT  If the 
93f0: 73 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 20 62  sending failed b
9400: 65 63 61 75 73 65 20 74 68 65 20 74 6f 6b 65 6e  ecause the token
9410: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 20   is. *          
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 20 20 20 20 20 61 62 73 65 6e 74 0a 20 2a 0a        absent. *.
9440: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
9450: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  This function wi
9460: 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68  ll connect to th
9470: 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69  e PC/SC Connecti
9480: 6f 6e 20 4d 61 6e 61 67 65 72 20 76 69 61 0a 20  on Manager via. 
9490: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73  *     cackey_pcs
94a0: 63 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e  c_connect() if n
94b0: 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  eeded.. *. *    
94c0: 20 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74   It will connect
94d0: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 6e 20   to the card in 
94e0: 74 68 65 20 72 65 61 64 65 72 20 61 74 74 61 63  the reader attac
94f0: 68 65 64 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a  hed to the slot.
9500: 20 2a 20 20 20 20 20 73 70 65 63 69 66 69 65 64   *     specified
9510: 2e 20 20 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e  .  It will recon
9520: 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 64  nect to the card
9530: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
9540: 6f 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73 20 61  on. *     goes a
9550: 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  way.. *. */.stat
9560: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
9570: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
9580: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
9590: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
95a0: 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e  d char class, un
95b0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
95c0: 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65  ruction, unsigne
95d0: 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67  d char p1, unsig
95e0: 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73  ned char p2, uns
95f0: 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75  igned char lc, u
9600: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
9610: 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ta, unsigned cha
9620: 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a  r le, uint16_t *
9630: 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e  respcode, unsign
9640: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
9650: 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64  a, size_t *respd
9660: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e 74  ata_len) {..uint
9670: 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69  8_t major_rc, mi
9680: 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f 74 20  nor_rc;..size_t 
9690: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 74  bytes_to_copy, t
96a0: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  mp_respdata_len;
96b0: 0a 09 4c 50 43 53 43 41 52 44 5f 49 4f 5f 52 45  ..LPCSCARD_IO_RE
96c0: 51 55 45 53 54 20 70 69 6f 53 65 6e 64 50 63 69  QUEST pioSendPci
96d0: 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f  ;..DWORD protoco
96e0: 6c 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f 6c  l;..DWORD xmit_l
96f0: 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c  en, recv_len;..L
9700: 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ONG scard_xmit_r
9710: 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e  et, scard_reconn
9720: 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69 74  _ret;..BYTE xmit
9730: 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63 76  _buf[1024], recv
9740: 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e 74  _buf[1024];..int
9750: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
9760: 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70 5f  t, pcsc_getresp_
9770: 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a  ret;..int idx;..
9780: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9790: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
97a0: 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a  ...if (!slot) {.
97b0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
97c0: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73  RINTF("Invalid s
97d0: 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22 29  lot specified.")
97e0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
97f0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9800: 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f  C);..}...pcsc_co
9810: 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
9820: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
9830: 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63  slot);..if (pcsc
9840: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
9850: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
9860: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9870: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
9880: 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20  e to connect to 
9890: 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
98a0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
98b0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
98c0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
98d0: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
98e0: 65 20 77 68 69 63 68 20 70 72 6f 74 6f 63 6f 6c  e which protocol
98f0: 20 74 6f 20 73 65 6e 64 20 75 73 69 6e 67 20 2a   to send using *
9900: 2f 0a 09 73 77 69 74 63 68 20 28 73 6c 6f 74 2d  /..switch (slot-
9910: 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 63  >protocol) {...c
9920: 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ase SCARD_PROTOC
9930: 4f 4c 5f 54 30 3a 0a 09 09 09 70 69 6f 53 65 6e  OL_T0:....pioSen
9940: 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49  dPci = SCARD_PCI
9950: 5f 54 30 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  _T0;.....break;.
9960: 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f  ..case SCARD_PRO
9970: 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 70 69 6f  TOCOL_T1:....pio
9980: 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f  SendPci = SCARD_
9990: 50 43 49 5f 54 31 3b 0a 0a 09 09 09 62 72 65 61  PCI_T1;.....brea
99a0: 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  k;...default:...
99b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
99c0: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72  INTF("Invalid pr
99d0: 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 61 62  otocol found, ab
99e0: 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 72  orting.");.....r
99f0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
9a00: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
9a10: 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 74 20 2a  .../* Transmit *
9a20: 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b  /..xmit_len = 0;
9a30: 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
9a40: 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a  len++] = class;.
9a50: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
9a60: 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 63 74  en++] = instruct
9a70: 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  ion;..xmit_buf[x
9a80: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b  mit_len++] = p1;
9a90: 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
9aa0: 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69 66  len++] = p2;..if
9ab0: 20 28 64 61 74 61 29 20 7b 0a 09 09 78 6d 69 74   (data) {...xmit
9ac0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
9ad0: 20 3d 20 6c 63 3b 0a 09 09 66 6f 72 20 28 69 64   = lc;...for (id
9ae0: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 6c 63 3b  x = 0; idx < lc;
9af0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 78 6d 69   idx++) {....xmi
9b00: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
9b10: 5d 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b 0a 09  ] = data[idx];..
9b20: 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 65 20 21  .}..}...if (le !
9b30: 3d 20 30 78 30 30 29 20 7b 0a 09 09 78 6d 69 74  = 0x00) {...xmit
9b40: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
9b50: 20 3d 20 6c 65 3b 0a 09 7d 0a 0a 09 2f 2a 20 42   = le;..}.../* B
9b60: 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20 54  egin Smartcard T
9b70: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
9b80: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
9b90: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
9ba0: 09 69 66 20 28 63 6c 61 73 73 20 3d 3d 20 47 53  .if (class == GS
9bb0: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
9bc0: 36 20 26 26 20 69 6e 73 74 72 75 63 74 69 6f 6e  6 && instruction
9bd0: 20 3d 3d 20 47 53 43 49 53 5f 49 4e 53 54 52 5f   == GSCIS_INSTR_
9be0: 56 45 52 49 46 59 20 26 26 20 70 31 20 3d 3d 20  VERIFY && p1 == 
9bf0: 30 78 30 30 20 26 26 20 70 32 20 3d 3d 20 30 78  0x00 && p2 == 0x
9c00: 30 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  00) {...CACKEY_D
9c10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6e  EBUG_PRINTF("Sen
9c20: 64 69 6e 67 20 41 50 44 55 3a 20 3c 3c 63 65 6e  ding APDU: <<cen
9c30: 73 6f 72 65 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c  sored>>");..} el
9c40: 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  se {...CACKEY_DE
9c50: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65  BUG_PRINTBUF("Se
9c60: 6e 64 69 6e 67 20 41 50 44 55 3a 22 2c 20 78 6d  nding APDU:", xm
9c70: 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e  it_buf, xmit_len
9c80: 29 3b 0a 09 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e  );..}...recv_len
9c90: 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62   = sizeof(recv_b
9ca0: 75 66 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69 74  uf);..scard_xmit
9cb0: 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e  _ret = SCardTran
9cc0: 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  smit(slot->pcsc_
9cd0: 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69  card, pioSendPci
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 2c 20 4e 55 4c 4c 2c 20 72 65 63 76  _len, NULL, recv
9d00: 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29  _buf, &recv_len)
9d10: 3b 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d  ;...if (scard_xm
9d20: 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  it_ret == SCARD_
9d30: 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44  E_NOT_TRANSACTED
9d40: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9d50: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
9d60: 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74  d to send APDU t
9d70: 6f 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61  o card (SCardTra
9d80: 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78  nsmit() = %s/%lx
9d90: 29 2c 20 77 69 6c 6c 20 61 73 6b 20 63 61 6c 6c  ), will ask call
9da0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ing function to 
9db0: 72 65 74 72 79 20 28 6e 6f 74 20 72 65 73 65 74  retry (not reset
9dc0: 74 69 6e 67 20 63 61 72 64 29 2e 2e 2e 22 2c 20  ting card)...", 
9dd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
9de0: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
9df0: 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  R(scard_xmit_ret
9e00: 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
9e10: 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  g) scard_xmit_re
9e20: 74 29 3b 0a 0a 09 09 2f 2a 20 42 65 67 69 6e 20  t);..../* Begin 
9e30: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
9e40: 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65  ction */...cacke
9e50: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
9e60: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75  n(slot);....retu
9e70: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
9e80: 5f 52 45 54 52 59 29 3b 0a 09 7d 0a 0a 09 69 66  _RETRY);..}...if
9e90: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
9ea0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
9eb0: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
9ec0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
9ed0: 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44  iled to send APD
9ee0: 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72 64  U to card (SCard
9ef0: 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f  Transmit() = %s/
9f00: 25 6c 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  %lx)", CACKEY_DE
9f10: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
9f20: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78  R_TO_STR(scard_x
9f30: 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67  mit_ret), (unsig
9f40: 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ned long) scard_
9f50: 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 43 41  xmit_ret);....CA
9f60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9f70: 46 28 22 4d 61 72 6b 69 6e 67 20 73 6c 6f 74 20  F("Marking slot 
9f80: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 72  as having been r
9f90: 65 73 65 74 22 29 3b 0a 09 09 63 61 63 6b 65 79  eset");...cackey
9fa0: 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
9fb0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73  (slot);....if (s
9fc0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d  card_xmit_ret ==
9fd0: 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43   SCARD_W_RESET_C
9fe0: 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ARD) {....CACKEY
9ff0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
a000: 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20 70  eset required, p
a010: 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b  lease hold...");
a020: 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e  .....scard_recon
a030: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  n_ret = cackey_r
a040: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  econnect_card(sl
a050: 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ot, SCARD_PROTOC
a060: 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52  OL_T0 | SCARD_PR
a070: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 6f 74  OTOCOL_T1, &prot
a080: 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73  ocol);.....if (s
a090: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
a0a0: 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
a0b0: 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64  SS) {...../* Upd
a0c0: 61 74 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a  ate protocol */.
a0d0: 09 09 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ....slot->protoc
a0e0: 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  ol = protocol;..
a0f0: 09 09 09 73 77 69 74 63 68 20 28 73 6c 6f 74 2d  ...switch (slot-
a100: 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 09  >protocol) {....
a110: 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f  ..case SCARD_PRO
a120: 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09 09 09  TOCOL_T0:.......
a130: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
a140: 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 09  RD_PCI_T0;......
a150: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
a160: 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  se SCARD_PROTOCO
a170: 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70 69 6f 53  L_T1:.......pioS
a180: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
a190: 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09 62 72  CI_T1;........br
a1a0: 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61 75 6c  eak;......defaul
a1b0: 74 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f  t:.......CACKEY_
a1c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
a1d0: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66  valid protocol f
a1e0: 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20 6c 61  ound, but too la
a1f0: 74 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  te to do anythin
a200: 67 20 61 62 6f 75 74 20 69 74 20 6e 6f 77 20 2d  g about it now -
a210: 2d 20 74 72 79 69 6e 67 20 61 6e 79 77 61 79 2e  - trying anyway.
a220: 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
a230: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
a240: 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
a250: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
a260: 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
a270: 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
a280: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
a290: 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
a2a0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
a2b0: 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  th--;......slot-
a2c0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
a2d0: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09  d_hw_lock = 1;..
a2e0: 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  ....cackey_begin
a2f0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
a300: 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  t);.....}......C
a310: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a320: 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73  TF("Reset succes
a330: 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d 69 74  sful, retransmit
a340: 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72 65 63  ting");......rec
a350: 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72  v_len = sizeof(r
a360: 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09 73 63  ecv_buf);.....sc
a370: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53  ard_xmit_ret = S
a380: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f  CardTransmit(slo
a390: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69  t->pcsc_card, pi
a3a0: 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62  oSendPci, xmit_b
a3b0: 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55  uf, xmit_len, NU
a3c0: 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72  LL, recv_buf, &r
a3d0: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69  ecv_len);......i
a3e0: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
a3f0: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
a400: 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43  CESS) {......CAC
a410: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a420: 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61 69  ("Retransmit fai
a430: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
a440: 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65 72 20  n failure after 
a450: 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68  disconnecting th
a460: 65 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61  e card (SCardTra
a470: 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29 22  nsmit = %s/%li)"
a480: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
a490: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
a4a0: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  STR(scard_xmit_r
a4b0: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
a4c0: 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09  d_xmit_ret);....
a4d0: 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  ...SCardDisconne
a4e0: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
a4f0: 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f  rd, SCARD_LEAVE_
a500: 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74  CARD);......slot
a510: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
a520: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09  ected = 0;......
a530: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
a540: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
a550: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ......slot->tran
a560: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
a570: 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 65  1;......cackey_e
a580: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
a590: 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  lot);.......retu
a5a0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
a5b0: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
a5c0: 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ...}....} else {
a5d0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a5e0: 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e  G_PRINTF("Discon
a5f0: 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a  necting card");.
a600: 0a 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
a610: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
a620: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
a630: 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 73 6c 6f  E_CARD);.....slo
a640: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
a650: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
a660: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
a670: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
a680: 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
a690: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31  action_depth = 1
a6a0: 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  ;.....cackey_end
a6b0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
a6c0: 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  t);......CACKEY_
a6d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
a6e0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
a6f0: 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75 72 6e  re");.....return
a700: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
a710: 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09  OKENABSENT);....
a720: 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
a730: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a740: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69  NTF("Disconnecti
a750: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 53  ng card");.....S
a760: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
a770: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
a780: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
a790: 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  );....slot->pcsc
a7a0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
a7b0: 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20  = 0;...../* End 
a7c0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
a7d0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74  ction */....slot
a7e0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
a7f0: 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b  pth = 1;....cack
a800: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
a810: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 43 41  on(slot);.....CA
a820: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a830: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
a840: 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 72 65  failure");....re
a850: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
a860: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
a870: 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
a880: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
a890: 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75 65 3a  "Returned Value:
a8a0: 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72 65 63  ", recv_buf, rec
a8b0: 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 72 65  v_len);...if (re
a8c0: 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09  cv_len < 2) {...
a8d0: 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73 70 6f  /* Minimal respo
a8e0: 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20 32 20  nse length is 2 
a8f0: 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69 6e 67  bytes, returning
a900: 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09   in failure */..
a910: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a920: 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 74  INTF("Response t
a930: 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e  oo small, return
a940: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28  ing in failure (
a950: 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 29 22  recv_len = %lu)"
a960: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
a970: 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09  ) recv_len);....
a980: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
a990: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
a9a0: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
a9b0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
a9c0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
a9d0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
a9e0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
a9f0: 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ine result code 
aa00: 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20 72  */..major_rc = r
aa10: 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e  ecv_buf[recv_len
aa20: 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63   - 2];..minor_rc
aa30: 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76   = recv_buf[recv
aa40: 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20 28  _len - 1];..if (
aa50: 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72  respcode) {...*r
aa60: 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f 72  espcode = (major
aa70: 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f  _rc << 8) | mino
aa80: 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64  r_rc;..}.../* Ad
aa90: 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62 75 66  just message buf
aaa0: 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e  fer */..recv_len
aab0: 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64 20   -= 2;.../* Add 
aac0: 62 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e 20  bytes to return 
aad0: 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72 65  value */..tmp_re
aae0: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a  spdata_len = 0;.
aaf0: 09 69 66 20 28 72 65 73 70 64 61 74 61 20 26 26  .if (respdata &&
ab00: 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b   respdata_len) {
ab10: 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  ...tmp_respdata_
ab20: 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 61 5f  len = *respdata_
ab30: 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74 6f  len;....bytes_to
ab40: 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 61 74  _copy = *respdat
ab50: 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72 65  a_len;....if (re
ab60: 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f 74  cv_len < bytes_t
ab70: 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 79 74  o_copy) {....byt
ab80: 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65 63  es_to_copy = rec
ab90: 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41  v_len;...}....CA
aba0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
abb0: 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 20 62  F("Copying %lu b
abc0: 79 74 65 73 20 74 6f 20 74 68 65 20 62 75 66 66  ytes to the buff
abd0: 65 72 20 28 72 65 63 76 27 64 20 25 6c 75 20 62  er (recv'd %lu b
abe0: 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79 20 25  ytes, but only %
abf0: 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  lu bytes left in
ac00: 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c 20 28   our buffer)", (
ac10: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
ac20: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 28 75  ytes_to_copy, (u
ac30: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
ac40: 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65  cv_len, (unsigne
ac50: 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64 61 74  d long) *respdat
ac60: 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70  a_len);....memcp
ac70: 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 63 76  y(respdata, recv
ac80: 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63  _buf, bytes_to_c
ac90: 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74 61  opy);...respdata
aca0: 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70   += bytes_to_cop
acb0: 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61 5f  y;....*respdata_
acc0: 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63  len = bytes_to_c
acd0: 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64  opy;...tmp_respd
ace0: 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73  ata_len -= bytes
acf0: 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73  _to_copy;..} els
ad00: 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f 6c  e {...if (recv_l
ad10: 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  en != 0) {....CA
ad20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ad30: 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61 79  F("Throwing away
ad40: 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77 68   %lu bytes, nowh
ad50: 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d 21  ere to put them!
ad60: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
ad70: 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09  g) recv_len);...
ad80: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72  }..}...if (major
ad90: 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09  _rc == 0x61) {..
ada0: 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 52  ./* We need to R
adb0: 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  EAD */...CACKEY_
adc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
add0: 66 66 65 72 20 72 65 61 64 20 72 65 71 75 69 72  ffer read requir
ade0: 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e  ed");....if (min
adf0: 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29 20 7b  or_rc == 0x00) {
ae00: 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 43  ....minor_rc = C
ae10: 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a  ACKEY_APDU_MTU;.
ae20: 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65 74 72  ..}....pcsc_getr
ae30: 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  esp_ret = cackey
ae40: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
ae50: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
ae60: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
ae70: 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20  R_GET_RESPONSE, 
ae80: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e  0x00, 0x00, 0, N
ae90: 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72  ULL, minor_rc, r
aea0: 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 61 74  espcode, respdat
aeb0: 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 74 61  a, &tmp_respdata
aec0: 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 70 63  _len);....if (pc
aed0: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 21  sc_getresp_ret !
aee0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
aef0: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
af00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
af10: 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65 64  ffer read failed
af20: 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  !  Returning in 
af30: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f  failure");...../
af40: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
af50: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
af60: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
af70: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
af80: 0a 09 09 09 69 66 20 28 70 63 73 63 5f 67 65 74  ....if (pcsc_get
af90: 72 65 73 70 5f 72 65 74 20 3d 3d 20 43 41 43 4b  resp_ret == CACK
afa0: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
afb0: 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41   {.....return(CA
afc0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
afd0: 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  Y);....}.....ret
afe0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
aff0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
b000: 0a 09 09 69 66 20 28 72 65 73 70 64 61 74 61 5f  ...if (respdata_
b010: 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73 70 64  len) {....*respd
b020: 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72  ata_len += tmp_r
b030: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d  espdata_len;...}
b040: 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
b050: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
b060: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
b070: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
b080: 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
b090: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
b0a0: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
b0b0: 20 28 62 75 66 66 65 72 20 72 65 61 64 20 63 6f   (buffer read co
b0c0: 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65 74  mplete)");...ret
b0d0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b0e0: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45  S_OK);..}.../* E
b0f0: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
b100: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
b110: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
b120: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20  ion(slot);...if 
b130: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39  (major_rc == 0x9
b140: 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73  0) {.../* Succes
b150: 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  s */...CACKEY_DE
b160: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
b170: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
b180: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39   (major_rc = 0x9
b190: 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0)");....return(
b1a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
b1b0: 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f  );..}....CACKEY_
b1c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50  DEBUG_PRINTF("AP
b1d0: 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e 20 65  DU Returned an e
b1e0: 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67 20  rror, returning 
b1f0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
b200: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
b210: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d  SC_E_GENERIC);.}
b220: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
b230: 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20  . *     ssize_t 
b240: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
b250: 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  er(struct cackey
b260: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
b270: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
b280: 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  er, size_t count
b290: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
b2a0: 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69  t_or_v, size_t i
b2b0: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a  nitial_offset);.
b2c0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
b2d0: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
b2e0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
b2f0: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
b300: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
b310: 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e   to. *. *     un
b320: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
b330: 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  fer. *         [
b340: 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20  OUT] Buffer. *. 
b350: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75  *     size_t cou
b360: 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75  nt. *         Nu
b370: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
b380: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
b390: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
b3a0: 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a  ned char t_or_v.
b3b0: 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65 63   *         Selec
b3c0: 74 20 74 68 65 20 54 2d 62 75 66 66 65 72 20 28  t the T-buffer (
b3d0: 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20  01) or V-buffer 
b3e0: 28 30 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f  (02) to read fro
b3f0: 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73  m.  . *. *     s
b400: 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66  ize_t initial_of
b410: 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20  fset. *         
b420: 53 70 65 63 69 66 79 20 74 68 65 20 6f 66 66 73  Specify the offs
b430: 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  et to begin the 
b440: 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a  read from. *. *.
b450: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
b460: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
b470: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
b480: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
b490: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20   actually read, 
b4a0: 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a  or -1 on error..
b4b0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
b4c0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
b4d0: 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61  tatic ssize_t ca
b4e0: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
b4f0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
b500: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
b510: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
b520: 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20  , size_t count, 
b530: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
b540: 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69  or_v, size_t ini
b550: 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09  tial_offset) {..
b560: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69  unsigned char *i
b570: 6e 69 74 5f 62 75 66 66 65 72 3b 0a 09 73 69 7a  nit_buffer;..siz
b580: 65 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a  e_t init_count;.
b590: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69 6e 69  .size_t init_ini
b5a0: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 73  tial_offset;...s
b5b0: 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30  ize_t offset = 0
b5c0: 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61  , max_offset, ma
b5d0: 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e  x_count;..unsign
b5e0: 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a  ed char cmd[2];.
b5f0: 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f  .uint16_t respco
b600: 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  de;..int send_re
b610: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
b620: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
b630: 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66  .");...init_buff
b640: 65 72 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 6e  er = buffer;..in
b650: 69 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74  it_count = count
b660: 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f  ;..init_initial_
b670: 6f 66 66 73 65 74 20 3d 20 69 6e 69 74 69 61 6c  offset = initial
b680: 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f  _offset;...max_o
b690: 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09  ffset = count;..
b6a0: 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b  max_count = CACK
b6b0: 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69  EY_APDU_MTU;...i
b6c0: 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26  f (t_or_v != 1 &
b6d0: 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b  & t_or_v != 2) {
b6e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b6f0: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
b700: 54 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72  T or V parameter
b710: 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75   specified, retu
b720: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b730: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
b740: 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d  );..}...cmd[0] =
b750: 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65   t_or_v;...while
b760: 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66   (1) {...if (off
b770: 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65  set >= max_offse
b780: 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
b790: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66  EBUG_PRINTF("Buf
b7a0: 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72  fer too small, r
b7b0: 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65  eturning what we
b7c0: 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62   got...");.....b
b7d0: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75  reak;...}....cou
b7e0: 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20  nt = max_offset 
b7f0: 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28  - offset;...if (
b800: 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e  count > max_coun
b810: 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20  t) {....count = 
b820: 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a  max_count;...}..
b830: 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74  ..cmd[1] = count
b840: 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  ;....send_ret = 
b850: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
b860: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
b870: 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f  SS_GLOBAL_PLATFO
b880: 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  RM, GSCIS_INSTR_
b890: 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69  READ_BUFFER, ((i
b8a0: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20  nitial_offset + 
b8b0: 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20  offset) >> 8) & 
b8c0: 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f  0xff, (initial_o
b8d0: 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20  ffset + offset) 
b8e0: 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63  & 0xff, sizeof(c
b8f0: 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20  md), cmd, 0x00, 
b900: 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65  &respcode, buffe
b910: 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75  r + offset, &cou
b920: 6e 74 29 3b 0a 0a 09 09 69 66 20 28 73 65 6e 64  nt);....if (send
b930: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
b940: 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09  CSC_E_RETRY) {..
b950: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b960: 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
b970: 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72  ing failed, retr
b980: 79 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72  ying read buffer
b990: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  ");.....return(c
b9a0: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
b9b0: 72 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 75 66  r(slot, init_buf
b9c0: 66 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c  fer, init_count,
b9d0: 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f 69 6e   t_or_v, init_in
b9e0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 29 3b 0a  itial_offset));.
b9f0: 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f  ..}....if (send_
ba00: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
ba10: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66  SC_S_OK) {....if
ba20: 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78   (respcode == 0x
ba30: 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28  6A86) {.....if (
ba40: 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20  max_count == 1) 
ba50: 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  {......break;...
ba60: 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75  ..}......max_cou
ba70: 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f  nt = max_count /
ba80: 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75   2;......continu
ba90: 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b  e;....}.....CACK
baa0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bab0: 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64  "cackey_send_apd
bac0: 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75  u() failed, retu
bad0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
bae0: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  ");.....return(-
baf0: 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65  1);...}....offse
bb00: 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69  t += count;....i
bb10: 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63  f (count < max_c
bb20: 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
bb30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bb40: 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f  Short read -- co
bb50: 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d  unt = %i, cmd[1]
bb60: 20 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63 6f   = %i", (int) co
bb70: 75 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31  unt, (int) cmd[1
bb80: 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ]);.....break;..
bb90: 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  .}..}..#ifdef CA
bba0: 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
bbb0: 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
bbc0: 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66  IZE_MAX..if (off
bbd0: 73 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  set > _POSIX_SSI
bbe0: 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
bbf0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bc00: 22 4f 66 66 73 65 74 20 65 78 63 65 65 64 73 20  "Offset exceeds 
bc10: 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72  maximum value, r
bc20: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
bc30: 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c  ure. (max = %li,
bc40: 20 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22 2c   offset = %lu)",
bc50: 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
bc60: 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
bc70: 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74  ned long) offset
bc80: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
bc90: 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65  ;..}.#  endif.#e
bca0: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
bcb0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
bcc0: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
bcd0: 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65 73  , read %lu bytes
bce0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
bcf0: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65  g) offset);...re
bd00: 74 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a  turn(offset);.}.
bd10: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
bd20: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
bd30: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
bd40: 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61  applet(struct ca
bd50: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
bd60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bd70: 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f  aid, size_t aid_
bd80: 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  len);. *. * ARGU
bd90: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
bda0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
bdb0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
bdc0: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
bdd0: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
bde0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
bdf0: 72 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20 20  r *aid. *       
be00: 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e    Buffer contain
be10: 69 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74 6f  ing Applet ID to
be20: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20   select. *. *   
be30: 20 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e    size_t aid_len
be40: 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62  . *         Numb
be50: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
be60: 68 65 20 22 61 69 64 22 20 28 41 70 70 6c 65 74  he "aid" (Applet
be70: 20 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a 20   ID) parameter. 
be80: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
be90: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
bea0: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
beb0: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
bec0: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
bed0: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
bee0: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
bef0: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
bf00: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
bf10: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
bf20: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75  lect_applet(stru
bf30: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
bf40: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
bf50: 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74  har *aid, size_t
bf60: 20 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74   aid_len) {..int
bf70: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43   send_ret;...CAC
bf80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bf90: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43  ("Called.");...C
bfa0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bfb0: 54 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67 20  TBUF("Selecting 
bfc0: 61 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61  applet:", aid, a
bfd0: 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f  id_len);...send_
bfe0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
bff0: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
c000: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
c010: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45  , GSCIS_INSTR_SE
c020: 4c 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52 41  LECT, GSCIS_PARA
c030: 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c  M_SELECT_APPLET,
c040: 20 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20   0x00, aid_len, 
c050: 61 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c  aid, 0x00, NULL,
c060: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09   NULL, NULL);...
c070: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
c080: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
c090: 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  TRY) {...CACKEY_
c0a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
c0b0: 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65  PU Sending faile
c0c0: 64 2c 20 72 65 74 72 79 69 6e 67 20 73 65 6c 65  d, retrying sele
c0d0: 63 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09  ct applet");....
c0e0: 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 65  return(cackey_se
c0f0: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
c100: 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 29  , aid, aid_len))
c110: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f  ;..}...if (send_
c120: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
c130: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
c140: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c150: 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  ("Failed to open
c160: 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69   applet, returni
c170: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
c180: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
c190: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
c1a0: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
c1b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
c1c0: 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74  cessfully select
c1d0: 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74  ed file");...ret
c1e0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
c1f0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
c200: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
c210: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
c220: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74  y_select_file(st
c230: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
c240: 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74   *slot, uint16_t
c250: 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55   ef);. *. * ARGU
c260: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
c270: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
c280: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
c290: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
c2a0: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
c2b0: 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a      uint16_t ef.
c2c0: 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65   *         Eleme
c2d0: 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c  ntal File to sel
c2e0: 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ect. *. * RETURN
c2f0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
c300: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
c310: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
c320: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
c330: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
c340: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
c350: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
c360: 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c  is selects an El
c370: 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45  ementary File (E
c380: 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  F) under the cur
c390: 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a  rently selected.
c3a0: 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65 64   *     Dedicated
c3b0: 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a   File (DF). *. *
c3c0: 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74       Typically t
c3d0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66  his is called af
c3e0: 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68  ter selecting th
c3f0: 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74  e correct Applet
c400: 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63   (using. *     c
c410: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
c420: 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64  let) for VM card
c430: 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  s. *. */.static 
c440: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
c450: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74  y_select_file(st
c460: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
c470: 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74   *slot, uint16_t
c480: 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64   ef) {..unsigned
c490: 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d   char fid_buf[2]
c4a0: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
c4b0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c4c0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
c4d0: 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65  );.../* Open the
c4e0: 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65   elementary file
c4f0: 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20   */..fid_buf[0] 
c500: 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78  = (ef >> 8) & 0x
c510: 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20  ff;..fid_buf[1] 
c520: 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43  = ef & 0xff;...C
c530: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c540: 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69  TF("Selecting fi
c550: 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73  le: %04lx", (uns
c560: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b  igned long) ef);
c570: 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
c580: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
c590: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
c5a0: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
c5b0: 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78  INSTR_SELECT, 0x
c5c0: 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66  02, 0x0C, sizeof
c5d0: 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62  (fid_buf), fid_b
c5e0: 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20  uf, 0x00, NULL, 
c5f0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
c600: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
c610: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
c620: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c630: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
c640: 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65  to open file, re
c650: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
c660: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
c670: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
c680: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
c690: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c6a0: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73  ("Successfully s
c6b0: 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a  elected file");.
c6c0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
c6d0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
c6e0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
c6f0: 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79       void cackey
c700: 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74  _free_tlv(struct
c710: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
c720: 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a  ty *root);. *. *
c730: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
c740: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
c750: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74  tlv_entity *root
c760: 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74  . *         Root
c770: 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74   of the TLV list
c780: 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e   to start freein
c790: 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  g. *. * RETURN V
c7a0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
c7b0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
c7c0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
c7d0: 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56 20  n frees the TLV 
c7e0: 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65  linked listed re
c7f0: 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20  turned from. *  
c800: 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f     "cackey_read_
c810: 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  tlv". *. */.stat
c820: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
c830: 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63  ree_tlv(struct c
c840: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
c850: 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63   *root) {..struc
c860: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
c870: 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74  ity *curr, *next
c880: 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20  ;...if (root == 
c890: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
c8a0: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72  ;..}...for (curr
c8b0: 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63   = root; curr; c
c8c0: 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09  urr = next) {...
c8d0: 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65  next = curr->_ne
c8e0: 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  xt;....switch (c
c8f0: 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63  urr->tag) {....c
c900: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
c910: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65  R_TABLE:....case
c920: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
c930: 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28  FICATE:.....if (
c940: 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09  curr->value) {..
c950: 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76  ....free(curr->v
c960: 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09  alue);.....}....
c970: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
c980: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
c990: 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d  L:.....if (curr-
c9a0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20  >value_cardurl) 
c9b0: 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72  {......free(curr
c9c0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
c9d0: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  ;.....}.....brea
c9e0: 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63  k;...}....free(c
c9f0: 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  urr);..}...retur
ca00: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  n;.}../*. * SYNP
ca10: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
ca20: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
ca30: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
ca40: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
ca50: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
ca60: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
ca70: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74   *. */.static st
ca80: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
ca90: 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72  entity *cackey_r
caa0: 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63  ead_tlv(struct c
cab0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
cac0: 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
cad0: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63  ey_tlv_entity *c
cae0: 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f  urr_entity, *roo
caf0: 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20  t = NULL, *last 
cb00: 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65  = NULL;..unsigne
cb10: 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b  d char tlen_buf[
cb20: 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32  2], tval_buf[102
cb30: 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69  4], *tval;..unsi
cb40: 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62  gned char vlen_b
cb50: 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b  uf[2], vval_buf[
cb60: 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75  8192], *vval;..u
cb70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d  nsigned char *tm
cb80: 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  pbuf;..unsigned 
cb90: 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  long tmpbuflen;.
cba0: 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76  .ssize_t tlen, v
cbb0: 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65  len;..ssize_t re
cbc0: 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20  ad_ret;..size_t 
cbd0: 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66  offset_t = 0, of
cbe0: 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73  fset_v = 0;..uns
cbf0: 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b 0a  igned char tag;.
cc00: 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a  .size_t length;.
cc10: 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a  #ifdef HAVE_LIBZ
cc20: 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73  ..int uncompress
cc30: 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _ret;.#endif...C
cc40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
cc50: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
cc60: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
cc70: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
cc80: 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73  lot, tlen_buf, s
cc90: 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c  izeof(tlen_buf),
cca0: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09   1, offset_t);..
ccb0: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
ccc0: 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29  sizeof(tlen_buf)
ccd0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
cce0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20  UG_PRINTF("Read 
ccf0: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
cd00: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
cd10: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
cd20: 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c  ..}...tlen = (tl
cd30: 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20  en_buf[1] << 8) 
cd40: 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a  | tlen_buf[0];..
cd50: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
cd60: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
cd70: 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73  lot, vlen_buf, s
cd80: 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c  izeof(vlen_buf),
cd90: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09   2, offset_v);..
cda0: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
cdb0: 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29  sizeof(vlen_buf)
cdc0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
cdd0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20  UG_PRINTF("Read 
cde0: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
cdf0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
ce00: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
ce10: 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c  ..}...vlen = (vl
ce20: 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20  en_buf[1] << 8) 
ce30: 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a  | vlen_buf[0];..
ce40: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ce50: 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68  INTF("Tag Length
ce60: 20 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20 4c 65   = %lu, Value Le
ce70: 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e  ngth = %lu", (un
ce80: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74 6c 65  signed long) tle
ce90: 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  n, (unsigned lon
cea0: 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73  g) vlen);...offs
ceb0: 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73  et_t += 2;..offs
cec0: 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20  et_v += 2;...if 
ced0: 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74  (tlen > sizeof(t
cee0: 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  val_buf)) {...CA
cef0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cf00: 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73  F("Tag length is
cf10: 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75   too large, retu
cf20: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
cf30: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
cf40: 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c  LL);..}...if (vl
cf50: 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c  en > sizeof(vval
cf60: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
cf70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cf80: 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20  Value length is 
cf90: 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72  too large, retur
cfa0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
cfb0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
cfc0: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65  L);..}...read_re
cfd0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
cfe0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61  buffer(slot, tva
cff0: 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20  l_buf, tlen, 1, 
d000: 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28  offset_t);..if (
d010: 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e  read_ret != tlen
d020: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
d030: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
d040: 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65  e to read entire
d050: 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72   T-buffer, retur
d060: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
d070: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
d080: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65  L);..}...read_re
d090: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
d0a0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61  buffer(slot, vva
d0b0: 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20  l_buf, vlen, 2, 
d0c0: 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28  offset_v);..if (
d0d0: 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e  read_ret != vlen
d0e0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
d0f0: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
d100: 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65  e to read entire
d110: 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72   V-buffer, retur
d120: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
d130: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
d140: 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20  L);..}...tval = 
d150: 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20  tval_buf;..vval 
d160: 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69  = vval_buf;..whi
d170: 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20  le (tlen > 0 && 
d180: 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61  vlen > 0) {...ta
d190: 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61  g = *tval;...tva
d1a0: 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a  l++;...tlen--;..
d1b0: 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30  ..if (*tval == 0
d1c0: 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68  xff) {....length
d1d0: 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38   = (tval[2] << 8
d1e0: 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09  ) | tval[1];....
d1f0: 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c  tval += 3;....tl
d200: 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73  en -= 3;...} els
d210: 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20  e {....length = 
d220: 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b  *tval;....tval++
d230: 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d  ;....tlen--;...}
d240: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d250: 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73  _PRINTF("Tag: %s
d260: 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59   (%02x)", CACKEY
d270: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f  _DEBUG_FUNC_TAG_
d280: 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e  TO_STR(tag), (un
d290: 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29  signed int) tag)
d2a0: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
d2b0: 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65  _PRINTBUF("Value
d2c0: 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  :", vval, length
d2d0: 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74  );....curr_entit
d2e0: 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74  y = NULL;...swit
d2f0: 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61  ch (tag) {....ca
d300: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
d310: 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65  DURL:.....curr_e
d320: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
d330: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
d340: 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65  ty));.....curr_e
d350: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
d360: 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  durl = malloc(si
d370: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
d380: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
d390: 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28  ));......memcpy(
d3a0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
d3b0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
d3c0: 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63   vval, 5);.....c
d3d0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
d3e0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79  e_cardurl->appty
d3f0: 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09  pe = vval[5];...
d400: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
d410: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
d420: 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36  jectid = (vval[6
d430: 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37  ] << 8) | vval[7
d440: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
d450: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
d460: 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c  l->appid = (vval
d470: 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c  [8] << 8) | vval
d480: 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65  [9];......curr_e
d490: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
d4a0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
d4b0: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
d4c0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
d4d0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
d4e0: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75  CR_TABLE:.....cu
d4f0: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
d500: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
d510: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d  entity));.....tm
d520: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65  pbuf = malloc(le
d530: 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63  ngth);......memc
d540: 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
d550: 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63   length);......c
d560: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
d570: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
d580: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
d590: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72   length;.....cur
d5a0: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20  r_entity->value 
d5b0: 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75  = tmpbuf;.....cu
d5c0: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
d5d0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
d5e0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
d5f0: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
d600: 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  TE:.....curr_ent
d610: 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  ity = malloc(siz
d620: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
d630: 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45  ));..#ifdef HAVE
d640: 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75 66  _LIBZ.....tmpbuf
d650: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32  len = length * 2
d660: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
d670: 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29  alloc(tmpbuflen)
d680: 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73  ;......uncompres
d690: 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65  s_ret = uncompre
d6a0: 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62  ss(tmpbuf, &tmpb
d6b0: 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e  uflen, vval, len
d6c0: 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e  gth);.....if (un
d6d0: 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20  compress_ret != 
d6e0: 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43  Z_OK) {......CAC
d6f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d700: 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f  ("Failed to deco
d710: 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65  mpress, uncompre
d720: 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69  ss() returned %i
d730: 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f   -- resorting to
d740: 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75   direct copy", u
d750: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a  ncompress_ret);.
d760: 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
d770: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d  = length;......m
d780: 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76  emcpy(tmpbuf, vv
d790: 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09  al, length);....
d7a0: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
d7b0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44  EBUG_PRINTBUF("D
d7c0: 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22  ecompressed to:"
d7d0: 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66  , tmpbuf, tmpbuf
d7e0: 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09  len);.#else.....
d7f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d800: 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49  NTF("Missing ZLI
d810: 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20  B Support, this 
d820: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 6c  certificate is l
d830: 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e  ikely useless...
d840: 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ");......tmpbufl
d850: 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09  en = length;....
d860: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
d870: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23  vval, length);.#
d880: 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f  endif......curr_
d890: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
d8a0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
d8b0: 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70  ty->length = tmp
d8c0: 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72  buflen;.....curr
d8d0: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d  _entity->value =
d8e0: 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72   tmpbuf;.....cur
d8f0: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
d900: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
d910: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
d920: 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09  S_TAG_PKCS15:...
d930: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
d940: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
d950: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09  urr_entity));...
d960: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
d970: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
d980: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
d990: 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d  e_byte = vval[0]
d9a0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
d9b0: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
d9c0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ......break;...}
d9d0: 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67  ....vval += leng
d9e0: 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65  th;...vlen -= le
d9f0: 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72  ngth;....if (cur
da00: 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c  r_entity != NULL
da10: 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20  ) {....if (root 
da20: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72  == NULL) {.....r
da30: 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  oot = curr_entit
da40: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  y;....}.....if (
da50: 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  last != NULL) {.
da60: 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20  ....last->_next 
da70: 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09  = curr_entity;..
da80: 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63  ..}.....last = c
da90: 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a  urr_entity;...}.
daa0: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74  .}...return(root
dab0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
dac0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
dad0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
dae0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
daf0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
db00: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
db10: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
db20: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f   *. */.static vo
db30: 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  id cackey_free_c
db40: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b  erts(struct cack
db50: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
db60: 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20   *start, size_t 
db70: 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f  count, int free_
db80: 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74  start) {..size_t
db90: 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72   idx;...if (star
dba0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
dbb0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20  eturn;..}...for 
dbc0: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
dbd0: 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a  count; idx++) {.
dbe0: 09 09 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d  ..if (start[idx]
dbf0: 2e 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a  .certificate) {.
dc00: 09 09 09 66 72 65 65 28 73 74 61 72 74 5b 69 64  ...free(start[id
dc10: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b  x].certificate);
dc20: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72  ...}..}...if (fr
dc30: 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72  ee_start) {...fr
dc40: 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09  ee(start);..}...
dc50: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
dc60: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
dc70: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
dc80: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
dc90: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
dca0: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
dcb0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
dcc0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
dcd0: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
dce0: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
dcf0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
dd00: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
dd10: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75  slot *slot, stru
dd20: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
dd30: 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c 20  dentity *certs, 
dd40: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63  unsigned long *c
dd50: 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20  ount) {..struct 
dd60: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
dd70: 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09  tity *curr_id;..
dd80: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
dd90: 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c  v_entity *ccc_tl
dda0: 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61  v, *ccc_curr, *a
ddb0: 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72  pp_tlv, *app_cur
ddc0: 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  r;..unsigned cha
ddd0: 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47  r ccc_aid[] = {G
dde0: 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a 09  SCIS_AID_CCC};..
ddf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 75  unsigned char cu
de00: 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69  rr_aid[7];..unsi
de10: 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64 78  gned long outidx
de20: 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 72 65   = 0;..cackey_re
de30: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65  t transaction_re
de40: 74 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f 72 65  t;..int certs_re
de50: 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65  sizable;..int se
de60: 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72  nd_ret, select_r
de70: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
de80: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
de90: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e  d.");...if (coun
dea0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
deb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
dec0: 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c  TF("count is NUL
ded0: 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  L, returning in 
dee0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
def0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
df00: 09 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55  .if (certs != NU
df10: 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75  LL) {...if (*cou
df20: 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41  nt == 0) {....CA
df30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
df40: 46 28 22 52 65 71 75 65 73 74 65 64 20 77 65 20  F("Requested we 
df50: 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73  return 0 objects
df60: 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22  , short-circuit"
df70: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65  );.....return(ce
df80: 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  rts);...}..}.../
df90: 2a 20 42 65 67 69 6e 20 61 20 53 6d 61 72 74 43  * Begin a SmartC
dfa0: 61 72 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ard transaction 
dfb0: 2a 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e 5f  */..transaction_
dfc0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 62 65 67  ret = cackey_beg
dfd0: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
dfe0: 6c 6f 74 29 3b 0a 09 69 66 20 28 74 72 61 6e 73  lot);..if (trans
dff0: 61 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43 41  action_ret != CA
e000: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
e010: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
e020: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
e030: 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
e040: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
e050: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
e060: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
e070: 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55  .if (certs == NU
e080: 4c 4c 29 20 7b 0a 09 09 63 65 72 74 73 20 3d 20  LL) {...certs = 
e090: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
e0a0: 65 72 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a 63  erts) * 5);...*c
e0b0: 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72 74  ount = 5;...cert
e0c0: 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 31 3b  s_resizable = 1;
e0d0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65 72  ..} else {...cer
e0e0: 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 30  ts_resizable = 0
e0f0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63 74  ;..}.../* Select
e100: 20 74 68 65 20 43 43 43 20 41 70 70 6c 65 74 20   the CCC Applet 
e110: 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  */..send_ret = c
e120: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
e130: 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61 69  let(slot, ccc_ai
e140: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61 69  d, sizeof(ccc_ai
e150: 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72  d));..if (send_r
e160: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
e170: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
e180: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e190: 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63  "Unable to selec
e1a0: 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72 65  t CCC Applet, re
e1b0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
e1c0: 72 65 22 29 3b 0a 0a 09 09 2f 2a 20 54 65 72 6d  re");..../* Term
e1d0: 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 20  inate SmartCard 
e1e0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
e1f0: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
e200: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
e210: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
e220: 09 7d 0a 0a 09 2f 2a 20 52 65 61 64 20 61 6c 6c  .}.../* Read all
e230: 20 74 68 65 20 61 70 70 6c 65 74 73 20 66 72 6f   the applets fro
e240: 6d 20 74 68 65 20 43 43 43 27 73 20 54 4c 56 20  m the CCC's TLV 
e250: 2a 2f 0a 09 63 63 63 5f 74 6c 76 20 3d 20 63 61  */..ccc_tlv = ca
e260: 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c  ckey_read_tlv(sl
e270: 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20 66  ot);.../* Look f
e280: 6f 72 20 43 41 52 44 55 52 4c 73 20 74 68 61 74  or CARDURLs that
e290: 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50   coorespond to P
e2a0: 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09 66  KI applets */..f
e2b0: 6f 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63  or (ccc_curr = c
e2c0: 63 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72  cc_tlv; ccc_curr
e2d0: 3b 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63  ; ccc_curr = ccc
e2e0: 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a  _curr->_next) {.
e2f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e300: 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67  RINTF("Found tag
e310: 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b  : %s ... ", CACK
e320: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
e330: 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  G_TO_STR(ccc_cur
e340: 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 69 66 20  r->tag));....if 
e350: 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21  (ccc_curr->tag !
e360: 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  = GSCIS_TAG_CARD
e370: 55 52 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  URL) {....CACKEY
e380: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
e390: 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74   ... skipping it
e3a0: 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61   (we only care a
e3b0: 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22 29  bout CARDURLs)")
e3c0: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
e3d0: 09 09 7d 0a 0a 09 09 69 66 20 28 28 63 63 63 5f  ..}....if ((ccc_
e3e0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
e3f0: 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43  url->apptype & C
e400: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
e410: 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56  I) != CACKEY_TLV
e420: 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 43  _APP_PKI) {....C
e430: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e440: 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69  TF("  ... skippi
e450: 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63  ng it (we only c
e460: 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70  are about PKI ap
e470: 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c  plets, this appl
e480: 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f  et supports: %s/
e490: 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44  %02x)", CACKEY_D
e4a0: 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
e4b0: 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  E_TO_STR(ccc_cur
e4c0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
e4d0: 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73  ->apptype), (uns
e4e0: 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63  igned int) ccc_c
e4f0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
e500: 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09  rl->apptype);...
e510: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
e520: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e530: 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22 2c  PRINTBUF("RID:",
e540: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
e550: 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73  _cardurl->rid, s
e560: 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e  izeof(ccc_curr->
e570: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72  value_cardurl->r
e580: 69 64 29 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44  id));...CACKEY_D
e590: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 70 70  EBUG_PRINTF("App
e5a0: 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20  ID = %s/%04lx", 
e5b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
e5c0: 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63  C_OBJID_TO_STR(c
e5d0: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
e5e0: 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c 20  ardurl->appid), 
e5f0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
e600: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
e610: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 3b  cardurl->appid);
e620: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e630: 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74 49 44  PRINTF("ObjectID
e640: 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41   = %s/%04lx", CA
e650: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
e660: 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63  OBJID_TO_STR(ccc
e670: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
e680: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c  durl->objectid),
e690: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
e6a0: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
e6b0: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
e6c0: 69 64 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 63  id);....memcpy(c
e6d0: 75 72 72 5f 61 69 64 2c 20 63 63 63 5f 63 75 72  urr_aid, ccc_cur
e6e0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
e6f0: 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  ->rid, sizeof(cc
e700: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
e710: 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09  rdurl->rid));...
e720: 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28  curr_aid[sizeof(
e730: 63 75 72 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d  curr_aid) - 2] =
e740: 20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75   (ccc_curr->valu
e750: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
e760: 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09   >> 8) & 0xff;..
e770: 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66  .curr_aid[sizeof
e780: 28 63 75 72 72 5f 61 69 64 29 20 2d 20 31 5d 20  (curr_aid) - 1] 
e790: 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
e7a0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
e7b0: 20 26 20 30 78 66 66 3b 0a 0a 09 09 2f 2a 20 53   & 0xff;..../* S
e7c0: 65 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c  elect found appl
e7d0: 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 73 65 6c 65  et ... */...sele
e7e0: 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
e7f0: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
e800: 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69  ot, curr_aid, si
e810: 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b  zeof(curr_aid));
e820: 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
e830: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
e840: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
e850: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e860: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63  "Failed to selec
e870: 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70 69  t applet, skippi
e880: 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  ng processing of
e890: 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a   this object");.
e8a0: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
e8b0: 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20  }..../* ... and 
e8c0: 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f  object (file) */
e8d0: 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20  ...select_ret = 
e8e0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
e8f0: 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72  le(slot, ccc_cur
e900: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
e910: 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 69  ->objectid);...i
e920: 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d  f (select_ret !=
e930: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
e940: 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  K) {....CACKEY_D
e950: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
e960: 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66 69  led to select fi
e970: 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  le, skipping pro
e980: 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
e990: 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f  object");.....co
e9a0: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f  ntinue;...}..../
e9b0: 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 20 66  * Process this f
e9c0: 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e  ile's TLV lookin
e9d0: 67 20 66 6f 72 20 63 65 72 74 69 66 69 63 61 74  g for certificat
e9e0: 65 73 20 2a 2f 0a 09 09 61 70 70 5f 74 6c 76 20  es */...app_tlv 
e9f0: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c  = cackey_read_tl
ea00: 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 66 6f 72 20  v(slot);....for 
ea10: 28 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f  (app_curr = app_
ea20: 74 6c 76 3b 20 61 70 70 5f 63 75 72 72 3b 20 61  tlv; app_curr; a
ea30: 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 63 75  pp_curr = app_cu
ea40: 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09  rr->_next) {....
ea50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ea60: 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20  NTF("Found tag: 
ea70: 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  %s", CACKEY_DEBU
ea80: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54  G_FUNC_TAG_TO_ST
ea90: 52 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29  R(app_curr->tag)
eaa0: 29 3b 0a 09 09 09 69 66 20 28 61 70 70 5f 63 75  );....if (app_cu
eab0: 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53  rr->tag != GSCIS
eac0: 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45  _TAG_CERTIFICATE
ead0: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
eae0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
eaf0: 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28  .. skipping it (
eb00: 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
eb10: 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73 29  ut CERTIFICATEs)
eb20: 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  ");......continu
eb30: 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72 72  e;....}.....curr
eb40: 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74  _id = &certs[out
eb50: 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b  idx];....outidx+
eb60: 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 75  +;.....memcpy(cu
eb70: 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 63  rr_id->applet, c
eb80: 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28  urr_aid, sizeof(
eb90: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29  curr_id->applet)
eba0: 29 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 66  );....curr_id->f
ebb0: 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e  ile = ccc_curr->
ebc0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
ebd0: 62 6a 65 63 74 69 64 3b 0a 09 09 09 63 75 72 72  bjectid;....curr
ebe0: 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d  _id->keysize = -
ebf0: 31 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  1;.....CACKEY_DE
ec00: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c  BUG_PRINTF("Fill
ec10: 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 61 70 70  ing curr_id->app
ec20: 6c 65 74 20 28 25 70 29 20 77 69 74 68 20 25 6c  let (%p) with %l
ec30: 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72 5f  u bytes:", curr_
ec40: 69 64 2d 3e 61 70 70 6c 65 74 2c 20 28 75 6e 73  id->applet, (uns
ec50: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65  igned long) size
ec60: 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c  of(curr_id->appl
ec70: 65 74 29 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f  et));....CACKEY_
ec80: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
ec90: 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e  VAL:", curr_id->
eca0: 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63  applet, sizeof(c
ecb0: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29  urr_id->applet))
ecc0: 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ;.....curr_id->c
ecd0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
ece0: 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74   app_curr->lengt
ecf0: 68 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  h;.....curr_id->
ed00: 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61  certificate = ma
ed10: 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65  lloc(curr_id->ce
ed20: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
ed30: 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
ed40: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20  d->certificate, 
ed50: 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c  app_curr->value,
ed60: 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
ed70: 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09  icate_len);.....
ed80: 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
ed90: 6f 75 6e 74 29 20 7b 0a 09 09 09 09 69 66 20 28  ount) {.....if (
eda0: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29  certs_resizable)
edb0: 20 7b 0a 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a   {......*count *
edc0: 3d 20 32 3b 0a 09 09 09 09 09 63 65 72 74 73 20  = 2;......certs 
edd0: 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c  = realloc(certs,
ede0: 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20   sizeof(*certs) 
edf0: 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09  * (*count));....
ee00: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 62  .} else {......b
ee10: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  reak;.....}....}
ee20: 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66  ...}....cackey_f
ee30: 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29  ree_tlv(app_tlv)
ee40: 3b 0a 0a 09 09 69 66 20 28 6f 75 74 69 64 78 20  ;....if (outidx 
ee50: 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09  >= *count) {....
ee60: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  break;...}..}...
ee70: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
ee80: 63 63 63 5f 74 6c 76 29 3b 0a 0a 09 2a 63 6f 75  ccc_tlv);...*cou
ee90: 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69  nt = outidx;...i
eea0: 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62  f (certs_resizab
eeb0: 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20 3d 20  le) {...certs = 
eec0: 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73  realloc(certs, s
eed0: 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20  izeof(*certs) * 
eee0: 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a 09  (*count));..}...
eef0: 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61  /* Terminate Sma
ef00: 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtCard Transacti
ef10: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e  on */..cackey_en
ef20: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
ef30: 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65  ot);...return(ce
ef40: 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  rts);.}../*. * S
ef50: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
ef60: 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
ef70: 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
ef80: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
ef90: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
efa0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
efb0: 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
efc0: 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
efd0: 73 69 67 6e 64 65 63 72 79 70 74 28 73 74 72 75  signdecrypt(stru
efe0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
eff0: 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63  slot, struct cac
f000: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
f010: 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
f020: 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65   char *buf, size
f030: 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67  _t buflen, unsig
f040: 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66  ned char *outbuf
f050: 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c  , size_t outbufl
f060: 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74  en, int padInput
f070: 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75  , int unpadOutpu
f080: 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  t) {..unsigned c
f090: 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d  har *tmpbuf, *tm
f0a0: 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f  pbuf_s, *outbuf_
f0b0: 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  s;..unsigned cha
f0c0: 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c  r bytes_to_send,
f0d0: 20 70 31 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63   p1;..unsigned c
f0e0: 68 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09  har blocktype;..
f0f0: 63 61 63 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f  cackey_ret send_
f100: 72 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72  ret;..uint16_t r
f110: 65 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f  espcode;..ssize_
f120: 74 20 72 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e  t retval = 0, un
f130: 70 61 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65  padoffset;..size
f140: 5f 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61  _t tmpbuflen, pa
f150: 64 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c  dlen, tmpoutbufl
f160: 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74 6d  en;..int free_tm
f170: 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20 6c  pbuf = 0;..int l
f180: 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  e;...CACKEY_DEBU
f190: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
f1a0: 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20  .");...if (slot 
f1b0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
f1c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f1d0: 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69  ("Error.  slot i
f1e0: 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
f1f0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
f200: 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (buf == NULL) {
f210: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f220: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
f230: 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  buf is NULL");..
f240: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
f250: 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d 3d  ...if (outbuf ==
f260: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
f270: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f280: 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20 69  Error.  outbuf i
f290: 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
f2a0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
f2b0: 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55   (identity == NU
f2c0: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
f2d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
f2e0: 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69 73  or.  identity is
f2f0: 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
f300: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
f310: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
f320: 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c  identity == NULL
f330: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
f340: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
f350: 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  .  identity->pcs
f360: 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55  c_identity is NU
f370: 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
f380: 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  -1);..}.../* Det
f390: 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 20  ermine identity 
f3a0: 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20  Key size */..if 
f3b0: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
f3c0: 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
f3d0: 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e 74  e < 0) {...ident
f3e0: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
f3f0: 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35  ty->keysize = x5
f400: 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64  09_to_keysize(id
f410: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
f420: 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
f430: 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  te, identity->pc
f440: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72  sc_identity->cer
f450: 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
f460: 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 61  }.../* Pad messa
f470: 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a  ge to key size *
f480: 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74 29  /..if (padInput)
f490: 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74   {...if (identit
f4a0: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
f4b0: 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 7b  ->keysize > 0) {
f4c0: 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 21  ....if (buflen !
f4d0: 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  = identity->pcsc
f4e0: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
f4f0: 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62 75  ze) {.....if (bu
f500: 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 79  flen > (identity
f510: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
f520: 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29 29 20 7b  >keysize + 3)) {
f530: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
f540: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
f550: 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74 6f  .  Message is to
f560: 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e 2f  o large to sign/
f570: 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 09  decrypt");......
f580: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
f590: 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65  .}......tmpbufle
f5a0: 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  n = identity->pc
f5b0: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
f5c0: 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 66  size;.....tmpbuf
f5d0: 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66   = malloc(tmpbuf
f5e0: 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f 74  len);.....free_t
f5f0: 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09  mpbuf = 1;......
f600: 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c  padlen = tmpbufl
f610: 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b  en - buflen - 3;
f620: 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b 43  ....../* RSA PKC
f630: 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76  S#1 EMSA-PKCS1-v
f640: 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09  1_5 Padding */..
f650: 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30  ...tmpbuf[0] = 0
f660: 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b  x00;.....tmpbuf[
f670: 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d  1] = 0x01;.....m
f680: 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d  emset(&tmpbuf[2]
f690: 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b  , 0xFF, padlen);
f6a0: 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64 6c  .....tmpbuf[padl
f6b0: 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09  en + 2]= 0x00;..
f6c0: 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 75  ...memcpy(&tmpbu
f6d0: 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62  f[padlen + 3], b
f6e0: 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09  uf, buflen);....
f6f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f700: 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65  RINTBUF("Unpadde
f710: 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e  d:", buf, buflen
f720: 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
f730: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61  BUG_PRINTBUF("Pa
f740: 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20  dded:", tmpbuf, 
f750: 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d  tmpbuflen);....}
f760: 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 62   else {.....tmpb
f770: 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d  uf = buf;.....tm
f780: 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e  pbuflen = buflen
f790: 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75  ;.....free_tmpbu
f7a0: 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c 65  f = 0;.....padle
f7b0: 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20  n = 0;....}...} 
f7c0: 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
f7d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
f7e0: 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  nable to determi
f7f0: 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70  ne key size, hop
f800: 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65 20  ing the message 
f810: 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64  is properly padd
f820: 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75  ed!");.....tmpbu
f830: 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 62  f = buf;....tmpb
f840: 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  uflen = buflen;.
f850: 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
f860: 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20   0;....padlen = 
f870: 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  0;...}..} else {
f880: 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b  ...tmpbuf = buf;
f890: 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62  ...tmpbuflen = b
f8a0: 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d  uflen;...free_tm
f8b0: 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c  pbuf = 0;...padl
f8c0: 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20  en = 0;..}.../* 
f8d0: 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  Begin transactio
f8e0: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67  n */..cackey_beg
f8f0: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
f900: 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63  lot);.../* Selec
f910: 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c 65 74  t correct applet
f920: 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55   */..CACKEY_DEBU
f930: 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74  G_PRINTF("Select
f940: 69 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64  ing applet found
f950: 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65   at %p ...", ide
f960: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
f970: 74 69 74 79 2d 3e 61 70 70 6c 65 74 29 3b 0a 09  tity->applet);..
f980: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
f990: 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74  plet(slot, ident
f9a0: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
f9b0: 74 79 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65  ty->applet, size
f9c0: 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  of(identity->pcs
f9d0: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c  c_identity->appl
f9e0: 65 74 29 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63  et));.../* Selec
f9f0: 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20 2a  t correct file *
fa00: 2f 0a 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  /..cackey_select
fa10: 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e  _file(slot, iden
fa20: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
fa30: 69 74 79 2d 3e 66 69 6c 65 29 3b 0a 0a 09 74 6d  ity->file);...tm
fa40: 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b  pbuf_s = tmpbuf;
fa50: 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74  ..outbuf_s = out
fa60: 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70  buf;..while (tmp
fa70: 62 75 66 6c 65 6e 29 20 7b 0a 09 09 69 66 20 28  buflen) {...if (
fa80: 74 6d 70 62 75 66 6c 65 6e 20 3e 20 32 34 35 29  tmpbuflen > 245)
fa90: 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73   {....bytes_to_s
faa0: 65 6e 64 20 3d 20 32 34 35 3b 0a 09 09 09 70 31  end = 245;....p1
fab0: 20 3d 20 30 78 38 30 3b 0a 09 09 09 6c 65 20 3d   = 0x80;....le =
fac0: 20 30 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20   0x00;...} else 
fad0: 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65  {....bytes_to_se
fae0: 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  nd = tmpbuflen;.
faf0: 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09  ...p1 = 0x00;...
fb00: 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 7d 0a  .le = 0x00;...}.
fb10: 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20  ...tmpoutbuflen 
fb20: 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09  = outbuflen;....
fb30: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
fb40: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
fb50: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c  , GSCIS_CLASS_GL
fb60: 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47  OBAL_PLATFORM, G
fb70: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
fb80: 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30  ECRYPT, p1, 0x00
fb90: 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c  , bytes_to_send,
fba0: 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65   tmpbuf, le, &re
fbb0: 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20  spcode, outbuf, 
fbc0: 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a  &tmpoutbuflen);.
fbd0: 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
fbe0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
fbf0: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
fc00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
fc10: 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65  PU Sending Faile
fc20: 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69  d -- returning i
fc30: 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09  n error.");.....
fc40: 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29  if (free_tmpbuf)
fc50: 20 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75   {.....if (tmpbu
fc60: 66 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65 65  f_s) {......free
fc70: 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09 09  (tmpbuf_s);.....
fc80: 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e  }....}...../* En
fc90: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d transaction */
fca0: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
fcb0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
fcc0: 3b 0a 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f  ;.....if (respco
fcd0: 64 65 20 3d 3d 20 30 78 36 39 38 32 29 20 7b 0a  de == 0x6982) {.
fce0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
fcf0: 5f 50 52 49 4e 54 46 28 22 53 65 63 75 72 69 74  _PRINTF("Securit
fd00: 79 20 73 74 61 74 75 73 20 6e 6f 74 20 73 61 74  y status not sat
fd10: 69 73 69 66 69 65 64 2e 20 20 52 65 74 75 72 6e  isified.  Return
fd20: 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22 29 3b  ing NEEDLOGIN");
fd30: 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72  ......cackey_mar
fd40: 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
fd50: 74 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 6f  t);.....slot->to
fd60: 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
fd70: 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
fd80: 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
fd90: 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
fda0: 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  GIN);....}.....i
fdb0: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
fdc0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
fdd0: 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09  ENABSENT) {.....
fde0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
fdf0: 4e 54 46 28 22 54 6f 6b 65 6e 20 61 62 73 65 6e  NTF("Token absen
fe00: 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 54 4f  t.  Returning TO
fe10: 4b 45 4e 41 42 53 45 4e 54 22 29 3b 0a 0a 09 09  KENABSENT");....
fe20: 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
fe30: 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
fe40: 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f  ....slot->token_
fe50: 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
fe60: 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09  N_REQUIRED;.....
fe70: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
fe80: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
fe90: 54 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  T);....}.....ret
fea0: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
feb0: 74 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f  tmpbuf += bytes_
fec0: 74 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75  to_send;...tmpbu
fed0: 66 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f  flen -= bytes_to
fee0: 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66  _send;....outbuf
fef0: 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e   += tmpoutbuflen
ff00: 3b 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d  ;...outbuflen -=
ff10: 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
ff20: 09 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75  .retval += tmpou
ff30: 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66  tbuflen;..}...if
ff40: 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b   (free_tmpbuf) {
ff50: 0a 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29  ...if (tmpbuf_s)
ff60: 20 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75   {....free(tmpbu
ff70: 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f  f_s);...}..}...o
ff80: 75 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73  utbuf = outbuf_s
ff90: 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  ;.../* End trans
ffa0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
ffb0: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
ffc0: 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66  n(slot);..#ifdef
ffd0: 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44   CACKEY_PARANOID
ffe0: 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58  .#  ifdef _POSIX
fff0: 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28  _SSIZE_MAX..if (
10000 6f 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53  outbuflen > _POS
10010 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
10020 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10030 52 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e  RINTF("Outbuflen
10040 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
10050 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
10060 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
10070 61 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66  ax = %li, outbuf
10080 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  len = %lu)", (lo
10090 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
100a0 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
100b0 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29  long) outbuflen)
100c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
100d0 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
100e0 64 69 66 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72  dif.../* Unpad r
100f0 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70  eply */..if (unp
10100 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66  adOutput) {...if
10110 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a   (retval < 3) {.
10120 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10130 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73  PRINTF("Reply is
10140 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61   too small, we a
10150 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75  re not able to u
10160 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20  npad -- passing 
10170 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20  back and hoping 
10180 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b  for the best!");
10190 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
101a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
101b0 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
101c0 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
101d0 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
101e0 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e  tval);....return
101f0 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
10200 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21  .if (outbuf[0] !
10210 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43  = 0x00) {....CAC
10220 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10230 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70  ("Unrecognized p
10240 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d  adding scheme --
10250 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e   passing back an
10260 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65  d hoping for the
10270 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41   best!");.....CA
10280 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10290 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
102a0 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20  success, retval 
102b0 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20  = %li (bytes)", 
102c0 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a  (long) retval);.
102d0 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
102e0 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74  );...}....blockt
102f0 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b  ype = outbuf[1];
10300 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  ...unpadoffset =
10310 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62   0;....switch (b
10320 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63  locktype) {....c
10330 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a  ase 0x00:...../*
10340 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20   Padding Scheme 
10350 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e  1, the first non
10360 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74 68  -zero byte is th
10370 65 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20  e start of data 
10380 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
10390 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
103a0 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
103b0 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
103c0 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
103d0 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
103e0 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09   != 0x00) {.....
103f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
10400 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
10410 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09  ....case 0x01:..
10420 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63  .../* Padding Sc
10430 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65  heme 2, pad byte
10440 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f  s are 0xFF follo
10450 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09  wed by 0x00 */..
10460 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66  ...for (unpadoff
10470 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66  set = 2; unpadof
10480 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75  fset < retval; u
10490 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a  npadoffset++) {.
104a0 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
104b0 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20  unpadoffset] != 
104c0 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66  0xFF) {.......if
104d0 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66   (outbuf[unpadof
104e0 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b  fset] == 0x00) {
104f0 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66  ........unpadoff
10500 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62  set++;.........b
10510 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c  reak;.......} el
10520 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b  se {........CACK
10530 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10540 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67  "Invalid padding
10550 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74   data found, ret
10560 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
10570 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  e, should have b
10580 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30  een 0x00 found 0
10590 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65  x%02x", (unsigne
105a0 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e  d int) outbuf[un
105b0 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09  padoffset]);....
105c0 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
105d0 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20  .......}......} 
105e0 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43  else {.......CAC
105f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10600 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e  ("Invalid paddin
10610 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65  g data found, re
10620 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
10630 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20  re, should have 
10640 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20  been 0xFF found 
10650 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e  0x%02x", (unsign
10660 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75  ed int) outbuf[u
10670 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09  npadoffset]);...
10680 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
10690 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
106a0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
106b0 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61   0x02:...../* Pa
106c0 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20  dding Scheme 3, 
106d0 70 61 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f  pad bytes are no
106e0 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72  n-zero first zer
106f0 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20  o byte found is 
10700 74 68 65 20 73 65 70 65 72 61 74 6f 72 20 62 79  the seperator by
10710 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  te */.....for (u
10720 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
10730 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
10740 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
10750 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
10760 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
10770 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09  et] == 0x00) {..
10780 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74  .....unpadoffset
10790 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ++;........break
107a0 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
107b0 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
107c0 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74  .if (unpadoffset
107d0 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09   > retval) {....
107e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
107f0 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 61  NTF("Offset grea
10800 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73  ter than reply s
10810 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20  ize, aborting.  
10820 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25  (unpadoffset = %
10830 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75  lu, retval = %lu
10840 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
10850 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c  ng) unpadoffset,
10860 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
10870 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65   retval);.....re
10880 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
10890 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
108a0 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22  INTBUF("Padded:"
108b0 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c  , outbuf, retval
108c0 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20  );....retval -= 
108d0 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d  unpadoffset;...m
108e0 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f  emmove(outbuf, o
108f0 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66  utbuf + unpadoff
10900 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  set, retval);...
10910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10920 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64  INTBUF("Unpadded
10930 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76  :", outbuf, retv
10940 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45  al);..}....CACKE
10950 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10960 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
10970 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25  cess, retval = %
10980 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f  li (bytes)", (lo
10990 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  ng) retval);...r
109a0 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
109b0 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
109c0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
109d0 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
109e0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
109f0 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
10a00 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
10a10 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
10a20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
10a30 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69  _ret cackey_logi
10a40 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
10a50 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
10a60 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20  gned char *pin, 
10a70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69  unsigned long pi
10a80 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65  n_len, int *trie
10a90 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
10aa0 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
10ab0 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78  cac_pin[8] = {0x
10ac0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
10ad0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
10ae0 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09  , 0xFF, 0xFF};..
10af0 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73  uint16_t respons
10b00 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69  e_code;..int tri
10b10 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69  es_remaining;..i
10b20 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f  nt send_ret;.../
10b30 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
10b40 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61  we do not know a
10b50 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72  bout how many tr
10b60 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e  ies are remainin
10b70 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f  g */..if (tries_
10b80 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
10b90 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  .*tries_remainin
10ba0 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f  g_p = -1;..}.../
10bb0 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41  * Apparently, CA
10bc0 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43  C PINs are *EXAC
10bd0 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e  TLY* 8 bytes lon
10be0 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78  g -- pad with 0x
10bf0 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20  FF if too short 
10c00 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20  */..if (pin_len 
10c10 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79  >= 8) {...memcpy
10c20 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38  (cac_pin, pin, 8
10c30 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d  );..} else {...m
10c40 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
10c50 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d  in, pin_len);..}
10c60 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20  .../* Issue PIN 
10c70 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f  Verify */..send_
10c80 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
10c90 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
10ca0 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
10cb0 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45  , GSCIS_INSTR_VE
10cc0 52 49 46 59 2c 20 30 78 30 30 2c 20 30 78 30 30  RIFY, 0x00, 0x00
10cd0 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e  , sizeof(cac_pin
10ce0 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30  ), cac_pin, 0x00
10cf0 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  , &response_code
10d00 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
10d10 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
10d20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
10d30 29 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f  ) {...if ((respo
10d40 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43  nse_code & 0x63C
10d50 30 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a  0) == 0x63C0) {.
10d60 09 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  ...tries_remaini
10d70 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63  ng = (response_c
10d80 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09  ode & 0xF);.....
10d90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10da0 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63  NTF("PIN Verific
10db0 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69  ation failed, %i
10dc0 20 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67   tries remaining
10dd0 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  ", tries_remaini
10de0 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69  ng);.....if (tri
10df0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20  es_remaining_p) 
10e00 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d  {.....*tries_rem
10e10 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73  aining_p = tries
10e20 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d  _remaining;....}
10e30 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
10e40 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
10e50 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65  );...}....if (re
10e60 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30  sponse_code == 0
10e70 78 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b  x6983) {....CACK
10e80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10e90 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f  "PIN Verificatio
10ea0 6e 20 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65  n failed, device
10eb0 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09   is locked");...
10ec0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
10ed0 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a  PCSC_E_LOCKED);.
10ee0 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ..}....return(CA
10ef0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
10f00 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  RIC);..}...CACKE
10f10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10f20 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
10f30 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09   succeeded");...
10f40 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
10f50 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
10f60 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
10f70 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
10f80 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
10f90 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
10fa0 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
10fb0 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
10fc0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
10fd0 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
10fe0 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
10ff0 73 65 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b  sent(struct cack
11000 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
11010 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73  ..cackey_ret pcs
11020 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09  c_connect_ret;..
11030 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c 65 6e  DWORD reader_len
11040 2c 20 73 74 61 74 65 2c 20 70 72 6f 74 6f 63 6f  , state, protoco
11050 6c 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54  l, atr_len;..BYT
11060 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49  E atr[MAX_ATR_SI
11070 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75  ZE];..LONG statu
11080 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63  s_ret, scard_rec
11090 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  onn_ret;...CACKE
110a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
110b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 70 63 73  Called.");...pcs
110c0 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
110d0 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
110e0 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28  ard(slot);..if (
110f0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
11100 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
11110 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
11120 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
11130 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74  nable to connect
11140 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
11150 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
11160 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
11170 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
11180 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61  NABSENT);..}...a
11190 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  tr_len = sizeof(
111a0 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65  atr);..status_re
111b0 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28  t = SCardStatus(
111c0 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
111d0 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c   NULL, &reader_l
111e0 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
111f0 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
11200 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61  _len);...if (sta
11210 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  tus_ret == SCARD
11220 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  _E_INVALID_HANDL
11230 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  E) {...CACKEY_DE
11240 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
11250 64 53 74 61 74 75 73 28 29 20 72 65 74 75 72 6e  dStatus() return
11260 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  ed SCARD_E_INVAL
11270 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69  ID_HANDLE, marki
11280 6e 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ng is not alread
11290 79 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20  y connected and 
112a0 74 72 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a  trying again");.
112b0 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
112c0 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
112d0 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
112e0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
112f0 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
11300 0a 09 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ...if (pcsc_conn
11310 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
11320 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
11330 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11340 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
11350 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
11360 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
11370 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09  n absent");.....
11380 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
11390 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
113a0 29 3b 0a 09 09 7d 0a 0a 09 09 61 74 72 5f 6c 65  );...}....atr_le
113b0 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b  n = sizeof(atr);
113c0 0a 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20  ...status_ret = 
113d0 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74  SCardStatus(slot
113e0 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c  ->pcsc_card, NUL
113f0 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20  L, &reader_len, 
11400 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f  &state, &protoco
11410 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e  l, atr, &atr_len
11420 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 61 74  );..}...if (stat
11430 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  us_ret != SCARD_
11440 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 63  S_SUCCESS) {...c
11450 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
11460 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
11470 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d  if (status_ret =
11480 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  = SCARD_W_RESET_
11490 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
114a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
114b0 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20  Reset required, 
114c0 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29  please hold...")
114d0 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f  ;.....scard_reco
114e0 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
114f0 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
11500 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  lot, SCARD_PROTO
11510 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
11520 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 6f  ROTOCOL_T1, &pro
11530 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28 73  tocol);....if (s
11540 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
11550 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
11560 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64  SS) {...../* Upd
11570 61 74 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a  ate protocol */.
11580 09 09 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ....slot->protoc
11590 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a  ol = protocol;..
115a0 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c  ..../* Re-establ
115b0 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ish transaction,
115c0 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65   if it was prese
115d0 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c  nt */.....if (sl
115e0 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
115f0 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
11600 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
11610 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09  ion_depth--;....
11620 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
11630 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
11640 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
11650 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
11660 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
11670 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
11680 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
11690 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71   successful, req
116a0 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73  uerying");.....s
116b0 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72  tatus_ret = SCar
116c0 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63  dStatus(slot->pc
116d0 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26  sc_card, NULL, &
116e0 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61  reader_len, &sta
116f0 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61  te, &protocol, a
11700 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09  tr, &atr_len);..
11710 09 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
11720 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
11730 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43  CESS) {......CAC
11740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11750 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74  ("Still unable t
11760 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74 61  o query card sta
11770 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  tus, returning t
11780 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43  oken absent.  SC
11790 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 73  ardStatus() = %s
117a0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
117b0 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
117c0 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 29  _STR(status_ret)
117d0 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
117e0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
117f0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09  KENABSENT);.....
11800 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  }....} else {...
11810 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11820 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
11830 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61   reconnect to ca
11840 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  rd, returning to
11850 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61  ken absent.  SCa
11860 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20  rdReconnect() = 
11870 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  %s", CACKEY_DEBU
11880 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
11890 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63  TO_STR(scard_rec
118a0 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09  onn_ret));......
118b0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
118c0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
118d0 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  );....}...} else
118e0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
118f0 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
11900 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20  e to query card 
11910 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e  status, returnin
11920 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20  g token absent. 
11930 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d   SCardStatus() =
11940 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
11950 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
11960 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72  _TO_STR(status_r
11970 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  et));.....return
11980 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
11990 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d  OKENABSENT);...}
119a0 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65  ..}...if ((state
119b0 20 26 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29   & SCARD_ABSENT)
119c0 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54   == SCARD_ABSENT
119d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
119e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20  UG_PRINTF("Card 
119f0 69 73 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72  is absent, retur
11a00 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
11a10 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  t");....return(C
11a20 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
11a30 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  ENABSENT);..}...
11a40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11a50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74  NTF("Returning t
11a60 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b  oken present.");
11a70 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
11a80 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
11a90 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  SENT);.}../*. * 
11aa0 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
11ab0 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
11ac0 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
11ad0 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
11ae0 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
11af0 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
11b00 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
11b10 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
11b20 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74  _pcsc_identity_t
11b30 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 74 20 63  o_label(struct c
11b40 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
11b50 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
11b60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61  nsigned char *la
11b70 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65  bel_buf, unsigne
11b80 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66  d long label_buf
11b90 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  _len) {..unsigne
11ba0 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 69 63 61  d long certifica
11bb0 74 65 5f 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 6c  te_len;..char *l
11bc0 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64  abel_asn1;..void
11bd0 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09   *certificate;..
11be0 69 6e 74 20 78 35 30 39 5f 72 65 61 64 5f 72 65  int x509_read_re
11bf0 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65  t;...certificate
11c00 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
11c10 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69  tificate;..certi
11c20 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65  ficate_len = ide
11c30 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
11c40 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65  te_len;...if (ce
11c50 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20  rtificate_len < 
11c60 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31  0) {...return(-1
11c70 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61  );..}...x509_rea
11c80 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
11c90 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63  subject(certific
11ca0 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
11cb0 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20  _len, (void **) 
11cc0 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69  &label_asn1);..i
11cd0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
11ce0 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e   < 0) {...return
11cf0 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f  (-1);..}...x509_
11d00 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
11d10 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62  dn_to_string(lab
11d20 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65  el_asn1, x509_re
11d30 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29  ad_ret, (char *)
11d40 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65   label_buf, labe
11d50 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29  l_buf_len, "CN")
11d60 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ;..if (x509_read
11d70 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78  _ret <= 0) {...x
11d80 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
11d90 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67  509_dn_to_string
11da0 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30  (label_asn1, x50
11db0 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61  9_read_ret, (cha
11dc0 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20  r *) label_buf, 
11dd0 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e  label_buf_len, N
11de0 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35 30  ULL);....if (x50
11df0 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29  9_read_ret <= 0)
11e00 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29   {....return(-1)
11e10 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66  ;...}..}..#ifdef
11e20 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44   CACKEY_PARANOID
11e30 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58  .#  ifdef _POSIX
11e40 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28  _SSIZE_MAX..if (
11e50 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20  x509_read_ret > 
11e60 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
11e70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
11e80 55 47 5f 50 52 49 4e 54 46 28 22 78 35 30 39 5f  UG_PRINTF("x509_
11e90 72 65 61 64 5f 72 65 74 20 65 78 63 65 65 64 73  read_ret exceeds
11ea0 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20   maximum value, 
11eb0 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
11ec0 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69  lure. (max = %li
11ed0 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  , x509_read_ret 
11ee0 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20  = %lu)", (long) 
11ef0 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
11f00 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11f10 29 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29  ) x509_read_ret)
11f20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
11f30 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
11f40 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 78 35 30  dif...return(x50
11f50 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a  9_read_ret);.}..
11f60 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20  /* Returns 0 on 
11f70 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69  success */.stati
11f80 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74  c int cackey_mut
11f90 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a  ex_create(void *
11fa0 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65  *mutex) {..pthre
11fb0 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72  ad_mutex_t *pthr
11fc0 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20  ead_mutex;..int 
11fd0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a  pthread_retval;.
11fe0 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65  .CK_RV custom_re
11ff0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
12000 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
12010 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63  led.");...if ((c
12020 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
12030 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e   & CKF_OS_LOCKIN
12040 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f  G_OK) == CKF_OS_
12050 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09  LOCKING_OK) {...
12060 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20  pthread_mutex = 
12070 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
12080 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a  thread_mutex));.
12090 09 09 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d  ..if (!pthread_m
120a0 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45  utex) {....CACKE
120b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
120c0 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61  Failed to alloca
120d0 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09  te memory.");...
120e0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
120f0 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  }....pthread_ret
12100 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
12110 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64  tex_init(pthread
12120 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09  _mutex, NULL);..
12130 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
12140 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  val != 0) {....C
12150 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12160 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65  TF("pthread_mute
12170 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65  x_init() returne
12180 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20  d error (%i).", 
12190 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b  pthread_retval);
121a0 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
121b0 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d  ...}....*mutex =
121c0 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a   pthread_mutex;.
121d0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
121e0 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
121f0 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  teMutex) {....cu
12200 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
12210 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
12220 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
12230 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
12240 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
12250 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12260 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
12270 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
12280 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  x() returned err
12290 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e  or (%li).", (lon
122a0 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  g) custom_retval
122b0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
122c0 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  1);....}...}..}.
122d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
122e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
122f0 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29   sucessfully (0)
12300 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
12310 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30  .}../* Returns 0
12320 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73   on success */.s
12330 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
12340 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64  _mutex_lock(void
12350 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72   *mutex) {..pthr
12360 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68  ead_mutex_t *pth
12370 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74  read_mutex;..int
12380 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b   pthread_retval;
12390 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72  ..CK_RV custom_r
123a0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
123b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
123c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
123d0 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67  cackey_args.flag
123e0 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49  s & CKF_OS_LOCKI
123f0 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53  NG_OK) == CKF_OS
12400 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09  _LOCKING_OK) {..
12410 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d  .pthread_mutex =
12420 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65   mutex;....pthre
12430 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
12440 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70  ead_mutex_lock(p
12450 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09  thread_mutex);..
12460 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
12470 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  val != 0) {....C
12480 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12490 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65  TF("pthread_mute
124a0 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65  x_lock() returne
124b0 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20  d error (%i).", 
124c0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b  pthread_retval);
124d0 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
124e0 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
124f0 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73  .if (cackey_args
12500 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09  .LockMutex) {...
12510 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d  .custom_retval =
12520 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63   cackey_args.Loc
12530 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a  kMutex(mutex);..
12540 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65  ...if (custom_re
12550 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  tval != CKR_OK) 
12560 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
12570 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65  UG_PRINTF("cacke
12580 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
12590 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
125a0 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67  r (%li).", (long
125b0 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29  ) custom_retval)
125c0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
125d0 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a  );....}...}..}..
125e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
125f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
12600 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22  sucessfully (0)"
12610 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
12620 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20  }../* Returns 0 
12630 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74  on success */.st
12640 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
12650 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69  mutex_unlock(voi
12660 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68  d *mutex) {..pth
12670 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74  read_mutex_t *pt
12680 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e  hread_mutex;..in
12690 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  t pthread_retval
126a0 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f  ;..CK_RV custom_
126b0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
126c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
126d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
126e0 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  (cackey_args.fla
126f0 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  gs & CKF_OS_LOCK
12700 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f  ING_OK) == CKF_O
12710 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a  S_LOCKING_OK) {.
12720 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20  ..pthread_mutex 
12730 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72  = mutex;....pthr
12740 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68  ead_retval = pth
12750 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
12760 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29  k(pthread_mutex)
12770 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f  ;...if (pthread_
12780 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
12790 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
127a0 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d  RINTF("pthread_m
127b0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65  utex_unlock() re
127c0 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69  turned error (%i
127d0 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74  ).", pthread_ret
127e0 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
127f0 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  (-1);...}..} els
12800 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  e {...if (cackey
12810 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
12820 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72  x) {....custom_r
12830 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61  etval = cackey_a
12840 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28  rgs.UnlockMutex(
12850 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
12860 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
12870 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
12880 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12890 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
128a0 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65  UnlockMutex() re
128b0 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c  turned error (%l
128c0 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73  i).", (long) cus
128d0 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  tom_retval);....
128e0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
128f0 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  .}...}..}...CACK
12900 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12910 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73  "Returning suces
12920 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09  sfully (0)");...
12930 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74  return(0);.}..st
12940 61 74 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54  atic CK_ATTRIBUT
12950 45 5f 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74  E_PTR cackey_get
12960 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f  _attributes(CK_O
12970 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65  BJECT_CLASS obje
12980 63 74 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20  ctclass, struct 
12990 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
129a0 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20  tity *identity, 
129b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
129c0 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55  entity_num, CK_U
129d0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e  LONG_PTR pulCoun
129e0 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  t) {..static CK_
129f0 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20  BBOOL ck_true = 
12a00 31 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42  1;..static CK_BB
12a10 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30  OOL ck_false = 0
12a20 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 54 52 55  ;..static CK_TRU
12a30 53 54 20 63 6b 5f 74 72 75 73 74 65 64 20 3d 20  ST ck_trusted = 
12a40 43 4b 5f 54 52 55 53 54 45 44 5f 44 45 4c 45 47  CK_TRUSTED_DELEG
12a50 41 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  ATOR;..CK_ULONG 
12a60 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65  numattrs = 0, re
12a70 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f  tval_count;..CK_
12a80 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 63  ATTRIBUTE_TYPE c
12a90 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09  urr_attr_type;..
12aa0 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75 72  CK_ATTRIBUTE cur
12ab0 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b  r_attr, *retval;
12ac0 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56  ..CK_VOID_PTR pV
12ad0 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  alue;..CK_ULONG 
12ae0 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f  ulValueLen;..CK_
12af0 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f  OBJECT_CLASS ck_
12b00 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43  object_class;..C
12b10 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
12b20 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74  PE ck_certificat
12b30 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f  e_type;..CK_KEY_
12b40 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65  TYPE ck_key_type
12b50 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75  ;..CK_UTF8CHAR u
12b60 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09  cTmpBuf[1024];..
12b70 53 48 41 31 43 6f 6e 74 65 78 74 20 73 68 61 31  SHA1Context sha1
12b80 5f 63 74 78 3b 0a 09 4d 44 35 5f 43 54 58 20 6d  _ctx;..MD5_CTX m
12b90 64 35 5f 63 74 78 3b 0a 09 75 69 6e 74 38 5f 74  d5_ctx;..uint8_t
12ba0 20 73 68 61 31 5f 68 61 73 68 5b 53 48 41 31 48   sha1_hash[SHA1H
12bb0 61 73 68 53 69 7a 65 5d 3b 0a 09 75 69 6e 74 38  ashSize];..uint8
12bc0 5f 74 20 6d 64 35 5f 68 61 73 68 5b 4d 44 35 48  _t md5_hash[MD5H
12bd0 61 73 68 53 69 7a 65 5d 3b 0a 09 75 6e 73 69 67  ashSize];..unsig
12be0 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66  ned char *certif
12bf0 69 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20  icate;..ssize_t 
12c00 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
12c10 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  = -1, x509_read_
12c20 72 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65  ret;..int pValue
12c30 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f  _free;...CACKEY_
12c40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
12c50 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73  lled (objectClas
12c60 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74  s = %lu, identit
12c70 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20  y_num = %lu).", 
12c80 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
12c90 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65  objectclass, ide
12ca0 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70  ntity_num);...*p
12cb0 75 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 69  ulCount = 0;...i
12cc0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
12cd0 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
12ce0 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  E && objectclass
12cf0 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   != CKO_PUBLIC_K
12d00 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
12d10 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s != CKO_PRIVATE
12d20 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
12d30 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
12d40 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 43  APE_TRUST) {...C
12d50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12d60 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
12d70 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
12d80 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63  invalid object c
12d90 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72  lass");....retur
12da0 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
12db0 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66   Get Cert */..if
12dc0 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55   (identity == NU
12dd0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
12de0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
12df0 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
12e00 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
12e10 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65   identiy provide
12e20 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  d");....return(N
12e30 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69  ULL);..}...certi
12e40 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74  ficate = identit
12e50 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a  y->certificate;.
12e60 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
12e70 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
12e80 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
12e90 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
12ea0 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72  len == -1 || cer
12eb0 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c  tificate == NULL
12ec0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
12ed0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
12ee0 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
12ef0 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e  NULL), this iden
12f00 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  tity does not ha
12f10 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74  ve an X.509 cert
12f20 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
12f30 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 20 77  ed with it and w
12f40 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a  ill not work");.
12f50 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
12f60 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20  ..}.../* Verify 
12f70 74 68 61 74 20 63 65 72 74 69 66 69 63 61 74 65  that certificate
12f80 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65   is ASN.1 encode
12f90 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63  d X.509 certific
12fa0 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39  ate */..if (x509
12fb0 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69  _to_serial(certi
12fc0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
12fd0 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c  ate_len, NULL) <
12fe0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
12ff0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
13000 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
13010 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35   (NULL), the X.5
13020 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61  09 certificate a
13030 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
13040 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 73 20  his identity is 
13050 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09  not valid");....
13060 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
13070 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  ...retval_count 
13080 3d 20 36 34 3b 0a 09 72 65 74 76 61 6c 20 3d 20  = 64;..retval = 
13090 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f  malloc(retval_co
130a0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
130b0 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63  tval));...for (c
130c0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20  urr_attr_type = 
130d0 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  0; curr_attr_typ
130e0 65 20 3c 20 30 78 63 65 35 33 36 33 62 66 3b 20  e < 0xce5363bf; 
130f0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b  curr_attr_type++
13100 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61  ) {...if (curr_a
13110 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30  ttr_type == 0x80
13120 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74  0) {....curr_att
13130 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 36  r_type = 0xce536
13140 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c  300;...}....pVal
13150 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70  ue_free = 0;...p
13160 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
13170 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
13180 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77  _LONG) -1;....sw
13190 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f  itch (curr_attr_
131a0 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
131b0 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43  CKA_CLASS:.....C
131c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
131d0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
131e0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41  ttribute CKA_CLA
131f0 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  SS (0x%08lx) ...
13200 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
13210 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
13220 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65  e);......ck_obje
13230 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63  ct_class = objec
13240 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61  tclass;......pVa
13250 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74  lue = &ck_object
13260 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61  _class;.....ulVa
13270 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
13280 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29  ck_object_class)
13290 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
132a0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
132b0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
132c0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
132d0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
132e0 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20  OBJECT_CLASS *) 
132f0 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
13300 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13310 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
13320 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
13330 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09  e CKA_TOKEN:....
13340 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13350 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
13360 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
13370 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  OKEN (0x%08lx) .
13380 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
13390 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
133a0 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
133b0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
133c0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
133d0 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
133e0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
133f0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
13400 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
13410 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
13420 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
13430 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
13440 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
13450 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
13460 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
13470 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ....case CKA_PRI
13480 56 41 54 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  VATE:.....CACKEY
13490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
134a0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
134b0 75 74 65 20 43 4b 41 5f 50 52 49 56 41 54 45 20  ute CKA_PRIVATE 
134c0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
134d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
134e0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
134f0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
13500 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
13510 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
13520 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13530 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
13540 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
13550 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
13560 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74  not a Netscape t
13570 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
13580 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
13590 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  }......pValue = 
135a0 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75  &ck_false;.....u
135b0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
135c0 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09  of(ck_false);...
135d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
135e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
135f0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
13600 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
13610 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
13620 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
13630 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
13640 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
13650 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
13660 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
13670 45 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ED:.....CACKEY_D
13680 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
13690 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
136a0 65 20 43 4b 41 5f 54 52 55 53 54 45 44 20 28 30  e CKA_TRUSTED (0
136b0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
136c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
136d0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
136e0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
136f0 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
13700 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
13710 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13720 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
13730 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
13740 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
13750 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
13760 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
13770 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
13780 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
13790 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
137a0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
137b0 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  rue);......CACKE
137c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
137d0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
137e0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
137f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
13800 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
13810 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
13820 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
13830 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
13840 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
13850 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09  KA_MODIFIABLE:..
13860 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13870 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
13880 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
13890 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28 30 78 25  _MODIFIABLE (0x%
138a0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
138b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
138c0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
138d0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
138e0 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alse;.....ulValu
138f0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
13900 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41  _false);......CA
13910 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13920 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
13930 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
13940 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13950 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
13960 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
13970 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13980 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
13990 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
139a0 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09  e CKA_LABEL:....
139b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
139c0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
139d0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4c   attribute CKA_L
139e0 41 42 45 4c 20 28 30 78 25 30 38 6c 78 29 20 2e  ABEL (0x%08lx) .
139f0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
13a00 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
13a10 79 70 65 29 3b 0a 0a 09 09 09 09 2f 2a 20 58 58  ype);....../* XX
13a20 58 3a 20 44 65 74 65 72 6d 69 6e 65 20 6e 61 6d  X: Determine nam
13a30 65 20 2a 2f 0a 09 09 09 09 75 6c 56 61 6c 75 65  e */.....ulValue
13a40 4c 65 6e 20 3d 20 73 6e 70 72 69 6e 74 66 28 28  Len = snprintf((
13a50 63 68 61 72 20 2a 29 20 75 63 54 6d 70 42 75 66  char *) ucTmpBuf
13a60 2c 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75  , sizeof(ucTmpBu
13a70 66 29 2c 20 22 49 64 65 6e 74 69 74 79 20 23 25  f), "Identity #%
13a80 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
13a90 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 6e 75  ong) identity_nu
13aa0 6d 29 3b 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  m);.....pValue =
13ab0 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09   ucTmpBuf;......
13ac0 69 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e  if (ulValueLen >
13ad0 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75  = sizeof(ucTmpBu
13ae0 66 29 29 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c  f)) {......ulVal
13af0 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09  ueLen = 0;......
13b00 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
13b10 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
13b20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
13b30 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
13b40 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
13b50 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13b60 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
13b70 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
13b80 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09  e CKA_VALUE:....
13b90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13ba0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
13bb0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56   attribute CKA_V
13bc0 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ALUE (0x%08lx) .
13bd0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
13be0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
13bf0 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63  ype);......switc
13c00 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20  h (objectclass) 
13c10 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  {......case CKO_
13c20 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09  PRIVATE_KEY:....
13c30 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13c40 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
13c50 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
13c60 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
13c70 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b   private key.");
13c80 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
13c90 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54  ....case CKO_NET
13ca0 53 43 41 50 45 5f 54 52 55 53 54 3a 0a 09 09 09  SCAPE_TRUST:....
13cb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13cc0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
13cd0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
13ce0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
13cf0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
13d00 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
13d10 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
13d20 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  e CKO_PUBLIC_KEY
13d30 3a 0a 09 09 09 09 09 09 69 66 20 28 63 65 72 74  :.......if (cert
13d40 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
13d50 29 20 7b 0a 09 09 09 09 09 09 09 78 35 30 39 5f  ) {........x509_
13d60 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
13d70 74 6f 5f 70 75 62 6b 65 79 28 63 65 72 74 69 66  to_pubkey(certif
13d80 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
13d90 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
13da0 3b 0a 09 09 09 09 09 09 09 69 66 20 28 78 35 30  ;........if (x50
13db0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
13dc0 7b 20 0a 09 09 09 09 09 09 09 09 70 56 61 6c 75  { .........pValu
13dd0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09  e = NULL;.......
13de0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
13df0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
13e00 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
13e10 09 09 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a  .....}.......}..
13e20 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
13e30 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49  ..case CKO_CERTI
13e40 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56  FICATE:.......pV
13e50 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 61  alue = certifica
13e60 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  te;.......ulValu
13e70 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61  eLen = certifica
13e80 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62  te_len;........b
13e90 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
13ea0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13eb0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
13ec0 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
13ed0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
13ee0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
13ef0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
13f00 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45  ..case CKA_ISSUE
13f10 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
13f20 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
13f30 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
13f40 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25   CKA_ISSUER (0x%
13f50 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
13f60 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
13f70 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
13f80 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
13f90 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
13fa0 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c  CATE && objectcl
13fb0 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
13fc0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
13fd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13fe0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
13ff0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
14000 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
14010 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20  t a certificate 
14020 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73  or Netscape trus
14030 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
14040 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
14050 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
14060 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
14070 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
14080 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73  et = x509_to_iss
14090 75 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c  uer(certificate,
140a0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
140b0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
140c0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
140d0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
140e0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
140f0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
14100 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
14110 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
14120 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
14130 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14140 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
14150 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
14160 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
14170 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
14180 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
14190 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
141a0 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41  L_NUMBER:.....CA
141b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
141c0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
141d0 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49  tribute CKA_SERI
141e0 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38  AL_NUMBER (0x%08
141f0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
14200 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
14210 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
14220 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
14230 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
14240 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  TE && objectclas
14250 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
14260 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
14270 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14280 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
14290 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
142a0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
142b0 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72  a certificate or
142c0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
142d0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
142e0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
142f0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
14300 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
14310 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
14320 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61   = x509_to_seria
14330 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  l(certificate, c
14340 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
14350 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
14360 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
14370 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
14380 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
14390 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
143a0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
143b0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
143c0 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
143d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
143e0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
143f0 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
14400 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
14410 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
14420 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
14430 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45  ..case CKA_SUBJE
14440 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  CT:.....CACKEY_D
14450 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
14460 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
14470 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30  e CKA_SUBJECT (0
14480 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
14490 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
144a0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
144b0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
144c0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
144d0 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
144e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
144f0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
14500 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
14510 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
14520 20 63 65 72 74 69 66 69 63 61 74 65 22 29 3b 0a   certificate");.
14530 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
14540 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
14550 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
14560 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
14570 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
14580 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69  _subject(certifi
14590 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
145a0 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
145b0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
145c0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
145d0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
145e0 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
145f0 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
14600 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
14610 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
14620 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14630 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
14640 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
14650 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
14660 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
14670 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
14680 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
14690 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ID:.....CACKEY_D
146a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
146b0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
146c0 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c  e CKA_ID (0x%08l
146d0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
146e0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
146f0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
14700 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
14710 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
14720 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
14730 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14740 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
14750 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
14760 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
14770 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
14780 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
14790 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d  .....}......ucTm
147a0 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e  pBuf[0] = ((iden
147b0 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e  tity_num + 1) >>
147c0 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09   8) & 0xff;.....
147d0 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28  ucTmpBuf[1] =  (
147e0 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31  identity_num + 1
147f0 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70  ) & 0xff;......p
14800 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75  Value = &ucTmpBu
14810 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  f;.....ulValueLe
14820 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b  n = 2;......CACK
14830 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14840 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
14850 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
14860 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
14870 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
14880 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
14890 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54  e CKA_CERTIFICAT
148a0 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b  E_TYPE:.....CACK
148b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
148c0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
148d0 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46  ibute CKA_CERTIF
148e0 49 43 41 54 45 5f 54 59 50 45 20 28 30 78 25 30  ICATE_TYPE (0x%0
148f0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
14900 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
14910 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
14920 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
14930 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
14940 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ATE) {......CACK
14950 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14960 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
14970 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
14980 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
14990 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09  rtificate.");...
149a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
149b0 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79  ....../* We only
149c0 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72   support one cer
149d0 74 69 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f  tificate type */
149e0 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63  .....ck_certific
149f0 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58  ate_type = CKC_X
14a00 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75  _509;......pValu
14a10 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63  e = &ck_certific
14a20 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c  ate_type;.....ul
14a30 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
14a40 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65  f(ck_certificate
14a50 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43  _type);......CAC
14a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14a70 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
14a80 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29   CKC_X_509 (%lu)
14a90 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
14aa0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
14ab0 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
14ac0 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  PE *) pValue), p
14ad0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
14ae0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
14af0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
14b00 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f  ...case CKA_KEY_
14b10 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  TYPE:.....CACKEY
14b20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14b30 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
14b40 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45  ute CKA_KEY_TYPE
14b50 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
14b60 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
14b70 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
14b80 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
14b90 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52  tclass != CKO_PR
14ba0 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a  IVATE_KEY && obj
14bb0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
14bc0 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09  PUBLIC_KEY) {...
14bd0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14be0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
14bf0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
14c00 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
14c10 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09  ot a key.");....
14c20 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
14c30 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20  ...../* We only 
14c40 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20  support one key 
14c50 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b  type */.....ck_k
14c60 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53  ey_type = CKK_RS
14c70 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  A;......pValue =
14c80 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09   &ck_key_type;..
14c90 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
14ca0 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79  sizeof(ck_key_ty
14cb0 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  pe);......CACKEY
14cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
14cd0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b  ... returning CK
14ce0 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f  K_RSA (%lu) (%p/
14cf0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
14d00 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52   long) *((CK_CER
14d10 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29  TIFICATE_TYPE *)
14d20 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
14d30 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
14d40 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
14d50 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
14d60 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09  se CKA_SIGN:....
14d70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14d80 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
14d90 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
14da0 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  IGN (0x%08lx) ..
14db0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
14dc0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
14dd0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
14de0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
14df0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
14e00 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
14e10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
14e20 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
14e30 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
14e40 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
14e50 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
14e60 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
14e70 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
14e80 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
14e90 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
14ea0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
14eb0 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
14ec0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
14ed0 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
14ee0 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
14ef0 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
14f00 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
14f10 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
14f20 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
14f30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14f40 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
14f50 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
14f60 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14f70 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
14f80 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
14f90 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14fa0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
14fb0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
14fc0 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45   CKA_SIGN_RECOVE
14fd0 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
14fe0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
14ff0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
15000 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45   CKA_SIGN_RECOVE
15010 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  R (0x%08lx) ..."
15020 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
15030 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
15040 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
15050 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
15060 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
15070 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15080 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
15090 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
150a0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
150b0 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
150c0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
150d0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
150e0 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65  ...../* We curre
150f0 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ntly only suppor
15100 74 20 22 53 69 67 6e 20 77 69 74 68 20 41 70 70  t "Sign with App
15110 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56  endix" */.....pV
15120 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
15130 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
15140 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
15150 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  se);......CACKEY
15160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
15170 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
15180 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
15190 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
151a0 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
151b0 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
151c0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
151d0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
151e0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
151f0 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43  A_DECRYPT:.....C
15200 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15210 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
15220 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43  ttribute CKA_DEC
15230 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e  RYPT (0x%08lx) .
15240 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
15250 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
15260 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
15270 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
15280 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
15290 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
152a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
152b0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
152c0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
152d0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
152e0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
152f0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
15300 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  .}......if (obje
15310 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
15320 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62  RIVATE_KEY || ob
15330 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
15340 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09  _PUBLIC_KEY) {..
15350 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
15360 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
15370 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
15380 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
15390 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
153a0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
153b0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
153c0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
153d0 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
153e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
153f0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
15400 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
15410 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
15420 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
15430 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
15440 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
15450 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
15460 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
15470 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45  se CKA_SENSITIVE
15480 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
15490 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
154a0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
154b0 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30  CKA_SENSITIVE (0
154c0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
154d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
154e0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
154f0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
15500 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
15510 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
15520 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15530 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
15540 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
15550 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
15560 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
15570 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
15580 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
15590 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
155a0 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
155b0 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
155c0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
155d0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
155e0 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
155f0 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
15600 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
15610 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
15620 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
15630 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
15640 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
15650 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
15660 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
15670 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
15680 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
15690 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
156a0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
156b0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
156c0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
156d0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45  k;....case CKA_E
156e0 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09  XTRACTABLE:.....
156f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15700 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
15710 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58  attribute CKA_EX
15720 54 52 41 43 54 41 42 4c 45 20 28 30 78 25 30 38  TRACTABLE (0x%08
15730 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
15740 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
15750 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
15760 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
15770 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
15780 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
15790 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
157a0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
157b0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
157c0 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
157d0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
157e0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
157f0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
15800 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15810 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29  CKO_PRIVATE_KEY)
15820 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
15830 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
15840 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
15850 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
15860 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
15870 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
15880 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
15890 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
158a0 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
158b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
158c0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
158d0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
158e0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
158f0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
15900 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
15910 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
15920 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
15930 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
15940 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
15950 55 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  US:.....CACKEY_D
15960 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
15970 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
15980 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30  e CKA_MODULUS (0
15990 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
159a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
159b0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
159c0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
159d0 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
159e0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
159f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15a00 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
15a10 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
15a20 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
15a30 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
15a40 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
15a50 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
15a60 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
15a70 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
15a80 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
15a90 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75  = x509_to_modulu
15aa0 73 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  s(certificate, c
15ab0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
15ac0 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
15ad0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
15ae0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
15af0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
15b00 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
15b10 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
15b20 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
15b30 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
15b40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15b50 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
15b60 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
15b70 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
15b80 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
15b90 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
15ba0 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49  ..case CKA_PUBLI
15bb0 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09  C_EXPONENT:.....
15bc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15bd0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
15be0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55  attribute CKA_PU
15bf0 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30  BLIC_EXPONENT (0
15c00 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
15c10 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
15c20 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
15c30 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
15c40 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
15c50 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
15c60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15c70 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
15c80 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
15c90 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
15ca0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
15cb0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
15cc0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
15cd0 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
15ce0 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
15cf0 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
15d00 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65  = x509_to_expone
15d10 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  nt(certificate, 
15d20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
15d30 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
15d40 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
15d50 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
15d60 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
15d70 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
15d80 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
15d90 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
15da0 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
15db0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15dc0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
15dd0 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
15de0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
15df0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
15e00 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
15e10 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
15e20 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54  T_DIGITAL_SIGNAT
15e30 55 52 45 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  URE:....case CKA
15e40 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44  _TRUST_NON_REPUD
15e50 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20  IATION:....case 
15e60 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e  CKA_TRUST_KEY_EN
15e70 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63  CIPHERMENT:....c
15e80 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 41  ase CKA_TRUST_DA
15e90 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a  TA_ENCIPHERMENT:
15ea0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
15eb0 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54  ST_KEY_AGREEMENT
15ec0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
15ed0 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47  UST_KEY_CERT_SIG
15ee0 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  N:....case CKA_T
15ef0 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09  RUST_CRL_SIGN:..
15f00 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
15f10 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09  _SERVER_AUTH:...
15f20 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
15f30 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09  CLIENT_AUTH:....
15f40 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
15f50 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09  ODE_SIGNING:....
15f60 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45  case CKA_TRUST_E
15f70 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a  MAIL_PROTECTION:
15f80 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15f90 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
15fa0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
15fb0 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78  KA_TRUST_... (0x
15fc0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
15fd0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
15fe0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
15ff0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
16000 74 72 75 73 74 65 64 3b 0a 09 09 09 09 75 6c 56  trusted;.....ulV
16010 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
16020 28 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09  (ck_trusted);...
16030 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16040 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
16050 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
16060 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
16070 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 53  long) *((CK_TRUS
16080 54 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  T *) pValue), pV
16090 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
160a0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
160b0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
160c0 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f  ..case CKA_CERT_
160d0 53 48 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 43  SHA1_HASH:.....C
160e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
160f0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
16100 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
16110 54 5f 53 48 41 31 5f 48 41 53 48 20 28 30 78 25  T_SHA1_HASH (0x%
16120 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
16130 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
16140 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
16150 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
16160 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
16170 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
16180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16190 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
161a0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
161b0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
161c0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
161d0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
161e0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
161f0 09 09 09 53 48 41 31 52 65 73 65 74 28 26 73 68  ...SHA1Reset(&sh
16200 61 31 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 41  a1_ctx);.....SHA
16210 31 49 6e 70 75 74 28 26 73 68 61 31 5f 63 74 78  1Input(&sha1_ctx
16220 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  , certificate, c
16230 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
16240 0a 09 09 09 09 53 48 41 31 52 65 73 75 6c 74 28  .....SHA1Result(
16250 26 73 68 61 31 5f 63 74 78 2c 20 73 68 61 31 5f  &sha1_ctx, sha1_
16260 68 61 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c  hash);......pVal
16270 75 65 20 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a  ue = sha1_hash;.
16280 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
16290 20 73 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 73   sizeof(sha1_has
162a0 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  h);......CACKEY_
162b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
162c0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
162d0 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
162e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
162f0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
16300 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
16310 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48  KA_CERT_MD5_HASH
16320 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
16330 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
16340 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
16350 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53  CKA_CERT_MD5_HAS
16360 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  H (0x%08lx) ..."
16370 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16380 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
16390 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
163a0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
163b0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
163c0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
163d0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
163e0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
163f0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
16400 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65  e not a Netscape
16410 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
16420 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
16430 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74  ..}......MD5Init
16440 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 09  (&md5_ctx);.....
16450 4d 44 35 55 70 64 61 74 65 28 26 6d 64 35 5f 63  MD5Update(&md5_c
16460 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c  tx, certificate,
16470 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
16480 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c 28  );.....MD5Final(
16490 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63  md5_hash, &md5_c
164a0 74 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  tx);......pValue
164b0 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09   = md5_hash;....
164c0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
164d0 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a  zeof(md5_hash);.
164e0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
164f0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
16500 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
16510 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
16520 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
16530 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
16540 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  k;....default:..
16550 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
16560 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
16570 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
16580 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
16590 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47  ...if (((CK_LONG
165a0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d  ) ulValueLen) !=
165b0 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29   ((CK_LONG) -1))
165c0 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75   {..../* Push cu
165d0 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65  rr_attr onto the
165e0 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72   stack */....cur
165f0 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75  r_attr.type = cu
16600 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09  rr_attr_type;...
16610 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c  .curr_attr.ulVal
16620 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c  ueLen = ulValueL
16630 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74  en;.....curr_att
16640 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f  r.pValue = mallo
16650 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61  c(curr_attr.ulVa
16660 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63  lueLen);....memc
16670 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61  py(curr_attr.pVa
16680 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72  lue, pValue, cur
16690 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65  r_attr.ulValueLe
166a0 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c  n);.....if (pVal
166b0 75 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75  ue_free && pValu
166c0 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56  e) {.....free(pV
166d0 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  alue);....}.....
166e0 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20  if (numattrs >= 
166f0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a  retval_count) {.
16700 09 09 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ....retval = rea
16710 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
16720 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
16730 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09  of(*retval));...
16740 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72  .}.....memcpy(&r
16750 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c  etval[numattrs],
16760 20 26 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a   &curr_attr, siz
16770 65 6f 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b  eof(curr_attr));
16780 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a  ....numattrs++;.
16790 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d  ..}..}...if (num
167a0 61 74 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09  attrs != 0) {...
167b0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e  retval_count = n
167c0 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61  umattrs;...retva
167d0 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76  l = realloc(retv
167e0 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74  al, retval_count
167f0 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61   * sizeof(*retva
16800 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  l));..} else {..
16810 09 66 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a  .free(retval);..
16820 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b  ..retval = NULL;
16830 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  ..}...*pulCount 
16840 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41  = numattrs;...CA
16850 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16860 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75  F("Returning %lu
16870 20 6f 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c   objects (%p).",
16880 20 6e 75 6d 61 74 74 72 73 2c 20 72 65 74 76 61   numattrs, retva
16890 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
168a0 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  val);.}..static 
168b0 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65  void cackey_free
168c0 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75  _identities(stru
168d0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
168e0 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20  ty *identities, 
168f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
16900 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
16910 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  {..CK_ATTRIBUTE 
16920 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e 73  *curr_attr;..uns
16930 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69 64  igned long id_id
16940 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09 69  x, attr_idx;...i
16950 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d  f (identities ==
16960 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69 74   NULL || identit
16970 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20  ies_count == 0) 
16980 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  {...return;..}..
16990 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d 20 30  .for (id_idx = 0
169a0 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65 6e 74  ; id_idx < ident
169b0 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64 5f  ities_count; id_
169c0 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 69  idx++) {...if (i
169d0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
169e0 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a  ].attributes) {.
169f0 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78  ...for (attr_idx
16a00 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c   = 0; attr_idx <
16a10 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69   identities[id_i
16a20 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63  dx].attributes_c
16a30 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b  ount; attr_idx++
16a40 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61 74 74  ) {.....curr_att
16a50 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65 73 5b  r = &identities[
16a60 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
16a70 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09  es[attr_idx];...
16a80 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
16a90 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09  ->pValue) {.....
16aa0 09 66 72 65 65 28 63 75 72 72 5f 61 74 74 72 2d  .free(curr_attr-
16ab0 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a  >pValue);.....}.
16ac0 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69 64 65  ...}.....if (ide
16ad0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
16ae0 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09  attributes) {...
16af0 09 09 66 72 65 65 28 69 64 65 6e 74 69 74 69 65  ..free(identitie
16b00 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
16b10 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  utes);....}.....
16b20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
16b30 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  s(identities[id_
16b40 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
16b50 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d 0a 09  ty, 1, 1);...}..
16b60 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74 69 74  }...free(identit
16b70 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ies);.}..static 
16b80 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
16b90 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72  entity *cackey_r
16ba0 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73  ead_identities(s
16bb0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
16bc0 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
16bd0 64 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 6e  d long *ids_foun
16be0 64 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  d) {..struct cac
16bf0 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
16c00 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69  y *pcsc_identiti
16c10 65 73 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  es;..struct cack
16c20 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
16c30 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e  ntities;..unsign
16c40 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c  ed long num_ids,
16c50 20 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 69 64   id_idx, curr_id
16c60 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64  _type;..unsigned
16c70 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 2c   long num_certs,
16c80 20 6e 75 6d 5f 65 78 74 72 61 5f 63 65 72 74 73   num_extra_certs
16c90 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09 69 6e 74  , cert_idx;..int
16ca0 20 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63   include_extra_c
16cb0 65 72 74 73 20 3d 20 31 3b 0a 0a 09 43 41 43 4b  erts = 1;...CACK
16cc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16cd0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
16ce0 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
16cf0 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 22  _NO_EXTRA_CERTS"
16d00 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  ) != NULL) {...C
16d10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16d20 54 46 28 22 41 73 6b 65 64 20 6e 6f 74 20 74 6f  TF("Asked not to
16d30 20 69 6e 63 6c 75 64 65 20 65 78 74 72 61 20 28   include extra (
16d40 44 6f 44 29 20 63 65 72 74 69 66 69 63 61 74 65  DoD) certificate
16d50 73 22 29 3b 0a 0a 09 09 69 6e 63 6c 75 64 65 5f  s");....include_
16d60 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b  extra_certs = 0;
16d70 0a 09 7d 0a 0a 09 69 66 20 28 69 6e 63 6c 75 64  ..}...if (includ
16d80 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b  e_extra_certs) {
16d90 0a 09 09 6e 75 6d 5f 65 78 74 72 61 5f 63 65 72  ...num_extra_cer
16da0 74 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 72  ts = sizeof(extr
16db0 61 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65 6f  a_certs) / sizeo
16dc0 66 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30 5d  f(extra_certs[0]
16dd0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
16de0 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75  UG_PRINTF("Inclu
16df0 64 69 6e 67 20 25 6c 69 20 44 6f 44 20 43 65 72  ding %li DoD Cer
16e00 74 69 66 69 63 61 74 65 73 20 61 73 20 6f 62 6a  tificates as obj
16e10 65 63 74 73 20 6f 6e 20 74 68 69 73 20 74 6f 6b  ects on this tok
16e20 65 6e 22 2c 20 6e 75 6d 5f 65 78 74 72 61 5f 63  en", num_extra_c
16e30 65 72 74 73 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  erts);..} else {
16e40 0a 09 09 6e 75 6d 5f 65 78 74 72 61 5f 63 65 72  ...num_extra_cer
16e50 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  ts = 0;..}...if 
16e60 28 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55  (ids_found == NU
16e70 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
16e80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
16e90 6f 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69  or.  ids_found i
16ea0 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
16eb0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
16ec0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
16ed0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65  = cackey_read_ce
16ee0 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20  rts(slot, NULL, 
16ef0 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66  &num_certs);..if
16f00 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   (pcsc_identitie
16f10 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f  s != NULL) {.../
16f20 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72  * Convert number
16f30 20 6f 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d   of Certs to num
16f40 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a  ber of objects *
16f50 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43  /...num_ids = (C
16f60 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d  KO_PRIVATE_KEY -
16f70 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
16f80 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74   + 1) * num_cert
16f90 73 3b 0a 09 09 6e 75 6d 5f 69 64 73 20 2b 3d 20  s;...num_ids += 
16fa0 6e 75 6d 5f 65 78 74 72 61 5f 63 65 72 74 73 20  num_extra_certs 
16fb0 2a 20 33 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69  * 3;....identiti
16fc0 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f  es = malloc(num_
16fd0 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64  ids * sizeof(*id
16fe0 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09 2f  entities));..../
16ff0 2a 20 41 64 64 20 63 65 72 74 69 66 69 63 61 74  * Add certificat
17000 65 73 2c 20 70 75 62 6c 69 63 20 6b 65 79 73 2c  es, public keys,
17010 20 61 6e 64 20 70 72 69 76 61 74 65 20 6b 65 79   and private key
17020 73 20 66 72 6f 6d 20 74 68 65 20 73 6d 61 72 74  s from the smart
17030 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f 69 64 78  card */...id_idx
17040 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63 65 72   = 0;...for (cer
17050 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f  t_idx = 0; cert_
17060 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b  idx < num_certs;
17070 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09   cert_idx++) {..
17080 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 74  ..for (curr_id_t
17090 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ype = CKO_CERTIF
170a0 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64 5f 74  ICATE; curr_id_t
170b0 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41  ype <= CKO_PRIVA
170c0 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f  TE_KEY; curr_id_
170d0 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64  type++) {.....id
170e0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
170f0 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61  .attributes = ca
17100 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
17110 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79 70 65  tes(curr_id_type
17120 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69  , &pcsc_identiti
17130 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63 65  es[cert_idx], ce
17140 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74  rt_idx, &identit
17150 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
17160 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  ibutes_count);..
17170 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
17180 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
17190 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
171a0 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
171b0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
171c0 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d 65  entity));.....me
171d0 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
171e0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
171f0 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64 65  ntity, &pcsc_ide
17200 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
17210 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74  ], sizeof(*ident
17220 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
17230 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a  sc_identity));..
17240 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
17250 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
17260 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
17270 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f  e = malloc(pcsc_
17280 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
17290 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
172a0 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _len);.....memcp
172b0 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  y(identities[id_
172c0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
172d0 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  ty->certificate,
172e0 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73   pcsc_identities
172f0 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
17300 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65  ficate, pcsc_ide
17310 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
17320 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
17330 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b  n);......id_idx+
17340 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  +;....}...}....c
17350 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
17360 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
17370 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
17380 0a 0a 09 09 2f 2a 20 41 64 64 20 44 6f 44 20 43  ..../* Add DoD C
17390 65 72 74 69 66 69 63 61 74 65 73 20 61 6e 64 20  ertificates and 
173a0 4e 65 74 73 63 61 70 65 20 54 72 75 73 74 20 4f  Netscape Trust O
173b0 62 6a 65 63 74 73 20 2a 2f 0a 09 09 66 6f 72 20  bjects */...for 
173c0 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63  (cert_idx = 0; c
173d0 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 65 78  ert_idx < num_ex
173e0 74 72 61 5f 63 65 72 74 73 3b 20 63 65 72 74 5f  tra_certs; cert_
173f0 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 64 65 6e  idx++) {....iden
17400 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
17410 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e  csc_identity = N
17420 55 4c 4c 3b 0a 09 09 09 69 64 65 6e 74 69 74 69  ULL;....identiti
17430 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
17440 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
17450 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
17460 4f 5f 43 45 52 54 49 46 49 43 41 54 45 2c 20 26  O_CERTIFICATE, &
17470 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74  extra_certs[cert
17480 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20  _idx], 0xf000 | 
17490 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
174a0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
174b0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
174c0 0a 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09  ....id_idx++;...
174d0 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
174e0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
174f0 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 69 64  ty = NULL;....id
17500 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
17510 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61  .attributes = ca
17520 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
17530 74 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b  tes(CKO_PUBLIC_K
17540 45 59 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73  EY, &extra_certs
17550 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30  [cert_idx], 0xf0
17560 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26  00 | cert_idx, &
17570 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
17580 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
17590 75 6e 74 29 3b 0a 09 09 09 69 64 5f 69 64 78 2b  unt);....id_idx+
175a0 2b 3b 0a 0a 09 09 09 69 64 65 6e 74 69 74 69 65  +;.....identitie
175b0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
175c0 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a  dentity = NULL;.
175d0 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
175e0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
175f0 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
17600 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e 45 54  tributes(CKO_NET
17610 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26 65 78  SCAPE_TRUST, &ex
17620 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69  tra_certs[cert_i
17630 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65  dx], 0xf000 | ce
17640 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74  rt_idx, &identit
17650 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
17660 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09  ibutes_count);..
17670 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 0a  ..id_idx++;...}.
17680 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20  ...*ids_found = 
17690 6e 75 6d 5f 69 64 73 3b 0a 09 09 72 65 74 75 72  num_ids;...retur
176a0 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09  n(identities);..
176b0 7d 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d  }...*ids_found =
176c0 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c   0;..return(NULL
176d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
176e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
176f0 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b  C_Initialize)(CK
17700 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69 74 41  _VOID_PTR pInitA
17710 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49  rgs) {..CK_C_INI
17720 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f  TIALIZE_ARGS CK_
17730 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e 74 33  PTR args;..uint3
17740 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  2_t idx;..int mu
17750 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a 09  tex_init_ret;...
17760 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17770 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
17780 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69  ..if (cackey_ini
17790 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
177a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
177b0 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61  F("Error.  Alrea
177c0 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  dy initialized."
177d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
177e0 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44  _CRYPTOKI_ALREAD
177f0 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  Y_INITIALIZED);.
17800 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72  .}...if (pInitAr
17810 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  gs != NULL) {...
17820 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73  args = pInitArgs
17830 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b  ;...memcpy(&cack
17840 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73  ey_args, args, s
17850 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67  izeof(cackey_arg
17860 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73  s));....if (args
17870 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d  ->CreateMutex ==
17880 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44   NULL || args->D
17890 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e  estroyMutex == N
178a0 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63  ULL || args->Loc
178b0 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c  kMutex == NULL |
178c0 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75  | args->UnlockMu
178d0 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tex == NULL) {..
178e0 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61  ..if (args->Crea
178f0 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20  teMutex != NULL 
17900 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79  || args->Destroy
17910 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Mutex != NULL ||
17920 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78   args->LockMutex
17930 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   != NULL || args
17940 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d  ->UnlockMutex !=
17950 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43   NULL) {.....CAC
17960 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17970 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62  ("Error. Some, b
17980 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61  ut not All threa
17990 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  ding primitives 
179a0 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09  provided.");....
179b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
179c0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09  UMENTS_BAD);....
179d0 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  }...}..} else {.
179e0 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  ..cackey_args.Cr
179f0 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  eateMutex = NULL
17a00 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  ;...cackey_args.
17a10 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e  DestroyMutex = N
17a20 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
17a30 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e  gs.LockMutex = N
17a40 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
17a50 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d  gs.UnlockMutex =
17a60 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
17a70 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a  args.flags = 0;.
17a80 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
17a90 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
17aa0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
17ab0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
17ac0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
17ad0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b   idx++) {...cack
17ae0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
17af0 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a  .active = 0;..}.
17b00 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
17b10 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
17b20 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
17b30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
17b40 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
17b50 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
17b60 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b  idx].active = 0;
17b70 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
17b80 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  idx].pcsc_reader
17b90 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
17ba0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61  y_slots[idx].tra
17bb0 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
17bc0 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
17bd0 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74  ts[idx].transact
17be0 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
17bf0 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
17c00 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72  lots[idx].slot_r
17c10 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b  eset = 0;...cack
17c20 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f  ey_slots[idx].to
17c30 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09  ken_flags = 0;..
17c40 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
17c50 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  x].label = NULL;
17c60 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69  ..}...cackey_ini
17c70 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09  tialized = 1;...
17c80 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67 6c  if (!cackey_bigl
17c90 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75  ock_init) {...mu
17ca0 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63  tex_init_ret = c
17cb0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61  ackey_mutex_crea
17cc0 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f  te(&cackey_biglo
17cd0 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
17ce0 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29  x_init_ret != 0)
17cf0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
17d00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
17d10 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61 6c  .  Mutex initial
17d20 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22  ization failed."
17d30 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
17d40 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09  R_CANT_LOCK);...
17d50 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 6c  }....cackey_bigl
17d60 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d  ock_init = 1;..}
17d70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17d80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
17d90 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
17da0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
17db0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
17dc0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
17dd0 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69  (CK_RV, C_Finali
17de0 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ze)(CK_VOID_PTR 
17df0 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69  pReserved) {..ui
17e00 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41  nt32_t idx;...CA
17e10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17e20 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
17e30 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d  if (pReserved !=
17e40 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
17e50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17e60 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64  Error. pReserved
17e70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
17e80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
17e90 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
17ea0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
17eb0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
17ec0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17ed0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
17ee0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
17ef0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
17f00 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
17f10 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
17f20 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
17f30 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
17f40 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
17f50 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
17f60 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
17f70 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
17f80 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
17f90 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43  active) {....C_C
17fa0 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29  loseSession(idx)
17fb0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65  ;...}..}...cacke
17fc0 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
17fd0 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20  ct_all();...for 
17fe0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
17ff0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
18000 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
18010 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
18020 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
18030 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
18040 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20  x].pcsc_reader) 
18050 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
18060 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
18070 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a 09 7d  _reader);...}..}
18080 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  ...cackey_pcsc_d
18090 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 63  isconnect();...c
180a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
180b0 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f  d = 0;...CACKEY_
180c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
180d0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
180e0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
180f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
18100 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
18110 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
18120 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f  GetInfo)(CK_INFO
18130 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
18140 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
18150 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  R manufacturerID
18160 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72  [] = "U.S. Gover
18170 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20  nment";..static 
18180 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69 62 72  CK_UTF8CHAR libr
18190 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d  aryDescription[]
181a0 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43   = "CACKey";...C
181b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
181c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
181d0 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
181e0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
181f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18200 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
18210 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
18220 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
18230 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
18240 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
18250 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
18260 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18270 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
18280 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
18290 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
182a0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
182b0 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70  .}...pInfo->cryp
182c0 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  tokiVersion.majo
182d0 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59  r = ((CACKEY_CRY
182e0 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
182f0 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  DE) >> 16) & 0xf
18300 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74  f;..pInfo->crypt
18310 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  okiVersion.minor
18320 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50   = ((CACKEY_CRYP
18330 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44  TOKI_VERSION_COD
18340 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  E) >> 8) & 0xff;
18350 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
18360 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
18370 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
18380 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
18390 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  ID));..memcpy(pI
183a0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
183b0 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65  rID, manufacture
183c0 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75  rID, sizeof(manu
183d0 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 29  facturerID) - 1)
183e0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  ;...pInfo->flags
183f0 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65   = 0x00;...memse
18400 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  t(pInfo->library
18410 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27  Description, ' '
18420 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
18430 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
18440 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  on));..memcpy(pI
18450 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63  nfo->libraryDesc
18460 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79  ription, library
18470 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a  Description, siz
18480 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73 63 72  eof(libraryDescr
18490 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09  iption) - 1);...
184a0 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65  pInfo->libraryVe
184b0 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63  rsion.major = (c
184c0 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
184d0 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66  () >> 16) & 0xff
184e0 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  ;..pInfo->librar
184f0 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  yVersion.minor =
18500 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
18510 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78  ion() >> 8) & 0x
18520 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ff;...CACKEY_DEB
18530 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
18540 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
18550 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
18560 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
18570 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c  ./*. * Process l
18580 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 2c 20  ist of readers, 
18590 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70 70 69  and create mappi
185a0 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61 64 65  ng between reade
185b0 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20  r name and slot 
185c0 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  ID. */.CK_DEFINE
185d0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
185e0 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 29 28   C_GetSlotList)(
185f0 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72  CK_BBOOL tokenPr
18600 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49  esent, CK_SLOT_I
18610 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c  D_PTR pSlotList,
18620 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
18630 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e 74 20 6d  lCount) {..int m
18640 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
18650 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  t pcsc_connect_r
18660 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f  et;..CK_ULONG co
18670 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20  unt, slot_count 
18680 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74 3b 0a 09  = 0, currslot;..
18690 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65  char *pcsc_reade
186a0 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72  rs, *pcsc_reader
186b0 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65  s_s, *pcsc_reade
186c0 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70 63 73  rs_e;..DWORD pcs
186d0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 09  c_readers_len;..
186e0 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74 72  LONG scard_listr
186f0 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69 7a  eaders_ret;..siz
18700 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72 5f  e_t curr_reader_
18710 6c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  len;...CACKEY_DE
18720 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
18730 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75 6c  ed.");...if (pul
18740 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
18750 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18760 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
18770 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e  ulCount is NULL.
18780 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
18790 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
187a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
187b0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
187c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
187d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
187e0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
187f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
18800 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
18810 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
18820 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
18830 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
18840 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
18850 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
18860 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
18870 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18880 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
18890 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
188a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
188b0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
188c0 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69 73  }.../* Clear lis
188d0 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 69  t of slots */..i
188e0 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a  f (pSlotList) {.
188f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18900 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61  RINTF("Purging a
18910 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74  ll slot informat
18920 69 6f 6e 2e 22 29 3b 0a 0a 09 09 2f 2a 20 4f 6e  ion.");..../* On
18930 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69  ly update the li
18940 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77  st of slots if w
18950 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62  e are actually b
18960 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20  eing supply the 
18970 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
18980 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   */...cackey_slo
18990 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
189a0 6c 28 29 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72  l();....for (cur
189b0 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73  rslot = 0; currs
189c0 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
189d0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
189e0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
189f0 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74  s[0])); currslot
18a00 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63  ++) {....if (cac
18a10 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
18a20 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ot].pcsc_reader)
18a30 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b   {.....free(cack
18a40 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
18a50 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t].pcsc_reader);
18a60 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
18a70 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
18a80 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b  c_reader = NULL;
18a90 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61  ....}.....if (ca
18aa0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
18ab0 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09  lot].label) {...
18ac0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
18ad0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61  ots[currslot].la
18ae0 62 65 6c 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  bel);......cacke
18af0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
18b00 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
18b10 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
18b20 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
18b30 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a  active = 0;...}.
18b40 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
18b50 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  e list of reader
18b60 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  s */..pcsc_conne
18b70 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
18b80 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
18b90 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
18ba0 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
18bb0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
18bc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18bd0 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  TF("Connection t
18be0 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20  o PC/SC failed, 
18bf0 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74  assuming no slot
18c00 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75  s");....slot_cou
18c10 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  nt = 0;..} else 
18c20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  {...pcsc_readers
18c30 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61  _len = 0;....sca
18c40 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
18c50 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65  et = SCardListRe
18c60 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63  aders(*cackey_pc
18c70 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c  sc_handle, NULL,
18c80 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61   NULL, &pcsc_rea
18c90 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66  ders_len);....if
18ca0 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
18cb0 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
18cc0 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b  _F_COMM_ERROR) {
18cd0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18ce0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18cf0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
18d00 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
18d10 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20  D_F_COMM_ERROR, 
18d20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 74  assuming Connect
18d30 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65 6e  ion to PC/SC wen
18d40 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65 63  t away. Reconnec
18d50 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61 63  ting.");.....cac
18d60 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
18d70 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65 79  ect();....cackey
18d80 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b  _pcsc_connect();
18d90 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18da0 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67  G_PRINTF("Trying
18db0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
18dc0 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09 09  s() again");....
18dd0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
18de0 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
18df0 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
18e00 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
18e10 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f  LL, NULL, &pcsc_
18e20 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09  readers_len);...
18e30 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c  }....if (scard_l
18e40 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
18e50 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
18e60 53 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 72  S && pcsc_reader
18e70 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09  s_len != 0) {...
18e80 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d 20  .pcsc_readers = 
18e90 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 64  malloc(pcsc_read
18ea0 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73  ers_len);....pcs
18eb0 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 63  c_readers_s = pc
18ec0 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 09  sc_readers;.....
18ed0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
18ee0 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
18ef0 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
18f00 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
18f10 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73  LL, pcsc_readers
18f20 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
18f30 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 61  len);....if (sca
18f40 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
18f50 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
18f60 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 73  CCESS) {.....pcs
18f70 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 63  c_readers_e = pc
18f80 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 73  sc_readers + pcs
18f90 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a  c_readers_len;..
18fa0 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74  ..../* Start wit
18fb0 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20  h Slot ID 1, to 
18fc0 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47  avoid a bug in G
18fd0 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09  DM on RHEL */...
18fe0 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a  ../* Bug 594911:
18ff0 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
19000 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f  a.redhat.com/sho
19010 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34  w_bug.cgi?id=594
19020 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 73  911 */.....currs
19030 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 77 68 69  lot = 1;.....whi
19040 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73  le (pcsc_readers
19050 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   < pcsc_readers_
19060 65 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f 72  e) {......curr_r
19070 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c  eader_len = strl
19080 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29  en(pcsc_readers)
19090 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73  ;.......if ((pcs
190a0 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72  c_readers + curr
190b0 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70  _reader_len) > p
190c0 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
190d0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
190e0 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63  ...}.......if (c
190f0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
19100 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65  = 0) {.......bre
19110 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ak;......}......
19120 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d  .if (currslot >=
19130 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
19140 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
19150 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
19160 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  )) {.......CACKE
19170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19180 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65  Found more reade
19190 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72  rs than slots ar
191a0 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a  e available!");.
191b0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
191c0 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45  ...}.......CACKE
191d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
191e0 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73  Found reader: %s
191f0 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 29  ", pcsc_readers)
19200 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20  ;......./* Only 
19210 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20  update the list 
19220 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61  of slots if we a
19230 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  re actually bein
19240 67 20 61 73 6b 65 64 20 73 75 70 70 6c 79 20 74  g asked supply t
19250 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74  he slot informat
19260 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 66 20 28  ion */......if (
19270 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09  pSlotList) {....
19280 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
19290 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
192a0 20 3d 20 31 3b 0a 09 09 09 09 09 09 63 61 63 6b   = 1;.......cack
192b0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
192c0 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
192d0 20 73 74 72 64 75 70 28 70 63 73 63 5f 72 65 61   strdup(pcsc_rea
192e0 64 65 72 73 29 3b 0a 09 09 09 09 09 09 63 61 63  ders);.......cac
192f0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
19300 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot].pcsc_card_co
19310 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09  nnected = 0;....
19320 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
19330 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61  currslot].transa
19340 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
19350 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
19360 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72  ots[currslot].tr
19370 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
19380 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09 09  w_lock = 0;.....
19390 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
193a0 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65  urrslot].slot_re
193b0 73 65 74 20 3d 20 31 3b 0a 09 09 09 09 09 09 63  set = 1;.......c
193c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
193d0 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  slot].token_flag
193e0 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  s = CKF_LOGIN_RE
193f0 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09 63 61  QUIRED;.......ca
19400 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
19410 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c  lot].label = NUL
19420 4c 3b 0a 0a 09 09 09 09 09 09 63 61 63 6b 65 79  L;........cackey
19430 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
19440 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (&cackey_slots[c
19450 75 72 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09  urrslot]);......
19460 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f 74 2b  }......currslot+
19470 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f 72 65  +;.......pcsc_re
19480 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f 72 65  aders += curr_re
19490 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09  ader_len + 1;...
194a0 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72  ..}....../* Star
194b0 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31  t with Slot ID 1
194c0 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67  , to avoid a bug
194d0 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20   in GDM on RHEL 
194e0 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39  */...../* Bug 59
194f0 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75  4911: https://bu
19500 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f  gzilla.redhat.co
19510 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  m/show_bug.cgi?i
19520 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09  d=594911 */.....
19530 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 20 31  if (currslot > 1
19540 29 20 7b 0a 09 09 09 09 09 2f 2a 20 53 74 61 72  ) {....../* Star
19550 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31  t with Slot ID 1
19560 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67  , to avoid a bug
19570 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20   in GDM on RHEL 
19580 2a 2f 0a 09 09 09 09 09 2f 2a 20 42 75 67 20 35  */....../* Bug 5
19590 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62  94911: https://b
195a0 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63  ugzilla.redhat.c
195b0 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f  om/show_bug.cgi?
195c0 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09  id=594911 */....
195d0 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 63  ..slot_count = c
195e0 75 72 72 73 6c 6f 74 20 2d 20 31 3b 0a 09 09 09  urrslot - 1;....
195f0 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  .}....} else {..
19600 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19610 50 52 49 4e 54 46 28 22 53 65 63 6f 6e 64 20 63  PRINTF("Second c
19620 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74  all to SCardList
19630 52 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20  Readers failed, 
19640 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20  return %s/%li", 
19650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
19660 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
19670 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  R(scard_listread
19680 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ers_ret), (long)
19690 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65   scard_listreade
196a0 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09  rs_ret);....}...
196b0 09 09 66 72 65 65 28 70 63 73 63 5f 72 65 61 64  ..free(pcsc_read
196c0 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65  ers_s);...} else
196d0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
196e0 55 47 5f 50 52 49 4e 54 46 28 22 46 69 72 73 74  UG_PRINTF("First
196f0 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69   call to SCardLi
19700 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 64  stReaders failed
19710 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22  , return %s/%li"
19720 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
19730 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
19740 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65  STR(scard_listre
19750 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e  aders_ret), (lon
19760 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61  g) scard_listrea
19770 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09  ders_ret);...}..
19780 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
19790 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
197a0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
197b0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
197c0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
197d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
197e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
197f0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
19800 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
19810 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
19820 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c  R);..}...if (pSl
19830 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  otList == NULL) 
19840 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  {...*pulCount = 
19850 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43  slot_count;....C
19860 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19870 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
19880 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e  R_OK (%i).  Foun
19890 64 20 25 6c 75 20 72 65 61 64 65 72 73 2c 20 62  d %lu readers, b
198a0 75 74 20 6e 6f 74 20 73 74 6f 72 69 6e 67 20 49  ut not storing I
198b0 44 73 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d  Ds (pSlotList ==
198c0 20 4e 55 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c   NULL)", CKR_OK,
198d0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
198e0 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09   slot_count);...
198f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
19900 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70  ..}...count = *p
19910 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f  ulCount;..if (co
19920 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt < slot_count
19930 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19940 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19950 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64  . User allocated
19960 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75   %lu entries, bu
19970 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e  t we have %lu en
19980 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20  tries.", count, 
19990 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  slot_count);....
199a0 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45  return(CKR_BUFFE
199b0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09  R_TOO_SMALL);...
199c0 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f  }...for (currslo
199d0 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20  t = 0; currslot 
199e0 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75  < slot_count; cu
199f0 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 2f 2a  rrslot++) {.../*
19a00 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74   Start with Slot
19a10 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20   ID 1, to avoid 
19a20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20  a bug in GDM on 
19a30 52 48 45 4c 20 2a 2f 0a 09 09 2f 2a 20 42 75 67  RHEL */.../* Bug
19a40 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f   594911: https:/
19a50 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74  /bugzilla.redhat
19a60 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67  .com/show_bug.cg
19a70 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09  i?id=594911 */..
19a80 09 70 53 6c 6f 74 4c 69 73 74 5b 63 75 72 72 73  .pSlotList[currs
19a90 6c 6f 74 5d 20 3d 20 63 75 72 72 73 6c 6f 74 20  lot] = currslot 
19aa0 2b 20 31 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f  + 1;..}...*pulCo
19ab0 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt = slot_count
19ac0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
19ad0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
19ae0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20  ng CKR_OK (%i). 
19af0 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65   Found %lu reade
19b00 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75  rs.", CKR_OK, (u
19b10 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c  nsigned long) sl
19b20 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74  ot_count);...ret
19b30 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74  urn(CKR_OK);...t
19b40 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f  okenPresent = to
19b50 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53  kenPresent; /* S
19b60 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61  upress unused va
19b70 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a  riable warning *
19b80 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  /.}..CK_DEFINE_F
19b90 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
19ba0 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b  _GetSlotInfo)(CK
19bb0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
19bc0 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54   CK_SLOT_INFO_PT
19bd0 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
19be0 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 73  ic CK_UTF8CHAR s
19bf0 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d  lotDescription[]
19c00 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f 74 22   = "CACKey Slot"
19c10 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
19c20 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f  val;..int bytes_
19c30 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45  to_copy;...CACKE
19c40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19c50 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
19c60 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
19c70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19c80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19c90 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
19ca0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
19cb0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
19cc0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
19cd0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
19ce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19cf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
19d00 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
19d10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
19d20 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
19d30 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
19d40 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
19d50 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
19d60 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
19d70 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
19d80 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
19d90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19da0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
19db0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
19dc0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
19dd0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
19de0 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
19df0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
19e00 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
19e10 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
19e20 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
19e30 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
19e40 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
19e50 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
19e60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19e70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
19e80 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
19e90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
19ea0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
19eb0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
19ec0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
19ed0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
19ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19ef0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
19f00 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
19f10 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
19f20 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
19f30 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
19f40 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
19f50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
19f60 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
19f70 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
19f80 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  LID);..}...pInfo
19f90 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 52 45  ->flags = CKF_RE
19fa0 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 20 7c  MOVABLE_DEVICE |
19fb0 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09   CKF_HW_SLOT;...
19fc0 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
19fd0 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
19fe0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
19ff0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  == CACKEY_PCSC_S
1a000 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
1a010 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
1a020 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45  |= CKF_TOKEN_PRE
1a030 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73  SENT;..}...bytes
1a040 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65  _to_copy = strle
1a050 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  n(cackey_slots[s
1a060 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64  lotID].pcsc_read
1a070 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66  er);..if (sizeof
1a080 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1a090 75 72 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f  urerID) < bytes_
1a0a0 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74  to_copy) {...byt
1a0b0 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a  es_to_copy = siz
1a0c0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
1a0d0 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09  acturerID);..}..
1a0e0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
1a0f0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 63 61  nufacturerID, ca
1a100 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1a110 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  D].pcsc_reader, 
1a120 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a  bytes_to_copy);.
1a130 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1a140 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1a150 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1a160 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1a170 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1a180 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a190 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1a1a0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1a1b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a1c0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1a1d0 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  ;..}...memset(pI
1a1e0 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70  nfo->slotDescrip
1a1f0 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f  tion, ' ', sizeo
1a200 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  f(pInfo->slotDes
1a210 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
1a220 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  cpy(pInfo->slotD
1a230 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74  escription, slot
1a240 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a  Description, siz
1a250 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74  eof(slotDescript
1a260 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  ion) - 1);...mem
1a270 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  set(pInfo->manuf
1a280 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20  acturerID, ' ', 
1a290 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
1a2a0 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a  nufacturerID));.
1a2b0 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
1a2c0 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
1a2d0 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
1a2e0 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
1a2f0 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  xff;..pInfo->har
1a300 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  dwareVersion.min
1a310 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1a320 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
1a330 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d  & 0xff;...pInfo-
1a340 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
1a350 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09  .major = 0x00;..
1a360 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
1a370 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30  ersion.minor = 0
1a380 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  x00;...CACKEY_DE
1a390 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1a3a0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1a3b0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1a3c0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1a3d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1a3e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1a3f0 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53  tTokenInfo)(CK_S
1a400 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
1a410 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52  K_TOKEN_INFO_PTR
1a420 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69   pInfo) {..stati
1a430 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61  c CK_UTF8CHAR ma
1a440 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d  nufacturerID[] =
1a450 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e   "U.S. Governmen
1a460 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  t";..static CK_U
1a470 54 46 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c  TF8CHAR defaultL
1a480 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77  abel[] = "Unknow
1a490 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69  n Token";..stati
1a4a0 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f  c CK_UTF8CHAR mo
1a4b0 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b  del[] = "CAC Tok
1a4c0 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63  en";..struct cac
1a4d0 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
1a4e0 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69  y *pcsc_identiti
1a4f0 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  es;..unsigned lo
1a500 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73  ng num_certs;..s
1a510 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74  size_t label_ret
1a520 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1a530 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65  val;..int use_de
1a540 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43  fault_label;...C
1a550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a560 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1a570 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
1a580 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1a590 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a5a0 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
1a5b0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1a5c0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1a5d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1a5e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1a5f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a600 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a610 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1a620 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1a630 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1a640 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1a650 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
1a660 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
1a670 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1a680 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1a690 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1a6a0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1a6b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a6c0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1a6d0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1a6e0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
1a6f0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
1a700 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1a710 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1a720 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1a730 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1a740 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1a750 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1a760 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1a770 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a780 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a790 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1a7a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1a7b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1a7c0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
1a7d0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1a7e0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
1a7f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a800 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1a810 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1a820 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
1a830 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
1a840 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
1a850 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
1a860 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1a870 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
1a880 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1a890 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
1a8a0 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
1a8b0 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
1a8c0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21  slots[slotID]) !
1a8d0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
1a8e0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
1a8f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a900 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20  RINTF("No token 
1a910 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c  is present in sl
1a920 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f  otID = %lu", slo
1a930 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1a940 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1a950 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1a960 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
1a970 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a  N_NOT_PRESENT);.
1a980 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1a990 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1a9a0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1a9b0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1a9c0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1a9d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1a9e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1a9f0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1aa00 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1aa10 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1aa20 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  OR);..}.../* Det
1aa30 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62  ermine token lab
1aa40 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63  el from certific
1aa50 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28  ates */..memset(
1aa60 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20  pInfo->label, ' 
1aa70 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1aa80 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64  >label));..use_d
1aa90 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31  efault_label = 1
1aaa0 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ;...if (cackey_s
1aab0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
1aac0 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  el == NULL) {...
1aad0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
1aae0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65  = cackey_read_ce
1aaf0 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  rts(&cackey_slot
1ab00 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c  s[slotID], NULL,
1ab10 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09   &num_certs);...
1ab20 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  if (pcsc_identit
1ab30 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
1ab40 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20  ..if (num_certs 
1ab50 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c  > 0) {.....label
1ab60 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
1ab70 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c  sc_identity_to_l
1ab80 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69  abel(pcsc_identi
1ab90 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62  ties, pInfo->lab
1aba0 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  el, sizeof(pInfo
1abb0 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69  ->label));.....i
1abc0 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30  f (label_ret > 0
1abd0 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66  ) {......use_def
1abe0 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a  ault_label = 0;.
1abf0 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1ac00 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
1ac10 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
1ac20 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1ac30 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61  .......memcpy(ca
1ac40 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1ac50 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d  D].label, pInfo-
1ac60 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  >label, sizeof(p
1ac70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09  Info->label));..
1ac80 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ...}....}.....ca
1ac90 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
1aca0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c  pcsc_identities,
1acb0 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a   num_certs, 1);.
1acc0 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
1acd0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61  memcpy(pInfo->la
1ace0 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  bel, cackey_slot
1acf0 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c  s[slotID].label,
1ad00 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1ad10 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64  abel));....use_d
1ad20 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30  efault_label = 0
1ad30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64  ;..}...if (use_d
1ad40 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a  efault_label) {.
1ad50 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
1ad60 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61  label, defaultLa
1ad70 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61  bel, sizeof(defa
1ad80 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a  ultLabel) - 1);.
1ad90 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  .}...memset(pInf
1ada0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1adb0 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
1adc0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1add0 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
1ade0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1adf0 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
1ae00 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
1ae10 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
1ae20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
1ae30 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20  fo->model, ' ', 
1ae40 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f  sizeof(pInfo->mo
1ae50 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  del));..memcpy(p
1ae60 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64  Info->model, mod
1ae70 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c  el, sizeof(model
1ae80 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
1ae90 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75  (pInfo->serialNu
1aea0 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f  mber, ' ', sizeo
1aeb0 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e  f(pInfo->serialN
1aec0 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65  umber));...memse
1aed0 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65  t(pInfo->utcTime
1aee0 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1aef0 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a  nfo->utcTime));.
1af00 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
1af10 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
1af20 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
1af30 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
1af40 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  xff;..pInfo->har
1af50 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  dwareVersion.min
1af60 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1af70 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
1af80 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d  & 0xff;...pInfo-
1af90 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
1afa0 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09  .major = 0x00;..
1afb0 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
1afc0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30  ersion.minor = 0
1afd0 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c  x00;...pInfo->fl
1afe0 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f  ags = CKF_WRITE_
1aff0 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f  PROTECTED | CKF_
1b000 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c  USER_PIN_INITIAL
1b010 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e  IZED | CKF_TOKEN
1b020 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63  _INITIALIZED | c
1b030 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1b040 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b  ID].token_flags;
1b050 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53  ...pInfo->ulMaxS
1b060 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73  essionCount = (s
1b070 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1b080 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1b090 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1b0a0 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f  0])) - 1;..pInfo
1b0b0 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74  ->ulSessionCount
1b0c0 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
1b0d0 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
1b0e0 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65  pInfo->ulMaxRwSe
1b0f0 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a  ssionCount = 0;.
1b100 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73  .pInfo->ulRwSess
1b110 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e  ionCount = CK_UN
1b120 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
1b130 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
1b140 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38  lMaxPinLen = 128
1b150 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50  ;..pInfo->ulMinP
1b160 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66  inLen = 0;..pInf
1b170 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63  o->ulTotalPublic
1b180 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
1b190 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
1b1a0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46  ION;..pInfo->ulF
1b1b0 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  reePublicMemory 
1b1c0 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
1b1d0 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
1b1e0 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69  Info->ulTotalPri
1b1f0 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  vateMemory = CK_
1b200 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
1b210 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
1b220 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65  >ulFreePrivateMe
1b230 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
1b240 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
1b250 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  N;...CACKEY_DEBU
1b260 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1b270 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1b280 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1b290 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1b2a0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1b2b0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74  ON(CK_RV, C_Wait
1b2c0 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b  ForSlotEvent)(CK
1b2d0 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b  _FLAGS flags, CK
1b2e0 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
1b2f0 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54  otID, CK_VOID_PT
1b300 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09  R pReserved) {..
1b310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b320 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1b330 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20  ..if (pReserved 
1b340 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
1b350 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b360 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
1b370 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
1b380 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1b390 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1b3a0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1b3b0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1b3c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b3d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1b3e0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1b3f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1b400 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1b410 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1b420 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20  ../* XXX: TODO: 
1b430 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e  Implement this..
1b440 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42  . */..CACKEY_DEB
1b450 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1b460 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1b470 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1b480 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1b490 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1b4a0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1b4b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1b4c0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1b4d0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1b4e0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68  CK_RV, C_GetMech
1b4f0 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c  anismList)(CK_SL
1b500 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
1b510 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f  _MECHANISM_TYPE_
1b520 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69  PTR pMechanismLi
1b530 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
1b540 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41   pulCount) {..CA
1b550 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b560 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1b570 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1b580 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1b590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b5a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1b5b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1b5c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1b5d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1b5e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1b5f0 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
1b600 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b610 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b620 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  .  pulCount is N
1b630 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1b640 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1b650 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
1b660 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d  MechanismList ==
1b670 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
1b680 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43  ount = 1;....CAC
1b690 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b6a0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1b6b0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1b6c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1b6d0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a  _OK);..}...if (*
1b6e0 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a  pulCount < 1) {.
1b6f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b700 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42  RINTF("Error.  B
1b710 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e  uffer too small.
1b720 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1b730 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
1b740 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61  LL);..}...pMecha
1b750 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b  nismList[0] = CK
1b760 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75  M_RSA_PKCS;..*pu
1b770 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41  lCount = 1;...CA
1b780 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b790 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1b7a0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1b7b0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1b7c0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1b7d0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1b7e0 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  V, C_GetMechanis
1b7f0 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49  mInfo)(CK_SLOT_I
1b800 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43  D slotID, CK_MEC
1b810 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65  HANISM_TYPE type
1b820 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49  , CK_MECHANISM_I
1b830 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
1b840 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1b850 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
1b860 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1b870 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
1b880 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
1b890 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b8a0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
1b8b0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1b8c0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1b8d0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1b8e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1b8f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1b900 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b910 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1b920 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1b930 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1b940 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1b950 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1b960 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
1b970 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
1b980 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1b990 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1b9a0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
1b9b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b9c0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1b9d0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1b9e0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
1b9f0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
1ba00 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
1ba10 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1ba20 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1ba30 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1ba40 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1ba50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1ba60 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1ba70 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1ba80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ba90 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1baa0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1bab0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1bac0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1bad0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1bae0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
1baf0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1bb00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1bb10 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1bb20 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1bb30 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
1bb40 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
1bb50 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1bb60 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1bb70 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1bb80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1bb90 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1bba0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1bbb0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1bbc0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1bbd0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1bbe0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1bbf0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1bc00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1bc10 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1bc20 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1bc30 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1bc40 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
1bc50 68 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73  h (type) {...cas
1bc60 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
1bc70 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b  ...pInfo->ulMinK
1bc80 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09  eySize = 512;...
1bc90 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79  .pInfo->ulMaxKey
1bca0 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09  Size = 8192;....
1bcb0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
1bcc0 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52  KF_HW | CKF_ENCR
1bcd0 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50  YPT | CKF_DECRYP
1bce0 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43  T | CKF_SIGN | C
1bcf0 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72  KF_VERIFY;....br
1bd00 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  eak;..}...CACKEY
1bd10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1bd20 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1bd30 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1bd40 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1bd50 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74  ;.}../* We don't
1bd60 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65   support this me
1bd70 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49  thod. */.CK_DEFI
1bd80 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1bd90 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28  V, C_InitToken)(
1bda0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1bdb0 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  D, CK_UTF8CHAR_P
1bdc0 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
1bdd0 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55  G ulPinLen, CK_U
1bde0 54 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62  TF8CHAR_PTR pLab
1bdf0 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  el) {..CACKEY_DE
1be00 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1be10 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1be20 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1be30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1be40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1be50 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1be60 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1be70 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1be80 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1be90 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1bea0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1beb0 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
1bec0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
1bed0 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
1bee0 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
1bef0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
1bf00 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
1bf10 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  TED);.}../* We d
1bf20 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
1bf30 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
1bf40 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1bf50 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e  CK_RV, C_InitPIN
1bf60 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1bf70 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1bf80 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
1bf90 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
1bfa0 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  inLen) {..CACKEY
1bfb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1bfc0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1bfd0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1bfe0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1bff0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1c000 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1c010 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1c020 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1c030 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1c040 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1c050 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1c060 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e  urning CKR_TOKEN
1c070 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
1c080 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45   (%i)", CKR_TOKE
1c090 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
1c0a0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1c0b0 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
1c0c0 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57  TECTED);.}../* W
1c0d0 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
1c0e0 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
1c0f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1c100 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50  ON(CK_RV, C_SetP
1c110 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  IN)(CK_SESSION_H
1c120 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1c130 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
1c140 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  pOldPin, CK_ULON
1c150 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43  G ulOldPinLen, C
1c160 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
1c170 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  NewPin, CK_ULONG
1c180 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a   ulNewPinLen) {.
1c190 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c1a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1c1b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1c1c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1c1d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c1e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1c1f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1c200 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1c210 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1c220 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1c230 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c240 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1c250 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1c260 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1c270 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1c280 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1c290 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1c2a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1c2b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1c2c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1c2d0 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43  C_OpenSession)(C
1c2e0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
1c2f0 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  , CK_FLAGS flags
1c300 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41  , CK_VOID_PTR pA
1c310 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e  pplication, CK_N
1c320 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b  OTIFY notify, CK
1c330 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1c340 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b  PTR phSession) {
1c350 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
1c360 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
1c370 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75  retval;..int fou
1c380 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a  nd_session = 0;.
1c390 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c3a0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1c3b0 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26  ;...if ((flags &
1c3c0 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53   CKF_SERIAL_SESS
1c3d0 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49  ION) != CKF_SERI
1c3e0 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09  AL_SESSION) {...
1c3f0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1c400 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f  ON_PARALLEL_NOT_
1c410 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a  SUPPORTED);..}..
1c420 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1c430 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1c440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c450 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1c460 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1c470 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1c480 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1c490 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1c4a0 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
1c4b0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
1c4c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1c4d0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1c4e0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
1c4f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c500 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1c510 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1c520 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
1c530 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
1c540 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
1c550 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
1c560 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1c570 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1c580 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1c590 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1c5a0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1c5b0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1c5c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c5d0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1c5e0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1c5f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1c600 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1c610 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1c620 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
1c630 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
1c640 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c650 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1c660 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1c670 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
1c680 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
1c690 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
1c6a0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1c6b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1c6c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c6d0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
1c6e0 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79  ;..}.../* Verify
1c6f0 20 74 68 61 74 20 74 68 65 20 63 61 72 64 20 69   that the card i
1c700 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68  s actually in th
1c710 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58  e slot. */../* X
1c720 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b  XX: Check to mak
1c730 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 69  e sure this is i
1c740 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 73 70  n the PKCS#11 sp
1c750 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09  ecification */..
1c760 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
1c770 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
1c780 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
1c790 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
1c7a0 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
1c7b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c7c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c7d0 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74  Card not present
1c7e0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  .  Returning CKR
1c7f0 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22  _DEVICE_REMOVED"
1c800 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1c810 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1c820 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1c830 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f  turn(CKR_DEVICE_
1c840 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66  REMOVED);..}...f
1c850 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78  or (idx = 1; idx
1c860 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1c870 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1c880 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1c890 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
1c8a0 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65  ) {...if (!cacke
1c8b0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1c8c0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75  active) {....fou
1c8d0 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a  nd_session = 1;.
1c8e0 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d  ....*phSession =
1c8f0 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79   idx;.....cackey
1c900 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
1c910 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61  ctive = 1;....ca
1c920 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1c930 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74  x].slotID = slot
1c940 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ID;....cackey_se
1c950 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74  ssions[idx].stat
1c960 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49  e = CKS_RO_PUBLI
1c970 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61  C_SESSION;....ca
1c980 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1c990 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  x].flags = flags
1c9a0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1c9b0 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69  ions[idx].ulDevi
1c9c0 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09  ceError = 0;....
1c9d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c9e0 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f  idx].pApplicatio
1c9f0 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e  n = pApplication
1ca00 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1ca10 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79  ions[idx].Notify
1ca20 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63   = notify;.....c
1ca30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1ca40 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  dx].identities =
1ca50 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79   NULL;....cackey
1ca60 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
1ca70 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
1ca80 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
1ca90 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65  sessions[idx].se
1caa0 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b  arch_active = 0;
1cab0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
1cac0 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61  ions[idx].sign_a
1cad0 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63  ctive = 0;.....c
1cae0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1caf0 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  dx].decrypt_acti
1cb00 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
1cb10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1cb20 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  .identities = ca
1cb30 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
1cb40 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ties(&cackey_slo
1cb50 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63  ts[slotID], &cac
1cb60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1cb70 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
1cb80 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b  nt);......break;
1cb90 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
1cba0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1cbb0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1cbc0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1cbd0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1cbe0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1cbf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1cc00 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1cc10 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1cc20 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1cc30 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1cc40 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f  f (!found_sessio
1cc50 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
1cc60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1cc70 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f  rning CKR_SESSIO
1cc80 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43  N_COUNT (%i)", C
1cc90 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54  KR_SESSION_COUNT
1cca0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1ccb0 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b  _SESSION_COUNT);
1ccc0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1ccd0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1cce0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1ccf0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1cd00 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1cd10 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1cd20 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f  ION(CK_RV, C_Clo
1cd30 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45  seSession)(CK_SE
1cd40 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1cd50 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  ssion) {..int mu
1cd60 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
1cd70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cd80 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1cd90 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1cda0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1cdb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cdc0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1cdd0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1cde0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1cdf0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1ce00 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1ce10 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
1ce20 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
1ce30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1ce40 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1ce50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1ce60 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1ce70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ce80 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
1ce90 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
1cea0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1ceb0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1cec0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1ced0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1cee0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1cef0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1cf00 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1cf10 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1cf20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cf30 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1cf40 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1cf50 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1cf60 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1cf70 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1cf80 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
1cf90 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1cfa0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1cfb0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1cfc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cfd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1cfe0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
1cff0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1d000 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1d010 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1d020 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1d030 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
1d040 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  ive = 0;..cackey
1d050 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
1d060 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1d070 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1d080 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65  ities, cackey_se
1d090 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1d0a0 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
1d0b0 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  t);...mutex_retv
1d0c0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1d0d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1d0e0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1d0f0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1d100 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d110 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d120 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1d130 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1d140 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1d150 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1d160 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d170 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1d180 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1d190 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1d1a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1d1b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1d1c0 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
1d1d0 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  ns)(CK_SLOT_ID s
1d1e0 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32  lotID) {..uint32
1d1f0 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  _t idx;..int mut
1d200 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
1d210 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d220 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1d230 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1d240 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1d250 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d260 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1d270 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1d280 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1d290 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1d2a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
1d2b0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
1d2c0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
1d2d0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1d2e0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1d2f0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
1d300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d310 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
1d320 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
1d330 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
1d340 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
1d350 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
1d360 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
1d370 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1d380 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1d390 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1d3a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1d3b0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1d3c0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1d3d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d3e0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1d3f0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1d400 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1d410 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1d420 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1d430 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
1d440 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1d450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d460 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1d470 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1d480 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
1d490 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
1d4a0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
1d4b0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1d4c0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1d4d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
1d4e0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
1d4f0 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
1d500 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
1d510 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1d520 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1d530 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
1d540 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
1d550 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d560 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
1d570 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
1d580 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49  sions[idx].slotI
1d590 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09  D != slotID) {..
1d5a0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
1d5b0 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  }.....cackey_mut
1d5c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1d5d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f  _biglock);....C_
1d5e0 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78  CloseSession(idx
1d5f0 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1d600 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1d610 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a  iglock);...}..}.
1d620 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1d630 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1d640 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1d650 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1d660 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1d670 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d680 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1d690 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1d6a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1d6b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1d6c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1d6d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1d6e0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1d6f0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1d700 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1d710 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1d720 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1d730 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b  tSessionInfo)(CK
1d740 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1d750 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53  hSession, CK_SES
1d760 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49  SION_INFO_PTR pI
1d770 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  nfo) {..int mute
1d780 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
1d790 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d7a0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1d7b0 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
1d7c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1d7d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d7e0 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
1d7f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d800 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1d810 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1d820 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1d830 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d840 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1d850 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1d860 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1d870 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1d880 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1d890 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
1d8a0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
1d8b0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1d8c0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1d8d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1d8e0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
1d8f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d900 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1d910 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
1d920 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1d930 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1d940 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1d950 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1d960 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1d970 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1d980 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1d990 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1d9a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d9b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1d9c0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1d9d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1d9e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1d9f0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1da00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1da10 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
1da20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1da30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1da40 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1da50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1da60 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
1da70 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1da80 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1da90 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1daa0 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  D);..}...pInfo->
1dab0 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
1dac0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1dad0 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66  n].slotID;..pInf
1dae0 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65  o->state = cacke
1daf0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1db00 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e  ion].state;..pIn
1db10 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b  fo->flags = cack
1db20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1db30 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49  sion].flags;..pI
1db40 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72  nfo->ulDeviceErr
1db50 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  or = cackey_sess
1db60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75  ions[hSession].u
1db70 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09  lDeviceError;...
1db80 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1db90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1dba0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1dbb0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1dbc0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1dbd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dbe0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1dbf0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1dc00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1dc10 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1dc20 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1dc30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1dc40 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1dc50 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1dc60 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1dc70 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1dc80 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f  ON(CK_RV, C_GetO
1dc90 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
1dca0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1dcb0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1dcc0 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
1dcd0 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
1dce0 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f  _PTR pulOperatio
1dcf0 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41  nStateLen) {..CA
1dd00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1dd10 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1dd20 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1dd30 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1dd40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dd50 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1dd60 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1dd70 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1dd80 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1dd90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1dda0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ddb0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1ddc0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1ddd0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1dde0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1ddf0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1de00 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1de10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1de20 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1de30 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
1de40 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
1de50 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1de60 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1de70 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61  _BYTE_PTR pOpera
1de80 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c  tionState, CK_UL
1de90 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53  ONG ulOperationS
1dea0 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45  tateLen, CK_OBJE
1deb0 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79  CT_HANDLE hEncry
1dec0 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ptionKey, CK_OBJ
1ded0 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68  ECT_HANDLE hAuth
1dee0 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b  enticationKey) {
1def0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1df00 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1df10 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1df20 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1df30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1df40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1df50 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1df60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1df70 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1df80 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1df90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dfa0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1dfb0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1dfc0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1dfd0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1dfe0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1dff0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1e000 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1e010 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
1e020 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1e030 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53   C_Login)(CK_SES
1e040 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1e050 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59  sion, CK_USER_TY
1e060 50 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f  PE userType, CK_
1e070 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
1e080 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
1e090 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  nLen) {..CK_SLOT
1e0a0 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74  _ID slotID;..int
1e0b0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
1e0c0 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  int tries_remain
1e0d0 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f  ing;..int login_
1e0e0 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
1e0f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1e100 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1e110 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1e120 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e130 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e140 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1e150 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e160 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1e170 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1e180 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
1e190 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
1e1a0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
1e1b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1e1c0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1e1d0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
1e1e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e1f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1e200 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
1e210 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1e220 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1e230 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1e240 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79  ..}...if (userTy
1e250 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20  pe != CKU_USER) 
1e260 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e270 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e280 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
1e290 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65   USER mode, aske
1e2a0 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22  d for %lu mode."
1e2b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1e2c0 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72  ) userType)....r
1e2d0 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54  eturn(CKR_USER_T
1e2e0 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  YPE_INVALID);..}
1e2f0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1e300 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1e310 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1e320 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1e330 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1e340 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e350 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1e360 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1e370 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1e380 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1e390 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1e3a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1e3b0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
1e3c0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1e3d0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1e3e0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1e3f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e400 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
1e410 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1e420 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1e430 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1e440 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
1e450 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1e460 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
1e470 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
1e480 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
1e490 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1e4a0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1e4b0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1e4c0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1e4d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e4e0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1e4f0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1e500 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
1e510 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
1e520 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
1e530 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1e540 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1e550 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1e560 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1e570 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e580 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1e590 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1e5a0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1e5b0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1e5c0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1e5d0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1e5e0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1e5f0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1e600 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1e610 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e  ROR);..}...login
1e620 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f  _ret = cackey_lo
1e630 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  gin(&cackey_slot
1e640 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c  s[slotID], pPin,
1e650 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65   ulPinLen, &trie
1e660 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 09 69  s_remaining);..i
1e670 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20  f (login_ret != 
1e680 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
1e690 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1e6a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1e6b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66  _biglock);....if
1e6c0 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43   (login_ret == C
1e6d0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
1e6e0 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  KED) {....CACKEY
1e6f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e700 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20  rror.  Token is 
1e710 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63  locked.");.....c
1e720 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1e730 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
1e740 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f  |= CKF_USER_PIN_
1e750 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 72 65 74 75  LOCKED;.....retu
1e760 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45  rn(CKR_PIN_LOCKE
1e770 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20  D);...} else if 
1e780 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41  (login_ret == CA
1e790 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
1e7a0 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  IN) {....CACKEY_
1e7b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e7c0 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49  ror.  Invalid PI
1e7d0 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  N.");.....cackey
1e7e0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
1e7f0 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
1e800 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54  F_USER_PIN_COUNT
1e810 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74 72  _LOW;.....if (tr
1e820 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d  ies_remaining ==
1e830 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79   1) {.....cackey
1e840 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
1e850 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
1e860 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c  F_USER_PIN_FINAL
1e870 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  _TRY;....}.....r
1e880 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
1e890 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09  CORRECT);...}...
1e8a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e8b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1e8c0 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65 74 75  known error retu
1e8d0 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b 65 79  rned from cackey
1e8e0 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 22 2c 20  _login() (%i)", 
1e8f0 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72  login_ret);....r
1e900 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1e910 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63  L_ERROR);..}...c
1e920 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1e930 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
1e940 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49  &= ~(CKF_USER_PI
1e950 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55  N_LOCKED | CKF_U
1e960 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
1e970 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  W | CKF_LOGIN_RE
1e980 51 55 49 52 45 44 20 7c 20 43 4b 46 5f 55 53 45  QUIRED | CKF_USE
1e990 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29  R_PIN_FINAL_TRY)
1e9a0 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
1e9b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
1e9c0 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45  ate = CKS_RO_USE
1e9d0 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d  R_FUNCTIONS;...m
1e9e0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1e9f0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1ea00 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1ea10 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1ea20 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1ea30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ea40 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1ea50 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1ea60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1ea70 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1ea80 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1ea90 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1eaa0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1eab0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1eac0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1ead0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1eae0 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75  N(CK_RV, C_Logou
1eaf0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
1eb00 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
1eb10 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
1eb20 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  tID;..int mutex_
1eb30 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1eb40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1eb50 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1eb60 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1eb70 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1eb80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1eb90 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1eba0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1ebb0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1ebc0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1ebd0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
1ebe0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
1ebf0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
1ec00 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1ec10 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1ec20 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
1ec30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ec40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ec50 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
1ec60 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1ec70 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1ec80 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1ec90 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1eca0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1ecb0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1ecc0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1ecd0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1ece0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1ecf0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ed00 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1ed10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1ed20 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1ed30 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
1ed40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1ed50 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
1ed60 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1ed70 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1ed80 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1ed90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1eda0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1edb0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
1edc0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1edd0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1ede0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73  INVALID);..}...s
1edf0 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
1ee00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ee10 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
1ee20 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
1ee30 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
1ee40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1ee50 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1ee60 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
1ee70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ee80 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1ee90 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1eea0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
1eeb0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
1eec0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
1eed0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1eee0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1eef0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1ef00 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
1ef10 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1ef20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ef30 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1ef40 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1ef50 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
1ef60 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
1ef70 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1ef80 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1ef90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1efa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1efb0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1efc0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1efd0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
1efe0 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43   = CKS_RO_PUBLIC
1eff0 5f 53 45 53 53 49 4f 4e 3b 0a 09 63 61 63 6b 65  _SESSION;..cacke
1f000 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1f010 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
1f020 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
1f030 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
1f040 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1f050 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1f060 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1f070 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1f080 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f090 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f0a0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1f0b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f0c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1f0d0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1f0e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1f0f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1f100 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1f110 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1f120 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1f130 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1f140 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43 4b  CreateObject)(CK
1f150 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1f160 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54  hSession, CK_ATT
1f170 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
1f180 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
1f190 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
1f1a0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f  T_HANDLE_PTR phO
1f1b0 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
1f1c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1f1d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1f1e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1f1f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1f200 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f210 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1f220 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1f230 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1f240 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1f250 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1f260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1f270 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1f280 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1f290 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1f2a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1f2b0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1f2c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f2d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1f2e0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1f2f0 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f  N(CK_RV, C_CopyO
1f300 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
1f310 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1f320 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
1f330 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
1f340 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
1f350 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
1f360 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
1f370 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
1f380 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09  phNewObject) {..
1f390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f3a0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1f3b0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1f3c0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1f3d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f3e0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1f3f0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1f400 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f410 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f420 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1f430 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f440 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1f450 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f460 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1f470 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f480 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1f490 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1f4a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1f4b0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1f4c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1f4d0 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29 28  _DestroyObject)(
1f4e0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1f4f0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
1f500 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
1f510 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ject) {..CACKEY_
1f520 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1f530 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1f540 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1f550 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1f560 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f570 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1f580 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1f590 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1f5a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1f5b0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1f5c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1f5d0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1f5e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f5f0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1f600 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1f610 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1f620 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1f630 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1f640 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1f650 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a  (CK_RV, C_GetObj
1f660 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53 53  ectSize)(CK_SESS
1f670 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1f680 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
1f690 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
1f6a0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
1f6b0 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ize) {..CACKEY_D
1f6c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1f6d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1f6e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1f6f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1f700 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f710 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1f720 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1f730 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1f740 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1f750 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1f760 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1f770 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1f780 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1f790 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1f7a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1f7b0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1f7c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f7d0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1f7e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1f7f0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74 72  CK_RV, C_GetAttr
1f800 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53  ibuteValue)(CK_S
1f810 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1f820 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
1f830 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
1f840 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
1f850 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
1f860 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20  _ULONG ulCount) 
1f870 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  {..CK_ATTRIBUTE 
1f880 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74 72  *curr_attr;..str
1f890 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
1f8a0 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09  ity *identity;..
1f8b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
1f8c0 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74 72  entity_idx, attr
1f8d0 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f  _idx, sess_attr_
1f8e0 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69  idx, num_ids;..i
1f8f0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1f900 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
1f910 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49   CKR_OK;..CK_VOI
1f920 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43  D_PTR pValue;..C
1f930 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c  K_ULONG ulValueL
1f940 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  en;...CACKEY_DEB
1f950 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1f960 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1f970 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1f980 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f990 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f9a0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1f9b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f9c0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1f9d0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1f9e0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
1f9f0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
1fa00 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
1fa10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1fa20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1fa30 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
1fa40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fa50 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1fa60 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
1fa70 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
1fa80 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1fa90 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1faa0 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63 74  .}...if (hObject
1fab0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
1fac0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fad0 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68  Error.  Object h
1fae0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
1faf0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
1fb00 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41  rn(CKR_OBJECT_HA
1fb10 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1fb20 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  }...if (ulCount 
1fb30 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
1fb40 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a  rt circuit, if z
1fb50 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65  ero objects were
1fb60 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75 72   specified retur
1fb70 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d  n zero items imm
1fb80 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41  ediately */...CA
1fb90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fba0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1fbb0 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
1fbc0 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
1fbd0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
1fbe0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
1fbf0 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c  pTemplate == NUL
1fc00 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1fc10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fc20 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73  r.  pTemplate is
1fc30 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1fc40 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1fc50 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65  S_BAD);..}...ide
1fc60 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a  ntity_idx = hObj
1fc70 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78  ect - 1;...mutex
1fc80 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1fc90 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1fca0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1fcb0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1fcc0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1fcd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1fce0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1fcf0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1fd00 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1fd10 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1fd20 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1fd30 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1fd40 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1fd50 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1fd60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1fd70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fd80 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1fd90 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1fda0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1fdb0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1fdc0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1fdd0 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65  .num_ids = cacke
1fde0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1fdf0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
1fe00 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65  count;...if (ide
1fe10 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d  ntity_idx >= num
1fe20 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65 79  _ids) {...cackey
1fe30 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1fe40 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1fe50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fe60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f  RINTF("Error.  O
1fe70 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74  bject handle out
1fe80 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65 6e   of range.  iden
1fe90 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20  tity_idx = %lu, 
1fea0 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c  num_ids = %lu.",
1feb0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1fec0 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 28   identity_idx, (
1fed0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e  unsigned long) n
1fee0 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74 75  um_ids);....retu
1fef0 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41  rn(CKR_OBJECT_HA
1ff00 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1ff10 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20 26  }...identity = &
1ff20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ff30 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1ff40 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69 64  ties[identity_id
1ff50 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f  x];...for (attr_
1ff60 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64  idx = 0; attr_id
1ff70 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74  x < ulCount; att
1ff80 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72  r_idx++) {...cur
1ff90 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70 6c  r_attr = &pTempl
1ffa0 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  ate[attr_idx];..
1ffb0 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
1ffc0 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1ffd0 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09  (CK_LONG) -1;...
1ffe0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fff0 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f  INTF("Looking fo
20000 72 20 61 74 74 72 69 62 75 74 65 20 30 78 25 30  r attribute 0x%0
20010 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25 6c  8lx (identity:%l
20020 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  u) ...", (unsign
20030 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
20040 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69 67  tr->type, (unsig
20050 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
20060 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20  ty_idx);....for 
20070 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d  (sess_attr_idx =
20080 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64   0; sess_attr_id
20090 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  x < identity->at
200a0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20  tributes_count; 
200b0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29  sess_attr_idx++)
200c0 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69   {....if (identi
200d0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
200e0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79  ess_attr_idx].ty
200f0 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d  pe == curr_attr-
20100 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41 43  >type) {.....CAC
20110 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20120 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c  (" ... found it,
20130 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c   pValue = %p, ul
20140 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c  ValueLen = %lu",
20150 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
20160 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
20170 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65  idx].pValue, ide
20180 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
20190 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
201a0 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
201b0 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
201c0 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
201d0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
201e0 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09  dx].pValue;.....
201f0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65  ulValueLen = ide
20200 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
20210 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
20220 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09  .ulValueLen;....
20230 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75 72  }...}....if (cur
20240 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 26  r_attr->pValue &
20250 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 69  & pValue) {....i
20260 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c  f (curr_attr->ul
20270 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61  ValueLen >= ulVa
20280 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65  lueLen) {.....me
20290 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d 3e  mcpy(curr_attr->
202a0 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20  pValue, pValue, 
202b0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
202c0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56  } else {.....ulV
202d0 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
202e0 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74  NG) -1;......ret
202f0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
20300 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d  _TOO_SMALL;....}
20310 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74  ...}....curr_att
20320 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  r->ulValueLen = 
20330 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a  ulValueLen;..}..
20340 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
20350 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
20360 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
20370 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
20380 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
20390 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
203a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
203b0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
203c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
203d0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
203e0 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  ..}...if (retval
203f0 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54   == CKR_ATTRIBUT
20400 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 20  E_TYPE_INVALID) 
20410 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20420 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20430 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45  ng CKR_ATTRIBUTE
20440 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28 25  _TYPE_INVALID (%
20450 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  i)", (int) retva
20460 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  l);..} else if (
20470 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55  retval == CKR_BU
20480 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
20490 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
204a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
204b0 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  ng CKR_BUFFER_TO
204c0 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28  O_SMALL (%i)", (
204d0 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
204e0 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c   else if (retval
204f0 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   == CKR_OK) {...
20500 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20510 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
20520 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e  KR_OK (%i)", (in
20530 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65  t) retval);..} e
20540 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  lse {...CACKEY_D
20550 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20560 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
20570 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09  ) retval);..}...
20580 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
20590 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
205a0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
205b0 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
205c0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
205d0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
205e0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
205f0 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49  Object, CK_ATTRI
20600 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
20610 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
20620 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ount) {..CACKEY_
20630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
20640 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
20650 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
20660 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
20670 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20680 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
20690 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
206a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
206b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
206c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
206d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
206e0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
206f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
20700 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
20710 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20720 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
20730 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20740 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
20750 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
20760 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
20770 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53 45  jectsInit)(CK_SE
20780 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
20790 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
207a0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
207b0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
207c0 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f  unt) {..CK_SLOT_
207d0 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55  ID slotID;..CK_U
207e0 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d  LONG idx;..int m
207f0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
20800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20810 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
20820 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
20830 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
20840 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20850 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
20860 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
20870 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
20880 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
20890 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
208a0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
208b0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
208c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
208d0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
208e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
208f0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
20900 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20910 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
20920 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
20930 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
20940 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
20950 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
20960 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
20970 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
20980 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
20990 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
209a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
209b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
209c0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
209d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
209e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
209f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
20a00 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
20a10 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
20a20 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
20a30 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
20a40 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
20a50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20a60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
20a70 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
20a80 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
20a90 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
20aa0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
20ab0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
20ac0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
20ad0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
20ae0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
20af0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
20b00 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
20b10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20b20 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
20b30 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
20b40 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
20b50 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43  CKR_OPERATION_AC
20b60 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  TIVE);..}...slot
20b70 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
20b80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
20b90 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
20ba0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
20bb0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
20bc0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
20bd0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
20be0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
20bf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20c00 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
20c10 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
20c20 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
20c30 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
20c40 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
20c50 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
20c60 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
20c70 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
20c80 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
20c90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20ca0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20cb0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
20cc0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
20cd0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
20ce0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
20cf0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
20d00 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
20d10 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
20d20 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
20d30 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
20d40 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
20d50 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65  lotID].slot_rese
20d60 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
20d70 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20  BUG_PRINTF("The 
20d80 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65  slot has been re
20d90 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73  set since we las
20da0 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65  t looked for ide
20db0 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61  ntities -- resca
20dc0 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28  nning");....if (
20dd0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20de0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
20df0 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
20e00 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69  ...cackey_free_i
20e10 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79  dentities(cackey
20e20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20e30 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20  on].identities, 
20e40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20e50 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
20e60 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  ties_count);....
20e70 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
20e80 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
20e90 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ities = NULL;...
20ea0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
20eb0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
20ec0 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  ities_count = 0;
20ed0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
20ee0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
20ef0 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20  .label != NULL) 
20f00 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
20f10 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
20f20 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79  abel);....cackey
20f30 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
20f40 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  abel = NULL;...}
20f50 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ....cackey_mark_
20f60 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b  slot_reset(&cack
20f70 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
20f80 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  );...cackey_slot
20f90 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72  s[slotID].slot_r
20fa0 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  eset = 0;..}...i
20fb0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
20fc0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
20fd0 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29  ntities == NULL)
20fe0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
20ff0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
21000 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
21010 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69  ey_read_identiti
21020 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  es(&cackey_slots
21030 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65  [slotID], &cacke
21040 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
21050 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
21060 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  count);..}...if 
21070 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55  (pTemplate != NU
21080 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f  LL) {...if (ulCo
21090 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  unt != 0) {....c
210a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
210b0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
210c0 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c  query_count = ul
210d0 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79  Count;....cackey
210e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
210f0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
21100 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e   = malloc(ulCoun
21110 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d  t * sizeof(*pTem
21120 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d  plate));.....mem
21130 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
21140 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
21150 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65 6d  arch_query, pTem
21160 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a  plate, ulCount *
21170 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61   sizeof(*pTempla
21180 74 65 29 29 3b 0a 09 09 09 66 6f 72 20 28 69 64  te));....for (id
21190 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c 43  x = 0; idx < ulC
211a0 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ount; idx++) {..
211b0 09 09 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
211c0 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  [idx].ulValueLen
211d0 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 63 61   == 0) {......ca
211e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
211f0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
21200 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
21210 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63   = NULL;.......c
21220 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a  ontinue;.....}..
21230 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21240 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
21250 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
21260 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28  pValue = malloc(
21270 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75  pTemplate[idx].u
21280 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
21290 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
212a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
212b0 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
212c0 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  .pValue) {......
212d0 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
212e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
212f0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
21300 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70  x].pValue, pTemp
21310 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65  late[idx].pValue
21320 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d  , pTemplate[idx]
21330 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
21340 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  ..}....}...} els
21350 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  e {....cackey_se
21360 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
21370 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
21380 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  unt = 0;....cack
21390 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
213a0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
213b0 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ry = NULL;...}..
213c0 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75  } else {...if (u
213d0 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
213e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
213f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
21400 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45  lock);.....CACKE
21410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21420 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71  Error.  Search q
21430 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20 61  uery specified a
21440 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62  s NULL, but numb
21450 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d  er of query term
21460 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  s not specified 
21470 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74  as 0.");.....ret
21480 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
21490 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63  S_BAD);...}....c
214a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
214b0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
214c0 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b  query_count = 0;
214d0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
214e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
214f0 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c  rch_query = NULL
21500 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
21510 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
21520 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
21530 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73   1;..cackey_sess
21540 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
21550 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20  earch_curr_id = 
21560 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  0;...mutex_retva
21570 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
21580 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
21590 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
215a0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
215b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
215c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
215d0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
215e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
215f0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
21600 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
21610 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
21620 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
21630 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
21640 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
21650 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
21660 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f  cackey_pkcs11_co
21670 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65 73  mpare_attributes
21680 28 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61  (CK_ATTRIBUTE *a
21690 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  , CK_ATTRIBUTE *
216a0 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  b) {..unsigned c
216b0 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a  har *smallbuf, *
216c0 6c 61 72 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f  largebuf;..size_
216d0 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20  t smallbuf_len, 
216e0 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09  largebuf_len;...
216f0 69 66 20 28 61 2d 3e 74 79 70 65 20 21 3d 20 62  if (a->type != b
21700 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72 65 74 75  ->type) {...retu
21710 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  rn(0);..}...CACK
21720 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21730 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d  "    ... found m
21740 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e  atching type ...
21750 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
21760 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20  UG_PRINTBUF("   
21770 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22   ... our value:"
21780 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e  , a->pValue, a->
21790 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69  ulValueLen);...i
217a0 66 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20  f (b->pValue == 
217b0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
217c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
217d0 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
217e0 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29  wildcard match")
217f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
21800 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c  .}...if (a->pVal
21810 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ue == NULL) {...
21820 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20  return(0);..}.. 
21830 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c  .if (b->ulValueL
21840 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65  en == a->ulValue
21850 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d  Len && memcmp(a-
21860 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c  >pValue, b->pVal
21870 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  ue, b->ulValueLe
21880 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  n) == 0) {...CAC
21890 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
218a0 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
218b0 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68 22 29  nd exact match")
218c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
218d0 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 61 2d 3e  .}...switch (a->
218e0 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
218f0 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69  KA_MODULUS:....i
21900 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  f (a->ulValueLen
21910 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65   == b->ulValueLe
21920 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n) {.....break;.
21930 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e  ...}.....if (a->
21940 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e  ulValueLen > b->
21950 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
21960 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e  ..smallbuf = b->
21970 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c  pValue;.....smal
21980 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c  lbuf_len = b->ul
21990 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c  ValueLen;......l
219a0 61 72 67 65 62 75 66 20 3d 20 61 2d 3e 70 56 61  argebuf = a->pVa
219b0 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75  lue;.....largebu
219c0 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c  f_len = a->ulVal
219d0 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65  ueLen;....} else
219e0 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20   {.....smallbuf 
219f0 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09  = a->pValue;....
21a00 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20  .smallbuf_len = 
21a10 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a  a->ulValueLen;..
21a20 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 62  ....largebuf = b
21a30 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61  ->pValue;.....la
21a40 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e  rgebuf_len = b->
21a50 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d  ulValueLen;....}
21a60 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61 72 67  .....for (; larg
21a70 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c  ebuf_len != smal
21a80 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62  lbuf_len; largeb
21a90 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65  uf++,largebuf_le
21aa0 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20 28 6c  n--) {.....if (l
21ab0 61 72 67 65 62 75 66 5b 30 5d 20 21 3d 20 30 29  argebuf[0] != 0)
21ac0 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
21ad0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
21ae0 20 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21   (largebuf_len !
21af0 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20  = smallbuf_len) 
21b00 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
21b10 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d 70  }.....if (memcmp
21b20 28 6c 61 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c  (largebuf, small
21b30 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  buf, smallbuf_le
21b40 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43  n) == 0) {.....C
21b50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21b60 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
21b70 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d 61 74 65  ound approximate
21b80 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 72   match");......r
21b90 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a  eturn(1);....}..
21ba0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72  ...break;..}...r
21bb0 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f  eturn(0);.}..CK_
21bc0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
21bd0 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
21be0 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ects)(CK_SESSION
21bf0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
21c00 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
21c10 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c  LE_PTR phObject,
21c20 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f   CK_ULONG ulMaxO
21c30 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55  bjectCount, CK_U
21c40 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65  LONG_PTR pulObje
21c50 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75  ctCount) {..stru
21c60 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
21c70 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b  ty *curr_id;..CK
21c80 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72  _ATTRIBUTE *curr
21c90 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  _attr;..CK_ULONG
21ca0 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75   curr_id_idx, cu
21cb0 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63  rr_out_id_idx, c
21cc0 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65  urr_attr_idx, se
21cd0 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b  ss_attr_idx;..CK
21ce0 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63  _ULONG matched_c
21cf0 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68  ount, prev_match
21d00 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d  ed_count;..int m
21d10 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
21d20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21d30 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
21d40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
21d50 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
21d60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21d70 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
21d80 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
21d90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
21da0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
21db0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
21dc0 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20  (pulObjectCount 
21dd0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
21de0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21df0 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62 6a  ("Error.  pulObj
21e00 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  ectCount is NULL
21e10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21e20 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
21e30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62  );..}...if (phOb
21e40 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20  ject == NULL && 
21e50 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
21e60 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
21e70 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20  ort circuit, if 
21e80 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72  zero objects wer
21e90 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75  e specified retu
21ea0 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d  rn zero items im
21eb0 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 2a  mediately */...*
21ec0 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  pulObjectCount =
21ed0 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45   0;....CACKEY_DE
21ee0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
21ef0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
21f00 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
21f10 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
21f20 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
21f30 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63  .}...if (phObjec
21f40 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
21f50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21f60 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f 62  TF("Error.  phOb
21f70 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  ject is NULL.");
21f80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
21f90 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
21fa0 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62 6a  }...if (ulMaxObj
21fb0 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  ectCount == 0) {
21fc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21fd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21fe0 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
21ff0 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69 66  f objects specif
22000 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b 0a  ied as zero.");.
22010 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
22020 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
22030 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
22040 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
22050 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
22060 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
22070 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
22080 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
22090 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
220a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
220b0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
220c0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
220d0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
220e0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
220f0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
22100 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
22110 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22120 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
22130 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
22140 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22150 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
22160 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
22170 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22180 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22190 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
221a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
221b0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
221c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
221d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
221e0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
221f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22200 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
22210 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
22220 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
22230 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
22240 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
22250 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22260 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
22270 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
22280 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
22290 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
222a0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
222b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
222c0 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69   Search not acti
222d0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
222e0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
222f0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22300 29 3b 0a 09 7d 0a 0a 09 63 75 72 72 5f 6f 75 74  );..}...curr_out
22310 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f  _id_idx = 0;..fo
22320 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20 3d  r (curr_id_idx =
22330 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
22340 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
22350 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72 5f  h_curr_id; curr_
22360 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f  id_idx < cackey_
22370 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
22380 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
22390 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  unt && ulMaxObje
223a0 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64  ctCount; curr_id
223b0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72  _idx++) {...curr
223c0 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  _id = &cackey_se
223d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
223e0 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72 72  .identities[curr
223f0 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43  _id_idx];....CAC
22400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22410 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64 65  ("Processing ide
22420 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73  ntity:%lu", (uns
22430 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
22440 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74  _id_idx);....mat
22450 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  ched_count = 0;.
22460 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
22470 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f  r_idx = 0; curr_
22480 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b 65  attr_idx < cacke
22490 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
224a0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
224b0 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74  y_count; curr_at
224c0 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70  tr_idx++) {....p
224d0 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
224e0 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  t = matched_coun
224f0 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72  t;.....curr_attr
22500 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
22510 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
22520 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72 5f  arch_query[curr_
22530 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43  attr_idx];.....C
22540 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22550 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20 66  TF("  Checking f
22560 6f 72 20 61 74 74 72 69 62 75 74 65 20 25 73 20  or attribute %s 
22570 28 30 78 25 30 38 6c 78 29 20 69 6e 20 69 64 65  (0x%08lx) in ide
22580 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41  ntity:%i...", CA
22590 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
225a0 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52  ATTRIBUTE_TO_STR
225b0 28 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65  (curr_attr->type
225c0 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
225d0 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  g) curr_attr->ty
225e0 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69  pe, (int) curr_i
225f0 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45  d_idx);....CACKE
22600 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
22610 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b  ("    Value look
22620 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f  ing for:", curr_
22630 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75  attr->pValue, cu
22640 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65  rr_attr->ulValue
22650 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73  Len);.....for (s
22660 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  ess_attr_idx = 0
22670 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20  ; sess_attr_idx 
22680 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  < curr_id->attri
22690 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
226a0 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
226b0 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ....if (cackey_p
226c0 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74  kcs11_compare_at
226d0 74 72 69 62 75 74 65 73 28 26 63 75 72 72 5f 69  tributes(&curr_i
226e0 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  d->attributes[se
226f0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63 75  ss_attr_idx], cu
22700 72 72 5f 61 74 74 72 29 29 20 7b 0a 09 09 09 09  rr_attr)) {.....
22710 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b  .matched_count++
22720 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
22730 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a  ...}....}...../*
22740 20 49 66 20 74 68 65 20 61 74 74 72 69 62 75 74   If the attribut
22750 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d  e could not be m
22760 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74  atched, do not t
22770 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64 69  ry to match addi
22780 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74 65  tional attribute
22790 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 76  s */....if (prev
227a0 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  _matched_count =
227b0 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 29  = matched_count)
227c0 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
227d0 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61  .}...}....if (ma
227e0 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63  tched_count == c
227f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22800 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
22810 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09  query_count) {..
22820 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22830 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c  RINTF("  ... All
22840 20 25 69 20 61 74 74 72 69 62 75 74 65 73 20 63   %i attributes c
22850 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64  hecked for found
22860 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74  , adding identit
22870 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65 64  y:%i to returned
22880 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63 61   list", (int) ca
22890 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
228a0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
228b0 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74  uery_count, (int
228c0 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a  ) curr_id_idx);.
228d0 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75 72  ....phObject[cur
228e0 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20  r_out_id_idx] = 
228f0 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b  curr_id_idx + 1;
22900 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74  .....ulMaxObject
22910 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72  Count--;.....cur
22920 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a  r_out_id_idx++;.
22930 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
22940 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22950 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c  F("  ... Not all
22960 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20   %i (only found 
22970 25 69 29 20 61 74 74 72 69 62 75 74 65 73 20 63  %i) attributes c
22980 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64  hecked for found
22990 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64 65  , not adding ide
229a0 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74 29  ntity:%i", (int)
229b0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
229c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
229d0 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28  h_query_count, (
229e0 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f 75  int) matched_cou
229f0 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69  nt, (int) curr_i
22a00 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09  d_idx);...}..}..
22a10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22a20 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
22a30 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72 5f  _curr_id = curr_
22a40 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a  id_idx;..*pulObj
22a50 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f  ectCount = curr_
22a60 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 09 6d 75  out_id_idx;...mu
22a70 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
22a80 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
22a90 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22aa0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
22ab0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
22ac0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22ad0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
22ae0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
22af0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
22b00 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
22b10 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22b20 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
22b30 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e  g CKR_OK (%i), n
22b40 75 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75  um objects = %lu
22b50 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f  ", CKR_OK, *pulO
22b60 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72  bjectCount);...r
22b70 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
22b80 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
22b90 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
22ba0 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28  ndObjectsFinal)(
22bb0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
22bc0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
22bd0 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e  K_ULONG idx;..in
22be0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
22bf0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22c00 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22c10 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
22c20 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22c30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22c40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22c50 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22c60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22c70 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22c80 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22c90 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
22ca0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
22cb0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
22cc0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
22cd0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
22ce0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
22cf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22d00 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
22d10 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
22d20 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
22d30 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
22d40 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
22d50 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
22d60 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
22d70 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22d80 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
22d90 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
22da0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22db0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
22dc0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
22dd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
22de0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
22df0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
22e00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
22e10 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
22e20 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
22e30 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22e40 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
22e50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22e60 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
22e70 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
22e80 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
22e90 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
22ea0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
22eb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22ec0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
22ed0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
22ee0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
22ef0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
22f00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22f10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
22f20 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e  arch not active.
22f30 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
22f40 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
22f50 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
22f60 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
22f70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22f80 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30  earch_active = 0
22f90 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ;...for (idx = 0
22fa0 3b 20 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73  ; idx < cackey_s
22fb0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22fc0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
22fd0 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ount; idx++) {..
22fe0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
22ff0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
23000 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
23010 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72  .pValue) {....fr
23020 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ee(cackey_sessio
23030 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
23040 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
23050 56 61 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  Value);...}..}..
23060 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
23070 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
23080 65 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09  earch_query) {..
23090 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73  .free(cackey_ses
230a0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
230b0 73 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09  search_query);..
230c0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
230d0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
230e0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
230f0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
23100 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
23110 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23120 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23130 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
23140 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23150 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
23160 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
23170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23180 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
23190 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
231a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
231b0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
231c0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
231d0 45 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f  EncryptInit)(CK_
231e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
231f0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
23200 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
23210 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
23220 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
23230 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23240 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
23250 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
23260 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
23270 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23280 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
23290 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
232a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
232b0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
232c0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
232d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
232e0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
232f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
23300 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
23310 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23320 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
23330 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
23340 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
23350 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
23360 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
23370 5f 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53  _Encrypt)(CK_SES
23380 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
23390 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
233a0 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
233b0 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
233c0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
233d0 74 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  tedData, CK_ULON
233e0 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
233f0 65 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41  edDataLen) {..CA
23400 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23410 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
23420 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
23430 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
23440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23450 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
23460 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
23470 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
23480 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
23490 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
234a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
234b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
234c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
234d0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
234e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
234f0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
23500 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
23510 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
23520 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
23530 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
23540 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ncryptUpdate)(CK
23550 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
23560 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
23570 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
23580 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c  ULONG ulPartLen,
23590 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
235a0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
235b0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
235c0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
235d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
235e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
235f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
23600 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
23610 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23620 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
23630 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
23640 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23650 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
23660 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
23670 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23680 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23690 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
236a0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
236b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
236c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
236d0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
236e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
236f0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
23700 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23710 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29   C_EncryptFinal)
23720 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
23730 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
23740 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e  BYTE_PTR pLastEn
23750 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
23760 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73  ULONG_PTR pulLas
23770 74 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  tEncryptedPartLe
23780 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
23790 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
237a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
237b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
237c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
237d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
237e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
237f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23800 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
23810 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
23820 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
23830 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23840 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
23850 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
23860 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
23870 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
23880 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
23890 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
238a0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
238b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
238c0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e  _RV, C_DecryptIn
238d0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
238e0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
238f0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
23900 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
23910 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
23920 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  ey) {..int mutex
23930 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d  _retval;...hKey-
23940 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  -;...CACKEY_DEBU
23950 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
23960 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
23970 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
23980 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23990 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
239a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
239b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
239c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
239d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
239e0 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
239f0 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  m == NULL) {...C
23a00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23a10 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
23a20 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29  anism is NULL.")
23a30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23a40 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
23a50 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
23a60 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21  ism->mechanism !
23a70 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20  = CKM_RSA_PKCS) 
23a80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23a90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23aa0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
23ab0 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66  anism not specif
23ac0 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50  ied as CKM_RSA_P
23ad0 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  KCS");....return
23ae0 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  (CKR_MECHANISM_P
23af0 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  ARAM_INVALID);..
23b00 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
23b10 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
23b20 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
23b30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
23b40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
23b50 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
23b60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23b70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
23b80 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
23b90 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
23ba0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
23bb0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
23bc0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
23bd0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
23be0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
23bf0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
23c00 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
23c10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23c20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23c30 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
23c40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23c50 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
23c60 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
23c70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23c80 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
23c90 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
23ca0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23cb0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
23cc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23cd0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
23ce0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
23cf0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
23d00 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
23d10 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
23d20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23d30 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
23d40 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
23d50 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
23d60 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
23d70 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
23d80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23d90 20 20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64    Decrypt alread
23da0 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29  y in progress.")
23db0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
23dc0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49  R_OPERATION_ACTI
23dd0 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b  VE);..}...if (hK
23de0 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73  ey >= cackey_ses
23df0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
23e00 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
23e10 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
23e20 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23e30 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
23e40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23e50 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68  F("Error.  Key h
23e60 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
23e70 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65  ge (requested ke
23e80 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20  y %lu, only %lu 
23e90 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c  identities avail
23ea0 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e  able).", (unsign
23eb0 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28  ed long) hKey, (
23ec0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
23ed0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23ee0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
23ef0 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  ies_count);....r
23f00 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41  eturn(CKR_KEY_HA
23f10 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
23f20 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
23f30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
23f40 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31  crypt_active = 1
23f50 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
23f60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
23f70 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20  crypt_mechanism 
23f80 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  = pMechanism->me
23f90 63 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79  chanism;..cackey
23fa0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23fb0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68  on].decrypt_mech
23fc0 5f 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69  _parm = pMechani
23fd0 73 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a  sm->pParameter;.
23fe0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
23ff0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
24000 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20  pt_mech_parmlen 
24010 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c  = pMechanism->ul
24020 50 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63  ParameterLen;..c
24030 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
24040 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
24050 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  _identity = &cac
24060 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24070 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
24080 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78  s[hKey];...mutex
24090 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
240a0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
240b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
240c0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
240d0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
240e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
240f0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
24100 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
24110 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
24120 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
24130 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24140 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24150 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
24160 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
24170 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
24180 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
24190 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28  _RV, C_Decrypt)(
241a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
241b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
241c0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
241d0 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  edData, CK_ULONG
241e0 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61   ulEncryptedData
241f0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
24200 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
24210 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29  _PTR pulDataLen)
24220 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74   {..CK_ULONG dat
24230 61 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74  alen_update, dat
24240 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f  alen_final;..CK_
24250 52 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a  RV decrypt_ret;.
24260 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
24270 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
24280 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
24290 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
242a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
242b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
242c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
242d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
242e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
242f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
24300 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
24310 0a 0a 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65  ...if (pulDataLe
24320 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
24330 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24340 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61  TF("Error. pulDa
24350 74 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  taLen is NULL.")
24360 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24370 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
24380 09 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64  .}...datalen_upd
24390 61 74 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65  ate = *pulDataLe
243a0 6e 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74  n;...decrypt_ret
243b0 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61   = C_DecryptUpda
243c0 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e  te(hSession, pEn
243d0 63 72 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45  cryptedData, ulE
243e0 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c  ncryptedDataLen,
243f0 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e   pData, &datalen
24400 5f 75 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64  _update);..if (d
24410 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b  ecrypt_ret != CK
24420 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  R_OK) {...CACKEY
24430 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24440 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70  rror.  DecryptUp
24450 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20  date() returned 
24460 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
24470 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
24480 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65  long) decrypt_re
24490 74 29 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 79  t);....if (decry
244a0 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55  pt_ret != CKR_BU
244b0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
244c0 7b 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74  {..../* Terminat
244d0 65 20 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 65  e decryption ope
244e0 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75  ration */.....mu
244f0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24500 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
24510 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24520 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ...if (mutex_ret
24530 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  val != 0) {.....
24540 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24550 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
24560 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
24570 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
24580 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
24590 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61  ...}.....if (!ca
245a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
245b0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
245c0 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
245d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
245e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09  _biglock);......
245f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24600 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
24610 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
24620 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72  ");........retur
24630 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
24640 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
24650 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63  ..}.....if (!cac
24660 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24670 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
24680 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
24690 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
246a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
246b0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
246c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
246d0 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
246e0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
246f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
24700 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
24710 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09  ALIZED);....}...
24720 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
24730 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
24740 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ypt_active = 0;.
24750 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
24760 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
24770 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
24780 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
24790 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
247a0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
247b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
247c0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
247d0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72  ailed.");......r
247e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
247f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09  L_ERROR);....}..
24800 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63  .}....return(dec
24810 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  rypt_ret);..}...
24820 69 66 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70  if (pData) {...p
24830 44 61 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f  Data += datalen_
24840 75 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61  update;..}..data
24850 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c  len_final = *pul
24860 44 61 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65  DataLen - datale
24870 6e 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72  n_update;...decr
24880 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72  ypt_ret = C_Decr
24890 79 70 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f  yptFinal(hSessio
248a0 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c  n, pData, &datal
248b0 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28  en_final);..if (
248c0 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43  decrypt_ret != C
248d0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  KR_OK) {...CACKE
248e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
248f0 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 46  Error.  DecryptF
24900 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
24910 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
24920 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
24930 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65  long) decrypt_re
24940 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65  t);....return(de
24950 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a  crypt_ret);..}..
24960 09 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64  .*pulDataLen = d
24970 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20  atalen_update + 
24980 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a  datalen_final;..
24990 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
249a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
249b0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
249c0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
249d0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
249e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
249f0 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55  K_RV, C_DecryptU
24a00 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
24a10 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
24a20 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
24a30 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
24a40 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
24a50 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42  tedPartLen, CK_B
24a60 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
24a70 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50  K_ULONG_PTR pulP
24a80 61 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69  artLen) {..stati
24a90 63 20 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36  c CK_BYTE buf[16
24aa0 33 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62  384];..ssize_t b
24ab0 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f  uflen;..CK_SLOT_
24ac0 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52  ID slotID;..CK_R
24ad0 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47  V retval = CKR_G
24ae0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69  ENERAL_ERROR;..i
24af0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
24b00 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24b10 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
24b20 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
24b30 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
24b40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24b50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
24b60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
24b70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24b80 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
24b90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
24ba0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
24bb0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
24bc0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
24bd0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
24be0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
24bf0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
24c00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24c10 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
24c20 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
24c30 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
24c40 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
24c50 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
24c60 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64  ..if (pEncrypted
24c70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20  Part == NULL && 
24c80 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
24c90 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  en == 0) {.../* 
24ca0 53 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66  Short circuit if
24cb0 20 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f   we are asked to
24cc0 20 64 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67   decrypt nothing
24cd0 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ... */...CACKEY_
24ce0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
24cf0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
24d00 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
24d10 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
24d20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
24d30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72  ;..}...if (pEncr
24d40 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c  yptedPart == NUL
24d50 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
24d60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24d70 72 2e 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  r. pEncryptedPar
24d80 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75  t is NULL, but u
24d90 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
24da0 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a  n is not 0.");..
24db0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
24dc0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
24dd0 0a 09 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65  ..if (ulEncrypte
24de0 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  dPartLen == 0) {
24df0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24e00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75  PRINTF("Error. u
24e10 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
24e20 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72  n is 0, but pPar
24e30 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  t is not NULL.")
24e40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24e50 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
24e60 09 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74  .}...if (pulPart
24e70 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
24e80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24e90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
24ea0 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  PartLen is NULL.
24eb0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
24ec0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
24ed0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
24ee0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
24ef0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
24f00 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
24f10 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
24f20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24f30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24f40 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
24f50 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24f60 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
24f70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
24f80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24f90 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
24fa0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
24fb0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
24fc0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
24fd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24fe0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
24ff0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
25000 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
25010 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
25020 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
25030 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
25040 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
25050 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ypt_active) {...
25060 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25070 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25080 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
25090 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
250a0 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74  or.  Decrypt not
250b0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
250c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
250d0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
250e0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  LIZED);..}...slo
250f0 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
25100 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25110 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
25120 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
25130 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
25140 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
25150 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
25160 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
25170 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25180 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
25190 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
251a0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
251b0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
251c0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
251d0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
251e0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
251f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
25200 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
25210 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25220 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25230 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
25240 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
25250 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
25260 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
25270 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
25280 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
25290 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
252a0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
252b0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
252c0 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
252d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
252e0 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69  .decrypt_mechani
252f0 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d  sm) {...case CKM
25300 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a  _RSA_PKCS:..../*
25310 20 41 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63   Ask card to dec
25320 72 79 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65  rypt */....bufle
25330 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
25340 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
25350 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
25360 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25370 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
25380 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79  identity, pEncry
25390 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72  ptedPart, ulEncr
253a0 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75  yptedPartLen, bu
253b0 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20  f, sizeof(buf), 
253c0 30 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62  0, 1);.....if (b
253d0 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09  uflen < 0) {....
253e0 09 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e 20 66  ./* Decryption f
253f0 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66  ailed. */.....if
25400 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b   (buflen == CACK
25410 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
25420 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76  GIN) {......retv
25430 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f  al = CKR_USER_NO
25440 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09  T_LOGGED_IN;....
25450 09 7d 20 65 6c 73 65 20 69 66 20 28 62 75 66 6c  .} else if (bufl
25460 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
25470 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
25480 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
25490 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f   CKR_DEVICE_REMO
254a0 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  VED;.....} else 
254b0 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
254c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
254d0 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c  R;.....}....} el
254e0 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65  se if (((unsigne
254f0 64 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20  d long) buflen) 
25500 3e 20 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26  > *pulPartLen &&
25510 20 70 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a   pPart) {...../*
25520 20 44 65 63 72 79 70 74 65 64 20 64 61 74 61 20   Decrypted data 
25530 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09  too large */....
25540 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  .retval = CKR_BU
25550 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a  FFER_TOO_SMALL;.
25560 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
25570 69 66 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09  if (pPart) {....
25580 09 09 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20  ..memcpy(pPart, 
25590 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09  buf, buflen);...
255a0 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72  ..}......*pulPar
255b0 74 4c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a  tLen = buflen;..
255c0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
255d0 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72  _OK;....}.....br
255e0 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  eak;..}...mutex_
255f0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
25600 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25610 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
25620 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
25630 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
25640 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25650 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
25660 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
25670 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
25680 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
25690 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
256a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69  TF("Returning %i
256b0 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
256c0 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
256d0 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  l);.}..CK_DEFINE
256e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
256f0 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29   C_DecryptFinal)
25700 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
25710 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
25720 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61  BYTE_PTR pLastPa
25730 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
25740 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29   pulLastPartLen)
25750 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
25760 74 76 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69  tval;..int termi
25770 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31  nate_decrypt = 1
25780 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
25790 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
257a0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
257b0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
257c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
257d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
257e0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
257f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
25800 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
25810 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
25820 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
25830 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
25840 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
25850 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
25860 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
25870 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
25880 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25890 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
258a0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
258b0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
258c0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
258d0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
258e0 0a 0a 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61  ...if (pulLastPa
258f0 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  rtLen == NULL) {
25900 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25910 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
25920 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73  ulLastPartLen is
25930 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
25940 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
25950 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
25960 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
25970 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
25980 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
25990 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
259a0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
259b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
259c0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
259d0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
259e0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
259f0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
25a00 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
25a10 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
25a20 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
25a30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25a40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
25a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25a60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
25a70 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
25a80 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
25a90 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
25aa0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
25ab0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
25ac0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25ad0 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
25ae0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
25af0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25b00 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
25b10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25b20 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
25b30 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  pt not active.")
25b40 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
25b50 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
25b60 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
25b70 0a 0a 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c  ...*pulLastPartL
25b80 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c  en = 0;...if (pL
25b90 61 73 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29  astPart == NULL)
25ba0 20 7b 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64   {...terminate_d
25bb0 65 63 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a  ecrypt = 0;..}..
25bc0 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64  .if (terminate_d
25bd0 65 63 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b  ecrypt) {...cack
25be0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25bf0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
25c00 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d  tive = 0;..}...m
25c10 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
25c20 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
25c30 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25c40 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
25c50 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
25c60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25c70 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
25c80 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
25c90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
25ca0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
25cb0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
25cc0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
25cd0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
25ce0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
25cf0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
25d00 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
25d10 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
25d20 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  tInit)(CK_SESSIO
25d30 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
25d40 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
25d50 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20  PTR pMechanism) 
25d60 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
25d70 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
25d80 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
25d90 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
25da0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25db0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
25dc0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
25dd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25de0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
25df0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
25e00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25e10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
25e20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25e30 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
25e40 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
25e50 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
25e60 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
25e70 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
25e80 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
25e90 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
25ea0 2c 20 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53  , C_Digest)(CK_S
25eb0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
25ec0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
25ed0 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
25ee0 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
25ef0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65  K_BYTE_PTR pDige
25f00 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
25f10 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b   pulDigestLen) {
25f20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25f30 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
25f40 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
25f50 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
25f60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25f70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
25f80 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
25f90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25fa0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
25fb0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
25fc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25fd0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
25fe0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
25ff0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
26000 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
26010 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
26020 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
26030 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26040 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
26050 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
26060 20 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 29   C_DigestUpdate)
26070 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
26080 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
26090 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
260a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
260b0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
260c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
260d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
260e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
260f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26100 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26110 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
26120 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26130 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
26140 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
26150 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
26160 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
26170 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
26180 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
26190 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
261a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
261b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
261c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
261d0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
261e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
261f0 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65  K_RV, C_DigestKe
26200 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
26210 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
26220 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
26230 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
26240 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
26250 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
26260 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
26270 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
26280 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26290 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
262a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
262b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
262c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
262d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
262e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
262f0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
26300 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
26310 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
26320 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26330 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
26340 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26350 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
26360 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
26370 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
26380 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
26390 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
263a0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
263b0 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Digest, CK_ULONG
263c0 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65  _PTR pulDigestLe
263d0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
263e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
263f0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
26400 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
26410 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26420 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26430 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
26440 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
26450 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
26460 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
26470 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
26480 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
26490 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
264a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
264b0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
264c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
264d0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
264e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
264f0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
26500 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
26510 5f 52 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29  _RV, C_SignInit)
26520 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
26530 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
26540 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
26550 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
26560 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
26570 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
26580 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a  tval;...hKey--;.
26590 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
265a0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
265b0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
265c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
265d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
265e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
265f0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
26600 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26610 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
26620 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
26630 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d  if (pMechanism =
26640 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
26650 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26660 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
26670 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  sm is NULL.");..
26680 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
26690 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
266a0 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
266b0 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43  ->mechanism != C
266c0 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09  KM_RSA_PKCS) {..
266d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
266e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
266f0 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
26700 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  sm not specified
26710 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   as CKM_RSA_PKCS
26720 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
26730 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41  R_MECHANISM_PARA
26740 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  M_INVALID);..}..
26750 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
26760 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
26770 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
26780 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
26790 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
267a0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
267b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
267c0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
267d0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
267e0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
267f0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
26800 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
26810 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
26820 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
26830 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26840 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
26850 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
26860 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26870 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
26880 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
26890 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
268a0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
268b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
268c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
268d0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
268e0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
268f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
26900 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
26910 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26920 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
26930 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
26940 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
26950 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
26960 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
26970 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26980 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
26990 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
269a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
269b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
269c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
269d0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
269e0 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67   already in prog
269f0 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ress.");......re
26a00 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
26a10 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
26a20 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63  .if (hKey >= cac
26a30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26a40 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
26a50 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63  s_count) {...cac
26a60 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26a70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26a80 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
26a90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26aa0 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74    Key handle out
26ab0 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65   of range (reque
26ac0 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e  sted key %lu, on
26ad0 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65  ly %lu identitie
26ae0 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20  s available).", 
26af0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
26b00 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  hKey, (unsigned 
26b10 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73  long) cackey_ses
26b20 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26b30 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
26b40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26b50 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  _KEY_HANDLE_INVA
26b60 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  LID);..}...cacke
26b70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26b80 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
26b90 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
26ba0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26bb0 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
26bc0 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d   = pMechanism->m
26bd0 65 63 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b  echanism;...cack
26be0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26bf0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
26c00 6e 20 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79  n = 128;..cackey
26c10 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26c20 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
26c30 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65   = 0;..cackey_se
26c40 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26c50 2e 73 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c  .sign_buf = mall
26c60 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65  oc(sizeof(*cacke
26c70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26c80 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a  ion].sign_buf) *
26c90 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
26ca0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
26cb0 62 75 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45  buflen);...CACKE
26cc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26cd0 53 65 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e  Session %lu sign
26ce0 5f 69 64 65 6e 74 69 74 79 20 69 73 20 25 70 20  _identity is %p 
26cf0 28 69 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22  (identity #%lu)"
26d00 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
26d10 29 20 68 53 65 73 73 69 6f 6e 2c 20 26 63 61 63  ) hSession, &cac
26d20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26d30 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
26d40 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e  s[hKey], (unsign
26d50 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a  ed long) hKey);.
26d60 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
26d70 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
26d80 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
26d90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26da0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
26db0 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
26dc0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
26dd0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26de0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
26df0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
26e00 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
26e10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26e20 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
26e30 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
26e40 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
26e50 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
26e60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26e70 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
26e80 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
26e90 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
26ea0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
26eb0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
26ec0 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53  RV, C_Sign)(CK_S
26ed0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
26ee0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
26ef0 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
26f00 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
26f10 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
26f20 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
26f30 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
26f40 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  Len) {..unsigned
26f50 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e   long start_sign
26f60 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56  _bufused;..CK_RV
26f70 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20   sign_ret;..int 
26f80 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
26f90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26fa0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
26fb0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
26fc0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
26fd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26fe0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
26ff0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
27000 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
27010 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
27020 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
27030 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
27040 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
27050 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
27060 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
27070 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
27080 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
27090 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
270a0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
270b0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
270c0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
270d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
270e0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73  INVALID);..}...s
270f0 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65  tart_sign_bufuse
27100 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  d = cackey_sessi
27110 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
27120 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73 69  gn_bufused;...si
27130 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55  gn_ret = C_SignU
27140 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20  pdate(hSession, 
27150 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e  pData, ulDataLen
27160 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74  );..if (sign_ret
27170 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
27180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27190 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
271a0 6e 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e  nUpdate() return
271b0 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
271c0 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
271d0 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
271e0 74 29 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f  t);....if (sign_
271f0 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45  ret != CKR_BUFFE
27200 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
27210 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
27220 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
27230 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27240 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
27250 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
27260 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
27270 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27280 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
27290 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
272a0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
272b0 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  R);....}.....if 
272c0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
272d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
272e0 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ve) {.....cackey
272f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
27300 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
27310 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
27320 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27330 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
27340 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
27350 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
27360 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
27370 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
27380 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
27390 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
273a0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61  active) {.....ca
273b0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
273c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
273d0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
273e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
273f0 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
27400 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09  tive.");........
27410 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
27420 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
27430 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  IZED);....}.....
27440 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27450 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
27460 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d  ctive = 0;.....m
27470 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
27480 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
27490 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
274a0 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
274b0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
274c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
274d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
274e0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
274f0 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
27500 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
27510 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  OR);....}...}...
27520 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
27530 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74  );..}...sign_ret
27540 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68   = C_SignFinal(h
27550 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74  Session, pSignat
27560 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72  ure, pulSignatur
27570 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e  eLen);..if (sign
27580 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
27590 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74  {...if (sign_ret
275a0 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   == CKR_BUFFER_T
275b0 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43  OO_SMALL) {....C
275c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
275d0 54 46 28 22 53 69 67 6e 46 69 6e 61 6c 28 29 20  TF("SignFinal() 
275e0 72 65 74 75 72 6e 65 64 20 43 4b 52 5f 42 55 46  returned CKR_BUF
275f0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72  FER_TOO_SMALL (r
27600 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e  v = %lu), undoin
27610 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29  g C_SignUpdate()
27620 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
27630 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09  g) sign_ret);...
27640 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
27650 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
27660 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74  _bufused = start
27670 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a  _sign_bufused;..
27680 09 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
27690 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  et);...}....CACK
276a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
276b0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e  "Error.  SignFin
276c0 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  al() returned fa
276d0 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
276e0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
276f0 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a  ng) sign_ret);..
27700 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
27710 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69  t);..}...if (pSi
27720 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29  gnature == NULL)
27730 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27740 47 5f 50 52 49 4e 54 46 28 22 70 53 69 67 6e 61  G_PRINTF("pSigna
27750 74 75 72 65 20 73 70 65 63 69 66 69 65 64 20 61  ture specified a
27760 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20  s NULL, undoing 
27770 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 29  C_SignUpdate()")
27780 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
27790 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
277a0 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74  ign_bufused = st
277b0 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
277c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  ;....return(sign
277d0 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  _ret);..}...CACK
277e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
277f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
27800 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
27810 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
27820 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
27830 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
27840 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43   C_SignUpdate)(C
27850 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
27860 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
27870 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
27880 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
27890 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
278a0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
278b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
278c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
278d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
278e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
278f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27900 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
27910 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
27920 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
27930 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
27940 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
27950 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
27960 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
27970 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
27980 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
27990 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
279a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
279b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
279c0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
279d0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
279e0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
279f0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
27a00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72  );..}...if (pPar
27a10 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50  t == NULL && ulP
27a20 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
27a30 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
27a40 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65  t if we are aske
27a50 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e  d to sign nothin
27a60 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59  g... */...CACKEY
27a70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
27a80 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
27a90 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
27aa0 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
27ab0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
27ac0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72  );..}...if (pPar
27ad0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
27ae0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27af0 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74  TF("Error. pPart
27b00 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c   is NULL, but ul
27b10 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30  PartLen is not 0
27b20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
27b30 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
27b40 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61  );..}...if (ulPa
27b50 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
27b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27b70 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61  NTF("Error. ulPa
27b80 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20  rtLen is 0, but 
27b90 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  pPart is not NUL
27ba0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
27bb0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
27bc0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
27bd0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
27be0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
27bf0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
27c00 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
27c10 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
27c20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27c30 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
27c40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
27c50 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
27c60 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
27c70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27c80 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
27c90 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
27ca0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
27cb0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
27cc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27cd0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
27ce0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
27cf0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
27d00 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
27d10 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
27d20 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
27d30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
27d40 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  gn_active) {...c
27d50 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27d60 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27d70 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
27d80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27d90 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
27da0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
27db0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
27dc0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
27dd0 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  D);..}...switch 
27de0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
27df0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
27e00 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
27e10 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
27e20 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61  :..../* Accumula
27e30 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09  te directly */..
27e40 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73 65  ..if ((cackey_se
27e50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27e60 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 20  .sign_bufused + 
27e70 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63  ulPartLen) > cac
27e80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27e90 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
27ea0 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  en) {.....cackey
27eb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27ec0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20  on].sign_buflen 
27ed0 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65  *= 2;......cacke
27ee0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27ef0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20  ion].sign_buf = 
27f00 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73  realloc(cackey_s
27f10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27f20 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65  ].sign_buf, size
27f30 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
27f40 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
27f50 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
27f60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27f70 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
27f80 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70  ;....}.....memcp
27f90 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  y(cackey_session
27fa0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
27fb0 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65  _buf + cackey_se
27fc0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27fd0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70  .sign_bufused, p
27fe0 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29  Part, ulPartLen)
27ff0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
28000 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28010 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20  sign_bufused += 
28020 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62  ulPartLen;.....b
28030 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  reak;..}...mutex
28040 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
28050 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
28060 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
28070 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
28080 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
28090 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
280a0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
280b0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
280c0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
280d0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
280e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
280f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
28100 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
28110 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
28120 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
28130 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
28140 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c  _RV, C_SignFinal
28150 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
28160 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
28170 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
28180 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
28190 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
281a0 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  en) {..static CK
281b0 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31 30 32  _BYTE sigbuf[102
281c0 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67  4];..ssize_t sig
281d0 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54  buflen;..CK_SLOT
281e0 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f  _ID slotID;..CK_
281f0 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  RV retval = CKR_
28200 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
28210 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69  int terminate_si
28220 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74  gn = 1;..int mut
28230 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
28240 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28250 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
28260 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
28270 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
28280 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28290 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
282a0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
282b0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
282c0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
282d0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
282e0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
282f0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
28300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28310 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61  "Error. pulSigna
28320 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  tureLen is NULL.
28330 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
28340 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
28350 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
28360 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
28370 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
28380 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
28390 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
283a0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
283b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
283c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
283d0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
283e0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
283f0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
28400 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
28410 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
28420 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
28430 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
28440 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
28450 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
28460 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28470 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28480 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
28490 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
284a0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
284b0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
284c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
284d0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
284e0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
284f0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
28500 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
28510 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28520 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
28530 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
28540 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28550 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
28560 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
28570 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
28580 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
28590 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
285a0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
285b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
285c0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
285d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
285e0 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
285f0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
28600 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
28610 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
28620 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
28630 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
28640 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
28650 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
28660 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
28670 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
28680 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
28690 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
286a0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
286b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
286c0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
286d0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
286e0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
286f0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
28700 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28710 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
28720 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
28730 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
28740 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
28750 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28760 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
28770 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
28780 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
28790 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
287a0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
287b0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
287c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
287d0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
287e0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
287f0 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
28800 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
28810 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
28820 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
28830 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
28840 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72  S:..../* Ask car
28850 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09  d to sign */....
28860 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28870 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f 20 73  NTF("Asking to s
28880 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69 74  ign from identit
28890 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20  y %p in session 
288a0 25 6c 75 22 2c 20 63 61 63 6b 65 79 5f 73 65 73  %lu", cackey_ses
288b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
288c0 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28  sign_identity, (
288d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
288e0 53 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67  Session);....sig
288f0 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f  buflen = cackey_
28900 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63  signdecrypt(&cac
28910 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
28920 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ], cackey_sessio
28930 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
28940 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b  n_identity, cack
28950 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28960 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20  sion].sign_buf, 
28970 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28980 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
28990 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20  ufused, sigbuf, 
289a0 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20  sizeof(sigbuf), 
289b0 31 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73  1, 0);.....if (s
289c0 69 67 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a  igbuflen < 0) {.
289d0 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66  ..../* Signing f
289e0 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66  ailed. */.....if
289f0 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43   (sigbuflen == C
28a00 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45  ACKEY_PCSC_E_NEE
28a10 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72  DLOGIN) {......r
28a20 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52  etval = CKR_USER
28a30 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a  _NOT_LOGGED_IN;.
28a40 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73  ....} else if (s
28a50 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b  igbuflen == CACK
28a60 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
28a70 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65  BSENT) {......re
28a80 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43  tval = CKR_DEVIC
28a90 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d  E_REMOVED;.....}
28aa0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74   else {......ret
28ab0 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
28ac0 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09  L_ERROR;.....}..
28ad0 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75  ..} else if (((u
28ae0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
28af0 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53  gbuflen) > *pulS
28b00 69 67 6e 61 74 75 72 65 4c 65 6e 20 26 26 20 70  ignatureLen && p
28b10 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09  Signature) {....
28b20 09 2f 2a 20 53 69 67 6e 65 64 20 64 61 74 61 20  ./* Signed data 
28b30 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09  too large */....
28b40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28b50 49 4e 54 46 28 22 72 65 74 76 61 6c 20 3d 20 43  INTF("retval = C
28b60 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
28b70 41 4c 4c 3b 20 20 73 69 67 62 75 66 6c 65 6e 20  ALL;  sigbuflen 
28b80 3d 20 25 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74  = %lu, pulSignat
28b90 75 72 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28  ureLen = %lu", (
28ba0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
28bb0 69 67 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67  igbuflen, (unsig
28bc0 6e 65 64 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69  ned long) *pulSi
28bd0 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09  gnatureLen);....
28be0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ..retval = CKR_B
28bf0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
28c00 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f  ......terminate_
28c10 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65  sign = 0;....} e
28c20 6c 73 65 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e  lse {.....termin
28c30 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09  ate_sign = 0;...
28c40 09 09 09 69 66 20 28 70 53 69 67 6e 61 74 75 72  ...if (pSignatur
28c50 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79  e) {......memcpy
28c60 28 70 53 69 67 6e 61 74 75 72 65 2c 20 73 69 67  (pSignature, sig
28c70 62 75 66 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b  buf, sigbuflen);
28c80 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e 61 74 65  .......terminate
28c90 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d  _sign = 1;.....}
28ca0 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67 6e 61 74  ......*pulSignat
28cb0 75 72 65 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c  ureLen = sigbufl
28cc0 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  en;......retval 
28cd0 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a  = CKR_OK;....}..
28ce0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69  ...break;..}...i
28cf0 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  f (terminate_sig
28d00 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  n) {...if (cacke
28d10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28d20 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b  ion].sign_buf) {
28d30 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
28d40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28d50 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09  n].sign_buf);...
28d60 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73  }....cackey_sess
28d70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
28d80 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ign_active = 0;.
28d90 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
28da0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
28db0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
28dc0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
28dd0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
28de0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28df0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28e00 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
28e10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28e20 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
28e30 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
28e40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
28e50 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69  eturning %i", (i
28e60 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  nt) retval);...r
28e70 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
28e80 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
28e90 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
28ea0 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43  gnRecoverInit)(C
28eb0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
28ec0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
28ed0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
28ee0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
28ef0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
28f00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28f10 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
28f20 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
28f30 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
28f40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28f50 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
28f60 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
28f70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
28f80 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
28f90 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
28fa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28fb0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
28fc0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
28fd0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
28fe0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
28ff0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
29000 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
29010 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29020 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
29030 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
29040 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 29 28   C_SignRecover)(
29050 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
29060 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
29070 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
29080 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
29090 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
290a0 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
290b0 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61  ONG_PTR pulSigna
290c0 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tureLen) {..CACK
290d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
290e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
290f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
29100 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
29110 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29120 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
29130 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
29140 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
29150 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
29160 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
29170 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29180 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
29190 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
291a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
291b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
291c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
291d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
291e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
291f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
29200 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
29210 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  ifyInit)(CK_SESS
29220 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
29230 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
29240 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
29250 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
29260 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
29270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29280 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
29290 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
292a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
292b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
292c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
292d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
292e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
292f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
29300 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
29310 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29320 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
29330 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29340 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
29350 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29360 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
29370 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
29380 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
29390 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
293a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
293b0 69 66 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ify)(CK_SESSION_
293c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
293d0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
293e0 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
293f0 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
29400 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
29410 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
29420 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tureLen) {..CACK
29430 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29440 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
29450 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
29460 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
29470 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29480 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
29490 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
294a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
294b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
294c0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
294d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
294e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
294f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29500 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
29510 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29520 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
29530 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
29540 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
29550 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
29560 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
29570 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45  ifyUpdate)(CK_SE
29580 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
29590 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
295a0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
295b0 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  NG ulPartLen) {.
295c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
295d0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
295e0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
295f0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
29600 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29610 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
29620 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
29630 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
29640 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
29650 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
29660 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29670 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
29680 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29690 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
296a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
296b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
296c0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
296d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
296e0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
296f0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
29700 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 29 28 43  C_VerifyFinal)(C
29710 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
29720 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
29730 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
29740 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
29750 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43  gnatureLen) {..C
29760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29770 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
29780 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
29790 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
297a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
297b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
297c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
297d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
297e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
297f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
29800 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29810 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
29820 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29830 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
29840 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29850 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
29860 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
29870 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
29880 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
29890 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
298a0 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69  VerifyRecoverIni
298b0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
298c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
298d0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
298e0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
298f0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
29900 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
29910 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
29920 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
29930 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
29940 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29950 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29960 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
29970 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
29980 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
29990 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
299a0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
299b0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
299c0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
299d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
299e0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
299f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
29a00 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
29a10 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29a20 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
29a30 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
29a40 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63  _RV, C_VerifyRec
29a50 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e  over)(CK_SESSION
29a60 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
29a70 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
29a80 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
29a90 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  NG ulSignatureLe
29aa0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
29ab0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
29ac0 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b  TR pulDataLen) {
29ad0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29ae0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
29af0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
29b00 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
29b10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29b20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
29b30 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
29b40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29b50 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
29b60 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
29b70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29b80 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
29b90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29ba0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
29bb0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29bc0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
29bd0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
29be0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29bf0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
29c00 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
29c10 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74   C_DigestEncrypt
29c20 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
29c30 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29c40 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
29c50 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
29c60 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  ulPartLen, CK_BY
29c70 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
29c80 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
29c90 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
29ca0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
29cb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29cc0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
29cd0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
29ce0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
29cf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29d00 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
29d10 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
29d20 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
29d30 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
29d40 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
29d50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29d60 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
29d70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29d80 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
29d90 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29da0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
29db0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
29dc0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
29dd0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
29de0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
29df0 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65  ryptDigestUpdate
29e00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
29e10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
29e20 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
29e30 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
29e40 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
29e50 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
29e60 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
29e70 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
29e80 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
29e90 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
29ea0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
29eb0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
29ec0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29ed0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29ee0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
29ef0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
29f00 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
29f10 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
29f20 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
29f30 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
29f40 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
29f50 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
29f60 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
29f70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
29f80 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
29f90 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29fa0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
29fb0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
29fc0 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79  _RV, C_SignEncry
29fd0 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
29fe0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
29ff0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2a000 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
2a010 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  G ulPartLen, CK_
2a020 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
2a030 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
2a040 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
2a050 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
2a060 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a070 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2a080 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2a090 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2a0a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a0b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2a0c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2a0d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2a0e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2a0f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2a100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a110 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2a120 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a130 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2a140 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2a150 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2a160 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2a170 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2a180 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2a190 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2a1a0 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61  ecryptVerifyUpda
2a1b0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
2a1c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2a1d0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
2a1e0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
2a1f0 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
2a200 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
2a210 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
2a220 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
2a230 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2a240 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2a250 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2a260 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2a270 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2a280 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a290 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2a2a0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2a2b0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2a2c0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2a2d0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2a2e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2a2f0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2a300 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2a310 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2a320 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a330 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2a340 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2a350 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2a360 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2a370 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
2a380 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  eKey)(CK_SESSION
2a390 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2a3a0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2a3b0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2a3c0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
2a3d0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
2a3e0 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f  ONG ulCount, CK_
2a3f0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
2a400 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  R phKey) {..CACK
2a410 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a420 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2a430 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2a440 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2a450 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a460 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2a470 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2a480 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2a490 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2a4a0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2a4b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2a4c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2a4d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a4e0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2a4f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a500 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2a510 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2a520 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2a530 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2a540 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
2a550 65 72 61 74 65 4b 65 79 50 61 69 72 29 28 43 4b  erateKeyPair)(CK
2a560 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2a570 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2a580 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2a590 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42  anism, CK_ATTRIB
2a5a0 55 54 45 5f 50 54 52 20 70 50 75 62 6c 69 63 4b  UTE_PTR pPublicK
2a5b0 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55  eyTemplate, CK_U
2a5c0 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b 65 79  LONG ulPublicKey
2a5d0 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
2a5e0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
2a5f0 20 70 50 72 69 76 61 74 65 4b 65 79 54 65 6d 70   pPrivateKeyTemp
2a600 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
2a610 6c 50 72 69 76 61 74 65 4b 65 79 41 74 74 72 69  lPrivateKeyAttri
2a620 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  buteCount, CK_OB
2a630 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
2a640 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f  phPublicKey, CK_
2a650 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
2a660 52 20 70 68 50 72 69 76 61 74 65 4b 65 79 29 20  R phPrivateKey) 
2a670 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2a680 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2a690 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2a6a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2a6b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a6c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2a6d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2a6e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a6f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2a700 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2a710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a720 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2a730 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2a740 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2a750 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2a760 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2a770 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2a780 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2a790 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2a7a0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2a7b0 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f  , C_WrapKey)(CK_
2a7c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2a7d0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2a7e0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2a7f0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2a800 48 41 4e 44 4c 45 20 68 57 72 61 70 70 69 6e 67  HANDLE hWrapping
2a810 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Key, CK_OBJECT_H
2a820 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42  ANDLE hKey, CK_B
2a830 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65 64  YTE_PTR pWrapped
2a840 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  Key, CK_ULONG_PT
2a850 52 20 70 75 6c 57 72 61 70 70 65 64 4b 65 79 4c  R pulWrappedKeyL
2a860 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2a870 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2a880 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2a890 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2a8a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a8b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a8c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2a8d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a8e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2a8f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2a900 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2a910 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a920 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2a930 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2a940 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2a950 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a960 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2a970 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a980 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2a990 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2a9a0 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65  K_RV, C_UnwrapKe
2a9b0 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
2a9c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2a9d0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2a9e0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
2a9f0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e  BJECT_HANDLE hUn
2aa00 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f  wrappingKey, CK_
2aa10 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65  BYTE_PTR pWrappe
2aa20 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  dKey, CK_ULONG u
2aa30 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20  lWrappedKeyLen, 
2aa40 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
2aa50 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
2aa60 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65  LONG ulAttribute
2aa70 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
2aa80 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65  _HANDLE_PTR phKe
2aa90 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
2aaa0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2aab0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2aac0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2aad0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2aae0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2aaf0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2ab00 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2ab10 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2ab20 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2ab30 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2ab40 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2ab50 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2ab60 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2ab70 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2ab80 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2ab90 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2aba0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2abb0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2abc0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2abd0 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 4b 65 79  _RV, C_DeriveKey
2abe0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2abf0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2ac00 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
2ac10 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
2ac20 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 42 61 73  JECT_HANDLE hBas
2ac30 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49 42 55  eKey, CK_ATTRIBU
2ac40 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
2ac50 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74  , CK_ULONG ulAtt
2ac60 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
2ac70 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
2ac80 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  R phKey) {..CACK
2ac90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2aca0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2acb0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2acc0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2acd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ace0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2acf0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2ad00 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2ad10 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2ad20 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2ad30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2ad40 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2ad50 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2ad60 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2ad70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2ad80 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2ad90 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2ada0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2adb0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2adc0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65  ION(CK_RV, C_See
2add0 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53  dRandom)(CK_SESS
2ade0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2adf0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2ae00 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47   pSeed, CK_ULONG
2ae10 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43   ulSeedLen) {..C
2ae20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ae30 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2ae40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2ae50 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2ae60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ae70 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2ae80 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2ae90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2aea0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2aeb0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2aec0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2aed0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2aee0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2aef0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2af00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2af10 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2af20 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2af30 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2af40 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2af50 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2af60 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 29 28  GenerateRandom)(
2af70 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2af80 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2af90 59 54 45 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44  YTE_PTR pRandomD
2afa0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
2afb0 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41  RandomLen) {..CA
2afc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2afd0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2afe0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2aff0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2b000 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b010 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2b020 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2b030 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2b040 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2b050 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2b060 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b070 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2b080 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2b090 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2b0a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2b0b0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2b0c0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2b0d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2b0e0 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64  }../* Deprecated
2b0f0 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f   Function */.CK_
2b100 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2b110 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63  CK_RV, C_GetFunc
2b120 74 69 6f 6e 53 74 61 74 75 73 29 28 43 4b 5f 53  tionStatus)(CK_S
2b130 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2b140 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45  ession) {..CACKE
2b150 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b160 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43  Called.");...CAC
2b170 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b180 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2b190 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
2b1a0 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52  ALLEL (%i)", CKR
2b1b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
2b1c0 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72  RALLEL);...retur
2b1d0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2b1e0 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
2b1f0 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73  hSession = hSess
2b200 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20  ion; /* Supress 
2b210 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20  unused variable 
2b220 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a  warning */.}../*
2b230 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63   Deprecated Func
2b240 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  tion */.CK_DEFIN
2b250 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2b260 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  , C_CancelFuncti
2b270 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  on)(CK_SESSION_H
2b280 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
2b290 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2b2a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2b2b0 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
2b2c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2b2d0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2b2e0 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25  _NOT_PARALLEL (%
2b2f0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2b300 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
2b310 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2b320 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
2b330 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e  LEL);...hSession
2b340 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20   = hSession; /* 
2b350 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76  Supress unused v
2b360 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20  ariable warning 
2b370 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  */.}..CK_DEFINE_
2b380 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2b390 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73  C_GetFunctionLis
2b3a0 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c  t)(CK_FUNCTION_L
2b3b0 49 53 54 5f 50 54 52 5f 50 54 52 20 70 70 46 75  IST_PTR_PTR ppFu
2b3c0 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43  nctionList) {..C
2b3d0 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f  K_FUNCTION_LIST_
2b3e0 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73  PTR pFunctionLis
2b3f0 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
2b400 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2b410 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e  .");...if (ppFun
2b420 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c  ctionList == NUL
2b430 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2b440 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b450 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r. ppFunctionLis
2b460 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
2b470 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2b480 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2b490 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  .pFunctionList =
2b4a0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
2b4b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b  pFunctionList));
2b4c0 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ...pFunctionList
2b4d0 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  ->version.major 
2b4e0 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54  = ((CACKEY_CRYPT
2b4f0 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45  OKI_VERSION_CODE
2b500 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
2b510 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2b520 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  >version.minor =
2b530 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
2b540 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
2b550 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
2b560 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2b570 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43  C_Initialize = C
2b580 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46  _Initialize;..pF
2b590 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
2b5a0 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61  inalize = C_Fina
2b5b0 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  lize;..pFunction
2b5c0 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20  List->C_GetInfo 
2b5d0 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46  = C_GetInfo;..pF
2b5e0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2b5f0 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47  etSlotList = C_G
2b600 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75  etSlotList;..pFu
2b610 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2b620 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65  tSlotInfo = C_Ge
2b630 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e  tSlotInfo;..pFun
2b640 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2b650 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65  TokenInfo = C_Ge
2b660 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75  tTokenInfo;..pFu
2b670 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61  nctionList->C_Wa
2b680 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d  itForSlotEvent =
2b690 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76   C_WaitForSlotEv
2b6a0 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ent;..pFunctionL
2b6b0 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e  ist->C_GetMechan
2b6c0 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d  ismList = C_GetM
2b6d0 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70  echanismList;..p
2b6e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2b6f0 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
2b700 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73   = C_GetMechanis
2b710 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  mInfo;..pFunctio
2b720 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b  nList->C_InitTok
2b730 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e  en = C_InitToken
2b740 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2b750 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f  ->C_InitPIN = C_
2b760 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  InitPIN;..pFunct
2b770 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49  ionList->C_SetPI
2b780 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70  N = C_SetPIN;..p
2b790 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2b7a0 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f  OpenSession = C_
2b7b0 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46  OpenSession;..pF
2b7c0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
2b7d0 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f  loseSession = C_
2b7e0 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70  CloseSession;..p
2b7f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2b800 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
2b810 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73   = C_CloseAllSes
2b820 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f  sions;..pFunctio
2b830 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65 73 73  nList->C_GetSess
2b840 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53  ionInfo = C_GetS
2b850 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75  essionInfo;..pFu
2b860 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2b870 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20  tOperationState 
2b880 3d 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e  = C_GetOperation
2b890 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  State;..pFunctio
2b8a0 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72  nList->C_SetOper
2b8b0 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53  ationState = C_S
2b8c0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
2b8d0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2b8e0 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f  ->C_Login = C_Lo
2b8f0 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  gin;..pFunctionL
2b900 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20  ist->C_Logout = 
2b910 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63  C_Logout;..pFunc
2b920 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61  tionList->C_Crea
2b930 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72 65  teObject = C_Cre
2b940 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e  ateObject;..pFun
2b950 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70  ctionList->C_Cop
2b960 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79  yObject = C_Copy
2b970 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
2b980 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f  onList->C_Destro
2b990 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65 73 74  yObject = C_Dest
2b9a0 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e  royObject;..pFun
2b9b0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2b9c0 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f 47  ObjectSize = C_G
2b9d0 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70  etObjectSize;..p
2b9e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2b9f0 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
2ba00 65 20 3d 20 43 5f 47 65 74 41 74 74 72 69 62 75  e = C_GetAttribu
2ba10 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74  teValue;..pFunct
2ba20 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74  ionList->C_SetAt
2ba30 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
2ba40 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _SetAttributeVal
2ba50 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
2ba60 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
2ba70 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62  sInit = C_FindOb
2ba80 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e  jectsInit;..pFun
2ba90 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
2baa0 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e  dObjects = C_Fin
2bab0 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63  dObjects;..pFunc
2bac0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64  tionList->C_Find
2bad0 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20 43  ObjectsFinal = C
2bae0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61  _FindObjectsFina
2baf0 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
2bb00 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69 74  t->C_EncryptInit
2bb10 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74   = C_EncryptInit
2bb20 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2bb30 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f  ->C_Encrypt = C_
2bb40 45 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74  Encrypt;..pFunct
2bb50 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
2bb60 70 74 55 70 64 61 74 65 20 3d 20 43 5f 45 6e 63  ptUpdate = C_Enc
2bb70 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
2bb80 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
2bb90 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45  cryptFinal = C_E
2bba0 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46  ncryptFinal;..pF
2bbb0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
2bbc0 65 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 44  ecryptInit = C_D
2bbd0 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75  ecryptInit;..pFu
2bbe0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
2bbf0 63 72 79 70 74 20 3d 20 43 5f 44 65 63 72 79 70  crypt = C_Decryp
2bc00 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2bc10 74 2d 3e 43 5f 44 65 63 72 79 70 74 55 70 64 61  t->C_DecryptUpda
2bc20 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70  te = C_DecryptUp
2bc30 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
2bc40 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 46  List->C_DecryptF
2bc50 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79 70 74  inal = C_Decrypt
2bc60 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
2bc70 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 49  nList->C_DigestI
2bc80 6e 69 74 20 3d 20 43 5f 44 69 67 65 73 74 49 6e  nit = C_DigestIn
2bc90 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
2bca0 73 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20 43  st->C_Digest = C
2bcb0 5f 44 69 67 65 73 74 3b 0a 09 70 46 75 6e 63 74  _Digest;..pFunct
2bcc0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
2bcd0 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65  tUpdate = C_Dige
2bce0 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  stUpdate;..pFunc
2bcf0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
2bd00 73 74 4b 65 79 20 3d 20 43 5f 44 69 67 65 73 74  stKey = C_Digest
2bd10 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
2bd20 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e  ist->C_DigestFin
2bd30 61 6c 20 3d 20 43 5f 44 69 67 65 73 74 46 69 6e  al = C_DigestFin
2bd40 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
2bd50 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d  st->C_SignInit =
2bd60 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46   C_SignInit;..pF
2bd70 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
2bd80 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70  ign = C_Sign;..p
2bd90 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2bda0 53 69 67 6e 55 70 64 61 74 65 20 3d 20 43 5f 53  SignUpdate = C_S
2bdb0 69 67 6e 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  ignUpdate;..pFun
2bdc0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
2bdd0 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46  nFinal = C_SignF
2bde0 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
2bdf0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f  List->C_SignReco
2be00 76 65 72 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e  verInit = C_Sign
2be10 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46  RecoverInit;..pF
2be20 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
2be30 69 67 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f 53  ignRecover = C_S
2be40 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46 75  ignRecover;..pFu
2be50 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
2be60 72 69 66 79 49 6e 69 74 20 3d 20 43 5f 56 65 72  rifyInit = C_Ver
2be70 69 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  ifyInit;..pFunct
2be80 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
2be90 79 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09 70  y = C_Verify;..p
2bea0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2beb0 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43  VerifyUpdate = C
2bec0 5f 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09  _VerifyUpdate;..
2bed0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2bee0 5f 56 65 72 69 66 79 46 69 6e 61 6c 20 3d 20 43  _VerifyFinal = C
2bef0 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70  _VerifyFinal;..p
2bf00 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2bf10 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69  VerifyRecoverIni
2bf20 74 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f  t = C_VerifyReco
2bf30 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  verInit;..pFunct
2bf40 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
2bf50 79 52 65 63 6f 76 65 72 20 3d 20 43 5f 56 65 72  yRecover = C_Ver
2bf60 69 66 79 52 65 63 6f 76 65 72 3b 0a 09 70 46 75  ifyRecover;..pFu
2bf70 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
2bf80 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74  gestEncryptUpdat
2bf90 65 20 3d 20 43 5f 44 69 67 65 73 74 45 6e 63 72  e = C_DigestEncr
2bfa0 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  yptUpdate;..pFun
2bfb0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
2bfc0 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65  ryptDigestUpdate
2bfd0 20 3d 20 43 5f 44 65 63 72 79 70 74 44 69 67 65   = C_DecryptDige
2bfe0 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  stUpdate;..pFunc
2bff0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
2c000 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  EncryptUpdate = 
2c010 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
2c020 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2c030 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 56 65  ist->C_DecryptVe
2c040 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 44  rifyUpdate = C_D
2c050 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61  ecryptVerifyUpda
2c060 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
2c070 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65  st->C_GenerateKe
2c080 79 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  y = C_GenerateKe
2c090 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
2c0a0 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  t->C_GenerateKey
2c0b0 50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72 61 74  Pair = C_Generat
2c0c0 65 4b 65 79 50 61 69 72 3b 0a 09 70 46 75 6e 63  eKeyPair;..pFunc
2c0d0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70  tionList->C_Wrap
2c0e0 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b  Key = C_WrapKey;
2c0f0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2c100 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20 43  >C_UnwrapKey = C
2c110 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46 75  _UnwrapKey;..pFu
2c120 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
2c130 72 69 76 65 4b 65 79 20 3d 20 43 5f 44 65 72 69  riveKey = C_Deri
2c140 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  veKey;..pFunctio
2c150 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e  nList->C_SeedRan
2c160 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e 64  dom = C_SeedRand
2c170 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  om;..pFunctionLi
2c180 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52 61  st->C_GenerateRa
2c190 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74  ndom = C_Generat
2c1a0 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74  eRandom;..pFunct
2c1b0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75  ionList->C_GetFu
2c1c0 6e 63 74 69 6f 6e 53 74 61 74 75 73 20 3d 20 43  nctionStatus = C
2c1d0 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74  _GetFunctionStat
2c1e0 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  us;..pFunctionLi
2c1f0 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63  st->C_CancelFunc
2c200 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46  tion = C_CancelF
2c210 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  unction;..pFunct
2c220 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75  ionList->C_GetFu
2c230 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47  nctionList = C_G
2c240 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a  etFunctionList;.
2c250 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  ..*ppFunctionLis
2c260 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t = pFunctionLis
2c270 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
2c280 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2c290 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
2c2a0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
2c2b0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..