Hex Artifact Content

Artifact 5510d07f5c7f15435b3c39a9dcc07d8009e1e30b:


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 73 74 64 65 72  }; fprintf(stder
1430: 72 2c 20 22 5b 25 6c 75 5d 3a 20 22 2c 20 28 75  r, "[%lu]: ", (u
1440: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 74  nsigned long) (t
1450: 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61 63 6b  ime(NULL) - cack
1460: 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74  ey_debug_start_t
1470: 69 6d 65 29 29 3b 20 7d 0a 23 20 20 65 6c 73 65  ime)); }.#  else
1480: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 43 41 43  .#    define CAC
1490: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
14a0: 49 4d 45 20 2f 2a 2a 2f 0a 23 20 20 65 6e 64 69  IME /**/.#  endi
14b0: 66 0a 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  f..#  define CAC
14c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14d0: 28 78 2e 2e 2e 29 20 7b 20 43 41 43 4b 45 59 5f  (x...) { CACKEY_
14e0: 44 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b  DEBUG_PRINTTIME;
14f0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1500: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f   "%s():%i: ", __
1510: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
1520: 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  ); fprintf(stder
1530: 72 2c 20 78 29 3b 20 66 70 72 69 6e 74 66 28 73  r, x); fprintf(s
1540: 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 20 66 66  tderr, "\n"); ff
1550: 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a  lush(stderr); }.
1560: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
1570: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
1580: 66 2c 20 78 2c 20 79 29 20 7b 20 75 6e 73 69 67  f, x, y) { unsig
1590: 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46  ned char *TMPBUF
15a0: 3b 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ; unsigned long 
15b0: 69 64 78 3b 20 54 4d 50 42 55 46 20 3d 20 28 75  idx; TMPBUF = (u
15c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
15d0: 28 78 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55  (x); CACKEY_DEBU
15e0: 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20 66 70 72  G_PRINTTIME; fpr
15f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
1600: 28 29 3a 25 69 3a 20 25 73 20 20 28 25 73 2f 25  ():%i: %s  (%s/%
1610: 6c 75 20 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66  lu = {%02x", __f
1620: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c  unc__, __LINE__,
1630: 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e 65   f, #x, (unsigne
1640: 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50  d long) (y), TMP
1650: 42 55 46 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64  BUF[0]); for (id
1660: 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29  x = 1; idx < (y)
1670: 3b 20 69 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e  ; idx++) { fprin
1680: 74 66 28 73 74 64 65 72 72 2c 20 22 2c 20 25 30  tf(stderr, ", %0
1690: 32 78 22 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d  2x", TMPBUF[idx]
16a0: 29 3b 20 7d 3b 20 66 70 72 69 6e 74 66 28 73 74  ); }; fprintf(st
16b0: 64 65 72 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 66  derr, "})\n"); f
16c0: 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d  flush(stderr); }
16d0: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
16e0: 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28 78  Y_DEBUG_PERROR(x
16f0: 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65  ) { fprintf(stde
1700: 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c  rr, "%s():%i: ",
1710: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
1720: 45 5f 5f 29 3b 20 43 41 43 4b 45 59 5f 44 45 42  E__); CACKEY_DEB
1730: 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20 70 65  UG_PRINTTIME; pe
1740: 72 72 6f 72 28 78 29 3b 20 66 66 6c 75 73 68 28  rror(x); fflush(
1750: 73 74 64 65 72 72 29 3b 20 7d 0a 23 20 20 64 65  stderr); }.#  de
1760: 66 69 6e 65 20 66 72 65 65 28 78 29 20 7b 20 43  fine free(x) { C
1770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1780: 54 46 28 22 46 52 45 45 28 25 70 29 20 28 25 73  TF("FREE(%p) (%s
1790: 29 22 2c 20 78 2c 20 23 78 29 3b 20 66 72 65 65  )", x, #x); free
17a0: 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69 63 20 76  (x); }..static v
17b0: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  oid *CACKEY_DEBU
17c0: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69  G_FUNC_MALLOC(si
17d0: 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74  ze_t size, const
17e0: 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74   char *func, int
17f0: 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a   line) {..void *
1800: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c  retval;...retval
1810: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b   = malloc(size);
1820: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1830: 50 52 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69  PRINTTIME;..fpri
1840: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28  ntf(stderr, "%s(
1850: 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c  ):%i: ", func, l
1860: 69 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 73  ine);..fprintf(s
1870: 74 64 65 72 72 2c 20 22 4d 41 4c 4c 4f 43 28 29  tderr, "MALLOC()
1880: 20 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29 3b   = %p", retval);
1890: 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
18a0: 2c 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68  , "\n");..fflush
18b0: 28 73 74 64 65 72 72 29 3b 0a 0a 09 72 65 74 75  (stderr);...retu
18c0: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73  rn(retval);.}..s
18d0: 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b  tatic void *CACK
18e0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45  EY_DEBUG_FUNC_RE
18f0: 41 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c  ALLOC(void *ptr,
1900: 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f   size_t size, co
1910: 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20  nst char *func, 
1920: 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69  int line) {..voi
1930: 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74  d *retval;...ret
1940: 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 70 74  val = realloc(pt
1950: 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28  r, size);...if (
1960: 72 65 74 76 61 6c 20 21 3d 20 70 74 72 29 20 7b  retval != ptr) {
1970: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1980: 50 52 49 4e 54 54 49 4d 45 3b 0a 09 09 66 70 72  PRINTTIME;...fpr
1990: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
19a0: 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20  ():%i: ", func, 
19b0: 6c 69 6e 65 29 3b 0a 09 09 66 70 72 69 6e 74 66  line);...fprintf
19c0: 28 73 74 64 65 72 72 2c 20 22 52 45 41 4c 4c 4f  (stderr, "REALLO
19d0: 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70 74 72  C(%p) = %p", ptr
19e0: 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 70 72  , retval);...fpr
19f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e  intf(stderr, "\n
1a00: 22 29 3b 0a 09 09 66 66 6c 75 73 68 28 73 74 64  ");...fflush(std
1a10: 65 72 72 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72  err);..}...if (r
1a20: 65 74 76 61 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b  etval == NULL) {
1a30: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a40: 50 52 49 4e 54 46 28 22 20 2a 2a 2a 20 45 52 52  PRINTF(" *** ERR
1a50: 4f 52 20 2a 2a 2a 20 72 65 61 6c 6c 6f 63 20 72  OR *** realloc r
1a60: 65 74 75 72 6e 65 64 20 4e 55 4c 4c 20 28 73 69  eturned NULL (si
1a70: 7a 65 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73  ze = %lu)", (uns
1a80: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65  igned long) size
1a90: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72  );..}...return(r
1aa0: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
1ab0: 63 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  c char *CACKEY_D
1ac0: 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50  EBUG_FUNC_STRDUP
1ad0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 74 72  (const char *ptr
1ae0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75  , const char *fu
1af0: 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a  nc, int line) {.
1b00: 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b 0a 0a  .char *retval;..
1b10: 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64 75 70  .retval = strdup
1b20: 28 70 74 72 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  (ptr);...CACKEY_
1b30: 44 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b  DEBUG_PRINTTIME;
1b40: 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
1b50: 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 66  , "%s():%i: ", f
1b60: 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 66 70 72  unc, line);..fpr
1b70: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 54  intf(stderr, "ST
1b80: 52 44 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20  RDUP_MALLOC() = 
1b90: 25 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66  %p", retval);..f
1ba0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1bb0: 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 73 74  \n");..fflush(st
1bc0: 64 65 72 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28  derr);...return(
1bd0: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74  retval);.}..stat
1be0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43  ic const char *C
1bf0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
1c00: 5f 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e 73 69  _TAG_TO_STR(unsi
1c10: 67 6e 65 64 20 63 68 61 72 20 74 61 67 29 20 7b  gned char tag) {
1c20: 0a 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b  ..switch (tag) {
1c30: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1c40: 47 5f 43 41 52 44 49 44 3a 0a 09 09 09 72 65 74  G_CARDID:....ret
1c50: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
1c60: 41 52 44 49 44 22 29 3b 0a 09 09 63 61 73 65 20  ARDID");...case 
1c70: 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45  GSCIS_TAG_CCC_VE
1c80: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  R:....return("GS
1c90: 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 22  CIS_TAG_CCC_VER"
1ca0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1cb0: 54 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09 09 09  TAG_CCG_VER:....
1cc0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1cd0: 47 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09 09 63  G_CCG_VER");...c
1ce0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
1cf0: 52 44 55 52 4c 3a 0a 09 09 09 72 65 74 75 72 6e  RDURL:....return
1d00: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  ("GSCIS_TAG_CARD
1d10: 55 52 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53  URL");...case GS
1d20: 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a  CIS_TAG_PKCS15:.
1d30: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1d40: 5f 54 41 47 5f 50 4b 43 53 31 35 22 29 3b 0a 09  _TAG_PKCS15");..
1d50: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1d60: 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a  REG_DATA_MODEL:.
1d70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1d80: 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f  _TAG_REG_DATA_MO
1d90: 44 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53  DEL");...case GS
1da0: 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c  CIS_TAG_ACR_TABL
1db0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1dc0: 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c  CIS_TAG_ACR_TABL
1dd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
1de0: 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 3a  S_TAG_CARD_APDU:
1df0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
1e00: 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 22  S_TAG_CARD_APDU"
1e10: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1e20: 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 3a  TAG_REDIRECTION:
1e30: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
1e40: 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f  S_TAG_REDIRECTIO
1e50: 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  N");...case GSCI
1e60: 53 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72 65 74  S_TAG_CT:....ret
1e70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
1e80: 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  T");...case GSCI
1e90: 53 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72 65 74  S_TAG_ST:....ret
1ea0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
1eb0: 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  T");...case GSCI
1ec0: 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a 0a 09  S_TAG_NEXTCCC:..
1ed0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1ee0: 54 41 47 5f 4e 45 58 54 43 43 43 22 29 3b 0a 09  TAG_NEXTCCC");..
1ef0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1f00: 46 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e  FNAME:....return
1f10: 28 22 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d  ("GSCIS_TAG_FNAM
1f20: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
1f30: 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09  S_TAG_MNAME:....
1f40: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1f50: 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73  G_MNAME");...cas
1f60: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  e GSCIS_TAG_LNAM
1f70: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1f80: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22 29 3b  CIS_TAG_LNAME");
1f90: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1fa0: 47 5f 53 55 46 46 49 58 3a 0a 09 09 09 72 65 74  G_SUFFIX:....ret
1fb0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
1fc0: 55 46 46 49 58 22 29 3b 0a 09 09 63 61 73 65 20  UFFIX");...case 
1fd0: 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41  GSCIS_TAG_GOVT_A
1fe0: 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e  GENCY:....return
1ff0: 28 22 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54  ("GSCIS_TAG_GOVT
2000: 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73  _AGENCY");...cas
2010: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  e GSCIS_TAG_BURE
2020: 41 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  AU:....return("G
2030: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 22  SCIS_TAG_BUREAU"
2040: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2050: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 3a  TAG_BUREAU_CODE:
2060: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2070: 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44  S_TAG_BUREAU_COD
2080: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2090: 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 3a  S_TAG_DEPT_CODE:
20a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
20b0: 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 22  S_TAG_DEPT_CODE"
20c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
20d0: 54 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09 72 65  TAG_TITLE:....re
20e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
20f0: 54 49 54 4c 45 22 29 3b 0a 09 09 63 61 73 65 20  TITLE");...case 
2100: 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49  GSCIS_TAG_BUILDI
2110: 4e 47 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  NG:....return("G
2120: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
2130: 47 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  G");...case GSCI
2140: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44  S_TAG_OFFICE_ADD
2150: 52 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  R1:....return("G
2160: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2170: 41 44 44 52 31 22 29 3b 0a 09 09 63 61 73 65 20  ADDR1");...case 
2180: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2190: 5f 41 44 44 52 32 3a 0a 09 09 09 72 65 74 75 72  _ADDR2:....retur
21a0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
21b0: 49 43 45 5f 41 44 44 52 32 22 29 3b 0a 09 09 63  ICE_ADDR2");...c
21c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
21d0: 46 49 43 45 5f 43 49 54 59 3a 0a 09 09 09 72 65  FICE_CITY:....re
21e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
21f0: 4f 46 46 49 43 45 5f 43 49 54 59 22 29 3b 0a 09  OFFICE_CITY");..
2200: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2210: 4f 46 46 49 43 45 5f 53 54 41 54 45 3a 0a 09 09  OFFICE_STATE:...
2220: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2230: 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 22  AG_OFFICE_STATE"
2240: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2250: 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 3a 0a  TAG_OFFICE_ZIP:.
2260: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2270: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 22  _TAG_OFFICE_ZIP"
2280: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2290: 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54  TAG_OFFICE_COUNT
22a0: 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  RY:....return("G
22b0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
22c0: 43 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63 61 73  COUNTRY");...cas
22d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
22e0: 43 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72 65 74  CE_PHONE:....ret
22f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2300: 46 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b 0a 09  FFICE_PHONE");..
2310: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2320: 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54  OFFICE_PHONE_EXT
2330: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2340: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
2350: 4f 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63 61 73  ONE_EXT");...cas
2360: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2370: 43 45 5f 46 41 58 3a 0a 09 09 09 72 65 74 75 72  CE_FAX:....retur
2380: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2390: 49 43 45 5f 46 41 58 22 29 3b 0a 09 09 63 61 73  ICE_FAX");...cas
23a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
23b0: 43 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72 65 74  CE_EMAIL:....ret
23c0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
23d0: 46 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b 0a 09  FFICE_EMAIL");..
23e0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
23f0: 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09  OFFICE_ROOM:....
2400: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2410: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22 29 3b  G_OFFICE_ROOM");
2420: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2430: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 3a  G_NONGOV_AGENCY:
2440: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2450: 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45  S_TAG_NONGOV_AGE
2460: 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  NCY");...case GS
2470: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
2480: 47 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74 75 72  GNATOR:....retur
2490: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  n("GSCIS_TAG_SSN
24a0: 5f 44 45 53 49 47 4e 41 54 4f 52 22 29 3b 0a 09  _DESIGNATOR");..
24b0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
24c0: 53 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  SSN:....return("
24d0: 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 22 29 3b  GSCIS_TAG_SSN");
24e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
24f0: 47 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75 72 6e  G_DOB:....return
2500: 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 22  ("GSCIS_TAG_DOB"
2510: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2520: 54 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09 09 72  TAG_GENDER:....r
2530: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2540: 5f 47 45 4e 44 45 52 22 29 3b 0a 09 09 63 61 73  _GENDER");...cas
2550: 65 20 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52  e GSCIS_TAG_USER
2560: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
2570: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 22  SCIS_TAG_USERID"
2580: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2590: 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09 09 72  TAG_DOMAIN:....r
25a0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
25b0: 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63 61 73  _DOMAIN");...cas
25c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53  e GSCIS_TAG_PASS
25d0: 57 4f 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  WORD:....return(
25e0: 22 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57  "GSCIS_TAG_PASSW
25f0: 4f 52 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ORD");...case GS
2600: 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44  CIS_TAG_ISSUERID
2610: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2620: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 22  IS_TAG_ISSUERID"
2630: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2640: 54 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09 72 65  TAG_SERNO:....re
2650: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2660: 53 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73 65 20  SERNO");...case 
2670: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f  GSCIS_TAG_ISSUE_
2680: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
2690: 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45  "GSCIS_TAG_ISSUE
26a0: 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  _DATE");...case 
26b0: 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45  GSCIS_TAG_EXPIRE
26c0: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
26d0: 28 22 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  ("GSCIS_TAG_EXPI
26e0: 52 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  RE_DATE");...cas
26f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
2700: 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e  _TYPE:....return
2710: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  ("GSCIS_TAG_CARD
2720: 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20  _TYPE");...case 
2730: 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49  GSCIS_TAG_SECURI
2740: 54 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  TY_CODE:....retu
2750: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45  rn("GSCIS_TAG_SE
2760: 43 55 52 49 54 59 5f 43 4f 44 45 22 29 3b 0a 09  CURITY_CODE");..
2770: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2780: 43 41 52 44 49 44 5f 41 49 44 3a 0a 09 09 09 72  CARDID_AID:....r
2790: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
27a0: 5f 43 41 52 44 49 44 5f 41 49 44 22 29 3b 0a 09  _CARDID_AID");..
27b0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
27c0: 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09  CERTIFICATE:....
27d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
27e0: 47 5f 43 45 52 54 49 46 49 43 41 54 45 22 29 3b  G_CERTIFICATE");
27f0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2800: 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54  G_CERT_ISSUE_DAT
2810: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2820: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53  CIS_TAG_CERT_ISS
2830: 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  UE_DATE");...cas
2840: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
2850: 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09  _EXPIRE_DATE:...
2860: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2870: 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44  AG_CERT_EXPIRE_D
2880: 41 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  ATE");..}...retu
2890: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d  rn("UNKNOWN");.}
28a0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
28b0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
28c0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
28d0: 54 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65 74 63  TO_STR(LONG retc
28e0: 6f 64 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28  ode) {..switch (
28f0: 72 65 74 63 6f 64 65 29 20 7b 0a 09 09 63 61 73  retcode) {...cas
2900: 65 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  e SCARD_S_SUCCES
2910: 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  S:....return("SC
2920: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 22 29 3b  ARD_S_SUCCESS");
2930: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2940: 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65  CANCELLED:....re
2950: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41  turn("SCARD_E_CA
2960: 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73  NCELLED");...cas
2970: 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44  e SCARD_E_CANT_D
2980: 49 53 50 4f 53 45 3a 0a 09 09 09 72 65 74 75 72  ISPOSE:....retur
2990: 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f  n("SCARD_E_CANT_
29a0: 44 49 53 50 4f 53 45 22 29 3b 0a 09 09 63 61 73  DISPOSE");...cas
29b0: 65 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46  e SCARD_E_INSUFF
29c0: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 3a 0a 09  ICIENT_BUFFER:..
29d0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
29e0: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
29f0: 55 46 46 45 52 22 29 3b 0a 09 09 63 61 73 65 20  UFFER");...case 
2a00: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2a10: 41 54 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATR:....return("
2a20: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2a30: 41 54 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ATR");...case SC
2a40: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41  ARD_E_INVALID_HA
2a50: 4e 44 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  NDLE:....return(
2a60: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
2a70: 5f 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63 61 73  _HANDLE");...cas
2a80: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
2a90: 44 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09 09 09  D_PARAMETER:....
2aa0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2ab0: 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45  INVALID_PARAMETE
2ac0: 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  R");...case SCAR
2ad0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47  D_E_INVALID_TARG
2ae0: 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ET:....return("S
2af0: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54  CARD_E_INVALID_T
2b00: 41 52 47 45 54 22 29 3b 0a 09 09 63 61 73 65 20  ARGET");...case 
2b10: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2b20: 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e  VALUE:....return
2b30: 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  ("SCARD_E_INVALI
2b40: 44 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73  D_VALUE");...cas
2b50: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d  e SCARD_E_NO_MEM
2b60: 4f 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ORY:....return("
2b70: 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52  SCARD_E_NO_MEMOR
2b80: 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  Y");...case SCAR
2b90: 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44  D_E_UNKNOWN_READ
2ba0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ER:....return("S
2bb0: 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52  CARD_E_UNKNOWN_R
2bc0: 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20  EADER");...case 
2bd0: 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 3a  SCARD_E_TIMEOUT:
2be0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2bf0: 44 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b 0a 09  D_E_TIMEOUT");..
2c00: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 48  .case SCARD_E_SH
2c10: 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a  ARING_VIOLATION:
2c20: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2c30: 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c  D_E_SHARING_VIOL
2c40: 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20  ATION");...case 
2c50: 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54  SCARD_E_NO_SMART
2c60: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
2c70: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52  "SCARD_E_NO_SMAR
2c80: 54 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  TCARD");...case 
2c90: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f  SCARD_E_UNKNOWN_
2ca0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
2cb0: 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e  "SCARD_E_UNKNOWN
2cc0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2cd0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
2ce0: 53 4d 41 54 43 48 3a 0a 09 09 09 72 65 74 75 72  SMATCH:....retur
2cf0: 6e 28 22 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  n("SCARD_E_PROTO
2d00: 5f 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09 09 63  _MISMATCH");...c
2d10: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f  ase SCARD_E_NOT_
2d20: 52 45 41 44 59 3a 0a 09 09 09 72 65 74 75 72 6e  READY:....return
2d30: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45  ("SCARD_E_NOT_RE
2d40: 41 44 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ADY");...case SC
2d50: 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e  ARD_E_SYSTEM_CAN
2d60: 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72  CELLED:....retur
2d70: 6e 28 22 53 43 41 52 44 5f 45 5f 53 59 53 54 45  n("SCARD_E_SYSTE
2d80: 4d 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09  M_CANCELLED");..
2d90: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
2da0: 54 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a 09 09  T_TRANSACTED:...
2db0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2dc0: 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 22  _NOT_TRANSACTED"
2dd0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2de0: 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c  E_READER_UNAVAIL
2df0: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
2e00: 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f  "SCARD_E_READER_
2e10: 55 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 09  UNAVAILABLE");..
2e20: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e  .case SCARD_W_UN
2e30: 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44 3a 0a  SUPPORTED_CARD:.
2e40: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2e50: 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43  _W_UNSUPPORTED_C
2e60: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
2e70: 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49  ARD_W_UNRESPONSI
2e80: 56 45 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  VE_CARD:....retu
2e90: 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 52 45  rn("SCARD_W_UNRE
2ea0: 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 22 29 3b  SPONSIVE_CARD");
2eb0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
2ec0: 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 3a 0a  UNPOWERED_CARD:.
2ed0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2ee0: 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52  _W_UNPOWERED_CAR
2ef0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
2f00: 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 3a 0a  D_W_RESET_CARD:.
2f10: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2f20: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 22 29 3b  _W_RESET_CARD");
2f30: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
2f40: 52 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a 09 09  REMOVED_CARD:...
2f50: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57  .return("SCARD_W
2f60: 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 22 29 3b  _REMOVED_CARD");
2f70: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2f80: 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09  PCI_TOO_SMALL:..
2f90: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2fa0: 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22  E_PCI_TOO_SMALL"
2fb0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2fc0: 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f  E_READER_UNSUPPO
2fd0: 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  RTED:....return(
2fe0: 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f  "SCARD_E_READER_
2ff0: 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09  UNSUPPORTED");..
3000: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 44 55  .case SCARD_E_DU
3010: 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52 3a 0a  PLICATE_READER:.
3020: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3030: 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41  _E_DUPLICATE_REA
3040: 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43  DER");...case SC
3050: 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50  ARD_E_CARD_UNSUP
3060: 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72  PORTED:....retur
3070: 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 52 44 5f  n("SCARD_E_CARD_
3080: 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09  UNSUPPORTED");..
3090: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
30a0: 5f 53 45 52 56 49 43 45 3a 0a 09 09 09 72 65 74  _SERVICE:....ret
30b0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f  urn("SCARD_E_NO_
30c0: 53 45 52 56 49 43 45 22 29 3b 0a 09 09 63 61 73  SERVICE");...cas
30d0: 65 20 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43  e SCARD_E_SERVIC
30e0: 45 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09 72 65  E_STOPPED:....re
30f0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 45  turn("SCARD_E_SE
3100: 52 56 49 43 45 5f 53 54 4f 50 50 45 44 22 29 3b  RVICE_STOPPED");
3110: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3120: 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54  UNSUPPORTED_FEAT
3130: 55 52 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  URE:....return("
3140: 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52  SCARD_E_UNSUPPOR
3150: 54 45 44 5f 46 45 41 54 55 52 45 22 29 3b 0a 23  TED_FEATURE");.#
3160: 69 66 64 65 66 20 53 43 41 52 44 5f 57 5f 49 4e  ifdef SCARD_W_IN
3170: 53 45 52 54 45 44 5f 43 41 52 44 0a 09 09 63 61  SERTED_CARD...ca
3180: 73 65 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52  se SCARD_W_INSER
3190: 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74  TED_CARD:....ret
31a0: 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 49 4e 53  urn("SCARD_W_INS
31b0: 45 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 23 65  ERTED_CARD");.#e
31c0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 43 41 52  ndif.#ifdef SCAR
31d0: 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41  D_E_NO_READERS_A
31e0: 56 41 49 4c 41 42 4c 45 0a 09 09 63 61 73 65 20  VAILABLE...case 
31f0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45  SCARD_E_NO_READE
3200: 52 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09  RS_AVAILABLE:...
3210: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3220: 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49  _NO_READERS_AVAI
3230: 4c 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69 66 0a  LABLE");.#endif.
3240: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b  .}...return("UNK
3250: 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69  NOWN");.}..stati
3260: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
3270: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
3280: 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75 69 6e  OBJID_TO_STR(uin
3290: 74 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b 0a 09  t16_t objid) {..
32a0: 73 77 69 74 63 68 20 28 6f 62 6a 69 64 29 20 7b  switch (objid) {
32b0: 0a 09 09 63 61 73 65 20 30 78 32 30 30 30 3a 0a  ...case 0x2000:.
32c0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
32d0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45  Y_TLV_OBJID_GENE
32e0: 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73  RALINFO");...cas
32f0: 65 20 30 78 32 31 30 30 3a 0a 09 09 09 72 65 74  e 0x2100:....ret
3300: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3310: 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41  OBJID_PROPERSONA
3320: 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20  LINFO");...case 
3330: 30 78 33 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x3000:....retur
3340: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3350: 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f  JID_ACCESSCONTRO
3360: 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78 34 30  L");...case 0x40
3370: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3380: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3390: 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73 65 20  LOGIN");...case 
33a0: 30 78 35 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x5000:....retur
33b0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
33c0: 4a 49 44 5f 43 41 52 44 49 4e 46 4f 22 29 3b 0a  JID_CARDINFO");.
33d0: 09 09 63 61 73 65 20 30 78 36 30 30 30 3a 0a 09  ..case 0x6000:..
33e0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
33f0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45  _TLV_OBJID_BIOME
3400: 54 52 49 43 53 22 29 3b 0a 09 09 63 61 73 65 20  TRICS");...case 
3410: 30 78 37 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x7000:....retur
3420: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3430: 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45  JID_DIGITALSIGCE
3440: 52 54 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  RT");...case 0x0
3450: 32 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  200:....return("
3460: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3470: 5f 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b 0a 09  _CAC_PERSON");..
3480: 09 63 61 73 65 20 30 78 30 32 30 32 3a 0a 09 09  .case 0x0202:...
3490: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
34a0: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45  TLV_OBJID_CAC_BE
34b0: 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65  NEFITS");...case
34c0: 20 30 78 30 32 30 33 3a 0a 09 09 09 72 65 74 75   0x0203:....retu
34d0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
34e0: 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45  BJID_CAC_OTHERBE
34f0: 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65  NEFITS");...case
3500: 20 30 78 30 32 30 31 3a 0a 09 09 09 72 65 74 75   0x0201:....retu
3510: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3520: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e  BJID_CAC_PERSONN
3530: 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  EL");...case 0x0
3540: 32 46 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  2FE:....return("
3550: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3560: 5f 43 41 43 5f 50 4b 49 43 45 52 54 22 29 3b 0a  _CAC_PKICERT");.
3570: 09 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22 55 4e  .}....return("UN
3580: 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74  KNOWN");.}..stat
3590: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43  ic const char *C
35a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
35b0: 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28  _APPTYPE_TO_STR(
35c0: 75 69 6e 74 38 5f 74 20 61 70 70 74 79 70 65 29  uint8_t apptype)
35d0: 20 7b 0a 09 73 77 69 74 63 68 20 28 61 70 70 74   {..switch (appt
35e0: 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 30 78  ype) {...case 0x
35f0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 4e  00:....return("N
3600: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ONE");...case 0x
3610: 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  01:....return("C
3620: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45  ACKEY_TLV_APP_GE
3630: 4e 45 52 49 43 22 29 3b 0a 09 09 63 61 73 65 20  NERIC");...case 
3640: 30 78 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x02:....return(
3650: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3660: 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SKI");...case 0x
3670: 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  03:....return("C
3680: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45  ACKEY_TLV_APP_GE
3690: 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54  NERIC | CACKEY_T
36a0: 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09  LV_APP_SKI");...
36b0: 63 61 73 65 20 30 78 30 34 3a 0a 09 09 09 72 65  case 0x04:....re
36c0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
36d0: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61  _APP_PKI");...ca
36e0: 73 65 20 30 78 30 35 3a 0a 09 09 09 72 65 74 75  se 0x05:....retu
36f0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
3700: 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43  PP_GENERIC | CAC
3710: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22  KEY_TLV_APP_PKI"
3720: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 36 3a 0a  );...case 0x06:.
3730: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3740: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20  Y_TLV_APP_SKI | 
3750: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
3760: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
3770: 37 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  7:....return("CA
3780: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
3790: 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c  ERIC | CACKEY_TL
37a0: 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b  V_APP_SKI | CACK
37b0: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29  EY_TLV_APP_PKI")
37c0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 49  ;..}...return("I
37d0: 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 23 20 20  NVALID");.}..#  
37e0: 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29  define malloc(x)
37f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
3800: 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66  NC_MALLOC(x, __f
3810: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
3820: 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61 6c 6c  .#  define reall
3830: 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45 59 5f  oc(x, y) CACKEY_
3840: 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c  DEBUG_FUNC_REALL
3850: 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f  OC(x, y, __func_
3860: 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20  _, __LINE__).#  
3870: 69 66 64 65 66 20 73 74 72 64 75 70 0a 23 20 20  ifdef strdup.#  
3880: 20 20 75 6e 64 65 66 20 73 74 72 64 75 70 0a 23    undef strdup.#
3890: 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66 69 6e    endif.#  defin
38a0: 65 20 73 74 72 64 75 70 28 78 29 20 43 41 43 4b  e strdup(x) CACK
38b0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54  EY_DEBUG_FUNC_ST
38c0: 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f  RDUP(x, __func__
38d0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73  , __LINE__).#els
38e0: 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  e.#  define CACK
38f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
3900: 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x...) /**/.#  de
3910: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
3920: 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c  G_PRINTBUF(f, x,
3930: 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69   y) /**/.#  defi
3940: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
3950: 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23  PERROR(x) /**/.#
3960: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
3970: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
3980: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
3990: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
39a0: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
39b0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
39c0: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
39d0: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
39e0: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
39f0: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
3a00: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
3a10: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
3a20: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
3a30: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
3a40: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
3a50: 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 73 74  BLED".#endif..st
3a60: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
3a70: 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 75 6e 73  _identity {..uns
3a80: 69 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65  igned char apple
3a90: 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20  t[7];..uint16_t 
3aa0: 66 69 6c 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63  file;...size_t c
3ab0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
3ac0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
3ad0: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73  certificate;...s
3ae0: 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a  size_t keysize;.
3af0: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
3b00: 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 73 74  y_identity {..st
3b10: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
3b20: 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f  _identity *pcsc_
3b30: 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41  identity;...CK_A
3b40: 54 54 52 49 42 55 54 45 20 2a 61 74 74 72 69 62  TTRIBUTE *attrib
3b50: 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  utes;..CK_ULONG 
3b60: 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
3b70: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
3b80: 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69  key_session {..i
3b90: 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f  nt active;...CK_
3ba0: 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
3bb0: 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74 65  ..CK_STATE state
3bc0: 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  ;..CK_FLAGS flag
3bd0: 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  s;..CK_ULONG ulD
3be0: 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f  eviceError;..CK_
3bf0: 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63  VOID_PTR pApplic
3c00: 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46  ation;..CK_NOTIF
3c10: 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75  Y Notify;...stru
3c20: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
3c30: 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a  ty *identities;.
3c40: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
3c50: 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b  dentities_count;
3c60: 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61 63  ...int search_ac
3c70: 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42  tive;..CK_ATTRIB
3c80: 55 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f 71  UTE_PTR search_q
3c90: 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  uery;..CK_ULONG 
3ca0: 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
3cb0: 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  nt;..unsigned lo
3cc0: 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f 69  ng search_curr_i
3cd0: 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63  d;...int sign_ac
3ce0: 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e  tive;..CK_MECHAN
3cf0: 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65  ISM_TYPE sign_me
3d00: 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54  chanism;..CK_BYT
3d10: 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a  E_PTR sign_buf;.
3d20: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73  .unsigned long s
3d30: 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73  ign_buflen;..uns
3d40: 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f  igned long sign_
3d50: 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75 63 74  bufused;..struct
3d60: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
3d70: 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b   *sign_identity;
3d80: 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74 5f 61  ...int decrypt_a
3d90: 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41  ctive;..CK_MECHA
3da0: 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72 79 70  NISM_TYPE decryp
3db0: 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b  t_mechanism;..CK
3dc0: 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72 79 70  _VOID_PTR decryp
3dd0: 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b  t_mech_parm;..CK
3de0: 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d  _ULONG decrypt_m
3df0: 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74  ech_parmlen;..st
3e00: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
3e10: 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f 69 64  tity *decrypt_id
3e20: 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75  entity;.};..stru
3e30: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b  ct cackey_slot {
3e40: 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09  ..int active;...
3e50: 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65  char *pcsc_reade
3e60: 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61  r;...int pcsc_ca
3e70: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53  rd_connected;..S
3e80: 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f  CARDHANDLE pcsc_
3e90: 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e  card;...int tran
3ea0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 09  saction_depth;..
3eb0: 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f  int transaction_
3ec0: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a 0a 09  need_hw_lock;...
3ed0: 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a  int slot_reset;.
3ee0: 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b 65 6e  ..CK_FLAGS token
3ef0: 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69 67 6e  _flags;...unsign
3f00: 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a  ed char *label;.
3f10: 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c  ..DWORD protocol
3f20: 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  ;.};..typedef en
3f30: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56  um {..CACKEY_TLV
3f40: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30  _APP_GENERIC = 0
3f50: 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  x01,..CACKEY_TLV
3f60: 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30  _APP_SKI     = 0
3f70: 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  x02,..CACKEY_TLV
3f80: 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30  _APP_PKI     = 0
3f90: 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76  x04.} cackey_tlv
3fa0: 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64  _apptype;..typed
3fb0: 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45  ef enum {..CACKE
3fc0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45  Y_TLV_OBJID_GENE
3fd0: 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20  RALINFO       = 
3fe0: 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x2000,..CACKEY_
3ff0: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52  TLV_OBJID_PROPER
4000: 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78  SONALINFO   = 0x
4010: 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  2100,..CACKEY_TL
4020: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f  V_OBJID_ACCESSCO
4030: 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30  NTROL     = 0x30
4040: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
4050: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20  OBJID_LOGIN     
4060: 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30          = 0x4000
4070: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
4080: 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20  JID_CARDINFO    
4090: 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a        = 0x5000,.
40a0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
40b0: 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20  D_BIOMETRICS    
40c0: 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43      = 0x6000,..C
40d0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
40e0: 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20  DIGITALSIGCERT  
40f0: 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43    = 0x7000,..CAC
4100: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
4110: 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20  C_PERSON        
4120: 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45  = 0x0200,..CACKE
4130: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
4140: 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20  BENEFITS      = 
4150: 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f  0x0202,..CACKEY_
4160: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54  TLV_OBJID_CAC_OT
4170: 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78  HERBENEFITS = 0x
4180: 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0203,..CACKEY_TL
4190: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
41a0: 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32  ONNEL     = 0x02
41b0: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  01,..CACKEY_TLV_
41c0: 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52  OBJID_CAC_PKICER
41d0: 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45  T       = 0x02FE
41e0: 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62  .} cackey_tlv_ob
41f0: 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66  jectid;..typedef
4200: 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f   enum {..CACKEY_
4210: 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
4220: 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41 43  ENT    = 1,..CAC
4230: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
4240: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a             = 0,.
4250: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  .CACKEY_PCSC_E_G
4260: 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 3d  ENERIC         =
4270: 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -1,..CACKEY_PCS
4280: 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 20  C_E_BADPIN      
4290: 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b 45      = -2,..CACKE
42a0: 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 20  Y_PCSC_E_LOCKED 
42b0: 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a 09           = -3,..
42c0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
42d0: 45 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d 20  EDLOGIN       = 
42e0: 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -4,..CACKEY_PCSC
42f0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20  _E_TOKENABSENT  
4300: 20 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45 59     = -6,..CACKEY
4310: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20 20  _PCSC_E_RETRY   
4320: 20 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20 63          = -7.} c
4330: 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75  ackey_ret;..stru
4340: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61  ct cackey_tlv_ca
4350: 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65  rdurl {..unsigne
4360: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72 69  d char        ri
4370: 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  d[5];..cackey_tl
4380: 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 74  v_apptype   appt
4390: 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  ype;..cackey_tlv
43a0: 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63  _objectid  objec
43b0: 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  tid;..cackey_tlv
43c0: 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 64  _objectid  appid
43d0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
43e0: 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d          pinid;.}
43f0: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
4400: 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72  _tlv_entity;.str
4410: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
4420: 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74  ntity {..uint8_t
4430: 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65   tag;..size_t le
4440: 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a  ngth;...union {.
4450: 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09  ..void *value;..
4460: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
4470: 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75  lv_cardurl *valu
4480: 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e  e_cardurl;...uin
4490: 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b  t8_t value_byte;
44a0: 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61  ..};...struct ca
44b0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
44c0: 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43  *_next;.};../* C
44d0: 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e  ACKEY Global Han
44e0: 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  dles */.static v
44f0: 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c  oid *cackey_bigl
4500: 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  ock = NULL;.stat
4510: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
4520: 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f  _session cackey_
4530: 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73  sessions[128];.s
4540: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
4550: 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f  key_slot cackey_
4560: 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74  slots[128];.stat
4570: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e  ic int cackey_in
4580: 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73  itialized = 0;.s
4590: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
45a0: 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20  _biglock_init = 
45b0: 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49  0;.CK_C_INITIALI
45c0: 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61  ZE_ARGS cackey_a
45d0: 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20  rgs;../** Extra 
45e0: 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f 20  certificates to 
45f0: 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e  include in token
4600: 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63 6b   **/.struct cack
4610: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
4620: 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d   extra_certs[] =
4630: 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 63   {.#include "cac
4640: 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74  key_builtin_cert
4650: 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50 43 53 43  s.h".};../* PCSC
4660: 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20   Global Handles 
4670: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52  */.static LPSCAR
4680: 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f  DCONTEXT cackey_
4690: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
46a0: 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69  LL;..static unsi
46b0: 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79  gned long cackey
46c0: 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64  _getversion(void
46d0: 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69  ) {..static unsi
46e0: 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c  gned long retval
46f0: 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65   = 255;..unsigne
4700: 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30  d long major = 0
4710: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
4720: 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61   minor = 0;..cha
4730: 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e  r *major_str = N
4740: 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f  ULL;..char *mino
4750: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  r_str = NULL;...
4760: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4770: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
4780: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20  ..if (retval != 
4790: 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  255) {...CACKEY_
47a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
47b0: 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63  turning 0x%lx (c
47c0: 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c  ached).", retval
47d0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74  );....return(ret
47e0: 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  val);..}...retva
47f0: 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50  l = 0;..#ifdef P
4800: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20  ACKAGE_VERSION. 
4810: 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72         major_str
4820: 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49   = PACKAGE_VERSI
4830: 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73  ON;..if (major_s
4840: 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d  tr) {..        m
4850: 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d  ajor = strtoul(m
4860: 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72  ajor_str, &minor
4870: 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66  _str, 10);....if
4880: 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09   (minor_str) {..
4890: 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75  ..minor = strtou
48a0: 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c  l(minor_str + 1,
48b0: 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a   NULL, 10);...}.
48c0: 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d  .}...retval = (m
48d0: 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d  ajor << 16) | (m
48e0: 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64  inor << 8);.#end
48f0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
4900: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
4910: 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76  ing 0x%lx", retv
4920: 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
4930: 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f  tval);.}../* PC/
4940: 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74  SC Related Funct
4950: 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59  ions */./*. * SY
4960: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f  NPOSIS. *     vo
4970: 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  id cackey_slots_
4980: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76  disconnect_all(v
4990: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
49a0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
49b0: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
49c0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
49d0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
49e0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
49f0: 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72  n disconnects fr
4a00: 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a  om all cards.. *
4a10: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
4a20: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69   cackey_slots_di
4a30: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69  sconnect_all(voi
4a40: 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  d) {..uint32_t i
4a50: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
4a60: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
4a70: 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78  d.");...for (idx
4a80: 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
4a90: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
4aa0: 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
4ab0: 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
4ac0: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
4ad0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
4ae0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
4af0: 65 64 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ed) {....CACKEY_
4b00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
4b10: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c  ardDisconnect(%l
4b20: 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73  u) called", (uns
4b30: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29  igned long) idx)
4b40: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
4b50: 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f  nnect(cackey_slo
4b60: 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72  ts[idx].pcsc_car
4b70: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
4b80: 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  ARD);...}....if 
4b90: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
4ba0: 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 66  x].label) {....f
4bb0: 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ree(cackey_slots
4bc0: 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09  [idx].label);...
4bd0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
4be0: 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  dx].label = NULL
4bf0: 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
4c00: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
4c10: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
4c20: 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
4c30: 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74  ts[idx].transact
4c40: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09  ion_depth = 0;..
4c50: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
4c60: 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  x].transaction_n
4c70: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b  eed_hw_lock = 0;
4c80: 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
4c90: 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  lots[idx].active
4ca0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
4cb0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b  BUG_PRINTF("Mark
4cc0: 69 6e 67 20 61 63 74 69 76 65 20 73 6c 6f 74 20  ing active slot 
4cd0: 25 6c 75 20 61 73 20 62 65 69 6e 67 20 72 65 73  %lu as being res
4ce0: 65 74 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  et", (unsigned l
4cf0: 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d 0a 0a  ong) idx);...}..
4d00: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
4d10: 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  dx].slot_reset =
4d20: 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f   1;..}...CACKEY_
4d30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
4d40: 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74  turning");...ret
4d50: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  urn;.}../*. * SY
4d60: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
4d70: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
4d80: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69  pcsc_connect(voi
4d90: 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  d);. *. * ARGUME
4da0: 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  NTS. *     None.
4db0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
4dc0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
4dd0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
4de0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
4df0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
4e00: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
4e10: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
4e20: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
4e30: 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 73  unction connects
4e40: 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f   to the PC/SC Co
4e50: 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72  nnection Manager
4e60: 20 61 6e 64 20 75 70 64 61 74 65 73 20 74 68 65   and updates the
4e70: 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c 20 68  . *     global h
4e80: 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  andle.. *. */.st
4e90: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
4ea0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
4eb0: 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e  ect(void) {..LON
4ec0: 47 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  G scard_est_cont
4ed0: 65 78 74 5f 72 65 74 3b 0a 23 69 66 64 65 66 20  ext_ret;.#ifdef 
4ee0: 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49  HAVE_SCARDISVALI
4ef0: 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 73  DCONTEXT..LONG s
4f00: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
4f10: 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  ;.#endif...CACKE
4f20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
4f30: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
4f40: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
4f50: 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  dle == NULL) {..
4f60: 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  .cackey_pcsc_han
4f70: 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  dle = malloc(siz
4f80: 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  eof(*cackey_pcsc
4f90: 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69 66 20  _handle));...if 
4fa0: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
4fb0: 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  dle == NULL) {..
4fc0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4fd0: 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 6d  RINTF("Call to m
4fe0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 2c 20  alloc() failed, 
4ff0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
5000: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63 61 63 6b  lure");.....cack
5010: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
5020: 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72  ect_all();.....r
5030: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
5040: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
5050: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
5060: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45  G_PRINTF("SCardE
5070: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
5080: 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63  ) called");...sc
5090: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
50a0: 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62  ret = SCardEstab
50b0: 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52  lishContext(SCAR
50c0: 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20  D_SCOPE_SYSTEM, 
50d0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b  NULL, NULL, cack
50e0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
50f0: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74  ...if (scard_est
5100: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20  _context_ret != 
5110: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
5120: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
5130: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20  UG_PRINTF("Call 
5140: 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73  to SCardEstablis
5150: 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20  hContext failed 
5160: 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69  (returned %s/%li
5170: 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  ), returning in 
5180: 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59  failure", CACKEY
5190: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
51a0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
51b0: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
51c0: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
51d0: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
51e0: 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b  );.....free(cack
51f0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
5200: 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  ....cackey_pcsc_
5210: 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  handle = NULL;..
5220: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
5230: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
5240: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
5250: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
5260: 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66  IC);...}..}..#if
5270: 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53  def HAVE_SCARDIS
5280: 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43 41  VALIDCONTEXT..CA
5290: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
52a0: 46 28 22 53 43 61 72 64 49 73 56 61 6c 69 64 43  F("SCardIsValidC
52b0: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22  ontext() called"
52c0: 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c 69  );..scard_isvali
52d0: 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73 56  d_ret = SCardIsV
52e0: 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61 63  alidContext(*cac
52f0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
5300: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73 76  ;..if (scard_isv
5310: 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41 52  alid_ret != SCAR
5320: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
5330: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5340: 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73  INTF("Handle has
5350: 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20   become invalid 
5360: 28 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e  (SCardIsValidCon
5370: 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c 20  text = %s/%li), 
5380: 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73 74  trying to re-est
5390: 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43 4b  ablish...", CACK
53a0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
53b0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
53c0: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29  ard_isvalid_ret)
53d0: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 69  , (long) scard_i
53e0: 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 09  svalid_ret);....
53f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5400: 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c  NTF("SCardEstabl
5410: 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c  ishContext() cal
5420: 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65  led");...scard_e
5430: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d  st_context_ret =
5440: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43   SCardEstablishC
5450: 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f  ontext(SCARD_SCO
5460: 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c  PE_SYSTEM, NULL,
5470: 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63   NULL, cackey_pc
5480: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66  sc_handle);...if
5490: 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74   (scard_est_cont
54a0: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ext_ret != SCARD
54b0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
54c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
54d0: 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43  INTF("Call to SC
54e0: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
54f0: 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75  ext failed (retu
5500: 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65  rned %s/%li), re
5510: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
5520: 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  re", CACKEY_DEBU
5530: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
5540: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74  TO_STR(scard_est
5550: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28  _context_ret), (
5560: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f  long) scard_est_
5570: 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09  context_ret);...
5580: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63  ..free(cackey_pc
5590: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63  sc_handle);....c
55a0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
55b0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61  e = NULL;.....ca
55c0: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
55d0: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09  nnect_all();....
55e0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
55f0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
5600: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
5610: 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64  BUG_PRINTF("Hand
5620: 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d 65  le has been re-e
5630: 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09 7d  stablished");..}
5640: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
5650: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
5660: 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e 65  ucessfully conne
5670: 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20 72  cted to PC/SC, r
5680: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
5690: 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ess");...return(
56a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
56b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
56c0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
56d0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
56e0: 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f  sc_disconnect(vo
56f0: 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  id);. *. * ARGUM
5700: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ENTS. *     None
5710: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
5720: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
5730: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
5740: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
5750: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
5760: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
5770: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
5780: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
5790: 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e  function disconn
57a0: 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20 50 43  ects from the PC
57b0: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d  /SC Connection m
57c0: 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 74  anager and updat
57d0: 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20 67 6c  es. *     the gl
57e0: 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a  obal handle.. *.
57f0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
5800: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73  y_ret cackey_pcs
5810: 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69  c_disconnect(voi
5820: 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  d) {..LONG scard
5830: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _rel_context_ret
5840: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
5850: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
5860: 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ");...if (cackey
5870: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20  _pcsc_handle == 
5880: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
5890: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
58a0: 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 72  K);..}...scard_r
58b0: 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d  el_context_ret =
58c0: 20 53 43 61 72 64 52 65 6c 65 61 73 65 43 6f 6e   SCardReleaseCon
58d0: 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  text(*cackey_pcs
58e0: 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66 20  c_handle);...if 
58f0: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
5900: 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 63 61  dle) {...free(ca
5910: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
5920: 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70 63  );.....cackey_pc
5930: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c  sc_handle = NULL
5940: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64  ;..}...if (scard
5950: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _rel_context_ret
5960: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
5970: 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ESS) {...return(
5980: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
5990: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72 65 74  NERIC);..}...ret
59a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
59b0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
59c0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
59d0: 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b  void cackey_mark
59e0: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75  _slot_reset(stru
59f0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
5a00: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  slot);. *. * ARG
5a10: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f  UMENTS. *     No
5a20: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ne. *. * RETURN 
5a30: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e  VALUE. *     Non
5a40: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  e. *. * NOTES. *
5a50: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
5a60: 6f 6e 20 6d 61 72 6b 73 20 61 20 73 6c 6f 74 20  on marks a slot 
5a70: 68 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20  has having been 
5a80: 72 65 73 65 74 2c 20 74 6f 20 6c 61 74 65 72 20  reset, to later 
5a90: 62 65 20 63 6c 65 61 6e 65 64 20 75 70 2e 0a 20  be cleaned up.. 
5aa0: 2a 20 20 20 20 20 43 6c 65 61 6e 75 70 20 6f 6e  *     Cleanup on
5ab0: 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
5ac0: 61 20 50 4b 43 53 23 31 31 20 63 6c 69 65 6e 74  a PKCS#11 client
5ad0: 20 63 61 6c 6c 73 20 43 5f 46 69 6e 64 4f 62 6a   calls C_FindObj
5ae0: 65 63 74 73 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f  ectsInit.. *. */
5af0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
5b00: 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
5b10: 73 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  set(struct cacke
5b20: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
5b30: 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c  .if (slot == NUL
5b40: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  L) {...return;..
5b50: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
5b60: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
5b70: 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ");...if (slot->
5b80: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
5b90: 74 65 64 29 20 7b 0a 09 09 53 43 61 72 64 44 69  ted) {...SCardDi
5ba0: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
5bb0: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
5bc0: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 7d 0a  LEAVE_CARD);..}.
5bd0: 0a 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73  ..slot->slot_res
5be0: 65 74 20 3d 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70  et = 1;..slot->p
5bf0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
5c00: 65 64 20 3d 20 30 3b 0a 09 73 6c 6f 74 2d 3e 74  ed = 0;..slot->t
5c10: 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46  oken_flags = CKF
5c20: 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b  _LOGIN_REQUIRED;
5c30: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5c40: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
5c50: 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  g.");...return;.
5c60: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
5c70: 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20 63 61  S. *     LONG ca
5c80: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
5c90: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
5ca0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57  y_slot *slot, DW
5cb0: 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74  ORD default_prot
5cc0: 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52 44 20 73 65  ocol, LPDWORD se
5cd0: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29  lected_protocol)
5ce0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
5cf0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
5d00: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
5d10: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
5d20: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
5d30: 2a 0a 20 2a 20 20 20 20 20 44 57 4f 52 44 20 64  *. *     DWORD d
5d40: 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a  efault_protocol.
5d50: 20 2a 20 20 20 20 20 20 20 20 20 50 72 6f 74 6f   *         Proto
5d60: 63 6f 6c 20 74 6f 20 61 74 74 65 6d 70 74 20 66  col to attempt f
5d70: 69 72 73 74 0a 20 2a 0a 20 2a 20 20 20 20 20 4c  irst. *. *     L
5d80: 50 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f  PDWORD selected_
5d90: 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20  protocol. *     
5da0: 20 20 20 20 5b 4f 55 54 5d 20 50 72 6f 74 6f 63      [OUT] Protoc
5db0: 6f 6c 20 73 65 6c 65 63 74 65 64 0a 20 2a 0a 20  ol selected. *. 
5dc0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
5dd0: 2a 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e  *     The return
5de0: 20 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72   value from SCar
5df0: 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a  dReconnect(). *.
5e00: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
5e10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5e20: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
5e30: 64 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  d SCardReconnect
5e40: 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65  (). *. *     The
5e50: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
5e60: 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  ) function call 
5e70: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66  will be called f
5e80: 69 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a  irst with the. *
5e90: 20 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64       dwPreferred
5ea0: 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65  Protocols of "de
5eb0: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e  fault_protocol".
5ec0: 20 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72    If that call r
5ed0: 65 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43  eturns. *     SC
5ee0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
5ef0: 41 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77  ATCH try again w
5f00: 69 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f  ith a protocol o
5f10: 66 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69  f T=0, and faili
5f20: 6e 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54  ng. *     that T
5f30: 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  =1.. *. */.stati
5f40: 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65  c LONG cackey_re
5f50: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
5f60: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
5f70: 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66  *slot, DWORD def
5f80: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c  ault_protocol, L
5f90: 50 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f  PDWORD selected_
5fa0: 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 4c 4f 4e  protocol) {..LON
5fb0: 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  G scard_conn_ret
5fc0: 3b 0a 0a 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ;...scard_conn_r
5fd0: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
5fe0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
5ff0: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
6000: 5f 53 48 41 52 45 44 2c 20 64 65 66 61 75 6c 74  _SHARED, default
6010: 5f 70 72 6f 74 6f 63 6f 6c 2c 20 53 43 41 52 44  _protocol, SCARD
6020: 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c  _RESET_CARD, sel
6030: 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b  ected_protocol);
6040: 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
6050: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
6060: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
6070: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
6080: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52  G_PRINTF("SCardR
6090: 65 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  econnect() retur
60a0: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
60b0: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
60c0: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30  ng with just T=0
60d0: 22 29 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  ")...scard_conn_
60e0: 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e  ret = SCardRecon
60f0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
6100: 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52  card, SCARD_SHAR
6110: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
6120: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41  PROTOCOL_T0, SCA
6130: 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 73  RD_RESET_CARD, s
6140: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
6150: 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
6160: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
6170: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
6180: 43 48 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  CH) {....CACKEY_
6190: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
61a0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72  ardReconnect() r
61b0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
61c0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
61d0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
61e0: 20 54 3d 31 22 29 0a 09 09 09 73 63 61 72 64 5f   T=1")....scard_
61f0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
6200: 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  Reconnect(slot->
6210: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
6220: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
6230: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
6240: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
6250: 52 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f  RD, selected_pro
6260: 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  tocol);...}..}..
6270: 09 72 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f  .return(scard_co
6280: 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20  nn_ret);.}../*. 
6290: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
62a0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
62b0: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
62c0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
62d0: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
62e0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
62f0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
6300: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
6310: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
6320: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
6330: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
6340: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
6350: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
6360: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
6370: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
6380: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
6390: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
63a0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
63b0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
63c0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
63d0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
63e0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
63f0: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73  ..cackey_ret pcs
6400: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09  c_connect_ret;..
6410: 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a  DWORD protocol;.
6420: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e  .LONG scard_conn
6430: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
6440: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6450: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
6460: 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  lot) {...CACKEY_
6470: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
6480: 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69  valid slot speci
6490: 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  fied, returning 
64a0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
64b0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
64c0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
64d0: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
64e0: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  t_ret = cackey_p
64f0: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  csc_connect();..
6500: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
6510: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
6520: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
6530: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6540: 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
6550: 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72   PC/SC failed, r
6560: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
6570: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
6580: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
6590: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
65a0: 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64   Connect to read
65b0: 65 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  er, if needed */
65c0: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73  ..if (!slot->pcs
65d0: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
65e0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
65f0: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
6600: 43 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c  Connect(%s) call
6610: 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  ed", slot->pcsc_
6620: 72 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64  reader);...scard
6630: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
6640: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
6650: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
6660: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
6670: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
6680: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
6690: 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
66a0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f  ROTOCOL_T1, &slo
66b0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
66c0: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20  rotocol);....if 
66d0: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
66e0: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
66f0: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09  _MISMATCH) {....
6700: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6710: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
6720: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
6730: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
6740: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
6750: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 73   just T=0")....s
6760: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
6770: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
6780: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6790: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
67a0: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
67b0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
67c0: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f  ROTOCOL_T0, &slo
67d0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
67e0: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66  rotocol);.....if
67f0: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
6800: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
6810: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
6820: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6830: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
6840: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
6850: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
6860: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
6870: 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09  th just T=1")...
6880: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
6890: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
68a0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
68b0: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
68c0: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
68d0: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
68e0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
68f0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
6900: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09   &protocol);....
6910: 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61  }...}....if (sca
6920: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
6930: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
6940: 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b  _CARD) {....CACK
6950: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6960: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
6970: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 57  returned SCARD_W
6980: 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 2c  _UNPOWERED_CARD,
6990: 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63 6f   trying to re-co
69a0: 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09  nnect...");.....
69b0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
69c0: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
69d0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
69e0: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
69f0: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
6a00: 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44 5f  E_DIRECT, SCARD_
6a10: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
6a20: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
6a30: 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   &slot->pcsc_car
6a40: 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  d, &protocol);..
6a50: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
6a60: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
6a70: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
6a80: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
6a90: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
6aa0: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  dConnect() retur
6ab0: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
6ac0: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
6ad0: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30  ng with just T=0
6ae0: 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e  ").....scard_con
6af0: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
6b00: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
6b10: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
6b20: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
6b30: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
6b40: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
6b50: 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T0, &slot->pcsc_
6b60: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
6b70: 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64  ;......if (scard
6b80: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
6b90: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
6ba0: 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  TCH) {......CACK
6bb0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6bc0: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
6bd0: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
6be0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
6bf0: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
6c00: 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63 61  t T=1")......sca
6c10: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
6c20: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b  ardConnect(*cack
6c30: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
6c40: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
6c50: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  r, SCARD_SHARE_S
6c60: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
6c70: 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d  TOCOL_T1, &slot-
6c80: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f  >pcsc_card, &pro
6c90: 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09 09  tocol);.....}...
6ca0: 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e  .}.....scard_con
6cb0: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  n_ret = cackey_r
6cc0: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  econnect_card(sl
6cd0: 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 2c 20 26 70  ot, protocol, &p
6ce0: 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 0a 09  rotocol);...}...
6cf0: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
6d00: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6d10: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43  UCCESS) {....CAC
6d20: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6d30: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
6d40: 63 61 72 64 20 66 61 69 6c 65 64 2c 20 72 65 74  card failed, ret
6d50: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
6d60: 65 20 28 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  e (SCardConnect(
6d70: 29 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41  ) = %s/%li)", CA
6d80: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
6d90: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
6da0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c  scard_conn_ret),
6db0: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 63 6f   (long) scard_co
6dc0: 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 72 65 74  nn_ret);.....ret
6dd0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6de0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
6df0: 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
6e00: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 31  rd_connected = 1
6e10: 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ;...slot->transa
6e20: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
6e30: 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
6e40: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
6e50: 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 70  k = 0;...slot->p
6e60: 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63  rotocol = protoc
6e70: 6f 6c 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ol;..}...return(
6e80: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
6e90: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
6ea0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
6eb0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65  ey_ret cackey_be
6ec0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
6ed0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6ee0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
6ef0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
6f00: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
6f10: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
6f20: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
6f30: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
6f40: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
6f50: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
6f60: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
6f70: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
6f80: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6f90: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
6fa0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
6fb0: 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f    The transactio
6fc0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 74 65 72 6d  n should be term
6fd0: 69 6e 61 74 65 64 20 75 73 69 6e 67 20 22 63 61  inated using "ca
6fe0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
6ff0: 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61  tion". *. */.sta
7000: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
7010: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
7020: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
7030: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7040: 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ) {..cackey_ret 
7050: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b  cackey_conn_ret;
7060: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61  ..LONG scard_tra
7070: 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ns_ret;...CACKEY
7080: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
7090: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61 63 6b  alled.");...cack
70a0: 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  ey_conn_ret = ca
70b0: 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72  ckey_connect_car
70c0: 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 63 61  d(slot);..if (ca
70d0: 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d  ckey_conn_ret !=
70e0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
70f0: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
7100: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
7110: 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
7120: 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
7130: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
7140: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7150: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7160: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  }...slot->transa
7170: 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a  ction_depth++;..
7180: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
7190: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 31  action_depth > 1
71a0: 20 26 26 20 21 73 6c 6f 74 2d 3e 74 72 61 6e 73   && !slot->trans
71b0: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
71c0: 6f 63 6b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ock) {...CACKEY_
71d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 6c  DEBUG_PRINTF("Al
71e0: 72 65 61 64 79 20 69 6e 20 61 20 74 72 61 6e 73  ready in a trans
71f0: 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72 6d 69  action, performi
7200: 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28 6e 65  ng no action (ne
7210: 77 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20  w depth = %i)", 
7220: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7230: 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74  n_depth);....ret
7240: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
7250: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  S_OK);..}...slot
7260: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ->transaction_ne
7270: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
7280: 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  ..scard_trans_re
7290: 74 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54 72  t = SCardBeginTr
72a0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e  ansaction(slot->
72b0: 70 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 20  pcsc_card);..if 
72c0: 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  (scard_trans_ret
72d0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
72e0: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
72f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
7300: 61 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 72  able to begin tr
7310: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
7320: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
7330: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
7340: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
7350: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
7360: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
7370: 65 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 74  essfully began t
7380: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c  ransaction on sl
7390: 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e  ot (%s)", slot->
73a0: 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
73b0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
73c0: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
73d0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
73e0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
73f0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
7400: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
7410: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
7420: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
7430: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
7440: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
7450: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
7460: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
7470: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
7480: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
7490: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
74a0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
74b0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
74c0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
74d0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
74e0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
74f0: 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22 63  tion requires "c
7500: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
7510: 73 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 63  saction" to be c
7520: 61 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a 20  alled first. *. 
7530: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
7540: 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f  _ret cackey_end_
7550: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
7560: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7570: 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  slot) {..LONG sc
7580: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a  ard_trans_ret;..
7590: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
75a0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
75b0: 0a 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63  ...if (!slot->pc
75c0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
75d0: 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
75e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64  BUG_PRINTF("Card
75f0: 20 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65   is not connecte
7600: 64 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64  d, unable to end
7610: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
7620: 63 61 72 64 22 29 3b 0a 0a 09 09 69 66 20 28 73  card");....if (s
7630: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
7640: 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09  _depth > 0) {...
7650: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7660: 49 4e 54 46 28 22 44 65 63 72 65 61 73 69 6e 67  INTF("Decreasing
7670: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 65 70   transaction dep
7680: 74 68 20 61 6e 64 20 61 73 6b 69 6e 67 20 66 6f  th and asking fo
7690: 72 20 61 20 68 61 72 64 77 61 72 65 20 6c 6f 63  r a hardware loc
76a0: 6b 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 62 65  k on the next be
76b0: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
76c0: 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d  (current depth =
76d0: 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61   %i)", slot->tra
76e0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b  nsaction_depth);
76f0: 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
7700: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a  action_depth--;.
7710: 0a 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ....if (slot->tr
7720: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
7730: 3e 20 30 29 20 7b 0a 09 09 09 09 73 6c 6f 74 2d  > 0) {.....slot-
7740: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
7750: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09  d_hw_lock = 1;..
7760: 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  ..}...}....retur
7770: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
7780: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69  GENERIC);..}...i
7790: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
77a0: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20 30 29  tion_depth == 0)
77b0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
77c0: 47 5f 50 52 49 4e 54 46 28 22 54 65 72 6d 69 6e  G_PRINTF("Termin
77d0: 61 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  ating a transact
77e0: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74  ion that has not
77f0: 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09 72 65   begun!");....re
7800: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7810: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
7820: 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
7830: 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 69  ion_depth--;...i
7840: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
7850: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
7860: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
7870: 5f 50 52 49 4e 54 46 28 22 54 72 61 6e 73 61 63  _PRINTF("Transac
7880: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e 20 70  tions still in p
7890: 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74 65 72  rogress, not ter
78a0: 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61 72 64  minating on-card
78b0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75   Transaction (cu
78c0: 72 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69  rrent depth = %i
78d0: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  )", slot->transa
78e0: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09  ction_depth);...
78f0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7900: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
7910: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20  scard_trans_ret 
7920: 3d 20 53 43 61 72 64 45 6e 64 54 72 61 6e 73 61  = SCardEndTransa
7930: 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63  ction(slot->pcsc
7940: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
7950: 56 45 5f 43 41 52 44 29 3b 0a 09 69 66 20 28 73  VE_CARD);..if (s
7960: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21  card_trans_ret !
7970: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
7980: 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
7990: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
79a0: 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61  le to end transa
79b0: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
79c0: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
79d0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
79e0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
79f0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
7a00: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
7a10: 75 6c 6c 79 20 74 65 72 6d 69 6e 61 74 65 64 20  ully terminated 
7a20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73  transaction on s
7a30: 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d  lot (%s)", slot-
7a40: 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a  >pcsc_reader);..
7a50: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7a60: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
7a70: 20 41 50 44 55 20 52 65 6c 61 74 65 64 20 46 75   APDU Related Fu
7a80: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a  nctions */./*. *
7a90: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
7aa0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
7ab0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72  ey_send_apdu(str
7ac0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7ad0: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
7ae0: 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69  char class, unsi
7af0: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75  gned char instru
7b00: 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20  ction, unsigned 
7b10: 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65  char p1, unsigne
7b20: 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67  d char p2, unsig
7b30: 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75 6e 73  ned char lc, uns
7b40: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7b50: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
7b60: 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65  le, uint16_t *re
7b70: 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64  spcode, unsigned
7b80: 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c   char *respdata,
7b90: 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74   size_t *respdat
7ba0: 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52  a_len);. *. * AR
7bb0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
7bc0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7bd0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
7be0: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
7bf0: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75  s to. *. *     u
7c00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61  nsigned char cla
7c10: 73 73 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  ss. *         AP
7c20: 44 55 20 43 6c 61 73 73 20 28 47 53 43 49 53 5f  DU Class (GSCIS_
7c30: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 6f 72  CLASS_ISO7816 or
7c40: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f   GSCIS_CLASS_GLO
7c50: 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a 20 2a 20  BAL_PLATFORM. * 
7c60: 20 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79 29          usually)
7c70: 2c 20 28 43 4c 41 29 0a 20 2a 0a 20 2a 20 20 20  , (CLA). *. *   
7c80: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7c90: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 2a 20 20  instruction. *  
7ca0: 20 20 20 20 20 20 20 41 50 44 55 20 49 6e 73 74         APDU Inst
7cb0: 72 75 63 74 69 6f 6e 20 28 49 4e 53 29 0a 20 2a  ruction (INS). *
7cc0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
7cd0: 20 63 68 61 72 20 70 31 0a 20 2a 20 20 20 20 20   char p1. *     
7ce0: 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74      APDU Paramet
7cf0: 65 72 20 31 20 28 50 31 29 0a 20 2a 0a 20 2a 20  er 1 (P1). *. * 
7d00: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
7d10: 72 20 70 32 0a 20 2a 20 20 20 20 20 20 20 20 20  r p2. *         
7d20: 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 32  APDU Parameter 2
7d30: 20 28 50 32 29 0a 20 2a 0a 20 2a 20 20 20 20 20   (P2). *. *     
7d40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63  unsigned char lc
7d50: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
7d60: 20 4c 65 6e 67 74 68 20 6f 66 20 43 6f 6e 74 65   Length of Conte
7d70: 6e 74 20 28 4c 63 29 20 2d 2d 20 74 68 69 73 20  nt (Lc) -- this 
7d80: 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  is the length of
7d90: 20 22 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20   "data". *      
7da0: 20 20 20 70 61 72 61 6d 65 74 65 72 2e 20 20 49     parameter.  I
7db0: 66 20 22 64 61 74 61 22 20 69 73 20 73 70 65 63  f "data" is spec
7dc0: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74  ified as NULL, t
7dd0: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 77 69  his parameter wi
7de0: 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65  ll. *         be
7df0: 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20   ignored.. *. * 
7e00: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
7e10: 72 20 2a 64 61 74 61 0a 20 2a 20 20 20 20 20 20  r *data. *      
7e20: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75     Pointer to bu
7e30: 66 66 65 72 20 74 6f 20 73 65 6e 64 2e 20 20 49  ffer to send.  I
7e40: 74 20 73 68 6f 75 6c 64 20 62 65 20 22 4c 63 22  t should be "Lc"
7e50: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 49 66   bytes long.  If
7e60: 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63  . *         spec
7e70: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 22  ified as NULL, "
7e80: 4c 63 22 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  Lc" will not be 
7e90: 73 65 6e 74 2c 20 61 6e 64 20 74 68 69 73 20 62  sent, and this b
7ea0: 75 66 66 65 72 20 77 69 6c 6c 20 62 65 0a 20 2a  uffer will be. *
7eb0: 20 20 20 20 20 20 20 20 20 69 67 6e 6f 72 65 64           ignored
7ec0: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  .. *. *     unsi
7ed0: 67 6e 65 64 20 63 68 61 72 20 6c 65 0a 20 2a 20  gned char le. * 
7ee0: 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e          APDU Len
7ef0: 67 74 68 20 6f 66 20 45 78 70 65 63 74 61 74 69  gth of Expectati
7f00: 6f 6e 20 28 4c 65 29 20 2d 2d 20 74 68 69 73 20  on (Le) -- this 
7f10: 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  is the length of
7f20: 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20   the. *         
7f30: 65 78 70 65 63 74 65 64 20 72 65 70 6c 79 2e 20  expected reply. 
7f40: 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65 63   If this is spec
7f50: 69 66 69 65 64 20 61 73 20 30 20 74 68 65 6e 20  ified as 0 then 
7f60: 69 74 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20  it will not. *  
7f70: 20 20 20 20 20 20 20 62 65 20 73 65 6e 74 2e 0a         be sent..
7f80: 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36   *. *     uint16
7f90: 5f 74 20 2a 72 65 73 70 63 6f 64 65 0a 20 2a 20  _t *respcode. * 
7fa0: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f          [OUT] Po
7fb0: 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65  inter to storage
7fc0: 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73   of APDU respons
7fd0: 65 20 63 6f 64 65 2e 20 20 49 66 20 74 68 69 73  e code.  If this
7fe0: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73   is. *         s
7ff0: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
8000: 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 63  , the response c
8010: 6f 64 65 20 77 69 6c 6c 20 62 65 20 64 69 73 63  ode will be disc
8020: 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  arded.. *. *    
8030: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8040: 72 65 73 70 64 61 74 61 0a 20 2a 20 20 20 20 20  respdata. *     
8050: 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65      [OUT] Pointe
8060: 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20  r to storage of 
8070: 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 64 61  APDU response da
8080: 74 61 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a  ta.  If this is.
8090: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69   *         speci
80a0: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
80b0: 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20  e response data 
80c0: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65  will be discarde
80d0: 64 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20  d.  If. *       
80e0: 20 20 74 68 65 20 22 72 65 73 70 64 61 74 61 5f    the "respdata_
80f0: 6c 65 6e 22 20 70 61 72 61 6d 65 74 65 72 20 69  len" parameter i
8100: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  s specified as N
8110: 55 4c 4c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ULL, this buffer
8120: 0a 20 2a 20 20 20 20 20 20 20 20 20 77 69 6c 6c  . *         will
8130: 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 2e   not be updated.
8140: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
8150: 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 0a  t *respdata_len.
8160: 20 2a 20 20 20 20 20 20 20 20 20 5b 49 4e 2c 20   *         [IN, 
8170: 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 69 6e 69  OUT] Pointer ini
8180: 74 69 61 6c 69 6e 67 20 63 6f 6e 74 61 69 6e 69  tialing containi
8190: 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ng the size of t
81a0: 68 65 20 22 72 65 73 70 64 61 74 61 22 0a 20 2a  he "respdata". *
81b0: 20 20 20 20 20 20 20 20 20 62 75 66 66 65 72 2e           buffer.
81c0: 20 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69    Before returni
81d0: 6e 67 2c 20 74 68 65 20 70 6f 69 6e 74 65 64 20  ng, the pointed 
81e0: 74 6f 20 76 61 6c 75 65 20 69 73 20 75 70 64 61  to value is upda
81f0: 74 65 64 20 74 6f 20 74 68 65 0a 20 2a 20 20 20  ted to the. *   
8200: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
8210: 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f  bytes written to
8220: 20 74 68 65 20 62 75 66 66 65 72 2e 20 20 49 66   the buffer.  If
8230: 20 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69   this is specifi
8240: 65 64 20 61 73 0a 20 2a 20 20 20 20 20 20 20 20  ed as. *        
8250: 20 4e 55 4c 4c 2c 20 69 74 20 77 69 6c 6c 20 6e   NULL, it will n
8260: 6f 74 20 62 65 20 75 70 64 61 74 65 64 2c 20 61  ot be updated, a
8270: 6e 64 20 22 72 65 73 70 64 61 74 61 22 20 77 69  nd "respdata" wi
8280: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 63 61  ll be ignored ca
8290: 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 20 20 20  using. *        
82a0: 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61   the response da
82b0: 74 61 20 74 6f 20 62 65 20 64 69 73 63 61 72 64  ta to be discard
82c0: 65 64 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ed.. *. * RETURN
82d0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
82e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
82f0: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
8300: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
8310: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8320: 20 20 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20        On error. 
8330: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
8340: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20  C_E_TOKENABSENT 
8350: 20 49 66 20 74 68 65 20 73 65 6e 64 69 6e 67 20   If the sending 
8360: 66 61 69 6c 65 64 20 62 65 63 61 75 73 65 20 74  failed because t
8370: 68 65 20 74 6f 6b 65 6e 20 69 73 0a 20 2a 20 20  he token is. *  
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 62                ab
83a0: 73 65 6e 74 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  sent. *. * NOTES
83b0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
83c0: 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65  ction will conne
83d0: 63 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20  ct to the PC/SC 
83e0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67  Connection Manag
83f0: 65 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61  er via. *     ca
8400: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
8410: 74 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20  t() if needed.. 
8420: 2a 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c  *. *     It will
8430: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20   connect to the 
8440: 63 61 72 64 20 69 6e 20 74 68 65 20 72 65 61 64  card in the read
8450: 65 72 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  er attached to t
8460: 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73  he slot. *     s
8470: 70 65 63 69 66 69 65 64 2e 20 20 49 74 20 77 69  pecified.  It wi
8480: 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20  ll reconnect to 
8490: 74 68 65 20 63 61 72 64 20 69 66 20 74 68 65 20  the card if the 
84a0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20  connection. *   
84b0: 20 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a    goes away.. *.
84c0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
84d0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e  y_ret cackey_sen
84e0: 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61  d_apdu(struct ca
84f0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
8500: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
8510: 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63  lass, unsigned c
8520: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  har instruction,
8530: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
8540: 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  1, unsigned char
8550: 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p2, unsigned ch
8560: 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20  ar lc, unsigned 
8570: 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69  char *data, unsi
8580: 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69  gned char le, ui
8590: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65  nt16_t *respcode
85a0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
85b0: 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f  *respdata, size_
85c0: 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  t *respdata_len)
85d0: 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f   {..uint8_t majo
85e0: 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a  r_rc, minor_rc;.
85f0: 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f  .size_t bytes_to
8600: 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64  _copy, tmp_respd
8610: 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 43 41  ata_len;..LPCSCA
8620: 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 70 69  RD_IO_REQUEST pi
8630: 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f 52 44  oSendPci;..DWORD
8640: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52   protocol;..DWOR
8650: 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76  D xmit_len, recv
8660: 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _len;..LONG scar
8670: 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 72  d_xmit_ret, scar
8680: 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42  d_reconn_ret;..B
8690: 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 32  YTE xmit_buf[102
86a0: 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 32  4], recv_buf[102
86b0: 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f  4];..int pcsc_co
86c0: 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63 5f  nnect_ret, pcsc_
86d0: 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e  getresp_ret;..in
86e0: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f  t idx;...CACKEY_
86f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
8700: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
8710: 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  slot) {...CACKEY
8720: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
8730: 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63  nvalid slot spec
8740: 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ified.");....ret
8750: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8760: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
8770: 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
8780: 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
8790: 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
87a0: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
87b0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
87c0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
87d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
87e0: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  F("Unable to con
87f0: 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65  nect to card, re
8800: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
8810: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
8820: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
8830: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
8840: 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20  Determine which 
8850: 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64  protocol to send
8860: 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74 63   using */..switc
8870: 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f  h (slot->protoco
8880: 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52  l) {...case SCAR
8890: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09  D_PROTOCOL_T0:..
88a0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
88b0: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09  CARD_PCI_T0;....
88c0: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53  .break;...case S
88d0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
88e0: 3a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20  :....pioSendPci 
88f0: 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a  = SCARD_PCI_T1;.
8900: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66  ....break;...def
8910: 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f  ault:....CACKEY_
8920: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
8930: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66  valid protocol f
8940: 6f 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22  ound, aborting."
8950: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
8960: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
8970: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72  RIC);..}.../* Tr
8980: 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f  ansmit */..xmit_
8990: 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62  len = 0;..xmit_b
89a0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
89b0: 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75   class;..xmit_bu
89c0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
89d0: 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d  instruction;..xm
89e0: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
89f0: 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62  +] = p1;..xmit_b
8a00: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
8a10: 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20   p2;..if (data) 
8a20: 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  {...xmit_buf[xmi
8a30: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09  t_len++] = lc;..
8a40: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
8a50: 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20  dx < lc; idx++) 
8a60: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  {....xmit_buf[xm
8a70: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61  it_len++] = data
8a80: 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  [idx];...}..}...
8a90: 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20  if (le != 0x00) 
8aa0: 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  {...xmit_buf[xmi
8ab0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09  t_len++] = le;..
8ac0: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61  }.../* Begin Sma
8ad0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
8ae0: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
8af0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
8b00: 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61  slot);...if (cla
8b10: 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53  ss == GSCIS_CLAS
8b20: 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73  S_ISO7816 && ins
8b30: 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49  truction == GSCI
8b40: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26  S_INSTR_VERIFY &
8b50: 26 20 70 31 20 3d 3d 20 30 78 30 30 20 26 26 20  & p1 == 0x00 && 
8b60: 70 32 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  p2 == 0x00) {...
8b70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8b80: 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44  NTF("Sending APD
8b90: 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22  U: <<censored>>"
8ba0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43  );..} else {...C
8bb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8bc0: 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50  TBUF("Sending AP
8bd0: 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20  DU:", xmit_buf, 
8be0: 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  xmit_len);..}...
8bf0: 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  recv_len = sizeo
8c00: 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63  f(recv_buf);..sc
8c10: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53  ard_xmit_ret = S
8c20: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f  CardTransmit(slo
8c30: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69  t->pcsc_card, pi
8c40: 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62  oSendPci, xmit_b
8c50: 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55  uf, xmit_len, NU
8c60: 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72  LL, recv_buf, &r
8c70: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28  ecv_len);...if (
8c80: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
8c90: 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52  = SCARD_E_NOT_TR
8ca0: 41 4e 53 41 43 54 45 44 29 20 7b 0a 09 09 43 41  ANSACTED) {...CA
8cb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8cc0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e  F("Failed to sen
8cd0: 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28  d APDU to card (
8ce0: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20  SCardTransmit() 
8cf0: 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c 20  = %s/%lx), will 
8d00: 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  ask calling func
8d10: 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 20 28 6e  tion to retry (n
8d20: 6f 74 20 72 65 73 65 74 74 69 6e 67 20 63 61 72  ot resetting car
8d30: 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44  d)...", CACKEY_D
8d40: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
8d50: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
8d60: 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69  xmit_ret), (unsi
8d70: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64  gned long) scard
8d80: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 2f  _xmit_ret);..../
8d90: 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72  * Begin Smartcar
8da0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
8db0: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
8dc0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
8dd0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8de0: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b  Y_PCSC_E_RETRY);
8df0: 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f  ..}...if (scard_
8e00: 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52  xmit_ret != SCAR
8e10: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
8e20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8e30: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
8e40: 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72  send APDU to car
8e50: 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74  d (SCardTransmit
8e60: 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43  () = %s/%lx)", C
8e70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
8e80: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
8e90: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29  (scard_xmit_ret)
8ea0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
8eb0: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ) scard_xmit_ret
8ec0: 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
8ed0: 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69  UG_PRINTF("Marki
8ee0: 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e  ng slot as havin
8ef0: 67 20 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a  g been reset");.
8f00: 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
8f10: 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
8f20: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69  ...if (scard_xmi
8f30: 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57  t_ret == SCARD_W
8f40: 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09  _RESET_CARD) {..
8f50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8f60: 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71  RINTF("Reset req
8f70: 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f  uired, please ho
8f80: 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61  ld...");.....sca
8f90: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20  rd_reconn_ret = 
8fa0: 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
8fb0: 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52  _card(slot, SCAR
8fc0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20  D_PROTOCOL_T0 | 
8fd0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
8fe0: 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  1, &protocol);..
8ff0: 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63  ...if (scard_rec
9000: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
9010: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
9020: 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74  ../* Update prot
9030: 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74  ocol */.....slot
9040: 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f  ->protocol = pro
9050: 74 6f 63 6f 6c 3b 0a 09 09 09 09 73 77 69 74 63  tocol;.....switc
9060: 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f  h (slot->protoco
9070: 6c 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53  l) {......case S
9080: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
9090: 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50  :.......pioSendP
90a0: 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54  ci = SCARD_PCI_T
90b0: 30 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  0;........break;
90c0: 0a 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44  ......case SCARD
90d0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09  _PROTOCOL_T1:...
90e0: 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d  ....pioSendPci =
90f0: 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a   SCARD_PCI_T1;..
9100: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
9110: 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09  ..default:......
9120: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9130: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72  INTF("Invalid pr
9140: 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75  otocol found, bu
9150: 74 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f  t too late to do
9160: 20 61 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20   anything about 
9170: 69 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67  it now -- trying
9180: 20 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09   anyway.");.....
9190: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
91a0: 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62  ...../* Re-estab
91b0: 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e  lish transaction
91c0: 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73  , if it was pres
91d0: 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73  ent */.....if (s
91e0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
91f0: 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09  _depth > 0) {...
9200: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
9210: 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09  tion_depth--;...
9220: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
9230: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
9240: 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b  k = 1;......cack
9250: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
9260: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09  tion(slot);.....
9270: 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
9280: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65  BUG_PRINTF("Rese
9290: 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  t successful, re
92a0: 74 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a  transmitting");.
92b0: 0a 09 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20  .....recv_len = 
92c0: 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29  sizeof(recv_buf)
92d0: 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74  ;.....scard_xmit
92e0: 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e  _ret = SCardTran
92f0: 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  smit(slot->pcsc_
9300: 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69  card, pioSendPci
9310: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74  , xmit_buf, xmit
9320: 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76  _len, NULL, recv
9330: 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29  _buf, &recv_len)
9340: 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64  ;......if (scard
9350: 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41  _xmit_ret != SCA
9360: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
9370: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
9380: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e  G_PRINTF("Retran
9390: 73 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74  smit failed, ret
93a0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
93b0: 65 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65  e after disconne
93c0: 63 74 69 6e 67 20 74 68 65 20 63 61 72 64 20 28  cting the card (
93d0: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20  SCardTransmit = 
93e0: 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59  %s/%li)", CACKEY
93f0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
9400: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
9410: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f  d_xmit_ret), (lo
9420: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
9430: 65 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64  et);.......SCard
9440: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
9450: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
9460: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
9470: 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ....slot->pcsc_c
9480: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
9490: 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20  0;......./* End 
94a0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
94b0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c  ction */......sl
94c0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
94d0: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09  depth = 1;......
94e0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
94f0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
9500: 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
9510: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
9520: 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09  SENT);.....}....
9530: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43  } else {.....CAC
9540: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9550: 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  ("Disconnecting 
9560: 63 61 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61  card");......SCa
9570: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f  rdDisconnect(slo
9580: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
9590: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
95a0: 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f  .....slot->pcsc_
95b0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
95c0: 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20   0;....../* End 
95d0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
95e0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f  ction */.....slo
95f0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
9600: 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61  epth = 1;.....ca
9610: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
9620: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
9630: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9640: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
9650: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09  in failure");...
9660: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
9670: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
9680: 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  NT);....}...} el
9690: 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
96a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73  EBUG_PRINTF("Dis
96b0: 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22  connecting card"
96c0: 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63  );.....SCardDisc
96d0: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
96e0: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
96f0: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c  AVE_CARD);....sl
9700: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
9710: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
9720: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
9730: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
9740: 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
9750: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b  ction_depth = 1;
9760: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
9770: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
9780: 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
9790: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
97a0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
97b0: 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
97c0: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
97d0: 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a  ABSENT);...}..}.
97e0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
97f0: 52 49 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65  RINTBUF("Returne
9800: 64 20 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f  d Value:", recv_
9810: 62 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  buf, recv_len);.
9820: 0a 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c  ..if (recv_len <
9830: 20 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d   2) {.../* Minim
9840: 61 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67  al response leng
9850: 74 68 20 69 73 20 32 20 62 79 74 65 73 2c 20 72  th is 2 bytes, r
9860: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
9870: 75 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ure */...CACKEY_
9880: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
9890: 73 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c  sponse too small
98a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
98b0: 61 69 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e  ailure (recv_len
98c0: 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67   = %lu)", (unsig
98d0: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c  ned long) recv_l
98e0: 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53  en);..../* End S
98f0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
9900: 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79  tion */...cackey
9910: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
9920: 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72  (slot);....retur
9930: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
9940: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f  GENERIC);..}.../
9950: 2a 20 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75  * Determine resu
9960: 6c 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f  lt code */..majo
9970: 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b  r_rc = recv_buf[
9980: 72 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09  recv_len - 2];..
9990: 6d 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f  minor_rc = recv_
99a0: 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31  buf[recv_len - 1
99b0: 5d 3b 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65  ];..if (respcode
99c0: 29 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20  ) {...*respcode 
99d0: 3d 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38  = (major_rc << 8
99e0: 29 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d  ) | minor_rc;..}
99f0: 0a 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73  .../* Adjust mes
9a00: 73 61 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09  sage buffer */..
9a10: 72 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a  recv_len -= 2;..
9a20: 09 2f 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f  ./* Add bytes to
9a30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   return value */
9a40: 0a 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  ..tmp_respdata_l
9a50: 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73  en = 0;..if (res
9a60: 70 64 61 74 61 20 26 26 20 72 65 73 70 64 61 74  pdata && respdat
9a70: 61 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72  a_len) {...tmp_r
9a80: 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72  espdata_len = *r
9a90: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09  espdata_len;....
9aa0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
9ab0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a  *respdata_len;..
9ac0: 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c  ..if (recv_len <
9ad0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20   bytes_to_copy) 
9ae0: 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f  {....bytes_to_co
9af0: 70 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09  py = recv_len;..
9b00: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
9b10: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69  UG_PRINTF("Copyi
9b20: 6e 67 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20  ng %lu bytes to 
9b30: 74 68 65 20 62 75 66 66 65 72 20 28 72 65 63 76  the buffer (recv
9b40: 27 64 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75  'd %lu bytes, bu
9b50: 74 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73  t only %lu bytes
9b60: 20 6c 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66   left in our buf
9b70: 66 65 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  fer)", (unsigned
9b80: 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f   long) bytes_to_
9b90: 63 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  copy, (unsigned 
9ba0: 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20  long) recv_len, 
9bb0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
9bc0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a  *respdata_len);.
9bd0: 0a 09 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61  ...memcpy(respda
9be0: 74 61 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79  ta, recv_buf, by
9bf0: 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09  tes_to_copy);...
9c00: 72 65 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65  respdata += byte
9c10: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72  s_to_copy;....*r
9c20: 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79  espdata_len = by
9c30: 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74  tes_to_copy;...t
9c40: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  mp_respdata_len 
9c50: 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  -= bytes_to_copy
9c60: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  ;..} else {...if
9c70: 20 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29   (recv_len != 0)
9c80: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
9c90: 55 47 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77  UG_PRINTF("Throw
9ca0: 69 6e 67 20 61 77 61 79 20 25 6c 75 20 62 79 74  ing away %lu byt
9cb0: 65 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70  es, nowhere to p
9cc0: 75 74 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69  ut them!", (unsi
9cd0: 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f  gned long) recv_
9ce0: 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  len);...}..}...i
9cf0: 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30  f (major_rc == 0
9d00: 78 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e  x61) {.../* We n
9d10: 65 65 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09  eed to READ */..
9d20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9d30: 49 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61  INTF("Buffer rea
9d40: 64 20 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09  d required");...
9d50: 09 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d  .if (minor_rc ==
9d60: 20 30 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f   0x00) {....mino
9d70: 72 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50  r_rc = CACKEY_AP
9d80: 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70  DU_MTU;...}....p
9d90: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
9da0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
9db0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
9dc0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
9dd0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45  CIS_INSTR_GET_RE
9de0: 53 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78  SPONSE, 0x00, 0x
9df0: 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e  00, 0, NULL, min
9e00: 6f 72 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c  or_rc, respcode,
9e10: 20 72 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f   respdata, &tmp_
9e20: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a  respdata_len);..
9e30: 09 09 69 66 20 28 70 63 73 63 5f 67 65 74 72 65  ..if (pcsc_getre
9e40: 73 70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  sp_ret != CACKEY
9e50: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
9e60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9e70: 49 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61  INTF("Buffer rea
9e80: 64 20 66 61 69 6c 65 64 21 20 20 52 65 74 75 72  d failed!  Retur
9e90: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
9ea0: 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d  );...../* End Sm
9eb0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
9ec0: 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
9ed0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
9ee0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28  (slot);.....if (
9ef0: 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74  pcsc_getresp_ret
9f00: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
9f10: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72  E_RETRY) {.....r
9f20: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
9f30: 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d  C_E_RETRY);....}
9f40: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
9f50: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9f60: 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72  C);...}....if (r
9f70: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
9f80: 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  ..*respdata_len 
9f90: 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  += tmp_respdata_
9fa0: 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45  len;...}..../* E
9fb0: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
9fc0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61  nsaction */...ca
9fd0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
9fe0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43  tion(slot);....C
9ff0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a000: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
a010: 20 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72   success (buffer
a020: 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22   read complete)"
a030: 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
a040: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
a050: 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  }.../* End Smart
a060: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
a070: 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f   */..cackey_end_
a080: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
a090: 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72  );...if (major_r
a0a0: 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f  c == 0x90) {.../
a0b0: 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43  * Success */...C
a0c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a0d0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
a0e0: 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f   success (major_
a0f0: 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09  rc = 0x90)");...
a100: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
a110: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a  CSC_S_OK);..}...
a120: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a130: 49 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72  INTF("APDU Retur
a140: 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65  ned an error, re
a150: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
a160: 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  re");...return(C
a170: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
a180: 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  ERIC);.}../*. * 
a190: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
a1a0: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72  ssize_t cackey_r
a1b0: 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63  ead_buffer(struc
a1c0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
a1d0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
a1e0: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65  ar *buffer, size
a1f0: 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e  _t count, unsign
a200: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20  ed char t_or_v, 
a210: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f  size_t initial_o
a220: 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  ffset);. *. * AR
a230: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
a240: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
a250: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
a260: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
a270: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
a280: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
a290: 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20  har *buffer. *  
a2a0: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66         [OUT] Buf
a2b0: 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  fer. *. *     si
a2c0: 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20  ze_t count. *   
a2d0: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20        Number of 
a2e0: 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74  bytes to attempt
a2f0: 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20   to read. *. *  
a300: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
a310: 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20   t_or_v. *      
a320: 20 20 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d     Select the T-
a330: 62 75 66 66 65 72 20 28 30 31 29 20 6f 72 20 56  buffer (01) or V
a340: 2d 62 75 66 66 65 72 20 28 30 32 29 20 74 6f 20  -buffer (02) to 
a350: 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a  read from.  . *.
a360: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e   *     size_t in
a370: 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20  itial_offset. * 
a380: 20 20 20 20 20 20 20 20 53 70 65 63 69 66 79 20          Specify 
a390: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65  the offset to be
a3a0: 67 69 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f  gin the read fro
a3b0: 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52  m. *. *. * RETUR
a3c0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
a3d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
a3e0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
a3f0: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
a400: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e  y read, or -1 on
a410: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f   error.. *. * NO
a420: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
a430: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
a440: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61  ize_t cackey_rea
a450: 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20  d_buffer(struct 
a460: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
a470: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
a480: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74   *buffer, size_t
a490: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64   count, unsigned
a4a0: 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69   char t_or_v, si
a4b0: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66  ze_t initial_off
a4c0: 73 65 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  set) {..unsigned
a4d0: 20 63 68 61 72 20 2a 69 6e 69 74 5f 62 75 66 66   char *init_buff
a4e0: 65 72 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74  er;..size_t init
a4f0: 5f 63 6f 75 6e 74 3b 0a 09 73 69 7a 65 5f 74 20  _count;..size_t 
a500: 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66  init_initial_off
a510: 73 65 74 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f 66  set;...size_t of
a520: 66 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66  fset = 0, max_of
a530: 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b  fset, max_count;
a540: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
a550: 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f  cmd[2];..uint16_
a560: 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74  t respcode;..int
a570: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43   send_ret;...CAC
a580: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a590: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
a5a0: 6e 69 74 5f 62 75 66 66 65 72 20 3d 20 62 75 66  nit_buffer = buf
a5b0: 66 65 72 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e 74  fer;..init_count
a5c0: 20 3d 20 63 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f   = count;..init_
a5d0: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 3d  initial_offset =
a5e0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b   initial_offset;
a5f0: 0a 0a 09 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20  ...max_offset = 
a600: 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e  count;..max_coun
a610: 74 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  t = CACKEY_APDU_
a620: 4d 54 55 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f  MTU;...if (t_or_
a630: 76 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76  v != 1 && t_or_v
a640: 20 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b 45   != 2) {...CACKE
a650: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a660: 49 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20 70  Invalid T or V p
a670: 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69  arameter specifi
a680: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
a690: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
a6a0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
a6b0: 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b  cmd[0] = t_or_v;
a6c0: 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09  ...while (1) {..
a6d0: 09 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d  .if (offset >= m
a6e0: 61 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09 09  ax_offset) {....
a6f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a700: 4e 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f 20  NTF("Buffer too 
a710: 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67  small, returning
a720: 20 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22   what we got..."
a730: 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
a740: 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78  }....count = max
a750: 5f 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65 74  _offset - offset
a760: 3b 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e 20  ;...if (count > 
a770: 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  max_count) {....
a780: 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e  count = max_coun
a790: 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d  t;...}....cmd[1]
a7a0: 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e   = count;....sen
a7b0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
a7c0: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
a7d0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
a7e0: 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49  L_PLATFORM, GSCI
a7f0: 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 46  S_INSTR_READ_BUF
a800: 46 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f  FER, ((initial_o
a810: 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20  ffset + offset) 
a820: 3e 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28 69  >> 8) & 0xff, (i
a830: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20  nitial_offset + 
a840: 6f 66 66 73 65 74 29 20 26 20 30 78 66 66 2c 20  offset) & 0xff, 
a850: 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64  sizeof(cmd), cmd
a860: 2c 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f 64  , 0x00, &respcod
a870: 65 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66 73  e, buffer + offs
a880: 65 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 09  et, &count);....
a890: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
a8a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
a8b0: 54 52 59 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  TRY) {....CACKEY
a8c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
a8d0: 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c  DPU Sending fail
a8e0: 65 64 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61  ed, retrying rea
a8f0: 64 20 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 09  d buffer");.....
a900: 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 72 65  return(cackey_re
a910: 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20  ad_buffer(slot, 
a920: 69 6e 69 74 5f 62 75 66 66 65 72 2c 20 69 6e 69  init_buffer, ini
a930: 74 5f 63 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c  t_count, t_or_v,
a940: 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66   init_initial_of
a950: 66 73 65 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69  fset));...}....i
a960: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
a970: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
a980: 20 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f   {....if (respco
a990: 64 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a  de == 0x6A86) {.
a9a0: 09 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e  ....if (max_coun
a9b0: 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09 62  t == 1) {......b
a9c0: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
a9d0: 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78  .max_count = max
a9e0: 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09  _count / 2;.....
a9f0: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
aa00: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
aa10: 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
aa20: 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c  send_apdu() fail
aa30: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
aa40: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
aa50: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
aa60: 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75  ...offset += cou
aa70: 6e 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74  nt;....if (count
aa80: 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a   < max_count) {.
aa90: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
aaa0: 50 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72 65  PRINTF("Short re
aab0: 61 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69  ad -- count = %i
aac0: 2c 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20  , cmd[1] = %i", 
aad0: 28 69 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e  (int) count, (in
aae0: 74 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09  t) cmd[1]);.....
aaf0: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23  break;...}..}..#
ab00: 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
ab10: 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
ab20: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
ab30: 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f 50  .if (offset > _P
ab40: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20  OSIX_SSIZE_MAX) 
ab50: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
ab60: 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20  _PRINTF("Offset 
ab70: 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20  exceeds maximum 
ab80: 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67  value, returning
ab90: 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61   in failure. (ma
aba0: 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 20  x = %li, offset 
abb0: 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20  = %lu)", (long) 
abc0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
abd0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
abe0: 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 65  ) offset);....re
abf0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
ac00: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43  endif.#endif...C
ac10: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ac20: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
ac30: 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 25   success, read %
ac40: 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69  lu bytes", (unsi
ac50: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65  gned long) offse
ac60: 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66  t);...return(off
ac70: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  set);.}../*. * S
ac80: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
ac90: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
aca0: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
acb0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
acc0: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
acd0: 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a  d char *aid, siz
ace0: 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a  e_t aid_len);. *
acf0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
ad00: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
ad10: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
ad20: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
ad30: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
ad40: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  o. *. *     unsi
ad50: 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a 20  gned char *aid. 
ad60: 2a 20 20 20 20 20 20 20 20 20 42 75 66 66 65 72  *         Buffer
ad70: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c   containing Appl
ad80: 65 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74 0a  et ID to select.
ad90: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
ada0: 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20   aid_len. *     
adb0: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79      Number of by
adc0: 74 65 73 20 69 6e 20 74 68 65 20 22 61 69 64 22  tes in the "aid"
add0: 20 28 41 70 70 6c 65 74 20 49 44 29 20 70 61 72   (Applet ID) par
ade0: 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54  ameter. *. * RET
adf0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
ae00: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
ae10: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
ae20: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
ae30: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
ae40: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
ae50: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
ae60: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61   None. *. */.sta
ae70: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
ae80: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
ae90: 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  let(struct cacke
aea0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
aeb0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64  signed char *aid
aec0: 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e  , size_t aid_len
aed0: 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  ) {..int send_re
aee0: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
aef0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
af00: 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
af10: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65  BUG_PRINTBUF("Se
af20: 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a 22  lecting applet:"
af30: 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b  , aid, aid_len);
af40: 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
af50: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
af60: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
af70: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
af80: 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47 53  INSTR_SELECT, GS
af90: 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54  CIS_PARAM_SELECT
afa0: 5f 41 50 50 4c 45 54 2c 20 30 78 30 30 2c 20 61  _APPLET, 0x00, a
afb0: 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30  id_len, aid, 0x0
afc0: 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  0, NULL, NULL, N
afd0: 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64  ULL);...if (send
afe0: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
aff0: 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09  CSC_E_RETRY) {..
b000: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b010: 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69  INTF("ADPU Sendi
b020: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79  ng failed, retry
b030: 69 6e 67 20 73 65 6c 65 63 74 20 61 70 70 6c 65  ing select apple
b040: 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63  t");....return(c
b050: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
b060: 6c 65 74 28 73 6c 6f 74 2c 20 61 69 64 2c 20 61  let(slot, aid, a
b070: 69 64 5f 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69  id_len));..}...i
b080: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
b090: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
b0a0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
b0b0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
b0c0: 20 74 6f 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c   to open applet,
b0d0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
b0e0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
b0f0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
b100: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
b110: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b120: 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c  NTF("Successfull
b130: 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22  y selected file"
b140: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
b150: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
b160: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
b170: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
b180: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
b190: 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63  _file(struct cac
b1a0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
b1b0: 75 69 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a  uint16_t ef);. *
b1c0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
b1d0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
b1e0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
b1f0: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
b200: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
b210: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74  o. *. *     uint
b220: 31 36 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20  16_t ef. *      
b230: 20 20 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c     Elemental Fil
b240: 65 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20  e to select. *. 
b250: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
b260: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
b270: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
b280: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
b290: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
b2a0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
b2b0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
b2c0: 2a 20 20 20 20 20 54 68 69 73 20 73 65 6c 65 63  *     This selec
b2d0: 74 73 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79  ts an Elementary
b2e0: 20 46 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72   File (EF) under
b2f0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73   the currently s
b300: 65 6c 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44  elected. *     D
b310: 65 64 69 63 61 74 65 64 20 46 69 6c 65 20 28 44  edicated File (D
b320: 46 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70  F). *. *     Typ
b330: 69 63 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63  ically this is c
b340: 61 6c 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65  alled after sele
b350: 63 74 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63  cting the correc
b360: 74 20 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a  t Applet (using.
b370: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65   *     cackey_se
b380: 6c 65 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72  lect_applet) for
b390: 20 56 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f   VM cards. *. */
b3a0: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
b3b0: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
b3c0: 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63  _file(struct cac
b3d0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
b3e0: 75 69 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09  uint16_t ef) {..
b3f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66 69  unsigned char fi
b400: 64 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73  d_buf[2];..int s
b410: 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  end_ret;...CACKE
b420: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b430: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20  Called.");.../* 
b440: 4f 70 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74  Open the element
b450: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64  ary file */..fid
b460: 5f 62 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e  _buf[0] = (ef >>
b470: 20 38 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64   8) & 0xff;..fid
b480: 5f 62 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30  _buf[1] = ef & 0
b490: 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  xff;...CACKEY_DE
b4a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65  BUG_PRINTF("Sele
b4b0: 63 74 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c  cting file: %04l
b4c0: 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  x", (unsigned lo
b4d0: 6e 67 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f  ng) ef);...send_
b4e0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
b4f0: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
b500: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
b510: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45  , GSCIS_INSTR_SE
b520: 4c 45 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43  LECT, 0x02, 0x0C
b530: 2c 20 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66  , sizeof(fid_buf
b540: 29 2c 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30  ), fid_buf, 0x00
b550: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
b560: 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72  LL);..if (send_r
b570: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
b580: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
b590: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b5a0: 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20  "Failed to open 
b5b0: 66 69 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  file, returning 
b5c0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
b5d0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b5e0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
b5f0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
b600: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73  G_PRINTF("Succes
b610: 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20  sfully selected 
b620: 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e  file");...return
b630: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
b640: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
b650: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69  POSIS. *     voi
b660: 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c  d cackey_free_tl
b670: 76 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  v(struct cackey_
b680: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74  tlv_entity *root
b690: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
b6a0: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
b6b0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
b6c0: 74 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20  ty *root. *     
b6d0: 20 20 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20      Root of the 
b6e0: 54 4c 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72  TLV list to star
b6f0: 74 20 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20  t freeing. *. * 
b700: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
b710: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e      None. *. * N
b720: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
b730: 20 66 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20   function frees 
b740: 74 68 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c  the TLV linked l
b750: 69 73 74 65 64 20 72 65 74 75 72 6e 65 64 20 66  isted returned f
b760: 72 6f 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b  rom. *     "cack
b770: 65 79 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a  ey_read_tlv". *.
b780: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
b790: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
b7a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
b7b0: 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20  v_entity *root) 
b7c0: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
b7d0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72  _tlv_entity *cur
b7e0: 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28  r, *next;...if (
b7f0: 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  root == NULL) {.
b800: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66  ..return;..}...f
b810: 6f 72 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b  or (curr = root;
b820: 20 63 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65   curr; curr = ne
b830: 78 74 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63  xt) {...next = c
b840: 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73  urr->_next;....s
b850: 77 69 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67  witch (curr->tag
b860: 29 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ) {....case GSCI
b870: 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a  S_TAG_ACR_TABLE:
b880: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
b890: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  AG_CERTIFICATE:.
b8a0: 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61  ....if (curr->va
b8b0: 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65  lue) {......free
b8c0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09  (curr->value);..
b8d0: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
b8e0: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
b8f0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69  G_CARDURL:.....i
b900: 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  f (curr->value_c
b910: 61 72 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66  ardurl) {......f
b920: 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ree(curr->value_
b930: 63 61 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a  cardurl);.....}.
b940: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
b950: 09 09 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d  ..free(curr);..}
b960: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
b970: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
b980: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
b990: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
b9a0: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
b9b0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
b9c0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
b9d0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
b9e0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
b9f0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
ba00: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28  cackey_read_tlv(
ba10: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
ba20: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72  ot *slot) {..str
ba30: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
ba40: 6e 74 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69  ntity *curr_enti
ba50: 74 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c  ty, *root = NULL
ba60: 2c 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a  , *last = NULL;.
ba70: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  .unsigned char t
ba80: 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c  len_buf[2], tval
ba90: 5f 62 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61  _buf[1024], *tva
baa0: 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  l;..unsigned cha
bab0: 72 20 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76  r vlen_buf[2], v
bac0: 76 61 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a  val_buf[8192], *
bad0: 76 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20  vval;..unsigned 
bae0: 63 68 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75  char *tmpbuf;..u
baf0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70  nsigned long tmp
bb00: 62 75 66 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74  buflen;..ssize_t
bb10: 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73   tlen, vlen;..ss
bb20: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a  ize_t read_ret;.
bb30: 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74  .size_t offset_t
bb40: 20 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d   = 0, offset_v =
bb50: 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68   0;..unsigned ch
bb60: 61 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20  ar tag;..size_t 
bb70: 6c 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48  length;.#ifdef H
bb80: 41 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e  AVE_LIBZ..int un
bb90: 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65  compress_ret;.#e
bba0: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
bbb0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
bbc0: 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65  ed.");...read_re
bbd0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
bbe0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65  buffer(slot, tle
bbf0: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c  n_buf, sizeof(tl
bc00: 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73  en_buf), 1, offs
bc10: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64  et_t);..if (read
bc20: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74  _ret != sizeof(t
bc30: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  len_buf)) {...CA
bc40: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bc50: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20  F("Read failed, 
bc60: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
bc70: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
bc80: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c  n(NULL);..}...tl
bc90: 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31  en = (tlen_buf[1
bca0: 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62  ] << 8) | tlen_b
bcb0: 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65  uf[0];...read_re
bcc0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
bcd0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65  buffer(slot, vle
bce0: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c  n_buf, sizeof(vl
bcf0: 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73  en_buf), 2, offs
bd00: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64  et_v);..if (read
bd10: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76  _ret != sizeof(v
bd20: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  len_buf)) {...CA
bd30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bd40: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20  F("Read failed, 
bd50: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
bd60: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
bd70: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c  n(NULL);..}...vl
bd80: 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31  en = (vlen_buf[1
bd90: 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62  ] << 8) | vlen_b
bda0: 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f  uf[0];...CACKEY_
bdb0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
bdc0: 67 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20  g Length = %lu, 
bdd0: 56 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25  Value Length = %
bde0: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
bdf0: 6f 6e 67 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69  ong) tlen, (unsi
be00: 67 6e 65 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29  gned long) vlen)
be10: 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20  ;...offset_t += 
be20: 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20  2;..offset_v += 
be30: 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20  2;...if (tlen > 
be40: 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29  sizeof(tval_buf)
be50: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
be60: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c  UG_PRINTF("Tag l
be70: 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72  ength is too lar
be80: 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ge, returning in
be90: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
bea0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
beb0: 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a  ..if (vlen > siz
bec0: 65 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b  eof(vval_buf)) {
bed0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bee0: 50 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65  PRINTF("Value le
bef0: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67  ngth is too larg
bf00: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
bf10: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
bf20: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
bf30: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
bf40: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
bf50: 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74  lot, tval_buf, t
bf60: 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  len, 1, offset_t
bf70: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
bf80: 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41   != tlen) {...CA
bf90: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bfa0: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
bfb0: 64 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65  d entire T-buffe
bfc0: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
bfd0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
bfe0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
bff0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
c000: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
c010: 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76  lot, vval_buf, v
c020: 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  len, 2, offset_v
c030: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
c040: 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41   != vlen) {...CA
c050: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c060: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
c070: 64 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65  d entire V-buffe
c080: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
c090: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
c0a0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
c0b0: 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66  .tval = tval_buf
c0c0: 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62  ;..vval = vval_b
c0d0: 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e  uf;..while (tlen
c0e0: 20 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30   > 0 && vlen > 0
c0f0: 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61  ) {...tag = *tva
c100: 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74  l;...tval++;...t
c110: 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74  len--;....if (*t
c120: 76 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09  val == 0xff) {..
c130: 09 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c  ..length = (tval
c140: 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c  [2] << 8) | tval
c150: 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20  [1];....tval += 
c160: 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b  3;....tlen -= 3;
c170: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c  ...} else {....l
c180: 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09  ength = *tval;..
c190: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65  ..tval++;....tle
c1a0: 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  n--;...}....CACK
c1b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c1c0: 22 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22  "Tag: %s (%02x)"
c1d0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
c1e0: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74  UNC_TAG_TO_STR(t
c1f0: 61 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  ag), (unsigned i
c200: 6e 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b  nt) tag);...CACK
c210: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
c220: 46 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c  F("Value:", vval
c230: 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75  , length);....cu
c240: 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  rr_entity = NULL
c250: 3b 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29  ;...switch (tag)
c260: 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53   {....case GSCIS
c270: 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09  _TAG_CARDURL:...
c280: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
c290: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
c2a0: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
c2b0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
c2c0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d  alue_cardurl = m
c2d0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
c2e0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
c2f0: 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09  _cardurl));.....
c300: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74  .memcpy(curr_ent
c310: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
c320: 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35  rl->rid, vval, 5
c330: 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
c340: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
c350: 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61  l->apptype = vva
c360: 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[5];.....curr_e
c370: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
c380: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d  durl->objectid =
c390: 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20   (vval[6] << 8) 
c3a0: 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63  | vval[7];.....c
c3b0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
c3c0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
c3d0: 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38   = (vval[8] << 8
c3e0: 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09  ) | vval[9];....
c3f0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
c400: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
c410: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
c420: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
c430: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
c440: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
c450: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
c460: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
c470: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
c480: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
c490: 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a  alloc(length);..
c4a0: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
c4b0: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
c4c0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
c4d0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
c4e0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
c4f0: 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
c500: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
c510: 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66  ->value = tmpbuf
c520: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
c530: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
c540: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
c550: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
c560: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
c570: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
c580: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
c590: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66  r_entity));..#if
c5a0: 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09  def HAVE_LIBZ...
c5b0: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65  ..tmpbuflen = le
c5c0: 6e 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d  ngth * 2;.....tm
c5d0: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d  pbuf = malloc(tm
c5e0: 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75  pbuflen);......u
c5f0: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
c600: 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75  uncompress(tmpbu
c610: 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76  f, &tmpbuflen, v
c620: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09  val, length);...
c630: 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
c640: 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret != Z_OK) {.
c650: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
c660: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
c670: 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20   to decompress, 
c680: 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74  uncompress() ret
c690: 75 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f  urned %i -- reso
c6a0: 72 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20  rting to direct 
c6b0: 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73  copy", uncompres
c6c0: 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d  s_ret);.......tm
c6d0: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
c6e0: 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d  ;......memcpy(tm
c6f0: 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  pbuf, vval, leng
c700: 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  th);.....}......
c710: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c720: 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73  NTBUF("Decompres
c730: 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66  sed to:", tmpbuf
c740: 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65  , tmpbuflen);.#e
c750: 6c 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  lse.....CACKEY_D
c760: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73  EBUG_PRINTF("Mis
c770: 73 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72  sing ZLIB Suppor
c780: 74 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63  t, this certific
c790: 61 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73  ate is likely us
c7a0: 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09  eless...");.....
c7b0: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
c7c0: 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  gth;.....memcpy(
c7d0: 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
c7e0: 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  ngth);.#endif...
c7f0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
c800: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
c810: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
c820: 74 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  th = tmpbuflen;.
c830: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
c840: 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b  >value = tmpbuf;
c850: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
c860: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
c870: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
c880: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
c890: 43 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65  CS15:.....curr_e
c8a0: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
c8b0: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
c8c0: 74 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ty));......curr_
c8d0: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
c8e0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
c8f0: 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d  ty->value_byte =
c900: 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75   vval[0];.....cu
c910: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
c920: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
c930: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c  eak;...}....vval
c940: 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c   += length;...vl
c950: 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09  en -= length;...
c960: 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79  .if (curr_entity
c970: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   != NULL) {....i
c980: 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29  f (root == NULL)
c990: 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75   {.....root = cu
c9a0: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
c9b0: 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20  ....if (last != 
c9c0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74  NULL) {.....last
c9d0: 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65  ->_next = curr_e
c9e0: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
c9f0: 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  last = curr_enti
ca00: 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  ty;...}..}...ret
ca10: 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a  urn(root);.}../*
ca20: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
ca30: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
ca40: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
ca50: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
ca60: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
ca70: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
ca80: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
ca90: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
caa0: 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72  y_free_certs(str
cab0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
cac0: 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c  identity *start,
cad0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69   size_t count, i
cae0: 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b  nt free_start) {
caf0: 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09  ..size_t idx;...
cb00: 69 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c  if (start == NUL
cb10: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  L) {...return;..
cb20: 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
cb30: 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69  ; idx < count; i
cb40: 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73 74  dx++) {...if (st
cb50: 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  art[idx].certifi
cb60: 63 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65 28  cate) {....free(
cb70: 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
cb80: 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a  ficate);...}..}.
cb90: 0a 09 69 66 20 28 66 72 65 65 5f 73 74 61 72 74  ..if (free_start
cba0: 29 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72 74  ) {...free(start
cbb0: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a  );..}...return;.
cbc0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
cbd0: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
cbe0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
cbf0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
cc00: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
cc10: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
cc20: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
cc30: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
cc40: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
cc50: 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72  entity *cackey_r
cc60: 65 61 64 5f 63 65 72 74 73 28 73 74 72 75 63 74  ead_certs(struct
cc70: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
cc80: 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65  ot, struct cacke
cc90: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
cca0: 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e 65 64  *certs, unsigned
ccb0: 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a   long *count) {.
ccc0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
ccd0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 75  csc_identity *cu
cce0: 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20 63  rr_id;..struct c
ccf0: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
cd00: 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63 5f   *ccc_tlv, *ccc_
cd10: 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c 20  curr, *app_tlv, 
cd20: 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73 69  *app_curr;..unsi
cd30: 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61 69  gned char ccc_ai
cd40: 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44  d[] = {GSCIS_AID
cd50: 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  _CCC};..unsigned
cd60: 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37   char curr_aid[7
cd70: 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ];..unsigned lon
cd80: 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63  g outidx = 0;..c
cd90: 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61  ackey_ret transa
cda0: 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 69 6e 74 20  ction_ret;..int 
cdb0: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 3b  certs_resizable;
cdc0: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c 20  ..int send_ret, 
cdd0: 73 65 6c 65 63 74 5f 72 65 74 3b 0a 0a 09 43 41  select_ret;...CA
cde0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cdf0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
ce00: 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c  if (count == NUL
ce10: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
ce20: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 6f 75 6e  BUG_PRINTF("coun
ce30: 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72  t is NULL, retur
ce40: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
ce50: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
ce60: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72  L);..}...if (cer
ce70: 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ts != NULL) {...
ce80: 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30 29  if (*count == 0)
ce90: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
cea0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
ceb0: 73 74 65 64 20 77 65 20 72 65 74 75 72 6e 20 30  sted we return 0
cec0: 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72 74 2d   objects, short-
ced0: 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 09 09 72  circuit");.....r
cee0: 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09  eturn(certs);...
cef0: 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20  }..}.../* Begin 
cf00: 61 20 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e  a SmartCard tran
cf10: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e  saction */..tran
cf20: 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61  saction_ret = ca
cf30: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
cf40: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69  action(slot);..i
cf50: 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72  f (transaction_r
cf60: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
cf70: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
cf80: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
cf90: 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72  "Unable begin tr
cfa0: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
cfb0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
cfc0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
cfd0: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72  L);..}...if (cer
cfe0: 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ts == NULL) {...
cff0: 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73  certs = malloc(s
d000: 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20  izeof(*certs) * 
d010: 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35  5);...*count = 5
d020: 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61  ;...certs_resiza
d030: 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65  ble = 1;..} else
d040: 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a   {...certs_resiz
d050: 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f  able = 0;..}.../
d060: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 43 43 43  * Select the CCC
d070: 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64   Applet */..send
d080: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
d090: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
d0a0: 2c 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f  , ccc_aid, sizeo
d0b0: 66 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66  f(ccc_aid));..if
d0c0: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
d0d0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
d0e0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
d0f0: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
d100: 74 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41 70  to select CCC Ap
d110: 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20  plet, returning 
d120: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
d130: 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
d140: 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
d150: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f  ion */...cackey_
d160: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
d170: 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  slot);....return
d180: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  (NULL);..}.../* 
d190: 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70  Read all the app
d1a0: 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43  lets from the CC
d1b0: 43 27 73 20 54 4c 56 20 2a 2f 0a 09 63 63 63 5f  C's TLV */..ccc_
d1c0: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
d1d0: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f  d_tlv(slot);.../
d1e0: 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55  * Look for CARDU
d1f0: 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70  RLs that cooresp
d200: 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65  ond to PKI apple
d210: 74 73 20 2a 2f 0a 09 66 6f 72 20 28 63 63 63 5f  ts */..for (ccc_
d220: 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b 20  curr = ccc_tlv; 
d230: 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63 75  ccc_curr; ccc_cu
d240: 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 5f  rr = ccc_curr->_
d250: 6e 65 78 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  next) {...CACKEY
d260: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
d270: 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e  ound tag: %s ...
d280: 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47   ", CACKEY_DEBUG
d290: 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52  _FUNC_TAG_TO_STR
d2a0: 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29 29  (ccc_curr->tag))
d2b0: 3b 0a 0a 09 09 69 66 20 28 63 63 63 5f 63 75 72  ;....if (ccc_cur
d2c0: 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f  r->tag != GSCIS_
d2d0: 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a 09  TAG_CARDURL) {..
d2e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d2f0: 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69  RINTF("  ... ski
d300: 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c  pping it (we onl
d310: 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 41 52  y care about CAR
d320: 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 63 6f  DURLs)");.....co
d330: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69  ntinue;...}....i
d340: 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  f ((ccc_curr->va
d350: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
d360: 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f 54 4c  type & CACKEY_TL
d370: 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20 43 41  V_APP_PKI) != CA
d380: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
d390: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
d3a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
d3b0: 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
d3c0: 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
d3d0: 74 20 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74  t PKI applets, t
d3e0: 68 69 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f  his applet suppo
d3f0: 72 74 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20  rts: %s/%02x)", 
d400: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
d410: 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52  C_APPTYPE_TO_STR
d420: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
d430: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
d440: 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  e), (unsigned in
d450: 74 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  t) ccc_curr->val
d460: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
d470: 79 70 65 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  ype);.....contin
d480: 75 65 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  ue;...}....CACKE
d490: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
d4a0: 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72  ("RID:", ccc_cur
d4b0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
d4c0: 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  ->rid, sizeof(cc
d4d0: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
d4e0: 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09  rdurl->rid));...
d4f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d500: 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73 2f  NTF("AppID = %s/
d510: 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
d520: 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
d530: 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
d540: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
d550: 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e 65  appid), (unsigne
d560: 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72  d long) ccc_curr
d570: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
d580: 3e 61 70 70 69 64 29 3b 0a 09 09 43 41 43 4b 45  >appid);...CACKE
d590: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d5a0: 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30  ObjectID = %s/%0
d5b0: 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  4lx", CACKEY_DEB
d5c0: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
d5d0: 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76  _STR(ccc_curr->v
d5e0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
d5f0: 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e  jectid), (unsign
d600: 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72  ed long) ccc_cur
d610: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
d620: 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09  ->objectid);....
d630: 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c  memcpy(curr_aid,
d640: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
d650: 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73  _cardurl->rid, s
d660: 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e  izeof(ccc_curr->
d670: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72  value_cardurl->r
d680: 69 64 29 29 3b 0a 09 09 63 75 72 72 5f 61 69 64  id));...curr_aid
d690: 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64  [sizeof(curr_aid
d6a0: 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75  ) - 2] = (ccc_cu
d6b0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
d6c0: 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26  l->appid >> 8) &
d6d0: 20 30 78 66 66 3b 0a 09 09 63 75 72 72 5f 61 69   0xff;...curr_ai
d6e0: 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  d[sizeof(curr_ai
d6f0: 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75  d) - 1] = ccc_cu
d700: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
d710: 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b  l->appid & 0xff;
d720: 0a 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20 66 6f  ..../* Select fo
d730: 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20 2a  und applet ... *
d740: 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  /...select_ret =
d750: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
d760: 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72 72  pplet(slot, curr
d770: 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72  _aid, sizeof(cur
d780: 72 5f 61 69 64 29 29 3b 0a 09 09 69 66 20 28 73  r_aid));...if (s
d790: 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  elect_ret != CAC
d7a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
d7b0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d7c0: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
d7d0: 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74  to select applet
d7e0: 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65  , skipping proce
d7f0: 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62  ssing of this ob
d800: 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e 74  ject");.....cont
d810: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20  inue;...}..../* 
d820: 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74 20 28  ... and object (
d830: 66 69 6c 65 29 20 2a 2f 0a 09 09 73 65 6c 65 63  file) */...selec
d840: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  t_ret = cackey_s
d850: 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c  elect_file(slot,
d860: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
d870: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
d880: 69 64 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63  id);...if (selec
d890: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
d8a0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
d8b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d8c0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
d8d0: 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70  elect file, skip
d8e0: 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20  ping processing 
d8f0: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29  of this object")
d900: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
d910: 09 09 7d 0a 0a 09 09 2f 2a 20 50 72 6f 63 65 73  ..}..../* Proces
d920: 73 20 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c  s this file's TL
d930: 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65  V looking for ce
d940: 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09  rtificates */...
d950: 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79  app_tlv = cackey
d960: 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b  _read_tlv(slot);
d970: 0a 0a 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72  ....for (app_cur
d980: 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70  r = app_tlv; app
d990: 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20  _curr; app_curr 
d9a0: 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78  = app_curr->_nex
d9b0: 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
d9c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
d9d0: 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41 43  nd tag: %s", CAC
d9e0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54  KEY_DEBUG_FUNC_T
d9f0: 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63 75  AG_TO_STR(app_cu
da00: 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 69 66  rr->tag));....if
da10: 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 20   (app_curr->tag 
da20: 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  != GSCIS_TAG_CER
da30: 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
da40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
da50: 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
da60: 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
da70: 63 61 72 65 20 61 62 6f 75 74 20 43 45 52 54 49  care about CERTI
da80: 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09 09  FICATEs)");.....
da90: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
daa0: 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63  ....curr_id = &c
dab0: 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09  erts[outidx];...
dac0: 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d  .outidx++;.....m
dad0: 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 61  emcpy(curr_id->a
dae0: 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64 2c  pplet, curr_aid,
daf0: 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d   sizeof(curr_id-
db00: 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 63 75  >applet));....cu
db10: 72 72 5f 69 64 2d 3e 66 69 6c 65 20 3d 20 63 63  rr_id->file = cc
db20: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
db30: 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b  rdurl->objectid;
db40: 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79  ....curr_id->key
db50: 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09 43  size = -1;.....C
db60: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
db70: 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75 72 72  TF("Filling curr
db80: 5f 69 64 2d 3e 61 70 70 6c 65 74 20 28 25 70 29  _id->applet (%p)
db90: 20 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a   with %lu bytes:
dba0: 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c  ", curr_id->appl
dbb0: 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  et, (unsigned lo
dbc0: 6e 67 29 20 73 69 7a 65 6f 66 28 63 75 72 72 5f  ng) sizeof(curr_
dbd0: 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09  id->applet));...
dbe0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
dbf0: 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c 20 63  INTBUF("VAL:", c
dc00: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
dc10: 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e  sizeof(curr_id->
dc20: 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 63 75  applet));.....cu
dc30: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
dc40: 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72  te_len = app_cur
dc50: 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 63  r->length;.....c
dc60: 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
dc70: 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72  ate = malloc(cur
dc80: 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
dc90: 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70  e_len);....memcp
dca0: 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  y(curr_id->certi
dcb0: 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75 72 72  ficate, app_curr
dcc0: 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f 69 64  ->value, curr_id
dcd0: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
dce0: 6e 29 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74 69  n);.....if (outi
dcf0: 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a  dx >= *count) {.
dd00: 09 09 09 09 69 66 20 28 63 65 72 74 73 5f 72 65  ....if (certs_re
dd10: 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09 09  sizable) {......
dd20: 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09  *count *= 2;....
dd30: 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f  ..certs = reallo
dd40: 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28  c(certs, sizeof(
dd50: 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e  *certs) * (*coun
dd60: 74 29 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  t));.....} else 
dd70: 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  {......break;...
dd80: 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ..}....}...}....
dd90: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
dda0: 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 69 66 20  app_tlv);....if 
ddb0: 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e  (outidx >= *coun
ddc0: 74 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  t) {....break;..
ddd0: 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 66  .}..}...cackey_f
dde0: 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c 76 29  ree_tlv(ccc_tlv)
ddf0: 3b 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74  ;...*count = out
de00: 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73  idx;...if (certs
de10: 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09  _resizable) {...
de20: 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28  certs = realloc(
de30: 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63  certs, sizeof(*c
de40: 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29  erts) * (*count)
de50: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69  );..}.../* Termi
de60: 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54  nate SmartCard T
de70: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
de80: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
de90: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72  ction(slot);...r
dea0: 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a  eturn(certs);.}.
deb0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
dec0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
ded0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
dee0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
def0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
df00: 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
df10: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
df20: 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
df30: 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
df40: 79 70 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  ypt(struct cacke
df50: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74  y_slot *slot, st
df60: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
df70: 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20  tity *identity, 
df80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
df90: 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c 65  uf, size_t bufle
dfa0: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
dfb0: 20 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f 74   *outbuf, size_t
dfc0: 20 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74 20   outbuflen, int 
dfd0: 70 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75 6e  padInput, int un
dfe0: 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 75 6e  padOutput) {..un
dff0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70  signed char *tmp
e000: 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20  buf, *tmpbuf_s, 
e010: 2a 6f 75 74 62 75 66 5f 73 3b 0a 09 75 6e 73 69  *outbuf_s;..unsi
e020: 67 6e 65 64 20 63 68 61 72 20 62 79 74 65 73 5f  gned char bytes_
e030: 74 6f 5f 73 65 6e 64 2c 20 70 31 3b 0a 09 75 6e  to_send, p1;..un
e040: 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f 63  signed char bloc
e050: 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72  ktype;..cackey_r
e060: 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69  et send_ret;..ui
e070: 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b  nt16_t respcode;
e080: 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61 6c  ..ssize_t retval
e090: 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 65   = 0, unpadoffse
e0a0: 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75  t;..size_t tmpbu
e0b0: 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d  flen, padlen, tm
e0c0: 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69 6e 74  poutbuflen;..int
e0d0: 20 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30   free_tmpbuf = 0
e0e0: 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43  ;..int le;...CAC
e0f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e100: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
e110: 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29  f (slot == NULL)
e120: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e130: 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
e140: 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29    slot is NULL")
e150: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
e160: 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d  ..}...if (buf ==
e170: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
e180: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e190: 45 72 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e  Error.  buf is N
e1a0: 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
e1b0: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f  (-1);..}...if (o
e1c0: 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b  utbuf == NULL) {
e1d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e1e0: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
e1f0: 6f 75 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29  outbuf is NULL")
e200: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
e210: 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  ..}...if (identi
e220: 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ty == NULL) {...
e230: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e240: 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65  NTF("Error.  ide
e250: 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b  ntity is NULL");
e260: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
e270: 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  .}...if (identit
e280: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
e290: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
e2a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e2b0: 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74  F("Error.  ident
e2c0: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
e2d0: 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  ty is NULL");...
e2e0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
e2f0: 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  ../* Determine i
e300: 64 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a 65  dentity Key size
e310: 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74   */..if (identit
e320: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
e330: 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20 7b  ->keysize < 0) {
e340: 0a 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  ...identity->pcs
e350: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
e360: 69 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b 65  ize = x509_to_ke
e370: 79 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e  ysize(identity->
e380: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
e390: 65 72 74 69 66 69 63 61 74 65 2c 20 69 64 65 6e  ertificate, iden
e3a0: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
e3b0: 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
e3c0: 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50  _len);..}.../* P
e3d0: 61 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b 65  ad message to ke
e3e0: 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 70  y size */..if (p
e3f0: 61 64 49 6e 70 75 74 29 20 7b 0a 09 09 69 66 20  adInput) {...if 
e400: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
e410: 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
e420: 65 20 3e 20 30 29 20 7b 0a 09 09 09 69 66 20 28  e > 0) {....if (
e430: 62 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69  buflen != identi
e440: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
e450: 79 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09  y->keysize) {...
e460: 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 28  ..if (buflen > (
e470: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
e480: 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
e490: 20 2b 20 33 29 29 20 7b 0a 09 09 09 09 09 43 41   + 3)) {......CA
e4a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e4b0: 46 28 22 45 72 72 6f 72 2e 20 20 4d 65 73 73 61  F("Error.  Messa
e4c0: 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ge is too large 
e4d0: 74 6f 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22  to sign/decrypt"
e4e0: 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
e4f0: 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  -1);.....}......
e500: 74 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64 65 6e  tmpbuflen = iden
e510: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
e520: 69 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09 09  ity->keysize;...
e530: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
e540: 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09  c(tmpbuflen);...
e550: 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  ..free_tmpbuf = 
e560: 31 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d  1;......padlen =
e570: 20 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75 66   tmpbuflen - buf
e580: 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 2f 2a  len - 3;....../*
e590: 20 52 53 41 20 50 4b 43 53 23 31 20 45 4d 53 41   RSA PKCS#1 EMSA
e5a0: 2d 50 4b 43 53 31 2d 76 31 5f 35 20 50 61 64 64  -PKCS1-v1_5 Padd
e5b0: 69 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62 75  ing */.....tmpbu
e5c0: 66 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09  f[0] = 0x00;....
e5d0: 09 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78 30  .tmpbuf[1] = 0x0
e5e0: 31 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26 74  1;.....memset(&t
e5f0: 6d 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20  mpbuf[2], 0xFF, 
e600: 70 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70  padlen);.....tmp
e610: 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d  buf[padlen + 2]=
e620: 20 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70   0x00;.....memcp
e630: 79 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e  y(&tmpbuf[padlen
e640: 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c   + 3], buf, bufl
e650: 65 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  en);......CACKEY
e660: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
e670: 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75 66  "Unpadded:", buf
e680: 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43  , buflen);.....C
e690: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e6a0: 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20  TBUF("Padded:", 
e6b0: 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65  tmpbuf, tmpbufle
e6c0: 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  n);....} else {.
e6d0: 09 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  ....tmpbuf = buf
e6e0: 3b 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ;.....tmpbuflen 
e6f0: 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72  = buflen;.....fr
e700: 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09  ee_tmpbuf = 0;..
e710: 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09  ...padlen = 0;..
e720: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
e730: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e740: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
e750: 20 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20 73   determine key s
e760: 69 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65 20  ize, hoping the 
e770: 6d 65 73 73 61 67 65 20 69 73 20 70 72 6f 70 65  message is prope
e780: 72 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a 0a  rly padded!");..
e790: 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b  ...tmpbuf = buf;
e7a0: 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ....tmpbuflen = 
e7b0: 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f  buflen;....free_
e7c0: 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70  tmpbuf = 0;....p
e7d0: 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09  adlen = 0;...}..
e7e0: 7d 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75  } else {...tmpbu
e7f0: 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75  f = buf;...tmpbu
e800: 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09  flen = buflen;..
e810: 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
e820: 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a  ;...padlen = 0;.
e830: 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72  .}.../* Begin tr
e840: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
e850: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
e860: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
e870: 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63  /* Select correc
e880: 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09 43 41 43  t applet */..CAC
e890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e8a0: 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
e8b0: 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e  et found at %p .
e8c0: 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ..", identity->p
e8d0: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70  csc_identity->ap
e8e0: 70 6c 65 74 29 3b 0a 09 63 61 63 6b 65 79 5f 73  plet);..cackey_s
e8f0: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
e900: 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  t, identity->pcs
e910: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c  c_identity->appl
e920: 65 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74  et, sizeof(ident
e930: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
e940: 74 79 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09  ty->applet));...
e950: 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63  /* Select correc
e960: 74 20 66 69 6c 65 20 2a 2f 0a 09 63 61 63 6b 65  t file */..cacke
e970: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c  y_select_file(sl
e980: 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  ot, identity->pc
e990: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69 6c  sc_identity->fil
e9a0: 65 29 3b 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d  e);...tmpbuf_s =
e9b0: 20 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75 66   tmpbuf;..outbuf
e9c0: 5f 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77 68  _s = outbuf;..wh
e9d0: 69 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29 20  ile (tmpbuflen) 
e9e0: 7b 0a 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65  {...if (tmpbufle
e9f0: 6e 20 3e 20 32 34 35 29 20 7b 0a 09 09 09 62 79  n > 245) {....by
ea00: 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 32 34  tes_to_send = 24
ea10: 35 3b 0a 09 09 09 70 31 20 3d 20 30 78 38 30 3b  5;....p1 = 0x80;
ea20: 0a 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09  ....le = 0x00;..
ea30: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74  .} else {....byt
ea40: 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70  es_to_send = tmp
ea50: 62 75 66 6c 65 6e 3b 0a 09 09 09 70 31 20 3d 20  buflen;....p1 = 
ea60: 30 78 30 30 3b 0a 09 09 09 6c 65 20 3d 20 30 78  0x00;....le = 0x
ea70: 30 30 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 6f 75  00;...}....tmpou
ea80: 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66  tbuflen = outbuf
ea90: 6c 65 6e 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74  len;....send_ret
eaa0: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
eab0: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
eac0: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41  CLASS_GLOBAL_PLA
ead0: 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53  TFORM, GSCIS_INS
eae0: 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c 20  TR_SIGNDECRYPT, 
eaf0: 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73 5f  p1, 0x00, bytes_
eb00: 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c  to_send, tmpbuf,
eb10: 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20   le, &respcode, 
eb20: 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62  outbuf, &tmpoutb
eb30: 75 66 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73 65  uflen);...if (se
eb40: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
eb50: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
eb60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
eb70: 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69  INTF("ADPU Sendi
eb80: 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74  ng Failed -- ret
eb90: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e  urning in error.
eba0: 22 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65 65  ");.....if (free
ebb0: 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 69  _tmpbuf) {.....i
ebc0: 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09  f (tmpbuf_s) {..
ebd0: 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f  ....free(tmpbuf_
ebe0: 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  s);.....}....}..
ebf0: 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61  .../* End transa
ec00: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b  ction */....cack
ec10: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
ec20: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66  on(slot);.....if
ec30: 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78   (respcode == 0x
ec40: 36 39 38 32 29 20 7b 0a 09 09 09 09 43 41 43 4b  6982) {.....CACK
ec50: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ec60: 22 53 65 63 75 72 69 74 79 20 73 74 61 74 75 73  "Security status
ec70: 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64 2e   not satisified.
ec80: 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45 45 44    Returning NEED
ec90: 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09 09 09 63 61  LOGIN");......ca
eca0: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
ecb0: 65 73 65 74 28 73 6c 6f 74 29 3b 0a 09 09 09 09  eset(slot);.....
ecc0: 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67  slot->token_flag
ecd0: 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  s = CKF_LOGIN_RE
ece0: 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74  QUIRED;......ret
ecf0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
ed00: 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09  E_NEEDLOGIN);...
ed10: 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f  .}.....if (send_
ed20: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
ed30: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
ed40: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
ed50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b  EBUG_PRINTF("Tok
ed60: 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75  en absent.  Retu
ed70: 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e  rning TOKENABSEN
ed80: 54 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  T");......cackey
ed90: 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
eda0: 28 73 6c 6f 74 29 3b 0a 09 09 09 09 73 6c 6f 74  (slot);.....slot
edb0: 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ->token_flags = 
edc0: 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
edd0: 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ED;......return(
ede0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
edf0: 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d  KENABSENT);....}
ee00: 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
ee10: 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b  ...}....tmpbuf +
ee20: 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b  = bytes_to_send;
ee30: 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20  ...tmpbuflen -= 
ee40: 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a  bytes_to_send;..
ee50: 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f  ..outbuf += tmpo
ee60: 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62  utbuflen;...outb
ee70: 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62  uflen -= tmpoutb
ee80: 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20  uflen;...retval 
ee90: 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b  += tmpoutbuflen;
eea0: 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 74  ..}...if (free_t
eeb0: 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20 28 74  mpbuf) {...if (t
eec0: 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 66 72  mpbuf_s) {....fr
eed0: 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09  ee(tmpbuf_s);...
eee0: 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20  }..}...outbuf = 
eef0: 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45  outbuf_s;.../* E
ef00: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nd transaction *
ef10: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  /..cackey_end_tr
ef20: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
ef30: 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
ef40: 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
ef50: 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
ef60: 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66 6c 65  AX..if (outbufle
ef70: 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  n > _POSIX_SSIZE
ef80: 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59  _MAX) {...CACKEY
ef90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
efa0: 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65 64 73  utbuflen exceeds
efb0: 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20   maximum value, 
efc0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
efd0: 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69  lure. (max = %li
efe0: 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c  , outbuflen = %l
eff0: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53  u)", (long) _POS
f000: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75  IX_SSIZE_MAX, (u
f010: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75  nsigned long) ou
f020: 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74  tbuflen);....ret
f030: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
f040: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  ndif.#endif.../*
f050: 20 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a   Unpad reply */.
f060: 09 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74  .if (unpadOutput
f070: 29 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c  ) {...if (retval
f080: 20 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b 45   < 3) {....CACKE
f090: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f0a0: 52 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61  Reply is too sma
f0b0: 6c 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61  ll, we are not a
f0c0: 62 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20  ble to unpad -- 
f0d0: 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64  passing back and
f0e0: 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20   hoping for the 
f0f0: 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43  best!");.....CAC
f100: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f110: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
f120: 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d  uccess, retval =
f130: 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28   %li (bytes)", (
f140: 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09  long) retval);..
f150: 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
f160: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75 74  ;...}....if (out
f170: 62 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29 20  buf[0] != 0x00) 
f180: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
f190: 47 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63 6f  G_PRINTF("Unreco
f1a0: 67 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20 73  gnized padding s
f1b0: 63 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e 67  cheme -- passing
f1c0: 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67   back and hoping
f1d0: 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29   for the best!")
f1e0: 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
f1f0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
f200: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
f210: 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62   retval = %li (b
f220: 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72  ytes)", (long) r
f230: 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72  etval);....retur
f240: 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a  n(retval);...}..
f250: 09 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75  ..blocktype = ou
f260: 74 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61 64  tbuf[1];...unpad
f270: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73  offset = 0;....s
f280: 77 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65  witch (blocktype
f290: 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30  ) {....case 0x00
f2a0: 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67  :...../* Padding
f2b0: 20 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66   Scheme 1, the f
f2c0: 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79  irst non-zero by
f2d0: 74 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20  te is the start 
f2e0: 6f 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66  of data */.....f
f2f0: 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  or (unpadoffset 
f300: 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  = 2; unpadoffset
f310: 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64   < retval; unpad
f320: 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09  offset++) {.....
f330: 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61  .if (outbuf[unpa
f340: 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30  doffset] != 0x00
f350: 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  ) {.......break;
f360: 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
f370: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
f380: 20 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61   0x01:...../* Pa
f390: 64 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20  dding Scheme 2, 
f3a0: 70 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78  pad bytes are 0x
f3b0: 46 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30  FF followed by 0
f3c0: 78 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28  x00 */.....for (
f3d0: 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b  unpadoffset = 2;
f3e0: 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72   unpadoffset < r
f3f0: 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73  etval; unpadoffs
f400: 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20  et++) {......if 
f410: 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
f420: 73 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a  set] != 0xFF) {.
f430: 09 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
f440: 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d  [unpadoffset] ==
f450: 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09   0x00) {........
f460: 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a  unpadoffset++;..
f470: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
f480: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
f490: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f4a0: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
f4b0: 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f   padding data fo
f4c0: 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  und, returning i
f4d0: 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c  n failure, shoul
f4e0: 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30  d have been 0x00
f4f0: 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20   found 0x%02x", 
f500: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f  (unsigned int) o
f510: 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
f520: 74 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74  t]);.........ret
f530: 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d  urn(-1);.......}
f540: 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
f550: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
f560: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
f570: 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66  d padding data f
f580: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  ound, returning 
f590: 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75  in failure, shou
f5a0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46  ld have been 0xF
f5b0: 46 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c  F found 0x%02x",
f5c0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
f5d0: 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
f5e0: 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74  et]);........ret
f5f0: 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a  urn(-1);......}.
f600: 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
f610: 0a 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09  ....case 0x02:..
f620: 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63  .../* Padding Sc
f630: 68 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65  heme 3, pad byte
f640: 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66  s are non-zero f
f650: 69 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20 66  irst zero byte f
f660: 6f 75 6e 64 20 69 73 20 74 68 65 20 73 65 70 65  ound is the sepe
f670: 72 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09 09  rator byte */...
f680: 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73  ..for (unpadoffs
f690: 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66  et = 2; unpadoff
f6a0: 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e  set < retval; un
f6b0: 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09  padoffset++) {..
f6c0: 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75  ....if (outbuf[u
f6d0: 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30  npadoffset] == 0
f6e0: 78 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e 70  x00) {.......unp
f6f0: 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09  adoffset++;.....
f700: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
f710: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
f720: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 70  ;...}....if (unp
f730: 61 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76 61  adoffset > retva
f740: 6c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  l) {....CACKEY_D
f750: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66  EBUG_PRINTF("Off
f760: 73 65 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  set greater than
f770: 20 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62 6f   reply size, abo
f780: 72 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f 66  rting.  (unpadof
f790: 66 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74 76  fset = %lu, retv
f7a0: 61 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73  al = %lu)", (uns
f7b0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70 61  igned long) unpa
f7c0: 64 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67 6e  doffset, (unsign
f7d0: 65 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29  ed long) retval)
f7e0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
f7f0: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
f800: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
f810: 50 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66  Padded:", outbuf
f820: 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65  , retval);....re
f830: 74 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66 66  tval -= unpadoff
f840: 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f  set;...memmove(o
f850: 75 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20  utbuf, outbuf + 
f860: 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65 74  unpadoffset, ret
f870: 76 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  val);....CACKEY_
f880: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
f890: 55 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74 62  Unpadded:", outb
f8a0: 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a  uf, retval);..}.
f8b0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f8c0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
f8d0: 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65  g in success, re
f8e0: 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65  tval = %li (byte
f8f0: 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76  s)", (long) retv
f900: 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
f910: 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  tval);.}../*. * 
f920: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
f930: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
f940: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
f950: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
f960: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
f970: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
f980: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
f990: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
f9a0: 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63 74  key_login(struct
f9b0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
f9c0: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
f9d0: 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64  r *pin, unsigned
f9e0: 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20 69   long pin_len, i
f9f0: 6e 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  nt *tries_remain
fa00: 69 6e 67 5f 70 29 20 7b 0a 09 75 6e 73 69 67 6e  ing_p) {..unsign
fa10: 65 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b  ed char cac_pin[
fa20: 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46  8] = {0xFF, 0xFF
fa30: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
fa40: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
fa50: 30 78 46 46 7d 3b 0a 09 75 69 6e 74 31 36 5f 74  0xFF};..uint16_t
fa60: 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a   response_code;.
fa70: 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69  .int tries_remai
fa80: 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  ning;..int send_
fa90: 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61  ret;.../* Indica
faa0: 74 65 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  te that we do no
fab0: 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77  t know about how
fac0: 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72 65 20   many tries are 
fad0: 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66  remaining */..if
fae0: 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e   (tries_remainin
faf0: 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f  g_p) {...*tries_
fb00: 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31  remaining_p = -1
fb10: 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65  ;..}.../* Appare
fb20: 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73 20 61  ntly, CAC PINs a
fb30: 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38 20 62  re *EXACTLY* 8 b
fb40: 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64  ytes long -- pad
fb50: 20 77 69 74 68 20 30 78 46 46 20 69 66 20 74 6f   with 0xFF if to
fb60: 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28  o short */..if (
fb70: 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a  pin_len >= 8) {.
fb80: 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e  ..memcpy(cac_pin
fb90: 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c  , pin, 8);..} el
fba0: 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61  se {...memcpy(ca
fbb0: 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f  c_pin, pin, pin_
fbc0: 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73  len);..}.../* Is
fbd0: 73 75 65 20 50 49 4e 20 56 65 72 69 66 79 20 2a  sue PIN Verify *
fbe0: 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  /..send_ret = ca
fbf0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
fc00: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
fc10: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
fc20: 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30 78  INSTR_VERIFY, 0x
fc30: 30 30 2c 20 30 78 30 30 2c 20 73 69 7a 65 6f 66  00, 0x00, sizeof
fc40: 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70  (cac_pin), cac_p
fc50: 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f  in, 0x00, &respo
fc60: 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20  nse_code, NULL, 
fc70: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64  NULL);..if (send
fc80: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
fc90: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66  CSC_S_OK) {...if
fca0: 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65   ((response_code
fcb0: 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78   & 0x63C0) == 0x
fcc0: 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73  63C0) {....tries
fcd0: 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65  _remaining = (re
fce0: 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78  sponse_code & 0x
fcf0: 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  F);.....CACKEY_D
fd00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
fd10: 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61   Verification fa
fd20: 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72  iled, %i tries r
fd30: 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73  emaining", tries
fd40: 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09  _remaining);....
fd50: 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69  .if (tries_remai
fd60: 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a 74  ning_p) {.....*t
fd70: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
fd80: 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69   = tries_remaini
fd90: 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  ng;....}.....ret
fda0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
fdb0: 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a  E_BADPIN);...}..
fdc0: 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63  ..if (response_c
fdd0: 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b  ode == 0x6983) {
fde0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
fdf0: 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72  _PRINTF("PIN Ver
fe00: 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64  ification failed
fe10: 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b  , device is lock
fe20: 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ed");.....return
fe30: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c  (CACKEY_PCSC_E_L
fe40: 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72  OCKED);...}....r
fe50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
fe60: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
fe70: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fe80: 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69  PRINTF("PIN Veri
fe90: 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64  fication succeed
fea0: 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  ed");...return(C
feb0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
fec0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
fed0: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
fee0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
fef0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
ff00: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
ff10: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
ff20: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
ff30: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
ff40: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74  key_ret cackey_t
ff50: 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72  oken_present(str
ff60: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
ff70: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
ff80: 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  _ret pcsc_connec
ff90: 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65  t_ret;..DWORD re
ffa0: 61 64 65 72 5f 6c 65 6e 2c 20 73 74 61 74 65 2c  ader_len, state,
ffb0: 20 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 5f 6c   protocol, atr_l
ffc0: 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41  en;..BYTE atr[MA
ffd0: 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f  X_ATR_SIZE];..LO
ffe0: 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73  NG status_ret, s
fff0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b  card_reconn_ret;
10000 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10010 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
10020 29 3b 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  );...pcsc_connec
10030 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
10040 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
10050 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
10060 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
10070 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
10080 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10090 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
100a0 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
100b0 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
100c0 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72  n absent");....r
100d0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
100e0 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
100f0 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d  ;..}...atr_len =
10100 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 73   sizeof(atr);..s
10110 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72  tatus_ret = SCar
10120 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63  dStatus(slot->pc
10130 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26  sc_card, NULL, &
10140 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61  reader_len, &sta
10150 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61  te, &protocol, a
10160 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a  tr, &atr_len);..
10170 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
10180 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  == SCARD_E_INVAL
10190 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09 43  ID_HANDLE) {...C
101a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
101b0 54 46 28 22 53 43 61 72 64 53 74 61 74 75 73 28  TF("SCardStatus(
101c0 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
101d0 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  _E_INVALID_HANDL
101e0 45 2c 20 6d 61 72 6b 69 6e 67 20 69 73 20 6e 6f  E, marking is no
101f0 74 20 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65 63  t already connec
10200 74 65 64 20 61 6e 64 20 74 72 79 69 6e 67 20 61  ted and trying a
10210 67 61 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65 79  gain");...cackey
10220 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
10230 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63 5f  (slot);....pcsc_
10240 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
10250 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72  ckey_connect_car
10260 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28 70  d(slot);...if (p
10270 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
10280 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
10290 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
102a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
102b0 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74  nable to connect
102c0 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
102d0 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
102e0 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
102f0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
10300 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a  ENABSENT);...}..
10310 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  ..atr_len = size
10320 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74 75  of(atr);...statu
10330 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61  s_ret = SCardSta
10340 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  tus(slot->pcsc_c
10350 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64  ard, NULL, &read
10360 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20  er_len, &state, 
10370 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20  &protocol, atr, 
10380 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  &atr_len);..}...
10390 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21  if (status_ret !
103a0 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
103b0 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61  S) {...cackey_ma
103c0 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
103d0 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61 74  ot);....if (stat
103e0 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  us_ret == SCARD_
103f0 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a  W_RESET_CARD) {.
10400 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10410 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65  PRINTF("Reset re
10420 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68  quired, please h
10430 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63  old...");.....sc
10440 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d  ard_reconn_ret =
10450 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63   cackey_reconnec
10460 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41  t_card(slot, SCA
10470 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c  RD_PROTOCOL_T0 |
10480 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
10490 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  T1, &protocol);.
104a0 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63  ...if (scard_rec
104b0 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
104c0 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
104d0 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74  ../* Update prot
104e0 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74  ocol */.....slot
104f0 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f  ->protocol = pro
10500 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20 52  tocol;....../* R
10510 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e  e-establish tran
10520 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77  saction, if it w
10530 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09  as present */...
10540 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
10550 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
10560 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  0) {......slot->
10570 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
10580 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  h--;......slot->
10590 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
105a0 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09  _hw_lock = 1;...
105b0 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  ...cackey_begin_
105c0 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
105d0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
105e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
105f0 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73 73  F("Reset success
10600 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67 22  ful, requerying"
10610 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72 65  );.....status_re
10620 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28  t = SCardStatus(
10630 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
10640 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c   NULL, &reader_l
10650 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
10660 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
10670 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28 73  _len);.....if (s
10680 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41  tatus_ret != SCA
10690 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
106a0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
106b0 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c 20  G_PRINTF("Still 
106c0 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20  unable to query 
106d0 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74  card status, ret
106e0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
106f0 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75  ent.  SCardStatu
10700 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45  s() = %s", CACKE
10710 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
10720 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61  RDERR_TO_STR(sta
10730 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09  tus_ret));......
10740 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
10750 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
10760 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  T);.....}....} e
10770 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
10780 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
10790 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65  nable to reconne
107a0 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
107b0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
107c0 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e 6e  nt.  SCardReconn
107d0 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41 43  ect() = %s", CAC
107e0 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
107f0 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
10800 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29  card_reconn_ret)
10810 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
10820 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
10830 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a  ENABSENT);....}.
10840 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
10850 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10860 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75 65  F("Unable to que
10870 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20  ry card status, 
10880 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
10890 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74  absent.  SCardSt
108a0 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41  atus() = %s", CA
108b0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
108c0 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
108d0 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09  status_ret));...
108e0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
108f0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
10900 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  NT);...}..}...if
10910 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52 44   ((state & SCARD
10920 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41 52  _ABSENT) == SCAR
10930 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43 41  D_ABSENT) {...CA
10940 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10950 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65 6e  F("Card is absen
10960 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  t, returning tok
10970 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
10980 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
10990 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
109a0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
109b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
109c0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65  urning token pre
109d0 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72  sent.");...retur
109e0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
109f0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d  TOKENPRESENT);.}
10a00 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
10a10 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
10a20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
10a30 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
10a40 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
10a50 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
10a60 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
10a70 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
10a80 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
10a90 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28  entity_to_label(
10aa0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
10ab0 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  sc_identity *ide
10ac0 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
10ad0 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c  char *label_buf,
10ae0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
10af0 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a  abel_buf_len) {.
10b00 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63  .unsigned long c
10b10 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
10b20 09 63 68 61 72 20 2a 6c 61 62 65 6c 5f 61 73 6e  .char *label_asn
10b30 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66  1;..void *certif
10b40 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39  icate;..int x509
10b50 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72  _read_ret;...cer
10b60 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74  tificate = ident
10b70 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
10b80 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c  ;..certificate_l
10b90 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  en = identity->c
10ba0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
10bb0 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
10bc0 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72  e_len < 0) {...r
10bd0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
10be0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
10bf0 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28  x509_to_subject(
10c00 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
10c10 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76  tificate_len, (v
10c20 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61  oid **) &label_a
10c30 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f  sn1);..if (x509_
10c40 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
10c50 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
10c60 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
10c70 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74   = x509_dn_to_st
10c80 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c  ring(label_asn1,
10c90 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20   x509_read_ret, 
10ca0 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62  (char *) label_b
10cb0 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65  uf, label_buf_le
10cc0 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78  n, "CN");..if (x
10cd0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20  509_read_ret <= 
10ce0 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64  0) {...x509_read
10cf0 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74  _ret = x509_dn_t
10d00 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61  o_string(label_a
10d10 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72  sn1, x509_read_r
10d20 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62  et, (char *) lab
10d30 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75  el_buf, label_bu
10d40 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  f_len, NULL);...
10d50 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
10d60 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65  et <= 0) {....re
10d70 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
10d80 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
10d90 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
10da0 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
10db0 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61  AX..if (x509_rea
10dc0 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53  d_ret > _POSIX_S
10dd0 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41  SIZE_MAX) {...CA
10de0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10df0 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74  F("x509_read_ret
10e00 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
10e10 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
10e20 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
10e30 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72  ax = %li, x509_r
10e40 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c  ead_ret = %lu)",
10e50 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
10e60 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
10e70 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72  ned long) x509_r
10e80 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ead_ret);....ret
10e90 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
10ea0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65  ndif.#endif...re
10eb0 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72  turn(x509_read_r
10ec0 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  et);.}../* Retur
10ed0 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  ns 0 on success 
10ee0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
10ef0 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74  ckey_mutex_creat
10f00 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20  e(void **mutex) 
10f10 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
10f20 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
10f30 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
10f40 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
10f50 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
10f60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10f70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
10f80 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
10f90 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
10fa0 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
10fb0 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
10fc0 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
10fd0 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73  mutex = malloc(s
10fe0 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d  izeof(*pthread_m
10ff0 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70  utex));...if (!p
11000 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a  thread_mutex) {.
11010 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11020 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
11030 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
11040 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  y.");.....return
11050 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68  (-1);...}....pth
11060 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
11070 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
11080 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20  (pthread_mutex, 
11090 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68  NULL);...if (pth
110a0 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
110b0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
110c0 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
110d0 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29  ead_mutex_init()
110e0 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
110f0 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
11100 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
11110 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
11120 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61 64  *mutex = pthread
11130 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20  _mutex;..} else 
11140 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
11150 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29  rgs.CreateMutex)
11160 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
11170 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
11180 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75  s.CreateMutex(mu
11190 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
111a0 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
111b0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
111c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
111d0 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  ("cackey_args.Cr
111e0 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74 75  eateMutex() retu
111f0 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
11200 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
11210 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
11220 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
11230 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
11240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
11250 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
11260 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
11270 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
11280 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
11290 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
112a0 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  t cackey_mutex_l
112b0 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29  ock(void *mutex)
112c0 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
112d0 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
112e0 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
112f0 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
11300 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
11310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11320 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
11330 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
11340 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
11350 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
11360 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
11370 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
11380 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a  _mutex = mutex;.
11390 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
113a0 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
113b0 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d  x_lock(pthread_m
113c0 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68  utex);...if (pth
113d0 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
113e0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
113f0 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
11400 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29  ead_mutex_lock()
11410 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
11420 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
11430 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
11440 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20  urn(-1);...}..} 
11450 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
11460 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
11470 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f  ex) {....custom_
11480 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
11490 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d  args.LockMutex(m
114a0 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
114b0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
114c0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
114d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
114e0 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  F("cackey_args.L
114f0 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72  ockMutex() retur
11500 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
11510 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
11520 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
11530 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
11540 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
11550 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
11560 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
11570 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
11580 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  urn(0);.}../* Re
11590 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
115a0 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
115b0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
115c0 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78  lock(void *mutex
115d0 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
115e0 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
115f0 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
11600 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
11610 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
11620 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11630 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
11640 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
11650 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
11660 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
11670 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
11680 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
11690 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b  d_mutex = mutex;
116a0 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
116b0 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
116c0 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61  ex_unlock(pthrea
116d0 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28  d_mutex);...if (
116e0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21  pthread_retval !
116f0 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
11700 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
11710 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
11720 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65  ock() returned e
11730 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
11740 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
11750 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
11760 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
11770 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e   (cackey_args.Un
11780 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09  lockMutex) {....
11790 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
117a0 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
117b0 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  ckMutex(mutex);.
117c0 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
117d0 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
117e0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
117f0 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
11800 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
11810 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
11820 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
11830 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
11840 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
11850 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
11860 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
11870 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
11880 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
11890 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
118a0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f  );.}..static CK_
118b0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63 61  ATTRIBUTE_PTR ca
118c0 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
118d0 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c  tes(CK_OBJECT_CL
118e0 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c  ASS objectclass,
118f0 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
11900 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  csc_identity *id
11910 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
11920 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e   long identity_n
11930 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  um, CK_ULONG_PTR
11940 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74   pulCount) {..st
11950 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b  atic CK_BBOOL ck
11960 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74  _true = 1;..stat
11970 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66  ic CK_BBOOL ck_f
11980 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74 69  alse = 0;..stati
11990 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72  c CK_TRUST ck_tr
119a0 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53 54  usted = CK_TRUST
119b0 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43  ED_DELEGATOR;..C
119c0 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73  K_ULONG numattrs
119d0 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75   = 0, retval_cou
119e0 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  nt;..CK_ATTRIBUT
119f0 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74 72  E_TYPE curr_attr
11a00 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49  _type;..CK_ATTRI
11a10 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20  BUTE curr_attr, 
11a20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49  *retval;..CK_VOI
11a30 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43  D_PTR pValue;..C
11a40 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c  K_ULONG ulValueL
11a50 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43  en;..CK_OBJECT_C
11a60 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63  LASS ck_object_c
11a70 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46  lass;..CK_CERTIF
11a80 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65  ICATE_TYPE ck_ce
11a90 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a  rtificate_type;.
11aa0 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f  .CK_KEY_TYPE ck_
11ab0 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54  key_type;..CK_UT
11ac0 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b  F8CHAR ucTmpBuf[
11ad0 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74  1024];..SHA1Cont
11ae0 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d  ext sha1_ctx;..M
11af0 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a  D5_CTX md5_ctx;.
11b00 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68 61  .uint8_t sha1_ha
11b10 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d  sh[SHA1HashSize]
11b20 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68  ;..uint8_t md5_h
11b30 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d  ash[MD5HashSize]
11b40 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
11b50 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09   *certificate;..
11b60 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63  ssize_t certific
11b70 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35  ate_len = -1, x5
11b80 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e  09_read_ret;..in
11b90 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a  t pValue_free;..
11ba0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11bb0 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62  INTF("Called (ob
11bc0 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c  jectClass = %lu,
11bd0 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20   identity_num = 
11be0 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
11bf0 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c  d long) objectcl
11c00 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75  ass, identity_nu
11c10 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  m);...*pulCount 
11c20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63  = 0;...if (objec
11c30 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
11c40 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a  RTIFICATE && obj
11c50 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
11c60 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62  PUBLIC_KEY && ob
11c70 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
11c80 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20  _PRIVATE_KEY && 
11c90 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
11ca0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
11cb0 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
11cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
11cd0 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
11ce0 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20  (NULL), invalid 
11cf0 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a  object class");.
11d00 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
11d10 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72  ..}.../* Get Cer
11d20 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69  t */..if (identi
11d30 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ty == NULL) {...
11d40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11d50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
11d60 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
11d70 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79   invalid identiy
11d80 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09   provided");....
11d90 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
11da0 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
11db0 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
11dc0 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69  ficate;..certifi
11dd0 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74  cate_len = ident
11de0 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
11df0 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74  _len;...if (cert
11e00 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d  ificate_len == -
11e10 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65  1 || certificate
11e20 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
11e30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11e40 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
11e50 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74  bjects (NULL), t
11e60 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65  his identity doe
11e70 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e  s not have an X.
11e80 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
11e90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11ea0 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20  it and will not 
11eb0 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72  work");....retur
11ec0 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
11ed0 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72   Verify that cer
11ee0 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e  tificate is ASN.
11ef0 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20  1 encoded X.509 
11f00 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
11f10 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69  if (x509_to_seri
11f20 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  al(certificate, 
11f30 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
11f40 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09   NULL) < 0) {...
11f50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11f60 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
11f70 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
11f80 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69   the X.509 certi
11f90 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65  ficate associate
11fa0 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e  d with this iden
11fb0 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69  tity is not vali
11fc0 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  d");....return(N
11fd0 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  ULL);..}...retva
11fe0 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72  l_count = 64;..r
11ff0 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72  etval = malloc(r
12000 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
12010 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
12020 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72  ..for (curr_attr
12030 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f  _type = 0; curr_
12040 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65  attr_type < 0xce
12050 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74 74  5363bf; curr_att
12060 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66  r_type++) {...if
12070 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65   (curr_attr_type
12080 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09   == 0x800) {....
12090 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
120a0 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d   0xce536300;...}
120b0 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20  ....pValue_free 
120c0 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20  = 0;...pValue = 
120d0 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c  NULL;...ulValueL
120e0 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
120f0 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75  1;....switch (cu
12100 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a  rr_attr_type) {.
12110 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53  ...case CKA_CLAS
12120 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  S:.....CACKEY_DE
12130 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
12140 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
12150 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30   CKA_CLASS (0x%0
12160 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
12170 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
12180 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
12190 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  .ck_object_class
121a0 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a   = objectclass;.
121b0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
121c0 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
121d0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
121e0 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63   sizeof(ck_objec
121f0 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43  t_class);......C
12200 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12210 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
12220 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
12230 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12240 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  ) *((CK_OBJECT_C
12250 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c  LASS *) pValue),
12260 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
12270 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
12280 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
12290 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f  ;....case CKA_TO
122a0 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  KEN:.....CACKEY_
122b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
122c0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
122d0 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78  te CKA_TOKEN (0x
122e0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
122f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
12300 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
12310 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
12320 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
12330 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
12340 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
12350 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12360 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
12370 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
12380 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
12390 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
123a0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
123b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
123c0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
123d0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
123e0 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09   CKA_PRIVATE:...
123f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12400 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
12410 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
12420 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c 78  PRIVATE (0x%08lx
12430 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
12440 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
12450 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
12460 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
12470 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
12480 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
12490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
124a0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
124b0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
124c0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65   we are not a Ne
124d0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
124e0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
124f0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70  ak;.....}......p
12500 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
12510 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
12520 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
12530 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lse);......CACKE
12540 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12550 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
12560 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
12570 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
12580 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
12590 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
125a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
125b0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
125c0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
125d0 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09  KA_TRUSTED:.....
125e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
125f0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
12600 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
12610 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29 20  USTED (0x%08lx) 
12620 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
12630 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
12640 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
12650 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
12660 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
12670 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
12680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
12690 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
126a0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
126b0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
126c0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
126d0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
126e0 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ..}......pValue 
126f0 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
12700 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
12710 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
12720 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12730 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
12740 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
12750 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
12760 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
12770 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
12780 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
12790 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
127a0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
127b0 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46  ..case CKA_MODIF
127c0 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45  IABLE:.....CACKE
127d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
127e0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
127f0 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  bute CKA_MODIFIA
12800 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BLE (0x%08lx) ..
12810 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
12820 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
12830 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
12840 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
12850 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
12860 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
12870 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
12880 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
12890 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
128a0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
128b0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
128c0 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
128d0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
128e0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
128f0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
12900 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41  ;....case CKA_LA
12910 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BEL:.....CACKEY_
12920 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
12930 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
12940 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78  te CKA_LABEL (0x
12950 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
12960 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
12970 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
12980 09 09 09 2f 2a 20 58 58 58 3a 20 44 65 74 65 72  .../* XXX: Deter
12990 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09 09  mine name */....
129a0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e  .ulValueLen = sn
129b0 70 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29 20  printf((char *) 
129c0 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66  ucTmpBuf, sizeof
129d0 28 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64 65  (ucTmpBuf), "Ide
129e0 6e 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75 6e  ntity #%lu", (un
129f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
12a00 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09  ntity_num);.....
12a10 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75  pValue = ucTmpBu
12a20 66 3b 0a 0a 09 09 09 09 69 66 20 28 75 6c 56 61  f;......if (ulVa
12a30 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66  lueLen >= sizeof
12a40 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09 09  (ucTmpBuf)) {...
12a50 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
12a60 30 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d  0;......pValue =
12a70 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09   NULL;.....}....
12a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12a90 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
12aa0 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
12ab0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
12ac0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
12ad0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
12ae0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56 41  ;....case CKA_VA
12af0 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  LUE:.....CACKEY_
12b00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
12b10 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
12b20 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30 78  te CKA_VALUE (0x
12b30 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
12b40 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
12b50 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
12b60 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65 63  ...switch (objec
12b70 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09 63  tclass) {......c
12b80 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f  ase CKO_PRIVATE_
12b90 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  KEY:.......CACKE
12ba0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12bb0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
12bc0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
12bd0 77 65 20 61 72 65 20 61 20 70 72 69 76 61 74 65  we are a private
12be0 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09   key.");........
12bf0 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
12c00 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
12c10 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  UST:.......CACKE
12c20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12c30 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
12c40 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
12c50 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
12c60 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
12c70 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
12c80 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55  .....case CKO_PU
12c90 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09  BLIC_KEY:.......
12ca0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
12cb0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
12cc0 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
12cd0 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b 65   = x509_to_pubke
12ce0 79 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  y(certificate, c
12cf0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
12d00 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 09  &pValue);.......
12d10 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
12d20 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 09 09  et < 0) { ......
12d30 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
12d40 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20  ;........} else 
12d50 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61 6c 75  {.........ulValu
12d60 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
12d70 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a 09  _ret;........}..
12d80 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 62 72  .....}........br
12d90 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43  eak;......case C
12da0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  KO_CERTIFICATE:.
12db0 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 63  ......pValue = c
12dc0 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09  ertificate;.....
12dd0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63  ..ulValueLen = c
12de0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
12df0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
12e00 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
12e10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
12e20 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
12e30 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
12e40 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
12e50 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
12e60 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
12e70 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09 43  KA_ISSUER:.....C
12e80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12e90 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
12ea0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53 53  ttribute CKA_ISS
12eb0 55 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  UER (0x%08lx) ..
12ec0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
12ed0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
12ee0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
12ef0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
12f00 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20  _CERTIFICATE && 
12f10 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
12f20 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
12f30 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
12f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
12f50 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
12f60 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
12f70 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
12f80 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63  ificate or Netsc
12f90 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
12fa0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
12fb0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
12fc0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
12fd0 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
12fe0 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
12ff0 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72 74  9_to_issuer(cert
13000 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
13010 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
13020 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
13030 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
13040 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
13050 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
13060 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
13070 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
13080 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
13090 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
130a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
130b0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
130c0 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
130d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
130e0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
130f0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
13100 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
13110 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
13120 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
13130 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
13140 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45  CKA_SERIAL_NUMBE
13150 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  R (0x%08lx) ..."
13160 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
13170 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
13180 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
13190 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
131a0 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62  ERTIFICATE && ob
131b0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
131c0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
131d0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
131e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
131f0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
13200 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
13210 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
13220 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70  icate or Netscap
13230 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
13240 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
13250 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
13260 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
13270 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
13280 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
13290 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66  to_serial(certif
132a0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
132b0 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
132c0 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
132d0 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
132e0 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
132f0 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
13300 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
13310 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
13320 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
13330 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
13340 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
13350 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
13360 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
13370 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
13380 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
13390 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
133a0 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09  KA_SUBJECT:.....
133b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
133c0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
133d0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55  attribute CKA_SU
133e0 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20  BJECT (0x%08lx) 
133f0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
13400 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
13410 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
13420 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
13430 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
13440 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
13450 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
13460 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
13470 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
13480 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
13490 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 62 72  cate");.......br
134a0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
134b0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
134c0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
134d0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
134e0 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
134f0 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
13500 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
13510 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
13520 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
13530 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
13540 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
13550 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
13560 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
13570 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
13580 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
13590 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
135a0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
135b0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
135c0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
135d0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
135e0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
135f0 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09  ase CKA_ID:.....
13600 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13610 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
13620 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44  attribute CKA_ID
13630 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
13640 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13650 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
13660 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
13670 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
13680 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
13690 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
136a0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
136b0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
136c0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
136d0 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
136e0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
136f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
13700 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20  ....ucTmpBuf[0] 
13710 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d  = ((identity_num
13720 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78   + 1) >> 8) & 0x
13730 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66  ff;.....ucTmpBuf
13740 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79  [1] =  (identity
13750 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66  _num + 1) & 0xff
13760 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
13770 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75  &ucTmpBuf;.....u
13780 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a  lValueLen = 2;..
13790 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
137a0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
137b0 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
137c0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
137d0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
137e0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
137f0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45  ;....case CKA_CE
13800 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a  RTIFICATE_TYPE:.
13810 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13820 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
13830 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
13840 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  A_CERTIFICATE_TY
13850 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  PE (0x%08lx) ...
13860 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
13870 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
13880 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
13890 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
138a0 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
138b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
138c0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
138d0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
138e0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
138f0 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74  not a certificat
13900 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  e.");.......brea
13910 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
13920 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
13930 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 65   one certificate
13940 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f   type */.....ck_
13950 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
13960 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09   = CKC_X_509;...
13970 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
13980 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
13990 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
139a0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72   = sizeof(ck_cer
139b0 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a  tificate_type);.
139c0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
139d0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
139e0 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35  eturning CKC_X_5
139f0 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75  09 (%lu) (%p/%lu
13a00 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
13a10 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46  ng) *((CK_CERTIF
13a20 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56  ICATE_TYPE *) pV
13a30 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
13a40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
13a50 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
13a60 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
13a70 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09  CKA_KEY_TYPE:...
13a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13a90 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
13aa0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
13ab0 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c  KEY_TYPE (0x%08l
13ac0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
13ad0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
13ae0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
13af0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
13b00 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
13b10 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y && objectclass
13b20 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   != CKO_PUBLIC_K
13b30 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  EY) {......CACKE
13b40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13b50 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
13b60 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
13b70 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79  we are not a key
13b80 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  .");.......break
13b90 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
13ba0 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
13bb0 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a  one key type */.
13bc0 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20  ....ck_key_type 
13bd0 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09  = CKK_RSA;......
13be0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79  pValue = &ck_key
13bf0 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _type;.....ulVal
13c00 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
13c10 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09  k_key_type);....
13c20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13c30 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
13c40 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25  rning CKK_RSA (%
13c50 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  lu) (%p/%lu)", (
13c60 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
13c70 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45  ((CK_CERTIFICATE
13c80 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29  _TYPE *) pValue)
13c90 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
13ca0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
13cb0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13cc0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
13cd0 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  IGN:.....CACKEY_
13ce0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
13cf0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
13d00 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25  te CKA_SIGN (0x%
13d10 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
13d20 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
13d30 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
13d40 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
13d50 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
13d60 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
13d70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13d80 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
13d90 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
13da0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
13db0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
13dc0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
13dd0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
13de0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
13df0 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
13e00 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
13e10 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
13e20 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
13e30 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
13e40 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
13e50 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
13e60 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
13e70 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
13e80 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
13e90 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
13ea0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
13eb0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
13ec0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
13ed0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
13ee0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
13ef0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
13f00 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
13f10 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
13f20 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47  ....case CKA_SIG
13f30 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09 43  N_RECOVER:.....C
13f40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13f50 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
13f60 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47  ttribute CKA_SIG
13f70 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30 38  N_RECOVER (0x%08
13f80 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
13f90 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
13fa0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
13fb0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
13fc0 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
13fd0 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
13fe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13ff0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
14000 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
14010 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
14020 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
14030 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
14040 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
14050 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  We currently onl
14060 79 20 73 75 70 70 6f 72 74 20 22 53 69 67 6e 20  y support "Sign 
14070 77 69 74 68 20 41 70 70 65 6e 64 69 78 22 20 2a  with Appendix" *
14080 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  /.....pValue = &
14090 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c  ck_false;.....ul
140a0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
140b0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09  f(ck_false);....
140c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
140d0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
140e0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
140f0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
14100 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
14110 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
14120 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
14130 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
14140 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
14150 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50  .case CKA_DECRYP
14160 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  T:.....CACKEY_DE
14170 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
14180 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
14190 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30 78   CKA_DECRYPT (0x
141a0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
141b0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
141c0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
141d0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
141e0 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
141f0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
14200 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14210 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
14220 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
14230 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
14240 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
14250 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
14260 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
14270 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
14280 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
14290 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73  EY || objectclas
142a0 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  s == CKO_PUBLIC_
142b0 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
142c0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
142d0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
142e0 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
142f0 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
14300 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
14310 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
14320 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
14330 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
14340 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
14350 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
14360 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
14370 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
14380 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
14390 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
143a0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
143b0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
143c0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
143d0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
143e0 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 43 41  ENSITIVE:.....CA
143f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14400 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
14410 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 4e 53  tribute CKA_SENS
14420 49 54 49 56 45 20 28 30 78 25 30 38 6c 78 29 20  ITIVE (0x%08lx) 
14430 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
14440 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
14450 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
14460 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
14470 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
14480 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
14490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
144a0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
144b0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
144c0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
144d0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
144e0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
144f0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  ..}......if (obj
14500 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
14510 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09  PRIVATE_KEY) {..
14520 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
14530 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
14540 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
14550 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
14560 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
14570 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
14580 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
14590 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
145a0 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
145b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
145c0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
145d0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
145e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
145f0 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
14600 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
14610 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
14620 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
14630 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
14640 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42  se CKA_EXTRACTAB
14650 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  LE:.....CACKEY_D
14660 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
14670 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
14680 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  e CKA_EXTRACTABL
14690 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
146a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
146b0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
146c0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
146d0 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
146e0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
146f0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14700 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
14710 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
14720 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
14730 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
14740 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
14750 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
14760 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
14770 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
14780 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  ATE_KEY) {......
14790 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
147a0 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  se;......ulValue
147b0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
147c0 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
147d0 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
147e0 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
147f0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
14800 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
14810 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
14820 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14830 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
14840 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
14850 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
14860 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
14870 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
14880 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
14890 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
148a0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
148b0 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09  KA_MODULUS:.....
148c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
148d0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
148e0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f  attribute CKA_MO
148f0 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20  DULUS (0x%08lx) 
14900 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
14910 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
14920 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
14930 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
14940 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
14950 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
14960 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
14970 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
14980 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
14990 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
149a0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
149b0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
149c0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
149d0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
149e0 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
149f0 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
14a00 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69 66  o_modulus(certif
14a10 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
14a20 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
14a30 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
14a40 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
14a50 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
14a60 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
14a70 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
14a80 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
14a90 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
14aa0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
14ab0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
14ac0 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
14ad0 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
14ae0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
14af0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
14b00 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
14b10 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
14b20 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  NT:.....CACKEY_D
14b30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
14b40 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
14b50 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50  e CKA_PUBLIC_EXP
14b60 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29 20  ONENT (0x%08lx) 
14b70 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
14b80 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
14b90 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
14ba0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
14bb0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
14bc0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
14bd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
14be0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
14bf0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
14c00 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
14c10 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
14c20 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
14c30 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
14c40 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
14c50 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
14c60 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
14c70 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74 69  o_exponent(certi
14c80 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
14c90 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
14ca0 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
14cb0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
14cc0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
14cd0 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
14ce0 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
14cf0 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
14d00 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
14d10 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
14d20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
14d30 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
14d40 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
14d50 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
14d60 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
14d70 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14d80 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54 41  CKA_TRUST_DIGITA
14d90 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09 09  L_SIGNATURE:....
14da0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4e  case CKA_TRUST_N
14db0 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a 0a  ON_REPUDIATION:.
14dc0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
14dd0 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d 45  T_KEY_ENCIPHERME
14de0 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  NT:....case CKA_
14df0 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49 50  TRUST_DATA_ENCIP
14e00 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65  HERMENT:....case
14e10 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 41   CKA_TRUST_KEY_A
14e20 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61 73  GREEMENT:....cas
14e30 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f  e CKA_TRUST_KEY_
14e40 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63 61  CERT_SIGN:....ca
14e50 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52 4c  se CKA_TRUST_CRL
14e60 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43  _SIGN:....case C
14e70 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f  KA_TRUST_SERVER_
14e80 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b  AUTH:....case CK
14e90 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41  A_TRUST_CLIENT_A
14ea0 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  UTH:....case CKA
14eb0 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
14ec0 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ING:....case CKA
14ed0 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f  _TRUST_EMAIL_PRO
14ee0 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41 43  TECTION:.....CAC
14ef0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14f00 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
14f10 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54  ribute CKA_TRUST
14f20 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 20 2e  _... (0x%08lx) .
14f30 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
14f40 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
14f50 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
14f60 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 64 3b  e = &ck_trusted;
14f70 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
14f80 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 73  = sizeof(ck_trus
14f90 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ted);......CACKE
14fa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14fb0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
14fc0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
14fd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
14fe0 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 56 61  (CK_TRUST *) pVa
14ff0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
15000 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
15010 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
15020 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
15030 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53  KA_CERT_SHA1_HAS
15040 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  H:.....CACKEY_DE
15050 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
15060 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
15070 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48   CKA_CERT_SHA1_H
15080 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ASH (0x%08lx) ..
15090 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
150a0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
150b0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
150c0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
150d0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
150e0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
150f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
15100 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
15110 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
15120 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61  are not a Netsca
15130 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
15140 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
15150 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 31 52  ....}......SHA1R
15160 65 73 65 74 28 26 73 68 61 31 5f 63 74 78 29 3b  eset(&sha1_ctx);
15170 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74 28 26  .....SHA1Input(&
15180 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74 69 66  sha1_ctx, certif
15190 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
151a0 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48 41  te_len);.....SHA
151b0 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f 63 74  1Result(&sha1_ct
151c0 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a  x, sha1_hash);..
151d0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73 68 61  ....pValue = sha
151e0 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61  1_hash;.....ulVa
151f0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
15200 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09  sha1_hash);.....
15210 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15220 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
15230 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
15240 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
15250 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
15260 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
15270 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f  ..case CKA_CERT_
15280 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 43 41  MD5_HASH:.....CA
15290 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
152a0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
152b0 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54  tribute CKA_CERT
152c0 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25 30 38  _MD5_HASH (0x%08
152d0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
152e0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
152f0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
15300 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
15310 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
15320 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
15330 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15340 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
15350 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
15360 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
15370 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
15380 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
15390 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
153a0 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f 63 74  .MD5Init(&md5_ct
153b0 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 61 74  x);.....MD5Updat
153c0 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 72 74  e(&md5_ctx, cert
153d0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
153e0 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 4d  cate_len);.....M
153f0 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73 68  D5Final(md5_hash
15400 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09 09  , &md5_ctx);....
15410 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f 68  ..pValue = md5_h
15420 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ash;.....ulValue
15430 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64 35  Len = sizeof(md5
15440 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43  _hash);......CAC
15450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15460 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
15470 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
15480 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
15490 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
154a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65  ....break;....de
154b0 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75  fault:.....pValu
154c0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c  e = NULL;.....ul
154d0 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
154e0 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72 65  ONG) -1;.....bre
154f0 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  ak;...}....if ((
15500 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75  (CK_LONG) ulValu
15510 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f  eLen) != ((CK_LO
15520 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a  NG) -1)) {..../*
15530 20 50 75 73 68 20 63 75 72 72 5f 61 74 74 72 20   Push curr_attr 
15540 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 2a  onto the stack *
15550 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 74  /....curr_attr.t
15560 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72 5f  ype = curr_attr_
15570 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61 74  type;....curr_at
15580 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  tr.ulValueLen = 
15590 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09  ulValueLen;.....
155a0 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65  curr_attr.pValue
155b0 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61   = malloc(curr_a
155c0 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ttr.ulValueLen);
155d0 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
155e0 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56 61  attr.pValue, pVa
155f0 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e 75  lue, curr_attr.u
15600 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
15610 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65 20  if (pValue_free 
15620 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  && pValue) {....
15630 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a 09  .free(pValue);..
15640 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61  ..}.....if (numa
15650 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63  ttrs >= retval_c
15660 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74 76  ount) {.....retv
15670 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74  al = realloc(ret
15680 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e  val, retval_coun
15690 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
156a0 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d  al));....}.....m
156b0 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75  emcpy(&retval[nu
156c0 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61  mattrs], &curr_a
156d0 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  ttr, sizeof(curr
156e0 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61  _attr));....numa
156f0 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a  ttrs++;...}..}..
15700 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d  .if (numattrs !=
15710 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63   0) {...retval_c
15720 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b  ount = numattrs;
15730 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c  ...retval = real
15740 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76  loc(retval, retv
15750 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  al_count * sizeo
15760 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20  f(*retval));..} 
15770 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65  else {...free(re
15780 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c  tval);....retval
15790 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70   = NULL;..}...*p
157a0 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74  ulCount = numatt
157b0 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  rs;...CACKEY_DEB
157c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
157d0 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73  ning %lu objects
157e0 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72   (%p).", numattr
157f0 73 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  s, retval);...re
15800 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
15810 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
15820 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74  key_free_identit
15830 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
15840 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
15850 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64  tities, unsigned
15860 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73   long identities
15870 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54  _count) {..CK_AT
15880 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74  TRIBUTE *curr_at
15890 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  tr;..unsigned lo
158a0 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f  ng id_idx, attr_
158b0 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74  idx;...if (ident
158c0 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  ities == NULL ||
158d0 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
158e0 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  t == 0) {...retu
158f0 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  rn;..}...for (id
15900 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78  _idx = 0; id_idx
15910 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f   < identities_co
15920 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b  unt; id_idx++) {
15930 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65  ...if (identitie
15940 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
15950 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28  utes) {....for (
15960 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74  attr_idx = 0; at
15970 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74  tr_idx < identit
15980 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
15990 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74  ibutes_count; at
159a0 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  tr_idx++) {.....
159b0 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65  curr_attr = &ide
159c0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
159d0 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f  attributes[attr_
159e0 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63  idx];......if (c
159f0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
15a00 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
15a10 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29  rr_attr->pValue)
15a20 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
15a30 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b  .if (identities[
15a40 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
15a50 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69  es) {.....free(i
15a60 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
15a70 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09  ].attributes);..
15a80 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66  ..}.....cackey_f
15a90 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69  ree_certs(identi
15aa0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
15ab0 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31  c_identity, 1, 1
15ac0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65  );...}..}...free
15ad0 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a  (identities);.}.
15ae0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
15af0 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
15b00 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e  cackey_read_iden
15b10 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61  tities(struct ca
15b20 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
15b30 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a   unsigned long *
15b40 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74  ids_found) {..st
15b50 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
15b60 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f  _identity *pcsc_
15b70 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72  identities;..str
15b80 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
15b90 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b  ity *identities;
15ba0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
15bb0 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c  num_ids, id_idx,
15bc0 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09   curr_id_type;..
15bd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
15be0 6d 5f 63 65 72 74 73 2c 20 6e 75 6d 5f 65 78 74  m_certs, num_ext
15bf0 72 61 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69  ra_certs, cert_i
15c00 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65  dx;..int include
15c10 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31  _extra_certs = 1
15c20 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
15c30 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
15c40 22 29 3b 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  ");...if (getenv
15c50 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52  ("CACKEY_NO_EXTR
15c60 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c  A_CERTS") != NUL
15c70 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
15c80 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65  BUG_PRINTF("Aske
15c90 64 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65  d not to include
15ca0 20 65 78 74 72 61 20 28 44 6f 44 29 20 63 65 72   extra (DoD) cer
15cb0 74 69 66 69 63 61 74 65 73 22 29 3b 0a 0a 09 09  tificates");....
15cc0 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
15cd0 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  rts = 0;..}...if
15ce0 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f   (include_extra_
15cf0 63 65 72 74 73 29 20 7b 0a 09 09 6e 75 6d 5f 65  certs) {...num_e
15d00 78 74 72 61 5f 63 65 72 74 73 20 3d 20 73 69 7a  xtra_certs = siz
15d10 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 29  eof(extra_certs)
15d20 20 2f 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f   / sizeof(extra_
15d30 63 65 72 74 73 5b 30 5d 29 3b 0a 0a 09 09 43 41  certs[0]);....CA
15d40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15d50 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 25 69 20  F("Including %i 
15d60 44 6f 44 20 43 65 72 74 69 66 69 63 61 74 65 73  DoD Certificates
15d70 20 61 73 20 6f 62 6a 65 63 74 73 20 6f 6e 20 74   as objects on t
15d80 68 69 73 20 74 6f 6b 65 6e 22 2c 20 6e 75 6d 5f  his token", num_
15d90 65 78 74 72 61 5f 63 65 72 74 73 29 3b 0a 09 7d  extra_certs);..}
15da0 20 65 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f 65 78   else {...num_ex
15db0 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09  tra_certs = 0;..
15dc0 7d 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e  }...if (ids_foun
15dd0 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d == NULL) {...C
15de0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15df0 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f  TF("Error.  ids_
15e00 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b  found is NULL");
15e10 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
15e20 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e  ;..}...pcsc_iden
15e30 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
15e40 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c  read_certs(slot,
15e50 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74   NULL, &num_cert
15e60 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64  s);..if (pcsc_id
15e70 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
15e80 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74  ) {.../* Convert
15e90 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73   number of Certs
15ea0 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62   to number of ob
15eb0 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69  jects */...num_i
15ec0 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54  ds = (CKO_PRIVAT
15ed0 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54  E_KEY - CKO_CERT
15ee0 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e  IFICATE + 1) * n
15ef0 75 6d 5f 63 65 72 74 73 3b 0a 09 09 6e 75 6d 5f  um_certs;...num_
15f00 69 64 73 20 2b 3d 20 6e 75 6d 5f 65 78 74 72 61  ids += num_extra
15f10 5f 63 65 72 74 73 20 2a 20 32 3b 0a 0a 09 09 69  _certs * 2;....i
15f20 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c  dentities = mall
15f30 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a  oc(num_ids * siz
15f40 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29  eof(*identities)
15f50 29 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63 65 72  );..../* Add cer
15f60 74 69 66 69 63 61 74 65 73 2c 20 70 75 62 6c 69  tificates, publi
15f70 63 20 6b 65 79 73 2c 20 61 6e 64 20 70 72 69 76  c keys, and priv
15f80 61 74 65 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ate keys from th
15f90 65 20 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a 09  e smartcard */..
15fa0 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66  .id_idx = 0;...f
15fb0 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30  or (cert_idx = 0
15fc0 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d  ; cert_idx < num
15fd0 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78  _certs; cert_idx
15fe0 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28 63 75  ++) {....for (cu
15ff0 72 72 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f  rr_id_type = CKO
16000 5f 43 45 52 54 49 46 49 43 41 54 45 3b 20 63 75  _CERTIFICATE; cu
16010 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b  rr_id_type <= CK
16020 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b 20 63  O_PRIVATE_KEY; c
16030 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b  urr_id_type++) {
16040 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
16050 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
16060 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
16070 61 74 74 72 69 62 75 74 65 73 28 63 75 72 72 5f  attributes(curr_
16080 69 64 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69  id_type, &pcsc_i
16090 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
160a0 64 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26  dx], cert_idx, &
160b0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
160c0 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
160d0 75 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74  unt);......ident
160e0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
160f0 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61  sc_identity = ma
16100 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65  lloc(sizeof(*ide
16110 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
16120 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b  pcsc_identity));
16130 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e  .....memcpy(iden
16140 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
16150 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70  csc_identity, &p
16160 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
16170 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66  ert_idx], sizeof
16180 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  (*identities[id_
16190 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
161a0 74 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74  ty));......ident
161b0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
161c0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72  sc_identity->cer
161d0 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f  tificate = mallo
161e0 63 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  c(pcsc_identitie
161f0 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74  s[cert_idx].cert
16200 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
16210 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74  ..memcpy(identit
16220 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
16230 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
16240 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65  ficate, pcsc_ide
16250 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
16260 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70  ].certificate, p
16270 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
16280 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69  ert_idx].certifi
16290 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  cate_len);......
162a0 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09  id_idx++;....}..
162b0 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65  .}....cackey_fre
162c0 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65  e_certs(pcsc_ide
162d0 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72  ntities, num_cer
162e0 74 73 2c 20 31 29 3b 0a 0a 09 09 2f 2a 20 41 64  ts, 1);..../* Ad
162f0 64 20 44 6f 44 20 43 65 72 74 69 66 69 63 61 74  d DoD Certificat
16300 65 73 20 61 6e 64 20 4e 65 74 73 63 61 70 65 20  es and Netscape 
16310 54 72 75 73 74 20 4f 62 6a 65 63 74 73 20 2a 2f  Trust Objects */
16320 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78  ...for (cert_idx
16330 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c   = 0; cert_idx <
16340 20 6e 75 6d 5f 65 78 74 72 61 5f 63 65 72 74 73   num_extra_certs
16350 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a  ; cert_idx++) {.
16360 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
16370 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
16380 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 69  ity = NULL;....i
16390 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
163a0 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
163b0 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
163c0 75 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 49  utes(CKO_CERTIFI
163d0 43 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65 72  CATE, &extra_cer
163e0 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78  ts[cert_idx], 0x
163f0 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c  f000 | cert_idx,
16400 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
16410 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
16420 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 69 64 5f 69  count);.....id_i
16430 64 78 2b 2b 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72  dx++;...}....for
16440 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20   (cert_idx = 0; 
16450 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 65  cert_idx < num_e
16460 78 74 72 61 5f 63 65 72 74 73 3b 20 63 65 72 74  xtra_certs; cert
16470 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 64 65  _idx++) {....ide
16480 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
16490 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20  pcsc_identity = 
164a0 4e 55 4c 4c 3b 0a 09 09 09 69 64 65 6e 74 69 74  NULL;....identit
164b0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
164c0 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
164d0 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43  get_attributes(C
164e0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
164f0 54 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b  T, &extra_certs[
16500 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30  cert_idx], 0xf00
16510 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69  0 | cert_idx, &i
16520 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
16530 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
16540 6e 74 29 3b 0a 0a 09 09 09 69 64 5f 69 64 78 2b  nt);.....id_idx+
16550 2b 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66  +;...}....*ids_f
16560 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a  ound = num_ids;.
16570 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74  ..return(identit
16580 69 65 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64 73 5f  ies);..}...*ids_
16590 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75  found = 0;..retu
165a0 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f  rn(NULL);.}..CK_
165b0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
165c0 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c  CK_RV, C_Initial
165d0 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52  ize)(CK_VOID_PTR
165e0 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43   pInitArgs) {..C
165f0 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41  K_C_INITIALIZE_A
16600 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b  RGS CK_PTR args;
16610 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a  ..uint32_t idx;.
16620 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f  .int mutex_init_
16630 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
16640 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
16650 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63  ed.");...if (cac
16660 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
16670 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16680 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
16690 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61    Already initia
166a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
166b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
166c0 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c  _ALREADY_INITIAL
166d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
166e0 70 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c  pInitArgs != NUL
166f0 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49  L) {...args = pI
16700 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70  nitArgs;...memcp
16710 79 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20  y(&cackey_args, 
16720 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63  args, sizeof(cac
16730 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69  key_args));....i
16740 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d  f (args->CreateM
16750 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
16760 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74  args->DestroyMut
16770 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex == NULL || ar
16780 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d  gs->LockMutex ==
16790 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55   NULL || args->U
167a0 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55  nlockMutex == NU
167b0 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67  LL) {....if (arg
167c0 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21  s->CreateMutex !
167d0 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
167e0 44 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20  DestroyMutex != 
167f0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f  NULL || args->Lo
16800 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20  ckMutex != NULL 
16810 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d  || args->UnlockM
16820 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  utex != NULL) {.
16830 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16840 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16850 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c  Some, but not Al
16860 6c 20 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d  l threading prim
16870 69 74 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e  itives provided.
16880 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
16890 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
168a0 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20  D);....}...}..} 
168b0 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f  else {...cackey_
168c0 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
168d0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
168e0 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75  y_args.DestroyMu
168f0 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
16900 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
16910 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
16920 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
16930 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
16940 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67  cackey_args.flag
16950 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20  s = 0;..}...for 
16960 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
16970 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
16980 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
16990 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
169a0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
169b0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
169c0 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ns[idx].active =
169d0 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64   0;..}...for (id
169e0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
169f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
16a00 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
16a10 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
16a20 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79  dx++) {...cackey
16a30 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69  _slots[idx].acti
16a40 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ve = 0;...cackey
16a50 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
16a60 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a  _reader = NULL;.
16a70 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
16a80 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
16a90 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63  depth = 0;...cac
16aa0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
16ab0 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
16ac0 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 63  hw_lock = 0;...c
16ad0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
16ae0 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b  .slot_reset = 0;
16af0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
16b00 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  idx].token_flags
16b10 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
16b20 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20  lots[idx].label 
16b30 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63  = NULL;..}...cac
16b40 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20  key_initialized 
16b50 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  = 1;...if (!cack
16b60 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29  ey_biglock_init)
16b70 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f   {...mutex_init_
16b80 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  ret = cackey_mut
16b90 65 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65  ex_create(&cacke
16ba0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69  y_biglock);....i
16bb0 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  f (mutex_init_re
16bc0 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  t != 0) {....CAC
16bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16be0 28 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20  ("Error.  Mutex 
16bf0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  initialization f
16c00 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
16c10 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f  turn(CKR_CANT_LO
16c20 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  CK);...}....cack
16c30 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20  ey_biglock_init 
16c40 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  = 1;..}...CACKEY
16c50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
16c60 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
16c70 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
16c80 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
16c90 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
16ca0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
16cb0 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f  _Finalize)(CK_VO
16cc0 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64  ID_PTR pReserved
16cd0 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64  ) {..uint32_t id
16ce0 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
16cf0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
16d00 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65  .");...if (pRese
16d10 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  rved != NULL) {.
16d20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16d30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52  RINTF("Error. pR
16d40 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e  eserved is not N
16d50 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
16d60 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
16d70 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
16d80 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
16d90 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
16da0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
16db0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
16dc0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
16dd0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
16de0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
16df0 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
16e00 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
16e10 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
16e20 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
16e30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
16e40 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
16e50 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
16e60 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
16e70 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69  ....C_CloseSessi
16e80 6f 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a  on(idx);...}..}.
16e90 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
16ea0 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
16eb0 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
16ec0 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
16ed0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
16ee0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
16ef0 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ts[0])); idx++) 
16f00 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
16f10 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72  lots[idx].pcsc_r
16f20 65 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65  eader) {....free
16f30 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
16f40 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  x].pcsc_reader);
16f50 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
16f60 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
16f70 28 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69  ();...cackey_ini
16f80 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09  tialized = 0;...
16f90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16fa0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
16fb0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
16fc0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
16fd0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
16fe0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
16ff0 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28  _RV, C_GetInfo)(
17000 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  CK_INFO_PTR pInf
17010 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  o) {..static CK_
17020 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63  UTF8CHAR manufac
17030 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53  turerID[] = "U.S
17040 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09  . Government";..
17050 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
17060 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69  AR libraryDescri
17070 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
17080 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  y";...CACKEY_DEB
17090 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
170a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
170b0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
170c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
170d0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
170e0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
170f0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
17100 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
17110 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
17120 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
17130 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17140 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
17150 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
17160 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
17170 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
17180 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66  IZED);..}...pInf
17190 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69  o->cryptokiVersi
171a0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
171b0 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
171c0 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
171d0 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
171e0 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
171f0 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
17200 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
17210 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
17220 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74  & 0xff;...memset
17230 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
17240 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a  urerID, ' ', siz
17250 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
17260 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65  acturerID));..me
17270 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
17280 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75  facturerID, manu
17290 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65  facturerID, size
172a0 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49  of(manufacturerI
172b0 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f  D) - 1);...pInfo
172c0 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a  ->flags = 0x00;.
172d0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
172e0 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
172f0 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  on, ' ', sizeof(
17300 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
17310 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
17320 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mcpy(pInfo->libr
17330 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
17340 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
17350 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61  on, sizeof(libra
17360 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d  ryDescription) -
17370 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69   1);...pInfo->li
17380 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a  braryVersion.maj
17390 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
173a0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
173b0 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
173c0 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e  >libraryVersion.
173d0 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
173e0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
173f0 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43  8) & 0xff;...CAC
17400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17410 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
17420 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
17430 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
17440 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72  OK);.}../*. * Pr
17450 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65  ocess list of re
17460 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74  aders, and creat
17470 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65  e mapping betwee
17480 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e  n reader name an
17490 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b  d slot ID. */.CK
174a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
174b0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f  (CK_RV, C_GetSlo
174c0 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20  tList)(CK_BBOOL 
174d0 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b  tokenPresent, CK
174e0 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
174f0 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  otList, CK_ULONG
17500 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b  _PTR pulCount) {
17510 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
17520 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f  al;..int pcsc_co
17530 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55  nnect_ret;..CK_U
17540 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74  LONG count, slot
17550 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72  _count = 0, curr
17560 73 6c 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73  slot;..char *pcs
17570 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63  c_readers, *pcsc
17580 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73  _readers_s, *pcs
17590 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57  c_readers_e;..DW
175a0 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73  ORD pcsc_readers
175b0 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _len;..LONG scar
175c0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
175d0 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f  t;..size_t curr_
175e0 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41  reader_len;...CA
175f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17600 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
17610 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20  if (pulCount == 
17620 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
17630 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17640 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69  rror. pulCount i
17650 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
17660 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
17670 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
17680 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
17690 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
176a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
176b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
176c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
176d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
176e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
176f0 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ED);..}...mutex_
17700 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
17710 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
17720 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
17730 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
17740 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
17750 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
17760 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
17770 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
17780 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
17790 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c  ROR);..}.../* Cl
177a0 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  ear list of slot
177b0 73 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c  s */..if (pSlotL
177c0 69 73 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ist) {...CACKEY_
177d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75  DEBUG_PRINTF("Pu
177e0 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69  rging all slot i
177f0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a  nformation.");..
17800 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65  ../* Only update
17810 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f   the list of slo
17820 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74  ts if we are act
17830 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70  ually being supp
17840 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f  ly the slot info
17850 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63  rmation */...cac
17860 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
17870 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 66  nect_all();....f
17880 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
17890 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
178a0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
178b0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
178c0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
178d0 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
178e0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
178f0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
17900 72 65 61 64 65 72 29 20 7b 0a 09 09 09 09 66 72  reader) {.....fr
17910 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
17920 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
17930 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 63 61 63  eader);......cac
17940 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
17950 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  ot].pcsc_reader 
17960 3d 20 4e 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09  = NULL;....}....
17970 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
17980 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
17990 6c 29 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61  l) {.....free(ca
179a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
179b0 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09  lot].label);....
179c0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
179d0 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d  urrslot].label =
179e0 20 4e 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09   NULL;....}.....
179f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
17a00 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20  rslot].active = 
17a10 30 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44  0;...}..}.../* D
17a20 65 74 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66  etermine list of
17a30 20 72 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73   readers */..pcs
17a40 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
17a50 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
17a60 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63  ect();..if (pcsc
17a70 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
17a80 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
17a90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17aa0 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65  UG_PRINTF("Conne
17ab0 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66  ction to PC/SC f
17ac0 61 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20  ailed, assuming 
17ad0 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73  no slots");....s
17ae0 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  lot_count = 0;..
17af0 7d 20 65 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f  } else {...pcsc_
17b00 72 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b  readers_len = 0;
17b10 0a 0a 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65  ....scard_listre
17b20 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72  aders_ret = SCar
17b30 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61  dListReaders(*ca
17b40 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
17b50 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70  , NULL, NULL, &p
17b60 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
17b70 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c  ;....if (scard_l
17b80 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
17b90 3d 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45  = SCARD_F_COMM_E
17ba0 52 52 4f 52 29 20 7b 0a 09 09 09 43 41 43 4b 45  RROR) {....CACKE
17bb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17bc0 45 72 72 6f 72 2e 20 53 43 61 72 64 4c 69 73 74  Error. SCardList
17bd0 52 65 61 64 65 72 73 28 29 20 72 65 74 75 72 6e  Readers() return
17be0 65 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f  ed SCARD_F_COMM_
17bf0 45 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20  ERROR, assuming 
17c00 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43  Connection to PC
17c10 2f 53 43 20 77 65 6e 74 20 61 77 61 79 2e 20 52  /SC went away. R
17c20 65 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a  econnecting.");.
17c30 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  ....cackey_pcsc_
17c40 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09  disconnect();...
17c50 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e  .cackey_pcsc_con
17c60 6e 65 63 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b  nect();.....CACK
17c70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17c80 22 54 72 79 69 6e 67 20 53 43 61 72 64 4c 69 73  "Trying SCardLis
17c90 74 52 65 61 64 65 72 73 28 29 20 61 67 61 69 6e  tReaders() again
17ca0 22 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69 73  ");....scard_lis
17cb0 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53  treaders_ret = S
17cc0 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
17cd0 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
17ce0 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  dle, NULL, NULL,
17cf0 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c   &pcsc_readers_l
17d00 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  en);...}....if (
17d10 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
17d20 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
17d30 5f 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63  _SUCCESS && pcsc
17d40 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20  _readers_len != 
17d50 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61  0) {....pcsc_rea
17d60 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63  ders = malloc(pc
17d70 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
17d80 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
17d90 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72  _s = pcsc_reader
17da0 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73  s;.....scard_lis
17db0 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53  treaders_ret = S
17dc0 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
17dd0 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
17de0 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f  dle, NULL, pcsc_
17df0 72 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72  readers, &pcsc_r
17e00 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
17e10 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
17e20 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
17e30 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
17e40 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
17e50 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72  _e = pcsc_reader
17e60 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73  s + pcsc_readers
17e70 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74  _len;....../* St
17e80 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44  art with Slot ID
17e90 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62   1, to avoid a b
17ea0 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45  ug in GDM on RHE
17eb0 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20  L */...../* Bug 
17ec0 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f  594911: https://
17ed0 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e  bugzilla.redhat.
17ee0 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69  com/show_bug.cgi
17ef0 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09  ?id=594911 */...
17f00 09 09 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a  ..currslot = 1;.
17f10 09 09 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f  ....while (pcsc_
17f20 72 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72  readers < pcsc_r
17f30 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09  eaders_e) {.....
17f40 09 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e  .curr_reader_len
17f50 20 3d 20 73 74 72 6c 65 6e 28 70 63 73 63 5f 72   = strlen(pcsc_r
17f60 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 69  eaders);.......i
17f70 66 20 28 28 70 63 73 63 5f 72 65 61 64 65 72 73  f ((pcsc_readers
17f80 20 2b 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c   + curr_reader_l
17f90 65 6e 29 20 3e 20 70 63 73 63 5f 72 65 61 64 65  en) > pcsc_reade
17fa0 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 09 62 72  rs_e) {.......br
17fb0 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09  eak;......}.....
17fc0 09 09 69 66 20 28 63 75 72 72 5f 72 65 61 64 65  ..if (curr_reade
17fd0 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  r_len == 0) {...
17fe0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
17ff0 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72  }.......if (curr
18000 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28  slot >= (sizeof(
18010 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
18020 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
18030 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09  ots[0]))) {.....
18040 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18050 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72  RINTF("Found mor
18060 65 20 72 65 61 64 65 72 73 20 74 68 61 6e 20 73  e readers than s
18070 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62  lots are availab
18080 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09 09 62 72  le!");........br
18090 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09  eak;......}.....
180a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
180b0 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 72 65 61  RINTF("Found rea
180c0 64 65 72 3a 20 25 73 22 2c 20 70 63 73 63 5f 72  der: %s", pcsc_r
180d0 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 2f  eaders);......./
180e0 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68  * Only update th
180f0 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  e list of slots 
18100 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c  if we are actual
18110 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73  ly being asked s
18120 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69  upply the slot i
18130 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09  nformation */...
18140 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
18150 29 20 7b 0a 09 09 09 09 09 09 63 61 63 6b 65 79  ) {.......cackey
18160 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
18170 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09  .active = 1;....
18180 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
18190 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
181a0 65 61 64 65 72 20 3d 20 73 74 72 64 75 70 28 70  eader = strdup(p
181b0 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 09 09  csc_readers);...
181c0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
181d0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
181e0 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
181f0 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79   0;.......cackey
18200 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
18210 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  .transaction_dep
18220 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61  th = 0;.......ca
18230 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
18240 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  lot].transaction
18250 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
18260 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  0;.......cackey_
18270 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
18280 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
18290 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
182a0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b  ts[currslot].tok
182b0 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
182c0 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09  OGIN_REQUIRED;..
182d0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
182e0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
182f0 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09  l = NULL;.......
18300 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
18310 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f  t_reset(&cackey_
18320 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29  slots[currslot])
18330 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75  ;......}......cu
18340 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09  rrslot++;.......
18350 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20  pcsc_readers += 
18360 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20  curr_reader_len 
18370 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  + 1;.....}......
18380 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c  /* Start with Sl
18390 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69  ot ID 1, to avoi
183a0 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f  d a bug in GDM o
183b0 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a  n RHEL */...../*
183c0 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74   Bug 594911: htt
183d0 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65  ps://bugzilla.re
183e0 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75  dhat.com/show_bu
183f0 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20  g.cgi?id=594911 
18400 2a 2f 0a 09 09 09 09 69 66 20 28 63 75 72 72 73  */.....if (currs
18410 6c 6f 74 20 3e 20 31 29 20 7b 0a 09 09 09 09 09  lot > 1) {......
18420 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c  /* Start with Sl
18430 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69  ot ID 1, to avoi
18440 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f  d a bug in GDM o
18450 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 09 2f  n RHEL */....../
18460 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74  * Bug 594911: ht
18470 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72  tps://bugzilla.r
18480 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62  edhat.com/show_b
18490 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31  ug.cgi?id=594911
184a0 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 5f 63 6f   */......slot_co
184b0 75 6e 74 20 3d 20 63 75 72 72 73 6c 6f 74 20 2d  unt = currslot -
184c0 20 31 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65   1;.....}....} e
184d0 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
184e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
184f0 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43  econd call to SC
18500 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66  ardListReaders f
18510 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73  ailed, return %s
18520 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45  /%li", CACKEY_DE
18530 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
18540 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c  R_TO_STR(scard_l
18550 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c  istreaders_ret),
18560 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69   (long) scard_li
18570 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a  streaders_ret);.
18580 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63  ...}.....free(pc
18590 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09  sc_readers_s);..
185a0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
185b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
185c0 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  ("First call to 
185d0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
185e0 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
185f0 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
18600 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
18610 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
18620 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
18630 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
18640 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
18650 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
18660 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
18670 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
18680 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
18690 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
186a0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
186b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
186c0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
186d0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
186e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
186f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
18700 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d  if (pSlotList ==
18710 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
18720 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e  ount = slot_coun
18730 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  t;....CACKEY_DEB
18740 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
18750 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
18760 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61  .  Found %lu rea
18770 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74  ders, but not st
18780 6f 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74  oring IDs (pSlot
18790 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20  List == NULL)", 
187a0 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65  CKR_OK, (unsigne
187b0 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75  d long) slot_cou
187c0 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  nt);....return(C
187d0 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75  KR_OK);..}...cou
187e0 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a  nt = *pulCount;.
187f0 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f  .if (count < slo
18800 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43  t_count) {...CAC
18810 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18820 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c  ("Error. User al
18830 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72  located %lu entr
18840 69 65 73 2c 20 62 75 74 20 77 65 20 68 61 76 65  ies, but we have
18850 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20   %lu entries.", 
18860 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e  count, slot_coun
18870 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
18880 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
18890 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 66 6f 72 20 28  LL);...}...for (
188a0 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
188b0 72 72 73 6c 6f 74 20 3c 20 73 6c 6f 74 5f 63 6f  rrslot < slot_co
188c0 75 6e 74 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  unt; currslot++)
188d0 20 7b 0a 09 09 2f 2a 20 53 74 61 72 74 20 77 69   {.../* Start wi
188e0 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f  th Slot ID 1, to
188f0 20 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20   avoid a bug in 
18900 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09  GDM on RHEL */..
18910 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20  ./* Bug 594911: 
18920 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
18930 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77  .redhat.com/show
18940 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39  _bug.cgi?id=5949
18950 31 31 20 2a 2f 0a 09 09 70 53 6c 6f 74 4c 69 73  11 */...pSlotLis
18960 74 5b 63 75 72 72 73 6c 6f 74 5d 20 3d 20 63 75  t[currslot] = cu
18970 72 72 73 6c 6f 74 20 2b 20 31 3b 0a 09 7d 0a 0a  rrslot + 1;..}..
18980 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f  .*pulCount = slo
18990 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45  t_count;...CACKE
189a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
189b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
189c0 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c   (%i).  Found %l
189d0 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52  u readers.", CKR
189e0 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  _OK, (unsigned l
189f0 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  ong) slot_count)
18a00 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
18a10 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65  K);...tokenPrese
18a20 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e  nt = tokenPresen
18a30 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  t; /* Supress un
18a40 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
18a50 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
18a60 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
18a70 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49  K_RV, C_GetSlotI
18a80 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
18a90 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f  slotID, CK_SLOT_
18aa0 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
18ab0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  {..static CK_UTF
18ac0 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69  8CHAR slotDescri
18ad0 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
18ae0 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75  y Slot";..int mu
18af0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
18b00 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
18b10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18b20 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
18b30 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
18b40 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
18b50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18b60 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
18b70 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
18b80 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
18b90 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
18ba0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
18bb0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
18bc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18bd0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
18be0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
18bf0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
18c00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
18c10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
18c20 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
18c30 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
18c40 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
18c50 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
18c60 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
18c70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18c80 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
18c90 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
18ca0 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
18cb0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
18cc0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
18cd0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
18ce0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
18cf0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
18d00 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
18d10 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
18d20 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
18d30 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
18d40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18d50 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
18d60 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
18d70 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
18d80 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
18d90 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
18da0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
18db0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
18dc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18dd0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
18de0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
18df0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
18e00 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
18e10 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
18e20 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
18e30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
18e40 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
18e50 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
18e60 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
18e70 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44   CKF_REMOVABLE_D
18e80 45 56 49 43 45 20 7c 20 43 4b 46 5f 48 57 5f 53  EVICE | CKF_HW_S
18e90 4c 4f 54 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  LOT;...if (cacke
18ea0 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
18eb0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
18ec0 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59  otID]) == CACKEY
18ed0 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
18ee0 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d  SENT) {...pInfo-
18ef0 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f  >flags |= CKF_TO
18f00 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a  KEN_PRESENT;..}.
18f10 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20  ..bytes_to_copy 
18f20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f  = strlen(cackey_
18f30 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63  slots[slotID].pc
18f40 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 20  sc_reader);..if 
18f50 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d  (sizeof(pInfo->m
18f60 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 3c  anufacturerID) <
18f70 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20   bytes_to_copy) 
18f80 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  {...bytes_to_cop
18f90 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  y = sizeof(pInfo
18fa0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
18fb0 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49  );..}..memcpy(pI
18fc0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
18fd0 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  rID, cackey_slot
18fe0 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72  s[slotID].pcsc_r
18ff0 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f  eader, bytes_to_
19000 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72  copy);...mutex_r
19010 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
19020 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
19030 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
19040 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
19050 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
19060 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
19070 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
19080 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
19090 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
190a0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65  _ERROR);..}...me
190b0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mset(pInfo->slot
190c0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27  Description, ' '
190d0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
190e0 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29  slotDescription)
190f0 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
19100 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
19110 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69  n, slotDescripti
19120 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44  on, sizeof(slotD
19130 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29  escription) - 1)
19140 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
19150 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
19160 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
19170 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
19180 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  rID));...pInfo->
19190 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
191a0 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
191b0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
191c0 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
191d0 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
191e0 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
191f0 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
19200 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
19210 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
19220 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
19230 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
19240 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
19250 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41  nor = 0x00;...CA
19260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19270 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
19280 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
19290 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
192a0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
192b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
192c0 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66  V, C_GetTokenInf
192d0 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
192e0 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49  otID, CK_TOKEN_I
192f0 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
19300 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
19310 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
19320 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
19330 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
19340 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64  ic CK_UTF8CHAR d
19350 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20  efaultLabel[] = 
19360 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b  "Unknown Token";
19370 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
19380 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22  CHAR model[] = "
19390 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72  CAC Token";..str
193a0 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
193b0 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
193c0 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69  dentities;..unsi
193d0 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
193e0 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61  rts;..ssize_t la
193f0 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  bel_ret;..int mu
19400 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
19410 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62   use_default_lab
19420 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  el;...CACKEY_DEB
19430 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
19440 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
19450 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
19460 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19470 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
19480 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
19490 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
194a0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
194b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
194c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
194d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
194e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
194f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
19500 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
19510 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
19520 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
19530 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
19540 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
19550 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
19560 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
19570 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
19580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19590 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
195a0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
195b0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
195c0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
195d0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
195e0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
195f0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
19600 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
19610 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
19620 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
19630 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
19640 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
19650 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19660 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
19670 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
19680 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
19690 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
196a0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
196b0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
196c0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
196d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
196e0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
196f0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
19700 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
19710 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
19720 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
19730 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
19740 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
19750 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
19760 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
19770 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
19780 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26  _token_present(&
19790 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
197a0 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f  tID]) != CACKEY_
197b0 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
197c0 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ENT) {...CACKEY_
197d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f  DEBUG_PRINTF("No
197e0 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 6e   token is presen
197f0 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c  t in slotID = %l
19800 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  u", slotID);....
19810 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
19820 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
19830 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
19840 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45  KR_TOKEN_NOT_PRE
19850 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  SENT);..}...mute
19860 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
19870 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
19880 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
19890 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
198a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
198b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
198c0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
198d0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
198e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
198f0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
19900 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 6f  ./* Determine to
19910 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63  ken label from c
19920 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09  ertificates */..
19930 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61  memset(pInfo->la
19940 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  bel, ' ', sizeof
19950 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
19960 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
19970 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63  bel = 1;...if (c
19980 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
19990 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c  ID].label == NUL
199a0 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e  L) {...pcsc_iden
199b0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
199c0 72 65 61 64 5f 63 65 72 74 73 28 26 63 61 63 6b  read_certs(&cack
199d0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
199e0 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72  , NULL, &num_cer
199f0 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f  ts);...if (pcsc_
19a00 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
19a10 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d  LL) {....if (num
19a20 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a 09 09  _certs > 0) {...
19a30 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20 63 61  ..label_ret = ca
19a40 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
19a50 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63  ty_to_label(pcsc
19a60 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70 49 6e  _identities, pIn
19a70 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f  fo->label, sizeo
19a80 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
19a90 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 65 6c 5f  ;.....if (label_
19aa0 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09  ret > 0) {......
19ab0 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
19ac0 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63 61 63  l = 0;.......cac
19ad0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
19ae0 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63  ].label = malloc
19af0 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c  (sizeof(pInfo->l
19b00 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65  abel));.......me
19b10 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74  mcpy(cackey_slot
19b20 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c  s[slotID].label,
19b30 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73   pInfo->label, s
19b40 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
19b50 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  el));.....}....}
19b60 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  .....cackey_free
19b70 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e  _certs(pcsc_iden
19b80 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74  tities, num_cert
19b90 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  s, 1);...}..} el
19ba0 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49  se {...memcpy(pI
19bb0 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b  nfo->label, cack
19bc0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
19bd0 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  .label, sizeof(p
19be0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a  Info->label));..
19bf0 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
19c00 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  bel = 0;..}...if
19c10 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61   (use_default_la
19c20 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  bel) {...memcpy(
19c30 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65  pInfo->label, de
19c40 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65  faultLabel, size
19c50 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29  of(defaultLabel)
19c60 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73   - 1);..}...mems
19c70 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
19c80 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
19c90 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
19ca0 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09  ufacturerID));..
19cb0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
19cc0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61  nufacturerID, ma
19cd0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69  nufacturerID, si
19ce0 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65  zeof(manufacture
19cf0 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  rID) - 1);...mem
19d00 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c  set(pInfo->model
19d10 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
19d20 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d  nfo->model));..m
19d30 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emcpy(pInfo->mod
19d40 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f  el, model, sizeo
19d50 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a  f(model) - 1);..
19d60 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73  .memset(pInfo->s
19d70 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27  erialNumber, ' '
19d80 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
19d90 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a  serialNumber));.
19da0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
19db0 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69  utcTime, ' ', si
19dc0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54  zeof(pInfo->utcT
19dd0 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  ime));...pInfo->
19de0 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
19df0 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
19e00 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
19e10 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
19e20 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
19e30 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
19e40 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
19e50 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
19e60 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
19e70 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
19e80 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
19e90 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
19ea0 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49  nor = 0x00;...pI
19eb0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
19ec0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
19ed0 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   | CKF_USER_PIN_
19ee0 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b  INITIALIZED | CK
19ef0 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49  F_TOKEN_INITIALI
19f00 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f  ZED | cackey_slo
19f10 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
19f20 5f 66 6c 61 67 73 3b 0a 0a 09 70 49 6e 66 6f 2d  _flags;...pInfo-
19f30 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75  >ulMaxSessionCou
19f40 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  nt = (sizeof(cac
19f50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
19f60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
19f70 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b  ssions[0])) - 1;
19f80 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69  ..pInfo->ulSessi
19f90 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41  onCount = CK_UNA
19fa0 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
19fb0 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
19fc0 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e  MaxRwSessionCoun
19fd0 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75  t = 0;..pInfo->u
19fe0 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  lRwSessionCount 
19ff0 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
1a000 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
1a010 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65  Info->ulMaxPinLe
1a020 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d  n = 128;..pInfo-
1a030 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30  >ulMinPinLen = 0
1a040 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61  ;..pInfo->ulTota
1a050 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20  lPublicMemory = 
1a060 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1a070 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
1a080 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63  fo->ulFreePublic
1a090 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
1a0a0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
1a0b0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54  ION;..pInfo->ulT
1a0c0 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72  otalPrivateMemor
1a0d0 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
1a0e0 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
1a0f0 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72  .pInfo->ulFreePr
1a100 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b  ivateMemory = CK
1a110 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
1a120 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b  ORMATION;...CACK
1a130 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a140 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1a150 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1a160 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1a170 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1a180 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1a190 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76   C_WaitForSlotEv
1a1a0 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c  ent)(CK_FLAGS fl
1a1b0 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f  ags, CK_SLOT_ID_
1a1c0 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f  PTR pSlotID, CK_
1a1d0 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76  VOID_PTR pReserv
1a1e0 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ed) {..CACKEY_DE
1a1f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1a200 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65  ed.");...if (pRe
1a210 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20  served != NULL) 
1a220 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a230 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a240 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74  pReserved is not
1a250 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1a260 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1a270 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1a280 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1a290 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1a2a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a2b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1a2c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1a2d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1a2e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1a2f0 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a  D);..}.../* XXX:
1a300 20 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74   TODO: Implement
1a310 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43   this... */..CAC
1a320 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a330 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1a340 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1a350 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1a360 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1a370 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1a380 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1a390 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1a3a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1a3b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1a3c0 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
1a3d0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
1a3e0 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  tID, CK_MECHANIS
1a3f0 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68  M_TYPE_PTR pMech
1a400 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c  anismList, CK_UL
1a410 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
1a420 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1a430 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1a440 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1a450 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1a460 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a470 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a480 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1a490 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1a4a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1a4b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1a4c0 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20  ...if (pulCount 
1a4d0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1a4e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a4f0 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75  ("Error.  pulCou
1a500 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  nt is NULL.");..
1a510 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1a520 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1a530 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
1a540 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
1a550 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b  ..*pulCount = 1;
1a560 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a570 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1a580 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1a590 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
1a5a0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
1a5b0 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20  ..if (*pulCount 
1a5c0 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 1) {...CACKEY_
1a5d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1a5e0 72 6f 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f  ror.  Buffer too
1a5f0 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65   small.");....re
1a600 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f  turn(CKR_BUFFER_
1a610 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a  TOO_SMALL);..}..
1a620 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b  .pMechanismList[
1a630 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  0] = CKM_RSA_PKC
1a640 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  S;..*pulCount = 
1a650 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  1;...CACKEY_DEBU
1a660 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1a670 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1a680 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1a690 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1a6a0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1a6b0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d  ON(CK_RV, C_GetM
1a6c0 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b  echanismInfo)(CK
1a6d0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
1a6e0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59   CK_MECHANISM_TY
1a6f0 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48  PE type, CK_MECH
1a700 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70  ANISM_INFO_PTR p
1a710 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74  Info) {..int mut
1a720 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
1a730 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a740 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1a750 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1a760 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a770 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a780 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1a790 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a7a0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1a7b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1a7c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1a7d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a7e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a7f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1a800 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1a810 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1a820 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1a830 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1a840 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1a850 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1a860 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1a870 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1a880 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1a890 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1a8a0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1a8b0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1a8c0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1a8d0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1a8e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1a8f0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1a900 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1a910 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1a920 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1a930 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1a940 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1a950 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a960 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a970 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1a980 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a990 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1a9a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1a9b0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1a9c0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1a9d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a9e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1a9f0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1aa00 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1aa10 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1aa20 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1aa30 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1aa40 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1aa50 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1aa60 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1aa70 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1aa80 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1aa90 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1aaa0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1aab0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1aac0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1aad0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1aae0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1aaf0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1ab00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1ab10 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1ab20 0a 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20  ..switch (type) 
1ab30 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
1ab40 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d  _PKCS:....pInfo-
1ab50 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20  >ulMinKeySize = 
1ab60 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75  512;....pInfo->u
1ab70 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31  lMaxKeySize = 81
1ab80 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c  92;....pInfo->fl
1ab90 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43  ags = CKF_HW | C
1aba0 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46  KF_ENCRYPT | CKF
1abb0 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53  _DECRYPT | CKF_S
1abc0 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59  IGN | CKF_VERIFY
1abd0 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
1abe0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1abf0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1ac00 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1ac10 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1ac20 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57  CKR_OK);.}../* W
1ac30 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
1ac40 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
1ac50 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1ac60 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74  ON(CK_RV, C_Init
1ac70 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49  Token)(CK_SLOT_I
1ac80 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46  D slotID, CK_UTF
1ac90 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
1aca0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
1acb0 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
1acc0 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41  TR pLabel) {..CA
1acd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ace0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1acf0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1ad00 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1ad10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ad20 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1ad30 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1ad40 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1ad50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1ad60 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1ad70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ad80 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54  "Returning CKR_T
1ad90 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
1ada0 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  CTED (%i)", CKR_
1adb0 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
1adc0 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ECTED);...return
1add0 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45  (CKR_TOKEN_WRITE
1ade0 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a  _PROTECTED);.}..
1adf0 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
1ae00 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
1ae10 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
1ae20 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1ae30 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53  InitPIN)(CK_SESS
1ae40 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1ae50 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ion, CK_UTF8CHAR
1ae60 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
1ae70 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a  ONG ulPinLen) {.
1ae80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ae90 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1aea0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1aeb0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1aec0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1aed0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1aee0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1aef0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1af00 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1af10 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1af20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1af30 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1af40 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
1af50 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43  OTECTED (%i)", C
1af60 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
1af70 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74  ROTECTED);...ret
1af80 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  urn(CKR_TOKEN_WR
1af90 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
1afa0 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
1afb0 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
1afc0 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
1afd0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1afe0 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45   C_SetPIN)(CK_SE
1aff0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1b000 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
1b010 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20  AR_PTR pOldPin, 
1b020 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69  CK_ULONG ulOldPi
1b030 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
1b040 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43  R_PTR pNewPin, C
1b050 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e  K_ULONG ulNewPin
1b060 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
1b070 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1b080 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1b090 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1b0a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1b0b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b0c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1b0d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1b0e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1b0f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1b100 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1b110 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1b120 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1b130 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1b140 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1b150 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1b160 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1b170 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1b180 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1b190 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1b1a0 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73  CK_RV, C_OpenSes
1b1b0 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  sion)(CK_SLOT_ID
1b1c0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47   slotID, CK_FLAG
1b1d0 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44  S flags, CK_VOID
1b1e0 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f  _PTR pApplicatio
1b1f0 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74  n, CK_NOTIFY not
1b200 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f  ify, CK_SESSION_
1b210 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73  HANDLE_PTR phSes
1b220 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  sion) {..unsigne
1b230 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74  d long idx;..int
1b240 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
1b250 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f  int found_sessio
1b260 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f  n = 0;...CACKEY_
1b270 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1b280 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
1b290 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49  flags & CKF_SERI
1b2a0 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43  AL_SESSION) != C
1b2b0 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f  KF_SERIAL_SESSIO
1b2c0 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b  N) {...return(CK
1b2d0 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c  R_SESSION_PARALL
1b2e0 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  EL_NOT_SUPPORTED
1b2f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1b300 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1b310 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b320 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b330 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1b340 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1b350 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1b360 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1b370 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
1b380 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
1b390 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1b3a0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1b3b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1b3c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b3d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b3e0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1b3f0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1b400 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
1b410 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
1b420 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1b430 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
1b440 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1b450 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1b460 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1b470 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1b480 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1b490 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b4a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b4b0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1b4c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b4d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1b4e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1b4f0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1b500 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
1b510 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b520 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1b530 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1b540 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
1b550 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
1b560 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
1b570 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1b580 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1b590 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
1b5a0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
1b5b0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a  NVALID);..}.../*
1b5c0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1b5d0 20 63 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c   card is actuall
1b5e0 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a  y in the slot. *
1b5f0 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b  /../* XXX: Check
1b600 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1b610 69 73 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43  is is in the PKC
1b620 53 23 31 31 20 73 70 65 63 69 66 69 63 61 74 69  S#11 specificati
1b630 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65  on */..if (cacke
1b640 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
1b650 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
1b660 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59  otID]) != CACKEY
1b670 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
1b680 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  SENT) {...CACKEY
1b690 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b6a0 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20  rror.  Card not 
1b6b0 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e  present.  Return
1b6c0 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  ing CKR_DEVICE_R
1b6d0 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63  EMOVED");....cac
1b6e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1b6f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1b700 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1b710 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b  DEVICE_REMOVED);
1b720 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
1b730 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   1; idx < (sizeo
1b740 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1b750 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1b760 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1b770 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
1b780 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1b790 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
1b7a0 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f  ....found_sessio
1b7b0 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65  n = 1;.....*phSe
1b7c0 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09  ssion = idx;....
1b7d0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1b7e0 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31  [idx].active = 1
1b7f0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1b800 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44  ions[idx].slotID
1b810 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61   = slotID;....ca
1b820 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1b830 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52  x].state = CKS_R
1b840 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e  O_PUBLIC_SESSION
1b850 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1b860 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20  ions[idx].flags 
1b870 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b  = flags;....cack
1b880 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1b890 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d  .ulDeviceError =
1b8a0 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   0;....cackey_se
1b8b0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70  ssions[idx].pApp
1b8c0 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c  lication = pAppl
1b8d0 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b  ication;....cack
1b8e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1b8f0 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79  .Notify = notify
1b900 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
1b910 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
1b920 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ities = NULL;...
1b930 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1b940 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
1b950 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09  _count = 0;.....
1b960 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1b970 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  idx].search_acti
1b980 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
1b990 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1b9a0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
1b9b0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
1b9c0 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79  sions[idx].decry
1b9d0 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  pt_active = 0;..
1b9e0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1b9f0 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
1ba00 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
1ba10 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63  _identities(&cac
1ba20 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1ba30 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  ], &cackey_sessi
1ba40 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74  ons[idx].identit
1ba50 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09  ies_count);.....
1ba60 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
1ba70 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1ba80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1ba90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1baa0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1bab0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1bac0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bad0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1bae0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1baf0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1bb00 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1bb10 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64  ..}...if (!found
1bb20 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41  _session) {...CA
1bb30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bb40 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1bb50 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28  _SESSION_COUNT (
1bb60 25 69 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f  %i)", CKR_SESSIO
1bb70 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74  N_COUNT);....ret
1bb80 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1bb90 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43  COUNT);..}...CAC
1bba0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bbb0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1bbc0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1bbd0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1bbe0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1bbf0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1bc00 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  , C_CloseSession
1bc10 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1bc20 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
1bc30 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1bc40 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
1bc50 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1bc60 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1bc70 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1bc80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1bc90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1bca0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1bcb0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1bcc0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1bcd0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1bce0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
1bcf0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
1bd00 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1bd10 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1bd20 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1bd30 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
1bd40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bd50 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1bd60 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
1bd70 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1bd80 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1bd90 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1bda0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1bdb0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1bdc0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1bdd0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1bde0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1bdf0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1be00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1be10 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1be20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1be30 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1be40 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1be50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1be60 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
1be70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1be80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1be90 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1bea0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1beb0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
1bec0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1bed0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1bee0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1bef0 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
1bf00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1bf10 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  on].active = 0;.
1bf20 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65  .cackey_free_ide
1bf30 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73  ntities(cackey_s
1bf40 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1bf50 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61  ].identities, ca
1bf60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1bf70 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1bf80 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74  es_count);...mut
1bf90 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1bfa0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1bfb0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1bfc0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1bfd0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1bfe0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bff0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1c000 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1c010 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1c020 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1c030 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c040 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1c050 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1c060 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1c070 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1c080 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1c090 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c  CK_RV, C_CloseAl
1c0a0 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c  lSessions)(CK_SL
1c0b0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a  OT_ID slotID) {.
1c0c0 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09  .uint32_t idx;..
1c0d0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1c0e0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1c0f0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1c100 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1c110 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1c120 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c130 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c140 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1c150 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c160 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1c170 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1c180 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
1c190 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
1c1a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1c1b0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1c1c0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
1c1d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c1e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c1f0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1c200 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
1c210 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
1c220 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
1c230 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
1c240 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
1c250 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1c260 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1c270 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1c280 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1c290 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1c2a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c2b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c2c0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1c2d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c2e0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1c2f0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1c300 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
1c310 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
1c320 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c330 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1c340 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1c350 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
1c360 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
1c370 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
1c380 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1c390 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1c3a0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1c3b0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1c3c0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  ALID);..}...for 
1c3d0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1c3e0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1c3f0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1c400 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1c410 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
1c420 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
1c430 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
1c440 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63  ve) {....if (cac
1c450 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1c460 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74  ].slotID != slot
1c470 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  ID) {.....contin
1c480 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ue;....}.....cac
1c490 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1c4a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1c4b0 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73  ;....C_CloseSess
1c4c0 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63  ion(idx);....cac
1c4d0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1c4e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1c4f0 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
1c500 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1c510 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1c520 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1c530 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1c540 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1c550 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1c560 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1c570 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1c580 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1c590 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
1c5a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c5b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1c5c0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1c5d0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1c5e0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1c5f0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1c600 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49  V, C_GetSessionI
1c610 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nfo)(CK_SESSION_
1c620 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1c630 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f   CK_SESSION_INFO
1c640 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69  _PTR pInfo) {..i
1c650 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1c660 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c670 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1c680 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
1c690 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1c6a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c6b0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
1c6c0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1c6d0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1c6e0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1c6f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1c700 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1c710 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c720 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1c730 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1c740 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1c750 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1c760 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1c770 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1c780 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1c790 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1c7a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1c7b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1c7c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c7d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c7e0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1c7f0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1c800 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1c810 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1c820 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1c830 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1c840 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1c850 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1c860 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1c870 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1c880 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c890 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1c8a0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1c8b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1c8c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1c8d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c8e0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1c8f0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1c900 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1c910 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1c920 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c930 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1c940 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1c950 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1c960 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1c970 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1c980 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20  pInfo->slotID = 
1c990 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c9a0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
1c9b0 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20  ;..pInfo->state 
1c9c0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1c9d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74  s[hSession].stat
1c9e0 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  e;..pInfo->flags
1c9f0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
1ca00 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61  ns[hSession].fla
1ca10 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65  gs;..pInfo->ulDe
1ca20 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b  viceError = cack
1ca30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1ca40 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72  sion].ulDeviceEr
1ca50 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ror;...mutex_ret
1ca60 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1ca70 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ca80 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1ca90 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1caa0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1cab0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1cac0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1cad0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1cae0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1caf0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1cb00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cb10 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1cb20 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1cb30 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1cb40 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1cb50 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1cb60 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_GetOperationS
1cb70 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tate)(CK_SESSION
1cb80 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1cb90 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f  , CK_BYTE_PTR pO
1cba0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43  perationState, C
1cbb0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f  K_ULONG_PTR pulO
1cbc0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e  perationStateLen
1cbd0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1cbe0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1cbf0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1cc00 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1cc10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1cc20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1cc30 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1cc40 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1cc50 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1cc60 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1cc70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cc80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1cc90 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1cca0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1ccb0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1ccc0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1ccd0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1cce0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1ccf0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1cd00 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1cd10 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69  RV, C_SetOperati
1cd20 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53  onState)(CK_SESS
1cd30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1cd40 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1cd50 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65   pOperationState
1cd60 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65  , CK_ULONG ulOpe
1cd70 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20  rationStateLen, 
1cd80 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1cd90 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c   hEncryptionKey,
1cda0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
1cdb0 45 20 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f  E hAuthenticatio
1cdc0 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nKey) {..CACKEY_
1cdd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1cde0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1cdf0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1ce00 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1ce10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ce20 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1ce30 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1ce40 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1ce50 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1ce60 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1ce70 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1ce80 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1ce90 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1cea0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1ceb0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1cec0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1ced0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1cee0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1cef0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1cf00 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29  (CK_RV, C_Login)
1cf10 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1cf20 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1cf30 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79  USER_TYPE userTy
1cf40 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  pe, CK_UTF8CHAR_
1cf50 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
1cf60 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09  NG ulPinLen) {..
1cf70 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1cf80 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  D;..int mutex_re
1cf90 74 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73  tval;..int tries
1cfa0 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74  _remaining;..int
1cfb0 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41   login_ret;...CA
1cfc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cfd0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1cfe0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1cff0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1d000 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d010 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1d020 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1d030 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1d040 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1d050 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1d060 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
1d070 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
1d080 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1d090 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1d0a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1d0b0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1d0c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d0d0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
1d0e0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
1d0f0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1d100 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1d110 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1d120 28 75 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55  (userType != CKU
1d130 5f 55 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45  _USER) {...CACKE
1d140 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d150 45 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20  Error.  We only 
1d160 73 75 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64  support USER mod
1d170 65 2c 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75  e, asked for %lu
1d180 20 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e   mode.", (unsign
1d190 65 64 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70  ed long) userTyp
1d1a0 65 29 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  e)....return(CKR
1d1b0 5f 55 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c  _USER_TYPE_INVAL
1d1c0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1d1d0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1d1e0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1d1f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1d200 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1d210 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1d220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d230 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1d240 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1d250 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1d260 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1d270 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d280 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1d290 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1d2a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1d2b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1d2c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d2d0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1d2e0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1d2f0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1d300 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1d310 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1d320 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
1d330 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1d340 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
1d350 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
1d360 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
1d370 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1d380 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1d390 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
1d3a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d3b0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1d3c0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1d3d0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
1d3e0 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
1d3f0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
1d400 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1d410 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1d420 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
1d430 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
1d440 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1d450 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d460 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1d470 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1d480 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
1d490 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
1d4a0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
1d4b0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1d4c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1d4d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1d4e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1d4f0 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61  ..login_ret = ca
1d500 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b  ckey_login(&cack
1d510 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1d520 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e  , pPin, ulPinLen
1d530 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  , &tries_remaini
1d540 6e 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f  ng);..if (login_
1d550 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
1d560 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63  SC_S_OK) {...cac
1d570 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1d580 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1d590 3b 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72  ;....if (login_r
1d5a0 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
1d5b0 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09  C_E_LOCKED) {...
1d5c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d5d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 54 6f  INTF("Error.  To
1d5e0 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29  ken is locked.")
1d5f0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
1d600 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
1d610 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53  _flags |= CKF_US
1d620 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a  ER_PIN_LOCKED;..
1d630 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
1d640 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65  N_LOCKED);...} e
1d650 6c 73 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65  lse if (login_re
1d660 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
1d670 5f 45 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09 09  _E_BADPIN) {....
1d680 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d690 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 49 6e 76  NTF("Error.  Inv
1d6a0 61 6c 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09  alid PIN.");....
1d6b0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
1d6c0 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
1d6d0 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49  s |= CKF_USER_PI
1d6e0 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09  N_COUNT_LOW;....
1d6f0 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69  .if (tries_remai
1d700 6e 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09  ning == 1) {....
1d710 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
1d720 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
1d730 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49  s |= CKF_USER_PI
1d740 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09  N_FINAL_TRY;....
1d750 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  }.....return(CKR
1d760 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
1d770 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
1d780 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d790 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72  or.  Unknown err
1d7a0 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  or returned from
1d7b0 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20   cackey_login() 
1d7c0 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74  (%i)", login_ret
1d7d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d7e0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1d7f0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f  ..}...cackey_slo
1d800 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
1d810 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f  _flags &= ~(CKF_
1d820 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20  USER_PIN_LOCKED 
1d830 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43  | CKF_USER_PIN_C
1d840 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c  OUNT_LOW | CKF_L
1d850 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20  OGIN_REQUIRED | 
1d860 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e  CKF_USER_PIN_FIN
1d870 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65  AL_TRY);...cacke
1d880 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1d890 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  ion].state = CKS
1d8a0 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f  _RO_USER_FUNCTIO
1d8b0 4e 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  NS;...mutex_retv
1d8c0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1d8d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1d8e0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1d8f0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1d900 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d910 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d920 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1d930 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1d940 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1d950 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1d960 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d970 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1d980 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1d990 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1d9a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1d9b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1d9c0 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53  C_Logout)(CK_SES
1d9d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1d9e0 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  sion) {..CK_SLOT
1d9f0 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74  _ID slotID;..int
1da00 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
1da10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1da20 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1da30 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1da40 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1da50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1da60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1da70 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1da80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1da90 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1daa0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1dab0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
1dac0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
1dad0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1dae0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1daf0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1db00 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1db10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1db20 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1db30 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
1db40 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1db50 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1db60 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1db70 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1db80 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1db90 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1dba0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1dbb0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1dbc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1dbd0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1dbe0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1dbf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1dc00 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1dc10 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1dc20 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1dc30 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1dc40 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1dc50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1dc60 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1dc70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1dc80 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1dc90 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1dca0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1dcb0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1dcc0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
1dcd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1dce0 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
1dcf0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1dd00 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1dd10 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1dd20 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1dd30 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1dd40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1dd50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1dd60 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1dd70 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1dd80 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1dd90 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1dda0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1ddb0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1ddc0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
1ddd0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
1dde0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
1ddf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1de00 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1de10 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1de20 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
1de30 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1de40 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1de50 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1de60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1de70 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
1de80 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1de90 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
1dea0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1deb0 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
1dec0 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b  _PUBLIC_SESSION;
1ded0 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
1dee0 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
1def0 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
1df00 45 51 55 49 52 45 44 3b 0a 0a 09 6d 75 74 65 78  EQUIRED;...mutex
1df10 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1df20 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1df30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1df40 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1df50 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1df60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1df70 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1df80 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1df90 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1dfa0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1dfb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dfc0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1dfd0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1dfe0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1dff0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1e000 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1e010 5f 52 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a  _RV, C_CreateObj
1e020 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ect)(CK_SESSION_
1e030 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1e040 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
1e050 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
1e060 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
1e070 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
1e080 50 54 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a  PTR phObject) {.
1e090 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e0a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1e0b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1e0c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1e0d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e0e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1e0f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1e100 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1e110 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1e120 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1e130 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e140 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1e150 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1e160 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1e170 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1e180 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1e190 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1e1a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e1b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1e1c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1e1d0 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b  C_CopyObject)(CK
1e1e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1e1f0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
1e200 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
1e210 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ct, CK_ATTRIBUTE
1e220 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
1e230 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
1e240 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1e250 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65  LE_PTR phNewObje
1e260 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
1e270 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1e280 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1e290 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1e2a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e2b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e2c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1e2d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e2e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1e2f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1e300 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1e310 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1e320 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1e330 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1e340 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1e350 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e360 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1e370 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1e380 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1e390 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1e3a0 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f  K_RV, C_DestroyO
1e3b0 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
1e3c0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1e3d0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
1e3e0 44 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09  DLE hObject) {..
1e3f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e400 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1e410 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1e420 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1e430 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e440 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1e450 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1e460 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1e470 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1e480 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1e490 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e4a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e4b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1e4c0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1e4d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1e4e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1e4f0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1e500 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1e510 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1e520 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1e530 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28  _GetObjectSize)(
1e540 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1e550 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
1e560 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
1e570 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ject, CK_ULONG_P
1e580 54 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43  TR pulSize) {..C
1e590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e5a0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1e5b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1e5c0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1e5d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e5e0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1e5f0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1e600 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1e610 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1e620 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1e630 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e640 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1e650 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1e660 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1e670 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1e680 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1e690 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1e6a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1e6b0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1e6c0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1e6d0 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
1e6e0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
1e6f0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1e700 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
1e710 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52  hObject, CK_ATTR
1e720 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
1e730 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
1e740 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54  Count) {..CK_ATT
1e750 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74  RIBUTE *curr_att
1e760 72 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  r;..struct cacke
1e770 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
1e780 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20  tity;..unsigned 
1e790 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64  long identity_id
1e7a0 78 2c 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73  x, attr_idx, ses
1e7b0 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f  s_attr_idx, num_
1e7c0 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ids;..int mutex_
1e7d0 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72  retval;..CK_RV r
1e7e0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
1e7f0 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61  .CK_VOID_PTR pVa
1e800 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75  lue;..CK_ULONG u
1e810 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43  lValueLen;...CAC
1e820 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e830 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1e840 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1e850 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1e860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e870 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1e880 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1e890 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1e8a0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1e8b0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
1e8c0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
1e8d0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
1e8e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1e8f0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1e900 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1e910 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1e920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e930 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
1e940 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1e950 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1e960 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1e970 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
1e980 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a  hObject == 0) {.
1e990 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e9a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f  RINTF("Error.  O
1e9b0 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74  bject handle out
1e9c0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1e9d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42  ...return(CKR_OB
1e9e0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  JECT_HANDLE_INVA
1e9f0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  LID);..}...if (u
1ea00 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  lCount == 0) {..
1ea10 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
1ea20 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63  t, if zero objec
1ea30 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  ts were specifie
1ea40 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74  d return zero it
1ea50 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ems immediately 
1ea60 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
1ea70 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1ea80 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20  ing CKR_OK (%i) 
1ea90 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22  (short circuit)"
1eaa0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
1eab0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
1eac0 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
1ead0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1eae0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1eaf0 46 28 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70  F("Error.  pTemp
1eb00 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  late is NULL.");
1eb10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1eb20 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1eb30 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78  }...identity_idx
1eb40 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a   = hObject - 1;.
1eb50 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1eb60 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1eb70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1eb80 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1eb90 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1eba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ebb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1ebc0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1ebd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1ebe0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1ebf0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1ec00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ec10 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
1ec20 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1ec30 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1ec40 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1ec50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ec60 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
1ec70 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1ec80 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1ec90 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1eca0 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20  );..}...num_ids 
1ecb0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1ecc0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1ecd0 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09  tities_count;...
1ece0 69 66 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78  if (identity_idx
1ecf0 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09   >= num_ids) {..
1ed00 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1ed10 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1ed20 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1ed30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ed40 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e  ror.  Object han
1ed50 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
1ed60 2e 20 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20  .  identity_idx 
1ed70 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d  = %lu, num_ids =
1ed80 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65   %lu.", (unsigne
1ed90 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79  d long) identity
1eda0 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20  _idx, (unsigned 
1edb0 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a  long) num_ids);.
1edc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42  ...return(CKR_OB
1edd0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  JECT_HANDLE_INVA
1ede0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74  LID);..}...ident
1edf0 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ity = &cackey_se
1ee00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1ee10 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e  .identities[iden
1ee20 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72  tity_idx];...for
1ee30 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20   (attr_idx = 0; 
1ee40 61 74 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75  attr_idx < ulCou
1ee50 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20  nt; attr_idx++) 
1ee60 7b 0a 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  {...curr_attr = 
1ee70 26 70 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f  &pTemplate[attr_
1ee80 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20  idx];....pValue 
1ee90 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75  = NULL;...ulValu
1eea0 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
1eeb0 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44   -1;....CACKEY_D
1eec0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f  EBUG_PRINTF("Loo
1eed0 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75  king for attribu
1eee0 74 65 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e  te 0x%08lx (iden
1eef0 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20  tity:%lu) ...", 
1ef00 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1ef10 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c  curr_attr->type,
1ef20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1ef30 20 69 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a   identity_idx);.
1ef40 0a 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74  ...for (sess_att
1ef50 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f  r_idx = 0; sess_
1ef60 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74  attr_idx < ident
1ef70 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f  ity->attributes_
1ef80 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72  count; sess_attr
1ef90 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20  _idx++) {....if 
1efa0 28 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69  (identity->attri
1efb0 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
1efc0 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72  idx].type == cur
1efd0 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a  r_attr->type) {.
1efe0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1eff0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f  _PRINTF(" ... fo
1f000 75 6e 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d  und it, pValue =
1f010 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20   %p, ulValueLen 
1f020 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79  = %lu", identity
1f030 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
1f040 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c  s_attr_idx].pVal
1f050 75 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  ue, identity->at
1f060 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
1f070 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  tr_idx].ulValueL
1f080 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56  en);..........pV
1f090 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  alue = identity-
1f0a0 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
1f0b0 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75  _attr_idx].pValu
1f0c0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
1f0d0 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  n = identity->at
1f0e0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
1f0f0 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  tr_idx].ulValueL
1f100 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  en;....}...}....
1f110 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  if (curr_attr->p
1f120 56 61 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29  Value && pValue)
1f130 20 7b 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61   {....if (curr_a
1f140 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20  ttr->ulValueLen 
1f150 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b  >= ulValueLen) {
1f160 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
1f170 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70  _attr->pValue, p
1f180 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65  Value, ulValueLe
1f190 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  n);....} else {.
1f1a0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1f1b0 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a   (CK_LONG) -1;..
1f1c0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
1f1d0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
1f1e0 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  L;....}...}....c
1f1f0 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
1f200 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65  eLen = ulValueLe
1f210 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  n;..}...mutex_re
1f220 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1f230 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1f240 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1f250 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1f260 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1f270 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f280 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1f290 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1f2a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1f2b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1f2c0 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41  (retval == CKR_A
1f2d0 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e  TTRIBUTE_TYPE_IN
1f2e0 56 41 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45  VALID) {...CACKE
1f2f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f300 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54  Returning CKR_AT
1f310 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56  TRIBUTE_TYPE_INV
1f320 41 4c 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74  ALID (%i)", (int
1f330 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
1f340 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  se if (retval ==
1f350 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
1f360 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45  SMALL) {...CACKE
1f370 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f380 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55  Returning CKR_BU
1f390 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28  FFER_TOO_SMALL (
1f3a0 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
1f3b0 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  al);..} else if 
1f3c0 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f  (retval == CKR_O
1f3d0 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
1f3e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1f3f0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1f400 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  )", (int) retval
1f410 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43  );..} else {...C
1f420 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f430 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69  TF("Returning %i
1f440 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
1f450 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
1f460 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  tval);.}..CK_DEF
1f470 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1f480 52 56 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75  RV, C_SetAttribu
1f490 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53  teValue)(CK_SESS
1f4a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1f4b0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
1f4c0 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
1f4d0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
1f4e0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
1f4f0 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
1f500 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f510 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1f520 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1f530 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1f540 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f550 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1f560 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1f570 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f580 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f590 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1f5a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f5b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1f5c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f5d0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1f5e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f5f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1f600 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1f610 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1f620 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1f630 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1f640 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
1f650 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1f660 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1f670 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
1f680 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
1f690 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43  NG ulCount) {..C
1f6a0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
1f6b0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b  ;..CK_ULONG idx;
1f6c0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1f6d0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
1f6e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1f6f0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1f700 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1f710 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f720 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f730 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1f740 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f750 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1f760 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1f770 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
1f780 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
1f790 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
1f7a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1f7b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1f7c0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
1f7d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f7e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1f7f0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
1f800 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
1f810 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1f820 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1f830 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1f840 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1f850 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1f860 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1f870 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1f880 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f890 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f8a0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1f8b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f8c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1f8d0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1f8e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1f8f0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
1f900 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1f910 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1f920 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1f930 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f940 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
1f950 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
1f960 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1f970 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1f980 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
1f990 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1f9a0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1f9b0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1f9c0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1f9d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1f9e0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1f9f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fa00 20 53 65 61 72 63 68 20 61 6c 72 65 61 64 79 20   Search already 
1fa10 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1fa20 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
1fa30 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d  TION_ACTIVE);..}
1fa40 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
1fa50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1fa60 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
1fa70 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
1fa80 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
1fa90 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1faa0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1fab0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
1fac0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fad0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1fae0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1faf0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
1fb00 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
1fb10 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
1fb20 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1fb30 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1fb40 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1fb50 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
1fb60 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
1fb70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fb80 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1fb90 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1fba0 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
1fbb0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
1fbc0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
1fbd0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1fbe0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1fbf0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1fc00 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1fc10 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1fc20 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c  slots[slotID].sl
1fc30 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 43 41  ot_reset) {...CA
1fc40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fc50 46 28 22 54 68 65 20 73 6c 6f 74 20 68 61 73 20  F("The slot has 
1fc60 62 65 65 6e 20 72 65 73 65 74 20 73 69 6e 63 65  been reset since
1fc70 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20   we last looked 
1fc80 66 6f 72 20 69 64 65 6e 74 69 74 69 65 73 20 2d  for identities -
1fc90 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a  - rescanning");.
1fca0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
1fcb0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1fcc0 2e 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e  .identities != N
1fcd0 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  ULL) {....cackey
1fce0 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
1fcf0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1fd00 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1fd10 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65  ities, cackey_se
1fd20 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1fd30 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
1fd40 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  t);.....cackey_s
1fd50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1fd60 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e  ].identities = N
1fd70 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ULL;....cackey_s
1fd80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1fd90 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
1fda0 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69  nt = 0;...}....i
1fdb0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1fdc0 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d  slotID].label !=
1fdd0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65   NULL) {....free
1fde0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1fdf0 6f 74 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09  otID].label);...
1fe00 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
1fe10 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55  otID].label = NU
1fe20 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  LL;...}....cacke
1fe30 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
1fe40 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
1fe50 73 6c 6f 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b  slotID]);...cack
1fe60 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1fe70 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b  .slot_reset = 0;
1fe80 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1fe90 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1fea0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  on].identities =
1feb0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
1fec0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1fed0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1fee0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69   = cackey_read_i
1fef0 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65  dentities(&cacke
1ff00 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
1ff10 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
1ff20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1ff30 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09  tities_count);..
1ff40 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74  }...if (pTemplat
1ff50 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  e != NULL) {...i
1ff60 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29  f (ulCount != 0)
1ff70 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73   {....cackey_ses
1ff80 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1ff90 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
1ffa0 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09  nt = ulCount;...
1ffb0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1ffc0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1ffd0 68 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63  h_query = malloc
1ffe0 28 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  (ulCount * sizeo
1fff0 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a  f(*pTemplate));.
20000 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
20010 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20020 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
20030 79 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c  y, pTemplate, ul
20040 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  Count * sizeof(*
20050 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09  pTemplate));....
20060 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
20070 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78  x < ulCount; idx
20080 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 70 54  ++) {.....if (pT
20090 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56  emplate[idx].ulV
200a0 61 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  alueLen == 0) {.
200b0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
200c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
200d0 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
200e0 2e 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
200f0 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
20100 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65  ....}......cacke
20110 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20120 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
20130 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20  y[idx].pValue = 
20140 6d 61 6c 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65  malloc(pTemplate
20150 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  [idx].ulValueLen
20160 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b  );......if (cack
20170 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20180 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
20190 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20  ry[idx].pValue) 
201a0 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61  {......memcpy(ca
201b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
201c0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
201d0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
201e0 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d  , pTemplate[idx]
201f0 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61  .pValue, pTempla
20200 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  te[idx].ulValueL
20210 65 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  en);.....}....}.
20220 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 61  ..} else {....ca
20230 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20240 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
20250 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  uery_count = 0;.
20260 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
20270 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
20280 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c  rch_query = NULL
20290 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
202a0 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d  ..if (ulCount !=
202b0 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f   0) {....cackey_
202c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
202d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
202e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
202f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
20300 65 61 72 63 68 20 71 75 65 72 79 20 73 70 65 63  earch query spec
20310 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62  ified as NULL, b
20320 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65  ut number of que
20330 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 73 70 65  ry terms not spe
20340 63 69 66 69 65 64 20 61 73 20 30 2e 22 29 3b 0a  cified as 0.");.
20350 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
20360 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
20370 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  .}....cackey_ses
20380 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20390 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
203a0 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  nt = 0;...cackey
203b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
203c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
203d0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61   = NULL;..}...ca
203e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
203f0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
20400 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b  ctive = 1;..cack
20410 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20420 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
20430 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65  r_id = 0;...mute
20440 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
20450 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
20460 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
20470 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
20480 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
20490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
204a0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
204b0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
204c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
204d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
204e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
204f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
20500 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
20510 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
20520 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74  CKR_OK);.}..stat
20530 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b  ic int cackey_pk
20540 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74  cs11_compare_att
20550 72 69 62 75 74 65 73 28 43 4b 5f 41 54 54 52 49  ributes(CK_ATTRI
20560 42 55 54 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52  BUTE *a, CK_ATTR
20570 49 42 55 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73  IBUTE *b) {..uns
20580 69 67 6e 65 64 20 63 68 61 72 20 2a 73 6d 61 6c  igned char *smal
20590 6c 62 75 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b  lbuf, *largebuf;
205a0 0a 09 73 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75  ..size_t smallbu
205b0 66 5f 6c 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f  f_len, largebuf_
205c0 6c 65 6e 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79  len;...if (a->ty
205d0 70 65 20 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b  pe != b->type) {
205e0 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
205f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20600 50 52 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20  PRINTF("    ... 
20610 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74  found matching t
20620 79 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43  ype ...");...CAC
20630 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
20640 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20  UF("    ... our 
20650 76 61 6c 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c  value:", a->pVal
20660 75 65 2c 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  ue, a->ulValueLe
20670 6e 29 3b 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61  n);...if (b->pVa
20680 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  lue == NULL) {..
20690 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
206a0 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e  INTF("       ...
206b0 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 72 64 20   found wildcard 
206c0 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75  match");....retu
206d0 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  rn(1);..}...if (
206e0 61 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c  a->pValue == NUL
206f0 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29  L) {...return(0)
20700 3b 0a 09 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75  ;..}.. .if (b->u
20710 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e  lValueLen == a->
20720 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65  ulValueLen && me
20730 6d 63 6d 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20  mcmp(a->pValue, 
20740 62 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c  b->pValue, b->ul
20750 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20  ValueLen) == 0) 
20760 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20770 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20  _PRINTF("       
20780 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63 74 20  ... found exact 
20790 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75  match");....retu
207a0 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  rn(1);..}...swit
207b0 63 68 20 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09  ch (a->type) {..
207c0 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55  .case CKA_MODULU
207d0 53 3a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56  S:....if (a->ulV
207e0 61 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c  alueLen == b->ul
207f0 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09  ValueLen) {.....
20800 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09  break;....}.....
20810 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  if (a->ulValueLe
20820 6e 20 3e 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  n > b->ulValueLe
20830 6e 29 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75  n) {.....smallbu
20840 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09  f = b->pValue;..
20850 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20  ...smallbuf_len 
20860 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b  = b->ulValueLen;
20870 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d  ......largebuf =
20880 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   a->pValue;.....
20890 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61  largebuf_len = a
208a0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09  ->ulValueLen;...
208b0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d  .} else {.....sm
208c0 61 6c 6c 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c  allbuf = a->pVal
208d0 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66  ue;.....smallbuf
208e0 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75  _len = a->ulValu
208f0 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65  eLen;......large
20900 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b  buf = b->pValue;
20910 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65  .....largebuf_le
20920 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = b->ulValueLe
20930 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20  n;....}.....for 
20940 28 3b 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20  (; largebuf_len 
20950 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b  != smallbuf_len;
20960 20 6c 61 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67   largebuf++,larg
20970 65 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09  ebuf_len--) {...
20980 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 5b 30  ..if (largebuf[0
20990 5d 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 62  ] != 0) {......b
209a0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  reak;.....}....}
209b0 0a 0a 09 09 09 69 66 20 28 6c 61 72 67 65 62 75  .....if (largebu
209c0 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75  f_len != smallbu
209d0 66 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65  f_len) {.....bre
209e0 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ak;....}.....if 
209f0 28 6d 65 6d 63 6d 70 28 6c 61 72 67 65 62 75 66  (memcmp(largebuf
20a00 2c 20 73 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c  , smallbuf, smal
20a10 6c 62 75 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20  lbuf_len) == 0) 
20a20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
20a30 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20  UG_PRINTF("     
20a40 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72    ... found appr
20a50 6f 78 69 6d 61 74 65 20 6d 61 74 63 68 22 29 3b  oximate match");
20a60 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b  ......return(1);
20a70 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
20a80 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ..}...return(0);
20a90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
20aa0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
20ab0 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f  FindObjects)(CK_
20ac0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
20ad0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
20ae0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
20af0 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Object, CK_ULONG
20b00 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e   ulMaxObjectCoun
20b10 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
20b20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20  pulObjectCount) 
20b30 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
20b40 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  _identity *curr_
20b50 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  id;..CK_ATTRIBUT
20b60 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43  E *curr_attr;..C
20b70 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f  K_ULONG curr_id_
20b80 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64  idx, curr_out_id
20b90 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f  _idx, curr_attr_
20ba0 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69  idx, sess_attr_i
20bb0 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61  dx;..CK_ULONG ma
20bc0 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65  tched_count, pre
20bd0 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b  v_matched_count;
20be0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
20bf0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
20c00 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
20c10 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
20c20 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
20c30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20c40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20c50 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
20c60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
20c70 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
20c80 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
20c90 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63  }...if (pulObjec
20ca0 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  tCount == NULL) 
20cb0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20cc0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20cd0 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20   pulObjectCount 
20ce0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
20cf0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
20d00 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
20d10 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e  f (phObject == N
20d20 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  ULL && ulMaxObje
20d30 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ctCount == 0) {.
20d40 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
20d50 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65  it, if zero obje
20d60 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69  cts were specifi
20d70 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69  ed return zero i
20d80 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  tems immediately
20d90 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74   */...*pulObject
20da0 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41  Count = 0;....CA
20db0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20dc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
20dd0 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
20de0 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
20df0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
20e00 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
20e10 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c  phObject == NULL
20e20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20e30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20e40 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e  .  phObject is N
20e50 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
20e60 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
20e70 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
20e80 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20  lMaxObjectCount 
20e90 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
20ea0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20eb0 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e  rror.  Maximum n
20ec0 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
20ed0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65   specified as ze
20ee0 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ro.");....return
20ef0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
20f00 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  AD);..}...if (hS
20f10 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
20f20 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
20f30 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
20f40 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
20f50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
20f60 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
20f70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20f80 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
20f90 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
20fa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
20fb0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
20fc0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
20fd0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
20fe0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
20ff0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
21000 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
21010 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
21020 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21030 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
21040 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
21050 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
21060 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
21070 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
21080 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
21090 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
210a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
210b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
210c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
210d0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
210e0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
210f0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
21100 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
21110 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
21120 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
21130 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21140 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
21150 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
21160 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21170 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
21180 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21190 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
211a0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
211b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
211c0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
211d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63  IALIZED);..}...c
211e0 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d  urr_out_id_idx =
211f0 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69   0;..for (curr_i
21200 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73  d_idx = cackey_s
21210 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21220 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  ].search_curr_id
21230 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20  ; curr_id_idx < 
21240 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21250 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
21260 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c  ties_count && ul
21270 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20  MaxObjectCount; 
21280 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b  curr_id_idx++) {
21290 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61  ...curr_id = &ca
212a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
212b0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
212c0 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b  es[curr_id_idx];
212d0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
212e0 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73  _PRINTF("Process
212f0 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75  ing identity:%lu
21300 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
21310 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  g) curr_id_idx);
21320 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ....matched_coun
21330 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63  t = 0;....for (c
21340 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  urr_attr_idx = 0
21350 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20  ; curr_attr_idx 
21360 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
21370 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
21380 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20  ch_query_count; 
21390 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29  curr_attr_idx++)
213a0 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68   {....prev_match
213b0 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68  ed_count = match
213c0 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75  ed_count;.....cu
213d0 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65  rr_attr = &cacke
213e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
213f0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
21400 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d  y[curr_attr_idx]
21410 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
21420 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65  UG_PRINTF("  Che
21430 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62  cking for attrib
21440 75 74 65 20 30 78 25 30 38 6c 78 20 69 6e 20 69  ute 0x%08lx in i
21450 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20  dentity:%i...", 
21460 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
21470 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c  curr_attr->type,
21480 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
21490 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44  dx);....CACKEY_D
214a0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20  EBUG_PRINTBUF(" 
214b0 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67     Value looking
214c0 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74   for:", curr_att
214d0 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  r->pValue, curr_
214e0 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
214f0 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73  );.....for (sess
21500 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73  _attr_idx = 0; s
21510 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63  ess_attr_idx < c
21520 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
21530 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61  es_count; sess_a
21540 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
21550 09 69 66 20 28 63 61 63 6b 65 79 5f 70 6b 63 73  .if (cackey_pkcs
21560 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69  11_compare_attri
21570 62 75 74 65 73 28 26 63 75 72 72 5f 69 64 2d 3e  butes(&curr_id->
21580 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
21590 61 74 74 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f  attr_idx], curr_
215a0 61 74 74 72 29 29 20 7b 0a 09 09 09 09 09 6d 61  attr)) {......ma
215b0 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a  tched_count++;..
215c0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
215d0 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66  }....}...../* If
215e0 20 74 68 65 20 61 74 74 72 69 62 75 74 65 20 63   the attribute c
215f0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63  ould not be matc
21600 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20  hed, do not try 
21610 74 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f  to match additio
21620 6e 61 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a  nal attributes *
21630 2f 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61  /....if (prev_ma
21640 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d  tched_count == m
21650 61 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a  atched_count) {.
21660 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
21670 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68  ..}....if (match
21680 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b  ed_count == cack
21690 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
216a0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
216b0 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  ry_count) {....C
216c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
216d0 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69  TF("  ... All %i
216e0 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63   attributes chec
216f0 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61  ked for found, a
21700 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  dding identity:%
21710 69 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69  i to returned li
21720 73 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65  st", (int) cacke
21730 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
21740 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
21750 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  y_count, (int) c
21760 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09  urr_id_idx);....
21770 09 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f  .phObject[curr_o
21780 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72  ut_id_idx] = cur
21790 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09  r_id_idx + 1;...
217a0 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  ..ulMaxObjectCou
217b0 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f  nt--;.....curr_o
217c0 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d  ut_id_idx++;...}
217d0 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
217e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
217f0 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69    ... Not all %i
21800 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29   (only found %i)
21810 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63   attributes chec
21820 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e  ked for found, n
21830 6f 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69  ot adding identi
21840 74 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61  ty:%i", (int) ca
21850 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21860 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
21870 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74  uery_count, (int
21880 29 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c  ) matched_count,
21890 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
218a0 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63  dx);...}..}..cac
218b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
218c0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75  ssion].search_cu
218d0 72 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f  rr_id = curr_id_
218e0 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74  idx;..*pulObject
218f0 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74  Count = curr_out
21900 5f 69 64 5f 69 64 78 3b 0a 0a 09 6d 75 74 65 78  _id_idx;...mutex
21910 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
21920 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
21930 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
21940 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
21950 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
21960 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21970 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
21980 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
21990 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
219a0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
219b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
219c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
219d0 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20  KR_OK (%i), num 
219e0 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20  objects = %lu", 
219f0 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65  CKR_OK, *pulObje
21a00 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75  ctCount);...retu
21a10 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
21a20 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
21a30 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f  N(CK_RV, C_FindO
21a40 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f  bjectsFinal)(CK_
21a50 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
21a60 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55  Session) {..CK_U
21a70 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d  LONG idx;..int m
21a80 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
21a90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21aa0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
21ab0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
21ac0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
21ad0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21ae0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
21af0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
21b00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
21b10 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
21b20 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
21b30 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
21b40 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
21b50 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
21b60 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
21b70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21b80 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
21b90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21ba0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
21bb0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
21bc0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
21bd0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
21be0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
21bf0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
21c00 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
21c10 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21c20 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
21c30 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
21c40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21c50 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
21c60 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
21c70 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
21c80 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
21c90 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
21ca0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
21cb0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
21cc0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
21cd0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
21ce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21cf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
21d00 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
21d10 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
21d20 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
21d30 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
21d40 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
21d50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21d60 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
21d70 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
21d80 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
21d90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
21da0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21db0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
21dc0 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  h not active.");
21dd0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
21de0 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
21df0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
21e00 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
21e10 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
21e20 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  ch_active = 0;..
21e30 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
21e40 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73  dx < cackey_sess
21e50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
21e60 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
21e70 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  t; idx++) {...if
21e80 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
21e90 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
21ea0 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
21eb0 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65 28  alue) {....free(
21ec0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21ed0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
21ee0 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
21ef0 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  ue);...}..}...if
21f00 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
21f10 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
21f20 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72  ch_query) {...fr
21f30 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ee(cackey_sessio
21f40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
21f50 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a  rch_query);..}..
21f60 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
21f70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
21f80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21f90 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
21fa0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
21fb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21fc0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
21fd0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
21fe0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21ff0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
22000 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
22010 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22020 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
22030 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
22040 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
22050 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
22060 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
22070 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53  ryptInit)(CK_SES
22080 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
22090 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
220a0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
220b0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
220c0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
220d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
220e0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
220f0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
22100 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
22110 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22120 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
22130 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
22140 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
22150 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
22160 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
22170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22180 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
22190 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
221a0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
221b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
221c0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
221d0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
221e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
221f0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
22200 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
22210 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f  crypt)(CK_SESSIO
22220 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
22230 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
22240 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
22250 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
22260 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
22270 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
22280 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44  TR pulEncryptedD
22290 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
222a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
222b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
222c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
222d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
222e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
222f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
22300 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
22310 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
22320 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
22330 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
22340 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22350 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
22360 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22370 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
22380 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22390 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
223a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
223b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
223c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
223d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
223e0 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
223f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
22400 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
22410 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
22420 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
22430 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
22440 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
22450 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
22460 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
22470 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22480 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
22490 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
224a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
224b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
224c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
224d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
224e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
224f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
22500 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
22510 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22520 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
22530 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22540 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
22550 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22560 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
22570 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
22580 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22590 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
225a0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
225b0 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b  EncryptFinal)(CK
225c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
225d0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
225e0 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79  E_PTR pLastEncry
225f0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
22600 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e  NG_PTR pulLastEn
22610 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
22620 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
22630 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
22640 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
22650 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
22660 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22670 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
22680 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
22690 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
226a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
226b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
226c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
226d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
226e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
226f0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
22700 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
22710 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
22720 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
22730 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22740 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
22750 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
22760 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29  , C_DecryptInit)
22770 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
22780 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
22790 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
227a0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
227b0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
227c0 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
227d0 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a  tval;...hKey--;.
227e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
227f0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22800 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
22810 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22820 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22830 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22840 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22850 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22860 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22870 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22880 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d  if (pMechanism =
22890 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
228a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
228b0 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
228c0 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  sm is NULL.");..
228d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
228e0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
228f0 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
22900 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43  ->mechanism != C
22910 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09  KM_RSA_PKCS) {..
22920 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22930 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
22940 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
22950 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  sm not specified
22960 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   as CKM_RSA_PKCS
22970 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22980 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41  R_MECHANISM_PARA
22990 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  M_INVALID);..}..
229a0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
229b0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
229c0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
229d0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
229e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
229f0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
22a00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22a10 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
22a20 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
22a30 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
22a40 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
22a50 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
22a60 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
22a70 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
22a80 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
22a90 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
22aa0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
22ab0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22ac0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
22ad0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
22ae0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
22af0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
22b00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
22b10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22b20 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
22b30 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
22b40 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22b50 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
22b60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22b70 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
22b80 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
22b90 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
22ba0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
22bb0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
22bc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22bd0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
22be0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
22bf0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
22c00 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
22c10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22c20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
22c30 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69  ecrypt already i
22c40 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09  n progress.");..
22c50 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
22c60 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
22c70 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20  ;..}...if (hKey 
22c80 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  >= cackey_sessio
22c90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
22ca0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
22cb0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
22cc0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
22cd0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
22ce0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22cf0 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64  Error.  Key hand
22d00 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  le out of range 
22d10 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25  (requested key %
22d20 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65  lu, only %lu ide
22d30 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c  ntities availabl
22d40 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e).", (unsigned 
22d50 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73  long) hKey, (uns
22d60 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b  igned long) cack
22d70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22d80 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
22d90 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
22da0 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c  rn(CKR_KEY_HANDL
22db0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
22dc0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
22dd0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
22de0 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  pt_active = 1;..
22df0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
22e00 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
22e10 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70  pt_mechanism = p
22e20 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
22e30 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65  nism;..cackey_se
22e40 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
22e50 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61  .decrypt_mech_pa
22e60 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d  rm = pMechanism-
22e70 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61  >pParameter;..ca
22e80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
22e90 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
22ea0 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70  mech_parmlen = p
22eb0 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72  Mechanism->ulPar
22ec0 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b  ameterLen;..cack
22ed0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22ee0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64  sion].decrypt_id
22ef0 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79  entity = &cackey
22f00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
22f10 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68  on].identities[h
22f20 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  Key];...mutex_re
22f30 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
22f40 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
22f50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
22f60 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
22f70 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
22f80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22f90 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
22fa0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
22fb0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
22fc0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
22fd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22fe0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
22ff0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
23000 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
23010 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
23020 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
23030 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f  , C_Decrypt)(CK_
23040 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
23050 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
23060 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44  _PTR pEncryptedD
23070 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
23080 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e  EncryptedDataLen
23090 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
230a0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
230b0 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a  R pulDataLen) {.
230c0 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65  .CK_ULONG datale
230d0 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65  n_update, datale
230e0 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20  n_final;..CK_RV 
230f0 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e  decrypt_ret;..in
23100 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
23110 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23120 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
23130 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
23140 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
23150 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23160 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
23170 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
23180 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23190 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
231a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
231b0 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d  if (pulDataLen =
231c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
231d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
231e0 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c  "Error. pulDataL
231f0 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
23200 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
23210 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
23220 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  ..datalen_update
23230 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a   = *pulDataLen;.
23240 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20  ..decrypt_ret = 
23250 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 28  C_DecryptUpdate(
23260 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79  hSession, pEncry
23270 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72  ptedData, ulEncr
23280 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44  yptedDataLen, pD
23290 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70  ata, &datalen_up
232a0 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72  date);..if (decr
232b0 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ypt_ret != CKR_O
232c0 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
232d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
232e0 72 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 74  r.  DecryptUpdat
232f0 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  e() returned fai
23300 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
23310 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
23320 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b  g) decrypt_ret);
23330 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70 74 5f  ....if (decrypt_
23340 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45  ret != CKR_BUFFE
23350 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
23360 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 64  ../* Terminate d
23370 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 74  ecryption operat
23380 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78  ion */.....mutex
23390 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
233a0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
233b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
233c0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
233d0 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43   != 0) {.....CAC
233e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
233f0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
23400 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
23410 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
23420 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09  ERAL_ERROR);....
23430 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65  }.....if (!cacke
23440 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23450 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
23460 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
23470 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
23480 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43  glock);......CAC
23490 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
234a0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
234b0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
234c0 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
234d0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
234e0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d  E_INVALID);....}
234f0 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
23500 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23510 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
23520 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ve) {.....cackey
23530 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
23540 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
23550 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23560 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23570 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
23580 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
23590 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
235a0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
235b0 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  ZED);....}.....c
235c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
235d0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
235e0 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
235f0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
23600 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23610 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23620 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
23630 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
23640 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
23650 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23660 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
23670 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
23680 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
23690 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  RROR);....}...}.
236a0 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
236b0 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  t_ret);..}...if 
236c0 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74  (pData) {...pDat
236d0 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64  a += datalen_upd
236e0 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e  ate;..}..datalen
236f0 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74  _final = *pulDat
23700 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75  aLen - datalen_u
23710 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74  pdate;...decrypt
23720 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74  _ret = C_Decrypt
23730 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20  Final(hSession, 
23740 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f  pData, &datalen_
23750 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63  final);..if (dec
23760 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f  rypt_ret != CKR_
23770 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
23780 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23790 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61  or.  DecryptFina
237a0 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  l() returned fai
237b0 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
237c0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
237d0 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b  g) decrypt_ret);
237e0 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79  ....return(decry
237f0 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70  pt_ret);..}...*p
23800 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61  ulDataLen = data
23810 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74  len_update + dat
23820 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41  alen_final;...CA
23830 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23840 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
23850 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
23860 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
23870 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
23880 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
23890 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61  V, C_DecryptUpda
238a0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
238b0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
238c0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
238d0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
238e0 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
238f0 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
23900 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
23910 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
23920 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43  Len) {..static C
23930 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34  K_BYTE buf[16384
23940 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c  ];..ssize_t bufl
23950 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  en;..CK_SLOT_ID 
23960 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72  slotID;..CK_RV r
23970 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45  etval = CKR_GENE
23980 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20  RAL_ERROR;..int 
23990 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
239a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
239b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
239c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
239d0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
239e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
239f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
23a00 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
23a10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
23a20 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
23a30 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
23a40 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
23a50 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
23a60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
23a70 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
23a80 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
23a90 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
23aa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23ab0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
23ac0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
23ad0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
23ae0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
23af0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
23b00 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72  f (pEncryptedPar
23b10 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45  t == NULL && ulE
23b20 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
23b30 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
23b40 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65  rt circuit if we
23b50 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65   are asked to de
23b60 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e  crypt nothing...
23b70 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
23b80 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
23b90 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
23ba0 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29   (short circuit)
23bb0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
23bc0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
23bd0 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74  }...if (pEncrypt
23be0 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  edPart == NULL) 
23bf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23c00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23c10 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 69  pEncryptedPart i
23c20 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e  s NULL, but ulEn
23c30 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69  cryptedPartLen i
23c40 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72  s not 0.");....r
23c50 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
23c60 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
23c70 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61  f (ulEncryptedPa
23c80 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
23c90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23ca0 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e  NTF("Error. ulEn
23cb0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69  cryptedPartLen i
23cc0 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69  s 0, but pPart i
23cd0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
23ce0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
23cf0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
23d00 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e  ..if (pulPartLen
23d10 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
23d20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23d30 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72  F("Error. pulPar
23d40 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  tLen is NULL.");
23d50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
23d60 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
23d70 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
23d80 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
23d90 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23da0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
23db0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
23dc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23dd0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
23de0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
23df0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23e00 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23e10 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
23e20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23e30 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
23e40 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23e50 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23e60 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
23e70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23e80 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
23e90 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
23ea0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
23eb0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
23ec0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!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 64 65 63 72 79 70 74  Session].decrypt
23ef0 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
23f00 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
23f10 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
23f20 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
23f30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23f40 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
23f50 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
23f60 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
23f70 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
23f80 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ED);..}...slotID
23f90 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
23fa0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
23fb0 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
23fc0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
23fd0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
23fe0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
23ff0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
24000 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
24010 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24020 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
24030 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
24040 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
24050 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
24060 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
24070 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
24080 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
24090 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
240a0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
240b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
240c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
240d0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
240e0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
240f0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
24100 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
24110 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
24120 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24130 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
24140 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
24150 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
24160 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
24170 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
24180 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29  crypt_mechanism)
24190 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
241a0 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73  A_PKCS:..../* As
241b0 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70  k card to decryp
241c0 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d  t */....buflen =
241d0 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
241e0 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
241f0 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  s[slotID], cacke
24200 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24210 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
24220 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65  ntity, pEncrypte
24230 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74  dPart, ulEncrypt
24240 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20  edPartLen, buf, 
24250 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20  sizeof(buf), 0, 
24260 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c  1);.....if (bufl
24270 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a  en < 0) {...../*
24280 20 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c   Decryption fail
24290 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62  ed. */.....if (b
242a0 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
242b0 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
242c0 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
242d0 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c  = CKR_USER_NOT_L
242e0 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20  OGGED_IN;.....} 
242f0 65 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20  else if (buflen 
24300 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
24310 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a  _TOKENABSENT) {.
24320 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
24330 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
24340 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
24350 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
24360 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
24370 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
24380 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  if (((unsigned l
24390 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a  ong) buflen) > *
243a0 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50  pulPartLen && pP
243b0 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65  art) {...../* De
243c0 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f  crypted data too
243d0 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65   large */.....re
243e0 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
243f0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09  R_TOO_SMALL;....
24400 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20  } else {.....if 
24410 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d  (pPart) {......m
24420 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66  emcpy(pPart, buf
24430 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d  , buflen);.....}
24440 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65  ......*pulPartLe
24450 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09  n = buflen;.....
24460 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b  .retval = CKR_OK
24470 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b  ;....}.....break
24480 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
24490 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
244a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
244b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
244c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
244d0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
244e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
244f0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
24500 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
24510 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
24520 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
24530 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24540 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
24550 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a  (int) retval);..
24560 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
24570 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24580 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24590 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b  DecryptFinal)(CK
245a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
245b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
245c0 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c  E_PTR pLastPart,
245d0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
245e0 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a  lLastPartLen) {.
245f0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
24600 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74  l;..int terminat
24610 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a  e_decrypt = 1;..
24620 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24630 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
24640 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
24650 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
24660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24670 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
24680 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
24690 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
246a0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
246b0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
246c0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
246d0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
246e0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
246f0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
24700 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
24710 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
24720 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24730 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
24740 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
24750 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
24760 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
24770 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
24780 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c  if (pulLastPartL
24790 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
247a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
247b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c  NTF("Error. pulL
247c0 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55  astPartLen is NU
247d0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
247e0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
247f0 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  AD);..}...mutex_
24800 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
24810 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
24820 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
24830 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
24840 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
24850 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24860 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
24870 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
24880 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
24890 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
248a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
248b0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
248c0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
248d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
248e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
248f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24900 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
24910 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
24920 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
24930 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
24940 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
24950 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
24960 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
24970 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
24980 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
24990 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
249a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
249b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
249c0 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
249d0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
249e0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
249f0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
24a00 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
24a10 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20  *pulLastPartLen 
24a20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74  = 0;...if (pLast
24a30 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Part == NULL) {.
24a40 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72  ..terminate_decr
24a50 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  ypt = 0;..}...if
24a60 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72   (terminate_decr
24a70 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ypt) {...cackey_
24a80 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24a90 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
24aa0 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65  e = 0;..}...mute
24ab0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
24ac0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
24ad0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24ae0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
24af0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
24b00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24b10 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
24b20 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
24b30 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
24b40 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
24b50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24b60 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24b70 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
24b80 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
24b90 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
24ba0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
24bb0 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e  K_RV, C_DigestIn
24bc0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
24bd0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
24be0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
24bf0 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09   pMechanism) {..
24c00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24c10 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
24c20 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
24c30 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
24c40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24c50 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
24c60 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
24c70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
24c80 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
24c90 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
24ca0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24cb0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
24cc0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
24cd0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
24ce0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24cf0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
24d00 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
24d10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
24d20 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
24d30 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
24d40 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53  _Digest)(CK_SESS
24d50 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
24d60 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
24d70 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
24d80 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
24d90 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
24da0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
24db0 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
24dc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24dd0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
24de0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
24df0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
24e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24e10 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
24e20 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
24e30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
24e40 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
24e50 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
24e60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24e70 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24e80 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
24e90 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
24ea0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
24eb0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
24ec0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
24ed0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
24ee0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24ef0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24f00 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b  DigestUpdate)(CK
24f10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
24f20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
24f30 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
24f40 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
24f50 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
24f60 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
24f70 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
24f80 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
24f90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24fa0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24fb0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
24fc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
24fd0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
24fe0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
24ff0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25000 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
25010 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
25020 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
25030 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
25040 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
25050 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
25060 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
25070 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
25080 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
25090 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28  V, C_DigestKey)(
250a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
250b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
250c0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
250d0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
250e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
250f0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
25100 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
25110 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25120 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25130 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
25140 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
25150 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
25160 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
25170 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
25180 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
25190 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
251a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
251b0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
251c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
251d0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
251e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
251f0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
25200 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
25210 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e  _RV, C_DigestFin
25220 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
25230 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
25240 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67  CK_BYTE_PTR pDig
25250 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  est, CK_ULONG_PT
25260 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20  R pulDigestLen) 
25270 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
25280 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
25290 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
252a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
252b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
252c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
252d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
252e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
252f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
25300 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
25310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25320 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
25330 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25340 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
25350 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
25360 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
25370 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
25380 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
25390 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
253a0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
253b0 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b  , C_SignInit)(CK
253c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
253d0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
253e0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
253f0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
25400 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
25410 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
25420 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43  l;...hKey--;...C
25430 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25440 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
25450 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
25460 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
25470 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25480 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
25490 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
254a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
254b0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
254c0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
254d0 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e  (pMechanism == N
254e0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
254f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25500 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20  ror. pMechanism 
25510 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
25520 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
25530 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
25540 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  f (pMechanism->m
25550 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f  echanism != CKM_
25560 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41  RSA_PKCS) {...CA
25570 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25580 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
25590 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20  nism->mechanism 
255a0 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73  not specified as
255b0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b   CKM_RSA_PKCS");
255c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d  ....return(CKR_M
255d0 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49  ECHANISM_PARAM_I
255e0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
255f0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
25600 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
25610 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
25620 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
25630 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
25640 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
25650 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25660 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
25670 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
25680 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
25690 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
256a0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
256b0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
256c0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
256d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
256e0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
256f0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
25700 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25710 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
25720 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
25730 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
25740 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
25750 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
25760 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
25770 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
25780 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25790 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
257a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
257b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
257c0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
257d0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
257e0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
257f0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
25800 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
25810 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
25820 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
25830 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
25840 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
25850 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
25860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25870 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c  "Error.  Sign al
25880 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73  ready in progres
25890 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  s.");......retur
258a0 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
258b0 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66  ACTIVE);..}...if
258c0 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79   (hKey >= cackey
258d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
258e0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
258f0 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  ount) {...cackey
25900 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
25910 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
25920 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25930 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b  RINTF("Error.  K
25940 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ey handle out of
25950 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65   range (requeste
25960 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20  d key %lu, only 
25970 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61  %lu identities a
25980 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e  vailable).", (un
25990 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65  signed long) hKe
259a0 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y, (unsigned lon
259b0 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  g) cackey_sessio
259c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
259d0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
259e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45  ...return(CKR_KE
259f0 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  Y_HANDLE_INVALID
25a00 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
25a10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25a20 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20  ].sign_active = 
25a30 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  1;...cackey_sess
25a40 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
25a50 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20  ign_mechanism = 
25a60 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
25a70 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f  anism;...cackey_
25a80 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
25a90 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d  n].sign_buflen =
25aa0 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65   128;..cackey_se
25ab0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25ac0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
25ad0 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  0;..cackey_sessi
25ae0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
25af0 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  gn_buf = malloc(
25b00 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73  sizeof(*cackey_s
25b10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25b20 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61  ].sign_buf) * ca
25b30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25b40 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
25b50 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  len);...CACKEY_D
25b60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73  EBUG_PRINTF("Ses
25b70 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64  sion %lu sign_id
25b80 65 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 64  entity is %p (id
25b90 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28  entity #%lu)", (
25ba0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
25bb0 53 65 73 73 69 6f 6e 2c 20 26 63 61 63 6b 65 79  Session, &cackey
25bc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25bd0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68  on].identities[h
25be0 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20  Key], (unsigned 
25bf0 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63 61  long) hKey);..ca
25c00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25c10 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
25c20 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
25c30 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
25c40 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
25c50 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ey];...mutex_ret
25c60 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
25c70 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25c80 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
25c90 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
25ca0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
25cb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25cc0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
25cd0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
25ce0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
25cf0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
25d00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25d10 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
25d20 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
25d30 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
25d40 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
25d50 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
25d60 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53   C_Sign)(CK_SESS
25d70 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
25d80 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
25d90 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
25da0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
25db0 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
25dc0 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
25dd0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
25de0 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ) {..unsigned lo
25df0 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75  ng start_sign_bu
25e00 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20 73 69  fused;..CK_RV si
25e10 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74  gn_ret;..int mut
25e20 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
25e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25e40 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
25e50 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
25e60 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
25e70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25e80 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
25e90 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
25ea0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
25eb0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
25ec0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
25ed0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
25ee0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
25ef0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
25f00 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
25f10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
25f20 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
25f30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25f40 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
25f50 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
25f60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
25f70 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
25f80 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61 72  ALID);..}...star
25f90 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  t_sign_bufused =
25fa0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
25fb0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
25fc0 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e 5f  bufused;...sign_
25fd0 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61  ret = C_SignUpda
25fe0 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61  te(hSession, pDa
25ff0 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a  ta, ulDataLen);.
26000 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d  .if (sign_ret !=
26010 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
26020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26030 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70  ("Error.  SignUp
26040 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20  date() returned 
26050 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
26060 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
26070 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
26080 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74  ....if (sign_ret
26090 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   != CKR_BUFFER_T
260a0 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 6d  OO_SMALL) {....m
260b0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
260c0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
260d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
260e0 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ....if (mutex_re
260f0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
26100 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26110 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
26120 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
26130 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
26140 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
26150 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
26160 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26170 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
26180 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75   {.....cackey_mu
26190 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
261a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
261b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
261c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
261d0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
261e0 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75  .");........retu
261f0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
26200 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
26210 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61  ...}.....if (!ca
26220 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26230 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
26240 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ive) {.....cacke
26250 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
26260 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
26270 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
26280 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26290 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76    Sign not activ
262a0 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74  e.");........ret
262b0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
262c0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
262d0 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  D);....}.....cac
262e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
262f0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
26300 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65  ve = 0;.....mute
26310 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
26320 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
26330 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
26340 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ...if (mutex_ret
26350 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  val != 0) {.....
26360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26370 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
26380 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
26390 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
263a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
263b0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65  ;....}...}....re
263c0 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a  turn(sign_ret);.
263d0 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  .}...sign_ret = 
263e0 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73  C_SignFinal(hSes
263f0 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65  sion, pSignature
26400 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  , pulSignatureLe
26410 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65  n);..if (sign_re
26420 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
26430 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 3d 3d  .if (sign_ret ==
26440 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
26450 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b  SMALL) {....CACK
26460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26470 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74  "SignFinal() ret
26480 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46 45 52  urned CKR_BUFFER
26490 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20 3d  _TOO_SMALL (rv =
264a0 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20 43   %lu), undoing C
264b0 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 2c 20  _SignUpdate()", 
264c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
264d0 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 63  sign_ret);.....c
264e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
264f0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
26500 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69  fused = start_si
26510 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 09  gn_bufused;.....
26520 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
26530 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
26540 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26550 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28  ror.  SignFinal(
26560 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
26570 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
26580 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
26590 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72   sign_ret);....r
265a0 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b  eturn(sign_ret);
265b0 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69 67 6e 61  ..}...if (pSigna
265c0 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ture == NULL) {.
265d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
265e0 52 49 4e 54 46 28 22 70 53 69 67 6e 61 74 75 72  RINTF("pSignatur
265f0 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  e specified as N
26600 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53  ULL, undoing C_S
26610 69 67 6e 55 70 64 61 74 65 28 29 22 29 3b 0a 0a  ignUpdate()");..
26620 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26630 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
26640 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74  _bufused = start
26650 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a  _sign_bufused;..
26660 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
26670 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  t);..}...CACKEY_
26680 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
26690 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
266a0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
266b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
266c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
266d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
266e0 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b 5f 53  SignUpdate)(CK_S
266f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
26700 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
26710 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
26720 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b  ONG ulPartLen) {
26730 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
26740 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
26750 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
26760 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
26770 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
26780 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26790 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
267a0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
267b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
267c0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
267d0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
267e0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
267f0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
26800 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
26810 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
26820 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
26830 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
26840 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26850 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
26860 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
26870 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
26880 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
26890 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
268a0 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d  .}...if (pPart =
268b0 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72 74  = NULL && ulPart
268c0 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  Len == 0) {.../*
268d0 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 20 69   Short circuit i
268e0 66 20 77 65 20 61 72 65 20 61 73 6b 65 64 20 74  f we are asked t
268f0 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e  o sign nothing..
26900 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  . */...CACKEY_DE
26910 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
26920 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
26930 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
26940 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
26950 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
26960 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d  .}...if (pPart =
26970 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
26980 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26990 22 45 72 72 6f 72 2e 20 70 50 61 72 74 20 69 73  "Error. pPart is
269a0 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72   NULL, but ulPar
269b0 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29  tLen is not 0.")
269c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
269d0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
269e0 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72 74 4c  .}...if (ulPartL
269f0 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  en == 0) {...CAC
26a00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26a10 28 22 45 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c  ("Error. ulPartL
26a20 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50 61  en is 0, but pPa
26a30 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  rt is not NULL."
26a40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26a50 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
26a60 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
26a70 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
26a80 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
26a90 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
26aa0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
26ab0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26ac0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26ad0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
26ae0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
26af0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
26b00 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
26b10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26b20 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
26b30 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
26b40 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26b50 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
26b60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26b70 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
26b80 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
26b90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
26ba0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
26bb0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
26bc0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
26bd0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
26be0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
26bf0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
26c00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
26c10 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
26c20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26c30 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65   Sign not active
26c40 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
26c50 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
26c60 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
26c70 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61  ..}...switch (ca
26c80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26c90 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63  ession].sign_mec
26ca0 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65  hanism) {...case
26cb0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
26cc0 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20  ../* Accumulate 
26cd0 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09 69  directly */....i
26ce0 66 20 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69  f ((cackey_sessi
26cf0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
26d00 67 6e 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50  gn_bufused + ulP
26d10 61 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79  artLen) > cackey
26d20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26d30 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
26d40 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65   {.....cackey_se
26d50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26d60 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20  .sign_buflen *= 
26d70 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  2;......cackey_s
26d80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26d90 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61  ].sign_buf = rea
26da0 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73  lloc(cackey_sess
26db0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
26dc0 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  ign_buf, sizeof(
26dd0 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  *cackey_sessions
26de0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
26df0 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65  buf) * cackey_se
26e00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26e10 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09  .sign_buflen);..
26e20 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63  ..}.....memcpy(c
26e30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26e40 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
26e50 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73 69  f + cackey_sessi
26e60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
26e70 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61 72  gn_bufused, pPar
26e80 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a  t, ulPartLen);..
26e90 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
26ea0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
26eb0 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c 50  n_bufused += ulP
26ec0 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61  artLen;.....brea
26ed0 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
26ee0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
26ef0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
26f00 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
26f10 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
26f20 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
26f30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26f40 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
26f50 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
26f60 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
26f70 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
26f80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26f90 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26fa0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
26fb0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
26fc0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
26fd0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
26fe0 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43  , C_SignFinal)(C
26ff0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
27000 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
27010 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
27020 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
27030 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
27040 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59   {..static CK_BY
27050 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b  TE sigbuf[1024];
27060 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66  ..ssize_t sigbuf
27070 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  len;..CK_SLOT_ID
27080 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20   slotID;..CK_RV 
27090 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
270a0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74  ERAL_ERROR;..int
270b0 20 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20   terminate_sign 
270c0 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  = 1;..int mutex_
270d0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
270e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
270f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
27100 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
27110 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
27120 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27130 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
27140 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
27150 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
27160 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
27170 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53  );..}...if (pulS
27180 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e  ignatureLen == N
27190 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
271a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
271b0 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72  ror. pulSignatur
271c0 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  eLen is NULL.");
271d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
271e0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
271f0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
27200 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
27210 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
27220 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
27230 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
27240 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
27250 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27260 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
27270 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
27280 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
27290 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
272a0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
272b0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
272c0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
272d0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
272e0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
272f0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
27300 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27310 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27320 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
27330 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27340 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
27350 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
27360 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27370 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
27380 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
27390 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
273a0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
273b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
273c0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
273d0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
273e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
273f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
27400 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
27410 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27420 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
27430 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
27440 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
27450 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27460 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27470 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27480 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  Sign not active.
27490 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
274a0 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
274b0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
274c0 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
274d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
274e0 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
274f0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
27500 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
27510 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
27520 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
27530 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
27540 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27550 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27560 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
27570 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
27580 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
27590 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
275a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
275b0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
275c0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
275d0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
275e0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
275f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27600 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
27610 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
27620 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
27630 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
27640 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
27650 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27660 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27670 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
27680 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27690 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63  ;..}...switch (c
276a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
276b0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65  Session].sign_me
276c0 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
276d0 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
276e0 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74  .../* Ask card t
276f0 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43  o sign */....CAC
27700 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27710 28 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67 6e  ("Asking to sign
27720 20 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20 25   from identity %
27730 70 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75  p in session %lu
27740 22 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ", cackey_sessio
27750 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
27760 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73  n_identity, (uns
27770 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73  igned long) hSes
27780 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66  sion);....sigbuf
27790 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67  len = cackey_sig
277a0 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79  ndecrypt(&cackey
277b0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
277c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
277d0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
277e0 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f  dentity, cackey_
277f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27800 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63  n].sign_buf, cac
27810 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27820 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
27830 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a  sed, sigbuf, siz
27840 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20  eof(sigbuf), 1, 
27850 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62  0);.....if (sigb
27860 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09  uflen < 0) {....
27870 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c  ./* Signing fail
27880 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73  ed. */.....if (s
27890 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b  igbuflen == CACK
278a0 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
278b0 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76  GIN) {......retv
278c0 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f  al = CKR_USER_NO
278d0 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09  T_LOGGED_IN;....
278e0 09 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67 62  .} else if (sigb
278f0 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
27900 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
27910 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  NT) {......retva
27920 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  l = CKR_DEVICE_R
27930 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c  EMOVED;.....} el
27940 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  se {......retval
27950 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
27960 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  RROR;.....}....}
27970 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69   else if (((unsi
27980 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75  gned long) sigbu
27990 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e  flen) > *pulSign
279a0 61 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67  atureLen && pSig
279b0 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a  nature) {...../*
279c0 20 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f   Signed data too
279d0 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41   large */.....CA
279e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
279f0 46 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  F("retval = CKR_
27a00 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
27a10 3b 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25  ;  sigbuflen = %
27a20 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65  lu, pulSignature
27a30 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73  Len = %lu", (uns
27a40 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62  igned long) sigb
27a50 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64  uflen, (unsigned
27a60 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61   long) *pulSigna
27a70 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72  tureLen);......r
27a80 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
27a90 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09  ER_TOO_SMALL;...
27aa0 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
27ab0 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65  n = 0;....} else
27ac0 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65   {.....terminate
27ad0 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09  _sign = 0;......
27ae0 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 29 20  if (pSignature) 
27af0 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53  {......memcpy(pS
27b00 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66  ignature, sigbuf
27b10 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09  , sigbuflen);...
27b20 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
27b30 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09  gn = 1;.....}...
27b40 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65  ...*pulSignature
27b50 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b  Len = sigbuflen;
27b60 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
27b70 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09  KR_OK;....}.....
27b80 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28  break;..}...if (
27b90 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20  terminate_sign) 
27ba0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
27bb0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27bc0 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09  ].sign_buf) {...
27bd0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73  .free(cackey_ses
27be0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27bf0 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a  sign_buf);...}..
27c00 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
27c10 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
27c20 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a  _active = 0;..}.
27c30 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
27c40 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
27c50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27c60 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
27c70 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
27c80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27c90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
27ca0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
27cb0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27cc0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27cd0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
27ce0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
27cf0 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29  rning %i", (int)
27d00 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
27d10 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
27d20 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
27d30 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52  N(CK_RV, C_SignR
27d40 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
27d50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
27d60 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
27d70 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
27d80 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
27d90 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
27da0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27db0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
27dc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
27dd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
27de0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27df0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
27e00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
27e10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
27e20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
27e30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
27e40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27e50 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
27e60 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27e70 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
27e80 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27e90 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
27ea0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
27eb0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
27ec0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
27ed0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
27ee0 53 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f  SignRecover)(CK_
27ef0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
27f00 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
27f10 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
27f20 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
27f30 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
27f40 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
27f50 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
27f60 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
27f70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
27f80 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
27f90 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
27fa0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
27fb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27fc0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
27fd0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
27fe0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
27ff0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
28000 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
28010 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
28020 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
28030 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
28040 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
28050 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28060 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
28070 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
28080 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
28090 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
280a0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
280b0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
280c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
280d0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
280e0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
280f0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
28100 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
28110 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
28120 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
28130 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
28140 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
28150 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28160 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
28170 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
28180 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
28190 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
281a0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
281b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
281c0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
281d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
281e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
281f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28200 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
28210 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
28220 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
28230 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
28240 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
28250 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
28260 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
28270 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
28280 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
28290 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
282a0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
282b0 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
282c0 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
282d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
282e0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
282f0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
28300 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
28310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28320 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
28330 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
28340 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
28350 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
28360 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
28370 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
28380 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
28390 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
283a0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
283b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
283c0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
283d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
283e0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
283f0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
28400 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
28410 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
28420 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
28430 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
28440 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
28450 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
28460 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28470 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
28480 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
28490 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
284a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
284b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
284c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
284d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
284e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
284f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
28500 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28510 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
28520 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
28530 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
28540 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
28550 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
28560 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
28570 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
28580 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
28590 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
285a0 65 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53  erifyFinal)(CK_S
285b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
285c0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
285d0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
285e0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
285f0 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tureLen) {..CACK
28600 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28610 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
28620 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
28630 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
28640 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28650 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
28660 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
28670 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
28680 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
28690 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
286a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
286b0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
286c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
286d0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
286e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
286f0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
28700 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
28710 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
28720 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
28730 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
28740 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28  ifyRecoverInit)(
28750 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
28760 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
28770 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
28780 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
28790 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
287a0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
287b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
287c0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
287d0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
287e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
287f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
28800 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
28810 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28820 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
28830 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
28840 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28850 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28860 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
28870 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
28880 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
28890 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
288a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
288b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
288c0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
288d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
288e0 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  , C_VerifyRecove
288f0 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  r)(CK_SESSION_HA
28900 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
28910 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
28920 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
28930 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20  ulSignatureLen, 
28940 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
28950 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
28960 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43  pulDataLen) {..C
28970 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28980 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
28990 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
289a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
289b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
289c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
289d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
289e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
289f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
28a00 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
28a10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28a20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
28a30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
28a40 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
28a50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
28a60 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
28a70 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
28a80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
28a90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
28aa0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
28ab0 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
28ac0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
28ad0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
28ae0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
28af0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
28b00 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
28b10 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
28b20 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
28b30 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
28b40 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
28b50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
28b60 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
28b70 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
28b80 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
28b90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28ba0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
28bb0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
28bc0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
28bd0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
28be0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
28bf0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
28c00 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
28c10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
28c20 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
28c30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28c40 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
28c50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
28c60 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
28c70 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
28c80 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
28c90 74 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43  tDigestUpdate)(C
28ca0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
28cb0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
28cc0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
28cd0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
28ce0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
28cf0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
28d00 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
28d10 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
28d20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
28d30 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
28d40 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
28d50 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
28d60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28d70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
28d80 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
28d90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28da0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
28db0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
28dc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28dd0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28de0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
28df0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
28e00 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
28e10 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
28e20 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
28e30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28e40 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
28e50 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
28e60 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55  , C_SignEncryptU
28e70 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
28e80 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
28e90 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
28ea0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
28eb0 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  lPartLen, CK_BYT
28ec0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
28ed0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
28ee0 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50  TR pulEncryptedP
28ef0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
28f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28f10 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
28f20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
28f30 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
28f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28f50 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
28f60 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
28f70 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
28f80 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
28f90 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
28fa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
28fb0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
28fc0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28fd0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
28fe0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28ff0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
29000 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29010 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
29020 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
29030 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
29040 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29  yptVerifyUpdate)
29050 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
29060 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
29070 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
29080 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
29090 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  G ulEncryptedPar
290a0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
290b0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
290c0 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e  G_PTR pulPartLen
290d0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
290e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
290f0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
29100 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
29110 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29120 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29130 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
29140 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29150 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
29160 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
29170 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29180 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
29190 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
291a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
291b0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
291c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
291d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
291e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
291f0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
29200 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
29210 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
29220 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
29230 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
29240 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
29250 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41  pMechanism, CK_A
29260 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
29270 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
29280 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a   ulCount, CK_OBJ
29290 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
292a0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
292b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
292c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
292d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
292e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
292f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29300 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
29310 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
29320 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
29330 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
29340 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
29350 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29360 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
29370 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29380 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
29390 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
293a0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
293b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
293c0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
293d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
293e0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
293f0 74 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45  teKeyPair)(CK_SE
29400 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
29410 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
29420 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
29430 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  sm, CK_ATTRIBUTE
29440 5f 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54  _PTR pPublicKeyT
29450 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
29460 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74  G ulPublicKeyAtt
29470 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
29480 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50  ATTRIBUTE_PTR pP
29490 72 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74  rivateKeyTemplat
294a0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72  e, CK_ULONG ulPr
294b0 69 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74  ivateKeyAttribut
294c0 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
294d0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50  T_HANDLE_PTR phP
294e0 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ublicKey, CK_OBJ
294f0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
29500 68 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09  hPrivateKey) {..
29510 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29520 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
29530 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
29540 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
29550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29560 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
29570 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
29580 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
29590 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
295a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
295b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
295c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
295d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
295e0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
295f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29600 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
29610 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
29620 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
29630 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
29640 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
29650 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53  _WrapKey)(CK_SES
29660 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
29670 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
29680 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
29690 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
296a0 44 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79  DLE hWrappingKey
296b0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
296c0 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45  LE hKey, CK_BYTE
296d0 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79  _PTR pWrappedKey
296e0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
296f0 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29  ulWrappedKeyLen)
29700 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
29710 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
29720 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
29730 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
29740 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29750 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29760 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
29770 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
29780 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
29790 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
297a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
297b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
297c0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
297d0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
297e0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
297f0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
29800 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
29810 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29820 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
29830 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
29840 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28  V, C_UnwrapKey)(
29850 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
29860 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
29870 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
29880 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
29890 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61  CT_HANDLE hUnwra
298a0 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54  ppingKey, CK_BYT
298b0 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65  E_PTR pWrappedKe
298c0 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72  y, CK_ULONG ulWr
298d0 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f  appedKeyLen, CK_
298e0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
298f0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
29900 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75  G ulAttributeCou
29910 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
29920 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
29930 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
29940 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
29950 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
29960 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
29970 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29980 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
29990 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
299a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
299b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
299c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
299d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
299e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
299f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29a00 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
29a10 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
29a20 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
29a30 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
29a40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29a50 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
29a60 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
29a70 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43  , C_DeriveKey)(C
29a80 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
29a90 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
29aa0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
29ab0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
29ac0 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65  T_HANDLE hBaseKe
29ad0 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  y, CK_ATTRIBUTE_
29ae0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
29af0 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62  K_ULONG ulAttrib
29b00 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a  uteCount, CK_OBJ
29b10 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
29b20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
29b30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
29b40 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
29b50 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
29b60 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
29b70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29b80 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
29b90 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
29ba0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
29bb0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
29bc0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
29bd0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29be0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
29bf0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29c00 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
29c10 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29c20 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
29c30 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29c40 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
29c50 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
29c60 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61  (CK_RV, C_SeedRa
29c70 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ndom)(CK_SESSION
29c80 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
29c90 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
29ca0 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  eed, CK_ULONG ul
29cb0 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  SeedLen) {..CACK
29cc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29cd0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
29ce0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
29cf0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
29d00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29d10 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
29d20 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
29d30 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
29d40 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
29d50 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
29d60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29d70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
29d80 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29d90 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
29da0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29db0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
29dc0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
29dd0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
29de0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
29df0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
29e00 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f  erateRandom)(CK_
29e10 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
29e20 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
29e30 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61  _PTR pRandomData
29e40 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e  , CK_ULONG ulRan
29e50 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  domLen) {..CACKE
29e60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29e70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
29e80 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
29e90 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
29ea0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29eb0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
29ec0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
29ed0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
29ee0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
29ef0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
29f00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
29f10 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
29f20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29f30 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
29f40 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29f50 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
29f60 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29f70 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
29f80 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75  /* Deprecated Fu
29f90 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46  nction */.CK_DEF
29fa0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
29fb0 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  RV, C_GetFunctio
29fc0 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53  nStatus)(CK_SESS
29fd0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
29fe0 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ion) {..CACKEY_D
29ff0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2a000 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59  led.");...CACKEY
2a010 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2a020 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2a030 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
2a040 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  EL (%i)", CKR_FU
2a050 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
2a060 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  LEL);...return(C
2a070 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a080 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65  PARALLEL);...hSe
2a090 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e  ssion = hSession
2a0a0 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75  ; /* Supress unu
2a0b0 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72  sed variable war
2a0c0 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65  ning */.}../* De
2a0d0 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f  precated Functio
2a0e0 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  n */.CK_DEFINE_F
2a0f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2a100 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29  _CancelFunction)
2a110 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2a120 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
2a130 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a140 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2a150 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a160 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2a170 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2a180 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22  T_PARALLEL (%i)"
2a190 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2a1a0 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
2a1b0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2a1c0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
2a1d0 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20  );...hSession = 
2a1e0 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70  hSession; /* Sup
2a1f0 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69  ress unused vari
2a200 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  able warning */.
2a210 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2a220 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
2a230 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28  etFunctionList)(
2a240 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54  CK_FUNCTION_LIST
2a250 5f 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74  _PTR_PTR ppFunct
2a260 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46  ionList) {..CK_F
2a270 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
2a280 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a   pFunctionList;.
2a290 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a2a0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2a2b0 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69  ;...if (ppFuncti
2a2c0 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  onList == NULL) 
2a2d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a2e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a2f0 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69  ppFunctionList i
2a300 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
2a310 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2a320 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46  TS_BAD);..}...pF
2a330 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61  unctionList = ma
2a340 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75  lloc(sizeof(*pFu
2a350 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09  nctionList));...
2a360 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76  pFunctionList->v
2a370 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
2a380 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
2a390 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
2a3a0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
2a3b0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65  FunctionList->ve
2a3c0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28  rsion.minor = ((
2a3d0 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
2a3e0 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
2a3f0 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46   8) & 0xff;...pF
2a400 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
2a410 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e  nitialize = C_In
2a420 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63  itialize;..pFunc
2a430 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61  tionList->C_Fina
2a440 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a  lize = C_Finaliz
2a450 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2a460 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43  t->C_GetInfo = C
2a470 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  _GetInfo;..pFunc
2a480 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
2a490 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53  lotList = C_GetS
2a4a0 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  lotList;..pFunct
2a4b0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c  ionList->C_GetSl
2a4c0 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c  otInfo = C_GetSl
2a4d0 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  otInfo;..pFuncti
2a4e0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b  onList->C_GetTok
2a4f0 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f  enInfo = C_GetTo
2a500 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  kenInfo;..pFunct
2a510 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46  ionList->C_WaitF
2a520 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f  orSlotEvent = C_
2a530 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
2a540 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2a550 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  ->C_GetMechanism
2a560 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68  List = C_GetMech
2a570 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e  anismList;..pFun
2a580 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2a590 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20  MechanismInfo = 
2a5a0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
2a5b0 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
2a5c0 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20  st->C_InitToken 
2a5d0 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09  = C_InitToken;..
2a5e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2a5f0 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69  _InitPIN = C_Ini
2a600 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tPIN;..pFunction
2a610 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d  List->C_SetPIN =
2a620 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e   C_SetPIN;..pFun
2a630 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65  ctionList->C_Ope
2a640 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65  nSession = C_Ope
2a650 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63  nSession;..pFunc
2a660 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73  tionList->C_Clos
2a670 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f  eSession = C_Clo
2a680 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e  seSession;..pFun
2a690 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f  ctionList->C_Clo
2a6a0 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20  seAllSessions = 
2a6b0 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
2a6c0 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ns;..pFunctionLi
2a6d0 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e  st->C_GetSession
2a6e0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73  Info = C_GetSess
2a6f0 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  ionInfo;..pFunct
2a700 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70  ionList->C_GetOp
2a710 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43  erationState = C
2a720 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _GetOperationSta
2a730 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
2a740 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69  st->C_SetOperati
2a750 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f  onState = C_SetO
2a760 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09  perationState;..
2a770 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2a780 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e  _Login = C_Login
2a790 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2a7a0 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c  ->C_Logout = C_L
2a7b0 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f  ogout;..pFunctio
2a7c0 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f  nList->C_CreateO
2a7d0 62 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65  bject = C_Create
2a7e0 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
2a7f0 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62  onList->C_CopyOb
2a800 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a  ject = C_CopyObj
2a810 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
2a820 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62  ist->C_DestroyOb
2a830 6a 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79  ject = C_Destroy
2a840 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
2a850 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a  onList->C_GetObj
2a860 65 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f  ectSize = C_GetO
2a870 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e  bjectSize;..pFun
2a880 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2a890 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d  AttributeValue =
2a8a0 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56   C_GetAttributeV
2a8b0 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  alue;..pFunction
2a8c0 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69  List->C_SetAttri
2a8d0 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65  buteValue = C_Se
2a8e0 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b  tAttributeValue;
2a8f0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2a900 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e  >C_FindObjectsIn
2a910 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  it = C_FindObjec
2a920 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  tsInit;..pFuncti
2a930 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62  onList->C_FindOb
2a940 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62  jects = C_FindOb
2a950 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f  jects;..pFunctio
2a960 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
2a970 65 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69  ectsFinal = C_Fi
2a980 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a  ndObjectsFinal;.
2a990 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2a9a0 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20  C_EncryptInit = 
2a9b0 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09  C_EncryptInit;..
2a9c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2a9d0 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63  _Encrypt = C_Enc
2a9e0 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  rypt;..pFunction
2a9f0 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55  List->C_EncryptU
2aa00 70 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70  pdate = C_Encryp
2aa10 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
2aa20 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
2aa30 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72  ptFinal = C_Encr
2aa40 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  yptFinal;..pFunc
2aa50 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
2aa60 79 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72  yptInit = C_Decr
2aa70 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  yptInit;..pFunct
2aa80 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
2aa90 70 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a  pt = C_Decrypt;.
2aaa0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2aab0 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 20  C_DecryptUpdate 
2aac0 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  = C_DecryptUpdat
2aad0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2aae0 74 2d 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61  t->C_DecryptFina
2aaf0 6c 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e  l = C_DecryptFin
2ab00 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
2ab10 73 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74  st->C_DigestInit
2ab20 20 3d 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b   = C_DigestInit;
2ab30 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2ab40 3e 43 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69  >C_Digest = C_Di
2ab50 67 65 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  gest;..pFunction
2ab60 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70  List->C_DigestUp
2ab70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55  date = C_DigestU
2ab80 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
2ab90 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b  nList->C_DigestK
2aba0 65 79 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79  ey = C_DigestKey
2abb0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2abc0 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20  ->C_DigestFinal 
2abd0 3d 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b  = C_DigestFinal;
2abe0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2abf0 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f  >C_SignInit = C_
2ac00 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63  SignInit;..pFunc
2ac10 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
2ac20 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e   = C_Sign;..pFun
2ac30 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
2ac40 6e 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e  nUpdate = C_Sign
2ac50 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
2ac60 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69  onList->C_SignFi
2ac70 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61  nal = C_SignFina
2ac80 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
2ac90 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  t->C_SignRecover
2aca0 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63  Init = C_SignRec
2acb0 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63  overInit;..pFunc
2acc0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
2acd0 52 65 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e  Recover = C_Sign
2ace0 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74  Recover;..pFunct
2acf0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
2ad00 79 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79  yInit = C_Verify
2ad10 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
2ad20 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d  List->C_Verify =
2ad30 20 43 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e   C_Verify;..pFun
2ad40 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
2ad50 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65  ifyUpdate = C_Ve
2ad60 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75  rifyUpdate;..pFu
2ad70 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
2ad80 72 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65  rifyFinal = C_Ve
2ad90 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  rifyFinal;..pFun
2ada0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
2adb0 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d  ifyRecoverInit =
2adc0 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
2add0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
2ade0 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65  List->C_VerifyRe
2adf0 63 6f 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79  cover = C_Verify
2ae00 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74  Recover;..pFunct
2ae10 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
2ae20 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d  tEncryptUpdate =
2ae30 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74   C_DigestEncrypt
2ae40 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
2ae50 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
2ae60 74 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20  tDigestUpdate = 
2ae70 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55  C_DecryptDigestU
2ae80 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
2ae90 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63  nList->C_SignEnc
2aea0 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53  ryptUpdate = C_S
2aeb0 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65  ignEncryptUpdate
2aec0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2aed0 2d 3e 43 5f 44 65 63 72 79 70 74 56 65 72 69 66  ->C_DecryptVerif
2aee0 79 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72  yUpdate = C_Decr
2aef0 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 3b  yptVerifyUpdate;
2af00 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2af10 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d  >C_GenerateKey =
2af20 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a   C_GenerateKey;.
2af30 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2af40 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
2af50 72 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  r = C_GenerateKe
2af60 79 50 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f  yPair;..pFunctio
2af70 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79  nList->C_WrapKey
2af80 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70   = C_WrapKey;..p
2af90 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2afa0 55 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e  UnwrapKey = C_Un
2afb0 77 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74  wrapKey;..pFunct
2afc0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76  ionList->C_Deriv
2afd0 65 4b 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b  eKey = C_DeriveK
2afe0 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
2aff0 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d  st->C_SeedRandom
2b000 20 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b   = C_SeedRandom;
2b010 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2b020 3e 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f  >C_GenerateRando
2b030 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61  m = C_GenerateRa
2b040 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ndom;..pFunction
2b050 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74  List->C_GetFunct
2b060 69 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65  ionStatus = C_Ge
2b070 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b  tFunctionStatus;
2b080 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2b090 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f  >C_CancelFunctio
2b0a0 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63  n = C_CancelFunc
2b0b0 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tion;..pFunction
2b0c0 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74  List->C_GetFunct
2b0d0 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46  ionList = C_GetF
2b0e0 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a  unctionList;...*
2b0f0 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  ppFunctionList =
2b100 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a   pFunctionList;.
2b110 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b120 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2b130 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
2b140 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
2b150 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a           (CKR_OK);.}..