Hex Artifact Content

Artifact f9930320b17dbebda31c0e63901f70b87e6f38c3:


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 73 74 61  NVALID");.}..sta
37e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
37f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
3800: 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53  C_ATTRIBUTE_TO_S
3810: 54 52 28 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  TR(CK_ATTRIBUTE_
3820: 54 59 50 45 20 61 74 74 72 29 20 7b 0a 09 73 77  TYPE attr) {..sw
3830: 69 74 63 68 20 28 61 74 74 72 29 20 7b 0a 09 09  itch (attr) {...
3840: 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a  case CKA_CLASS:.
3850: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43  ...return("CKA_C
3860: 4c 41 53 53 22 29 3b 0a 09 09 63 61 73 65 20 43  LASS");...case C
3870: 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 72 65 74  KA_TOKEN:....ret
3880: 75 72 6e 28 22 43 4b 41 5f 54 4f 4b 45 4e 22 29  urn("CKA_TOKEN")
3890: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
38a0: 56 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  VATE:....return(
38b0: 22 43 4b 41 5f 50 52 49 56 41 54 45 22 29 3b 0a  "CKA_PRIVATE");.
38c0: 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c  ..case CKA_LABEL
38d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
38e0: 5f 4c 41 42 45 4c 22 29 3b 0a 09 09 63 61 73 65  _LABEL");...case
38f0: 20 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e   CKA_APPLICATION
3900: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
3910: 5f 41 50 50 4c 49 43 41 54 49 4f 4e 22 29 3b 0a  _APPLICATION");.
3920: 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45  ..case CKA_VALUE
3930: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
3940: 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65  _VALUE");...case
3950: 20 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 3a 0a   CKA_OBJECT_ID:.
3960: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f  ...return("CKA_O
3970: 42 4a 45 43 54 5f 49 44 22 29 3b 0a 09 09 63 61  BJECT_ID");...ca
3980: 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41  se CKA_CERTIFICA
3990: 54 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  TE_TYPE:....retu
39a0: 72 6e 28 22 43 4b 41 5f 43 45 52 54 49 46 49 43  rn("CKA_CERTIFIC
39b0: 41 54 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61  ATE_TYPE");...ca
39c0: 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09  se CKA_ISSUER:..
39d0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 49 53  ..return("CKA_IS
39e0: 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  SUER");...case C
39f0: 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
3a00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
3a10: 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 22 29  _SERIAL_NUMBER")
3a20: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 43 5f  ;...case CKA_AC_
3a30: 49 53 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72  ISSUER:....retur
3a40: 6e 28 22 43 4b 41 5f 41 43 5f 49 53 53 55 45 52  n("CKA_AC_ISSUER
3a50: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f  ");...case CKA_O
3a60: 57 4e 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  WNER:....return(
3a70: 22 43 4b 41 5f 4f 57 4e 45 52 22 29 3b 0a 09 09  "CKA_OWNER");...
3a80: 63 61 73 65 20 43 4b 41 5f 41 54 54 52 5f 54 59  case CKA_ATTR_TY
3a90: 50 45 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  PES:....return("
3aa0: 43 4b 41 5f 41 54 54 52 5f 54 59 50 45 53 22 29  CKA_ATTR_TYPES")
3ab0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ;...case CKA_TRU
3ac0: 53 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  STED:....return(
3ad0: 22 43 4b 41 5f 54 52 55 53 54 45 44 22 29 3b 0a  "CKA_TRUSTED");.
3ae0: 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54  ..case CKA_KEY_T
3af0: 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  YPE:....return("
3b00: 43 4b 41 5f 4b 45 59 5f 54 59 50 45 22 29 3b 0a  CKA_KEY_TYPE");.
3b10: 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45  ..case CKA_SUBJE
3b20: 43 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  CT:....return("C
3b30: 4b 41 5f 53 55 42 4a 45 43 54 22 29 3b 0a 09 09  KA_SUBJECT");...
3b40: 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09  case CKA_ID:....
3b50: 72 65 74 75 72 6e 28 22 43 4b 41 5f 49 44 22 29  return("CKA_ID")
3b60: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e  ;...case CKA_SEN
3b70: 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72  SITIVE:....retur
3b80: 6e 28 22 43 4b 41 5f 53 45 4e 53 49 54 49 56 45  n("CKA_SENSITIVE
3b90: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
3ba0: 4e 43 52 59 50 54 3a 0a 09 09 09 72 65 74 75 72  NCRYPT:....retur
3bb0: 6e 28 22 43 4b 41 5f 45 4e 43 52 59 50 54 22 29  n("CKA_ENCRYPT")
3bc0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43  ;...case CKA_DEC
3bd0: 52 59 50 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  RYPT:....return(
3be0: 22 43 4b 41 5f 44 45 43 52 59 50 54 22 29 3b 0a  "CKA_DECRYPT");.
3bf0: 09 09 63 61 73 65 20 43 4b 41 5f 57 52 41 50 3a  ..case CKA_WRAP:
3c00: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3c10: 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43  WRAP");...case C
3c20: 4b 41 5f 55 4e 57 52 41 50 3a 0a 09 09 09 72 65  KA_UNWRAP:....re
3c30: 74 75 72 6e 28 22 43 4b 41 5f 55 4e 57 52 41 50  turn("CKA_UNWRAP
3c40: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
3c50: 49 47 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IGN:....return("
3c60: 43 4b 41 5f 53 49 47 4e 22 29 3b 0a 09 09 63 61  CKA_SIGN");...ca
3c70: 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f  se CKA_SIGN_RECO
3c80: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
3c90: 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52  CKA_SIGN_RECOVER
3ca0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
3cb0: 45 52 49 46 59 3a 0a 09 09 09 72 65 74 75 72 6e  ERIFY:....return
3cc0: 28 22 43 4b 41 5f 56 45 52 49 46 59 22 29 3b 0a  ("CKA_VERIFY");.
3cd0: 09 09 63 61 73 65 20 43 4b 41 5f 56 45 52 49 46  ..case CKA_VERIF
3ce0: 59 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65  Y_RECOVER:....re
3cf0: 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59  turn("CKA_VERIFY
3d00: 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61  _RECOVER");...ca
3d10: 73 65 20 43 4b 41 5f 44 45 52 49 56 45 3a 0a 09  se CKA_DERIVE:..
3d20: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45  ..return("CKA_DE
3d30: 52 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43  RIVE");...case C
3d40: 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 3a 0a 09  KA_START_DATE:..
3d50: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 54  ..return("CKA_ST
3d60: 41 52 54 5f 44 41 54 45 22 29 3b 0a 09 09 63 61  ART_DATE");...ca
3d70: 73 65 20 43 4b 41 5f 45 4e 44 5f 44 41 54 45 3a  se CKA_END_DATE:
3d80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3d90: 45 4e 44 5f 44 41 54 45 22 29 3b 0a 09 09 63 61  END_DATE");...ca
3da0: 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a  se CKA_MODULUS:.
3db0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d  ...return("CKA_M
3dc0: 4f 44 55 4c 55 53 22 29 3b 0a 09 09 63 61 73 65  ODULUS");...case
3dd0: 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49 54   CKA_MODULUS_BIT
3de0: 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  S:....return("CK
3df0: 41 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53 22 29  A_MODULUS_BITS")
3e00: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42  ;...case CKA_PUB
3e10: 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09  LIC_EXPONENT:...
3e20: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 55 42  .return("CKA_PUB
3e30: 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 22 29 3b 0a  LIC_EXPONENT");.
3e40: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41  ..case CKA_PRIVA
3e50: 54 45 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09  TE_EXPONENT:....
3e60: 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56  return("CKA_PRIV
3e70: 41 54 45 5f 45 58 50 4f 4e 45 4e 54 22 29 3b 0a  ATE_EXPONENT");.
3e80: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
3e90: 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  _1:....return("C
3ea0: 4b 41 5f 50 52 49 4d 45 5f 31 22 29 3b 0a 09 09  KA_PRIME_1");...
3eb0: 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f 32  case CKA_PRIME_2
3ec0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
3ed0: 5f 50 52 49 4d 45 5f 32 22 29 3b 0a 09 09 63 61  _PRIME_2");...ca
3ee0: 73 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f  se CKA_EXPONENT_
3ef0: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  1:....return("CK
3f00: 41 5f 45 58 50 4f 4e 45 4e 54 5f 31 22 29 3b 0a  A_EXPONENT_1");.
3f10: 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e  ..case CKA_EXPON
3f20: 45 4e 54 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e  ENT_2:....return
3f30: 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32  ("CKA_EXPONENT_2
3f40: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43  ");...case CKA_C
3f50: 4f 45 46 46 49 43 49 45 4e 54 3a 0a 09 09 09 72  OEFFICIENT:....r
3f60: 65 74 75 72 6e 28 22 43 4b 41 5f 43 4f 45 46 46  eturn("CKA_COEFF
3f70: 49 43 49 45 4e 54 22 29 3b 0a 09 09 63 61 73 65  ICIENT");...case
3f80: 20 43 4b 41 5f 50 52 49 4d 45 3a 0a 09 09 09 72   CKA_PRIME:....r
3f90: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45  eturn("CKA_PRIME
3fa0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
3fb0: 55 42 50 52 49 4d 45 3a 0a 09 09 09 72 65 74 75  UBPRIME:....retu
3fc0: 72 6e 28 22 43 4b 41 5f 53 55 42 50 52 49 4d 45  rn("CKA_SUBPRIME
3fd0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 42  ");...case CKA_B
3fe0: 41 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ASE:....return("
3ff0: 43 4b 41 5f 42 41 53 45 22 29 3b 0a 09 09 63 61  CKA_BASE");...ca
4000: 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54  se CKA_PRIME_BIT
4010: 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  S:....return("CK
4020: 41 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a  A_PRIME_BITS");.
4030: 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 5f 50  ..case CKA_SUB_P
4040: 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  RIME_BITS:....re
4050: 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 5f 50 52  turn("CKA_SUB_PR
4060: 49 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09 63 61  IME_BITS");...ca
4070: 73 65 20 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54  se CKA_VALUE_BIT
4080: 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  S:....return("CK
4090: 41 5f 56 41 4c 55 45 5f 42 49 54 53 22 29 3b 0a  A_VALUE_BITS");.
40a0: 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45  ..case CKA_VALUE
40b0: 5f 4c 45 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28  _LEN:....return(
40c0: 22 43 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 22 29  "CKA_VALUE_LEN")
40d0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 54  ;...case CKA_EXT
40e0: 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 72 65 74  RACTABLE:....ret
40f0: 75 72 6e 28 22 43 4b 41 5f 45 58 54 52 41 43 54  urn("CKA_EXTRACT
4100: 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43  ABLE");...case C
4110: 4b 41 5f 4c 4f 43 41 4c 3a 0a 09 09 09 72 65 74  KA_LOCAL:....ret
4120: 75 72 6e 28 22 43 4b 41 5f 4c 4f 43 41 4c 22 29  urn("CKA_LOCAL")
4130: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4e 45 56  ;...case CKA_NEV
4140: 45 52 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a  ER_EXTRACTABLE:.
4150: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4e  ...return("CKA_N
4160: 45 56 45 52 5f 45 58 54 52 41 43 54 41 42 4c 45  EVER_EXTRACTABLE
4170: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41  ");...case CKA_A
4180: 4c 57 41 59 53 5f 53 45 4e 53 49 54 49 56 45 3a  LWAYS_SENSITIVE:
4190: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
41a0: 41 4c 57 41 59 53 5f 53 45 4e 53 49 54 49 56 45  ALWAYS_SENSITIVE
41b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b  ");...case CKA_K
41c0: 45 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49 53 4d  EY_GEN_MECHANISM
41d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
41e0: 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49  _KEY_GEN_MECHANI
41f0: 53 4d 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  SM");...case CKA
4200: 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09  _MODIFIABLE:....
4210: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 49  return("CKA_MODI
4220: 46 49 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65  FIABLE");...case
4230: 20 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41 4d   CKA_ECDSA_PARAM
4240: 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  S:....return("CK
4250: 41 5f 45 43 44 53 41 5f 50 41 52 41 4d 53 22 29  A_ECDSA_PARAMS")
4260: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 5f  ;...case CKA_EC_
4270: 50 4f 49 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e  POINT:....return
4280: 28 22 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 22 29  ("CKA_EC_POINT")
4290: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45 43  ;...case CKA_SEC
42a0: 4f 4e 44 41 52 59 5f 41 55 54 48 3a 0a 09 09 09  ONDARY_AUTH:....
42b0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 43 4f  return("CKA_SECO
42c0: 4e 44 41 52 59 5f 41 55 54 48 22 29 3b 0a 09 09  NDARY_AUTH");...
42d0: 63 61 73 65 20 43 4b 41 5f 41 55 54 48 5f 50 49  case CKA_AUTH_PI
42e0: 4e 5f 46 4c 41 47 53 3a 0a 09 09 09 72 65 74 75  N_FLAGS:....retu
42f0: 72 6e 28 22 43 4b 41 5f 41 55 54 48 5f 50 49 4e  rn("CKA_AUTH_PIN
4300: 5f 46 4c 41 47 53 22 29 3b 0a 09 09 63 61 73 65  _FLAGS");...case
4310: 20 43 4b 41 5f 48 57 5f 46 45 41 54 55 52 45 5f   CKA_HW_FEATURE_
4320: 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TYPE:....return(
4330: 22 43 4b 41 5f 48 57 5f 46 45 41 54 55 52 45 5f  "CKA_HW_FEATURE_
4340: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TYPE");...case C
4350: 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54  KA_RESET_ON_INIT
4360: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4370: 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54 22 29  _RESET_ON_INIT")
4380: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 41 53  ;...case CKA_HAS
4390: 5f 52 45 53 45 54 3a 0a 09 09 09 72 65 74 75 72  _RESET:....retur
43a0: 6e 28 22 43 4b 41 5f 48 41 53 5f 52 45 53 45 54  n("CKA_HAS_RESET
43b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
43c0: 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44 3a 0a 09  ENDOR_DEFINED:..
43d0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45  ..return("CKA_VE
43e0: 4e 44 4f 52 5f 44 45 46 49 4e 45 44 22 29 3b 0a  NDOR_DEFINED");.
43f0: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b  .}...return("UNK
4400: 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 23 20 20 64 65  NOWN");.}..#  de
4410: 66 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29 20 43  fine malloc(x) C
4420: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4430: 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e  _MALLOC(x, __fun
4440: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23  c__, __LINE__).#
4450: 20 20 64 65 66 69 6e 65 20 72 65 61 6c 6c 6f 63    define realloc
4460: 28 78 2c 20 79 29 20 43 41 43 4b 45 59 5f 44 45  (x, y) CACKEY_DE
4470: 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43  BUG_FUNC_REALLOC
4480: 28 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c  (x, y, __func__,
4490: 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 69 66   __LINE__).#  if
44a0: 64 65 66 20 73 74 72 64 75 70 0a 23 20 20 20 20  def strdup.#    
44b0: 75 6e 64 65 66 20 73 74 72 64 75 70 0a 23 20 20  undef strdup.#  
44c0: 65 6e 64 69 66 0a 23 20 20 64 65 66 69 6e 65 20  endif.#  define 
44d0: 73 74 72 64 75 70 28 78 29 20 43 41 43 4b 45 59  strdup(x) CACKEY
44e0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44  _DEBUG_FUNC_STRD
44f0: 55 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  UP(x, __func__, 
4500: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a  __LINE__).#else.
4510: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
4520: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e  _DEBUG_PRINTF(x.
4530: 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69  ..) /**/.#  defi
4540: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4550: 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79  PRINTBUF(f, x, y
4560: 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65  ) /**/.#  define
4570: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 45   CACKEY_DEBUG_PE
4580: 52 52 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23 20 20  RROR(x) /**/.#  
4590: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
45a0: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
45b0: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
45c0: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
45d0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
45e0: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
45f0: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4600: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4610: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4620: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
4630: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
4640: 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43  LED".#  define C
4650: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4660: 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28  _APPTYPE_TO_STR(
4670: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4680: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4690: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
46a0: 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52  ATTRIBUTE_TO_STR
46b0: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
46c0: 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 73 74 72  LED".#endif..str
46d0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
46e0: 69 64 65 6e 74 69 74 79 20 7b 0a 09 75 6e 73 69  identity {..unsi
46f0: 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65 74  gned char applet
4700: 5b 37 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 66  [7];..uint16_t f
4710: 69 6c 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 65  ile;...size_t ce
4720: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
4730: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
4740: 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73 73  ertificate;...ss
4750: 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a 7d  ize_t keysize;.}
4760: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
4770: 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 73 74 72  _identity {..str
4780: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
4790: 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
47a0: 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54  dentity;...CK_AT
47b0: 54 52 49 42 55 54 45 20 2a 61 74 74 72 69 62 75  TRIBUTE *attribu
47c0: 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61  tes;..CK_ULONG a
47d0: 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
47e0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  .};..struct cack
47f0: 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e  ey_session {..in
4800: 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53  t active;...CK_S
4810: 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a  LOT_ID slotID;..
4820: 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74 65 3b  .CK_STATE state;
4830: 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  ..CK_FLAGS flags
4840: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65  ;..CK_ULONG ulDe
4850: 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56  viceError;..CK_V
4860: 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61  OID_PTR pApplica
4870: 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59  tion;..CK_NOTIFY
4880: 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75 63   Notify;...struc
4890: 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
48a0: 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  y *identities;..
48b0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
48c0: 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a  entities_count;.
48d0: 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61 63 74  ..int search_act
48e0: 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  ive;..CK_ATTRIBU
48f0: 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f 71 75  TE_PTR search_qu
4900: 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73  ery;..CK_ULONG s
4910: 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
4920: 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  t;..unsigned lon
4930: 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  g search_curr_id
4940: 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63 74  ;...int sign_act
4950: 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49  ive;..CK_MECHANI
4960: 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65 63  SM_TYPE sign_mec
4970: 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45  hanism;..CK_BYTE
4980: 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09  _PTR sign_buf;..
4990: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69  unsigned long si
49a0: 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69  gn_buflen;..unsi
49b0: 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62  gned long sign_b
49c0: 75 66 75 73 65 64 3b 0a 09 73 74 72 75 63 74 20  ufused;..struct 
49d0: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
49e0: 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a  *sign_identity;.
49f0: 0a 09 69 6e 74 20 64 65 63 72 79 70 74 5f 61 63  ..int decrypt_ac
4a00: 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e  tive;..CK_MECHAN
4a10: 49 53 4d 5f 54 59 50 45 20 64 65 63 72 79 70 74  ISM_TYPE decrypt
4a20: 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f  _mechanism;..CK_
4a30: 56 4f 49 44 5f 50 54 52 20 64 65 63 72 79 70 74  VOID_PTR decrypt
4a40: 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f  _mech_parm;..CK_
4a50: 55 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d 65  ULONG decrypt_me
4a60: 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72  ch_parmlen;..str
4a70: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
4a80: 69 74 79 20 2a 64 65 63 72 79 70 74 5f 69 64 65  ity *decrypt_ide
4a90: 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63  ntity;.};..struc
4aa0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a  t cackey_slot {.
4ab0: 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 63  .int active;...c
4ac0: 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72  har *pcsc_reader
4ad0: 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61 72  ;...int pcsc_car
4ae0: 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43  d_connected;..SC
4af0: 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f 63  ARDHANDLE pcsc_c
4b00: 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73  ard;...int trans
4b10: 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 09 69  action_depth;..i
4b20: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  nt transaction_n
4b30: 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a 0a 09 69  eed_hw_lock;...i
4b40: 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a  nt slot_reset;..
4b50: 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b 65 6e 5f  .CK_FLAGS token_
4b60: 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69 67 6e 65  flags;...unsigne
4b70: 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a  d char *label;..
4b80: 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b  .DWORD protocol;
4b90: 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  .};..typedef enu
4ba0: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  m {..CACKEY_TLV_
4bb0: 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30 78  APP_GENERIC = 0x
4bc0: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  01,..CACKEY_TLV_
4bd0: 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30 78  APP_SKI     = 0x
4be0: 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  02,..CACKEY_TLV_
4bf0: 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30 78  APP_PKI     = 0x
4c00: 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f  04.} cackey_tlv_
4c10: 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64 65  apptype;..typede
4c20: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
4c30: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52  _TLV_OBJID_GENER
4c40: 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20 30  ALINFO       = 0
4c50: 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x2000,..CACKEY_T
4c60: 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53  LV_OBJID_PROPERS
4c70: 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32  ONALINFO   = 0x2
4c80: 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  100,..CACKEY_TLV
4c90: 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e  _OBJID_ACCESSCON
4ca0: 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30 30  TROL     = 0x300
4cb0: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
4cc0: 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20  BJID_LOGIN      
4cd0: 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30 2c         = 0x4000,
4ce0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
4cf0: 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20 20  ID_CARDINFO     
4d00: 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a 09       = 0x5000,..
4d10: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
4d20: 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20 20  _BIOMETRICS     
4d30: 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43 41     = 0x6000,..CA
4d40: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44  CKEY_TLV_OBJID_D
4d50: 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20 20  IGITALSIGCERT   
4d60: 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43 4b   = 0x7000,..CACK
4d70: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
4d80: 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20 3d  _PERSON        =
4d90: 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45 59   0x0200,..CACKEY
4da0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42  _TLV_OBJID_CAC_B
4db0: 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20 30  ENEFITS      = 0
4dc0: 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54  x0202,..CACKEY_T
4dd0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48  LV_OBJID_CAC_OTH
4de0: 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78 30  ERBENEFITS = 0x0
4df0: 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  203,..CACKEY_TLV
4e00: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
4e10: 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32 30  NNEL     = 0x020
4e20: 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  1,..CACKEY_TLV_O
4e30: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54  BJID_CAC_PKICERT
4e40: 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45 0a         = 0x02FE.
4e50: 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a  } cackey_tlv_obj
4e60: 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66 20  ectid;..typedef 
4e70: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50  enum {..CACKEY_P
4e80: 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
4e90: 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41 43 4b  NT    = 1,..CACK
4ea0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
4eb0: 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a 09            = 0,..
4ec0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
4ed0: 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 3d 20  NERIC         = 
4ee0: 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -1,..CACKEY_PCSC
4ef0: 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 20 20  _E_BADPIN       
4f00: 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b 45 59     = -2,..CACKEY
4f10: 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 20 20  _PCSC_E_LOCKED  
4f20: 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a 09 43          = -3,..C
4f30: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45  ACKEY_PCSC_E_NEE
4f40: 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d 20 2d  DLOGIN       = -
4f50: 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  4,..CACKEY_PCSC_
4f60: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 20  E_TOKENABSENT   
4f70: 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45 59 5f    = -6,..CACKEY_
4f80: 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20 20 20  PCSC_E_RETRY    
4f90: 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20 63 61         = -7.} ca
4fa0: 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63  ckey_ret;..struc
4fb0: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72  t cackey_tlv_car
4fc0: 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64  durl {..unsigned
4fd0: 20 63 68 61 72 20 20 20 20 20 20 20 20 72 69 64   char        rid
4fe0: 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  [5];..cackey_tlv
4ff0: 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 74 79  _apptype   appty
5000: 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f  pe;..cackey_tlv_
5010: 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 74  objectid  object
5020: 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f  id;..cackey_tlv_
5030: 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 64 3b  objectid  appid;
5040: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
5050: 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b         pinid;.};
5060: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5070: 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75  tlv_entity;.stru
5080: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
5090: 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20  tity {..uint8_t 
50a0: 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  tag;..size_t len
50b0: 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09  gth;...union {..
50c0: 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09  .void *value;...
50d0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
50e0: 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 65  v_cardurl *value
50f0: 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74  _cardurl;...uint
5100: 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a  8_t value_byte;.
5110: 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63  .};...struct cac
5120: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
5130: 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41  _next;.};../* CA
5140: 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64  CKEY Global Hand
5150: 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  les */.static vo
5160: 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f  id *cackey_biglo
5170: 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69  ck = NULL;.stati
5180: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
5190: 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73  session cackey_s
51a0: 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74  essions[128];.st
51b0: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
51c0: 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73  ey_slot cackey_s
51d0: 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69  lots[128];.stati
51e0: 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69  c int cackey_ini
51f0: 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74  tialized = 0;.st
5200: 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
5210: 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30  biglock_init = 0
5220: 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a  ;.CK_C_INITIALIZ
5230: 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61 72  E_ARGS cackey_ar
5240: 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20 63  gs;../** Extra c
5250: 65 72 74 69 66 69 63 61 74 65 73 20 74 6f 20 69  ertificates to i
5260: 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e 20  nclude in token 
5270: 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63 6b 65  **/.struct cacke
5280: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
5290: 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d 20  extra_certs[] = 
52a0: 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 63 6b  {.#include "cack
52b0: 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74 73  ey_builtin_certs
52c0: 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50 43 53 43 20  .h".};../* PCSC 
52d0: 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a  Global Handles *
52e0: 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52 44  /.static LPSCARD
52f0: 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f 70  CONTEXT cackey_p
5300: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
5310: 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  L;..static unsig
5320: 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f  ned long cackey_
5330: 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  getversion(void)
5340: 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69 67   {..static unsig
5350: 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20  ned long retval 
5360: 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65 64  = 255;..unsigned
5370: 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 3b   long major = 0;
5380: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
5390: 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61 72  minor = 0;..char
53a0: 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e 55   *major_str = NU
53b0: 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f 72  LL;..char *minor
53c0: 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43  _str = NULL;...C
53d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
53e0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
53f0: 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 32  .if (retval != 2
5400: 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  55) {...CACKEY_D
5410: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
5420: 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63 61  urning 0x%lx (ca
5430: 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c 29  ched).", retval)
5440: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74 76  ;....return(retv
5450: 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c  al);..}...retval
5460: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50 41   = 0;..#ifdef PA
5470: 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20 20  CKAGE_VERSION.  
5480: 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72 20        major_str 
5490: 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  = PACKAGE_VERSIO
54a0: 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73 74  N;..if (major_st
54b0: 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d 61  r) {..        ma
54c0: 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 61  jor = strtoul(ma
54d0: 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 5f  jor_str, &minor_
54e0: 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66 20  str, 10);....if 
54f0: 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 09  (minor_str) {...
5500: 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75 6c  .minor = strtoul
5510: 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c 20  (minor_str + 1, 
5520: 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a 09  NULL, 10);...}..
5530: 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d 61  }...retval = (ma
5540: 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d 69  jor << 16) | (mi
5550: 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 69  nor << 8);.#endi
5560: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
5570: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
5580: 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76 61  ng 0x%lx", retva
5590: 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
55a0: 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53  val);.}../* PC/S
55b0: 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69  C Related Functi
55c0: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e  ons */./*. * SYN
55d0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69  POSIS. *     voi
55e0: 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  d cackey_slots_d
55f0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f  isconnect_all(vo
5600: 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  id);. *. * ARGUM
5610: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ENTS. *     None
5620: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
5630: 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  LUE. *     None.
5640: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
5650: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
5660: 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f   disconnects fro
5670: 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a 0a  m all cards.. *.
5680: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
5690: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
56a0: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64  connect_all(void
56b0: 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64  ) {..uint32_t id
56c0: 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
56d0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
56e0: 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20  .");...for (idx 
56f0: 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
5700: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
5710: 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
5720: 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78  _slots[0])); idx
5730: 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
5740: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
5750: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
5760: 64 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  d) {....CACKEY_D
5770: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
5780: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75  rdDisconnect(%lu
5790: 29 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69  ) called", (unsi
57a0: 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b  gned long) idx);
57b0: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
57c0: 6e 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74  nect(cackey_slot
57d0: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
57e0: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
57f0: 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  RD);...}....if (
5800: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
5810: 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 66 72  ].label) {....fr
5820: 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
5830: 69 64 78 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09  idx].label);....
5840: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
5850: 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  x].label = NULL;
5860: 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
5870: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63  lots[idx].pcsc_c
5880: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
5890: 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
58a0: 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
58b0: 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09  on_depth = 0;...
58c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
58d0: 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ].transaction_ne
58e0: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
58f0: 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
5900: 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ots[idx].active)
5910: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
5920: 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69  UG_PRINTF("Marki
5930: 6e 67 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25  ng active slot %
5940: 6c 75 20 61 73 20 62 65 69 6e 67 20 72 65 73 65  lu as being rese
5950: 74 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t", (unsigned lo
5960: 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d 0a 0a 09  ng) idx);...}...
5970: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
5980: 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  x].slot_reset = 
5990: 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  1;..}...CACKEY_D
59a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
59b0: 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75  urning");...retu
59c0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
59d0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
59e0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
59f0: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64  csc_connect(void
5a00: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
5a10: 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  TS. *     None. 
5a20: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
5a30: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
5a40: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
5a50: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
5a60: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
5a70: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
5a80: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
5a90: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
5aa0: 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20  nction connects 
5ab0: 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e  to the PC/SC Con
5ac0: 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20  nection Manager 
5ad0: 61 6e 64 20 75 70 64 61 74 65 73 20 74 68 65 0a  and updates the.
5ae0: 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c 20 68 61   *     global ha
5af0: 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  ndle.. *. */.sta
5b00: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
5b10: 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
5b20: 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47  ct(void) {..LONG
5b30: 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65   scard_est_conte
5b40: 78 74 5f 72 65 74 3b 0a 23 69 66 64 65 66 20 48  xt_ret;.#ifdef H
5b50: 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44  AVE_SCARDISVALID
5b60: 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63  CONTEXT..LONG sc
5b70: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b  ard_isvalid_ret;
5b80: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
5b90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
5ba0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
5bb0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
5bc0: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le == NULL) {...
5bd0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
5be0: 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  le = malloc(size
5bf0: 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  of(*cackey_pcsc_
5c00: 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69 66 20 28  handle));...if (
5c10: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
5c20: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le == NULL) {...
5c30: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5c40: 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61  INTF("Call to ma
5c50: 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 2c 20 72  lloc() failed, r
5c60: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
5c70: 75 72 65 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ure");.....cacke
5c80: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
5c90: 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65  ct_all();.....re
5ca0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
5cb0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
5cc0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
5cd0: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73  _PRINTF("SCardEs
5ce0: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29  tablishContext()
5cf0: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61   called");...sca
5d00: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
5d10: 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c  et = SCardEstabl
5d20: 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44  ishContext(SCARD
5d30: 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e  _SCOPE_SYSTEM, N
5d40: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65  ULL, NULL, cacke
5d50: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
5d60: 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f  ..if (scard_est_
5d70: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53  context_ret != S
5d80: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
5d90: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
5da0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74  G_PRINTF("Call t
5db0: 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  o SCardEstablish
5dc0: 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28  Context failed (
5dd0: 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29  returned %s/%li)
5de0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
5df0: 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f  ailure", CACKEY_
5e00: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
5e10: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
5e20: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
5e30: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
5e40: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
5e50: 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65  ;.....free(cacke
5e60: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
5e70: 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
5e80: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  andle = NULL;...
5e90: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
5ea0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
5eb0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
5ec0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
5ed0: 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  C);...}..}..#ifd
5ee0: 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56  ef HAVE_SCARDISV
5ef0: 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43 41 43  ALIDCONTEXT..CAC
5f00: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
5f10: 28 22 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f  ("SCardIsValidCo
5f20: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29  ntext() called")
5f30: 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c 69 64  ;..scard_isvalid
5f40: 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73 56 61  _ret = SCardIsVa
5f50: 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b  lidContext(*cack
5f60: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
5f70: 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73 76 61  ..if (scard_isva
5f80: 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41 52 44  lid_ret != SCARD
5f90: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
5fa0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5fb0: 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20  NTF("Handle has 
5fc0: 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28  become invalid (
5fd0: 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74  SCardIsValidCont
5fe0: 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74  ext = %s/%li), t
5ff0: 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73 74 61  rying to re-esta
6000: 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45  blish...", CACKE
6010: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
6020: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
6030: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 2c  rd_isvalid_ret),
6040: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 69 73   (long) scard_is
6050: 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43  valid_ret);....C
6060: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6070: 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69  TF("SCardEstabli
6080: 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c  shContext() call
6090: 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73  ed");...scard_es
60a0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20  t_context_ret = 
60b0: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
60c0: 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50  ntext(SCARD_SCOP
60d0: 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20  E_SYSTEM, NULL, 
60e0: 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73  NULL, cackey_pcs
60f0: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20  c_handle);...if 
6100: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
6110: 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  xt_ret != SCARD_
6120: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
6130: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6140: 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61  NTF("Call to SCa
6150: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6160: 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72  xt failed (retur
6170: 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74  ned %s/%li), ret
6180: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
6190: 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  e", CACKEY_DEBUG
61a0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
61b0: 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f  O_STR(scard_est_
61c0: 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c  context_ret), (l
61d0: 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63  ong) scard_est_c
61e0: 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09  ontext_ret);....
61f0: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73  .free(cackey_pcs
6200: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61  c_handle);....ca
6210: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6220: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63   = NULL;.....cac
6230: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
6240: 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09  nect_all();.....
6250: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
6260: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
6270: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
6280: 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c  UG_PRINTF("Handl
6290: 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d 65 73  e has been re-es
62a0: 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09 7d 0a  tablished");..}.
62b0: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
62c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
62d0: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63  cessfully connec
62e0: 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20 72 65  ted to PC/SC, re
62f0: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
6300: 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  ss");...return(C
6310: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
6320: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
6330: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
6340: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73  y_ret cackey_pcs
6350: 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69  c_disconnect(voi
6360: 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  d);. *. * ARGUME
6370: 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  NTS. *     None.
6380: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
6390: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
63a0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
63b0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
63c0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
63d0: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
63e0: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
63f0: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
6400: 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65  unction disconne
6410: 63 74 73 20 66 72 6f 6d 20 74 68 65 20 50 43 2f  cts from the PC/
6420: 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  SC Connection ma
6430: 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65  nager and update
6440: 73 0a 20 2a 20 20 20 20 20 74 68 65 20 67 6c 6f  s. *     the glo
6450: 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20  bal handle.. *. 
6460: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
6470: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
6480: 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64  _disconnect(void
6490: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
64a0: 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b  rel_context_ret;
64b0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
64c0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
64d0: 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
64e0: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e  pcsc_handle == N
64f0: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
6500: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
6510: 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 72 65  );..}...scard_re
6520: 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20  l_context_ret = 
6530: 53 43 61 72 64 52 65 6c 65 61 73 65 43 6f 6e 74  SCardReleaseCont
6540: 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ext(*cackey_pcsc
6550: 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 28  _handle);...if (
6560: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6570: 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63  le) {...free(cac
6580: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6590: 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70 63 73  ;.....cackey_pcs
65a0: 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b  c_handle = NULL;
65b0: 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f  ..}...if (scard_
65c0: 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  rel_context_ret 
65d0: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
65e0: 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43  SS) {...return(C
65f0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6600: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  ERIC);..}...retu
6610: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
6620: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
6630: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76  YNPOSIS. *     v
6640: 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  oid cackey_mark_
6650: 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75 63  slot_reset(struc
6660: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
6670: 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  lot);. *. * ARGU
6680: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
6690: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
66a0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
66b0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
66c0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
66d0: 6e 20 6d 61 72 6b 73 20 61 20 73 6c 6f 74 20 68  n marks a slot h
66e0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 72  as having been r
66f0: 65 73 65 74 2c 20 74 6f 20 6c 61 74 65 72 20 62  eset, to later b
6700: 65 20 63 6c 65 61 6e 65 64 20 75 70 2e 0a 20 2a  e cleaned up.. *
6710: 20 20 20 20 20 43 6c 65 61 6e 75 70 20 6f 6e 6c       Cleanup onl
6720: 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  y happens when a
6730: 20 50 4b 43 53 23 31 31 20 63 6c 69 65 6e 74 20   PKCS#11 client 
6740: 63 61 6c 6c 73 20 43 5f 46 69 6e 64 4f 62 6a 65  calls C_FindObje
6750: 63 74 73 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a  ctsInit.. *. */.
6760: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
6770: 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
6780: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
6790: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
67a0: 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c  if (slot == NULL
67b0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
67c0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
67d0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
67e0: 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70  );...if (slot->p
67f0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
6800: 65 64 29 20 7b 0a 09 09 53 43 61 72 64 44 69 73  ed) {...SCardDis
6810: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
6820: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c  sc_card, SCARD_L
6830: 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a  EAVE_CARD);..}..
6840: 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65  .slot->slot_rese
6850: 74 20 3d 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63  t = 1;..slot->pc
6860: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
6870: 64 20 3d 20 30 3b 0a 09 73 6c 6f 74 2d 3e 74 6f  d = 0;..slot->to
6880: 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
6890: 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
68a0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
68b0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
68c0: 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  .");...return;.}
68d0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
68e0: 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20 63 61 63  . *     LONG cac
68f0: 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61  key_reconnect_ca
6900: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  rd(struct cackey
6910: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f  _slot *slot, DWO
6920: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f  RD default_proto
6930: 63 6f 6c 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c  col, LPDWORD sel
6940: 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b  ected_protocol);
6950: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
6960: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
6970: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
6980: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
6990: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
69a0: 0a 20 2a 20 20 20 20 20 44 57 4f 52 44 20 64 65  . *     DWORD de
69b0: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a 20  fault_protocol. 
69c0: 2a 20 20 20 20 20 20 20 20 20 50 72 6f 74 6f 63  *         Protoc
69d0: 6f 6c 20 74 6f 20 61 74 74 65 6d 70 74 20 66 69  ol to attempt fi
69e0: 72 73 74 0a 20 2a 0a 20 2a 20 20 20 20 20 4c 50  rst. *. *     LP
69f0: 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f 70  DWORD selected_p
6a00: 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20  rotocol. *      
6a10: 20 20 20 5b 4f 55 54 5d 20 50 72 6f 74 6f 63 6f     [OUT] Protoco
6a20: 6c 20 73 65 6c 65 63 74 65 64 0a 20 2a 0a 20 2a  l selected. *. *
6a30: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
6a40: 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e 20       The return 
6a50: 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72 64  value from SCard
6a60: 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20  Reconnect(). *. 
6a70: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
6a80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6a90: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
6aa0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
6ab0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65 20  ). *. *     The 
6ac0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
6ad0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
6ae0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 69  ill be called fi
6af0: 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a 20  rst with the. * 
6b00: 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64 50      dwPreferredP
6b10: 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65 66  rotocols of "def
6b20: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20  ault_protocol". 
6b30: 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72 65   If that call re
6b40: 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43 41  turns. *     SCA
6b50: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
6b60: 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77 69  TCH try again wi
6b70: 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f 66  th a protocol of
6b80: 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69 6e   T=0, and failin
6b90: 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54 3d  g. *     that T=
6ba0: 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  1.. *. */.static
6bb0: 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63   LONG cackey_rec
6bc0: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
6bd0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
6be0: 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61  slot, DWORD defa
6bf0: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50  ult_protocol, LP
6c00: 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f 70  DWORD selected_p
6c10: 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 4c 4f 4e 47  rotocol) {..LONG
6c20: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b   scard_conn_ret;
6c30: 0a 0a 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
6c40: 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  t = SCardReconne
6c50: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
6c60: 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  rd, SCARD_SHARE_
6c70: 53 48 41 52 45 44 2c 20 64 65 66 61 75 6c 74 5f  SHARED, default_
6c80: 70 72 6f 74 6f 63 6f 6c 2c 20 53 43 41 52 44 5f  protocol, SCARD_
6c90: 52 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65  RESET_CARD, sele
6ca0: 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a  cted_protocol);.
6cb0: 0a 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
6cc0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
6cd0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
6ce0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
6cf0: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65  _PRINTF("SCardRe
6d00: 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  connect() return
6d10: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
6d20: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
6d30: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22  g with just T=0"
6d40: 29 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  )...scard_conn_r
6d50: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
6d60: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
6d70: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
6d80: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
6d90: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52  ROTOCOL_T0, SCAR
6da0: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 73 65  D_RESET_CARD, se
6db0: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29  lected_protocol)
6dc0: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  ;....if (scard_c
6dd0: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
6de0: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
6df0: 48 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  H) {....CACKEY_D
6e00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
6e10: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72 65  rdReconnect() re
6e20: 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50  turned SCARD_E_P
6e30: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74  ROTO_MISMATCH, t
6e40: 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20  rying with just 
6e50: 54 3d 31 22 29 0a 09 09 09 73 63 61 72 64 5f 63  T=1")....scard_c
6e60: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52  onn_ret = SCardR
6e70: 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  econnect(slot->p
6e80: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
6e90: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
6ea0: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
6eb0: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
6ec0: 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  D, selected_prot
6ed0: 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  ocol);...}..}...
6ee0: 72 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e  return(scard_con
6ef0: 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  n_ret);.}../*. *
6f00: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
6f10: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
6f20: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
6f30: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6f40: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
6f50: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
6f60: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
6f70: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
6f80: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
6f90: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
6fa0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
6fb0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
6fc0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
6fd0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
6fe0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6ff0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
7000: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
7010: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
7020: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
7030: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
7040: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
7050: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
7060: 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63  .cackey_ret pcsc
7070: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44  _connect_ret;..D
7080: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  WORD protocol;..
7090: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f  LONG scard_conn_
70a0: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
70b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
70c0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
70d0: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
70e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
70f0: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
7100: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
7110: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
7120: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7130: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7140: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
7150: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
7160: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
7170: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
7180: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
7190: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
71a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
71b0: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
71c0: 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65  PC/SC failed, re
71d0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
71e0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
71f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7200: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
7210: 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65  Connect to reade
7220: 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  r, if needed */.
7230: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63  .if (!slot->pcsc
7240: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
7250: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7260: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
7270: 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65  onnect(%s) calle
7280: 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  d", slot->pcsc_r
7290: 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64 5f  eader);...scard_
72a0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
72b0: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f  Connect(*cackey_
72c0: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f  pcsc_handle, slo
72d0: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  t->pcsc_reader, 
72e0: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
72f0: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
7300: 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52  OL_T0 | SCARD_PR
7310: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
7320: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
7330: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28  otocol);....if (
7340: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7350: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
7360: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 43  MISMATCH) {....C
7370: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7380: 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74  TF("SCardConnect
7390: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
73a0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
73b0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
73c0: 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 73 63  just T=0")....sc
73d0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
73e0: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
73f0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
7400: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
7410: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
7420: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
7430: 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74  OTOCOL_T0, &slot
7440: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
7450: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20  otocol);.....if 
7460: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7470: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
7480: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09  _MISMATCH) {....
7490: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
74a0: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
74b0: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
74c0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
74d0: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
74e0: 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09  h just T=1")....
74f0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
7500: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
7510: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
7520: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
7530: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
7540: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
7550: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73  _PROTOCOL_T1, &s
7560: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
7570: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 7d  &protocol);....}
7580: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72  ...}....if (scar
7590: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
75a0: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f  ARD_W_UNPOWERED_
75b0: 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
75c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
75d0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
75e0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 57 5f  eturned SCARD_W_
75f0: 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 2c 20  UNPOWERED_CARD, 
7600: 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63 6f 6e  trying to re-con
7610: 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  nect...");.....s
7620: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
7630: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
7640: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7650: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
7660: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
7670: 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44 5f 50  _DIRECT, SCARD_P
7680: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41  ROTOCOL_T0 | SCA
7690: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
76a0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
76b0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
76c0: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
76d0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
76e0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
76f0: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
7700: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
7710: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
7720: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
7730: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
7740: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22  g with just T=0"
7750: 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ).....scard_conn
7760: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
7770: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
7780: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
7790: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
77a0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
77b0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
77c0: 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  0, &slot->pcsc_c
77d0: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
77e0: 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f  ......if (scard_
77f0: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
7800: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
7810: 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  CH) {......CACKE
7820: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7830: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
7840: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
7850: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
7860: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
7870: 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63 61 72   T=1")......scar
7880: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7890: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
78a0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
78b0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
78c0: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
78d0: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
78e0: 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e  OCOL_T1, &slot->
78f0: 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74  pcsc_card, &prot
7900: 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09  ocol);.....}....
7910: 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  }.....scard_conn
7920: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65  _ret = cackey_re
7930: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
7940: 74 2c 20 70 72 6f 74 6f 63 6f 6c 2c 20 26 70 72  t, protocol, &pr
7950: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 09  otocol);...}....
7960: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
7970: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
7980: 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b  CCESS) {....CACK
7990: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
79a0: 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 63  "Connection to c
79b0: 61 72 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ard failed, retu
79c0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
79d0: 20 28 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29   (SCardConnect()
79e0: 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43   = %s/%li)", CAC
79f0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
7a00: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
7a10: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20  card_conn_ret), 
7a20: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 63 6f 6e  (long) scard_con
7a30: 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 72 65 74 75  n_ret);.....retu
7a40: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
7a50: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a  _GENERIC);...}..
7a60: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  ..slot->pcsc_car
7a70: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 31 3b  d_connected = 1;
7a80: 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
7a90: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a  tion_depth = 0;.
7aa0: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
7ab0: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
7ac0: 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72   = 0;...slot->pr
7ad0: 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f  otocol = protoco
7ae0: 6c 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43  l;..}...return(C
7af0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
7b00: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
7b10: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
7b20: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67  y_ret cackey_beg
7b30: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
7b40: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7b50: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
7b60: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
7b70: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
7b80: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
7b90: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
7ba0: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54  nds to. *. * RET
7bb0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
7bc0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
7bd0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
7be0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
7bf0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7c00: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
7c10: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
7c20: 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
7c30: 20 73 68 6f 75 6c 64 20 62 65 20 74 65 72 6d 69   should be termi
7c40: 6e 61 74 65 64 20 75 73 69 6e 67 20 22 63 61 63  nated using "cac
7c50: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
7c60: 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  ion". *. */.stat
7c70: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
7c80: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
7c90: 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61  action(struct ca
7ca0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
7cb0: 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 63   {..cackey_ret c
7cc0: 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b 0a  ackey_conn_ret;.
7cd0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e  .LONG scard_tran
7ce0: 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  s_ret;...CACKEY_
7cf0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
7d00: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61 63 6b 65  lled.");...cacke
7d10: 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63  y_conn_ret = cac
7d20: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
7d30: 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 63 61 63  (slot);..if (cac
7d40: 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20  key_conn_ret != 
7d50: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
7d60: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
7d70: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
7d80: 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20  e to connect to 
7d90: 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
7da0: 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72  in error");....r
7db0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
7dc0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
7dd0: 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
7de0: 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a 09  tion_depth++;...
7df0: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
7e00: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 31 20  ction_depth > 1 
7e10: 26 26 20 21 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  && !slot->transa
7e20: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
7e30: 63 6b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ck) {...CACKEY_D
7e40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 6c 72  EBUG_PRINTF("Alr
7e50: 65 61 64 79 20 69 6e 20 61 20 74 72 61 6e 73 61  eady in a transa
7e60: 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72 6d 69 6e  ction, performin
7e70: 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28 6e 65 77  g no action (new
7e80: 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73   depth = %i)", s
7e90: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
7ea0: 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75  _depth);....retu
7eb0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
7ec0: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d  _OK);..}...slot-
7ed0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
7ee0: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a  d_hw_lock = 0;..
7ef0: 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  .scard_trans_ret
7f00: 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54 72 61   = SCardBeginTra
7f10: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70  nsaction(slot->p
7f20: 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 20 28  csc_card);..if (
7f30: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20  scard_trans_ret 
7f40: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
7f50: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  SS) {...CACKEY_D
7f60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
7f70: 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 72 61  ble to begin tra
7f80: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
7f90: 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a  ing in error");.
7fa0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
7fb0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
7fc0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
7fd0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65  BUG_PRINTF("Suce
7fe0: 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 74 72  ssfully began tr
7ff0: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f  ansaction on slo
8000: 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70  t (%s)", slot->p
8010: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72  csc_reader);...r
8020: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8030: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
8040: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
8050: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
8060: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
8070: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
8080: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
8090: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
80a0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
80b0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
80c0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
80d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
80e0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
80f0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
8100: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
8110: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
8120: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
8130: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
8140: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
8150: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
8160: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22 63 61  ion requires "ca
8170: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
8180: 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 63 61  action" to be ca
8190: 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a  lled first. *. *
81a0: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
81b0: 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ret cackey_end_t
81c0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
81d0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
81e0: 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  lot) {..LONG sca
81f0: 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09  rd_trans_ret;...
8200: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8210: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
8220: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73  ..if (!slot->pcs
8230: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
8240: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
8250: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20  UG_PRINTF("Card 
8260: 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64  is not connected
8270: 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20  , unable to end 
8280: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 63  transaction on c
8290: 61 72 64 22 29 3b 0a 0a 09 09 69 66 20 28 73 6c  ard");....if (sl
82a0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
82b0: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
82c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
82d0: 4e 54 46 28 22 44 65 63 72 65 61 73 69 6e 67 20  NTF("Decreasing 
82e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 65 70 74  transaction dept
82f0: 68 20 61 6e 64 20 61 73 6b 69 6e 67 20 66 6f 72  h and asking for
8300: 20 61 20 68 61 72 64 77 61 72 65 20 6c 6f 63 6b   a hardware lock
8310: 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 62 65 67   on the next beg
8320: 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  in transaction (
8330: 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d 20  current depth = 
8340: 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e  %i)", slot->tran
8350: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a  saction_depth);.
8360: 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
8370: 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a  ction_depth--;..
8380: 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
8390: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
83a0: 20 30 29 20 7b 0a 09 09 09 09 73 6c 6f 74 2d 3e   0) {.....slot->
83b0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
83c0: 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09  _hw_lock = 1;...
83d0: 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  .}...}....return
83e0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
83f0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66  ENERIC);..}...if
8400: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
8410: 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20 30 29 20  ion_depth == 0) 
8420: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
8430: 5f 50 52 49 4e 54 46 28 22 54 65 72 6d 69 6e 61  _PRINTF("Termina
8440: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
8450: 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  on that has not 
8460: 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09 72 65 74  begun!");....ret
8470: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8480: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
8490: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
84a0: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 69 66  on_depth--;...if
84b0: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
84c0: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
84d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
84e0: 50 52 49 4e 54 46 28 22 54 72 61 6e 73 61 63 74  PRINTF("Transact
84f0: 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e 20 70 72  ions still in pr
8500: 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74 65 72 6d  ogress, not term
8510: 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61 72 64 20  inating on-card 
8520: 54 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72  Transaction (cur
8530: 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29  rent depth = %i)
8540: 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ", slot->transac
8550: 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09  tion_depth);....
8560: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8570: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73  SC_S_OK);..}...s
8580: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d  card_trans_ret =
8590: 20 53 43 61 72 64 45 6e 64 54 72 61 6e 73 61 63   SCardEndTransac
85a0: 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  tion(slot->pcsc_
85b0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
85c0: 45 5f 43 41 52 44 29 3b 0a 09 69 66 20 28 73 63  E_CARD);..if (sc
85d0: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d  ard_trans_ret !=
85e0: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
85f0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
8600: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
8610: 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63  e to end transac
8620: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20  tion, returning 
8630: 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72  in error");....r
8640: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8650: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
8660: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8670: 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75  PRINTF("Sucessfu
8680: 6c 6c 79 20 74 65 72 6d 69 6e 61 74 65 64 20 74  lly terminated t
8690: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c  ransaction on sl
86a0: 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e  ot (%s)", slot->
86b0: 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
86c0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
86d0: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20  SC_S_OK);.}../* 
86e0: 41 50 44 55 20 52 65 6c 61 74 65 64 20 46 75 6e  APDU Related Fun
86f0: 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20  ctions */./*. * 
8700: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
8710: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8720: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75  y_send_apdu(stru
8730: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
8740: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
8750: 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67  har class, unsig
8760: 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63  ned char instruc
8770: 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63  tion, unsigned c
8780: 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64  har p1, unsigned
8790: 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e   char p2, unsign
87a0: 65 64 20 63 68 61 72 20 6c 63 2c 20 75 6e 73 69  ed char lc, unsi
87b0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c  gned char *data,
87c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
87d0: 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73  e, uint16_t *res
87e0: 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20  pcode, unsigned 
87f0: 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20  char *respdata, 
8800: 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61  size_t *respdata
8810: 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  _len);. *. * ARG
8820: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
8830: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
8840: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
8850: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
8860: 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e   to. *. *     un
8870: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73  signed char clas
8880: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  s. *         APD
8890: 55 20 43 6c 61 73 73 20 28 47 53 43 49 53 5f 43  U Class (GSCIS_C
88a0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 6f 72 20  LASS_ISO7816 or 
88b0: 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42  GSCIS_CLASS_GLOB
88c0: 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20  AL_PLATFORM. *  
88d0: 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79 29 2c         usually),
88e0: 20 28 43 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20   (CLA). *. *    
88f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
8900: 6e 73 74 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20  nstruction. *   
8910: 20 20 20 20 20 20 41 50 44 55 20 49 6e 73 74 72        APDU Instr
8920: 75 63 74 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a  uction (INS). *.
8930: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
8940: 63 68 61 72 20 70 31 0a 20 2a 20 20 20 20 20 20  char p1. *      
8950: 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74 65     APDU Paramete
8960: 72 20 31 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20  r 1 (P1). *. *  
8970: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
8980: 20 70 32 0a 20 2a 20 20 20 20 20 20 20 20 20 41   p2. *         A
8990: 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 32 20  PDU Parameter 2 
89a0: 28 50 32 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75  (P2). *. *     u
89b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 0a  nsigned char lc.
89c0: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
89d0: 4c 65 6e 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e  Length of Conten
89e0: 74 20 28 4c 63 29 20 2d 2d 20 74 68 69 73 20 69  t (Lc) -- this i
89f0: 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  s the length of 
8a00: 22 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20  "data". *       
8a10: 20 20 70 61 72 61 6d 65 74 65 72 2e 20 20 49 66    parameter.  If
8a20: 20 22 64 61 74 61 22 20 69 73 20 73 70 65 63 69   "data" is speci
8a30: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
8a40: 69 73 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c  is parameter wil
8a50: 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20  l. *         be 
8a60: 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20  ignored.. *. *  
8a70: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
8a80: 20 2a 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20   *data. *       
8a90: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66    Pointer to buf
8aa0: 66 65 72 20 74 6f 20 73 65 6e 64 2e 20 20 49 74  fer to send.  It
8ab0: 20 73 68 6f 75 6c 64 20 62 65 20 22 4c 63 22 20   should be "Lc" 
8ac0: 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a  bytes long.  If.
8ad0: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69   *         speci
8ae0: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c  fied as NULL, "L
8af0: 63 22 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  c" will not be s
8b00: 65 6e 74 2c 20 61 6e 64 20 74 68 69 73 20 62 75  ent, and this bu
8b10: 66 66 65 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20  ffer will be. * 
8b20: 20 20 20 20 20 20 20 20 69 67 6e 6f 72 65 64 2e          ignored.
8b30: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
8b40: 6e 65 64 20 63 68 61 72 20 6c 65 0a 20 2a 20 20  ned char le. *  
8b50: 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67         APDU Leng
8b60: 74 68 20 6f 66 20 45 78 70 65 63 74 61 74 69 6f  th of Expectatio
8b70: 6e 20 28 4c 65 29 20 2d 2d 20 74 68 69 73 20 69  n (Le) -- this i
8b80: 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  s the length of 
8b90: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 65  the. *         e
8ba0: 78 70 65 63 74 65 64 20 72 65 70 6c 79 2e 20 20  xpected reply.  
8bb0: 49 66 20 74 68 69 73 20 69 73 20 73 70 65 63 69  If this is speci
8bc0: 66 69 65 64 20 61 73 20 30 20 74 68 65 6e 20 69  fied as 0 then i
8bd0: 74 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20  t will not. *   
8be0: 20 20 20 20 20 20 62 65 20 73 65 6e 74 2e 0a 20        be sent.. 
8bf0: 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f  *. *     uint16_
8c00: 74 20 2a 72 65 73 70 63 6f 64 65 0a 20 2a 20 20  t *respcode. *  
8c10: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69         [OUT] Poi
8c20: 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20  nter to storage 
8c30: 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65  of APDU response
8c40: 20 63 6f 64 65 2e 20 20 49 66 20 74 68 69 73 20   code.  If this 
8c50: 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70  is. *         sp
8c60: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
8c70: 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 63 6f   the response co
8c80: 64 65 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61  de will be disca
8c90: 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  rded.. *. *     
8ca0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
8cb0: 65 73 70 64 61 74 61 0a 20 2a 20 20 20 20 20 20  espdata. *      
8cc0: 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72     [OUT] Pointer
8cd0: 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41   to storage of A
8ce0: 50 44 55 20 72 65 73 70 6f 6e 73 65 20 64 61 74  PDU response dat
8cf0: 61 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a 20  a.  If this is. 
8d00: 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66  *         specif
8d10: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65  ied as NULL, the
8d20: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 77   response data w
8d30: 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65 64  ill be discarded
8d40: 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20  .  If. *        
8d50: 20 74 68 65 20 22 72 65 73 70 64 61 74 61 5f 6c   the "respdata_l
8d60: 65 6e 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  en" parameter is
8d70: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
8d80: 4c 4c 2c 20 74 68 69 73 20 62 75 66 66 65 72 0a  LL, this buffer.
8d90: 20 2a 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20   *         will 
8da0: 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 2e 0a  not be updated..
8db0: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
8dc0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20   *respdata_len. 
8dd0: 2a 20 20 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f  *         [IN, O
8de0: 55 54 5d 20 50 6f 69 6e 74 65 72 20 69 6e 69 74  UT] Pointer init
8df0: 69 61 6c 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  ialing containin
8e00: 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  g the size of th
8e10: 65 20 22 72 65 73 70 64 61 74 61 22 0a 20 2a 20  e "respdata". * 
8e20: 20 20 20 20 20 20 20 20 62 75 66 66 65 72 2e 20          buffer. 
8e30: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
8e40: 67 2c 20 74 68 65 20 70 6f 69 6e 74 65 64 20 74  g, the pointed t
8e50: 6f 20 76 61 6c 75 65 20 69 73 20 75 70 64 61 74  o value is updat
8e60: 65 64 20 74 6f 20 74 68 65 0a 20 2a 20 20 20 20  ed to the. *    
8e70: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 62       number of b
8e80: 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ytes written to 
8e90: 74 68 65 20 62 75 66 66 65 72 2e 20 20 49 66 20  the buffer.  If 
8ea0: 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65  this is specifie
8eb0: 64 20 61 73 0a 20 2a 20 20 20 20 20 20 20 20 20  d as. *         
8ec0: 4e 55 4c 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f  NULL, it will no
8ed0: 74 20 62 65 20 75 70 64 61 74 65 64 2c 20 61 6e  t be updated, an
8ee0: 64 20 22 72 65 73 70 64 61 74 61 22 20 77 69 6c  d "respdata" wil
8ef0: 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 63 61 75  l be ignored cau
8f00: 73 69 6e 67 0a 20 2a 20 20 20 20 20 20 20 20 20  sing. *         
8f10: 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74  the response dat
8f20: 61 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  a to be discarde
8f30: 64 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  d.. *. * RETURN 
8f40: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
8f50: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
8f60: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
8f70: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
8f80: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
8f90: 20 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a       On error. *
8fa0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
8fb0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20  _E_TOKENABSENT  
8fc0: 49 66 20 74 68 65 20 73 65 6e 64 69 6e 67 20 66  If the sending f
8fd0: 61 69 6c 65 64 20 62 65 63 61 75 73 65 20 74 68  ailed because th
8fe0: 65 20 74 6f 6b 65 6e 20 69 73 0a 20 2a 20 20 20  e token is. *   
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 62 73               abs
9010: 65 6e 74 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ent. *. * NOTES.
9020: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
9030: 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63  tion will connec
9040: 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43  t to the PC/SC C
9050: 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65  onnection Manage
9060: 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61 63  r via. *     cac
9070: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
9080: 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a  () if needed.. *
9090: 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c 20  . *     It will 
90a0: 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63  connect to the c
90b0: 61 72 64 20 69 6e 20 74 68 65 20 72 65 61 64 65  ard in the reade
90c0: 72 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  r attached to th
90d0: 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70  e slot. *     sp
90e0: 65 63 69 66 69 65 64 2e 20 20 49 74 20 77 69 6c  ecified.  It wil
90f0: 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74  l reconnect to t
9100: 68 65 20 63 61 72 64 20 69 66 20 74 68 65 20 63  he card if the c
9110: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20  onnection. *    
9120: 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20   goes away.. *. 
9130: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
9140: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64  _ret cackey_send
9150: 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63  _apdu(struct cac
9160: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
9170: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
9180: 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ass, unsigned ch
9190: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  ar instruction, 
91a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
91b0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
91c0: 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p2, unsigned cha
91d0: 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  r lc, unsigned c
91e0: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
91f0: 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e  ned char le, uin
9200: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c  t16_t *respcode,
9210: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9220: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74  respdata, size_t
9230: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20   *respdata_len) 
9240: 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72  {..uint8_t major
9250: 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09  _rc, minor_rc;..
9260: 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f  size_t bytes_to_
9270: 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61  copy, tmp_respda
9280: 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52  ta_len;..LPCSCAR
9290: 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 70 69 6f  D_IO_REQUEST pio
92a0: 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f 52 44 20  SendPci;..DWORD 
92b0: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44  protocol;..DWORD
92c0: 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f   xmit_len, recv_
92d0: 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
92e0: 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64  _xmit_ret, scard
92f0: 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59  _reconn_ret;..BY
9300: 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34  TE xmit_buf[1024
9310: 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34  ], recv_buf[1024
9320: 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e  ];..int pcsc_con
9330: 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67  nect_ret, pcsc_g
9340: 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74  etresp_ret;..int
9350: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
9360: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
9370: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
9380: 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  lot) {...CACKEY_
9390: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
93a0: 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69  valid slot speci
93b0: 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  fied.");....retu
93c0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
93d0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
93e0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
93f0: 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
9400: 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
9410: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
9420: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
9430: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
9440: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9450: 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
9460: 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
9470: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
9480: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
9490: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
94a0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  ERIC);..}.../* D
94b0: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 70  etermine which p
94c0: 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20  rotocol to send 
94d0: 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68  using */..switch
94e0: 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c   (slot->protocol
94f0: 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ) {...case SCARD
9500: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09  _PROTOCOL_T0:...
9510: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
9520: 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09  ARD_PCI_T0;.....
9530: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 43  break;...case SC
9540: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a  ARD_PROTOCOL_T1:
9550: 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d  ....pioSendPci =
9560: 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a   SCARD_PCI_T1;..
9570: 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61  ...break;...defa
9580: 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ult:....CACKEY_D
9590: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
95a0: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f  alid protocol fo
95b0: 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29  und, aborting.")
95c0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
95d0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
95e0: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61  IC);..}.../* Tra
95f0: 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c  nsmit */..xmit_l
9600: 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75  en = 0;..xmit_bu
9610: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
9620: 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66  class;..xmit_buf
9630: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69  [xmit_len++] = i
9640: 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69  nstruction;..xmi
9650: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
9660: 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75  ] = p1;..xmit_bu
9670: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
9680: 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b  p2;..if (data) {
9690: 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
96a0: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09  _len++] = lc;...
96b0: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
96c0: 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b  x < lc; idx++) {
96d0: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
96e0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b  t_len++] = data[
96f0: 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  idx];...}..}...i
9700: 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20 7b  f (le != 0x00) {
9710: 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
9720: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d  _len++] = le;..}
9730: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72  .../* Begin Smar
9740: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
9750: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67  n */..cackey_beg
9760: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
9770: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73  lot);...if (clas
9780: 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53  s == GSCIS_CLASS
9790: 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73 74  _ISO7816 && inst
97a0: 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53  ruction == GSCIS
97b0: 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26 26  _INSTR_VERIFY &&
97c0: 20 70 31 20 3d 3d 20 30 78 30 30 20 26 26 20 70   p1 == 0x00 && p
97d0: 32 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43  2 == 0x00) {...C
97e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
97f0: 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55  TF("Sending APDU
9800: 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29  : <<censored>>")
9810: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41  ;..} else {...CA
9820: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9830: 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44  BUF("Sending APD
9840: 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  U:", xmit_buf, x
9850: 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72  mit_len);..}...r
9860: 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ecv_len = sizeof
9870: 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61  (recv_buf);..sca
9880: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43  rd_xmit_ret = SC
9890: 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74  ardTransmit(slot
98a0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f  ->pcsc_card, pio
98b0: 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75  SendPci, xmit_bu
98c0: 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c  f, xmit_len, NUL
98d0: 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65  L, recv_buf, &re
98e0: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73  cv_len);...if (s
98f0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d  card_xmit_ret ==
9900: 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41   SCARD_E_NOT_TRA
9910: 4e 53 41 43 54 45 44 29 20 7b 0a 09 09 43 41 43  NSACTED) {...CAC
9920: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9930: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64  ("Failed to send
9940: 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53   APDU to card (S
9950: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d  CardTransmit() =
9960: 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61   %s/%lx), will a
9970: 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  sk calling funct
9980: 69 6f 6e 20 74 6f 20 72 65 74 72 79 20 28 6e 6f  ion to retry (no
9990: 74 20 72 65 73 65 74 74 69 6e 67 20 63 61 72 64  t resetting card
99a0: 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  )...", CACKEY_DE
99b0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
99c0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78  R_TO_STR(scard_x
99d0: 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67  mit_ret), (unsig
99e0: 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ned long) scard_
99f0: 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a  xmit_ret);..../*
9a00: 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64   Begin Smartcard
9a10: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
9a20: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
9a30: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
9a40: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9a50: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a  _PCSC_E_RETRY);.
9a60: 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78  .}...if (scard_x
9a70: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  mit_ret != SCARD
9a80: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
9a90: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9aa0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
9ab0: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
9ac0: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
9ad0: 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41  ) = %s/%lx)", CA
9ae0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
9af0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
9b00: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
9b10: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
9b20: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29   scard_xmit_ret)
9b30: 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
9b40: 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e  G_PRINTF("Markin
9b50: 67 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67  g slot as having
9b60: 20 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 09   been reset");..
9b70: 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
9b80: 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
9b90: 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
9ba0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f  _ret == SCARD_W_
9bb0: 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09  RESET_CARD) {...
9bc0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9bd0: 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75  INTF("Reset requ
9be0: 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c  ired, please hol
9bf0: 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  d...");.....scar
9c00: 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63  d_reconn_ret = c
9c10: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
9c20: 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44  card(slot, SCARD
9c30: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53  _PROTOCOL_T0 | S
9c40: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
9c50: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
9c60: 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f  ..if (scard_reco
9c70: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
9c80: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
9c90: 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74 6f  ./* Update proto
9ca0: 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d  col */.....slot-
9cb0: 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74  >protocol = prot
9cc0: 6f 63 6f 6c 3b 0a 09 09 09 09 73 77 69 74 63 68  ocol;.....switch
9cd0: 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c   (slot->protocol
9ce0: 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43  ) {......case SC
9cf0: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a  ARD_PROTOCOL_T0:
9d00: 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63  .......pioSendPc
9d10: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30  i = SCARD_PCI_T0
9d20: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
9d30: 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f  .....case SCARD_
9d40: 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09  PROTOCOL_T1:....
9d50: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
9d60: 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09  SCARD_PCI_T1;...
9d70: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
9d80: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09  .default:.......
9d90: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9da0: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f  NTF("Invalid pro
9db0: 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74  tocol found, but
9dc0: 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20   too late to do 
9dd0: 61 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69  anything about i
9de0: 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20  t now -- trying 
9df0: 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09  anyway.");......
9e00: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
9e10: 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c  ..../* Re-establ
9e20: 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ish transaction,
9e30: 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65   if it was prese
9e40: 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c  nt */.....if (sl
9e50: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
9e60: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
9e70: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
9e80: 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09  ion_depth--;....
9e90: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
9ea0: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
9eb0: 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
9ec0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
9ed0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
9ee0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
9ef0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
9f00: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
9f10: 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a  ransmitting");..
9f20: 09 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73  ....recv_len = s
9f30: 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b  izeof(recv_buf);
9f40: 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f  .....scard_xmit_
9f50: 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73  ret = SCardTrans
9f60: 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  mit(slot->pcsc_c
9f70: 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c  ard, pioSendPci,
9f80: 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f   xmit_buf, xmit_
9f90: 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f  len, NULL, recv_
9fa0: 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b  buf, &recv_len);
9fb0: 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f  ......if (scard_
9fc0: 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52  xmit_ret != SCAR
9fd0: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
9fe0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
9ff0: 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73  _PRINTF("Retrans
a000: 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75  mit failed, retu
a010: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
a020: 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63   after disconnec
a030: 74 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53  ting the card (S
a040: 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25  CardTransmit = %
a050: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
a060: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
a070: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
a080: 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e  _xmit_ret), (lon
a090: 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  g) scard_xmit_re
a0a0: 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44  t);.......SCardD
a0b0: 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  isconnect(slot->
a0c0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
a0d0: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09  _LEAVE_CARD);...
a0e0: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
a0f0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
a100: 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53  ;......./* End S
a110: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
a120: 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f  tion */......slo
a130: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
a140: 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63  epth = 1;......c
a150: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
a160: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
a170: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
a180: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
a190: 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ENT);.....}....}
a1a0: 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
a1b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a1c0: 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63  "Disconnecting c
a1d0: 61 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72  ard");......SCar
a1e0: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
a1f0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
a200: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
a210: 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ....slot->pcsc_c
a220: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
a230: 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53  0;....../* End S
a240: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
a250: 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74  tion */.....slot
a260: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
a270: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63  pth = 1;.....cac
a280: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
a290: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  ion(slot);......
a2a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a2b0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
a2c0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
a2d0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
a2e0: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
a2f0: 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  T);....}...} els
a300: 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
a310: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
a320: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
a330: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
a340: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
a350: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
a360: 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f  VE_CARD);....slo
a370: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
a380: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
a390: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
a3a0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
a3b0: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
a3c0: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
a3d0: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
a3e0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
a3f0: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a400: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
a410: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
a420: 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
a430: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
a440: 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  BSENT);...}..}..
a450: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a460: 49 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64  INTBUF("Returned
a470: 20 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62   Value:", recv_b
a480: 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  uf, recv_len);..
a490: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
a4a0: 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61  2) {.../* Minima
a4b0: 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74  l response lengt
a4c0: 68 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65  h is 2 bytes, re
a4d0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
a4e0: 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  re */...CACKEY_D
a4f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
a500: 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c  ponse too small,
a510: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
a520: 69 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20  ilure (recv_len 
a530: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  = %lu)", (unsign
a540: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
a550: 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d  n);..../* End Sm
a560: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
a570: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f  ion */...cackey_
a580: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
a590: 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  slot);....return
a5a0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
a5b0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
a5c0: 20 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c   Determine resul
a5d0: 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72  t code */..major
a5e0: 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72  _rc = recv_buf[r
a5f0: 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d  ecv_len - 2];..m
a600: 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62  inor_rc = recv_b
a610: 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d  uf[recv_len - 1]
a620: 3b 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29  ;..if (respcode)
a630: 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d   {...*respcode =
a640: 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29   (major_rc << 8)
a650: 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a   | minor_rc;..}.
a660: 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73  ../* Adjust mess
a670: 61 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72  age buffer */..r
a680: 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09  ecv_len -= 2;...
a690: 2f 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20  /* Add bytes to 
a6a0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  return value */.
a6b0: 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  .tmp_respdata_le
a6c0: 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70  n = 0;..if (resp
a6d0: 64 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61  data && respdata
a6e0: 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65  _len) {...tmp_re
a6f0: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65  spdata_len = *re
a700: 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62  spdata_len;....b
a710: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a  ytes_to_copy = *
a720: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09  respdata_len;...
a730: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
a740: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b  bytes_to_copy) {
a750: 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ....bytes_to_cop
a760: 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09  y = recv_len;...
a770: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
a780: 47 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e  G_PRINTF("Copyin
a790: 67 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74  g %lu bytes to t
a7a0: 68 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27  he buffer (recv'
a7b0: 64 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74  d %lu bytes, but
a7c0: 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20   only %lu bytes 
a7d0: 6c 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66  left in our buff
a7e0: 65 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  er)", (unsigned 
a7f0: 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63  long) bytes_to_c
a800: 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  opy, (unsigned l
a810: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28  ong) recv_len, (
a820: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
a830: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a  respdata_len);..
a840: 09 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74  ..memcpy(respdat
a850: 61 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74  a, recv_buf, byt
a860: 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72  es_to_copy);...r
a870: 65 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73  espdata += bytes
a880: 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65  _to_copy;....*re
a890: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74  spdata_len = byt
a8a0: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d  es_to_copy;...tm
a8b0: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d  p_respdata_len -
a8c0: 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  = bytes_to_copy;
a8d0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
a8e0: 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20  (recv_len != 0) 
a8f0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
a900: 47 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69  G_PRINTF("Throwi
a910: 6e 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65  ng away %lu byte
a920: 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75  s, nowhere to pu
a930: 74 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67  t them!", (unsig
a940: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c  ned long) recv_l
a950: 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  en);...}..}...if
a960: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78   (major_rc == 0x
a970: 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65  61) {.../* We ne
a980: 65 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09  ed to READ */...
a990: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a9a0: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
a9b0: 20 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09   required");....
a9c0: 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20  if (minor_rc == 
a9d0: 30 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72  0x00) {....minor
a9e0: 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44  _rc = CACKEY_APD
a9f0: 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63  U_MTU;...}....pc
aa00: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d  sc_getresp_ret =
aa10: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
aa20: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
aa30: 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
aa40: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53  IS_INSTR_GET_RES
aa50: 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30  PONSE, 0x00, 0x0
aa60: 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f  0, 0, NULL, mino
aa70: 72 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20  r_rc, respcode, 
aa80: 72 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72  respdata, &tmp_r
aa90: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09  espdata_len);...
aaa0: 09 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73  .if (pcsc_getres
aab0: 70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  p_ret != CACKEY_
aac0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
aad0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
aae0: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
aaf0: 20 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e   failed!  Return
ab00: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
ab10: 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61  ;...../* End Sma
ab20: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
ab30: 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
ab40: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
ab50: 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70  slot);.....if (p
ab60: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
ab70: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
ab80: 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65  _RETRY) {.....re
ab90: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
aba0: 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a  _E_RETRY);....}.
abb0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
abc0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
abd0: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65  );...}....if (re
abe0: 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09  spdata_len) {...
abf0: 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b  .*respdata_len +
ac00: 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  = tmp_respdata_l
ac10: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e  en;...}..../* En
ac20: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
ac30: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63  saction */...cac
ac40: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
ac50: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41  ion(slot);....CA
ac60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ac70: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
ac80: 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20  success (buffer 
ac90: 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29  read complete)")
aca0: 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
acb0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
acc0: 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
acd0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
ace0: 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
acf0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
ad00: 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63  ;...if (major_rc
ad10: 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a   == 0x90) {.../*
ad20: 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41   Success */...CA
ad30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ad40: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
ad50: 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72  success (major_r
ad60: 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09  c = 0x90)");....
ad70: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
ad80: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09  SC_S_OK);..}....
ad90: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ada0: 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e  NTF("APDU Return
adb0: 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74  ed an error, ret
adc0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
add0: 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  e");...return(CA
ade0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
adf0: 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  RIC);.}../*. * S
ae00: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73  YNPOSIS. *     s
ae10: 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65  size_t cackey_re
ae20: 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74  ad_buffer(struct
ae30: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
ae40: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
ae50: 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  r *buffer, size_
ae60: 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65  t count, unsigne
ae70: 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73  d char t_or_v, s
ae80: 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66  ize_t initial_of
ae90: 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  fset);. *. * ARG
aea0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
aeb0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
aec0: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
aed0: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
aee0: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
aef0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
af00: 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20  ar *buffer. *   
af10: 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66        [OUT] Buff
af20: 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a  er. *. *     siz
af30: 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20  e_t count. *    
af40: 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62       Number of b
af50: 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20  ytes to attempt 
af60: 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20  to read. *. *   
af70: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
af80: 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 20  t_or_v. *       
af90: 20 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d 62    Select the T-b
afa0: 75 66 66 65 72 20 28 30 31 29 20 6f 72 20 56 2d  uffer (01) or V-
afb0: 62 75 66 66 65 72 20 28 30 32 29 20 74 6f 20 72  buffer (02) to r
afc0: 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20  ead from.  . *. 
afd0: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69  *     size_t ini
afe0: 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20  tial_offset. *  
aff0: 20 20 20 20 20 20 20 53 70 65 63 69 66 79 20 74         Specify t
b000: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67  he offset to beg
b010: 69 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d  in the read from
b020: 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  . *. *. * RETURN
b030: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68   VALUE. *     Th
b040: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b050: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
b060: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
b070: 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20   read, or -1 on 
b080: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54  error.. *. * NOT
b090: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  ES. *     None. 
b0a0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69  *. */.static ssi
b0b0: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64  ze_t cackey_read
b0c0: 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63  _buffer(struct c
b0d0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
b0e0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
b0f0: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
b100: 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20  count, unsigned 
b110: 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a  char t_or_v, siz
b120: 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  e_t initial_offs
b130: 65 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  et) {..unsigned 
b140: 63 68 61 72 20 2a 69 6e 69 74 5f 62 75 66 66 65  char *init_buffe
b150: 72 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f  r;..size_t init_
b160: 63 6f 75 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69  count;..size_t i
b170: 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73  nit_initial_offs
b180: 65 74 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66  et;...size_t off
b190: 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66  set = 0, max_off
b1a0: 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a  set, max_count;.
b1b0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
b1c0: 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74  md[2];..uint16_t
b1d0: 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20   respcode;..int 
b1e0: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  send_ret;...CACK
b1f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b200: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e  "Called.");...in
b210: 69 74 5f 62 75 66 66 65 72 20 3d 20 62 75 66 66  it_buffer = buff
b220: 65 72 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20  er;..init_count 
b230: 3d 20 63 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69  = count;..init_i
b240: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20  nitial_offset = 
b250: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a  initial_offset;.
b260: 0a 09 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63  ..max_offset = c
b270: 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74  ount;..max_count
b280: 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d   = CACKEY_APDU_M
b290: 54 55 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76  TU;...if (t_or_v
b2a0: 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20   != 1 && t_or_v 
b2b0: 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 2) {...CACKEY
b2c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
b2d0: 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61  nvalid T or V pa
b2e0: 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
b2f0: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
b300: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
b310: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63  turn(-1);..}...c
b320: 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a  md[0] = t_or_v;.
b330: 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09  ..while (1) {...
b340: 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61  if (offset >= ma
b350: 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43  x_offset) {....C
b360: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b370: 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73  TF("Buffer too s
b380: 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20  mall, returning 
b390: 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29  what we got...")
b3a0: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
b3b0: 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  ....count = max_
b3c0: 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b  offset - offset;
b3d0: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d  ...if (count > m
b3e0: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63  ax_count) {....c
b3f0: 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74  ount = max_count
b400: 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20  ;...}....cmd[1] 
b410: 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64  = count;....send
b420: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
b430: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
b440: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
b450: 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53  _PLATFORM, GSCIS
b460: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46  _INSTR_READ_BUFF
b470: 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66  ER, ((initial_of
b480: 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e  fset + offset) >
b490: 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e  > 8) & 0xff, (in
b4a0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f  itial_offset + o
b4b0: 66 66 73 65 74 29 20 26 20 30 78 66 66 2c 20 73  ffset) & 0xff, s
b4c0: 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c  izeof(cmd), cmd,
b4d0: 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65   0x00, &respcode
b4e0: 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65  , buffer + offse
b4f0: 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69  t, &count);....i
b500: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
b510: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
b520: 52 59 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  RY) {....CACKEY_
b530: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
b540: 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65  PU Sending faile
b550: 64 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61 64  d, retrying read
b560: 20 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 09 72   buffer");.....r
b570: 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 72 65 61  eturn(cackey_rea
b580: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 69  d_buffer(slot, i
b590: 6e 69 74 5f 62 75 66 66 65 72 2c 20 69 6e 69 74  nit_buffer, init
b5a0: 5f 63 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20  _count, t_or_v, 
b5b0: 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66  init_initial_off
b5c0: 73 65 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  set));...}....if
b5d0: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
b5e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
b5f0: 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f 64  {....if (respcod
b600: 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09  e == 0x6A86) {..
b610: 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74  ...if (max_count
b620: 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72   == 1) {......br
b630: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
b640: 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  max_count = max_
b650: 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09  count / 2;......
b660: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
b670: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b680: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73  PRINTF("cackey_s
b690: 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65  end_apdu() faile
b6a0: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
b6b0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72  failure");.....r
b6c0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
b6d0: 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e  ..offset += coun
b6e0: 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20  t;....if (count 
b6f0: 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09  < max_count) {..
b700: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b710: 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61  RINTF("Short rea
b720: 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c  d -- count = %i,
b730: 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28   cmd[1] = %i", (
b740: 69 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74  int) count, (int
b750: 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62  ) cmd[1]);.....b
b760: 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69  reak;...}..}..#i
b770: 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
b780: 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
b790: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
b7a0: 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f  if (offset > _PO
b7b0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b  SIX_SSIZE_MAX) {
b7c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b7d0: 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65  PRINTF("Offset e
b7e0: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
b7f0: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
b800: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
b810: 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d   = %li, offset =
b820: 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f   %lu)", (long) _
b830: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c  POSIX_SSIZE_MAX,
b840: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
b850: 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74   offset);....ret
b860: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
b870: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ndif.#endif...CA
b880: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b890: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
b8a0: 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c  success, read %l
b8b0: 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67  u bytes", (unsig
b8c0: 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74  ned long) offset
b8d0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73  );...return(offs
b8e0: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  et);.}../*. * SY
b8f0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
b900: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
b910: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74  select_applet(st
b920: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
b930: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
b940: 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65   char *aid, size
b950: 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a  _t aid_len);. *.
b960: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
b970: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
b980: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
b990: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
b9a0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
b9b0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
b9c0: 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a  ned char *aid. *
b9d0: 20 20 20 20 20 20 20 20 20 42 75 66 66 65 72 20           Buffer 
b9e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65  containing Apple
b9f0: 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20  t ID to select. 
ba00: 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20  *. *     size_t 
ba10: 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20  aid_len. *      
ba20: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74     Number of byt
ba30: 65 73 20 69 6e 20 74 68 65 20 22 61 69 64 22 20  es in the "aid" 
ba40: 28 41 70 70 6c 65 74 20 49 44 29 20 70 61 72 61  (Applet ID) para
ba50: 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55  meter. *. * RETU
ba60: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
ba70: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
ba80: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
ba90: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
baa0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
bab0: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
bac0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
bad0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  None. *. */.stat
bae0: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
baf0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
bb00: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
bb10: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
bb20: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c  igned char *aid,
bb30: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29   size_t aid_len)
bb40: 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74   {..int send_ret
bb50: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
bb60: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
bb70: 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
bb80: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c  UG_PRINTBUF("Sel
bb90: 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c  ecting applet:",
bba0: 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a   aid, aid_len);.
bbb0: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
bbc0: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
bbd0: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
bbe0: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
bbf0: 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43  NSTR_SELECT, GSC
bc00: 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f  IS_PARAM_SELECT_
bc10: 41 50 50 4c 45 54 2c 20 30 78 30 30 2c 20 61 69  APPLET, 0x00, ai
bc20: 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30  d_len, aid, 0x00
bc30: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
bc40: 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f  LL);...if (send_
bc50: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
bc60: 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09  SC_E_RETRY) {...
bc70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bc80: 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e  NTF("ADPU Sendin
bc90: 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69  g failed, retryi
bca0: 6e 67 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74  ng select applet
bcb0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61  ");....return(ca
bcc0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
bcd0: 65 74 28 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69  et(slot, aid, ai
bce0: 64 5f 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66  d_len));..}...if
bcf0: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
bd00: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
bd10: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
bd20: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
bd30: 74 6f 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20  to open applet, 
bd40: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
bd50: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
bd60: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
bd70: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
bd80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bd90: 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79  TF("Successfully
bda0: 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29   selected file")
bdb0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
bdc0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
bdd0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
bde0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
bdf0: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
be00: 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b  file(struct cack
be10: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
be20: 69 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a  int16_t ef);. *.
be30: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
be40: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
be50: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
be60: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
be70: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
be80: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31  . *. *     uint1
be90: 36 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20 20  6_t ef. *       
bea0: 20 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65    Elemental File
beb0: 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a   to select. *. *
bec0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
bed0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
bee0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
bef0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
bf00: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
bf10: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
bf20: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
bf30: 20 20 20 20 20 54 68 69 73 20 73 65 6c 65 63 74       This select
bf40: 73 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20  s an Elementary 
bf50: 46 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72 20  File (EF) under 
bf60: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65  the currently se
bf70: 6c 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44 65  lected. *     De
bf80: 64 69 63 61 74 65 64 20 46 69 6c 65 20 28 44 46  dicated File (DF
bf90: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 69  ). *. *     Typi
bfa0: 63 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61  cally this is ca
bfb0: 6c 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65 63  lled after selec
bfc0: 74 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74  ting the correct
bfd0: 20 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a 20   Applet (using. 
bfe0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65 6c  *     cackey_sel
bff0: 65 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 20  ect_applet) for 
c000: 56 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a  VM cards. *. */.
c010: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
c020: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
c030: 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b  file(struct cack
c040: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
c050: 69 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 75  int16_t ef) {..u
c060: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66 69 64  nsigned char fid
c070: 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65  _buf[2];..int se
c080: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
c090: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
c0a0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f  alled.");.../* O
c0b0: 70 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 61  pen the elementa
c0c0: 72 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f  ry file */..fid_
c0d0: 62 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20  buf[0] = (ef >> 
c0e0: 38 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64 5f  8) & 0xff;..fid_
c0f0: 62 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 78  buf[1] = ef & 0x
c100: 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ff;...CACKEY_DEB
c110: 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63  UG_PRINTF("Selec
c120: 74 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c 78  ting file: %04lx
c130: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
c140: 67 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72  g) ef);...send_r
c150: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
c160: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
c170: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
c180: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
c190: 45 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43 2c  ECT, 0x02, 0x0C,
c1a0: 20 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 29   sizeof(fid_buf)
c1b0: 2c 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30 2c  , fid_buf, 0x00,
c1c0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
c1d0: 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  L);..if (send_re
c1e0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
c1f0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
c200: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c210: 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66  Failed to open f
c220: 69 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ile, returning i
c230: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
c240: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
c250: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
c260: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
c270: 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
c280: 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66  fully selected f
c290: 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ile");...return(
c2a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
c2b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
c2c0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64  OSIS. *     void
c2d0: 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76   cackey_free_tlv
c2e0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  (struct cackey_t
c2f0: 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29  lv_entity *root)
c300: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
c310: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
c320: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
c330: 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20  y *root. *      
c340: 20 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 54     Root of the T
c350: 4c 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72 74  LV list to start
c360: 20 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52   freeing. *. * R
c370: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
c380: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f     None. *. * NO
c390: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
c3a0: 66 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 74  function frees t
c3b0: 68 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69  he TLV linked li
c3c0: 73 74 65 64 20 72 65 74 75 72 6e 65 64 20 66 72  sted returned fr
c3d0: 6f 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b 65  om. *     "cacke
c3e0: 79 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20  y_read_tlv". *. 
c3f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
c400: 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73  ackey_free_tlv(s
c410: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
c420: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b  _entity *root) {
c430: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
c440: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72  tlv_entity *curr
c450: 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72  , *next;...if (r
c460: 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  oot == NULL) {..
c470: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f  .return;..}...fo
c480: 72 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20  r (curr = root; 
c490: 63 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 78  curr; curr = nex
c4a0: 74 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75  t) {...next = cu
c4b0: 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77  rr->_next;....sw
c4c0: 69 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67 29  itch (curr->tag)
c4d0: 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53   {....case GSCIS
c4e0: 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a  _TAG_ACR_TABLE:.
c4f0: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
c500: 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  G_CERTIFICATE:..
c510: 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c  ...if (curr->val
c520: 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  ue) {......free(
c530: 63 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09  curr->value);...
c540: 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
c550: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
c560: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 66  _CARDURL:.....if
c570: 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61   (curr->value_ca
c580: 72 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 72  rdurl) {......fr
c590: 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  ee(curr->value_c
c5a0: 61 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09  ardurl);.....}..
c5b0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
c5c0: 09 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a  .free(curr);..}.
c5d0: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
c5e0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
c5f0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
c600: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
c610: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
c620: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
c630: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
c640: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
c650: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
c660: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63  ey_tlv_entity *c
c670: 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73  ackey_read_tlv(s
c680: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
c690: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75  t *slot) {..stru
c6a0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
c6b0: 74 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 74  tity *curr_entit
c6c0: 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c  y, *root = NULL,
c6d0: 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09   *last = NULL;..
c6e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 6c  unsigned char tl
c6f0: 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f  en_buf[2], tval_
c700: 62 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c  buf[1024], *tval
c710: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
c720: 20 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76   vlen_buf[2], vv
c730: 61 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76  al_buf[8192], *v
c740: 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  val;..unsigned c
c750: 68 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e  har *tmpbuf;..un
c760: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62  signed long tmpb
c770: 75 66 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20  uflen;..ssize_t 
c780: 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69  tlen, vlen;..ssi
c790: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09  ze_t read_ret;..
c7a0: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20  size_t offset_t 
c7b0: 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20  = 0, offset_v = 
c7c0: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  0;..unsigned cha
c7d0: 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  r tag;..size_t l
c7e0: 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41  ength;.#ifdef HA
c7f0: 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63  VE_LIBZ..int unc
c800: 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e  ompress_ret;.#en
c810: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
c820: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
c830: 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74  d.");...read_ret
c840: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
c850: 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e  uffer(slot, tlen
c860: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65  _buf, sizeof(tle
c870: 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65  n_buf), 1, offse
c880: 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_t);..if (read_
c890: 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c  ret != sizeof(tl
c8a0: 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  en_buf)) {...CAC
c8b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c8c0: 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72  ("Read failed, r
c8d0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
c8e0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
c8f0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65  (NULL);..}...tle
c900: 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d  n = (tlen_buf[1]
c910: 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75   << 8) | tlen_bu
c920: 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74  f[0];...read_ret
c930: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
c940: 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e  uffer(slot, vlen
c950: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65  _buf, sizeof(vle
c960: 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65  n_buf), 2, offse
c970: 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_v);..if (read_
c980: 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c  ret != sizeof(vl
c990: 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  en_buf)) {...CAC
c9a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c9b0: 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72  ("Read failed, r
c9c0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
c9d0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
c9e0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65  (NULL);..}...vle
c9f0: 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d  n = (vlen_buf[1]
ca00: 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75   << 8) | vlen_bu
ca10: 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  f[0];...CACKEY_D
ca20: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
ca30: 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56   Length = %lu, V
ca40: 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c  alue Length = %l
ca50: 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
ca60: 6e 67 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67  ng) tlen, (unsig
ca70: 6e 65 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b  ned long) vlen);
ca80: 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32  ...offset_t += 2
ca90: 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32  ;..offset_v += 2
caa0: 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 73  ;...if (tlen > s
cab0: 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 29  izeof(tval_buf))
cac0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
cad0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c 65  G_PRINTF("Tag le
cae0: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67  ngth is too larg
caf0: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
cb00: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
cb10: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
cb20: 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65  .if (vlen > size
cb30: 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a  of(vval_buf)) {.
cb40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cb50: 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 6e  RINTF("Value len
cb60: 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  gth is too large
cb70: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
cb80: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
cb90: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
cba0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
cbb0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
cbc0: 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c  ot, tval_buf, tl
cbd0: 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29  en, 1, offset_t)
cbe0: 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ;..if (read_ret 
cbf0: 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43  != tlen) {...CAC
cc00: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
cc10: 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64  ("Unable to read
cc20: 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65 72   entire T-buffer
cc30: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
cc40: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
cc50: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
cc60: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
cc70: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
cc80: 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c  ot, vval_buf, vl
cc90: 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29  en, 2, offset_v)
cca0: 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ;..if (read_ret 
ccb0: 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43  != vlen) {...CAC
ccc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ccd0: 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64  ("Unable to read
cce0: 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65 72   entire V-buffer
ccf0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
cd00: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
cd10: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
cd20: 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b  tval = tval_buf;
cd30: 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75  ..vval = vval_bu
cd40: 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e 20  f;..while (tlen 
cd50: 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 29  > 0 && vlen > 0)
cd60: 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 6c   {...tag = *tval
cd70: 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c  ;...tval++;...tl
cd80: 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76  en--;....if (*tv
cd90: 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09  al == 0xff) {...
cda0: 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b  .length = (tval[
cdb0: 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b  2] << 8) | tval[
cdc0: 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33  1];....tval += 3
cdd0: 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a  ;....tlen -= 3;.
cde0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65  ..} else {....le
cdf0: 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09  ngth = *tval;...
ce00: 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e  .tval++;....tlen
ce10: 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  --;...}....CACKE
ce20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ce30: 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22 2c  Tag: %s (%02x)",
ce40: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
ce50: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 61  NC_TAG_TO_STR(ta
ce60: 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  g), (unsigned in
ce70: 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b 45  t) tag);...CACKE
ce80: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
ce90: 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c  ("Value:", vval,
cea0: 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72   length);....cur
ceb0: 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  r_entity = NULL;
cec0: 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29 20  ...switch (tag) 
ced0: 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  {....case GSCIS_
cee0: 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09  TAG_CARDURL:....
cef0: 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d  .curr_entity = m
cf00: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
cf10: 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09  rr_entity));....
cf20: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
cf30: 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61  lue_cardurl = ma
cf40: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
cf50: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
cf60: 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09  cardurl));......
cf70: 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 69  memcpy(curr_enti
cf80: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
cf90: 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 29  l->rid, vval, 5)
cfa0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
cfb0: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
cfc0: 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61 6c  ->apptype = vval
cfd0: 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  [5];.....curr_en
cfe0: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
cff0: 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20  url->objectid = 
d000: 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c  (vval[6] << 8) |
d010: 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75   vval[7];.....cu
d020: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
d030: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20  _cardurl->appid 
d040: 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29  = (vval[8] << 8)
d050: 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09   | vval[9];.....
d060: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61  .curr_entity->ta
d070: 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72  g = tag;.....cur
d080: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
d090: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
d0a0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
d0b0: 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a  S_TAG_ACR_TABLE:
d0c0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
d0d0: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
d0e0: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b  (*curr_entity));
d0f0: 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61  .....tmpbuf = ma
d100: 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09  lloc(length);...
d110: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
d120: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
d130: 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ......curr_entit
d140: 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09  y->tag = tag;...
d150: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c  ..curr_entity->l
d160: 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a  ength = length;.
d170: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
d180: 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b  >value = tmpbuf;
d190: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
d1a0: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
d1b0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
d1c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
d1d0: 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 63  RTIFICATE:.....c
d1e0: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
d1f0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
d200: 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66 64  _entity));..#ifd
d210: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09  ef HAVE_LIBZ....
d220: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
d230: 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70  gth * 2;.....tmp
d240: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70  buf = malloc(tmp
d250: 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e  buflen);......un
d260: 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 75  compress_ret = u
d270: 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 66  ncompress(tmpbuf
d280: 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76  , &tmpbuflen, vv
d290: 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09  al, length);....
d2a0: 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f  .if (uncompress_
d2b0: 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09  ret != Z_OK) {..
d2c0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d2d0: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
d2e0: 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 75  to decompress, u
d2f0: 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75  ncompress() retu
d300: 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f 72  rned %i -- resor
d310: 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20 63  ting to direct c
d320: 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73  opy", uncompress
d330: 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70  _ret);.......tmp
d340: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b  buflen = length;
d350: 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70  ......memcpy(tmp
d360: 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  buf, vval, lengt
d370: 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  h);.....}......C
d380: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d390: 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73  TBUF("Decompress
d3a0: 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c  ed to:", tmpbuf,
d3b0: 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c   tmpbuflen);.#el
d3c0: 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  se.....CACKEY_DE
d3d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 73  BUG_PRINTF("Miss
d3e0: 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 74  ing ZLIB Support
d3f0: 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61  , this certifica
d400: 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 65  te is likely use
d410: 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09  less...");......
d420: 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67  tmpbuflen = leng
d430: 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 74  th;.....memcpy(t
d440: 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e  mpbuf, vval, len
d450: 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09  gth);.#endif....
d460: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
d470: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
d480: 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74  rr_entity->lengt
d490: 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09  h = tmpbuflen;..
d4a0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
d4b0: 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a  value = tmpbuf;.
d4c0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
d4d0: 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a  >_next = NULL;..
d4e0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
d4f0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  se GSCIS_TAG_PKC
d500: 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e  S15:.....curr_en
d510: 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
d520: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
d530: 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65  y));......curr_e
d540: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
d550: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
d560: 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d 20  y->value_byte = 
d570: 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72  vval[0];.....cur
d580: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
d590: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
d5a0: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20  ak;...}....vval 
d5b0: 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65  += length;...vle
d5c0: 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09  n -= length;....
d5d0: 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20  if (curr_entity 
d5e0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66  != NULL) {....if
d5f0: 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20   (root == NULL) 
d600: 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72  {.....root = cur
d610: 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a  r_entity;....}..
d620: 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e  ...if (last != N
d630: 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d  ULL) {.....last-
d640: 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e  >_next = curr_en
d650: 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c  tity;....}.....l
d660: 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  ast = curr_entit
d670: 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75  y;...}..}...retu
d680: 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a  rn(root);.}../*.
d690: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
d6a0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
d6b0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
d6c0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
d6d0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
d6e0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
d6f0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
d700: 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
d710: 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72 75  _free_certs(stru
d720: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
d730: 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20  dentity *start, 
d740: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e  size_t count, in
d750: 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a  t free_start) {.
d760: 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69  .size_t idx;...i
d770: 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (start == NULL
d780: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
d790: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
d7a0: 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64   idx < count; id
d7b0: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73 74 61  x++) {...if (sta
d7c0: 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt[idx].certific
d7d0: 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65 28 73  ate) {....free(s
d7e0: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
d7f0: 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  icate);...}..}..
d800: 09 69 66 20 28 66 72 65 65 5f 73 74 61 72 74 29  .if (free_start)
d810: 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72 74 29   {...free(start)
d820: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ;..}...return;.}
d830: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
d840: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
d850: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
d860: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
d870: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
d880: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
d890: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
d8a0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
d8b0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
d8c0: 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65  ntity *cackey_re
d8d0: 61 64 5f 63 65 72 74 73 28 73 74 72 75 63 74 20  ad_certs(struct 
d8e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
d8f0: 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  t, struct cackey
d900: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
d910: 63 65 72 74 73 2c 20 75 6e 73 69 67 6e 65 64 20  certs, unsigned 
d920: 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09  long *count) {..
d930: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
d940: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72  sc_identity *cur
d950: 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20 63 61  r_id;..struct ca
d960: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
d970: 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63  *ccc_tlv, *ccc_c
d980: 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a  urr, *app_tlv, *
d990: 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67  app_curr;..unsig
d9a0: 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61 69 64  ned char ccc_aid
d9b0: 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f  [] = {GSCIS_AID_
d9c0: 43 43 43 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20  CCC};..unsigned 
d9d0: 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37 5d  char curr_aid[7]
d9e0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
d9f0: 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 61   outidx = 0;..ca
da00: 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61 63  ckey_ret transac
da10: 74 69 6f 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 63  tion_ret;..int c
da20: 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a  erts_resizable;.
da30: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c 20 73  .int send_ret, s
da40: 65 6c 65 63 74 5f 72 65 74 3b 0a 0a 09 43 41 43  elect_ret;...CAC
da50: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
da60: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
da70: 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  f (count == NULL
da80: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
da90: 55 47 5f 50 52 49 4e 54 46 28 22 63 6f 75 6e 74  UG_PRINTF("count
daa0: 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e   is NULL, return
dab0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
dac0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
dad0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74  );..}...if (cert
dae0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  s != NULL) {...i
daf0: 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 20  f (*count == 0) 
db00: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
db10: 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
db20: 74 65 64 20 77 65 20 72 65 74 75 72 6e 20 30 20  ted we return 0 
db30: 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72 74 2d 63  objects, short-c
db40: 69 72 63 75 69 74 22 29 3b 0a 0a 09 09 09 72 65  ircuit");.....re
db50: 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d  turn(certs);...}
db60: 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61  ..}.../* Begin a
db70: 20 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73   SmartCard trans
db80: 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73  action */..trans
db90: 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63  action_ret = cac
dba0: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
dbb0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66  ction(slot);..if
dbc0: 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65   (transaction_re
dbd0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
dbe0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
dbf0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
dc00: 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 61  Unable begin tra
dc10: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
dc20: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
dc30: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
dc40: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74  );..}...if (cert
dc50: 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
dc60: 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  erts = malloc(si
dc70: 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35  zeof(*certs) * 5
dc80: 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b  );...*count = 5;
dc90: 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62  ...certs_resizab
dca0: 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20  le = 1;..} else 
dcb0: 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61  {...certs_resiza
dcc0: 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  ble = 0;..}.../*
dcd0: 20 53 65 6c 65 63 74 20 74 68 65 20 43 43 43 20   Select the CCC 
dce0: 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f  Applet */..send_
dcf0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
dd00: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
dd10: 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66   ccc_aid, sizeof
dd20: 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20  (ccc_aid));..if 
dd30: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
dd40: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
dd50: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
dd60: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
dd70: 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41 70 70  o select CCC App
dd80: 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
dd90: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
dda0: 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61  /* Terminate Sma
ddb0: 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtCard Transacti
ddc0: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
ddd0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
dde0: 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  lot);....return(
ddf0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52  NULL);..}.../* R
de00: 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 6c  ead all the appl
de10: 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 43  ets from the CCC
de20: 27 73 20 54 4c 56 20 2a 2f 0a 09 63 63 63 5f 74  's TLV */..ccc_t
de30: 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  lv = cackey_read
de40: 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a  _tlv(slot);.../*
de50: 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55 52   Look for CARDUR
de60: 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70 6f  Ls that coorespo
de70: 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65 74  nd to PKI applet
de80: 73 20 2a 2f 0a 09 66 6f 72 20 28 63 63 63 5f 63  s */..for (ccc_c
de90: 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63  urr = ccc_tlv; c
dea0: 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63 75 72  cc_curr; ccc_cur
deb0: 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e  r = ccc_curr->_n
dec0: 65 78 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ext) {...CACKEY_
ded0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
dee0: 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20  und tag: %s ... 
def0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
df00: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
df10: 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b  ccc_curr->tag));
df20: 0a 0a 09 09 69 66 20 28 63 63 63 5f 63 75 72 72  ....if (ccc_curr
df30: 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54  ->tag != GSCIS_T
df40: 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a 09 09  AG_CARDURL) {...
df50: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
df60: 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
df70: 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
df80: 20 63 61 72 65 20 61 62 6f 75 74 20 43 41 52 44   care about CARD
df90: 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 63 6f 6e  URLs)");.....con
dfa0: 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66  tinue;...}....if
dfb0: 20 28 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   ((ccc_curr->val
dfc0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
dfd0: 79 70 65 20 26 20 43 41 43 4b 45 59 5f 54 4c 56  ype & CACKEY_TLV
dfe0: 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20 43 41 43  _APP_PKI) != CAC
dff0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29  KEY_TLV_APP_PKI)
e000: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
e010: 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
e020: 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65   skipping it (we
e030: 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
e040: 20 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 68   PKI applets, th
e050: 69 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f 72  is applet suppor
e060: 74 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 43  ts: %s/%02x)", C
e070: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
e080: 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28  _APPTYPE_TO_STR(
e090: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
e0a0: 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
e0b0: 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ), (unsigned int
e0c0: 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  ) ccc_curr->valu
e0d0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79  e_cardurl->appty
e0e0: 70 65 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75  pe);.....continu
e0f0: 65 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  e;...}....CACKEY
e100: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
e110: 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72 72  "RID:", ccc_curr
e120: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
e130: 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63  >rid, sizeof(ccc
e140: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
e150: 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 43  durl->rid));...C
e160: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e170: 54 46 28 22 41 70 70 49 44 20 3d 20 25 73 2f 25  TF("AppID = %s/%
e180: 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45  04lx", CACKEY_DE
e190: 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54  BUG_FUNC_OBJID_T
e1a0: 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e  O_STR(ccc_curr->
e1b0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
e1c0: 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64  ppid), (unsigned
e1d0: 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d   long) ccc_curr-
e1e0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
e1f0: 61 70 70 69 64 29 3b 0a 09 09 43 41 43 4b 45 59  appid);...CACKEY
e200: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
e210: 62 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34  bjectID = %s/%04
e220: 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  lx", CACKEY_DEBU
e230: 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
e240: 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  STR(ccc_curr->va
e250: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
e260: 65 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65  ectid), (unsigne
e270: 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72  d long) ccc_curr
e280: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
e290: 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 6d  >objectid);....m
e2a0: 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c 20  emcpy(curr_aid, 
e2b0: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
e2c0: 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69  cardurl->rid, si
e2d0: 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76  zeof(ccc_curr->v
e2e0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
e2f0: 64 29 29 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b  d));...curr_aid[
e300: 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
e310: 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75 72   - 2] = (ccc_cur
e320: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
e330: 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26 20  ->appid >> 8) & 
e340: 30 78 66 66 3b 0a 09 09 63 75 72 72 5f 61 69 64  0xff;...curr_aid
e350: 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64  [sizeof(curr_aid
e360: 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75 72  ) - 1] = ccc_cur
e370: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
e380: 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b 0a  ->appid & 0xff;.
e390: 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75  .../* Select fou
e3a0: 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f  nd applet ... */
e3b0: 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20  ...select_ret = 
e3c0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
e3d0: 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f  plet(slot, curr_
e3e0: 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  aid, sizeof(curr
e3f0: 5f 61 69 64 29 29 3b 0a 09 09 69 66 20 28 73 65  _aid));...if (se
e400: 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  lect_ret != CACK
e410: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
e420: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e430: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
e440: 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 2c  o select applet,
e450: 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73   skipping proces
e460: 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a  sing of this obj
e470: 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69  ect");.....conti
e480: 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 2e  nue;...}..../* .
e490: 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74 20 28 66  .. and object (f
e4a0: 69 6c 65 29 20 2a 2f 0a 09 09 73 65 6c 65 63 74  ile) */...select
e4b0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
e4c0: 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20  lect_file(slot, 
e4d0: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
e4e0: 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69  cardurl->objecti
e4f0: 64 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63 74  d);...if (select
e500: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
e510: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43  CSC_S_OK) {....C
e520: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e530: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
e540: 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 70  lect file, skipp
e550: 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
e560: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
e570: 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
e580: 09 7d 0a 0a 09 09 2f 2a 20 50 72 6f 63 65 73 73  .}..../* Process
e590: 20 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56   this file's TLV
e5a0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72   looking for cer
e5b0: 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 61  tificates */...a
e5c0: 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f  pp_tlv = cackey_
e5d0: 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a  read_tlv(slot);.
e5e0: 0a 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72 72  ...for (app_curr
e5f0: 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f   = app_tlv; app_
e600: 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20 3d  curr; app_curr =
e610: 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74   app_curr->_next
e620: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
e630: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
e640: 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41 43 4b  d tag: %s", CACK
e650: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
e660: 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63 75 72  G_TO_STR(app_cur
e670: 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 69 66 20  r->tag));....if 
e680: 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 20 21  (app_curr->tag !
e690: 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  = GSCIS_TAG_CERT
e6a0: 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 43  IFICATE) {.....C
e6b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e6c0: 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69  TF("  ... skippi
e6d0: 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63  ng it (we only c
e6e0: 61 72 65 20 61 62 6f 75 74 20 43 45 52 54 49 46  are about CERTIF
e6f0: 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09 09 09  ICATEs)");......
e700: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
e710: 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 65  ...curr_id = &ce
e720: 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09  rts[outidx];....
e730: 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d 65  outidx++;.....me
e740: 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 61 70  mcpy(curr_id->ap
e750: 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64 2c 20  plet, curr_aid, 
e760: 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e  sizeof(curr_id->
e770: 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 63 75 72  applet));....cur
e780: 72 5f 69 64 2d 3e 66 69 6c 65 20 3d 20 63 63 63  r_id->file = ccc
e790: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
e7a0: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a  durl->objectid;.
e7b0: 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73  ...curr_id->keys
e7c0: 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09 43 41  ize = -1;.....CA
e7d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e7e0: 46 28 22 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f  F("Filling curr_
e7f0: 69 64 2d 3e 61 70 70 6c 65 74 20 28 25 70 29 20  id->applet (%p) 
e800: 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a 22  with %lu bytes:"
e810: 2c 20 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65  , curr_id->apple
e820: 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  t, (unsigned lon
e830: 67 29 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69  g) sizeof(curr_i
e840: 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09  d->applet));....
e850: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e860: 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75  NTBUF("VAL:", cu
e870: 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 73  rr_id->applet, s
e880: 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61  izeof(curr_id->a
e890: 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 63 75 72  pplet));.....cur
e8a0: 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
e8b0: 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72 72  e_len = app_curr
e8c0: 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 63 75  ->length;.....cu
e8d0: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
e8e0: 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  te = malloc(curr
e8f0: 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
e900: 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79  _len);....memcpy
e910: 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  (curr_id->certif
e920: 69 63 61 74 65 2c 20 61 70 70 5f 63 75 72 72 2d  icate, app_curr-
e930: 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d  >value, curr_id-
e940: 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
e950: 29 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74 69 64  );.....if (outid
e960: 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09  x >= *count) {..
e970: 09 09 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
e980: 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09 09 2a  izable) {......*
e990: 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09  count *= 2;.....
e9a0: 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63  .certs = realloc
e9b0: 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a  (certs, sizeof(*
e9c0: 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74  certs) * (*count
e9d0: 29 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  ));.....} else {
e9e0: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
e9f0: 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  .}....}...}....c
ea00: 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 61  ackey_free_tlv(a
ea10: 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 69 66 20 28  pp_tlv);....if (
ea20: 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74  outidx >= *count
ea30: 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ) {....break;...
ea40: 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 66 72  }..}...cackey_fr
ea50: 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b  ee_tlv(ccc_tlv);
ea60: 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69  ...*count = outi
ea70: 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73 5f  dx;...if (certs_
ea80: 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63  resizable) {...c
ea90: 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63  erts = realloc(c
eaa0: 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65  erts, sizeof(*ce
eab0: 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29  rts) * (*count))
eac0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e  ;..}.../* Termin
ead0: 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72  ate SmartCard Tr
eae0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
eaf0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
eb00: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65  tion(slot);...re
eb10: 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a  turn(certs);.}..
eb20: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
eb30: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
eb40: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
eb50: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
eb60: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
eb70: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
eb80: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
eb90: 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
eba0: 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
ebb0: 70 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  pt(struct cackey
ebc0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72  _slot *slot, str
ebd0: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
ebe0: 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
ebf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
ec00: 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  f, size_t buflen
ec10: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
ec20: 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f 74 20  *outbuf, size_t 
ec30: 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70  outbuflen, int p
ec40: 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70  adInput, int unp
ec50: 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 75 6e 73  adOutput) {..uns
ec60: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62  igned char *tmpb
ec70: 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a  uf, *tmpbuf_s, *
ec80: 6f 75 74 62 75 66 5f 73 3b 0a 09 75 6e 73 69 67  outbuf_s;..unsig
ec90: 6e 65 64 20 63 68 61 72 20 62 79 74 65 73 5f 74  ned char bytes_t
eca0: 6f 5f 73 65 6e 64 2c 20 70 31 3b 0a 09 75 6e 73  o_send, p1;..uns
ecb0: 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b  igned char block
ecc0: 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65  type;..cackey_re
ecd0: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e  t send_ret;..uin
ece0: 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
ecf0: 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20  .ssize_t retval 
ed00: 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74  = 0, unpadoffset
ed10: 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66  ;..size_t tmpbuf
ed20: 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70  len, padlen, tmp
ed30: 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20  outbuflen;..int 
ed40: 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
ed50: 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b  ..int le;...CACK
ed60: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ed70: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
ed80: 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20   (slot == NULL) 
ed90: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
eda0: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
edb0: 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b   slot is NULL");
edc0: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
edd0: 09 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20  .}...if (buf == 
ede0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
edf0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
ee00: 72 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55  rror.  buf is NU
ee10: 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
ee20: 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75  -1);..}...if (ou
ee30: 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tbuf == NULL) {.
ee40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ee50: 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f  RINTF("Error.  o
ee60: 75 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b  utbuf is NULL");
ee70: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
ee80: 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  .}...if (identit
ee90: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  y == NULL) {...C
eea0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
eeb0: 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
eec0: 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  tity is NULL");.
eed0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
eee0: 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  }...if (identity
eef0: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
ef00: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
ef10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ef20: 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69  ("Error.  identi
ef30: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
ef40: 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  y is NULL");....
ef50: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
ef60: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 64  ./* Determine id
ef70: 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a 65 20  entity Key size 
ef80: 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  */..if (identity
ef90: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
efa0: 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a  >keysize < 0) {.
efb0: 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  ..identity->pcsc
efc0: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
efd0: 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79  ze = x509_to_key
efe0: 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e 70  size(identity->p
eff0: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
f000: 72 74 69 66 69 63 61 74 65 2c 20 69 64 65 6e 74  rtificate, ident
f010: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
f020: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
f030: 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61  len);..}.../* Pa
f040: 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b 65 79  d message to key
f050: 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61   size */..if (pa
f060: 64 49 6e 70 75 74 29 20 7b 0a 09 09 69 66 20 28  dInput) {...if (
f070: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
f080: 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
f090: 20 3e 20 30 29 20 7b 0a 09 09 09 69 66 20 28 62   > 0) {....if (b
f0a0: 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69 74  uflen != identit
f0b0: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
f0c0: 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09 09  ->keysize) {....
f0d0: 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 28 69  .if (buflen > (i
f0e0: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
f0f0: 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
f100: 2b 20 33 29 29 20 7b 0a 09 09 09 09 09 43 41 43  + 3)) {......CAC
f110: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f120: 28 22 45 72 72 6f 72 2e 20 20 4d 65 73 73 61 67  ("Error.  Messag
f130: 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  e is too large t
f140: 6f 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29  o sign/decrypt")
f150: 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 2d  ;.......return(-
f160: 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74  1);.....}......t
f170: 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74  mpbuflen = ident
f180: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
f190: 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09  ty->keysize;....
f1a0: 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  .tmpbuf = malloc
f1b0: 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09  (tmpbuflen);....
f1c0: 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31  .free_tmpbuf = 1
f1d0: 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20  ;......padlen = 
f1e0: 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c  tmpbuflen - bufl
f1f0: 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 2f 2a 20  en - 3;....../* 
f200: 52 53 41 20 50 4b 43 53 23 31 20 45 4d 53 41 2d  RSA PKCS#1 EMSA-
f210: 50 4b 43 53 31 2d 76 31 5f 35 20 50 61 64 64 69  PKCS1-v1_5 Paddi
f220: 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66  ng */.....tmpbuf
f230: 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 09  [0] = 0x00;.....
f240: 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78 30 31  tmpbuf[1] = 0x01
f250: 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26 74 6d  ;.....memset(&tm
f260: 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70  pbuf[2], 0xFF, p
f270: 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62  adlen);.....tmpb
f280: 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20  uf[padlen + 2]= 
f290: 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79  0x00;.....memcpy
f2a0: 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20  (&tmpbuf[padlen 
f2b0: 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65  + 3], buf, bufle
f2c0: 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  n);......CACKEY_
f2d0: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
f2e0: 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75 66 2c  Unpadded:", buf,
f2f0: 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41   buflen);.....CA
f300: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f310: 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 74  BUF("Padded:", t
f320: 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
f330: 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  );....} else {..
f340: 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b  ...tmpbuf = buf;
f350: 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
f360: 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65   buflen;.....fre
f370: 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09  e_tmpbuf = 0;...
f380: 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09  ..padlen = 0;...
f390: 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
f3a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f3b0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
f3c0: 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20 73 69  determine key si
f3d0: 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65 20 6d  ze, hoping the m
f3e0: 65 73 73 61 67 65 20 69 73 20 70 72 6f 70 65 72  essage is proper
f3f0: 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a 0a 09  ly padded!");...
f400: 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a  ..tmpbuf = buf;.
f410: 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62  ...tmpbuflen = b
f420: 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74  uflen;....free_t
f430: 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70 61  mpbuf = 0;....pa
f440: 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d  dlen = 0;...}..}
f450: 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75 66   else {...tmpbuf
f460: 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75 66   = buf;...tmpbuf
f470: 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
f480: 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
f490: 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09  ...padlen = 0;..
f4a0: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72 61  }.../* Begin tra
f4b0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
f4c0: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
f4d0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f  ction(slot);.../
f4e0: 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
f4f0: 20 61 70 70 6c 65 74 20 2a 2f 0a 09 43 41 43 4b   applet */..CACK
f500: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f510: 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65  "Selecting apple
f520: 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e  t found at %p ..
f530: 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  .", identity->pc
f540: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70  sc_identity->app
f550: 6c 65 74 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65  let);..cackey_se
f560: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
f570: 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
f580: 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65  _identity->apple
f590: 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69  t, sizeof(identi
f5a0: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
f5b0: 79 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 2f  y->applet));.../
f5c0: 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
f5d0: 20 66 69 6c 65 20 2a 2f 0a 09 63 61 63 6b 65 79   file */..cackey
f5e0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f  _select_file(slo
f5f0: 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  t, identity->pcs
f600: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69 6c 65  c_identity->file
f610: 29 3b 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20  );...tmpbuf_s = 
f620: 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f  tmpbuf;..outbuf_
f630: 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77 68 69  s = outbuf;..whi
f640: 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b  le (tmpbuflen) {
f650: 0a 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e  ...if (tmpbuflen
f660: 20 3e 20 32 34 35 29 20 7b 0a 09 09 09 62 79 74   > 245) {....byt
f670: 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 32 34 35  es_to_send = 245
f680: 3b 0a 09 09 09 70 31 20 3d 20 30 78 38 30 3b 0a  ;....p1 = 0x80;.
f690: 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09  ...le = 0x00;...
f6a0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65  } else {....byte
f6b0: 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62  s_to_send = tmpb
f6c0: 75 66 6c 65 6e 3b 0a 09 09 09 70 31 20 3d 20 30  uflen;....p1 = 0
f6d0: 78 30 30 3b 0a 09 09 09 6c 65 20 3d 20 30 78 30  x00;....le = 0x0
f6e0: 30 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 6f 75 74  0;...}....tmpout
f6f0: 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c  buflen = outbufl
f700: 65 6e 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20  en;....send_ret 
f710: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
f720: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
f730: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
f740: 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54  FORM, GSCIS_INST
f750: 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c 20 70  R_SIGNDECRYPT, p
f760: 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73 5f 74  1, 0x00, bytes_t
f770: 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20  o_send, tmpbuf, 
f780: 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f  le, &respcode, o
f790: 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75  utbuf, &tmpoutbu
f7a0: 66 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73 65 6e  flen);...if (sen
f7b0: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
f7c0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
f7d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f7e0: 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e  NTF("ADPU Sendin
f7f0: 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 75  g Failed -- retu
f800: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22  rning in error."
f810: 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65 65 5f  );.....if (free_
f820: 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66  tmpbuf) {.....if
f830: 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09   (tmpbuf_s) {...
f840: 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
f850: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
f860: 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63  ../* End transac
f870: 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65  tion */....cacke
f880: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
f890: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20  n(slot);.....if 
f8a0: 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
f8b0: 39 38 32 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  982) {.....CACKE
f8c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f8d0: 53 65 63 75 72 69 74 79 20 73 74 61 74 75 73 20  Security status 
f8e0: 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64 2e 20  not satisified. 
f8f0: 20 52 65 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c   Returning NEEDL
f900: 4f 47 49 4e 22 29 3b 0a 0a 09 09 09 09 63 61 63  OGIN");......cac
f910: 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
f920: 73 65 74 28 73 6c 6f 74 29 3b 0a 09 09 09 09 73  set(slot);.....s
f930: 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot->token_flags
f940: 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   = CKF_LOGIN_REQ
f950: 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75  UIRED;......retu
f960: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
f970: 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09  _NEEDLOGIN);....
f980: 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72  }.....if (send_r
f990: 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
f9a0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
f9b0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
f9c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65  BUG_PRINTF("Toke
f9d0: 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72  n absent.  Retur
f9e0: 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54  ning TOKENABSENT
f9f0: 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ");......cackey_
fa00: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
fa10: 73 6c 6f 74 29 3b 0a 09 09 09 09 73 6c 6f 74 2d  slot);.....slot-
fa20: 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43  >token_flags = C
fa30: 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
fa40: 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  D;......return(C
fa50: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
fa60: 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a  ENABSENT);....}.
fa70: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
fa80: 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b 3d  ..}....tmpbuf +=
fa90: 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a   bytes_to_send;.
faa0: 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 62  ..tmpbuflen -= b
fab0: 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a 09  ytes_to_send;...
fac0: 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f 75  .outbuf += tmpou
fad0: 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 75  tbuflen;...outbu
fae0: 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 75  flen -= tmpoutbu
faf0: 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20 2b  flen;...retval +
fb00: 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a  = tmpoutbuflen;.
fb10: 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 74 6d  .}...if (free_tm
fb20: 70 62 75 66 29 20 7b 0a 09 09 69 66 20 28 74 6d  pbuf) {...if (tm
fb30: 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 66 72 65  pbuf_s) {....fre
fb40: 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 7d  e(tmpbuf_s);...}
fb50: 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20 6f  ..}...outbuf = o
fb60: 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 6e  utbuf_s;.../* En
fb70: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d transaction */
fb80: 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
fb90: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
fba0: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50  .#ifdef CACKEY_P
fbb0: 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66  ARANOID.#  ifdef
fbc0: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
fbd0: 58 0a 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e  X..if (outbuflen
fbe0: 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f   > _POSIX_SSIZE_
fbf0: 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  MAX) {...CACKEY_
fc00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75  DEBUG_PRINTF("Ou
fc10: 74 62 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20  tbuflen exceeds 
fc20: 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72  maximum value, r
fc30: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
fc40: 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c  ure. (max = %li,
fc50: 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75   outbuflen = %lu
fc60: 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49  )", (long) _POSI
fc70: 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e  X_SSIZE_MAX, (un
fc80: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74  signed long) out
fc90: 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  buflen);....retu
fca0: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
fcb0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  dif.#endif.../* 
fcc0: 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09  Unpad reply */..
fcd0: 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74 29  if (unpadOutput)
fce0: 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c 20   {...if (retval 
fcf0: 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  < 3) {....CACKEY
fd00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
fd10: 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c  eply is too smal
fd20: 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61 62  l, we are not ab
fd30: 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70  le to unpad -- p
fd40: 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20  assing back and 
fd50: 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62  hoping for the b
fd60: 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b  est!");.....CACK
fd70: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fd80: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
fd90: 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
fda0: 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
fdb0: 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09  ong) retval);...
fdc0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
fdd0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75 74 62  ...}....if (outb
fde0: 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29 20 7b  uf[0] != 0x00) {
fdf0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
fe00: 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63 6f 67  _PRINTF("Unrecog
fe10: 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20 73 63  nized padding sc
fe20: 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e 67 20  heme -- passing 
fe30: 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20  back and hoping 
fe40: 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b  for the best!");
fe50: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
fe60: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
fe70: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
fe80: 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
fe90: 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
fea0: 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e  tval);....return
feb0: 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
fec0: 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74  .blocktype = out
fed0: 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61 64 6f  buf[1];...unpado
fee0: 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77  ffset = 0;....sw
fef0: 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65 29  itch (blocktype)
ff00: 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30 3a   {....case 0x00:
ff10: 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
ff20: 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66 69  Scheme 1, the fi
ff30: 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  rst non-zero byt
ff40: 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  e is the start o
ff50: 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f  f data */.....fo
ff60: 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  r (unpadoffset =
ff70: 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20   2; unpadoffset 
ff80: 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f  < retval; unpado
ff90: 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09  ffset++) {......
ffa0: 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
ffb0: 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30 29  offset] != 0x00)
ffc0: 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
ffd0: 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
ffe0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
fff0: 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x01:...../* Pad
10000 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20 70  ding Scheme 2, p
10010 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78 46  ad bytes are 0xF
10020 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78  F followed by 0x
10030 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  00 */.....for (u
10040 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
10050 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
10060 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
10070 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
10080 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
10090 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a 09  et] != 0xFF) {..
100a0 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
100b0 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20  unpadoffset] == 
100c0 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09 75  0x00) {........u
100d0 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09  npadoffset++;...
100e0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
100f0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
10100 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10110 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
10120 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75  padding data fou
10130 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  nd, returning in
10140 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64   failure, should
10150 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30 20   have been 0x00 
10160 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28  found 0x%02x", (
10170 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75  unsigned int) ou
10180 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
10190 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74 75  ]);.........retu
101a0 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a  rn(-1);.......}.
101b0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
101c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
101d0 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
101e0 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f   padding data fo
101f0 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  und, returning i
10200 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c  n failure, shoul
10210 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46 46  d have been 0xFF
10220 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20   found 0x%02x", 
10230 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f  (unsigned int) o
10240 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
10250 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74 75  t]);........retu
10260 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09  rn(-1);......}..
10270 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
10280 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
10290 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
102a0 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65 73  eme 3, pad bytes
102b0 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69   are non-zero fi
102c0 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20 66 6f  rst zero byte fo
102d0 75 6e 64 20 69 73 20 74 68 65 20 73 65 70 65 72  und is the seper
102e0 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09 09 09  ator byte */....
102f0 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
10300 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73  t = 2; unpadoffs
10310 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
10320 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
10330 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
10340 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78  padoffset] == 0x
10350 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e 70 61  00) {.......unpa
10360 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09  doffset++;......
10370 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
10380 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
10390 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 70 61  ...}....if (unpa
103a0 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76 61 6c  doffset > retval
103b0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
103c0 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73  BUG_PRINTF("Offs
103d0 65 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  et greater than 
103e0 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62 6f 72  reply size, abor
103f0 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f 66 66  ting.  (unpadoff
10400 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74 76 61  set = %lu, retva
10410 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  l = %lu)", (unsi
10420 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70 61 64  gned long) unpad
10430 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67 6e 65  offset, (unsigne
10440 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b  d long) retval);
10450 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
10460 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
10470 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
10480 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c  added:", outbuf,
10490 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74   retval);....ret
104a0 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66 66 73  val -= unpadoffs
104b0 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75  et;...memmove(ou
104c0 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20 75  tbuf, outbuf + u
104d0 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65 74 76  npadoffset, retv
104e0 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  al);....CACKEY_D
104f0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55  EBUG_PRINTBUF("U
10500 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75  npadded:", outbu
10510 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  f, retval);..}..
10520 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10530 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
10540 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
10550 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
10560 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
10570 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
10580 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  val);.}../*. * S
10590 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
105a0 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
105b0 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
105c0 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
105d0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
105e0 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
105f0 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
10600 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
10610 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63 74 20  ey_login(struct 
10620 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
10630 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
10640 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20   *pin, unsigned 
10650 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e  long pin_len, in
10660 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  t *tries_remaini
10670 6e 67 5f 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65  ng_p) {..unsigne
10680 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b 38  d char cac_pin[8
10690 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c  ] = {0xFF, 0xFF,
106a0 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
106b0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
106c0 78 46 46 7d 3b 0a 09 75 69 6e 74 31 36 5f 74 20  xFF};..uint16_t 
106d0 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09  response_code;..
106e0 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  int tries_remain
106f0 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ing;..int send_r
10700 65 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74  et;.../* Indicat
10710 65 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  e that we do not
10720 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77 20   know about how 
10730 6d 61 6e 79 20 74 72 69 65 73 20 61 72 65 20 72  many tries are r
10740 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20  emaining */..if 
10750 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  (tries_remaining
10760 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72  _p) {...*tries_r
10770 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b  emaining_p = -1;
10780 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e  ..}.../* Apparen
10790 74 6c 79 2c 20 43 41 43 20 50 49 4e 73 20 61 72  tly, CAC PINs ar
107a0 65 20 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 79  e *EXACTLY* 8 by
107b0 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20  tes long -- pad 
107c0 77 69 74 68 20 30 78 46 46 20 69 66 20 74 6f 6f  with 0xFF if too
107d0 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70   short */..if (p
107e0 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09  in_len >= 8) {..
107f0 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c  .memcpy(cac_pin,
10800 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73   pin, 8);..} els
10810 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63  e {...memcpy(cac
10820 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c  _pin, pin, pin_l
10830 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73  en);..}.../* Iss
10840 75 65 20 50 49 4e 20 56 65 72 69 66 79 20 2a 2f  ue PIN Verify */
10850 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
10860 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
10870 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
10880 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
10890 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30 78 30  NSTR_VERIFY, 0x0
108a0 30 2c 20 30 78 30 30 2c 20 73 69 7a 65 6f 66 28  0, 0x00, sizeof(
108b0 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69  cac_pin), cac_pi
108c0 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e  n, 0x00, &respon
108d0 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e  se_code, NULL, N
108e0 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f  ULL);..if (send_
108f0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
10900 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20  SC_S_OK) {...if 
10910 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20  ((response_code 
10920 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78 36  & 0x63C0) == 0x6
10930 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73 5f  3C0) {....tries_
10940 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65 73  remaining = (res
10950 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 46  ponse_code & 0xF
10960 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
10970 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
10980 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69  Verification fai
10990 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72 65  led, %i tries re
109a0 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f  maining", tries_
109b0 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09  remaining);.....
109c0 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e  if (tries_remain
109d0 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a 74 72  ing_p) {.....*tr
109e0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20  ies_remaining_p 
109f0 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  = tries_remainin
10a00 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75  g;....}.....retu
10a10 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
10a20 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09  _BADPIN);...}...
10a30 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f  .if (response_co
10a40 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b 0a  de == 0x6983) {.
10a50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10a60 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69  PRINTF("PIN Veri
10a70 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c  fication failed,
10a80 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b 65   device is locke
10a90 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  d");.....return(
10aa0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
10ab0 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65  CKED);...}....re
10ac0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
10ad0 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
10ae0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10af0 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66  RINTF("PIN Verif
10b00 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 65  ication succeede
10b10 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  d");...return(CA
10b20 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
10b30 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
10b40 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
10b50 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
10b60 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
10b70 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
10b80 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
10b90 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
10ba0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
10bb0 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74 6f  ey_ret cackey_to
10bc0 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72 75  ken_present(stru
10bd0 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
10be0 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
10bf0 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  ret pcsc_connect
10c00 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65 61  _ret;..DWORD rea
10c10 64 65 72 5f 6c 65 6e 2c 20 73 74 61 74 65 2c 20  der_len, state, 
10c20 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 5f 6c 65  protocol, atr_le
10c30 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41 58  n;..BYTE atr[MAX
10c40 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e  _ATR_SIZE];..LON
10c50 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73 63  G status_ret, sc
10c60 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a  ard_reconn_ret;.
10c70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10c80 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
10c90 3b 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  ;...pcsc_connect
10ca0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
10cb0 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
10cc0 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
10cd0 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
10ce0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
10cf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10d00 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
10d10 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
10d20 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
10d30 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65   absent");....re
10d40 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
10d50 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
10d60 0a 09 7d 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d 20  ..}...atr_len = 
10d70 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 73 74  sizeof(atr);..st
10d80 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64  atus_ret = SCard
10d90 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73  Status(slot->pcs
10da0 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72  c_card, NULL, &r
10db0 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74  eader_len, &stat
10dc0 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74  e, &protocol, at
10dd0 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09  r, &atr_len);...
10de0 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d  if (status_ret =
10df0 3d 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  = SCARD_E_INVALI
10e00 44 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09 43 41  D_HANDLE) {...CA
10e10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10e20 46 28 22 53 43 61 72 64 53 74 61 74 75 73 28 29  F("SCardStatus()
10e30 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
10e40 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  E_INVALID_HANDLE
10e50 2c 20 6d 61 72 6b 69 6e 67 20 69 73 20 6e 6f 74  , marking is not
10e60 20 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65 63 74   already connect
10e70 65 64 20 61 6e 64 20 74 72 79 69 6e 67 20 61 67  ed and trying ag
10e80 61 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f  ain");...cackey_
10e90 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
10ea0 73 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63 5f 63  slot);....pcsc_c
10eb0 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
10ec0 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
10ed0 28 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28 70 63  (slot);...if (pc
10ee0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21  sc_connect_ret !
10ef0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
10f00 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
10f10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
10f20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20  able to connect 
10f30 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69  to card, returni
10f40 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22  ng token absent"
10f50 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
10f60 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
10f70 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a 09  NABSENT);...}...
10f80 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  .atr_len = sizeo
10f90 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74 75 73  f(atr);...status
10fa0 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74  _ret = SCardStat
10fb0 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  us(slot->pcsc_ca
10fc0 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65  rd, NULL, &reade
10fd0 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26  r_len, &state, &
10fe0 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26  protocol, atr, &
10ff0 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69  atr_len);..}...i
11000 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d  f (status_ret !=
11010 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
11020 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72  ) {...cackey_mar
11030 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
11040 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61 74 75  t);....if (statu
11050 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57  s_ret == SCARD_W
11060 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09  _RESET_CARD) {..
11070 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11080 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71  RINTF("Reset req
11090 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f  uired, please ho
110a0 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61  ld...");.....sca
110b0 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20  rd_reconn_ret = 
110c0 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
110d0 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52  _card(slot, SCAR
110e0 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20  D_PROTOCOL_T0 | 
110f0 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
11100 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09  1, &protocol);..
11110 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f  ..if (scard_reco
11120 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
11130 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
11140 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74 6f  ./* Update proto
11150 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d  col */.....slot-
11160 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74  >protocol = prot
11170 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20 52 65  ocol;....../* Re
11180 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73  -establish trans
11190 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61  action, if it wa
111a0 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09  s present */....
111b0 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
111c0 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30  action_depth > 0
111d0 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74  ) {......slot->t
111e0 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
111f0 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74  --;......slot->t
11200 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
11210 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09  hw_lock = 1;....
11220 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  ..cackey_begin_t
11230 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
11240 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
11250 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11260 28 22 52 65 73 65 74 20 73 75 63 63 65 73 73 66  ("Reset successf
11270 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67 22 29  ul, requerying")
11280 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72 65 74  ;.....status_ret
11290 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73   = SCardStatus(s
112a0 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
112b0 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65  NULL, &reader_le
112c0 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74  n, &state, &prot
112d0 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f  ocol, atr, &atr_
112e0 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28 73 74  len);.....if (st
112f0 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52  atus_ret != SCAR
11300 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
11310 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11320 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c 20 75  _PRINTF("Still u
11330 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63  nable to query c
11340 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 75  ard status, retu
11350 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
11360 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 73  nt.  SCardStatus
11370 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59  () = %s", CACKEY
11380 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
11390 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74  DERR_TO_STR(stat
113a0 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 09  us_ret));.......
113b0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
113c0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
113d0 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c  );.....}....} el
113e0 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  se {.....CACKEY_
113f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
11400 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63  able to reconnec
11410 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
11420 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
11430 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  t.  SCardReconne
11440 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b  ct() = %s", CACK
11450 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
11460 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
11470 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 29  ard_reconn_ret))
11480 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41  ;......return(CA
11490 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
114a0 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09  NABSENT);....}..
114b0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
114c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
114d0 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75 65 72  ("Unable to quer
114e0 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 72  y card status, r
114f0 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61  eturning token a
11500 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61  bsent.  SCardSta
11510 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43  tus() = %s", CAC
11520 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
11530 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
11540 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09  tatus_ret));....
11550 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
11560 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
11570 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  T);...}..}...if 
11580 28 28 73 74 61 74 65 20 26 20 53 43 41 52 44 5f  ((state & SCARD_
11590 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41 52 44  ABSENT) == SCARD
115a0 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43 41 43  _ABSENT) {...CAC
115b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
115c0 28 22 43 61 72 64 20 69 73 20 61 62 73 65 6e 74  ("Card is absent
115d0 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
115e0 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72  n absent");....r
115f0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
11600 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
11610 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
11620 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
11630 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73  rning token pres
11640 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e  ent.");...return
11650 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54  (CACKEY_PCSC_S_T
11660 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a  OKENPRESENT);.}.
11670 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
11680 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
11690 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
116a0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
116b0 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
116c0 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
116d0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
116e0 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
116f0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
11700 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73  ntity_to_label(s
11710 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
11720 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  c_identity *iden
11730 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63  tity, unsigned c
11740 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20  har *label_buf, 
11750 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61  unsigned long la
11760 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09  bel_buf_len) {..
11770 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65  unsigned long ce
11780 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
11790 63 68 61 72 20 2a 6c 61 62 65 6c 5f 61 73 6e 31  char *label_asn1
117a0 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69  ;..void *certifi
117b0 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f  cate;..int x509_
117c0 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74  read_ret;...cert
117d0 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69  ificate = identi
117e0 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b  ty->certificate;
117f0 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ..certificate_le
11800 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  n = identity->ce
11810 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
11820 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
11830 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65  _len < 0) {...re
11840 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78  turn(-1);..}...x
11850 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
11860 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63  509_to_subject(c
11870 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
11880 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f  ificate_len, (vo
11890 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73  id **) &label_as
118a0 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72  n1);..if (x509_r
118b0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
118c0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
118d0 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
118e0 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72  = x509_dn_to_str
118f0 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20  ing(label_asn1, 
11900 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28  x509_read_ret, (
11910 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75  char *) label_bu
11920 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e  f, label_buf_len
11930 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35  , "CN");..if (x5
11940 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30  09_read_ret <= 0
11950 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f  ) {...x509_read_
11960 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f  ret = x509_dn_to
11970 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73  _string(label_as
11980 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n1, x509_read_re
11990 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65  t, (char *) labe
119a0 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66  l_buf, label_buf
119b0 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09  _len, NULL);....
119c0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
119d0 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74  t <= 0) {....ret
119e0 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a  urn(-1);...}..}.
119f0 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50  .#ifdef CACKEY_P
11a00 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66  ARANOID.#  ifdef
11a10 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
11a20 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  X..if (x509_read
11a30 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53  _ret > _POSIX_SS
11a40 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
11a50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11a60 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ("x509_read_ret 
11a70 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20  exceeds maximum 
11a80 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67  value, returning
11a90 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61   in failure. (ma
11aa0 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65  x = %li, x509_re
11ab0 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20  ad_ret = %lu)", 
11ac0 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53  (long) _POSIX_SS
11ad0 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e  IZE_MAX, (unsign
11ae0 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65  ed long) x509_re
11af0 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  ad_ret);....retu
11b00 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
11b10 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74  dif.#endif...ret
11b20 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65  urn(x509_read_re
11b30 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  t);.}../* Return
11b40 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a  s 0 on success *
11b50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  /.static int cac
11b60 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65  key_mutex_create
11b70 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b  (void **mutex) {
11b80 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
11b90 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
11ba0 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
11bb0 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
11bc0 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
11bd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11be0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
11bf0 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
11c00 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
11c10 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
11c20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
11c30 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
11c40 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  utex = malloc(si
11c50 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75  zeof(*pthread_mu
11c60 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74  tex));...if (!pt
11c70 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09  hread_mutex) {..
11c80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11c90 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
11ca0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
11cb0 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
11cc0 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72  -1);...}....pthr
11cd0 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68  ead_retval = pth
11ce0 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28  read_mutex_init(
11cf0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e  pthread_mutex, N
11d00 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72  ULL);...if (pthr
11d10 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  ead_retval != 0)
11d20 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
11d30 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65  UG_PRINTF("pthre
11d40 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20  ad_mutex_init() 
11d50 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
11d60 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
11d70 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
11d80 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a  rn(-1);...}....*
11d90 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f  mutex = pthread_
11da0 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b  mutex;..} else {
11db0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
11dc0 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20  gs.CreateMutex) 
11dd0 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76  {....custom_retv
11de0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73  al = cackey_args
11df0 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74  .CreateMutex(mut
11e00 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
11e10 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
11e20 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
11e30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11e40 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65  "cackey_args.Cre
11e50 61 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 72  ateMutex() retur
11e60 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
11e70 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
11e80 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
11e90 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
11ea0 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
11eb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
11ec0 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
11ed0 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
11ee0 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  urn(0);.}../* Re
11ef0 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
11f00 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
11f10 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
11f20 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20  ck(void *mutex) 
11f30 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
11f40 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
11f50 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
11f60 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
11f70 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
11f80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11f90 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
11fa0 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
11fb0 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
11fc0 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
11fd0 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
11fe0 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
11ff0 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a  mutex = mutex;..
12000 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
12010 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
12020 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75  _lock(pthread_mu
12030 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72  tex);...if (pthr
12040 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  ead_retval != 0)
12050 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
12060 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65  UG_PRINTF("pthre
12070 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20  ad_mutex_lock() 
12080 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
12090 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
120a0 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
120b0 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65  rn(-1);...}..} e
120c0 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  lse {...if (cack
120d0 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65  ey_args.LockMute
120e0 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72  x) {....custom_r
120f0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61  etval = cackey_a
12100 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75  rgs.LockMutex(mu
12110 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
12120 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
12130 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
12140 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12150 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f  ("cackey_args.Lo
12160 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e  ckMutex() return
12170 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22  ed error (%li)."
12180 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f  , (long) custom_
12190 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65  retval);......re
121a0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09  turn(-1);....}..
121b0 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
121c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
121d0 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c  urning sucessful
121e0 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75  ly (0)");...retu
121f0 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  rn(0);.}../* Ret
12200 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
12210 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
12220 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
12230 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29  ock(void *mutex)
12240 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
12250 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
12260 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
12270 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
12280 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
12290 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
122a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
122b0 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
122c0 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
122d0 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
122e0 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
122f0 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
12300 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a  _mutex = mutex;.
12310 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
12320 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
12330 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64  x_unlock(pthread
12340 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70  _mutex);...if (p
12350 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d  thread_retval !=
12360 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
12370 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74  DEBUG_PRINTF("pt
12380 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
12390 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ck() returned er
123a0 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72  ror (%i).", pthr
123b0 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ead_retval);....
123c0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
123d0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
123e0 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c  (cackey_args.Unl
123f0 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63  ockMutex) {....c
12400 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63  ustom_retval = c
12410 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
12420 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a  kMutex(mutex);..
12430 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65  ...if (custom_re
12440 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  tval != CKR_OK) 
12450 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
12460 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65  UG_PRINTF("cacke
12470 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74  y_args.UnlockMut
12480 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ex() returned er
12490 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f  ror (%li).", (lo
124a0 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  ng) custom_retva
124b0 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  l);......return(
124c0 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  -1);....}...}..}
124d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
124e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
124f0 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30  g sucessfully (0
12500 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  )");...return(0)
12510 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41  ;.}..static CK_A
12520 54 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 63  TTRIBUTE_PTR cac
12530 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
12540 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41  es(CK_OBJECT_CLA
12550 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20  SS objectclass, 
12560 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
12570 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  sc_identity *ide
12580 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
12590 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75  long identity_nu
125a0 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  m, CK_ULONG_PTR 
125b0 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61  pulCount) {..sta
125c0 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f  tic CK_BBOOL ck_
125d0 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69  true = 1;..stati
125e0 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61  c CK_BBOOL ck_fa
125f0 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74 69 63  lse = 0;..static
12600 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72 75   CK_TRUST ck_tru
12610 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53 54 45  sted = CK_TRUSTE
12620 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43 4b  D_DELEGATOR;..CK
12630 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73 20  _ULONG numattrs 
12640 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e  = 0, retval_coun
12650 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  t;..CK_ATTRIBUTE
12660 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74 72 5f  _TYPE curr_attr_
12670 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42  type;..CK_ATTRIB
12680 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20 2a  UTE curr_attr, *
12690 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 44  retval;..CK_VOID
126a0 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b  _PTR pValue;..CK
126b0 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65  _ULONG ulValueLe
126c0 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c  n;..CK_OBJECT_CL
126d0 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c  ASS ck_object_cl
126e0 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46 49  ass;..CK_CERTIFI
126f0 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65 72  CATE_TYPE ck_cer
12700 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09  tificate_type;..
12710 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f 6b  CK_KEY_TYPE ck_k
12720 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54 46  ey_type;..CK_UTF
12730 38 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b 31  8CHAR ucTmpBuf[1
12740 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74 65  024];..SHA1Conte
12750 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d 44  xt sha1_ctx;..MD
12760 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a 09  5_CTX md5_ctx;..
12770 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68 61 73  uint8_t sha1_has
12780 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d 3b  h[SHA1HashSize];
12790 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68 61  ..uint8_t md5_ha
127a0 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d 3b  sh[MD5HashSize];
127b0 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
127c0 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73  *certificate;..s
127d0 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61  size_t certifica
127e0 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30  te_len = -1, x50
127f0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74  9_read_ret;..int
12800 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09   pValue_free;...
12810 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12820 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a  NTF("Called (obj
12830 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20  ectClass = %lu, 
12840 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25  identity_num = %
12850 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
12860 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61   long) objectcla
12870 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ss, identity_num
12880 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  );...*pulCount =
12890 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74   0;...if (object
128a0 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
128b0 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65  TIFICATE && obje
128c0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
128d0 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a  UBLIC_KEY && obj
128e0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
128f0 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f  PRIVATE_KEY && o
12900 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
12910 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
12920 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
12930 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
12940 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
12950 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 6f  NULL), invalid o
12960 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a 0a  bject class");..
12970 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
12980 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72 74  .}.../* Get Cert
12990 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74   */..if (identit
129a0 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  y == NULL) {...C
129b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
129c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
129d0 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
129e0 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79 20  invalid identiy 
129f0 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09 72  provided");....r
12a00 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
12a10 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ..certificate = 
12a20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
12a30 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63  icate;..certific
12a40 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69  ate_len = identi
12a50 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
12a60 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69  len;...if (certi
12a70 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d 31  ficate_len == -1
12a80 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65 20   || certificate 
12a90 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
12aa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12ab0 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
12ac0 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68  jects (NULL), th
12ad0 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65 73  is identity does
12ae0 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e 35   not have an X.5
12af0 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61  09 certificate a
12b00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 69  ssociated with i
12b10 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 77  t and will not w
12b20 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ork");....return
12b30 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  (NULL);..}.../* 
12b40 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74  Verify that cert
12b50 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e 31  ificate is ASN.1
12b60 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20 63   encoded X.509 c
12b70 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 69  ertificate */..i
12b80 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69 61  f (x509_to_seria
12b90 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  l(certificate, c
12ba0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
12bb0 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09 43  NULL) < 0) {...C
12bc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12bd0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
12be0 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
12bf0 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69 66  the X.509 certif
12c00 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64  icate associated
12c10 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e 74   with this ident
12c20 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69 64  ity is not valid
12c30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
12c40 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c  LL);..}...retval
12c50 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72 65  _count = 64;..re
12c60 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 65  tval = malloc(re
12c70 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a  tval_count * siz
12c80 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a  eof(*retval));..
12c90 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f  .for (curr_attr_
12ca0 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f 61  type = 0; curr_a
12cb0 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65 35  ttr_type < 0xce5
12cc0 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74 74 72  363bf; curr_attr
12cd0 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66 20  _type++) {...if 
12ce0 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  (curr_attr_type 
12cf0 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09 63  == 0x800) {....c
12d00 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20  urr_attr_type = 
12d10 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d 0a  0xce536300;...}.
12d20 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20 3d  ...pValue_free =
12d30 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e   0;...pValue = N
12d40 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65  ULL;...ulValueLe
12d50 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
12d60 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72  ;....switch (cur
12d70 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a 09  r_attr_type) {..
12d80 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53  ..case CKA_CLASS
12d90 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
12da0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
12db0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
12dc0 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30 38  CKA_CLASS (0x%08
12dd0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
12de0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
12df0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
12e00 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 20  ck_object_class 
12e10 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a 0a  = objectclass;..
12e20 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
12e30 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09  _object_class;..
12e40 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
12e50 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63 74  sizeof(ck_object
12e60 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43 41  _class);......CA
12e70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12e80 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
12e90 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
12ea0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
12eb0 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c   *((CK_OBJECT_CL
12ec0 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  ASS *) pValue), 
12ed0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
12ee0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
12ef0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
12f00 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b  ....case CKA_TOK
12f10 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  EN:.....CACKEY_D
12f20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
12f30 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
12f40 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78 25  e CKA_TOKEN (0x%
12f50 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
12f60 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
12f70 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
12f80 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
12f90 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
12fa0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
12fb0 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
12fc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12fd0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
12fe0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
12ff0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
13000 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
13010 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
13020 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
13030 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
13040 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
13050 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09  CKA_PRIVATE:....
13060 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13070 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
13080 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50   attribute CKA_P
13090 52 49 56 41 54 45 20 28 30 78 25 30 38 6c 78 29  RIVATE (0x%08lx)
130a0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
130b0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
130c0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
130d0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
130e0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
130f0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
13100 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13110 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
13120 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
13130 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74  we are not a Net
13140 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
13150 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
13160 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56  k;.....}......pV
13170 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
13180 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
13190 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
131a0 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  se);......CACKEY
131b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
131c0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
131d0 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
131e0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
131f0 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
13200 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
13210 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
13220 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
13230 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
13240 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09 43  A_TRUSTED:.....C
13250 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13260 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
13270 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
13280 53 54 45 44 20 28 30 78 25 30 38 6c 78 29 20 2e  STED (0x%08lx) .
13290 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
132a0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
132b0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
132c0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
132d0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
132e0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
132f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
13300 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
13310 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
13320 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
13330 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
13340 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
13350 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  .}......pValue =
13360 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75   &ck_true;.....u
13370 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
13380 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09  of(ck_true);....
13390 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
133a0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
133b0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
133c0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
133d0 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
133e0 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
133f0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
13400 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
13410 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
13420 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49  .case CKA_MODIFI
13430 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABLE:.....CACKEY
13440 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13450 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
13460 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42  ute CKA_MODIFIAB
13470 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  LE (0x%08lx) ...
13480 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
13490 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
134a0 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
134b0 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
134c0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
134d0 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
134e0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
134f0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
13500 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
13510 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
13520 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
13530 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
13540 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
13550 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
13560 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
13570 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42  ....case CKA_LAB
13580 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  EL:.....CACKEY_D
13590 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
135a0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
135b0 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78 25  e CKA_LABEL (0x%
135c0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
135d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
135e0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
135f0 09 09 2f 2a 20 58 58 58 3a 20 44 65 74 65 72 6d  ../* XXX: Determ
13600 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 09  ine name */.....
13610 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70  ulValueLen = snp
13620 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29 20 75  rintf((char *) u
13630 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66 28  cTmpBuf, sizeof(
13640 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64 65 6e  ucTmpBuf), "Iden
13650 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75 6e 73  tity #%lu", (uns
13660 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e  igned long) iden
13670 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 70  tity_num);.....p
13680 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75 66  Value = ucTmpBuf
13690 3b 0a 0a 09 09 09 09 69 66 20 28 75 6c 56 61 6c  ;......if (ulVal
136a0 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 28  ueLen >= sizeof(
136b0 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09 09 09  ucTmpBuf)) {....
136c0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 30  ..ulValueLen = 0
136d0 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
136e0 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  NULL;.....}.....
136f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13700 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
13710 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
13720 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
13730 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
13740 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
13750 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ....case CKA_VAL
13760 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  UE:.....CACKEY_D
13770 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
13780 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
13790 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30 78 25  e CKA_VALUE (0x%
137a0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
137b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
137c0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
137d0 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65 63 74  ..switch (object
137e0 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09 63 61  class) {......ca
137f0 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  se CKO_PRIVATE_K
13800 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59  EY:.......CACKEY
13810 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
13820 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
13830 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
13840 65 20 61 72 65 20 61 20 70 72 69 76 61 74 65 20  e are a private 
13850 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62  key.");........b
13860 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
13870 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
13880 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ST:.......CACKEY
13890 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
138a0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
138b0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
138c0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
138d0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
138e0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
138f0 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 42  ....case CKO_PUB
13900 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 69  LIC_KEY:.......i
13910 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
13920 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
13930 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
13940 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b 65 79  = x509_to_pubkey
13950 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
13960 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
13970 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 09 09  pValue);........
13980 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
13990 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 09 09 09  t < 0) { .......
139a0 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
139b0 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  ........} else {
139c0 0a 09 09 09 09 09 09 09 09 75 6c 56 61 6c 75 65  .........ulValue
139d0 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
139e0 72 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09  ret;........}...
139f0 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 62 72 65  ....}........bre
13a00 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b  ak;......case CK
13a10 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  O_CERTIFICATE:..
13a20 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 63 65  .....pValue = ce
13a30 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09  rtificate;......
13a40 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63 65  .ulValueLen = ce
13a50 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
13a60 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
13a70 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
13a80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
13a90 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
13aa0 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
13ab0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
13ac0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
13ad0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
13ae0 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09 43 41  A_ISSUER:.....CA
13af0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13b00 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
13b10 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53 53 55  tribute CKA_ISSU
13b20 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ER (0x%08lx) ...
13b30 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
13b40 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
13b50 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
13b60 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
13b70 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f  CERTIFICATE && o
13b80 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
13b90 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
13ba0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
13bb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
13bc0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
13bd0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
13be0 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
13bf0 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61  ficate or Netsca
13c00 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
13c10 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
13c20 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
13c30 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
13c40 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
13c50 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
13c60 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72 74 69  _to_issuer(certi
13c70 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
13c80 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
13c90 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
13ca0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
13cb0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
13cc0 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
13cd0 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
13ce0 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
13cf0 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
13d00 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
13d10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
13d20 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
13d30 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
13d40 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
13d50 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
13d60 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
13d70 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a  A_SERIAL_NUMBER:
13d80 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
13d90 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
13da0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
13db0 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
13dc0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
13dd0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13de0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
13df0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
13e00 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
13e10 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a  RTIFICATE && obj
13e20 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
13e30 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
13e40 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
13e50 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
13e60 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
13e70 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
13e80 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
13e90 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65  cate or Netscape
13ea0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
13eb0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
13ec0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
13ed0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
13ee0 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
13ef0 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
13f00 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69  o_serial(certifi
13f10 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
13f20 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
13f30 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
13f40 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
13f50 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
13f60 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
13f70 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
13f80 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
13f90 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
13fa0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
13fb0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
13fc0 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
13fd0 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
13fe0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
13ff0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
14000 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
14010 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43  A_SUBJECT:.....C
14020 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14030 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
14040 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42  ttribute CKA_SUB
14050 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e  JECT (0x%08lx) .
14060 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
14070 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
14080 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
14090 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
140a0 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
140b0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
140c0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
140d0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
140e0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
140f0 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
14100 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ate");.......bre
14110 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
14120 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
14130 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
14140 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
14150 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28  x509_to_subject(
14160 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
14170 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
14180 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
14190 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
141a0 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
141b0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
141c0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
141d0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
141e0 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
141f0 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
14200 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14210 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
14220 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
14230 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
14240 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
14250 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
14260 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43  se CKA_ID:.....C
14270 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14280 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
14290 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44 20  ttribute CKA_ID 
142a0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
142b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
142c0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
142d0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
142e0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
142f0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
14300 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14310 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
14320 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
14330 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
14340 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
14350 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
14360 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
14370 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d  ...ucTmpBuf[0] =
14380 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20   ((identity_num 
14390 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66  + 1) >> 8) & 0xf
143a0 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b  f;.....ucTmpBuf[
143b0 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f  1] =  (identity_
143c0 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b  num + 1) & 0xff;
143d0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
143e0 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c  ucTmpBuf;.....ul
143f0 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09  ValueLen = 2;...
14400 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14410 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
14420 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
14430 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
14440 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
14450 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
14460 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ....case CKA_CER
14470 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09  TIFICATE_TYPE:..
14480 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14490 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
144a0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
144b0 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
144c0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
144d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
144e0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
144f0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
14500 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
14510 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
14520 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14530 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
14540 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
14550 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
14560 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65  ot a certificate
14570 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  .");.......break
14580 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
14590 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
145a0 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20  one certificate 
145b0 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63  type */.....ck_c
145c0 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 20  ertificate_type 
145d0 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09  = CKC_X_509;....
145e0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63  ..pValue = &ck_c
145f0 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
14600 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
14610 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74  = sizeof(ck_cert
14620 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a  ificate_type);..
14630 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14640 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
14650 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30  turning CKC_X_50
14660 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29  9 (%lu) (%p/%lu)
14670 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
14680 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49  g) *((CK_CERTIFI
14690 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61  CATE_TYPE *) pVa
146a0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
146b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
146c0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
146d0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
146e0 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09  KA_KEY_TYPE:....
146f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14700 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
14710 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b   attribute CKA_K
14720 45 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78  EY_TYPE (0x%08lx
14730 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
14740 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
14750 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
14760 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
14770 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
14780 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
14790 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  != CKO_PUBLIC_KE
147a0 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  Y) {......CACKEY
147b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
147c0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
147d0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
147e0 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e  e are not a key.
147f0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
14800 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57  .....}....../* W
14810 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f  e only support o
14820 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09  ne key type */..
14830 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d  ...ck_key_type =
14840 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70   CKK_RSA;......p
14850 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f  Value = &ck_key_
14860 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  type;.....ulValu
14870 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
14880 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09  _key_type);.....
14890 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
148a0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
148b0 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c  ning CKK_RSA (%l
148c0 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  u) (%p/%lu)", (u
148d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
148e0 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  (CK_CERTIFICATE_
148f0 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c  TYPE *) pValue),
14900 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
14910 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
14920 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
14930 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49  ;....case CKA_SI
14940 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  GN:.....CACKEY_D
14950 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
14960 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
14970 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30  e CKA_SIGN (0x%0
14980 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
14990 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
149a0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
149b0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
149c0 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
149d0 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
149e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
149f0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
14a00 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
14a10 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
14a20 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
14a30 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
14a40 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
14a50 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
14a60 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
14a70 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
14a80 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
14a90 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
14aa0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
14ab0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
14ac0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
14ad0 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
14ae0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
14af0 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a  _false);.....}..
14b00 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14b10 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
14b20 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
14b30 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
14b40 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
14b50 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
14b60 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
14b70 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
14b80 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
14b90 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e  ...case CKA_SIGN
14ba0 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09 43 41  _RECOVER:.....CA
14bb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14bc0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
14bd0 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e  tribute CKA_SIGN
14be0 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30 38 6c  _RECOVER (0x%08l
14bf0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
14c00 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
14c10 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
14c20 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
14c30 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
14c40 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
14c50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14c60 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
14c70 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
14c80 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
14c90 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
14ca0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
14cb0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57  .....}....../* W
14cc0 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79  e currently only
14cd0 20 73 75 70 70 6f 72 74 20 22 53 69 67 6e 20 77   support "Sign w
14ce0 69 74 68 20 41 70 70 65 6e 64 69 78 22 20 2a 2f  ith Appendix" */
14cf0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
14d00 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56  k_false;.....ulV
14d10 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
14d20 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09  (ck_false);.....
14d30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14d40 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
14d50 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
14d60 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
14d70 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
14d80 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
14d90 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
14da0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
14db0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
14dc0 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50 54  case CKA_DECRYPT
14dd0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
14de0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
14df0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
14e00 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30 78 25  CKA_DECRYPT (0x%
14e10 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
14e20 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
14e30 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
14e40 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
14e50 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
14e60 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
14e70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14e80 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
14e90 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
14ea0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
14eb0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
14ec0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
14ed0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
14ee0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
14ef0 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
14f00 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y || objectclass
14f10 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   == CKO_PUBLIC_K
14f20 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
14f30 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
14f40 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
14f50 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
14f60 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
14f70 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
14f80 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
14f90 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
14fa0 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
14fb0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14fc0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
14fd0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
14fe0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
14ff0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
15000 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
15010 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
15020 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
15030 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
15040 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45  ;....case CKA_SE
15050 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 43 41 43  NSITIVE:.....CAC
15060 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15070 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
15080 72 69 62 75 74 65 20 43 4b 41 5f 53 45 4e 53 49  ribute CKA_SENSI
15090 54 49 56 45 20 28 30 78 25 30 38 6c 78 29 20 2e  TIVE (0x%08lx) .
150a0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
150b0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
150c0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
150d0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
150e0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
150f0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
15100 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
15110 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
15120 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
15130 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
15140 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
15150 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
15160 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  .}......if (obje
15170 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
15180 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
15190 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
151a0 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
151b0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
151c0 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
151d0 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
151e0 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
151f0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
15200 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
15210 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
15220 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15230 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
15240 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
15250 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
15260 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
15270 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
15280 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
15290 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
152a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
152b0 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  e CKA_EXTRACTABL
152c0 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
152d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
152e0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
152f0 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45   CKA_EXTRACTABLE
15300 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
15310 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
15320 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
15330 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
15340 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
15350 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
15360 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15370 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
15380 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
15390 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
153a0 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
153b0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
153c0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
153d0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
153e0 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
153f0 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  TE_KEY) {......p
15400 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
15410 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
15420 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
15430 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
15440 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
15450 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09   &ck_true;......
15460 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
15470 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
15480 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
15490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
154a0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
154b0 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
154c0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
154d0 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
154e0 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
154f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
15500 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
15510 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
15520 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09 43  A_MODULUS:.....C
15530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15540 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
15550 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44  ttribute CKA_MOD
15560 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20 2e  ULUS (0x%08lx) .
15570 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
15580 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
15590 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
155a0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
155b0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
155c0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
155d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
155e0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
155f0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
15600 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
15610 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
15620 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
15630 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
15640 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
15650 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
15660 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
15670 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69 66 69  _modulus(certifi
15680 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
15690 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
156a0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
156b0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
156c0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
156d0 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
156e0 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
156f0 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
15700 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
15710 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15720 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
15730 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
15740 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
15750 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
15760 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
15770 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
15780 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e  A_PUBLIC_EXPONEN
15790 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  T:.....CACKEY_DE
157a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
157b0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
157c0 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
157d0 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29 20 2e  NENT (0x%08lx) .
157e0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
157f0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
15800 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
15810 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
15820 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
15830 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
15840 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
15850 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
15860 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
15870 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
15880 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
15890 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
158a0 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
158b0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
158c0 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
158d0 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
158e0 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74 69 66  _exponent(certif
158f0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
15900 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
15910 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
15920 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
15930 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
15940 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
15950 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
15960 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
15970 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
15980 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
15990 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
159a0 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
159b0 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
159c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
159d0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
159e0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
159f0 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54 41 4c  KA_TRUST_DIGITAL
15a00 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09 09 63  _SIGNATURE:....c
15a10 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4e 4f  ase CKA_TRUST_NO
15a20 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a 0a 09  N_REPUDIATION:..
15a30 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
15a40 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d 45 4e  _KEY_ENCIPHERMEN
15a50 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  T:....case CKA_T
15a60 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49 50 48  RUST_DATA_ENCIPH
15a70 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20  ERMENT:....case 
15a80 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 41 47  CKA_TRUST_KEY_AG
15a90 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65  REEMENT:....case
15aa0 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 43   CKA_TRUST_KEY_C
15ab0 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73  ERT_SIGN:....cas
15ac0 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52 4c 5f  e CKA_TRUST_CRL_
15ad0 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b  SIGN:....case CK
15ae0 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41  A_TRUST_SERVER_A
15af0 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  UTH:....case CKA
15b00 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
15b10 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  TH:....case CKA_
15b20 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49  TRUST_CODE_SIGNI
15b30 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  NG:....case CKA_
15b40 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54  TRUST_EMAIL_PROT
15b50 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41 43 4b  ECTION:.....CACK
15b60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15b70 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
15b80 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f  ibute CKA_TRUST_
15b90 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ... (0x%08lx) ..
15ba0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
15bb0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
15bc0 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
15bd0 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 64 3b 0a   = &ck_trusted;.
15be0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
15bf0 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 73 74   sizeof(ck_trust
15c00 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ed);......CACKEY
15c10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
15c20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
15c30 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
15c40 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
15c50 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 56 61 6c  CK_TRUST *) pVal
15c60 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
15c70 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
15c80 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
15c90 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
15ca0 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48  A_CERT_SHA1_HASH
15cb0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
15cc0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
15cd0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
15ce0 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41  CKA_CERT_SHA1_HA
15cf0 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  SH (0x%08lx) ...
15d00 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15d10 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
15d20 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
15d30 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
15d40 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
15d50 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
15d60 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
15d70 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
15d80 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
15d90 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70  re not a Netscap
15da0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
15db0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
15dc0 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 31 52 65  ...}......SHA1Re
15dd0 73 65 74 28 26 73 68 61 31 5f 63 74 78 29 3b 0a  set(&sha1_ctx);.
15de0 09 09 09 09 53 48 41 31 49 6e 70 75 74 28 26 73  ....SHA1Input(&s
15df0 68 61 31 5f 63 74 78 2c 20 63 65 72 74 69 66 69  ha1_ctx, certifi
15e00 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
15e10 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48 41 31  e_len);.....SHA1
15e20 52 65 73 75 6c 74 28 26 73 68 61 31 5f 63 74 78  Result(&sha1_ctx
15e30 2c 20 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09  , sha1_hash);...
15e40 09 09 09 70 56 61 6c 75 65 20 3d 20 73 68 61 31  ...pValue = sha1
15e50 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c  _hash;.....ulVal
15e60 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 73  ueLen = sizeof(s
15e70 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09  ha1_hash);......
15e80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15e90 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
15ea0 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
15eb0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
15ec0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
15ed0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
15ee0 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 4d  .case CKA_CERT_M
15ef0 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43  D5_HASH:.....CAC
15f00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15f10 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
15f20 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f  ribute CKA_CERT_
15f30 4d 44 35 5f 48 41 53 48 20 28 30 78 25 30 38 6c  MD5_HASH (0x%08l
15f40 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
15f50 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
15f60 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
15f70 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
15f80 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
15f90 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
15fa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15fb0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
15fc0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
15fd0 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e  e we are not a N
15fe0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
15ff0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
16000 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
16010 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f 63 74 78  MD5Init(&md5_ctx
16020 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 61 74 65  );.....MD5Update
16030 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 72 74 69  (&md5_ctx, certi
16040 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
16050 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 4d 44  ate_len);.....MD
16060 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73 68 2c  5Final(md5_hash,
16070 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09 09 09   &md5_ctx);.....
16080 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f 68 61  .pValue = md5_ha
16090 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  sh;.....ulValueL
160a0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64 35 5f  en = sizeof(md5_
160b0 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b  hash);......CACK
160c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
160d0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
160e0 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
160f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16100 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
16110 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66  ...break;....def
16120 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75 65  ault:.....pValue
16130 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56   = NULL;.....ulV
16140 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
16150 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72 65 61  NG) -1;.....brea
16160 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 28  k;...}....if (((
16170 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65  CK_LONG) ulValue
16180 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e  Len) != ((CK_LON
16190 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20  G) -1)) {..../* 
161a0 50 75 73 68 20 63 75 72 72 5f 61 74 74 72 20 6f  Push curr_attr o
161b0 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 2a 2f  nto the stack */
161c0 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 74 79  ....curr_attr.ty
161d0 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72 5f 74  pe = curr_attr_t
161e0 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61 74 74  ype;....curr_att
161f0 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75  r.ulValueLen = u
16200 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63  lValueLen;.....c
16210 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 20  urr_attr.pValue 
16220 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74  = malloc(curr_at
16230 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  tr.ulValueLen);.
16240 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
16250 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c  ttr.pValue, pVal
16260 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e 75 6c  ue, curr_attr.ul
16270 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69  ValueLen);.....i
16280 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65 20 26  f (pValue_free &
16290 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09  & pValue) {.....
162a0 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a 09 09  free(pValue);...
162b0 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61 74  .}.....if (numat
162c0 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f  trs >= retval_co
162d0 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74 76 61  unt) {.....retva
162e0 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76  l = realloc(retv
162f0 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74  al, retval_count
16300 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61   * sizeof(*retva
16310 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65  l));....}.....me
16320 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d  mcpy(&retval[num
16330 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74  attrs], &curr_at
16340 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f  tr, sizeof(curr_
16350 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74  attr));....numat
16360 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  trs++;...}..}...
16370 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20  if (numattrs != 
16380 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f  0) {...retval_co
16390 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a  unt = numattrs;.
163a0 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
163b0 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61  oc(retval, retva
163c0 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  l_count * sizeof
163d0 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65  (*retval));..} e
163e0 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74  lse {...free(ret
163f0 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20  val);....retval 
16400 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75  = NULL;..}...*pu
16410 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72  lCount = numattr
16420 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  s;...CACKEY_DEBU
16430 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
16440 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20  ing %lu objects 
16450 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73  (%p).", numattrs
16460 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  , retval);...ret
16470 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
16480 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
16490 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69  ey_free_identiti
164a0 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  es(struct cackey
164b0 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
164c0 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20  ities, unsigned 
164d0 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f  long identities_
164e0 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54  count) {..CK_ATT
164f0 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74  RIBUTE *curr_att
16500 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  r;..unsigned lon
16510 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69  g id_idx, attr_i
16520 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  dx;...if (identi
16530 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  ties == NULL || 
16540 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
16550 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72   == 0) {...retur
16560 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f  n;..}...for (id_
16570 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20  idx = 0; id_idx 
16580 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  < identities_cou
16590 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a  nt; id_idx++) {.
165a0 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
165b0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
165c0 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61  tes) {....for (a
165d0 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74  ttr_idx = 0; att
165e0 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69  r_idx < identiti
165f0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
16600 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74  butes_count; att
16610 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63  r_idx++) {.....c
16620 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e  urr_attr = &iden
16630 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
16640 74 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69  ttributes[attr_i
16650 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75  dx];......if (cu
16660 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29  rr_attr->pValue)
16670 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
16680 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b  r_attr->pValue);
16690 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
166a0 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69  if (identities[i
166b0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
166c0 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64  s) {.....free(id
166d0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
166e0 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09  .attributes);...
166f0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
16700 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74  ee_certs(identit
16710 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
16720 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29  _identity, 1, 1)
16730 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28  ;...}..}...free(
16740 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a  identities);.}..
16750 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
16760 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63  ckey_identity *c
16770 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74  ackey_read_ident
16780 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63  ities(struct cac
16790 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
167a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69  unsigned long *i
167b0 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72  ds_found) {..str
167c0 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
167d0 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
167e0 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75  dentities;..stru
167f0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
16800 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a  ty *identities;.
16810 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
16820 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20  um_ids, id_idx, 
16830 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75  curr_id_type;..u
16840 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
16850 5f 63 65 72 74 73 2c 20 6e 75 6d 5f 65 78 74 72  _certs, num_extr
16860 61 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69 64  a_certs, cert_id
16870 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f  x;..int include_
16880 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b  extra_certs = 1;
16890 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
168a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
168b0 29 3b 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  );...if (getenv(
168c0 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41  "CACKEY_NO_EXTRA
168d0 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c  _CERTS") != NULL
168e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
168f0 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64  UG_PRINTF("Asked
16900 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65 20   not to include 
16910 65 78 74 72 61 20 28 44 6f 44 29 20 63 65 72 74  extra (DoD) cert
16920 69 66 69 63 61 74 65 73 22 29 3b 0a 0a 09 09 69  ificates");....i
16930 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72  nclude_extra_cer
16940 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  ts = 0;..}...if 
16950 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63  (include_extra_c
16960 65 72 74 73 29 20 7b 0a 09 09 6e 75 6d 5f 65 78  erts) {...num_ex
16970 74 72 61 5f 63 65 72 74 73 20 3d 20 73 69 7a 65  tra_certs = size
16980 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 29 20  of(extra_certs) 
16990 2f 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63  / sizeof(extra_c
169a0 65 72 74 73 5b 30 5d 29 3b 0a 0a 09 09 43 41 43  erts[0]);....CAC
169b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
169c0 28 22 49 6e 63 6c 75 64 69 6e 67 20 25 6c 69 20  ("Including %li 
169d0 44 6f 44 20 43 65 72 74 69 66 69 63 61 74 65 73  DoD Certificates
169e0 20 61 73 20 6f 62 6a 65 63 74 73 20 6f 6e 20 74   as objects on t
169f0 68 69 73 20 74 6f 6b 65 6e 22 2c 20 6e 75 6d 5f  his token", num_
16a00 65 78 74 72 61 5f 63 65 72 74 73 29 3b 0a 09 7d  extra_certs);..}
16a10 20 65 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f 65 78   else {...num_ex
16a20 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09  tra_certs = 0;..
16a30 7d 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e  }...if (ids_foun
16a40 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d == NULL) {...C
16a50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16a60 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f  TF("Error.  ids_
16a70 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b  found is NULL");
16a80 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
16a90 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e  ;..}...pcsc_iden
16aa0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
16ab0 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c  read_certs(slot,
16ac0 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74   NULL, &num_cert
16ad0 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64  s);..if (pcsc_id
16ae0 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
16af0 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74  ) {.../* Convert
16b00 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73   number of Certs
16b10 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62   to number of ob
16b20 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69  jects */...num_i
16b30 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54  ds = (CKO_PRIVAT
16b40 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54  E_KEY - CKO_CERT
16b50 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e  IFICATE + 1) * n
16b60 75 6d 5f 63 65 72 74 73 3b 0a 09 09 6e 75 6d 5f  um_certs;...num_
16b70 69 64 73 20 2b 3d 20 6e 75 6d 5f 65 78 74 72 61  ids += num_extra
16b80 5f 63 65 72 74 73 20 2a 20 33 3b 0a 0a 09 09 69  _certs * 3;....i
16b90 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c  dentities = mall
16ba0 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a  oc(num_ids * siz
16bb0 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29  eof(*identities)
16bc0 29 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63 65 72  );..../* Add cer
16bd0 74 69 66 69 63 61 74 65 73 2c 20 70 75 62 6c 69  tificates, publi
16be0 63 20 6b 65 79 73 2c 20 61 6e 64 20 70 72 69 76  c keys, and priv
16bf0 61 74 65 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ate keys from th
16c00 65 20 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a 09  e smartcard */..
16c10 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66  .id_idx = 0;...f
16c20 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30  or (cert_idx = 0
16c30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d  ; cert_idx < num
16c40 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78  _certs; cert_idx
16c50 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28 63 75  ++) {....for (cu
16c60 72 72 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f  rr_id_type = CKO
16c70 5f 43 45 52 54 49 46 49 43 41 54 45 3b 20 63 75  _CERTIFICATE; cu
16c80 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b  rr_id_type <= CK
16c90 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b 20 63  O_PRIVATE_KEY; c
16ca0 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b  urr_id_type++) {
16cb0 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
16cc0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
16cd0 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
16ce0 61 74 74 72 69 62 75 74 65 73 28 63 75 72 72 5f  attributes(curr_
16cf0 69 64 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69  id_type, &pcsc_i
16d00 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
16d10 64 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26  dx], cert_idx, &
16d20 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
16d30 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
16d40 75 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74  unt);......ident
16d50 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
16d60 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61  sc_identity = ma
16d70 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65  lloc(sizeof(*ide
16d80 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
16d90 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b  pcsc_identity));
16da0 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e  .....memcpy(iden
16db0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
16dc0 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70  csc_identity, &p
16dd0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
16de0 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66  ert_idx], sizeof
16df0 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  (*identities[id_
16e00 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
16e10 74 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74  ty));......ident
16e20 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
16e30 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72  sc_identity->cer
16e40 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f  tificate = mallo
16e50 63 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  c(pcsc_identitie
16e60 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74  s[cert_idx].cert
16e70 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
16e80 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74  ..memcpy(identit
16e90 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
16ea0 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
16eb0 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65  ficate, pcsc_ide
16ec0 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
16ed0 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70  ].certificate, p
16ee0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
16ef0 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69  ert_idx].certifi
16f00 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  cate_len);......
16f10 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09  id_idx++;....}..
16f20 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65  .}....cackey_fre
16f30 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65  e_certs(pcsc_ide
16f40 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72  ntities, num_cer
16f50 74 73 2c 20 31 29 3b 0a 0a 09 09 2f 2a 20 41 64  ts, 1);..../* Ad
16f60 64 20 44 6f 44 20 43 65 72 74 69 66 69 63 61 74  d DoD Certificat
16f70 65 73 20 61 6e 64 20 4e 65 74 73 63 61 70 65 20  es and Netscape 
16f80 54 72 75 73 74 20 4f 62 6a 65 63 74 73 20 2a 2f  Trust Objects */
16f90 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78  ...for (cert_idx
16fa0 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c   = 0; cert_idx <
16fb0 20 6e 75 6d 5f 65 78 74 72 61 5f 63 65 72 74 73   num_extra_certs
16fc0 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a  ; cert_idx++) {.
16fd0 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
16fe0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
16ff0 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 69  ity = NULL;....i
17000 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
17010 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
17020 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
17030 75 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 49  utes(CKO_CERTIFI
17040 43 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65 72  CATE, &extra_cer
17050 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78  ts[cert_idx], 0x
17060 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c  f000 | cert_idx,
17070 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
17080 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
17090 63 6f 75 6e 74 29 3b 0a 09 09 09 69 64 5f 69 64  count);....id_id
170a0 78 2b 2b 3b 0a 0a 09 09 09 69 64 65 6e 74 69 74  x++;.....identit
170b0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
170c0 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  _identity = NULL
170d0 3b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  ;....identities[
170e0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
170f0 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
17100 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 50  attributes(CKO_P
17110 55 42 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74 72  UBLIC_KEY, &extr
17120 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78  a_certs[cert_idx
17130 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74  ], 0xf000 | cert
17140 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65  _idx, &identitie
17150 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
17160 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 09  utes_count);....
17170 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 09 69 64  id_idx++;.....id
17180 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
17190 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  .pcsc_identity =
171a0 20 4e 55 4c 4c 3b 0a 09 09 09 69 64 65 6e 74 69   NULL;....identi
171b0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
171c0 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
171d0 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
171e0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
171f0 53 54 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73  ST, &extra_certs
17200 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30  [cert_idx], 0xf0
17210 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26  00 | cert_idx, &
17220 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
17230 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
17240 75 6e 74 29 3b 0a 09 09 09 69 64 5f 69 64 78 2b  unt);....id_idx+
17250 2b 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66  +;...}....*ids_f
17260 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a  ound = num_ids;.
17270 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74  ..return(identit
17280 69 65 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64 73 5f  ies);..}...*ids_
17290 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75  found = 0;..retu
172a0 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f  rn(NULL);.}..CK_
172b0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
172c0 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c  CK_RV, C_Initial
172d0 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52  ize)(CK_VOID_PTR
172e0 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43   pInitArgs) {..C
172f0 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41  K_C_INITIALIZE_A
17300 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b  RGS CK_PTR args;
17310 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a  ..uint32_t idx;.
17320 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f  .int mutex_init_
17330 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
17340 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
17350 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63  ed.");...if (cac
17360 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
17370 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
17380 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
17390 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61    Already initia
173a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
173b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
173c0 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c  _ALREADY_INITIAL
173d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
173e0 70 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c  pInitArgs != NUL
173f0 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49  L) {...args = pI
17400 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70  nitArgs;...memcp
17410 79 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20  y(&cackey_args, 
17420 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63  args, sizeof(cac
17430 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69  key_args));....i
17440 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d  f (args->CreateM
17450 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
17460 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74  args->DestroyMut
17470 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex == NULL || ar
17480 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d  gs->LockMutex ==
17490 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55   NULL || args->U
174a0 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55  nlockMutex == NU
174b0 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67  LL) {....if (arg
174c0 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21  s->CreateMutex !
174d0 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
174e0 44 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20  DestroyMutex != 
174f0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f  NULL || args->Lo
17500 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20  ckMutex != NULL 
17510 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d  || args->UnlockM
17520 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  utex != NULL) {.
17530 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17540 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
17550 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c  Some, but not Al
17560 6c 20 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d  l threading prim
17570 69 74 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e  itives provided.
17580 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
17590 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
175a0 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20  D);....}...}..} 
175b0 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f  else {...cackey_
175c0 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
175d0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
175e0 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75  y_args.DestroyMu
175f0 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
17600 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
17610 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
17620 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
17630 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
17640 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67  cackey_args.flag
17650 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20  s = 0;..}...for 
17660 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
17670 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
17680 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
17690 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
176a0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
176b0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
176c0 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ns[idx].active =
176d0 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64   0;..}...for (id
176e0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
176f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
17700 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
17710 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
17720 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79  dx++) {...cackey
17730 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69  _slots[idx].acti
17740 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ve = 0;...cackey
17750 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
17760 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a  _reader = NULL;.
17770 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
17780 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
17790 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63  depth = 0;...cac
177a0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
177b0 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
177c0 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 63  hw_lock = 0;...c
177d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
177e0 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b  .slot_reset = 0;
177f0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
17800 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  idx].token_flags
17810 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
17820 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20  lots[idx].label 
17830 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63  = NULL;..}...cac
17840 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20  key_initialized 
17850 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  = 1;...if (!cack
17860 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29  ey_biglock_init)
17870 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f   {...mutex_init_
17880 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  ret = cackey_mut
17890 65 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65  ex_create(&cacke
178a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69  y_biglock);....i
178b0 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  f (mutex_init_re
178c0 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  t != 0) {....CAC
178d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
178e0 28 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20  ("Error.  Mutex 
178f0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  initialization f
17900 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
17910 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f  turn(CKR_CANT_LO
17920 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  CK);...}....cack
17930 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20  ey_biglock_init 
17940 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  = 1;..}...CACKEY
17950 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17960 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
17970 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
17980 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
17990 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
179a0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
179b0 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f  _Finalize)(CK_VO
179c0 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64  ID_PTR pReserved
179d0 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64  ) {..uint32_t id
179e0 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
179f0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
17a00 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65  .");...if (pRese
17a10 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  rved != NULL) {.
17a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17a30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52  RINTF("Error. pR
17a40 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e  eserved is not N
17a50 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
17a60 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
17a70 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
17a80 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
17a90 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
17aa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
17ab0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
17ac0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
17ad0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
17ae0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
17af0 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
17b00 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
17b10 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
17b20 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
17b30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
17b40 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
17b50 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
17b60 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
17b70 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69  ....C_CloseSessi
17b80 6f 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a  on(idx);...}..}.
17b90 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
17ba0 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
17bb0 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
17bc0 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
17bd0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
17be0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
17bf0 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ts[0])); idx++) 
17c00 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
17c10 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72  lots[idx].pcsc_r
17c20 65 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65  eader) {....free
17c30 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
17c40 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  x].pcsc_reader);
17c50 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
17c60 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
17c70 28 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69  ();...cackey_ini
17c80 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09  tialized = 0;...
17c90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17ca0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
17cb0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
17cc0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
17cd0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
17ce0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
17cf0 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28  _RV, C_GetInfo)(
17d00 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  CK_INFO_PTR pInf
17d10 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  o) {..static CK_
17d20 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63  UTF8CHAR manufac
17d30 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53  turerID[] = "U.S
17d40 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09  . Government";..
17d50 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
17d60 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69  AR libraryDescri
17d70 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
17d80 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  y";...CACKEY_DEB
17d90 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
17da0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
17db0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
17dc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17dd0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
17de0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
17df0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
17e00 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
17e10 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
17e20 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
17e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17e40 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
17e50 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
17e60 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
17e70 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
17e80 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66  IZED);..}...pInf
17e90 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69  o->cryptokiVersi
17ea0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
17eb0 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
17ec0 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
17ed0 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
17ee0 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
17ef0 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
17f00 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
17f10 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
17f20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74  & 0xff;...memset
17f30 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
17f40 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a  urerID, ' ', siz
17f50 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
17f60 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65  acturerID));..me
17f70 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
17f80 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75  facturerID, manu
17f90 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65  facturerID, size
17fa0 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49  of(manufacturerI
17fb0 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f  D) - 1);...pInfo
17fc0 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a  ->flags = 0x00;.
17fd0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
17fe0 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
17ff0 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  on, ' ', sizeof(
18000 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
18010 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
18020 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mcpy(pInfo->libr
18030 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
18040 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
18050 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61  on, sizeof(libra
18060 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d  ryDescription) -
18070 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69   1);...pInfo->li
18080 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a  braryVersion.maj
18090 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
180a0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
180b0 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
180c0 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e  >libraryVersion.
180d0 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
180e0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
180f0 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43  8) & 0xff;...CAC
18100 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18110 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
18120 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
18130 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
18140 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72  OK);.}../*. * Pr
18150 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65  ocess list of re
18160 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74  aders, and creat
18170 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65  e mapping betwee
18180 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e  n reader name an
18190 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b  d slot ID. */.CK
181a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
181b0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f  (CK_RV, C_GetSlo
181c0 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20  tList)(CK_BBOOL 
181d0 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b  tokenPresent, CK
181e0 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
181f0 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  otList, CK_ULONG
18200 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b  _PTR pulCount) {
18210 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
18220 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f  al;..int pcsc_co
18230 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55  nnect_ret;..CK_U
18240 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74  LONG count, slot
18250 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72  _count = 0, curr
18260 73 6c 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73  slot;..char *pcs
18270 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63  c_readers, *pcsc
18280 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73  _readers_s, *pcs
18290 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57  c_readers_e;..DW
182a0 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73  ORD pcsc_readers
182b0 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _len;..LONG scar
182c0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
182d0 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f  t;..size_t curr_
182e0 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41  reader_len;...CA
182f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18300 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
18310 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20  if (pulCount == 
18320 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
18330 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18340 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69  rror. pulCount i
18350 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
18360 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
18370 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
18380 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
18390 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
183a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
183b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
183c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
183d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
183e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
183f0 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ED);..}...mutex_
18400 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
18410 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
18420 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
18430 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
18440 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
18450 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18460 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
18470 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
18480 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
18490 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c  ROR);..}.../* Cl
184a0 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  ear list of slot
184b0 73 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c  s */..if (pSlotL
184c0 69 73 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ist) {...CACKEY_
184d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75  DEBUG_PRINTF("Pu
184e0 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69  rging all slot i
184f0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a  nformation.");..
18500 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65  ../* Only update
18510 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f   the list of slo
18520 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74  ts if we are act
18530 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70  ually being supp
18540 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f  ly the slot info
18550 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63  rmation */...cac
18560 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
18570 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 66  nect_all();....f
18580 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
18590 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
185a0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
185b0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
185c0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
185d0 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
185e0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
185f0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
18600 72 65 61 64 65 72 29 20 7b 0a 09 09 09 09 66 72  reader) {.....fr
18610 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
18620 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
18630 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 63 61 63  eader);......cac
18640 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
18650 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  ot].pcsc_reader 
18660 3d 20 4e 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09  = NULL;....}....
18670 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
18680 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
18690 6c 29 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61  l) {.....free(ca
186a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
186b0 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09  lot].label);....
186c0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
186d0 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d  urrslot].label =
186e0 20 4e 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09   NULL;....}.....
186f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
18700 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20  rslot].active = 
18710 30 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44  0;...}..}.../* D
18720 65 74 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66  etermine list of
18730 20 72 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73   readers */..pcs
18740 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
18750 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
18760 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63  ect();..if (pcsc
18770 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
18780 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
18790 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
187a0 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65  UG_PRINTF("Conne
187b0 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66  ction to PC/SC f
187c0 61 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20  ailed, assuming 
187d0 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73  no slots");....s
187e0 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  lot_count = 0;..
187f0 7d 20 65 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f  } else {...pcsc_
18800 72 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b  readers_len = 0;
18810 0a 0a 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65  ....scard_listre
18820 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72  aders_ret = SCar
18830 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61  dListReaders(*ca
18840 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
18850 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70  , NULL, NULL, &p
18860 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
18870 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c  ;....if (scard_l
18880 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
18890 3d 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45  = SCARD_F_COMM_E
188a0 52 52 4f 52 29 20 7b 0a 09 09 09 43 41 43 4b 45  RROR) {....CACKE
188b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
188c0 45 72 72 6f 72 2e 20 53 43 61 72 64 4c 69 73 74  Error. SCardList
188d0 52 65 61 64 65 72 73 28 29 20 72 65 74 75 72 6e  Readers() return
188e0 65 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f  ed SCARD_F_COMM_
188f0 45 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20  ERROR, assuming 
18900 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43  Connection to PC
18910 2f 53 43 20 77 65 6e 74 20 61 77 61 79 2e 20 52  /SC went away. R
18920 65 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a  econnecting.");.
18930 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  ....cackey_pcsc_
18940 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09  disconnect();...
18950 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e  .cackey_pcsc_con
18960 6e 65 63 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b  nect();.....CACK
18970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18980 22 54 72 79 69 6e 67 20 53 43 61 72 64 4c 69 73  "Trying SCardLis
18990 74 52 65 61 64 65 72 73 28 29 20 61 67 61 69 6e  tReaders() again
189a0 22 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69 73  ");....scard_lis
189b0 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53  treaders_ret = S
189c0 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
189d0 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
189e0 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  dle, NULL, NULL,
189f0 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c   &pcsc_readers_l
18a00 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  en);...}....if (
18a10 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
18a20 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
18a30 5f 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63  _SUCCESS && pcsc
18a40 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20  _readers_len != 
18a50 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61  0) {....pcsc_rea
18a60 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63  ders = malloc(pc
18a70 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
18a80 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
18a90 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72  _s = pcsc_reader
18aa0 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73  s;.....scard_lis
18ab0 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53  treaders_ret = S
18ac0 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
18ad0 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
18ae0 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f  dle, NULL, pcsc_
18af0 72 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72  readers, &pcsc_r
18b00 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
18b10 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
18b20 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
18b30 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
18b40 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
18b50 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72  _e = pcsc_reader
18b60 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73  s + pcsc_readers
18b70 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74  _len;....../* St
18b80 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44  art with Slot ID
18b90 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62   1, to avoid a b
18ba0 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45  ug in GDM on RHE
18bb0 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20  L */...../* Bug 
18bc0 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f  594911: https://
18bd0 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e  bugzilla.redhat.
18be0 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69  com/show_bug.cgi
18bf0 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09  ?id=594911 */...
18c00 09 09 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a  ..currslot = 1;.
18c10 09 09 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f  ....while (pcsc_
18c20 72 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72  readers < pcsc_r
18c30 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09  eaders_e) {.....
18c40 09 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e  .curr_reader_len
18c50 20 3d 20 73 74 72 6c 65 6e 28 70 63 73 63 5f 72   = strlen(pcsc_r
18c60 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 69  eaders);.......i
18c70 66 20 28 28 70 63 73 63 5f 72 65 61 64 65 72 73  f ((pcsc_readers
18c80 20 2b 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c   + curr_reader_l
18c90 65 6e 29 20 3e 20 70 63 73 63 5f 72 65 61 64 65  en) > pcsc_reade
18ca0 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 09 62 72  rs_e) {.......br
18cb0 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09  eak;......}.....
18cc0 09 09 69 66 20 28 63 75 72 72 5f 72 65 61 64 65  ..if (curr_reade
18cd0 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  r_len == 0) {...
18ce0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
18cf0 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72  }.......if (curr
18d00 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28  slot >= (sizeof(
18d10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
18d20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
18d30 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09  ots[0]))) {.....
18d40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18d50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72  RINTF("Found mor
18d60 65 20 72 65 61 64 65 72 73 20 74 68 61 6e 20 73  e readers than s
18d70 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62  lots are availab
18d80 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09 09 62 72  le!");........br
18d90 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09  eak;......}.....
18da0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18db0 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 72 65 61  RINTF("Found rea
18dc0 64 65 72 3a 20 25 73 22 2c 20 70 63 73 63 5f 72  der: %s", pcsc_r
18dd0 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 2f  eaders);......./
18de0 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68  * Only update th
18df0 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  e list of slots 
18e00 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c  if we are actual
18e10 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73  ly being asked s
18e20 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69  upply the slot i
18e30 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09  nformation */...
18e40 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
18e50 29 20 7b 0a 09 09 09 09 09 09 63 61 63 6b 65 79  ) {.......cackey
18e60 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
18e70 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09  .active = 1;....
18e80 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
18e90 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
18ea0 65 61 64 65 72 20 3d 20 73 74 72 64 75 70 28 70  eader = strdup(p
18eb0 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 09 09  csc_readers);...
18ec0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
18ed0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
18ee0 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
18ef0 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79   0;.......cackey
18f00 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
18f10 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  .transaction_dep
18f20 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61  th = 0;.......ca
18f30 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
18f40 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  lot].transaction
18f50 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
18f60 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  0;.......cackey_
18f70 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
18f80 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
18f90 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
18fa0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b  ts[currslot].tok
18fb0 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
18fc0 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09  OGIN_REQUIRED;..
18fd0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
18fe0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
18ff0 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09  l = NULL;.......
19000 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
19010 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f  t_reset(&cackey_
19020 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29  slots[currslot])
19030 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75  ;......}......cu
19040 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09  rrslot++;.......
19050 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20  pcsc_readers += 
19060 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20  curr_reader_len 
19070 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  + 1;.....}......
19080 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c  /* Start with Sl
19090 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69  ot ID 1, to avoi
190a0 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f  d a bug in GDM o
190b0 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a  n RHEL */...../*
190c0 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74   Bug 594911: htt
190d0 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65  ps://bugzilla.re
190e0 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75  dhat.com/show_bu
190f0 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20  g.cgi?id=594911 
19100 2a 2f 0a 09 09 09 09 69 66 20 28 63 75 72 72 73  */.....if (currs
19110 6c 6f 74 20 3e 20 31 29 20 7b 0a 09 09 09 09 09  lot > 1) {......
19120 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c  /* Start with Sl
19130 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69  ot ID 1, to avoi
19140 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f  d a bug in GDM o
19150 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 09 2f  n RHEL */....../
19160 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74  * Bug 594911: ht
19170 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72  tps://bugzilla.r
19180 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62  edhat.com/show_b
19190 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31  ug.cgi?id=594911
191a0 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 5f 63 6f   */......slot_co
191b0 75 6e 74 20 3d 20 63 75 72 72 73 6c 6f 74 20 2d  unt = currslot -
191c0 20 31 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65   1;.....}....} e
191d0 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
191e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
191f0 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43  econd call to SC
19200 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66  ardListReaders f
19210 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73  ailed, return %s
19220 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45  /%li", CACKEY_DE
19230 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
19240 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c  R_TO_STR(scard_l
19250 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c  istreaders_ret),
19260 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69   (long) scard_li
19270 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a  streaders_ret);.
19280 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63  ...}.....free(pc
19290 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09  sc_readers_s);..
192a0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
192b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
192c0 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  ("First call to 
192d0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
192e0 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
192f0 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
19300 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
19310 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
19320 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
19330 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
19340 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
19350 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
19360 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
19370 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
19380 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
19390 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
193a0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
193b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
193c0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
193d0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
193e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
193f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
19400 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d  if (pSlotList ==
19410 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
19420 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e  ount = slot_coun
19430 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  t;....CACKEY_DEB
19440 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
19450 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
19460 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61  .  Found %lu rea
19470 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74  ders, but not st
19480 6f 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74  oring IDs (pSlot
19490 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20  List == NULL)", 
194a0 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65  CKR_OK, (unsigne
194b0 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75  d long) slot_cou
194c0 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  nt);....return(C
194d0 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75  KR_OK);..}...cou
194e0 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a  nt = *pulCount;.
194f0 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f  .if (count < slo
19500 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43  t_count) {...CAC
19510 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19520 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c  ("Error. User al
19530 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72  located %lu entr
19540 69 65 73 2c 20 62 75 74 20 77 65 20 68 61 76 65  ies, but we have
19550 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20   %lu entries.", 
19560 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e  count, slot_coun
19570 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
19580 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
19590 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 66 6f 72 20 28  LL);...}...for (
195a0 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
195b0 72 72 73 6c 6f 74 20 3c 20 73 6c 6f 74 5f 63 6f  rrslot < slot_co
195c0 75 6e 74 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  unt; currslot++)
195d0 20 7b 0a 09 09 2f 2a 20 53 74 61 72 74 20 77 69   {.../* Start wi
195e0 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f  th Slot ID 1, to
195f0 20 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20   avoid a bug in 
19600 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09  GDM on RHEL */..
19610 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20  ./* Bug 594911: 
19620 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
19630 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77  .redhat.com/show
19640 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39  _bug.cgi?id=5949
19650 31 31 20 2a 2f 0a 09 09 70 53 6c 6f 74 4c 69 73  11 */...pSlotLis
19660 74 5b 63 75 72 72 73 6c 6f 74 5d 20 3d 20 63 75  t[currslot] = cu
19670 72 72 73 6c 6f 74 20 2b 20 31 3b 0a 09 7d 0a 0a  rrslot + 1;..}..
19680 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f  .*pulCount = slo
19690 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45  t_count;...CACKE
196a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
196b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
196c0 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c   (%i).  Found %l
196d0 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52  u readers.", CKR
196e0 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  _OK, (unsigned l
196f0 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  ong) slot_count)
19700 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
19710 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65  K);...tokenPrese
19720 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e  nt = tokenPresen
19730 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  t; /* Supress un
19740 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
19750 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
19760 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
19770 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49  K_RV, C_GetSlotI
19780 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
19790 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f  slotID, CK_SLOT_
197a0 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
197b0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  {..static CK_UTF
197c0 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69  8CHAR slotDescri
197d0 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
197e0 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75  y Slot";..int mu
197f0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
19800 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
19810 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19820 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
19830 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
19840 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
19850 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19860 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
19870 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
19880 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
19890 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
198a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
198b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
198c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
198d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
198e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
198f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
19900 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
19910 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
19920 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
19930 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
19940 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
19950 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
19960 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
19970 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19980 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
19990 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
199a0 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
199b0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
199c0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
199d0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
199e0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
199f0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
19a00 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
19a10 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
19a20 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
19a30 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
19a40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
19a50 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
19a60 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
19a70 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
19a80 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
19a90 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
19aa0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
19ab0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19ac0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19ad0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
19ae0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
19af0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
19b00 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
19b10 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
19b20 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
19b30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
19b40 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
19b50 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
19b60 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
19b70 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44   CKF_REMOVABLE_D
19b80 45 56 49 43 45 20 7c 20 43 4b 46 5f 48 57 5f 53  EVICE | CKF_HW_S
19b90 4c 4f 54 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  LOT;...if (cacke
19ba0 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
19bb0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
19bc0 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59  otID]) == CACKEY
19bd0 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
19be0 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d  SENT) {...pInfo-
19bf0 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f  >flags |= CKF_TO
19c00 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a  KEN_PRESENT;..}.
19c10 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20  ..bytes_to_copy 
19c20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f  = strlen(cackey_
19c30 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63  slots[slotID].pc
19c40 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 20  sc_reader);..if 
19c50 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d  (sizeof(pInfo->m
19c60 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 3c  anufacturerID) <
19c70 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20   bytes_to_copy) 
19c80 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  {...bytes_to_cop
19c90 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  y = sizeof(pInfo
19ca0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
19cb0 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49  );..}..memcpy(pI
19cc0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
19cd0 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  rID, cackey_slot
19ce0 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72  s[slotID].pcsc_r
19cf0 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f  eader, bytes_to_
19d00 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72  copy);...mutex_r
19d10 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
19d20 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
19d30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
19d40 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
19d50 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
19d60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
19d70 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
19d80 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
19d90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
19da0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65  _ERROR);..}...me
19db0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mset(pInfo->slot
19dc0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27  Description, ' '
19dd0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
19de0 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29  slotDescription)
19df0 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
19e00 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
19e10 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69  n, slotDescripti
19e20 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44  on, sizeof(slotD
19e30 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29  escription) - 1)
19e40 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
19e50 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
19e60 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
19e70 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
19e80 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  rID));...pInfo->
19e90 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
19ea0 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
19eb0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
19ec0 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
19ed0 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
19ee0 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
19ef0 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
19f00 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
19f10 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
19f20 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
19f30 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
19f40 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
19f50 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41  nor = 0x00;...CA
19f60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19f70 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
19f80 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
19f90 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
19fa0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
19fb0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
19fc0 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66  V, C_GetTokenInf
19fd0 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
19fe0 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49  otID, CK_TOKEN_I
19ff0 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
1a000 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
1a010 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
1a020 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
1a030 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
1a040 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64  ic CK_UTF8CHAR d
1a050 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20  efaultLabel[] = 
1a060 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b  "Unknown Token";
1a070 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
1a080 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22  CHAR model[] = "
1a090 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72  CAC Token";..str
1a0a0 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
1a0b0 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
1a0c0 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69  dentities;..unsi
1a0d0 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
1a0e0 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61  rts;..ssize_t la
1a0f0 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  bel_ret;..int mu
1a100 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
1a110 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62   use_default_lab
1a120 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  el;...CACKEY_DEB
1a130 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1a140 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
1a150 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
1a160 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a170 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
1a180 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1a190 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1a1a0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1a1b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1a1c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1a1d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a1e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1a1f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1a200 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1a210 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1a220 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1a230 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
1a240 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
1a250 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1a260 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1a270 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
1a280 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a290 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1a2a0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1a2b0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
1a2c0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
1a2d0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
1a2e0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1a2f0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1a300 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1a310 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1a320 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1a330 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1a340 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1a350 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a360 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1a370 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1a380 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1a390 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1a3a0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1a3b0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
1a3c0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1a3d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a3e0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1a3f0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1a400 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
1a410 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
1a420 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1a430 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1a440 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1a450 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1a460 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1a470 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1a480 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26  _token_present(&
1a490 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1a4a0 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f  tID]) != CACKEY_
1a4b0 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
1a4c0 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ENT) {...CACKEY_
1a4d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f  DEBUG_PRINTF("No
1a4e0 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 6e   token is presen
1a4f0 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c  t in slotID = %l
1a500 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  u", slotID);....
1a510 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1a520 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1a530 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
1a540 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45  KR_TOKEN_NOT_PRE
1a550 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  SENT);..}...mute
1a560 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1a570 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1a580 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1a590 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1a5a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1a5b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a5c0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1a5d0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1a5e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1a5f0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1a600 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 6f  ./* Determine to
1a610 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63  ken label from c
1a620 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09  ertificates */..
1a630 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61  memset(pInfo->la
1a640 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  bel, ' ', sizeof
1a650 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1a660 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
1a670 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63  bel = 1;...if (c
1a680 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1a690 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c  ID].label == NUL
1a6a0 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e  L) {...pcsc_iden
1a6b0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
1a6c0 72 65 61 64 5f 63 65 72 74 73 28 26 63 61 63 6b  read_certs(&cack
1a6d0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1a6e0 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72  , NULL, &num_cer
1a6f0 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f  ts);...if (pcsc_
1a700 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
1a710 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d  LL) {....if (num
1a720 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a 09 09  _certs > 0) {...
1a730 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20 63 61  ..label_ret = ca
1a740 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
1a750 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63  ty_to_label(pcsc
1a760 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70 49 6e  _identities, pIn
1a770 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f  fo->label, sizeo
1a780 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
1a790 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 65 6c 5f  ;.....if (label_
1a7a0 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09  ret > 0) {......
1a7b0 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
1a7c0 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63 61 63  l = 0;.......cac
1a7d0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1a7e0 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63  ].label = malloc
1a7f0 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c  (sizeof(pInfo->l
1a800 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65  abel));.......me
1a810 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74  mcpy(cackey_slot
1a820 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c  s[slotID].label,
1a830 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73   pInfo->label, s
1a840 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
1a850 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  el));.....}....}
1a860 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  .....cackey_free
1a870 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e  _certs(pcsc_iden
1a880 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74  tities, num_cert
1a890 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  s, 1);...}..} el
1a8a0 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49  se {...memcpy(pI
1a8b0 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b  nfo->label, cack
1a8c0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1a8d0 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  .label, sizeof(p
1a8e0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a  Info->label));..
1a8f0 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
1a900 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  bel = 0;..}...if
1a910 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61   (use_default_la
1a920 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  bel) {...memcpy(
1a930 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65  pInfo->label, de
1a940 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65  faultLabel, size
1a950 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29  of(defaultLabel)
1a960 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73   - 1);..}...mems
1a970 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
1a980 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
1a990 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
1a9a0 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09  ufacturerID));..
1a9b0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
1a9c0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61  nufacturerID, ma
1a9d0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69  nufacturerID, si
1a9e0 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65  zeof(manufacture
1a9f0 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  rID) - 1);...mem
1aa00 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c  set(pInfo->model
1aa10 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1aa20 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d  nfo->model));..m
1aa30 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emcpy(pInfo->mod
1aa40 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f  el, model, sizeo
1aa50 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a  f(model) - 1);..
1aa60 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73  .memset(pInfo->s
1aa70 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27  erialNumber, ' '
1aa80 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1aa90 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a  serialNumber));.
1aaa0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
1aab0 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69  utcTime, ' ', si
1aac0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54  zeof(pInfo->utcT
1aad0 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  ime));...pInfo->
1aae0 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
1aaf0 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
1ab00 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
1ab10 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
1ab20 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
1ab30 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
1ab40 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
1ab50 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
1ab60 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
1ab70 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
1ab80 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
1ab90 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
1aba0 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49  nor = 0x00;...pI
1abb0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
1abc0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
1abd0 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   | CKF_USER_PIN_
1abe0 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b  INITIALIZED | CK
1abf0 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49  F_TOKEN_INITIALI
1ac00 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f  ZED | cackey_slo
1ac10 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
1ac20 5f 66 6c 61 67 73 3b 0a 0a 09 70 49 6e 66 6f 2d  _flags;...pInfo-
1ac30 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75  >ulMaxSessionCou
1ac40 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  nt = (sizeof(cac
1ac50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1ac60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1ac70 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b  ssions[0])) - 1;
1ac80 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69  ..pInfo->ulSessi
1ac90 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41  onCount = CK_UNA
1aca0 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
1acb0 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
1acc0 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e  MaxRwSessionCoun
1acd0 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75  t = 0;..pInfo->u
1ace0 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  lRwSessionCount 
1acf0 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
1ad00 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
1ad10 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65  Info->ulMaxPinLe
1ad20 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d  n = 128;..pInfo-
1ad30 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30  >ulMinPinLen = 0
1ad40 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61  ;..pInfo->ulTota
1ad50 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20  lPublicMemory = 
1ad60 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1ad70 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
1ad80 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63  fo->ulFreePublic
1ad90 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
1ada0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
1adb0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54  ION;..pInfo->ulT
1adc0 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72  otalPrivateMemor
1add0 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
1ade0 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
1adf0 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72  .pInfo->ulFreePr
1ae00 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b  ivateMemory = CK
1ae10 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
1ae20 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b  ORMATION;...CACK
1ae30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ae40 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1ae50 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1ae60 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1ae70 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1ae80 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1ae90 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76   C_WaitForSlotEv
1aea0 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c  ent)(CK_FLAGS fl
1aeb0 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f  ags, CK_SLOT_ID_
1aec0 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f  PTR pSlotID, CK_
1aed0 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76  VOID_PTR pReserv
1aee0 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ed) {..CACKEY_DE
1aef0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1af00 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65  ed.");...if (pRe
1af10 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20  served != NULL) 
1af20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1af30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1af40 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74  pReserved is not
1af50 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1af60 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1af70 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1af80 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1af90 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1afa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1afb0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1afc0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1afd0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1afe0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1aff0 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a  D);..}.../* XXX:
1b000 20 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74   TODO: Implement
1b010 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43   this... */..CAC
1b020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b030 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1b040 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1b050 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1b060 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1b070 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1b080 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1b090 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1b0a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1b0b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1b0c0 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
1b0d0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
1b0e0 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  tID, CK_MECHANIS
1b0f0 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68  M_TYPE_PTR pMech
1b100 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c  anismList, CK_UL
1b110 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
1b120 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1b130 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1b140 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1b150 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1b160 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b170 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b180 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1b190 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b1a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1b1b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1b1c0 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20  ...if (pulCount 
1b1d0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1b1e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b1f0 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75  ("Error.  pulCou
1b200 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  nt is NULL.");..
1b210 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1b220 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1b230 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
1b240 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
1b250 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b  ..*pulCount = 1;
1b260 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b270 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1b280 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1b290 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
1b2a0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
1b2b0 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20  ..if (*pulCount 
1b2c0 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 1) {...CACKEY_
1b2d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b2e0 72 6f 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f  ror.  Buffer too
1b2f0 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65   small.");....re
1b300 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f  turn(CKR_BUFFER_
1b310 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a  TOO_SMALL);..}..
1b320 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b  .pMechanismList[
1b330 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  0] = CKM_RSA_PKC
1b340 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  S;..*pulCount = 
1b350 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  1;...CACKEY_DEBU
1b360 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1b370 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1b380 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1b390 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1b3a0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1b3b0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d  ON(CK_RV, C_GetM
1b3c0 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b  echanismInfo)(CK
1b3d0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
1b3e0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59   CK_MECHANISM_TY
1b3f0 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48  PE type, CK_MECH
1b400 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70  ANISM_INFO_PTR p
1b410 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74  Info) {..int mut
1b420 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
1b430 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b440 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1b450 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1b460 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b470 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b480 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1b490 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1b4a0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1b4b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1b4c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1b4d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b4e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b4f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1b500 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b510 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1b520 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1b530 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1b540 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1b550 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1b560 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1b570 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1b580 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b590 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b5a0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1b5b0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1b5c0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1b5d0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1b5e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1b5f0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1b600 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1b610 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1b620 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1b630 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1b640 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1b650 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b660 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b670 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1b680 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1b690 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1b6a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1b6b0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1b6c0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1b6d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b6e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1b6f0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1b700 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1b710 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1b720 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1b730 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1b740 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1b750 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1b760 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1b770 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1b780 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1b790 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1b7a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1b7b0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1b7c0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1b7d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b7e0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1b7f0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1b800 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1b810 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1b820 0a 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20  ..switch (type) 
1b830 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
1b840 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d  _PKCS:....pInfo-
1b850 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20  >ulMinKeySize = 
1b860 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75  512;....pInfo->u
1b870 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31  lMaxKeySize = 81
1b880 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c  92;....pInfo->fl
1b890 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43  ags = CKF_HW | C
1b8a0 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46  KF_ENCRYPT | CKF
1b8b0 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53  _DECRYPT | CKF_S
1b8c0 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59  IGN | CKF_VERIFY
1b8d0 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
1b8e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b8f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1b900 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1b910 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1b920 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57  CKR_OK);.}../* W
1b930 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
1b940 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
1b950 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1b960 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74  ON(CK_RV, C_Init
1b970 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49  Token)(CK_SLOT_I
1b980 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46  D slotID, CK_UTF
1b990 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
1b9a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
1b9b0 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
1b9c0 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41  TR pLabel) {..CA
1b9d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b9e0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1b9f0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1ba00 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1ba10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ba20 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1ba30 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1ba40 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1ba50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1ba60 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1ba70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ba80 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54  "Returning CKR_T
1ba90 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
1baa0 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  CTED (%i)", CKR_
1bab0 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
1bac0 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ECTED);...return
1bad0 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45  (CKR_TOKEN_WRITE
1bae0 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a  _PROTECTED);.}..
1baf0 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
1bb00 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
1bb10 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
1bb20 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1bb30 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53  InitPIN)(CK_SESS
1bb40 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1bb50 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ion, CK_UTF8CHAR
1bb60 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
1bb70 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a  ONG ulPinLen) {.
1bb80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bb90 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1bba0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1bbb0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1bbc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bbd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1bbe0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1bbf0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1bc00 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1bc10 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1bc20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bc30 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1bc40 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
1bc50 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43  OTECTED (%i)", C
1bc60 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
1bc70 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74  ROTECTED);...ret
1bc80 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  urn(CKR_TOKEN_WR
1bc90 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
1bca0 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
1bcb0 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
1bcc0 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
1bcd0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1bce0 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45   C_SetPIN)(CK_SE
1bcf0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1bd00 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
1bd10 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20  AR_PTR pOldPin, 
1bd20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69  CK_ULONG ulOldPi
1bd30 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
1bd40 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43  R_PTR pNewPin, C
1bd50 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e  K_ULONG ulNewPin
1bd60 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
1bd70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1bd80 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1bd90 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1bda0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1bdb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1bdc0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1bdd0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1bde0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1bdf0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1be00 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1be10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1be20 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1be30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1be40 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1be50 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1be60 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1be70 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1be80 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1be90 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1bea0 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73  CK_RV, C_OpenSes
1beb0 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  sion)(CK_SLOT_ID
1bec0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47   slotID, CK_FLAG
1bed0 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44  S flags, CK_VOID
1bee0 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f  _PTR pApplicatio
1bef0 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74  n, CK_NOTIFY not
1bf00 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f  ify, CK_SESSION_
1bf10 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73  HANDLE_PTR phSes
1bf20 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  sion) {..unsigne
1bf30 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74  d long idx;..int
1bf40 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
1bf50 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f  int found_sessio
1bf60 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f  n = 0;...CACKEY_
1bf70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1bf80 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
1bf90 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49  flags & CKF_SERI
1bfa0 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43  AL_SESSION) != C
1bfb0 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f  KF_SERIAL_SESSIO
1bfc0 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b  N) {...return(CK
1bfd0 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c  R_SESSION_PARALL
1bfe0 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  EL_NOT_SUPPORTED
1bff0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1c000 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1c010 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c020 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c030 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1c040 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1c050 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1c060 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1c070 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
1c080 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
1c090 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1c0a0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1c0b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1c0c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c0d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c0e0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1c0f0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1c100 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
1c110 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
1c120 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c130 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
1c140 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1c150 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1c160 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1c170 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1c180 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1c190 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c1a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c1b0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1c1c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1c1d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1c1e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1c1f0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1c200 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
1c210 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c220 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1c230 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1c240 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
1c250 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
1c260 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
1c270 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1c280 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1c290 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
1c2a0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
1c2b0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a  NVALID);..}.../*
1c2c0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1c2d0 20 63 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c   card is actuall
1c2e0 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a  y in the slot. *
1c2f0 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b  /../* XXX: Check
1c300 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1c310 69 73 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43  is is in the PKC
1c320 53 23 31 31 20 73 70 65 63 69 66 69 63 61 74 69  S#11 specificati
1c330 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65  on */..if (cacke
1c340 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
1c350 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
1c360 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59  otID]) != CACKEY
1c370 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
1c380 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  SENT) {...CACKEY
1c390 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c3a0 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20  rror.  Card not 
1c3b0 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e  present.  Return
1c3c0 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  ing CKR_DEVICE_R
1c3d0 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63  EMOVED");....cac
1c3e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1c3f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1c400 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c410 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b  DEVICE_REMOVED);
1c420 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
1c430 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   1; idx < (sizeo
1c440 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1c450 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1c460 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1c470 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
1c480 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1c490 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
1c4a0 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f  ....found_sessio
1c4b0 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65  n = 1;.....*phSe
1c4c0 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09  ssion = idx;....
1c4d0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1c4e0 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31  [idx].active = 1
1c4f0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1c500 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44  ions[idx].slotID
1c510 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61   = slotID;....ca
1c520 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1c530 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52  x].state = CKS_R
1c540 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e  O_PUBLIC_SESSION
1c550 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1c560 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20  ions[idx].flags 
1c570 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b  = flags;....cack
1c580 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1c590 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d  .ulDeviceError =
1c5a0 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   0;....cackey_se
1c5b0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70  ssions[idx].pApp
1c5c0 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c  lication = pAppl
1c5d0 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b  ication;....cack
1c5e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1c5f0 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79  .Notify = notify
1c600 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
1c610 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
1c620 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ities = NULL;...
1c630 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1c640 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
1c650 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09  _count = 0;.....
1c660 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c670 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  idx].search_acti
1c680 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
1c690 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1c6a0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
1c6b0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
1c6c0 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79  sions[idx].decry
1c6d0 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  pt_active = 0;..
1c6e0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1c6f0 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
1c700 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
1c710 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63  _identities(&cac
1c720 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1c730 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  ], &cackey_sessi
1c740 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74  ons[idx].identit
1c750 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09  ies_count);.....
1c760 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
1c770 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1c780 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1c790 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1c7a0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1c7b0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1c7c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c7d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1c7e0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1c7f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c800 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1c810 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64  ..}...if (!found
1c820 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41  _session) {...CA
1c830 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c840 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1c850 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28  _SESSION_COUNT (
1c860 25 69 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f  %i)", CKR_SESSIO
1c870 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74  N_COUNT);....ret
1c880 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1c890 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43  COUNT);..}...CAC
1c8a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c8b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1c8c0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1c8d0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1c8e0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1c8f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1c900 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  , C_CloseSession
1c910 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1c920 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
1c930 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1c940 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
1c950 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1c960 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1c970 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1c980 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c990 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c9a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1c9b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1c9c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1c9d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1c9e0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
1c9f0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
1ca00 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1ca10 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1ca20 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1ca30 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
1ca40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ca50 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1ca60 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
1ca70 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1ca80 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1ca90 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1caa0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1cab0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1cac0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1cad0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1cae0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1caf0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cb00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1cb10 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1cb20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1cb30 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1cb40 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1cb50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1cb60 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
1cb70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1cb80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1cb90 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1cba0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cbb0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
1cbc0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1cbd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1cbe0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1cbf0 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
1cc00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1cc10 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  on].active = 0;.
1cc20 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65  .cackey_free_ide
1cc30 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73  ntities(cackey_s
1cc40 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1cc50 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61  ].identities, ca
1cc60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1cc70 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1cc80 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74  es_count);...mut
1cc90 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1cca0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1ccb0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1ccc0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1ccd0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1cce0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ccf0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1cd00 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1cd10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1cd20 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1cd30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cd40 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1cd50 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1cd60 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1cd70 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1cd80 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1cd90 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c  CK_RV, C_CloseAl
1cda0 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c  lSessions)(CK_SL
1cdb0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a  OT_ID slotID) {.
1cdc0 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09  .uint32_t idx;..
1cdd0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1cde0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1cdf0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1ce00 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1ce10 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1ce20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ce30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ce40 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1ce50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ce60 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1ce70 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1ce80 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
1ce90 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
1cea0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1ceb0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1cec0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
1ced0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1cee0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1cef0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1cf00 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
1cf10 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
1cf20 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
1cf30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
1cf40 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
1cf50 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1cf60 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1cf70 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1cf80 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1cf90 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1cfa0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cfb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1cfc0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1cfd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1cfe0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1cff0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1d000 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
1d010 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
1d020 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d030 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1d040 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1d050 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
1d060 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
1d070 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
1d080 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1d090 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1d0a0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1d0b0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1d0c0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  ALID);..}...for 
1d0d0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1d0e0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1d0f0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1d100 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1d110 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
1d120 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
1d130 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
1d140 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63  ve) {....if (cac
1d150 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1d160 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74  ].slotID != slot
1d170 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  ID) {.....contin
1d180 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ue;....}.....cac
1d190 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1d1a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1d1b0 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73  ;....C_CloseSess
1d1c0 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63  ion(idx);....cac
1d1d0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1d1e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1d1f0 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
1d200 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1d210 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1d220 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1d230 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1d240 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1d250 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d260 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1d270 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1d280 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1d290 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
1d2a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d2b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1d2c0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1d2d0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1d2e0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1d2f0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1d300 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49  V, C_GetSessionI
1d310 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nfo)(CK_SESSION_
1d320 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1d330 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f   CK_SESSION_INFO
1d340 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69  _PTR pInfo) {..i
1d350 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1d360 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d370 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1d380 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
1d390 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1d3a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d3b0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
1d3c0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1d3d0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1d3e0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1d3f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1d400 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1d410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d420 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1d430 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1d440 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1d450 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1d460 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1d470 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1d480 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1d490 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1d4a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1d4b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1d4c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d4d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d4e0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1d4f0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1d500 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1d510 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1d520 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1d530 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1d540 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1d550 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1d560 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1d570 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1d580 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d590 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1d5a0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1d5b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1d5c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1d5d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d5e0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1d5f0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1d600 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1d610 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1d620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d630 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1d640 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1d650 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1d660 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1d670 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1d680 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20  pInfo->slotID = 
1d690 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d6a0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
1d6b0 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20  ;..pInfo->state 
1d6c0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1d6d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74  s[hSession].stat
1d6e0 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  e;..pInfo->flags
1d6f0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
1d700 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61  ns[hSession].fla
1d710 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65  gs;..pInfo->ulDe
1d720 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b  viceError = cack
1d730 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d740 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72  sion].ulDeviceEr
1d750 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ror;...mutex_ret
1d760 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1d770 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1d780 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1d790 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1d7a0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1d7b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d7c0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1d7d0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1d7e0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1d7f0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1d800 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d810 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1d820 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1d830 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1d840 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1d850 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1d860 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_GetOperationS
1d870 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tate)(CK_SESSION
1d880 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1d890 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f  , CK_BYTE_PTR pO
1d8a0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43  perationState, C
1d8b0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f  K_ULONG_PTR pulO
1d8c0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e  perationStateLen
1d8d0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1d8e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1d8f0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1d900 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1d910 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d920 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d930 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1d940 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1d950 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1d960 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1d970 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d980 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1d990 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1d9a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1d9b0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1d9c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1d9d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1d9e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1d9f0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1da00 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1da10 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69  RV, C_SetOperati
1da20 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53  onState)(CK_SESS
1da30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1da40 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1da50 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65   pOperationState
1da60 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65  , CK_ULONG ulOpe
1da70 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20  rationStateLen, 
1da80 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1da90 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c   hEncryptionKey,
1daa0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
1dab0 45 20 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f  E hAuthenticatio
1dac0 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nKey) {..CACKEY_
1dad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1dae0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1daf0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1db00 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1db10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1db20 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1db30 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1db40 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1db50 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1db60 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1db70 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1db80 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1db90 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1dba0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1dbb0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1dbc0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1dbd0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1dbe0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1dbf0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1dc00 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29  (CK_RV, C_Login)
1dc10 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1dc20 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1dc30 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79  USER_TYPE userTy
1dc40 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  pe, CK_UTF8CHAR_
1dc50 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
1dc60 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09  NG ulPinLen) {..
1dc70 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1dc80 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  D;..int mutex_re
1dc90 74 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73  tval;..int tries
1dca0 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74  _remaining;..int
1dcb0 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41   login_ret;...CA
1dcc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1dcd0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1dce0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1dcf0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1dd00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dd10 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1dd20 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1dd30 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1dd40 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1dd50 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1dd60 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
1dd70 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
1dd80 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1dd90 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1dda0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1ddb0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1ddc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ddd0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
1dde0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
1ddf0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1de00 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1de10 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1de20 28 75 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55  (userType != CKU
1de30 5f 55 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45  _USER) {...CACKE
1de40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1de50 45 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20  Error.  We only 
1de60 73 75 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64  support USER mod
1de70 65 2c 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75  e, asked for %lu
1de80 20 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e   mode.", (unsign
1de90 65 64 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70  ed long) userTyp
1dea0 65 29 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  e)....return(CKR
1deb0 5f 55 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c  _USER_TYPE_INVAL
1dec0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1ded0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1dee0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1def0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1df00 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1df10 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1df20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1df30 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1df40 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1df50 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1df60 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1df70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1df80 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1df90 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1dfa0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1dfb0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1dfc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1dfd0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1dfe0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1dff0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1e000 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1e010 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1e020 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
1e030 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1e040 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
1e050 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
1e060 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
1e070 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1e080 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1e090 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
1e0a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e0b0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1e0c0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1e0d0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
1e0e0 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
1e0f0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
1e100 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1e110 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1e120 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
1e130 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
1e140 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1e150 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e160 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1e170 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1e180 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
1e190 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
1e1a0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
1e1b0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1e1c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1e1d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1e1e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1e1f0 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61  ..login_ret = ca
1e200 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b  ckey_login(&cack
1e210 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1e220 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e  , pPin, ulPinLen
1e230 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  , &tries_remaini
1e240 6e 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f  ng);..if (login_
1e250 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
1e260 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63  SC_S_OK) {...cac
1e270 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1e280 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1e290 3b 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72  ;....if (login_r
1e2a0 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
1e2b0 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09  C_E_LOCKED) {...
1e2c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e2d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 54 6f  INTF("Error.  To
1e2e0 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29  ken is locked.")
1e2f0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
1e300 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
1e310 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53  _flags |= CKF_US
1e320 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a  ER_PIN_LOCKED;..
1e330 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
1e340 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65  N_LOCKED);...} e
1e350 6c 73 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65  lse if (login_re
1e360 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
1e370 5f 45 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09 09  _E_BADPIN) {....
1e380 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e390 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 49 6e 76  NTF("Error.  Inv
1e3a0 61 6c 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09  alid PIN.");....
1e3b0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
1e3c0 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
1e3d0 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49  s |= CKF_USER_PI
1e3e0 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09  N_COUNT_LOW;....
1e3f0 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69  .if (tries_remai
1e400 6e 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09  ning == 1) {....
1e410 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
1e420 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
1e430 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49  s |= CKF_USER_PI
1e440 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09  N_FINAL_TRY;....
1e450 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  }.....return(CKR
1e460 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
1e470 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
1e480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e490 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72  or.  Unknown err
1e4a0 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  or returned from
1e4b0 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20   cackey_login() 
1e4c0 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74  (%i)", login_ret
1e4d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e4e0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1e4f0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f  ..}...cackey_slo
1e500 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
1e510 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f  _flags &= ~(CKF_
1e520 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20  USER_PIN_LOCKED 
1e530 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43  | CKF_USER_PIN_C
1e540 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c  OUNT_LOW | CKF_L
1e550 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20  OGIN_REQUIRED | 
1e560 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e  CKF_USER_PIN_FIN
1e570 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65  AL_TRY);...cacke
1e580 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1e590 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  ion].state = CKS
1e5a0 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f  _RO_USER_FUNCTIO
1e5b0 4e 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  NS;...mutex_retv
1e5c0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1e5d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1e5e0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1e5f0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1e600 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e610 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e620 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1e630 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1e640 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1e650 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1e660 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e670 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1e680 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1e690 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1e6a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1e6b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1e6c0 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53  C_Logout)(CK_SES
1e6d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1e6e0 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  sion) {..CK_SLOT
1e6f0 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74  _ID slotID;..int
1e700 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
1e710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e720 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1e730 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1e740 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1e750 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e760 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1e770 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1e780 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1e790 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1e7a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1e7b0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
1e7c0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
1e7d0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1e7e0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1e7f0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1e800 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1e810 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e820 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1e830 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
1e840 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1e850 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1e860 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1e870 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1e880 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1e890 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1e8a0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1e8b0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1e8c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e8d0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1e8e0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1e8f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1e900 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1e910 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1e920 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1e930 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1e940 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1e950 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1e960 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1e970 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e980 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1e990 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1e9a0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1e9b0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1e9c0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
1e9d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1e9e0 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
1e9f0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1ea00 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1ea10 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1ea20 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1ea30 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1ea40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ea50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ea60 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1ea70 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1ea80 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1ea90 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1eaa0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1eab0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1eac0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
1ead0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
1eae0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
1eaf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1eb00 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1eb10 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1eb20 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
1eb30 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1eb40 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1eb50 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1eb60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1eb70 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
1eb80 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1eb90 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
1eba0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ebb0 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
1ebc0 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b  _PUBLIC_SESSION;
1ebd0 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
1ebe0 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
1ebf0 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
1ec00 45 51 55 49 52 45 44 3b 0a 0a 09 6d 75 74 65 78  EQUIRED;...mutex
1ec10 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1ec20 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1ec30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1ec40 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1ec50 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1ec60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ec70 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1ec80 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1ec90 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1eca0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1ecb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ecc0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1ecd0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1ece0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1ecf0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1ed00 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1ed10 5f 52 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a  _RV, C_CreateObj
1ed20 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ect)(CK_SESSION_
1ed30 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1ed40 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
1ed50 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
1ed60 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
1ed70 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
1ed80 50 54 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a  PTR phObject) {.
1ed90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1eda0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1edb0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1edc0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1edd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ede0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1edf0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1ee00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1ee10 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1ee20 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1ee30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ee40 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1ee50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1ee60 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1ee70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1ee80 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1ee90 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1eea0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1eeb0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1eec0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1eed0 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b  C_CopyObject)(CK
1eee0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1eef0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
1ef00 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
1ef10 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ct, CK_ATTRIBUTE
1ef20 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
1ef30 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
1ef40 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1ef50 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65  LE_PTR phNewObje
1ef60 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
1ef70 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1ef80 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1ef90 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1efa0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1efb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1efc0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1efd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1efe0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1eff0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1f000 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1f010 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1f020 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1f030 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1f040 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1f050 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f060 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1f070 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1f080 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1f090 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1f0a0 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f  K_RV, C_DestroyO
1f0b0 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
1f0c0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1f0d0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
1f0e0 44 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09  DLE hObject) {..
1f0f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f100 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1f110 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1f120 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1f130 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f140 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1f150 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1f160 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f170 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f180 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1f190 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f1a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1f1b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f1c0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1f1d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f1e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1f1f0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1f200 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1f210 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1f220 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1f230 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28  _GetObjectSize)(
1f240 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1f250 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
1f260 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
1f270 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ject, CK_ULONG_P
1f280 54 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43  TR pulSize) {..C
1f290 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f2a0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1f2b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1f2c0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1f2d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f2e0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1f2f0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1f300 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1f310 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1f320 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1f330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f340 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1f350 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1f360 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1f370 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1f380 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1f390 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1f3a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1f3b0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1f3c0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1f3d0 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
1f3e0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
1f3f0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1f400 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
1f410 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52  hObject, CK_ATTR
1f420 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
1f430 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
1f440 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54  Count) {..CK_ATT
1f450 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74  RIBUTE *curr_att
1f460 72 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  r;..struct cacke
1f470 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
1f480 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20  tity;..unsigned 
1f490 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64  long identity_id
1f4a0 78 2c 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73  x, attr_idx, ses
1f4b0 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f  s_attr_idx, num_
1f4c0 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ids;..int mutex_
1f4d0 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72  retval;..CK_RV r
1f4e0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
1f4f0 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61  .CK_VOID_PTR pVa
1f500 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75  lue;..CK_ULONG u
1f510 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43  lValueLen;...CAC
1f520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f530 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1f540 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1f550 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1f560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f570 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1f580 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1f590 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1f5a0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1f5b0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
1f5c0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
1f5d0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
1f5e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1f5f0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1f600 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1f610 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1f620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f630 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
1f640 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1f650 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1f660 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1f670 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
1f680 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a  hObject == 0) {.
1f690 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f6a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f  RINTF("Error.  O
1f6b0 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74  bject handle out
1f6c0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1f6d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42  ...return(CKR_OB
1f6e0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  JECT_HANDLE_INVA
1f6f0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  LID);..}...if (u
1f700 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  lCount == 0) {..
1f710 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
1f720 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63  t, if zero objec
1f730 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  ts were specifie
1f740 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74  d return zero it
1f750 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ems immediately 
1f760 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
1f770 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1f780 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20  ing CKR_OK (%i) 
1f790 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22  (short circuit)"
1f7a0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
1f7b0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
1f7c0 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
1f7d0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1f7e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f7f0 46 28 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70  F("Error.  pTemp
1f800 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  late is NULL.");
1f810 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1f820 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1f830 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78  }...identity_idx
1f840 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a   = hObject - 1;.
1f850 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1f860 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1f870 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f880 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1f890 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1f8a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f8b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1f8c0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1f8d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1f8e0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1f8f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1f900 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1f910 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
1f920 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1f930 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f940 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1f950 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f960 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
1f970 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1f980 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1f990 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1f9a0 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20  );..}...num_ids 
1f9b0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1f9c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1f9d0 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09  tities_count;...
1f9e0 69 66 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78  if (identity_idx
1f9f0 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09   >= num_ids) {..
1fa00 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1fa10 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1fa20 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1fa30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1fa40 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e  ror.  Object han
1fa50 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
1fa60 2e 20 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20  .  identity_idx 
1fa70 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d  = %lu, num_ids =
1fa80 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65   %lu.", (unsigne
1fa90 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79  d long) identity
1faa0 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20  _idx, (unsigned 
1fab0 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a  long) num_ids);.
1fac0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42  ...return(CKR_OB
1fad0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  JECT_HANDLE_INVA
1fae0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74  LID);..}...ident
1faf0 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ity = &cackey_se
1fb00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1fb10 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e  .identities[iden
1fb20 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72  tity_idx];...for
1fb30 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20   (attr_idx = 0; 
1fb40 61 74 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75  attr_idx < ulCou
1fb50 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20  nt; attr_idx++) 
1fb60 7b 0a 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  {...curr_attr = 
1fb70 26 70 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f  &pTemplate[attr_
1fb80 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20  idx];....pValue 
1fb90 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75  = NULL;...ulValu
1fba0 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
1fbb0 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44   -1;....CACKEY_D
1fbc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f  EBUG_PRINTF("Loo
1fbd0 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75  king for attribu
1fbe0 74 65 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e  te 0x%08lx (iden
1fbf0 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20  tity:%lu) ...", 
1fc00 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1fc10 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c  curr_attr->type,
1fc20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1fc30 20 69 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a   identity_idx);.
1fc40 0a 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74  ...for (sess_att
1fc50 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f  r_idx = 0; sess_
1fc60 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74  attr_idx < ident
1fc70 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f  ity->attributes_
1fc80 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72  count; sess_attr
1fc90 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20  _idx++) {....if 
1fca0 28 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69  (identity->attri
1fcb0 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
1fcc0 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72  idx].type == cur
1fcd0 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a  r_attr->type) {.
1fce0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1fcf0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f  _PRINTF(" ... fo
1fd00 75 6e 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d  und it, pValue =
1fd10 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20   %p, ulValueLen 
1fd20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79  = %lu", identity
1fd30 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
1fd40 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c  s_attr_idx].pVal
1fd50 75 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  ue, identity->at
1fd60 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
1fd70 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  tr_idx].ulValueL
1fd80 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56  en);..........pV
1fd90 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  alue = identity-
1fda0 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
1fdb0 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75  _attr_idx].pValu
1fdc0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
1fdd0 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  n = identity->at
1fde0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
1fdf0 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  tr_idx].ulValueL
1fe00 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  en;....}...}....
1fe10 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  if (curr_attr->p
1fe20 56 61 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29  Value && pValue)
1fe30 20 7b 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61   {....if (curr_a
1fe40 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20  ttr->ulValueLen 
1fe50 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b  >= ulValueLen) {
1fe60 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
1fe70 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70  _attr->pValue, p
1fe80 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65  Value, ulValueLe
1fe90 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  n);....} else {.
1fea0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1feb0 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a   (CK_LONG) -1;..
1fec0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
1fed0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
1fee0 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  L;....}...}....c
1fef0 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
1ff00 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65  eLen = ulValueLe
1ff10 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  n;..}...mutex_re
1ff20 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1ff30 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ff40 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1ff50 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1ff60 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1ff70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ff80 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1ff90 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1ffa0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1ffb0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1ffc0 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41  (retval == CKR_A
1ffd0 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e  TTRIBUTE_TYPE_IN
1ffe0 56 41 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45  VALID) {...CACKE
1fff0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20000 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54  Returning CKR_AT
20010 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56  TRIBUTE_TYPE_INV
20020 41 4c 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74  ALID (%i)", (int
20030 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
20040 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  se if (retval ==
20050 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
20060 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45  SMALL) {...CACKE
20070 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20080 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55  Returning CKR_BU
20090 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28  FFER_TOO_SMALL (
200a0 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
200b0 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  al);..} else if 
200c0 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f  (retval == CKR_O
200d0 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
200e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
200f0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
20100 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  )", (int) retval
20110 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43  );..} else {...C
20120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20130 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69  TF("Returning %i
20140 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
20150 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
20160 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  tval);.}..CK_DEF
20170 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
20180 52 56 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75  RV, C_SetAttribu
20190 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53  teValue)(CK_SESS
201a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
201b0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
201c0 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
201d0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
201e0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
201f0 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
20200 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20210 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
20220 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
20230 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
20240 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20250 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
20260 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
20270 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
20280 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
20290 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
202a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
202b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
202c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
202d0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
202e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
202f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
20300 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
20310 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
20320 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
20330 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
20340 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
20350 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
20360 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
20370 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
20380 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
20390 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43  NG ulCount) {..C
203a0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
203b0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b  ;..CK_ULONG idx;
203c0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
203d0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
203e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
203f0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
20400 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
20410 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20420 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20430 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
20440 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
20450 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
20460 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
20470 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
20480 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
20490 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
204a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
204b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
204c0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
204d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
204e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
204f0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
20500 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
20510 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
20520 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
20530 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
20540 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
20550 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
20560 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
20570 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
20580 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20590 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
205a0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
205b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
205c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
205d0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
205e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
205f0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
20600 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
20610 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
20620 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
20630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20640 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
20650 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
20660 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
20670 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
20680 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
20690 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
206a0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
206b0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
206c0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
206d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
206e0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
206f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20700 20 53 65 61 72 63 68 20 61 6c 72 65 61 64 79 20   Search already 
20710 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
20720 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
20730 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d  TION_ACTIVE);..}
20740 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
20750 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20760 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
20770 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
20780 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
20790 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
207a0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
207b0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
207c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
207d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
207e0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
207f0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
20800 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
20810 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
20820 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
20830 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
20840 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
20850 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
20860 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
20870 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20880 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
20890 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
208a0 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
208b0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
208c0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
208d0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
208e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
208f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20900 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
20910 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
20920 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c  slots[slotID].sl
20930 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 43 41  ot_reset) {...CA
20940 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20950 46 28 22 54 68 65 20 73 6c 6f 74 20 68 61 73 20  F("The slot has 
20960 62 65 65 6e 20 72 65 73 65 74 20 73 69 6e 63 65  been reset since
20970 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20   we last looked 
20980 66 6f 72 20 69 64 65 6e 74 69 74 69 65 73 20 2d  for identities -
20990 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a  - rescanning");.
209a0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
209b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
209c0 2e 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e  .identities != N
209d0 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  ULL) {....cackey
209e0 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
209f0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
20a00 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
20a10 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65  ities, cackey_se
20a20 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
20a30 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
20a40 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  t);.....cackey_s
20a50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
20a60 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e  ].identities = N
20a70 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ULL;....cackey_s
20a80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
20a90 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
20aa0 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69  nt = 0;...}....i
20ab0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
20ac0 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d  slotID].label !=
20ad0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65   NULL) {....free
20ae0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
20af0 6f 74 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09  otID].label);...
20b00 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
20b10 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55  otID].label = NU
20b20 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  LL;...}....cacke
20b30 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
20b40 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
20b50 73 6c 6f 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b  slotID]);...cack
20b60 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
20b70 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b  .slot_reset = 0;
20b80 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
20b90 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20ba0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  on].identities =
20bb0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
20bc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20bd0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
20be0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69   = cackey_read_i
20bf0 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65  dentities(&cacke
20c00 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
20c10 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
20c20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
20c30 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09  tities_count);..
20c40 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74  }...if (pTemplat
20c50 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  e != NULL) {...i
20c60 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29  f (ulCount != 0)
20c70 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73   {....cackey_ses
20c80 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20c90 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
20ca0 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09  nt = ulCount;...
20cb0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
20cc0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
20cd0 68 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63  h_query = malloc
20ce0 28 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  (ulCount * sizeo
20cf0 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a  f(*pTemplate));.
20d00 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
20d10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20d20 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
20d30 79 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c  y, pTemplate, ul
20d40 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  Count * sizeof(*
20d50 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09  pTemplate));....
20d60 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
20d70 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78  x < ulCount; idx
20d80 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 70 54  ++) {.....if (pT
20d90 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56  emplate[idx].ulV
20da0 61 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  alueLen == 0) {.
20db0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
20dc0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
20dd0 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
20de0 2e 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
20df0 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
20e00 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65  ....}......cacke
20e10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20e20 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
20e30 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20  y[idx].pValue = 
20e40 6d 61 6c 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65  malloc(pTemplate
20e50 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  [idx].ulValueLen
20e60 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b  );......if (cack
20e70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20e80 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
20e90 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20  ry[idx].pValue) 
20ea0 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61  {......memcpy(ca
20eb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20ec0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
20ed0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
20ee0 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d  , pTemplate[idx]
20ef0 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61  .pValue, pTempla
20f00 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  te[idx].ulValueL
20f10 65 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  en);.....}....}.
20f20 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 61  ..} else {....ca
20f30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20f40 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
20f50 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  uery_count = 0;.
20f60 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
20f70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
20f80 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c  rch_query = NULL
20f90 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
20fa0 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d  ..if (ulCount !=
20fb0 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f   0) {....cackey_
20fc0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
20fd0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
20fe0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20ff0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
21000 65 61 72 63 68 20 71 75 65 72 79 20 73 70 65 63  earch query spec
21010 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62  ified as NULL, b
21020 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65  ut number of que
21030 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 73 70 65  ry terms not spe
21040 63 69 66 69 65 64 20 61 73 20 30 2e 22 29 3b 0a  cified as 0.");.
21050 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
21060 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
21070 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  .}....cackey_ses
21080 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21090 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
210a0 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  nt = 0;...cackey
210b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
210c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
210d0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61   = NULL;..}...ca
210e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
210f0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
21100 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b  ctive = 1;..cack
21110 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21120 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
21130 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65  r_id = 0;...mute
21140 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
21150 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21160 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21170 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
21180 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
21190 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
211a0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
211b0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
211c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
211d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
211e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
211f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
21200 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
21210 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
21220 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74  CKR_OK);.}..stat
21230 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b  ic int cackey_pk
21240 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74  cs11_compare_att
21250 72 69 62 75 74 65 73 28 43 4b 5f 41 54 54 52 49  ributes(CK_ATTRI
21260 42 55 54 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52  BUTE *a, CK_ATTR
21270 49 42 55 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73  IBUTE *b) {..uns
21280 69 67 6e 65 64 20 63 68 61 72 20 2a 73 6d 61 6c  igned char *smal
21290 6c 62 75 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b  lbuf, *largebuf;
212a0 0a 09 73 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75  ..size_t smallbu
212b0 66 5f 6c 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f  f_len, largebuf_
212c0 6c 65 6e 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79  len;...if (a->ty
212d0 70 65 20 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b  pe != b->type) {
212e0 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
212f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21300 50 52 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20  PRINTF("    ... 
21310 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74  found matching t
21320 79 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43  ype ...");...CAC
21330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
21340 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20  UF("    ... our 
21350 76 61 6c 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c  value:", a->pVal
21360 75 65 2c 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  ue, a->ulValueLe
21370 6e 29 3b 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61  n);...if (b->pVa
21380 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  lue == NULL) {..
21390 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
213a0 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e  INTF("       ...
213b0 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 72 64 20   found wildcard 
213c0 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75  match");....retu
213d0 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  rn(1);..}...if (
213e0 61 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c  a->pValue == NUL
213f0 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29  L) {...return(0)
21400 3b 0a 09 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75  ;..}.. .if (b->u
21410 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e  lValueLen == a->
21420 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65  ulValueLen && me
21430 6d 63 6d 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20  mcmp(a->pValue, 
21440 62 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c  b->pValue, b->ul
21450 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20  ValueLen) == 0) 
21460 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21470 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20  _PRINTF("       
21480 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63 74 20  ... found exact 
21490 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75  match");....retu
214a0 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  rn(1);..}...swit
214b0 63 68 20 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09  ch (a->type) {..
214c0 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55  .case CKA_MODULU
214d0 53 3a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56  S:....if (a->ulV
214e0 61 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c  alueLen == b->ul
214f0 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09  ValueLen) {.....
21500 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09  break;....}.....
21510 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  if (a->ulValueLe
21520 6e 20 3e 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  n > b->ulValueLe
21530 6e 29 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75  n) {.....smallbu
21540 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09  f = b->pValue;..
21550 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20  ...smallbuf_len 
21560 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b  = b->ulValueLen;
21570 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d  ......largebuf =
21580 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   a->pValue;.....
21590 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61  largebuf_len = a
215a0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09  ->ulValueLen;...
215b0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d  .} else {.....sm
215c0 61 6c 6c 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c  allbuf = a->pVal
215d0 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66  ue;.....smallbuf
215e0 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75  _len = a->ulValu
215f0 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65  eLen;......large
21600 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b  buf = b->pValue;
21610 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65  .....largebuf_le
21620 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = b->ulValueLe
21630 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20  n;....}.....for 
21640 28 3b 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20  (; largebuf_len 
21650 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b  != smallbuf_len;
21660 20 6c 61 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67   largebuf++,larg
21670 65 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09  ebuf_len--) {...
21680 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 5b 30  ..if (largebuf[0
21690 5d 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 62  ] != 0) {......b
216a0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  reak;.....}....}
216b0 0a 0a 09 09 09 69 66 20 28 6c 61 72 67 65 62 75  .....if (largebu
216c0 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75  f_len != smallbu
216d0 66 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65  f_len) {.....bre
216e0 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ak;....}.....if 
216f0 28 6d 65 6d 63 6d 70 28 6c 61 72 67 65 62 75 66  (memcmp(largebuf
21700 2c 20 73 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c  , smallbuf, smal
21710 6c 62 75 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20  lbuf_len) == 0) 
21720 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
21730 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20  UG_PRINTF("     
21740 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72    ... found appr
21750 6f 78 69 6d 61 74 65 20 6d 61 74 63 68 22 29 3b  oximate match");
21760 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b  ......return(1);
21770 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
21780 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ..}...return(0);
21790 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
217a0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
217b0 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f  FindObjects)(CK_
217c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
217d0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
217e0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
217f0 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Object, CK_ULONG
21800 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e   ulMaxObjectCoun
21810 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
21820 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20  pulObjectCount) 
21830 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
21840 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  _identity *curr_
21850 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  id;..CK_ATTRIBUT
21860 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43  E *curr_attr;..C
21870 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f  K_ULONG curr_id_
21880 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64  idx, curr_out_id
21890 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f  _idx, curr_attr_
218a0 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69  idx, sess_attr_i
218b0 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61  dx;..CK_ULONG ma
218c0 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65  tched_count, pre
218d0 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b  v_matched_count;
218e0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
218f0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
21900 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
21910 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
21920 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
21930 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21940 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21950 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
21960 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
21970 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
21980 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
21990 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63  }...if (pulObjec
219a0 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  tCount == NULL) 
219b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
219c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
219d0 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20   pulObjectCount 
219e0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
219f0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
21a00 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
21a10 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e  f (phObject == N
21a20 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  ULL && ulMaxObje
21a30 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ctCount == 0) {.
21a40 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
21a50 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65  it, if zero obje
21a60 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69  cts were specifi
21a70 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69  ed return zero i
21a80 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  tems immediately
21a90 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74   */...*pulObject
21aa0 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41  Count = 0;....CA
21ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21ac0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21ad0 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
21ae0 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
21af0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
21b00 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
21b10 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c  phObject == NULL
21b20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21b30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21b40 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e  .  phObject is N
21b50 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
21b60 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
21b70 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
21b80 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20  lMaxObjectCount 
21b90 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
21ba0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21bb0 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e  rror.  Maximum n
21bc0 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
21bd0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65   specified as ze
21be0 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ro.");....return
21bf0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
21c00 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  AD);..}...if (hS
21c10 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
21c20 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
21c30 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
21c40 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
21c50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
21c60 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
21c70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21c80 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
21c90 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
21ca0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
21cb0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
21cc0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
21cd0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
21ce0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
21cf0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
21d00 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
21d10 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
21d20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21d30 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
21d40 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
21d50 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
21d60 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
21d70 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
21d80 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
21d90 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
21da0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21db0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
21dc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21dd0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
21de0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
21df0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
21e00 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
21e10 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
21e20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
21e30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21e40 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
21e50 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
21e60 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21e70 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
21e80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21e90 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
21ea0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
21eb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
21ec0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
21ed0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63  IALIZED);..}...c
21ee0 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d  urr_out_id_idx =
21ef0 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69   0;..for (curr_i
21f00 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73  d_idx = cackey_s
21f10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21f20 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  ].search_curr_id
21f30 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20  ; curr_id_idx < 
21f40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21f50 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
21f60 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c  ties_count && ul
21f70 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20  MaxObjectCount; 
21f80 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b  curr_id_idx++) {
21f90 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61  ...curr_id = &ca
21fa0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21fb0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
21fc0 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b  es[curr_id_idx];
21fd0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
21fe0 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73  _PRINTF("Process
21ff0 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75  ing identity:%lu
22000 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
22010 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  g) curr_id_idx);
22020 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ....matched_coun
22030 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63  t = 0;....for (c
22040 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  urr_attr_idx = 0
22050 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20  ; curr_attr_idx 
22060 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
22070 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
22080 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20  ch_query_count; 
22090 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29  curr_attr_idx++)
220a0 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68   {....prev_match
220b0 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68  ed_count = match
220c0 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75  ed_count;.....cu
220d0 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65  rr_attr = &cacke
220e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
220f0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
22100 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d  y[curr_attr_idx]
22110 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
22120 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65  UG_PRINTF("  Che
22130 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62  cking for attrib
22140 75 74 65 20 25 73 20 28 30 78 25 30 38 6c 78 29  ute %s (0x%08lx)
22150 20 69 6e 20 69 64 65 6e 74 69 74 79 3a 25 69 2e   in identity:%i.
22160 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  ..", CACKEY_DEBU
22170 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45  G_FUNC_ATTRIBUTE
22180 5f 54 4f 5f 53 54 52 28 63 75 72 72 5f 61 74 74  _TO_STR(curr_att
22190 72 2d 3e 74 79 70 65 29 2c 20 28 75 6e 73 69 67  r->type), (unsig
221a0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
221b0 74 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29  ttr->type, (int)
221c0 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09   curr_id_idx);..
221d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
221e0 52 49 4e 54 42 55 46 28 22 20 20 20 20 56 61 6c  RINTBUF("    Val
221f0 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22  ue looking for:"
22200 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  , curr_attr->pVa
22210 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e  lue, curr_attr->
22220 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
22230 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f  .for (sess_attr_
22240 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74  idx = 0; sess_at
22250 74 72 5f 69 64 78 20 3c 20 63 75 72 72 5f 69 64  tr_idx < curr_id
22260 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ->attributes_cou
22270 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64  nt; sess_attr_id
22280 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63  x++) {.....if (c
22290 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d  ackey_pkcs11_com
222a0 70 61 72 65 5f 61 74 74 72 69 62 75 74 65 73 28  pare_attributes(
222b0 26 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62  &curr_id->attrib
222c0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
222d0 64 78 5d 2c 20 63 75 72 72 5f 61 74 74 72 29 29  dx], curr_attr))
222e0 20 7b 0a 09 09 09 09 09 6d 61 74 63 68 65 64 5f   {......matched_
222f0 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 62  count++;.......b
22300 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  reak;.....}....}
22310 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 65 20 61  ...../* If the a
22320 74 74 72 69 62 75 74 65 20 63 6f 75 6c 64 20 6e  ttribute could n
22330 6f 74 20 62 65 20 6d 61 74 63 68 65 64 2c 20 64  ot be matched, d
22340 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 74  o not try to mat
22350 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 74  ch additional at
22360 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 09 09 69  tributes */....i
22370 66 20 28 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  f (prev_matched_
22380 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64  count == matched
22390 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72  _count) {.....br
223a0 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  eak;....}...}...
223b0 09 69 66 20 28 6d 61 74 63 68 65 64 5f 63 6f 75  .if (matched_cou
223c0 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73  nt == cackey_ses
223d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
223e0 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
223f0 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  nt) {....CACKEY_
22400 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
22410 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74 72 69  ... All %i attri
22420 62 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f  butes checked fo
22430 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20  r found, adding 
22440 69 64 65 6e 74 69 74 79 3a 25 69 20 74 6f 20 72  identity:%i to r
22450 65 74 75 72 6e 65 64 20 6c 69 73 74 22 2c 20 28  eturned list", (
22460 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73  int) cackey_sess
22470 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22480 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
22490 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  t, (int) curr_id
224a0 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a  _idx);.....phObj
224b0 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f  ect[curr_out_id_
224c0 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69  idx] = curr_id_i
224d0 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61  dx + 1;.....ulMa
224e0 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a  xObjectCount--;.
224f0 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f  ....curr_out_id_
22500 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20  idx++;...} else 
22510 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
22520 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
22530 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79  Not all %i (only
22540 20 66 6f 75 6e 64 20 25 69 29 20 61 74 74 72 69   found %i) attri
22550 62 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f  butes checked fo
22560 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64  r found, not add
22570 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 22  ing identity:%i"
22580 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73  , (int) cackey_s
22590 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
225a0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
225b0 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61 74 63  ount, (int) matc
225c0 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  hed_count, (int)
225d0 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09   curr_id_idx);..
225e0 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65  .}..}..cackey_se
225f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
22600 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20  .search_curr_id 
22610 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09  = curr_id_idx;..
22620 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20  *pulObjectCount 
22630 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  = curr_out_id_id
22640 78 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  x;...mutex_retva
22650 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
22660 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
22670 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
22680 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
22690 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
226a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
226b0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
226c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
226d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
226e0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
226f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22700 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
22710 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74  (%i), num object
22720 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b  s = %lu", CKR_OK
22730 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  , *pulObjectCoun
22740 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  t);...return(CKR
22750 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
22760 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
22770 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  V, C_FindObjects
22780 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
22790 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
227a0 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69  n) {..CK_ULONG i
227b0 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
227c0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
227d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
227e0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
227f0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
22800 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
22810 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22820 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
22830 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
22840 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
22850 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
22860 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
22870 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
22880 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
22890 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
228a0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
228b0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
228c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
228d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
228e0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
228f0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
22900 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
22910 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
22920 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
22930 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
22940 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
22950 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
22960 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
22970 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22980 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22990 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
229a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
229b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
229c0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
229d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
229e0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
229f0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
22a00 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
22a10 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
22a20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22a30 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
22a40 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
22a50 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
22a60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
22a70 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
22a80 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
22a90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
22aa0 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  rch_active) {...
22ab0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
22ac0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22ad0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
22ae0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22af0 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20  or.  Search not 
22b00 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
22b10 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
22b20 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
22b30 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  IZED);..}...cack
22b40 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22b50 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
22b60 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28  ive = 0;...for (
22b70 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63  idx = 0; idx < c
22b80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22b90 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
22ba0 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78  query_count; idx
22bb0 2b 2b 29 20 7b 0a 09 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 73 65 61 72 63 68 5f 71 75 65  sion].search_que
22be0 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20  ry[idx].pValue) 
22bf0 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
22c00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
22c10 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
22c20 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09  [idx].pValue);..
22c30 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  .}..}...if (cack
22c40 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22c50 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
22c60 72 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63  ry) {...free(cac
22c70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22c80 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
22c90 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  ery);..}...mutex
22ca0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
22cb0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
22cc0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
22cd0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
22ce0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
22cf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22d00 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
22d10 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
22d20 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
22d30 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
22d40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22d50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22d60 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
22d70 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
22d80 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
22d90 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22da0 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e  _RV, C_EncryptIn
22db0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
22dc0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
22dd0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
22de0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
22df0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
22e00 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
22e10 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
22e20 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
22e30 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
22e40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22e50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22e60 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
22e70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22e80 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
22e90 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
22ea0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
22eb0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
22ec0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
22ed0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
22ee0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
22ef0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22f00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
22f10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22f20 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
22f30 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
22f40 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29  K_RV, C_Encrypt)
22f50 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
22f60 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
22f70 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
22f80 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
22f90 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
22fa0 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20  pEncryptedData, 
22fb0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
22fc0 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e  EncryptedDataLen
22fd0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
22fe0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
22ff0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
23000 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
23010 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23020 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23030 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
23040 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23050 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
23060 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
23070 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23080 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
23090 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
230a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
230b0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
230c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
230d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
230e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
230f0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
23100 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23110 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64  RV, C_EncryptUpd
23120 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
23130 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
23140 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
23150 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
23160 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
23170 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
23180 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
23190 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
231a0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
231b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
231c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
231d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
231e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
231f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23200 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23210 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23220 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23230 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23240 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
23250 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
23260 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
23270 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
23280 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
23290 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
232a0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
232b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
232c0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
232d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
232e0 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
232f0 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  tFinal)(CK_SESSI
23300 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
23310 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
23320 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61  pLastEncryptedPa
23330 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
23340 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65   pulLastEncrypte
23350 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
23360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23370 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
23380 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
23390 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
233a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
233b0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
233c0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
233d0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
233e0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
233f0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
23400 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23410 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
23420 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23430 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
23440 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23450 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
23460 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
23470 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
23480 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
23490 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
234a0 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45  cryptInit)(CK_SE
234b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
234c0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
234d0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
234e0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
234f0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e  NDLE hKey) {..in
23500 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
23510 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b  ..hKey--;...CACK
23520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23530 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
23540 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
23550 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
23560 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23570 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
23580 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
23590 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
235a0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
235b0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  ED);..}...if (pM
235c0 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c  echanism == NULL
235d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
235e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
235f0 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20  . pMechanism is 
23600 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
23610 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
23620 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
23630 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
23640 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41  anism != CKM_RSA
23650 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45  _PKCS) {...CACKE
23660 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23670 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
23680 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74  m->mechanism not
23690 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b   specified as CK
236a0 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09  M_RSA_PKCS");...
236b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48  .return(CKR_MECH
236c0 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41  ANISM_PARAM_INVA
236d0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  LID);..}...if (h
236e0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
236f0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
23700 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
23710 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
23720 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
23730 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
23740 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23750 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
23760 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
23770 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
23780 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
23790 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
237a0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
237b0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
237c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
237d0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
237e0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
237f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23800 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
23810 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
23820 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
23830 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
23840 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
23850 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
23860 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
23870 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23880 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
23890 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
238a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
238b0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
238c0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
238d0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
238e0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
238f0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
23900 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
23910 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
23920 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
23930 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23940 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
23950 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23960 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
23970 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67   already in prog
23980 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ress.");......re
23990 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
239a0 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
239b0 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63  .if (hKey >= cac
239c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
239d0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
239e0 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63  s_count) {...cac
239f0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
23a00 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
23a10 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
23a20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23a30 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74    Key handle out
23a40 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65   of range (reque
23a50 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e  sted key %lu, on
23a60 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65  ly %lu identitie
23a70 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20  s available).", 
23a80 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
23a90 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  hKey, (unsigned 
23aa0 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73  long) cackey_ses
23ab0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
23ac0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
23ad0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23ae0 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  _KEY_HANDLE_INVA
23af0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  LID);..}...cacke
23b00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23b10 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
23b20 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65  ive = 1;...cacke
23b30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23b40 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
23b50 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e  hanism = pMechan
23b60 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a  ism->mechanism;.
23b70 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
23b80 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
23b90 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70  pt_mech_parm = p
23ba0 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61  Mechanism->pPara
23bb0 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73  meter;..cackey_s
23bc0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23bd0 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70  ].decrypt_mech_p
23be0 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e  armlen = pMechan
23bf0 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72  ism->ulParameter
23c00 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  Len;..cackey_ses
23c10 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
23c20 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
23c30 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
23c40 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
23c50 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a  entities[hKey];.
23c60 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
23c70 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
23c80 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23c90 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
23ca0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
23cb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23cc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
23cd0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
23ce0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
23cf0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
23d00 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
23d10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
23d20 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
23d30 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
23d40 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
23d50 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
23d60 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
23d70 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f  crypt)(CK_SESSIO
23d80 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
23d90 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
23da0 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43  EncryptedData, C
23db0 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
23dc0 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42  tedDataLen, CK_B
23dd0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
23de0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
23df0 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c  ataLen) {..CK_UL
23e00 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61  ONG datalen_upda
23e10 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61  te, datalen_fina
23e20 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70  l;..CK_RV decryp
23e30 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65  t_ret;..int mute
23e40 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
23e50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23e60 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
23e70 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
23e80 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
23e90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23ea0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
23eb0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
23ec0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
23ed0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
23ee0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
23ef0 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c  lDataLen == NULL
23f00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23f10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23f20 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20  . pulDataLen is 
23f30 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
23f40 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
23f50 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61  _BAD);..}...data
23f60 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75  len_update = *pu
23f70 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72  lDataLen;...decr
23f80 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72  ypt_ret = C_Decr
23f90 79 70 74 55 70 64 61 74 65 28 68 53 65 73 73 69  yptUpdate(hSessi
23fa0 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61  on, pEncryptedDa
23fb0 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44  ta, ulEncryptedD
23fc0 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26  ataLen, pData, &
23fd0 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b  datalen_update);
23fe0 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65  ..if (decrypt_re
23ff0 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
24000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24010 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
24020 63 72 79 70 74 55 70 64 61 74 65 28 29 20 72 65  cryptUpdate() re
24030 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
24040 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
24050 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63  signed long) dec
24060 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66  rypt_ret);....if
24070 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d   (decrypt_ret !=
24080 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
24090 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54  SMALL) {..../* T
240a0 65 72 6d 69 6e 61 74 65 20 64 65 63 72 79 70 74  erminate decrypt
240b0 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
240c0 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61  .....mutex_retva
240d0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
240e0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
240f0 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
24100 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
24110 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
24120 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24130 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
24140 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
24150 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
24160 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  RROR);....}.....
24170 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
24180 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
24190 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
241a0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
241b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
241c0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
241d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
241e0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
241f0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
24200 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
24210 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
24220 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  LID);....}.....i
24230 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
24240 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
24250 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
24260 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
24270 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24280 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41  iglock);......CA
24290 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
242a0 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
242b0 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  pt not active.")
242c0 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
242d0 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
242e0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
242f0 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
24300 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24310 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
24320 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78  e = 0;.....mutex
24330 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24340 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24350 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
24360 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
24370 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43  al != 0) {.....C
24380 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24390 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
243a0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
243b0 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
243c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
243d0 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74  ....}...}....ret
243e0 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29  urn(decrypt_ret)
243f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61  ;..}...if (pData
24400 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64  ) {...pData += d
24410 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09  atalen_update;..
24420 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  }..datalen_final
24430 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d   = *pulDataLen -
24440 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b   datalen_update;
24450 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d  ...decrypt_ret =
24460 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28   C_DecryptFinal(
24470 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c  hSession, pData,
24480 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29   &datalen_final)
24490 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ;..if (decrypt_r
244a0 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
244b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
244c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
244d0 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65  ecryptFinal() re
244e0 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
244f0 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
24500 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63  signed long) dec
24510 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65  rypt_ret);....re
24520 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74  turn(decrypt_ret
24530 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61  );..}...*pulData
24540 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70  Len = datalen_up
24550 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66  date + datalen_f
24560 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  inal;...CACKEY_D
24570 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
24580 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
24590 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
245a0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
245b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
245c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
245d0 65 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ecryptUpdate)(CK
245e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
245f0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
24600 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
24610 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
24620 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
24630 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
24640 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
24650 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
24660 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45  ..static CK_BYTE
24670 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73   buf[16384];..ss
24680 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43  ize_t buflen;..C
24690 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
246a0 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
246b0 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
246c0 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ROR;..int mutex_
246d0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
246e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
246f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
24700 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
24710 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
24720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24730 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
24740 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
24750 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
24760 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
24770 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
24780 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
24790 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
247a0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
247b0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
247c0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
247d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
247e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
247f0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
24800 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
24810 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
24820 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
24830 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e  D);..}...if (pEn
24840 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e  cryptedPart == N
24850 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74  ULL && ulEncrypt
24860 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  edPartLen == 0) 
24870 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
24880 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61  cuit if we are a
24890 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20  sked to decrypt 
248a0 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
248b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
248c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
248d0 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
248e0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
248f0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
24900 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
24910 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74   (pEncryptedPart
24920 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
24930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24940 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79  F("Error. pEncry
24950 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c  ptedPart is NULL
24960 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65  , but ulEncrypte
24970 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20  dPartLen is not 
24980 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0.");....return(
24990 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
249a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45  D);..}...if (ulE
249b0 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
249c0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
249d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
249e0 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65  rror. ulEncrypte
249f0 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62  dPartLen is 0, b
24a00 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20  ut pPart is not 
24a10 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
24a20 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
24a30 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
24a40 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55  pulPartLen == NU
24a50 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
24a60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24a70 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69  or. pulPartLen i
24a80 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
24a90 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
24aa0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
24ab0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24ac0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(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 4c 6f 63 6b 69 6e 67  "Error.  Locking
24b20 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
24b30 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
24b40 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
24b50 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
24b60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
24b70 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
24b80 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24b90 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
24ba0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24bb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
24bc0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
24bd0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
24be0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
24bf0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
24c00 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
24c10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24c20 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
24c30 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
24c40 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
24c50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
24c60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24c70 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
24c80 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
24c90 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
24ca0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
24cb0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
24cc0 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63  }...slotID = cac
24cd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24ce0 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a  ssion].slotID;..
24cf0 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
24d00 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
24d10 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
24d20 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
24d30 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
24d40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24d50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
24d60 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
24d70 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
24d80 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
24d90 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
24da0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
24db0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
24dc0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
24dd0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
24de0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
24df0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24e00 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
24e10 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
24e20 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
24e30 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
24e40 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
24e50 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
24e60 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
24e70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24e80 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
24e90 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61  ..}...switch (ca
24ea0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24eb0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
24ec0 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
24ed0 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
24ee0 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64  :..../* Ask card
24ef0 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09   to decrypt */..
24f00 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65  ..buflen = cacke
24f10 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63  y_signdecrypt(&c
24f20 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
24f30 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ID], cackey_sess
24f40 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
24f50 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c  ecrypt_identity,
24f60 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
24f70 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
24f80 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66  Len, buf, sizeof
24f90 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09  (buf), 0, 1);...
24fa0 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30  ..if (buflen < 0
24fb0 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79  ) {...../* Decry
24fc0 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f  ption failed. */
24fd0 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
24fe0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
24ff0 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09  _NEEDLOGIN) {...
25000 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
25010 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f  USER_NOT_LOGGED_
25020 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69  IN;.....} else i
25030 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  f (buflen == CAC
25040 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
25050 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72  ABSENT) {......r
25060 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49  etval = CKR_DEVI
25070 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09  CE_REMOVED;.....
25080 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65  } else {......re
25090 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
250a0 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a  AL_ERROR;.....}.
250b0 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28  ...} else if (((
250c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
250d0 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72  uflen) > *pulPar
250e0 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b  tLen && pPart) {
250f0 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65  ...../* Decrypte
25100 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65  d data too large
25110 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d   */.....retval =
25120 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
25130 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65  SMALL;....} else
25140 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72 74   {.....if (pPart
25150 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  ) {......memcpy(
25160 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c  pPart, buf, bufl
25170 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  en);.....}......
25180 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75  *pulPartLen = bu
25190 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61  flen;......retva
251a0 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d  l = CKR_OK;....}
251b0 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  .....break;..}..
251c0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
251d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
251e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
251f0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
25200 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
25210 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25220 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
25230 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
25240 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25250 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
25260 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
25270 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
25280 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20  ning %i", (int) 
25290 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
252a0 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b  n(retval);.}..CK
252b0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
252c0 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
252d0 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  tFinal)(CK_SESSI
252e0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
252f0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
25300 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c  pLastPart, CK_UL
25310 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50  ONG_PTR pulLastP
25320 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d  artLen) {..int m
25330 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
25340 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72  t terminate_decr
25350 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45  ypt = 1;...CACKE
25360 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25370 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
25380 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
25390 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
253a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
253b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
253c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
253d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
253e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
253f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
25400 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
25410 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
25420 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
25430 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
25440 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
25450 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25460 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25470 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
25480 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
25490 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
254a0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
254b0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ID);..}...if (pu
254c0 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20  lLastPartLen == 
254d0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
254e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
254f0 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72  rror. pulLastPar
25500 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  tLen is NULL.");
25510 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
25520 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
25530 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
25540 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
25550 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
25560 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
25570 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
25580 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25590 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
255a0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
255b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
255c0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
255d0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
255e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
255f0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
25600 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25610 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25620 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
25630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25640 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
25650 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
25660 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
25670 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
25680 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
25690 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
256a0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
256b0 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
256c0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
256d0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
256e0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
256f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25700 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
25710 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
25720 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
25730 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
25740 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61  ED);..}...*pulLa
25750 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a  stPartLen = 0;..
25760 09 69 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d  .if (pLastPart =
25770 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d  = NULL) {...term
25780 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20  inate_decrypt = 
25790 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d  0;..}...if (term
257a0 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b  inate_decrypt) {
257b0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
257c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
257d0 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b  rypt_active = 0;
257e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
257f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
25800 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25810 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
25820 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
25830 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25840 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25850 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
25860 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
25870 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
25880 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
25890 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
258a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
258b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
258c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
258d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
258e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
258f0 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b  C_DigestInit)(CK
25900 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
25910 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
25920 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
25930 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59  anism) {..CACKEY
25940 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
25950 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
25960 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
25970 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
25980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25990 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
259a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
259b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
259c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
259d0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
259e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
259f0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
25a00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25a10 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
25a20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
25a30 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
25a40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
25a50 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
25a60 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
25a70 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
25a80 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
25a90 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
25aa0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
25ab0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
25ac0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
25ad0 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c  R pDigest, CK_UL
25ae0 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73  ONG_PTR pulDiges
25af0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
25b00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
25b10 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
25b20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
25b30 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
25b40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25b50 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
25b60 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
25b70 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
25b80 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
25b90 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
25ba0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
25bb0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
25bc0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
25bd0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
25be0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
25bf0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
25c00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
25c10 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
25c20 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
25c30 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
25c40 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
25c50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
25c60 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
25c70 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
25c80 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
25c90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25ca0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
25cb0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
25cc0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
25cd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25ce0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
25cf0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
25d00 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
25d10 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
25d20 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
25d30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25d40 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
25d50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
25d60 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
25d70 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
25d80 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
25d90 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
25da0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
25db0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
25dc0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
25dd0 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53  igestKey)(CK_SES
25de0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
25df0 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
25e00 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
25e10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25e20 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
25e30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
25e40 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
25e50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25e60 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
25e70 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
25e80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
25e90 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
25ea0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
25eb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25ec0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
25ed0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
25ee0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
25ef0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
25f00 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
25f10 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
25f20 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
25f30 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
25f40 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
25f50 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b  _DigestFinal)(CK
25f60 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
25f70 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
25f80 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43  E_PTR pDigest, C
25f90 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
25fa0 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43  igestLen) {..CAC
25fb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25fc0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
25fd0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
25fe0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
25ff0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26000 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
26010 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
26020 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
26030 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
26040 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
26050 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26060 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
26070 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26080 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
26090 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
260a0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
260b0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
260c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
260d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
260e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
260f0 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  gnInit)(CK_SESSI
26100 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
26110 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
26120 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
26130 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
26140 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d  E hKey) {..int m
26150 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68  utex_retval;...h
26160 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f  Key--;...CACKEY_
26170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
26180 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
26190 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
261a0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
261b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
261c0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
261d0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
261e0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
261f0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
26200 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
26210 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b  anism == NULL) {
26220 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26230 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
26240 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c  Mechanism is NUL
26250 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
26260 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
26270 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
26280 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
26290 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b  sm != CKM_RSA_PK
262a0 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  CS) {...CACKEY_D
262b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
262c0 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  or. pMechanism->
262d0 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70  mechanism not sp
262e0 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52  ecified as CKM_R
262f0 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65  SA_PKCS");....re
26300 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49  turn(CKR_MECHANI
26310 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44  SM_PARAM_INVALID
26320 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
26330 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
26340 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
26350 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26360 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
26370 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
26380 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26390 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
263a0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
263b0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
263c0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
263d0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
263e0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
263f0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
26400 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
26410 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
26420 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
26430 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
26440 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26450 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
26460 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26470 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
26480 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
26490 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
264a0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
264b0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
264c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
264d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
264e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
264f0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
26500 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
26510 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
26520 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
26530 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
26540 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
26550 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
26560 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
26570 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
26580 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
26590 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
265a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
265b0 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20  .  Sign already 
265c0 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a  in progress.");.
265d0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
265e0 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
265f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79  );..}...if (hKey
26600 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69   >= cackey_sessi
26610 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26620 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
26630 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
26640 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
26650 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
26660 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26670 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e  "Error.  Key han
26680 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
26690 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20   (requested key 
266a0 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64  %lu, only %lu id
266b0 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62  entities availab
266c0 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  le).", (unsigned
266d0 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e   long) hKey, (un
266e0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63  signed long) cac
266f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26700 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
26710 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74  s_count);....ret
26720 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44  urn(CKR_KEY_HAND
26730 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
26740 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26750 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
26760 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63  _active = 1;...c
26770 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26780 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65  Session].sign_me
26790 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61  chanism = pMecha
267a0 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b  nism->mechanism;
267b0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
267c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
267d0 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a  n_buflen = 128;.
267e0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
267f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
26800 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61  bufused = 0;..ca
26810 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26820 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
26830 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
26840 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (*cackey_session
26850 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
26860 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73  _buf) * cackey_s
26870 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26880 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a  ].sign_buflen);.
26890 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
268a0 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25  RINTF("Session %
268b0 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  lu sign_identity
268c0 20 69 73 20 25 70 20 28 69 64 65 6e 74 69 74 79   is %p (identity
268d0 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e   #%lu)", (unsign
268e0 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f  ed long) hSessio
268f0 6e 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  n, &cackey_sessi
26900 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26910 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20  entities[hKey], 
26920 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
26930 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73  hKey);..cackey_s
26940 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26950 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20  ].sign_identity 
26960 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
26970 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
26980 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a  ntities[hKey];..
26990 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
269a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
269b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
269c0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
269d0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
269e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
269f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
26a00 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
26a10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26a20 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
26a30 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
26a40 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
26a50 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
26a60 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
26a70 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
26a80 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
26a90 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
26aa0 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
26ab0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
26ac0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
26ad0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
26ae0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
26af0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
26b00 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
26b10 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75  gnatureLen) {..u
26b20 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61  nsigned long sta
26b30 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
26b40 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74  ..CK_RV sign_ret
26b50 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
26b60 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
26b70 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
26b80 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
26b90 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
26ba0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26bb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26bc0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
26bd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26be0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
26bf0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
26c00 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
26c10 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
26c20 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
26c30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
26c40 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
26c50 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
26c60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26c70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
26c80 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
26c90 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
26ca0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
26cb0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
26cc0 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e  ..}...start_sign
26cd0 5f 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65  _bufused = cacke
26ce0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26cf0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
26d00 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  d;...sign_ret = 
26d10 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65  C_SignUpdate(hSe
26d20 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c  ssion, pData, ul
26d30 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73  DataLen);..if (s
26d40 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
26d50 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
26d60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26d70 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29  r.  SignUpdate()
26d80 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
26d90 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
26da0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
26db0 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66  sign_ret);....if
26dc0 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b   (sign_ret != CK
26dd0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
26de0 4c 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72  LL) {....mutex_r
26df0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
26e00 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
26e10 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66  _biglock);....if
26e20 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
26e30 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
26e40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26e50 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
26e60 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09  failed.");......
26e70 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
26e80 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  AL_ERROR);....}.
26e90 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
26ea0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26eb0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  n].active) {....
26ec0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
26ed0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
26ee0 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
26ef0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26f00 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
26f10 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
26f20 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
26f30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
26f40 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a  INVALID);....}..
26f50 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
26f60 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26f70 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
26f80 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
26f90 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26fa0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
26fb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26fc0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
26fd0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
26fe0 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
26ff0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
27000 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09  INITIALIZED);...
27010 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  .}.....cackey_se
27020 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27030 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
27040 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76  ;.....mutex_retv
27050 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
27060 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
27070 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20  biglock);....if 
27080 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
27090 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
270a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
270b0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
270c0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
270d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
270e0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  RAL_ERROR);....}
270f0 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73  ...}....return(s
27100 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73  ign_ret);..}...s
27110 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e  ign_ret = C_Sign
27120 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20  Final(hSession, 
27130 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53  pSignature, pulS
27140 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69  ignatureLen);..i
27150 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43  f (sign_ret != C
27160 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73  KR_OK) {...if (s
27170 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42  ign_ret == CKR_B
27180 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
27190 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
271a0 55 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46  UG_PRINTF("SignF
271b0 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
271c0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
271d0 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c  MALL (rv = %lu),
271e0 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55   undoing C_SignU
271f0 70 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67  pdate()", (unsig
27200 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72  ned long) sign_r
27210 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  et);.....cackey_
27220 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27230 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
27240 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  = start_sign_buf
27250 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e  used;.....return
27260 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a  (sign_ret);...}.
27270 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27280 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27290 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75  SignFinal() retu
272a0 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
272b0 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
272c0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
272d0 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
272e0 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  sign_ret);..}...
272f0 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d  if (pSignature =
27300 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
27310 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27320 22 70 53 69 67 6e 61 74 75 72 65 20 73 70 65 63  "pSignature spec
27330 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75  ified as NULL, u
27340 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64  ndoing C_SignUpd
27350 61 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b  ate()");....cack
27360 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
27370 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
27380 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f  ed = start_sign_
27390 62 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75  bufused;....retu
273a0 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d  rn(sign_ret);..}
273b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
273c0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
273d0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
273e0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
273f0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
27400 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
27410 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70  (CK_RV, C_SignUp
27420 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
27430 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
27440 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
27450 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
27460 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20  PartLen) {..int 
27470 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
27480 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27490 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
274a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
274b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
274c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
274d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
274e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
274f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
27500 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
27510 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
27520 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
27530 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
27540 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
27550 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
27560 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
27570 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
27580 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27590 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
275a0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
275b0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
275c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
275d0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
275e0 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (pPart == NULL
275f0 20 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d   && ulPartLen ==
27600 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74   0) {.../* Short
27610 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61   circuit if we a
27620 72 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e  re asked to sign
27630 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09   nothing... */..
27640 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27650 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
27660 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
27670 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
27680 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
27690 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
276a0 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (pPart == NULL
276b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
276c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
276d0 2e 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c  . pPart is NULL,
276e0 20 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69   but ulPartLen i
276f0 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72  s not 0.");....r
27700 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
27710 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
27720 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20  f (ulPartLen == 
27730 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
27740 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27750 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  r. ulPartLen is 
27760 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20  0, but pPart is 
27770 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
27780 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
27790 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
277a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
277b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
277c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
277d0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
277e0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
277f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27800 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
27810 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
27820 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
27830 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
27840 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
27850 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27860 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
27870 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27880 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27890 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
278a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
278b0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
278c0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
278d0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
278e0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
278f0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
27900 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27910 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
27920 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
27930 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
27940 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
27950 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27960 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
27970 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
27980 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
27990 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
279a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
279b0 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
279c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
279d0 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
279e0 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
279f0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
27a00 63 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74  ccumulate direct
27a10 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61  ly */....if ((ca
27a20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27a30 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
27a40 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e  used + ulPartLen
27a50 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) > cackey_sessi
27a60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
27a70 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09  gn_buflen) {....
27a80 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
27a90 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
27aa0 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09  buflen *= 2;....
27ab0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
27ac0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
27ad0 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63  _buf = realloc(c
27ae0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27af0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
27b00 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65  f, sizeof(*cacke
27b10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27b20 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a  ion].sign_buf) *
27b30 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
27b40 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
27b50 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09  buflen);....}...
27b60 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f  ..memcpy(cackey_
27b70 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27b80 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61  n].sign_buf + ca
27b90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27ba0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
27bb0 75 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50  used, pPart, ulP
27bc0 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63  artLen);.....cac
27bd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27be0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
27bf0 73 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e  sed += ulPartLen
27c00 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  ;.....break;..}.
27c10 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
27c20 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
27c30 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27c40 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
27c50 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
27c60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27c70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
27c80 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
27c90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27ca0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27cb0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
27cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
27cd0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
27ce0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
27cf0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
27d00 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
27d10 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
27d20 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  gnFinal)(CK_SESS
27d30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
27d40 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
27d50 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
27d60 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67  ULONG_PTR pulSig
27d70 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74  natureLen) {..st
27d80 61 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67  atic CK_BYTE sig
27d90 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a  buf[1024];..ssiz
27da0 65 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09  e_t sigbuflen;..
27db0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
27dc0 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  D;..CK_RV retval
27dd0 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
27de0 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69  RROR;..int termi
27df0 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09  nate_sign = 1;..
27e00 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
27e10 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
27e20 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
27e30 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
27e40 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
27e50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27e60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27e70 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
27e80 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27e90 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
27ea0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
27eb0 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75  ..if (pulSignatu
27ec0 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  reLen == NULL) {
27ed0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27ee0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
27ef0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69  ulSignatureLen i
27f00 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
27f10 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
27f20 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
27f30 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
27f40 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
27f50 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
27f60 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
27f70 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
27f80 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
27f90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27fa0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
27fb0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
27fc0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
27fd0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
27fe0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
27ff0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
28000 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
28010 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28020 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
28030 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
28040 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28050 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
28060 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
28070 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28080 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
28090 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
280a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
280b0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
280c0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
280d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
280e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
280f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28100 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
28110 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
28120 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
28130 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
28140 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
28150 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28160 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
28170 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
28180 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
28190 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
281a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
281b0 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
281c0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
281d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
281e0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
281f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
28200 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
28210 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28220 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
28230 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
28240 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
28250 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
28260 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
28270 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
28280 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28290 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
282a0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
282b0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
282c0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
282d0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
282e0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
282f0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
28300 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
28310 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
28320 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
28330 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28340 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
28350 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
28360 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
28370 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
28380 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
28390 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
283a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
283b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
283c0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
283d0 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
283e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
283f0 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
28400 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
28410 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
28420 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e  Ask card to sign
28430 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45   */....CACKEY_DE
28440 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69  BUG_PRINTF("Aski
28450 6e 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20  ng to sign from 
28460 69 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73  identity %p in s
28470 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 63 61 63  ession %lu", cac
28480 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28490 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
284a0 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  tity, (unsigned 
284b0 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b  long) hSession);
284c0 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20  ....sigbuflen = 
284d0 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
284e0 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
284f0 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
28500 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28510 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74  on].sign_identit
28520 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  y, cackey_sessio
28530 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
28540 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65  n_buf, cackey_se
28550 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28560 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73  .sign_bufused, s
28570 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69  igbuf, sizeof(si
28580 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09  gbuf), 1, 0);...
28590 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
285a0 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69  < 0) {...../* Si
285b0 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f  gning failed. */
285c0 0a 09 09 09 09 69 66 20 28 73 69 67 62 75 66 6c  .....if (sigbufl
285d0 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
285e0 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b  C_E_NEEDLOGIN) {
285f0 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
28600 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47  KR_USER_NOT_LOGG
28610 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73  ED_IN;.....} els
28620 65 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  e if (sigbuflen 
28630 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
28640 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a  _TOKENABSENT) {.
28650 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
28660 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
28670 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
28680 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
28690 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
286a0 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
286b0 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  if (((unsigned l
286c0 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20  ong) sigbuflen) 
286d0 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  > *pulSignatureL
286e0 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72 65  en && pSignature
286f0 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65  ) {...../* Signe
28700 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65  d data too large
28710 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f 44   */.....CACKEY_D
28720 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65 74  EBUG_PRINTF("ret
28730 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
28740 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67  _TOO_SMALL;  sig
28750 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75  buflen = %lu, pu
28760 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20  lSignatureLen = 
28770 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
28780 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 2c  long) sigbuflen,
28790 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
287a0 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65   *pulSignatureLe
287b0 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  n);......retval 
287c0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
287d0 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72  _SMALL;......ter
287e0 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b  minate_sign = 0;
287f0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
28800 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
28810 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53  = 0;......if (pS
28820 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09  ignature) {.....
28830 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75  .memcpy(pSignatu
28840 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62  re, sigbuf, sigb
28850 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65  uflen);.......te
28860 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31  rminate_sign = 1
28870 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75  ;.....}......*pu
28880 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20  lSignatureLen = 
28890 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09  sigbuflen;......
288a0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
288b0 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
288c0 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e  ..}...if (termin
288d0 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66  ate_sign) {...if
288e0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
288f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
28900 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28  _buf) {....free(
28910 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28920 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
28930 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  uf);...}....cack
28940 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28950 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
28960 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65  e = 0;..}...mute
28970 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
28980 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28990 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
289a0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
289b0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
289c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
289d0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
289e0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
289f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
28a00 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
28a10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28a20 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28a30 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  %i", (int) retva
28a40 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
28a50 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  val);.}..CK_DEFI
28a60 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
28a70 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  V, C_SignRecover
28a80 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
28a90 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
28aa0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
28ab0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
28ac0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
28ad0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
28ae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
28af0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
28b00 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
28b10 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
28b20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28b30 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
28b40 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
28b50 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
28b60 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
28b70 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
28b80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
28b90 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
28ba0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
28bb0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
28bc0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28bd0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
28be0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
28bf0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
28c00 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
28c10 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65  (CK_RV, C_SignRe
28c20 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f  cover)(CK_SESSIO
28c30 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
28c40 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
28c50 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
28c60 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
28c70 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
28c80 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
28c90 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
28ca0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
28cb0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
28cc0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
28cd0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
28ce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28cf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
28d00 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
28d10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28d20 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
28d30 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
28d40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28d50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28d60 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
28d70 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
28d80 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
28d90 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
28da0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
28db0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28dc0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
28dd0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
28de0 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28  , C_VerifyInit)(
28df0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
28e00 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
28e10 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
28e20 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
28e30 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
28e40 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
28e50 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
28e60 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
28e70 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
28e80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28e90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
28ea0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
28eb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28ec0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
28ed0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
28ee0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28ef0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28f00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
28f10 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
28f20 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
28f30 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
28f40 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
28f50 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28f60 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
28f70 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
28f80 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53  , C_Verify)(CK_S
28f90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
28fa0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
28fb0 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
28fc0 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
28fd0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
28fe0 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
28ff0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
29000 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
29010 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
29020 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
29030 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
29040 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29050 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
29060 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
29070 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29080 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
29090 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
290a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
290b0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
290c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
290d0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
290e0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
290f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
29100 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
29110 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29120 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
29130 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
29140 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65  , C_VerifyUpdate
29150 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
29160 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
29170 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
29180 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
29190 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
291a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
291b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
291c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
291d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
291e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
291f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
29200 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
29210 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
29220 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
29230 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29240 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29250 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
29260 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
29270 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
29280 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29290 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
292a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
292b0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
292c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
292d0 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46  CK_RV, C_VerifyF
292e0 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
292f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
29300 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
29310 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
29320 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  NG ulSignatureLe
29330 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
29340 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
29350 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
29360 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
29370 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29380 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29390 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
293a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
293b0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
293c0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
293d0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
293e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
293f0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
29400 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
29410 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
29420 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
29430 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
29440 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29450 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
29460 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
29470 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63  _RV, C_VerifyRec
29480 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53  overInit)(CK_SES
29490 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
294a0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
294b0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
294c0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
294d0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
294e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
294f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
29500 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
29510 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
29520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29530 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
29540 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
29550 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
29560 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
29570 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
29580 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29590 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
295a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
295b0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
295c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
295d0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
295e0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
295f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
29600 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
29610 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
29620 72 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f  rifyRecover)(CK_
29630 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
29640 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
29650 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
29660 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e   CK_ULONG ulSign
29670 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54  atureLen, CK_BYT
29680 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
29690 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74  ULONG_PTR pulDat
296a0 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  aLen) {..CACKEY_
296b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
296c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
296d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
296e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
296f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29700 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
29710 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
29720 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
29730 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
29740 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
29750 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29760 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
29770 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29780 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
29790 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
297a0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
297b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
297c0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
297d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
297e0 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
297f0 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43  EncryptUpdate)(C
29800 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
29810 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
29820 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
29830 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
29840 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
29850 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
29860 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e  _ULONG_PTR pulEn
29870 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
29880 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
29890 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
298a0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
298b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
298c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
298d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
298e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
298f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29900 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
29910 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
29920 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29930 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
29940 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29950 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
29960 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
29970 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
29980 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
29990 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
299a0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
299b0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
299c0 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73  , C_DecryptDiges
299d0 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
299e0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
299f0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
29a00 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
29a10 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72   CK_ULONG ulEncr
29a20 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b  yptedPartLen, CK
29a30 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
29a40 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
29a50 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
29a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29a70 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
29a80 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
29a90 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
29aa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29ab0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
29ac0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
29ad0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
29ae0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
29af0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
29b00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29b10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
29b20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29b30 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
29b40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29b50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
29b60 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
29b70 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
29b80 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
29b90 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
29ba0 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 29  gnEncryptUpdate)
29bb0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
29bc0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
29bd0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
29be0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
29bf0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
29c00 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
29c10 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
29c20 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
29c30 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
29c40 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
29c50 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
29c60 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
29c70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29c80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29c90 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
29ca0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29cb0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
29cc0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
29cd0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29ce0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
29cf0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
29d00 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
29d10 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
29d20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
29d30 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
29d40 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29d50 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
29d60 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
29d70 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72  RV, C_DecryptVer
29d80 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45  ifyUpdate)(CK_SE
29d90 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
29da0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
29db0 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
29dc0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
29dd0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
29de0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
29df0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
29e00 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  pulPartLen) {..C
29e10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29e20 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
29e30 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
29e40 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
29e50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29e60 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
29e70 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
29e80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
29e90 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
29ea0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
29eb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29ec0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
29ed0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29ee0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
29ef0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29f00 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
29f10 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
29f20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
29f30 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
29f40 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
29f50 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f  GenerateKey)(CK_
29f60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
29f70 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
29f80 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
29f90 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55  nism, CK_ATTRIBU
29fa0 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
29fb0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
29fc0 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
29fd0 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
29fe0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
29ff0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2a000 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2a010 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2a020 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a030 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2a040 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2a050 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a060 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2a070 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2a080 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a090 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2a0a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2a0b0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2a0c0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2a0d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2a0e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2a0f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2a100 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2a110 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2a120 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  , C_GenerateKeyP
2a130 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  air)(CK_SESSION_
2a140 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2a150 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
2a160 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
2a170 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
2a180 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74  PublicKeyTemplat
2a190 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75  e, CK_ULONG ulPu
2a1a0 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74 65  blicKeyAttribute
2a1b0 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42  Count, CK_ATTRIB
2a1c0 55 54 45 5f 50 54 52 20 70 50 72 69 76 61 74 65  UTE_PTR pPrivate
2a1d0 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  KeyTemplate, CK_
2a1e0 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b  ULONG ulPrivateK
2a1f0 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  eyAttributeCount
2a200 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2a210 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b  LE_PTR phPublicK
2a220 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  ey, CK_OBJECT_HA
2a230 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61  NDLE_PTR phPriva
2a240 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  teKey) {..CACKEY
2a250 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2a260 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2a270 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2a280 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2a290 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a2a0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2a2b0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2a2c0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2a2d0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2a2e0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2a2f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2a300 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2a310 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a320 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2a330 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a340 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2a350 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a360 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2a370 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2a380 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b  N(CK_RV, C_WrapK
2a390 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
2a3a0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2a3b0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2a3c0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2a3d0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57  OBJECT_HANDLE hW
2a3e0 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f  rappingKey, CK_O
2a3f0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
2a400 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  y, CK_BYTE_PTR p
2a410 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55  WrappedKey, CK_U
2a420 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70  LONG_PTR pulWrap
2a430 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41  pedKeyLen) {..CA
2a440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a450 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2a460 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2a470 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2a480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a490 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2a4a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2a4b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2a4c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2a4d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2a4e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a4f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2a500 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a510 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2a520 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2a530 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2a540 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2a550 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2a560 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2a570 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55  CTION(CK_RV, C_U
2a580 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53  nwrapKey)(CK_SES
2a590 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2a5a0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2a5b0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2a5c0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2a5d0 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b  DLE hUnwrappingK
2a5e0 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  ey, CK_BYTE_PTR 
2a5f0 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f  pWrappedKey, CK_
2a600 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b  ULONG ulWrappedK
2a610 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42  eyLen, CK_ATTRIB
2a620 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
2a630 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74  e, CK_ULONG ulAt
2a640 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
2a650 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
2a660 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43  TR phKey) {..CAC
2a670 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a680 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2a690 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2a6a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2a6b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a6c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2a6d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2a6e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2a6f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2a700 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2a710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a720 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2a730 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2a740 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2a750 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a760 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2a770 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2a780 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2a790 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2a7a0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
2a7b0 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53  riveKey)(CK_SESS
2a7c0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2a7d0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2a7e0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2a7f0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2a800 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f  LE hBaseKey, CK_
2a810 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
2a820 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
2a830 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75  G ulAttributeCou
2a840 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
2a850 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
2a860 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2a870 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2a880 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2a890 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2a8a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a8b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2a8c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2a8d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a8e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2a8f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2a900 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a910 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2a920 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2a930 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2a940 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2a950 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2a960 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2a970 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2a980 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2a990 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2a9a0 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28  , C_SeedRandom)(
2a9b0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2a9c0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2a9d0 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43  YTE_PTR pSeed, C
2a9e0 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65  K_ULONG ulSeedLe
2a9f0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2aa00 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2aa10 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2aa20 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2aa30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2aa40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2aa50 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2aa60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2aa70 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2aa80 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2aa90 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2aaa0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2aab0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2aac0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2aad0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2aae0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2aaf0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2ab00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2ab10 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2ab20 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2ab30 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52  _RV, C_GenerateR
2ab40 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f  andom)(CK_SESSIO
2ab50 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2ab60 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2ab70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55  RandomData, CK_U
2ab80 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e  LONG ulRandomLen
2ab90 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2aba0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2abb0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2abc0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2abd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2abe0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2abf0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2ac00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ac10 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2ac20 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2ac30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ac40 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2ac50 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2ac60 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2ac70 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ac80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ac90 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2aca0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2acb0 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70  RTED);.}../* Dep
2acc0 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e  recated Function
2acd0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
2ace0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2acf0 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75  GetFunctionStatu
2ad00 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  s)(CK_SESSION_HA
2ad10 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
2ad20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ad30 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2ad40 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2ad50 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2ad60 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2ad70 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69  NOT_PARALLEL (%i
2ad80 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ad90 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a  _NOT_PARALLEL);.
2ada0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2adb0 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
2adc0 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20  EL);...hSession 
2add0 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53  = hSession; /* S
2ade0 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61  upress unused va
2adf0 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a  riable warning *
2ae00 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74  /.}../* Deprecat
2ae10 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43  ed Function */.C
2ae20 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2ae30 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65  N(CK_RV, C_Cance
2ae40 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45  lFunction)(CK_SE
2ae50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2ae60 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59  ssion) {..CACKEY
2ae70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2ae80 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b  alled.");...CACK
2ae90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2aea0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2aeb0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
2aec0 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f  LLEL (%i)", CKR_
2aed0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
2aee0 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e  ALLEL);...return
2aef0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2af00 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68  T_PARALLEL);...h
2af10 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69  Session = hSessi
2af20 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  on; /* Supress u
2af30 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
2af40 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
2af50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2af60 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63  CK_RV, C_GetFunc
2af70 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e  tionList)(CK_FUN
2af80 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50  CTION_LIST_PTR_P
2af90 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  TR ppFunctionLis
2afa0 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f  t) {..CK_FUNCTIO
2afb0 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63  N_LIST_PTR pFunc
2afc0 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b  tionList;...CACK
2afd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2afe0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2aff0 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74   (ppFunctionList
2b000 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2b010 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b020 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63  F("Error. ppFunc
2b030 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c  tionList is NULL
2b040 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2b050 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2b060 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f  );..}...pFunctio
2b070 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73  nList = malloc(s
2b080 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e  izeof(*pFunction
2b090 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74  List));...pFunct
2b0a0 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e  ionList->version
2b0b0 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45  .major = ((CACKE
2b0c0 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
2b0d0 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20  ON_CODE) >> 16) 
2b0e0 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 63 74 69  & 0xff;..pFuncti
2b0f0 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e  onList->version.
2b100 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  minor = ((CACKEY
2b110 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
2b120 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20  N_CODE) >> 8) & 
2b130 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f  0xff;...pFunctio
2b140 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c  nList->C_Initial
2b150 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69  ize = C_Initiali
2b160 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ze;..pFunctionLi
2b170 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d  st->C_Finalize =
2b180 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46   C_Finalize;..pF
2b190 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2b1a0 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e  etInfo = C_GetIn
2b1b0 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
2b1c0 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73  st->C_GetSlotLis
2b1d0 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73  t = C_GetSlotLis
2b1e0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2b1f0 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f  t->C_GetSlotInfo
2b200 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f   = C_GetSlotInfo
2b210 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2b220 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f  ->C_GetTokenInfo
2b230 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66   = C_GetTokenInf
2b240 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
2b250 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74  t->C_WaitForSlot
2b260 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f  Event = C_WaitFo
2b270 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75  rSlotEvent;..pFu
2b280 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2b290 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d  tMechanismList =
2b2a0 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c   C_GetMechanismL
2b2b0 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ist;..pFunctionL
2b2c0 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e  ist->C_GetMechan
2b2d0 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d  ismInfo = C_GetM
2b2e0 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70  echanismInfo;..p
2b2f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2b300 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e  InitToken = C_In
2b310 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74  itToken;..pFunct
2b320 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50  ionList->C_InitP
2b330 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a  IN = C_InitPIN;.
2b340 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2b350 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53 65 74  C_SetPIN = C_Set
2b360 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  PIN;..pFunctionL
2b370 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69  ist->C_OpenSessi
2b380 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69  on = C_OpenSessi
2b390 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
2b3a0 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69  st->C_CloseSessi
2b3b0 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73  on = C_CloseSess
2b3c0 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ion;..pFunctionL
2b3d0 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53  ist->C_CloseAllS
2b3e0 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73  essions = C_Clos
2b3f0 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70  eAllSessions;..p
2b400 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2b410 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d  GetSessionInfo =
2b420 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66   C_GetSessionInf
2b430 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
2b440 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74 69 6f  t->C_GetOperatio
2b450 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 74 4f 70  nState = C_GetOp
2b460 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70  erationState;..p
2b470 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2b480 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  SetOperationStat
2b490 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 61 74 69  e = C_SetOperati
2b4a0 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74  onState;..pFunct
2b4b0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e  ionList->C_Login
2b4c0 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75   = C_Login;..pFu
2b4d0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f  nctionList->C_Lo
2b4e0 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b  gout = C_Logout;
2b4f0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2b500 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 20  >C_CreateObject 
2b510 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74  = C_CreateObject
2b520 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2b530 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d  ->C_CopyObject =
2b540 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09   C_CopyObject;..
2b550 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2b560 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d  _DestroyObject =
2b570 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74   C_DestroyObject
2b580 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2b590 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a  ->C_GetObjectSiz
2b5a0 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74 53  e = C_GetObjectS
2b5b0 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ize;..pFunctionL
2b5c0 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 72 69 62  ist->C_GetAttrib
2b5d0 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 47 65 74  uteValue = C_Get
2b5e0 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a  AttributeValue;.
2b5f0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2b600 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
2b610 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 74 72 69  lue = C_SetAttri
2b620 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e  buteValue;..pFun
2b630 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
2b640 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d 20 43  dObjectsInit = C
2b650 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
2b660 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2b670 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20  ->C_FindObjects 
2b680 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b  = C_FindObjects;
2b690 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2b6a0 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69  >C_FindObjectsFi
2b6b0 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  nal = C_FindObje
2b6c0 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  ctsFinal;..pFunc
2b6d0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72  tionList->C_Encr
2b6e0 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72  yptInit = C_Encr
2b6f0 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  yptInit;..pFunct
2b700 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
2b710 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a  pt = C_Encrypt;.
2b720 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2b730 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 20  C_EncryptUpdate 
2b740 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  = C_EncryptUpdat
2b750 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2b760 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e 61  t->C_EncryptFina
2b770 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 46 69 6e  l = C_EncryptFin
2b780 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
2b790 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 49 6e 69  st->C_DecryptIni
2b7a0 74 20 3d 20 43 5f 44 65 63 72 79 70 74 49 6e 69  t = C_DecryptIni
2b7b0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2b7c0 74 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d 20 43  t->C_Decrypt = C
2b7d0 5f 44 65 63 72 79 70 74 3b 0a 09 70 46 75 6e 63  _Decrypt;..pFunc
2b7e0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
2b7f0 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65  yptUpdate = C_De
2b800 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46  cryptUpdate;..pF
2b810 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
2b820 65 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f  ecryptFinal = C_
2b830 44 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70  DecryptFinal;..p
2b840 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2b850 44 69 67 65 73 74 49 6e 69 74 20 3d 20 43 5f 44  DigestInit = C_D
2b860 69 67 65 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e  igestInit;..pFun
2b870 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
2b880 65 73 74 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a  est = C_Digest;.
2b890 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2b8a0 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 20 3d  C_DigestUpdate =
2b8b0 20 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 3b   C_DigestUpdate;
2b8c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2b8d0 3e 43 5f 44 69 67 65 73 74 4b 65 79 20 3d 20 43  >C_DigestKey = C
2b8e0 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09 70 46 75  _DigestKey;..pFu
2b8f0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
2b900 67 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69  gestFinal = C_Di
2b910 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  gestFinal;..pFun
2b920 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
2b930 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e  nInit = C_SignIn
2b940 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
2b950 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53  st->C_Sign = C_S
2b960 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ign;..pFunctionL
2b970 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74  ist->C_SignUpdat
2b980 65 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65  e = C_SignUpdate
2b990 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2b9a0 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20  ->C_SignFinal = 
2b9b0 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46  C_SignFinal;..pF
2b9c0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
2b9d0 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 20 3d  ignRecoverInit =
2b9e0 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e   C_SignRecoverIn
2b9f0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
2ba00 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65  st->C_SignRecove
2ba10 72 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  r = C_SignRecove
2ba20 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r;..pFunctionLis
2ba30 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69 74 20  t->C_VerifyInit 
2ba40 3d 20 43 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a  = C_VerifyInit;.
2ba50 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2ba60 43 5f 56 65 72 69 66 79 20 3d 20 43 5f 56 65 72  C_Verify = C_Ver
2ba70 69 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ify;..pFunctionL
2ba80 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 55 70 64  ist->C_VerifyUpd
2ba90 61 74 65 20 3d 20 43 5f 56 65 72 69 66 79 55 70  ate = C_VerifyUp
2baa0 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
2bab0 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 46 69  List->C_VerifyFi
2bac0 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66 79 46 69  nal = C_VerifyFi
2bad0 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
2bae0 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63  ist->C_VerifyRec
2baf0 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 56 65 72  overInit = C_Ver
2bb00 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a  ifyRecoverInit;.
2bb10 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2bb20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 20  C_VerifyRecover 
2bb30 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  = C_VerifyRecove
2bb40 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r;..pFunctionLis
2bb50 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63 72 79  t->C_DigestEncry
2bb60 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67  ptUpdate = C_Dig
2bb70 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65  estEncryptUpdate
2bb80 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2bb90 2d 3e 43 5f 44 65 63 72 79 70 74 44 69 67 65 73  ->C_DecryptDiges
2bba0 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72  tUpdate = C_Decr
2bbb0 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65 3b  yptDigestUpdate;
2bbc0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2bbd0 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70  >C_SignEncryptUp
2bbe0 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63  date = C_SignEnc
2bbf0 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
2bc00 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
2bc10 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74  cryptVerifyUpdat
2bc20 65 20 3d 20 43 5f 44 65 63 72 79 70 74 56 65 72  e = C_DecryptVer
2bc30 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  ifyUpdate;..pFun
2bc40 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e  ctionList->C_Gen
2bc50 65 72 61 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e  erateKey = C_Gen
2bc60 65 72 61 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63  erateKey;..pFunc
2bc70 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65  tionList->C_Gene
2bc80 72 61 74 65 4b 65 79 50 61 69 72 20 3d 20 43 5f  rateKeyPair = C_
2bc90 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 3b  GenerateKeyPair;
2bca0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2bcb0 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20 43 5f 57  >C_WrapKey = C_W
2bcc0 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  rapKey;..pFuncti
2bcd0 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70  onList->C_Unwrap
2bce0 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65  Key = C_UnwrapKe
2bcf0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
2bd00 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79 20 3d  t->C_DeriveKey =
2bd10 20 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a 09 70   C_DeriveKey;..p
2bd20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2bd30 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53  SeedRandom = C_S
2bd40 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e  eedRandom;..pFun
2bd50 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e  ctionList->C_Gen
2bd60 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f  erateRandom = C_
2bd70 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a  GenerateRandom;.
2bd80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2bd90 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
2bda0 74 75 73 20 3d 20 43 5f 47 65 74 46 75 6e 63 74  tus = C_GetFunct
2bdb0 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46 75 6e  ionStatus;..pFun
2bdc0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e  ctionList->C_Can
2bdd0 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f  celFunction = C_
2bde0 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a  CancelFunction;.
2bdf0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2be00 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73  C_GetFunctionLis
2be10 74 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  t = C_GetFunctio
2be20 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63  nList;...*ppFunc
2be30 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63  tionList = pFunc
2be40 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b  tionList;...CACK
2be50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2be60 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2be70 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
2be80 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
2be90 4b 29 3b 0a 7d 0a 0a                             K);.}..