Hex Artifact Content

Artifact 145025308eac7244f67b500bba693ee546cf82d9:


0000: 23 69 66 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c  #ifdef __cpluspl
0010: 75 73 0a 65 78 74 65 72 6e 20 22 43 22 20 7b 0a  us.extern "C" {.
0020: 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65  #endif..#include
0030: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63   <unistd.h>.#inc
0040: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0050: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0060: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0070: 64 69 6f 2e 68 3e 0a 0a 23 69 6e 63 6c 75 64 65  dio.h>..#include
0080: 20 22 6d 79 70 6b 63 73 31 31 2e 68 22 0a 23 69   "mypkcs11.h".#i
0090: 6e 63 6c 75 64 65 20 22 63 61 63 6b 65 79 2d 63  nclude "cackey-c
00a0: 68 72 6f 6d 65 2e 68 22 0a 0a 73 74 72 75 63 74  hrome.h"..struct
00b0: 20 63 61 63 6b 65 79 5f 63 68 72 6f 6d 65 5f 69   cackey_chrome_i
00c0: 64 20 7b 0a 09 76 6f 69 64 20 2a 69 64 3b 0a 09  d {..void *id;..
00d0: 73 69 7a 65 5f 74 20 69 64 4c 65 6e 3b 0a 09 69  size_t idLen;..i
00e0: 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 3b 0a  nt initialized;.
00f0: 7d 3b 0a 0a 73 74 61 74 69 63 20 43 4b 5f 46 55  };..static CK_FU
0100: 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20  NCTION_LIST_PTR 
0110: 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69  moduleFunctionLi
0120: 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74  st = NULL;..stat
0130: 69 63 20 43 4b 5f 52 56 20 63 61 63 6b 65 79 5f  ic CK_RV cackey_
0140: 63 68 72 6f 6d 65 5f 69 6e 69 74 28 76 6f 69 64  chrome_init(void
0150: 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41  ) {..CK_C_INITIA
0160: 4c 49 5a 45 5f 41 52 47 53 20 69 6e 69 74 61 72  LIZE_ARGS initar
0170: 67 73 3b 0a 09 43 4b 5f 52 56 20 63 68 6b 5f 72  gs;..CK_RV chk_r
0180: 76 3b 0a 0a 09 69 66 20 28 6d 6f 64 75 6c 65 46  v;...if (moduleF
0190: 75 6e 63 74 69 6f 6e 4c 69 73 74 20 21 3d 20 4e  unctionList != N
01a0: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
01b0: 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 68  CKR_OK);..}...ch
01c0: 6b 5f 72 76 20 3d 20 43 5f 47 65 74 46 75 6e 63  k_rv = C_GetFunc
01d0: 74 69 6f 6e 4c 69 73 74 28 26 6d 6f 64 75 6c 65  tionList(&module
01e0: 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 3b 0a 09  FunctionList);..
01f0: 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b  if (chk_rv != CK
0200: 52 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e  R_OK) {...return
0210: 28 63 68 6b 5f 72 76 29 3b 0a 09 7d 0a 0a 09 69  (chk_rv);..}...i
0220: 6e 69 74 61 72 67 73 2e 43 72 65 61 74 65 4d 75  nitargs.CreateMu
0230: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 69  tex = NULL;..ini
0240: 74 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74  targs.DestroyMut
0250: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 69 74  ex = NULL;..init
0260: 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d  args.LockMutex =
0270: 20 4e 55 4c 4c 3b 0a 09 69 6e 69 74 61 72 67 73   NULL;..initargs
0280: 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e  .UnlockMutex = N
0290: 55 4c 4c 3b 0a 09 69 6e 69 74 61 72 67 73 2e 66  ULL;..initargs.f
02a0: 6c 61 67 73 20 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  lags = CKF_OS_LO
02b0: 43 4b 49 4e 47 5f 4f 4b 3b 0a 09 69 6e 69 74 61  CKING_OK;..inita
02c0: 72 67 73 2e 70 52 65 73 65 72 76 65 64 20 3d 20  rgs.pReserved = 
02d0: 4e 55 4c 4c 3b 0a 0a 09 63 68 6b 5f 72 76 20 3d  NULL;...chk_rv =
02e0: 20 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c   moduleFunctionL
02f0: 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a  ist->C_Initializ
0300: 65 28 26 69 6e 69 74 61 72 67 73 29 3b 0a 09 69  e(&initargs);..i
0310: 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52  f (chk_rv != CKR
0320: 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  _OK) {...return(
0330: 63 68 6b 5f 72 76 29 3b 0a 09 7d 0a 0a 09 72 65  chk_rv);..}...re
0340: 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
0350: 0a 76 6f 69 64 20 63 61 63 6b 65 79 5f 63 68 72  .void cackey_chr
0360: 6f 6d 65 5f 74 65 72 6d 69 6e 61 74 65 28 76 6f  ome_terminate(vo
0370: 69 64 29 20 7b 0a 09 69 66 20 28 21 6d 6f 64 75  id) {..if (!modu
0380: 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20  leFunctionList) 
0390: 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  {...return;..}..
03a0: 09 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c  .moduleFunctionL
03b0: 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 28  ist->C_Finalize(
03c0: 4e 55 4c 4c 29 3b 0a 0a 09 66 72 65 65 28 6d 6f  NULL);...free(mo
03d0: 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74  duleFunctionList
03e0: 29 3b 0a 0a 09 6d 6f 64 75 6c 65 46 75 6e 63 74  );...moduleFunct
03f0: 69 6f 6e 4c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a  ionList = NULL;.
0400: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61  ..return;.}..sta
0410: 74 69 63 20 43 4b 5f 52 56 20 63 61 63 6b 65 79  tic CK_RV cackey
0420: 5f 63 68 72 6f 6d 65 5f 47 65 74 41 74 74 72 69  _chrome_GetAttri
0430: 62 75 74 65 73 46 72 6f 6d 54 65 6d 70 6c 61 74  butesFromTemplat
0440: 65 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  e(CK_SESSION_HAN
0450: 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
0460: 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
0470: 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49  Object, CK_ATTRI
0480: 42 55 54 45 20 2a 61 74 74 72 54 65 6d 70 6c 61  BUTE *attrTempla
0490: 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 61 74 74  te, CK_ULONG att
04a0: 72 54 65 6d 70 6c 61 74 65 43 6f 75 6e 74 29 20  rTemplateCount) 
04b0: 7b 0a 09 43 4b 5f 52 56 20 63 68 6b 5f 72 76 3b  {..CK_RV chk_rv;
04c0: 0a 20 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  . .CK_ATTRIBUTE 
04d0: 2a 63 75 72 72 41 74 74 72 3b 0a 09 43 4b 5f 55  *currAttr;..CK_U
04e0: 4c 4f 4e 47 20 63 75 72 72 41 74 74 72 49 6e 64  LONG currAttrInd
04f0: 65 78 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72 41  ex;...for (currA
0500: 74 74 72 49 6e 64 65 78 20 3d 20 30 3b 20 63 75  ttrIndex = 0; cu
0510: 72 72 41 74 74 72 49 6e 64 65 78 20 3c 20 61 74  rrAttrIndex < at
0520: 74 72 54 65 6d 70 6c 61 74 65 43 6f 75 6e 74 3b  trTemplateCount;
0530: 20 63 75 72 72 41 74 74 72 49 6e 64 65 78 2b 2b   currAttrIndex++
0540: 29 20 7b 0a 09 09 63 75 72 72 41 74 74 72 20 3d  ) {...currAttr =
0550: 20 26 61 74 74 72 54 65 6d 70 6c 61 74 65 5b 63   &attrTemplate[c
0560: 75 72 72 41 74 74 72 49 6e 64 65 78 5d 3b 0a 0a  urrAttrIndex];..
0570: 09 09 63 75 72 72 41 74 74 72 2d 3e 70 56 61 6c  ..currAttr->pVal
0580: 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 75 72  ue = NULL;...cur
0590: 72 41 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  rAttr->ulValueLe
05a0: 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 68 6b 5f  n = 0;..}...chk_
05b0: 72 76 20 3d 20 6d 6f 64 75 6c 65 46 75 6e 63 74  rv = moduleFunct
05c0: 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74  ionList->C_GetAt
05d0: 74 72 69 62 75 74 65 56 61 6c 75 65 28 68 53 65  tributeValue(hSe
05e0: 73 73 69 6f 6e 2c 20 68 4f 62 6a 65 63 74 2c 20  ssion, hObject, 
05f0: 61 74 74 72 54 65 6d 70 6c 61 74 65 2c 20 61 74  attrTemplate, at
0600: 74 72 54 65 6d 70 6c 61 74 65 43 6f 75 6e 74 29  trTemplateCount)
0610: 3b 0a 09 69 66 20 28 63 68 6b 5f 72 76 20 3d 3d  ;..if (chk_rv ==
0620: 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54   CKR_ATTRIBUTE_T
0630: 59 50 45 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 63  YPE_INVALID || c
0640: 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f 41 54 54  hk_rv == CKR_ATT
0650: 52 49 42 55 54 45 5f 53 45 4e 53 49 54 49 56 45  RIBUTE_SENSITIVE
0660: 20 7c 7c 20 63 68 6b 5f 72 76 20 3d 3d 20 43 4b   || chk_rv == CK
0670: 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
0680: 4c 4c 29 20 7b 0a 09 09 63 68 6b 5f 72 76 20 3d  LL) {...chk_rv =
0690: 20 43 4b 52 5f 4f 4b 3b 0a 09 7d 0a 0a 09 69 66   CKR_OK;..}...if
06a0: 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f   (chk_rv != CKR_
06b0: 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 63  OK) {...return(c
06c0: 68 6b 5f 72 76 29 3b 0a 09 7d 0a 0a 09 66 6f 72  hk_rv);..}...for
06d0: 20 28 63 75 72 72 41 74 74 72 49 6e 64 65 78 20   (currAttrIndex 
06e0: 3d 20 30 3b 20 63 75 72 72 41 74 74 72 49 6e 64  = 0; currAttrInd
06f0: 65 78 20 3c 20 61 74 74 72 54 65 6d 70 6c 61 74  ex < attrTemplat
0700: 65 43 6f 75 6e 74 3b 20 63 75 72 72 41 74 74 72  eCount; currAttr
0710: 49 6e 64 65 78 2b 2b 29 20 7b 0a 09 09 63 75 72  Index++) {...cur
0720: 72 41 74 74 72 20 3d 20 26 61 74 74 72 54 65 6d  rAttr = &attrTem
0730: 70 6c 61 74 65 5b 63 75 72 72 41 74 74 72 49 6e  plate[currAttrIn
0740: 64 65 78 5d 3b 0a 0a 09 09 69 66 20 28 63 75 72  dex];....if (cur
0750: 72 41 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  rAttr->ulValueLe
0760: 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 63 6f 6e  n == 0) {....con
0770: 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66  tinue;...}....if
0780: 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 63 75 72   (((CK_LONG) cur
0790: 72 41 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  rAttr->ulValueLe
07a0: 6e 29 20 3d 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29  n) == ((CK_LONG)
07b0: 20 2d 31 29 29 20 7b 0a 09 09 09 63 6f 6e 74 69   -1)) {....conti
07c0: 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 63 75 72 72  nue;...}....curr
07d0: 41 74 74 72 2d 3e 70 56 61 6c 75 65 20 3d 20 6d  Attr->pValue = m
07e0: 61 6c 6c 6f 63 28 63 75 72 72 41 74 74 72 2d 3e  alloc(currAttr->
07f0: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 7d 0a  ulValueLen);..}.
0800: 0a 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c  ..chk_rv = modul
0810: 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  eFunctionList->C
0820: 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
0830: 75 65 28 68 53 65 73 73 69 6f 6e 2c 20 68 4f 62  ue(hSession, hOb
0840: 6a 65 63 74 2c 20 61 74 74 72 54 65 6d 70 6c 61  ject, attrTempla
0850: 74 65 2c 20 61 74 74 72 54 65 6d 70 6c 61 74 65  te, attrTemplate
0860: 43 6f 75 6e 74 29 3b 0a 09 69 66 20 28 63 68 6b  Count);..if (chk
0870: 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  _rv != CKR_OK) {
0880: 0a 09 09 66 72 65 65 28 63 75 72 72 41 74 74 72  ...free(currAttr
0890: 2d 3e 70 56 61 6c 75 65 29 3b 0a 0a 09 09 72 65  ->pValue);....re
08a0: 74 75 72 6e 28 63 68 6b 5f 72 76 29 3b 0a 09 7d  turn(chk_rv);..}
08b0: 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
08c0: 29 3b 0a 7d 0a 0a 69 6e 74 20 63 61 63 6b 65 79  );.}..int cackey
08d0: 5f 63 68 72 6f 6d 65 5f 6c 69 73 74 43 65 72 74  _chrome_listCert
08e0: 69 66 69 63 61 74 65 73 28 73 74 72 75 63 74 20  ificates(struct 
08f0: 63 61 63 6b 65 79 5f 63 65 72 74 69 66 69 63 61  cackey_certifica
0900: 74 65 20 2a 2a 63 65 72 74 69 66 69 63 61 74 65  te **certificate
0910: 73 29 20 7b 0a 09 43 4b 5f 52 56 20 63 68 6b 5f  s) {..CK_RV chk_
0920: 72 76 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75  rv;..CK_ULONG nu
0930: 6d 53 6c 6f 74 73 2c 20 63 75 72 72 53 6c 6f 74  mSlots, currSlot
0940: 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54  ;..CK_SLOT_ID_PT
0950: 52 20 73 6c 6f 74 73 3b 0a 09 43 4b 5f 53 4c 4f  R slots;..CK_SLO
0960: 54 5f 49 4e 46 4f 20 73 6c 6f 74 49 6e 66 6f 3b  T_INFO slotInfo;
0970: 0a 09 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  ..CK_SESSION_HAN
0980: 44 4c 45 20 68 53 65 73 73 69 6f 6e 3b 0a 09 43  DLE hSession;..C
0990: 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
09a0: 68 4f 62 6a 65 63 74 3b 0a 09 43 4b 5f 55 4c 4f  hObject;..CK_ULO
09b0: 4e 47 20 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  NG ulObjectCount
09c0: 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  ;..CK_ATTRIBUTE 
09d0: 73 65 61 72 63 68 54 65 6d 70 6c 61 74 65 50 72  searchTemplatePr
09e0: 69 76 61 74 65 4b 65 79 73 5b 5d 20 3d 20 7b 0a  ivateKeys[] = {.
09f0: 09 09 7b 43 4b 41 5f 43 4c 41 53 53 2c 20 4e 55  ..{CKA_CLASS, NU
0a00: 4c 4c 2c 20 73 69 7a 65 6f 66 28 43 4b 5f 4f 42  LL, sizeof(CK_OB
0a10: 4a 45 43 54 5f 43 4c 41 53 53 29 7d 0a 09 7d 3b  JECT_CLASS)}..};
0a20: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 73  ..CK_ATTRIBUTE s
0a30: 65 61 72 63 68 54 65 6d 70 6c 61 74 65 43 65 72  earchTemplateCer
0a40: 74 69 66 69 63 61 74 65 73 5b 5d 20 3d 20 7b 0a  tificates[] = {.
0a50: 09 09 7b 43 4b 41 5f 43 4c 41 53 53 2c 20 4e 55  ..{CKA_CLASS, NU
0a60: 4c 4c 2c 20 73 69 7a 65 6f 66 28 43 4b 5f 4f 42  LL, sizeof(CK_OB
0a70: 4a 45 43 54 5f 43 4c 41 53 53 29 7d 2c 0a 09 09  JECT_CLASS)},...
0a80: 7b 43 4b 41 5f 49 44 2c 20 4e 55 4c 4c 2c 20 30  {CKA_ID, NULL, 0
0a90: 7d 0a 09 7d 3b 0a 09 43 4b 5f 41 54 54 52 49 42  }..};..CK_ATTRIB
0aa0: 55 54 45 20 61 74 74 72 54 65 6d 70 6c 61 74 65  UTE attrTemplate
0ab0: 50 72 69 76 61 74 65 4b 65 79 5b 5d 20 3d 20 7b  PrivateKey[] = {
0ac0: 0a 09 09 7b 43 4b 41 5f 49 44 2c 20 4e 55 4c 4c  ...{CKA_ID, NULL
0ad0: 2c 20 30 7d 0a 09 7d 3b 0a 09 43 4b 5f 41 54 54  , 0}..};..CK_ATT
0ae0: 52 49 42 55 54 45 20 61 74 74 72 54 65 6d 70 6c  RIBUTE attrTempl
0af0: 61 74 65 43 65 72 74 69 66 69 63 61 74 65 5b 5d  ateCertificate[]
0b00: 20 3d 20 7b 0a 09 09 7b 43 4b 41 5f 56 41 4c 55   = {...{CKA_VALU
0b10: 45 2c 20 4e 55 4c 4c 2c 20 30 7d 0a 09 7d 3b 0a  E, NULL, 0}..};.
0b20: 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53  .CK_OBJECT_CLASS
0b30: 20 6f 62 6a 65 63 74 43 6c 61 73 73 50 72 69 76   objectClassPriv
0b40: 61 74 65 4b 65 79 20 3d 20 43 4b 4f 5f 50 52 49  ateKey = CKO_PRI
0b50: 56 41 54 45 5f 4b 45 59 3b 0a 09 43 4b 5f 4f 42  VATE_KEY;..CK_OB
0b60: 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63  JECT_CLASS objec
0b70: 74 43 6c 61 73 73 43 65 72 74 69 66 69 63 61 74  tClassCertificat
0b80: 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  e = CKO_CERTIFIC
0b90: 41 54 45 3b 0a 09 73 74 72 75 63 74 20 63 61 63  ATE;..struct cac
0ba0: 6b 65 79 5f 63 68 72 6f 6d 65 5f 69 64 20 2a 69  key_chrome_id *i
0bb0: 64 73 3b 0a 09 69 6e 74 20 69 64 73 43 6f 75 6e  ds;..int idsCoun
0bc0: 74 2c 20 63 75 72 72 49 64 3b 0a 09 69 6e 74 20  t, currId;..int 
0bd0: 66 6f 75 6e 64 43 65 72 74 69 66 69 63 61 74 65  foundCertificate
0be0: 73 2c 20 63 65 72 74 69 66 69 63 61 74 65 73 43  s, certificatesC
0bf0: 6f 75 6e 74 3b 0a 0a 09 2a 63 65 72 74 69 66 69  ount;...*certifi
0c00: 63 61 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  cates = NULL;...
0c10: 63 68 6b 5f 72 76 20 3d 20 63 61 63 6b 65 79 5f  chk_rv = cackey_
0c20: 63 68 72 6f 6d 65 5f 69 6e 69 74 28 29 3b 0a 09  chrome_init();..
0c30: 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b  if (chk_rv != CK
0c40: 52 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e  R_OK) {...return
0c50: 28 30 29 3b 0a 09 7d 0a 0a 09 63 68 6b 5f 72 76  (0);..}...chk_rv
0c60: 20 3d 20 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f   = moduleFunctio
0c70: 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
0c80: 4c 69 73 74 28 46 41 4c 53 45 2c 20 4e 55 4c 4c  List(FALSE, NULL
0c90: 2c 20 26 6e 75 6d 53 6c 6f 74 73 29 3b 0a 09 69  , &numSlots);..i
0ca0: 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52  f (chk_rv != CKR
0cb0: 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  _OK) {...return(
0cc0: 30 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 73 20 3d  0);..}...slots =
0cd0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
0ce0: 73 6c 6f 74 73 29 20 2a 20 6e 75 6d 53 6c 6f 74  slots) * numSlot
0cf0: 73 29 3b 0a 0a 09 63 68 6b 5f 72 76 20 3d 20 6d  s);...chk_rv = m
0d00: 6f 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73  oduleFunctionLis
0d10: 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74  t->C_GetSlotList
0d20: 28 46 41 4c 53 45 2c 20 73 6c 6f 74 73 2c 20 26  (FALSE, slots, &
0d30: 6e 75 6d 53 6c 6f 74 73 29 3b 0a 09 69 66 20 28  numSlots);..if (
0d40: 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b  chk_rv != CKR_OK
0d50: 29 20 7b 0a 09 09 66 72 65 65 28 73 6c 6f 74 73  ) {...free(slots
0d60: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 30 29 3b  );....return(0);
0d70: 0a 09 7d 0a 0a 09 73 65 61 72 63 68 54 65 6d 70  ..}...searchTemp
0d80: 6c 61 74 65 50 72 69 76 61 74 65 4b 65 79 73 5b  latePrivateKeys[
0d90: 30 5d 2e 70 56 61 6c 75 65 20 3d 20 26 6f 62 6a  0].pValue = &obj
0da0: 65 63 74 43 6c 61 73 73 50 72 69 76 61 74 65 4b  ectClassPrivateK
0db0: 65 79 3b 0a 09 73 65 61 72 63 68 54 65 6d 70 6c  ey;..searchTempl
0dc0: 61 74 65 43 65 72 74 69 66 69 63 61 74 65 73 5b  ateCertificates[
0dd0: 30 5d 2e 70 56 61 6c 75 65 20 3d 20 26 6f 62 6a  0].pValue = &obj
0de0: 65 63 74 43 6c 61 73 73 43 65 72 74 69 66 69 63  ectClassCertific
0df0: 61 74 65 3b 0a 0a 09 66 6f 75 6e 64 43 65 72 74  ate;...foundCert
0e00: 69 66 69 63 61 74 65 73 20 3d 20 30 3b 0a 09 63  ificates = 0;..c
0e10: 65 72 74 69 66 69 63 61 74 65 73 43 6f 75 6e 74  ertificatesCount
0e20: 20 3d 20 31 30 3b 0a 09 2a 63 65 72 74 69 66 69   = 10;..*certifi
0e30: 63 61 74 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 73  cates = malloc(s
0e40: 69 7a 65 6f 66 28 2a 2a 63 65 72 74 69 66 69 63  izeof(**certific
0e50: 61 74 65 73 29 20 2a 20 63 65 72 74 69 66 69 63  ates) * certific
0e60: 61 74 65 73 43 6f 75 6e 74 29 3b 0a 0a 09 69 64  atesCount);...id
0e70: 73 43 6f 75 6e 74 20 3d 20 31 30 3b 0a 09 69 64  sCount = 10;..id
0e80: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
0e90: 66 28 2a 69 64 73 29 20 2a 20 69 64 73 43 6f 75  f(*ids) * idsCou
0ea0: 6e 74 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72  nt);...for (curr
0eb0: 49 64 20 3d 20 30 3b 20 63 75 72 72 49 64 20 3c  Id = 0; currId <
0ec0: 20 69 64 73 43 6f 75 6e 74 3b 20 63 75 72 72 49   idsCount; currI
0ed0: 64 2b 2b 29 20 7b 0a 09 09 69 64 73 5b 63 75 72  d++) {...ids[cur
0ee0: 72 49 64 5d 2e 69 6e 69 74 69 61 6c 69 7a 65 64  rId].initialized
0ef0: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28   = 0;..}...for (
0f00: 63 75 72 72 53 6c 6f 74 20 3d 20 30 3b 20 63 75  currSlot = 0; cu
0f10: 72 72 53 6c 6f 74 20 3c 20 6e 75 6d 53 6c 6f 74  rrSlot < numSlot
0f20: 73 3b 20 63 75 72 72 53 6c 6f 74 2b 2b 29 20 7b  s; currSlot++) {
0f30: 0a 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75  ...chk_rv = modu
0f40: 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  leFunctionList->
0f50: 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 28 73 6c  C_GetSlotInfo(sl
0f60: 6f 74 73 5b 63 75 72 72 53 6c 6f 74 5d 2c 20 26  ots[currSlot], &
0f70: 73 6c 6f 74 49 6e 66 6f 29 3b 0a 09 09 69 66 20  slotInfo);...if 
0f80: 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f  (chk_rv != CKR_O
0f90: 4b 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65  K) {....continue
0fa0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 73 6c  ;...}....if ((sl
0fb0: 6f 74 49 6e 66 6f 2e 66 6c 61 67 73 20 26 20 43  otInfo.flags & C
0fc0: 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54  KF_TOKEN_PRESENT
0fd0: 29 20 21 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50  ) != CKF_TOKEN_P
0fe0: 52 45 53 45 4e 54 29 20 7b 0a 09 09 09 63 6f 6e  RESENT) {....con
0ff0: 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 63 68  tinue;...}....ch
1000: 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c 65 46 75 6e  k_rv = moduleFun
1010: 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65  ctionList->C_Ope
1020: 6e 53 65 73 73 69 6f 6e 28 73 6c 6f 74 73 5b 63  nSession(slots[c
1030: 75 72 72 53 6c 6f 74 5d 2c 20 43 4b 46 5f 53 45  urrSlot], CKF_SE
1040: 52 49 41 4c 5f 53 45 53 53 49 4f 4e 2c 20 4e 55  RIAL_SESSION, NU
1050: 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 68 53 65 73 73  LL, NULL, &hSess
1060: 69 6f 6e 29 3b 0a 09 09 69 66 20 28 63 68 6b 5f  ion);...if (chk_
1070: 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  rv != CKR_OK) {.
1080: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
1090: 0a 0a 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64  ....chk_rv = mod
10a0: 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  uleFunctionList-
10b0: 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e  >C_FindObjectsIn
10c0: 69 74 28 68 53 65 73 73 69 6f 6e 2c 20 73 65 61  it(hSession, sea
10d0: 72 63 68 54 65 6d 70 6c 61 74 65 50 72 69 76 61  rchTemplatePriva
10e0: 74 65 4b 65 79 73 2c 20 73 69 7a 65 6f 66 28 73  teKeys, sizeof(s
10f0: 65 61 72 63 68 54 65 6d 70 6c 61 74 65 50 72 69  earchTemplatePri
1100: 76 61 74 65 4b 65 79 73 29 20 2f 20 73 69 7a 65  vateKeys) / size
1110: 6f 66 28 73 65 61 72 63 68 54 65 6d 70 6c 61 74  of(searchTemplat
1120: 65 50 72 69 76 61 74 65 4b 65 79 73 5b 30 5d 29  ePrivateKeys[0])
1130: 29 3b 20 0a 09 09 69 66 20 28 63 68 6b 5f 72 76  ); ...if (chk_rv
1140: 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
1150: 09 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c  .moduleFunctionL
1160: 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73  ist->C_CloseSess
1170: 69 6f 6e 28 68 53 65 73 73 69 6f 6e 29 3b 0a 0a  ion(hSession);..
1180: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
1190: 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 49 64 20  ....for (currId 
11a0: 3d 20 30 3b 20 63 75 72 72 49 64 20 3c 20 69 64  = 0; currId < id
11b0: 73 43 6f 75 6e 74 3b 20 63 75 72 72 49 64 2b 2b  sCount; currId++
11c0: 29 20 7b 0a 09 09 09 69 66 20 28 21 69 64 73 5b  ) {....if (!ids[
11d0: 63 75 72 72 49 64 5d 2e 69 6e 69 74 69 61 6c 69  currId].initiali
11e0: 7a 65 64 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69  zed) {.....conti
11f0: 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72  nue;....}.....fr
1200: 65 65 28 69 64 73 5b 63 75 72 72 49 64 5d 2e 69  ee(ids[currId].i
1210: 64 29 3b 0a 0a 09 09 09 69 64 73 5b 63 75 72 72  d);.....ids[curr
1220: 49 64 5d 2e 69 6e 69 74 69 61 6c 69 7a 65 64 20  Id].initialized 
1230: 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 63 75 72 72  = 0;...}....curr
1240: 49 64 20 3d 20 30 3b 0a 0a 09 09 77 68 69 6c 65  Id = 0;....while
1250: 20 28 31 29 20 7b 0a 09 09 09 63 68 6b 5f 72 76   (1) {....chk_rv
1260: 20 3d 20 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f   = moduleFunctio
1270: 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
1280: 65 63 74 73 28 68 53 65 73 73 69 6f 6e 2c 20 26  ects(hSession, &
1290: 68 4f 62 6a 65 63 74 2c 20 31 2c 20 26 75 6c 4f  hObject, 1, &ulO
12a0: 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 09 09 09  bjectCount);....
12b0: 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b  if (chk_rv != CK
12c0: 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 62 72 65 61  R_OK) {.....brea
12d0: 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  k;....}.....if (
12e0: 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d  ulObjectCount ==
12f0: 20 30 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b   0) {.....break;
1300: 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 75 6c  ....}.....if (ul
1310: 4f 62 6a 65 63 74 43 6f 75 6e 74 20 21 3d 20 31  ObjectCount != 1
1320: 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
1330: 09 09 7d 0a 0a 09 09 09 63 68 6b 5f 72 76 20 3d  ..}.....chk_rv =
1340: 20 63 61 63 6b 65 79 5f 63 68 72 6f 6d 65 5f 47   cackey_chrome_G
1350: 65 74 41 74 74 72 69 62 75 74 65 73 46 72 6f 6d  etAttributesFrom
1360: 54 65 6d 70 6c 61 74 65 28 68 53 65 73 73 69 6f  Template(hSessio
1370: 6e 2c 20 68 4f 62 6a 65 63 74 2c 20 61 74 74 72  n, hObject, attr
1380: 54 65 6d 70 6c 61 74 65 50 72 69 76 61 74 65 4b  TemplatePrivateK
1390: 65 79 2c 20 73 69 7a 65 6f 66 28 61 74 74 72 54  ey, sizeof(attrT
13a0: 65 6d 70 6c 61 74 65 50 72 69 76 61 74 65 4b 65  emplatePrivateKe
13b0: 79 29 20 2f 20 73 69 7a 65 6f 66 28 61 74 74 72  y) / sizeof(attr
13c0: 54 65 6d 70 6c 61 74 65 50 72 69 76 61 74 65 4b  TemplatePrivateK
13d0: 65 79 5b 30 5d 29 29 3b 0a 09 09 09 69 66 20 28  ey[0]));....if (
13e0: 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b  chk_rv != CKR_OK
13f0: 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  ) {.....continue
1400: 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63  ;....}.....if (c
1410: 75 72 72 49 64 20 3e 3d 20 69 64 73 43 6f 75 6e  urrId >= idsCoun
1420: 74 29 20 7b 0a 09 09 09 09 69 64 73 43 6f 75 6e  t) {.....idsCoun
1430: 74 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 69 64 73  t *= 2;......ids
1440: 20 3d 20 72 65 61 6c 6c 6f 63 28 69 64 73 2c 20   = realloc(ids, 
1450: 73 69 7a 65 6f 66 28 2a 69 64 73 29 20 2a 20 69  sizeof(*ids) * i
1460: 64 73 43 6f 75 6e 74 29 3b 0a 09 09 09 7d 0a 0a  dsCount);....}..
1470: 09 09 09 69 64 73 5b 63 75 72 72 49 64 5d 2e 69  ...ids[currId].i
1480: 64 4c 65 6e 20 3d 20 61 74 74 72 54 65 6d 70 6c  dLen = attrTempl
1490: 61 74 65 50 72 69 76 61 74 65 4b 65 79 5b 30 5d  atePrivateKey[0]
14a0: 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09  .ulValueLen;....
14b0: 69 64 73 5b 63 75 72 72 49 64 5d 2e 69 64 20 3d  ids[currId].id =
14c0: 20 61 74 74 72 54 65 6d 70 6c 61 74 65 50 72 69   attrTemplatePri
14d0: 76 61 74 65 4b 65 79 5b 30 5d 2e 70 56 61 6c 75  vateKey[0].pValu
14e0: 65 3b 0a 09 09 09 69 64 73 5b 63 75 72 72 49 64  e;....ids[currId
14f0: 5d 2e 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  ].initialized = 
1500: 31 3b 0a 09 09 09 63 75 72 72 49 64 2b 2b 3b 0a  1;....currId++;.
1510: 09 09 7d 0a 0a 09 09 6d 6f 64 75 6c 65 46 75 6e  ..}....moduleFun
1520: 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
1530: 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 28 68 53  dObjectsFinal(hS
1540: 65 73 73 69 6f 6e 29 3b 0a 0a 09 09 66 6f 72 20  ession);....for 
1550: 28 63 75 72 72 49 64 20 3d 20 30 3b 20 63 75 72  (currId = 0; cur
1560: 72 49 64 20 3c 20 69 64 73 43 6f 75 6e 74 3b 20  rId < idsCount; 
1570: 63 75 72 72 49 64 2b 2b 29 20 7b 0a 09 09 09 69  currId++) {....i
1580: 66 20 28 21 69 64 73 5b 63 75 72 72 49 64 5d 2e  f (!ids[currId].
1590: 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
15a0: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
15b0: 7d 0a 0a 09 09 09 73 65 61 72 63 68 54 65 6d 70  }.....searchTemp
15c0: 6c 61 74 65 43 65 72 74 69 66 69 63 61 74 65 73  lateCertificates
15d0: 5b 31 5d 2e 70 56 61 6c 75 65 20 3d 20 69 64 73  [1].pValue = ids
15e0: 5b 63 75 72 72 49 64 5d 2e 69 64 3b 0a 09 09 09  [currId].id;....
15f0: 73 65 61 72 63 68 54 65 6d 70 6c 61 74 65 43 65  searchTemplateCe
1600: 72 74 69 66 69 63 61 74 65 73 5b 31 5d 2e 75 6c  rtificates[1].ul
1610: 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64 73 5b 63  ValueLen = ids[c
1620: 75 72 72 49 64 5d 2e 69 64 4c 65 6e 3b 0a 0a 09  urrId].idLen;...
1630: 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c  ..chk_rv = modul
1640: 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  eFunctionList->C
1650: 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
1660: 28 68 53 65 73 73 69 6f 6e 2c 20 73 65 61 72 63  (hSession, searc
1670: 68 54 65 6d 70 6c 61 74 65 43 65 72 74 69 66 69  hTemplateCertifi
1680: 63 61 74 65 73 2c 20 73 69 7a 65 6f 66 28 73 65  cates, sizeof(se
1690: 61 72 63 68 54 65 6d 70 6c 61 74 65 43 65 72 74  archTemplateCert
16a0: 69 66 69 63 61 74 65 73 29 20 2f 20 73 69 7a 65  ificates) / size
16b0: 6f 66 28 73 65 61 72 63 68 54 65 6d 70 6c 61 74  of(searchTemplat
16c0: 65 43 65 72 74 69 66 69 63 61 74 65 73 5b 30 5d  eCertificates[0]
16d0: 29 29 3b 20 0a 09 09 09 69 66 20 28 63 68 6b 5f  )); ....if (chk_
16e0: 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  rv != CKR_OK) {.
16f0: 09 09 09 09 66 72 65 65 28 69 64 73 5b 63 75 72  ....free(ids[cur
1700: 72 49 64 5d 2e 69 64 29 3b 0a 0a 09 09 09 09 69  rId].id);......i
1710: 64 73 5b 63 75 72 72 49 64 5d 2e 69 6e 69 74 69  ds[currId].initi
1720: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 09 09  alized = 0;.....
1730: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
1740: 0a 09 09 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  ....while (1) {.
1750: 09 09 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64  ....chk_rv = mod
1760: 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  uleFunctionList-
1770: 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 28 68  >C_FindObjects(h
1780: 53 65 73 73 69 6f 6e 2c 20 26 68 4f 62 6a 65 63  Session, &hObjec
1790: 74 2c 20 31 2c 20 26 75 6c 4f 62 6a 65 63 74 43  t, 1, &ulObjectC
17a0: 6f 75 6e 74 29 3b 0a 09 09 09 09 69 66 20 28 63  ount);.....if (c
17b0: 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29  hk_rv != CKR_OK)
17c0: 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
17d0: 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 75 6c  ...}......if (ul
17e0: 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30  ObjectCount == 0
17f0: 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ) {......break;.
1800: 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 75  ....}......if (u
1810: 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 21 3d 20  lObjectCount != 
1820: 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b  1) {......break;
1830: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 68 6b 5f  .....}......chk_
1840: 72 76 20 3d 20 63 61 63 6b 65 79 5f 63 68 72 6f  rv = cackey_chro
1850: 6d 65 5f 47 65 74 41 74 74 72 69 62 75 74 65 73  me_GetAttributes
1860: 46 72 6f 6d 54 65 6d 70 6c 61 74 65 28 68 53 65  FromTemplate(hSe
1870: 73 73 69 6f 6e 2c 20 68 4f 62 6a 65 63 74 2c 20  ssion, hObject, 
1880: 61 74 74 72 54 65 6d 70 6c 61 74 65 43 65 72 74  attrTemplateCert
1890: 69 66 69 63 61 74 65 2c 20 73 69 7a 65 6f 66 28  ificate, sizeof(
18a0: 61 74 74 72 54 65 6d 70 6c 61 74 65 43 65 72 74  attrTemplateCert
18b0: 69 66 69 63 61 74 65 29 20 2f 20 73 69 7a 65 6f  ificate) / sizeo
18c0: 66 28 61 74 74 72 54 65 6d 70 6c 61 74 65 43 65  f(attrTemplateCe
18d0: 72 74 69 66 69 63 61 74 65 5b 30 5d 29 29 3b 0a  rtificate[0]));.
18e0: 09 09 09 09 69 66 20 28 63 68 6b 5f 72 76 20 21  ....if (chk_rv !
18f0: 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09  = CKR_OK) {.....
1900: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d  .continue;.....}
1910: 0a 0a 09 09 09 09 69 66 20 28 66 6f 75 6e 64 43  ......if (foundC
1920: 65 72 74 69 66 69 63 61 74 65 73 20 3e 3d 20 63  ertificates >= c
1930: 65 72 74 69 66 69 63 61 74 65 73 43 6f 75 6e 74  ertificatesCount
1940: 29 20 7b 0a 09 09 09 09 09 63 65 72 74 69 66 69  ) {......certifi
1950: 63 61 74 65 73 43 6f 75 6e 74 20 2a 3d 20 32 3b  catesCount *= 2;
1960: 0a 09 09 09 09 09 2a 63 65 72 74 69 66 69 63 61  ......*certifica
1970: 74 65 73 20 3d 20 72 65 61 6c 6c 6f 63 28 2a 63  tes = realloc(*c
1980: 65 72 74 69 66 69 63 61 74 65 73 2c 20 73 69 7a  ertificates, siz
1990: 65 6f 66 28 2a 2a 63 65 72 74 69 66 69 63 61 74  eof(**certificat
19a0: 65 73 29 20 2a 20 63 65 72 74 69 66 69 63 61 74  es) * certificat
19b0: 65 73 43 6f 75 6e 74 29 3b 0a 09 09 09 09 7d 0a  esCount);.....}.
19c0: 0a 09 09 09 09 28 2a 63 65 72 74 69 66 69 63 61  .....(*certifica
19d0: 74 65 73 29 5b 66 6f 75 6e 64 43 65 72 74 69 66  tes)[foundCertif
19e0: 69 63 61 74 65 73 5d 2e 63 65 72 74 69 66 69 63  icates].certific
19f0: 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 61 74 74  ate = malloc(att
1a00: 72 54 65 6d 70 6c 61 74 65 43 65 72 74 69 66 69  rTemplateCertifi
1a10: 63 61 74 65 5b 30 5d 2e 75 6c 56 61 6c 75 65 4c  cate[0].ulValueL
1a20: 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  en);.....memcpy(
1a30: 28 2a 63 65 72 74 69 66 69 63 61 74 65 73 29 5b  (*certificates)[
1a40: 66 6f 75 6e 64 43 65 72 74 69 66 69 63 61 74 65  foundCertificate
1a50: 73 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20  s].certificate, 
1a60: 61 74 74 72 54 65 6d 70 6c 61 74 65 43 65 72 74  attrTemplateCert
1a70: 69 66 69 63 61 74 65 5b 30 5d 2e 70 56 61 6c 75  ificate[0].pValu
1a80: 65 2c 20 61 74 74 72 54 65 6d 70 6c 61 74 65 43  e, attrTemplateC
1a90: 65 72 74 69 66 69 63 61 74 65 5b 30 5d 2e 75 6c  ertificate[0].ul
1aa0: 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 28  ValueLen);.....(
1ab0: 2a 63 65 72 74 69 66 69 63 61 74 65 73 29 5b 66  *certificates)[f
1ac0: 6f 75 6e 64 43 65 72 74 69 66 69 63 61 74 65 73  oundCertificates
1ad0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
1ae0: 6e 20 3d 20 61 74 74 72 54 65 6d 70 6c 61 74 65  n = attrTemplate
1af0: 43 65 72 74 69 66 69 63 61 74 65 5b 30 5d 2e 75  Certificate[0].u
1b00: 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09  lValueLen;......
1b10: 66 72 65 65 28 61 74 74 72 54 65 6d 70 6c 61 74  free(attrTemplat
1b20: 65 43 65 72 74 69 66 69 63 61 74 65 5b 30 5d 2e  eCertificate[0].
1b30: 70 56 61 6c 75 65 29 3b 0a 0a 09 09 09 09 66 6f  pValue);......fo
1b40: 75 6e 64 43 65 72 74 69 66 69 63 61 74 65 73 2b  undCertificates+
1b50: 2b 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 6f 64 75  +;....}.....modu
1b60: 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  leFunctionList->
1b70: 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  C_FindObjectsFin
1b80: 61 6c 28 68 53 65 73 73 69 6f 6e 29 3b 0a 0a 09  al(hSession);...
1b90: 09 09 66 72 65 65 28 69 64 73 5b 63 75 72 72 49  ..free(ids[currI
1ba0: 64 5d 2e 69 64 29 3b 0a 0a 09 09 09 69 64 73 5b  d].id);.....ids[
1bb0: 63 75 72 72 49 64 5d 2e 69 6e 69 74 69 61 6c 69  currId].initiali
1bc0: 7a 65 64 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09  zed = 0;...}....
1bd0: 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69  moduleFunctionLi
1be0: 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69  st->C_CloseSessi
1bf0: 6f 6e 28 68 53 65 73 73 69 6f 6e 29 3b 0a 09 7d  on(hSession);..}
1c00: 0a 0a 09 66 6f 72 20 28 63 75 72 72 49 64 20 3d  ...for (currId =
1c10: 20 30 3b 20 63 75 72 72 49 64 20 3c 20 69 64 73   0; currId < ids
1c20: 43 6f 75 6e 74 3b 20 63 75 72 72 49 64 2b 2b 29  Count; currId++)
1c30: 20 7b 0a 09 09 69 66 20 28 21 69 64 73 5b 63 75   {...if (!ids[cu
1c40: 72 72 49 64 5d 2e 69 6e 69 74 69 61 6c 69 7a 65  rrId].initialize
1c50: 64 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65  d) {....continue
1c60: 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 69 64  ;...}....free(id
1c70: 73 5b 63 75 72 72 49 64 5d 2e 69 64 29 3b 0a 0a  s[currId].id);..
1c80: 09 09 69 64 73 5b 63 75 72 72 49 64 5d 2e 69 6e  ..ids[currId].in
1c90: 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 09  itialized = 0;..
1ca0: 7d 0a 0a 09 66 72 65 65 28 69 64 73 29 3b 0a 0a  }...free(ids);..
1cb0: 09 66 72 65 65 28 73 6c 6f 74 73 29 3b 0a 0a 09  .free(slots);...
1cc0: 72 65 74 75 72 6e 28 66 6f 75 6e 64 43 65 72 74  return(foundCert
1cd0: 69 66 69 63 61 74 65 73 29 3b 0a 7d 0a 0a 76 6f  ificates);.}..vo
1ce0: 69 64 20 63 61 63 6b 65 79 5f 63 68 72 6f 6d 65  id cackey_chrome
1cf0: 5f 66 72 65 65 43 65 72 74 69 66 69 63 61 74 65  _freeCertificate
1d00: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
1d10: 63 65 72 74 69 66 69 63 61 74 65 20 2a 63 65 72  certificate *cer
1d20: 74 69 66 69 63 61 74 65 73 2c 20 69 6e 74 20 63  tificates, int c
1d30: 65 72 74 69 66 69 63 61 74 65 73 43 6f 75 6e 74  ertificatesCount
1d40: 29 20 7b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09  ) {..int idx;...
1d50: 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 73  if (certificates
1d60: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
1d70: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
1d80: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63  idx = 0; idx < c
1d90: 65 72 74 69 66 69 63 61 74 65 73 43 6f 75 6e 74  ertificatesCount
1da0: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
1db0: 28 63 65 72 74 69 66 69 63 61 74 65 73 5b 69 64  (certificates[id
1dc0: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 20  x].certificate) 
1dd0: 7b 0a 09 09 09 66 72 65 65 28 63 65 72 74 69 66  {....free(certif
1de0: 69 63 61 74 65 73 5b 69 64 78 5d 2e 63 65 72 74  icates[idx].cert
1df0: 69 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d  ificate);...}..}
1e00: 0a 0a 09 66 72 65 65 28 63 65 72 74 69 66 69 63  ...free(certific
1e10: 61 74 65 73 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  ates);...return;
1e20: 0a 7d 0a 0a 63 61 63 6b 65 79 5f 63 68 72 6f 6d  .}..cackey_chrom
1e30: 65 5f 72 65 74 75 72 6e 54 79 70 65 20 63 61 63  e_returnType cac
1e40: 6b 65 79 5f 63 68 72 6f 6d 65 5f 73 69 67 6e 4d  key_chrome_signM
1e50: 65 73 73 61 67 65 28 73 74 72 75 63 74 20 63 61  essage(struct ca
1e60: 63 6b 65 79 5f 63 65 72 74 69 66 69 63 61 74 65  ckey_certificate
1e70: 20 2a 63 65 72 74 69 66 69 63 61 74 65 2c 20 76   *certificate, v
1e80: 6f 69 64 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  oid *data, unsig
1e90: 6e 65 64 20 6c 6f 6e 67 20 64 61 74 61 4c 65 6e  ned long dataLen
1ea0: 67 74 68 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  gth, unsigned ch
1eb0: 61 72 20 2a 64 65 73 74 69 6e 61 74 69 6f 6e 2c  ar *destination,
1ec0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a   unsigned long *
1ed0: 64 65 73 74 69 6e 61 74 69 6f 6e 4c 65 6e 67 74  destinationLengt
1ee0: 68 2c 20 63 68 61 72 20 2a 2a 70 69 6e 50 72 6f  h, char **pinPro
1ef0: 6d 70 74 2c 20 63 68 61 72 20 2a 70 69 6e 29 20  mpt, char *pin) 
1f00: 7b 0a 09 43 4b 5f 52 56 20 63 68 6b 5f 72 76 3b  {..CK_RV chk_rv;
1f10: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 53 6c  ..CK_ULONG numSl
1f20: 6f 74 73 2c 20 63 75 72 72 53 6c 6f 74 3b 0a 09  ots, currSlot;..
1f30: 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 73  CK_SLOT_ID_PTR s
1f40: 6c 6f 74 73 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  lots;..CK_SLOT_I
1f50: 4e 46 4f 20 73 6c 6f 74 49 6e 66 6f 3b 0a 09 43  NFO slotInfo;..C
1f60: 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1f70: 20 68 53 65 73 73 69 6f 6e 3b 0a 09 43 4b 5f 4f   hSession;..CK_O
1f80: 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
1f90: 6a 65 63 74 2c 20 68 4b 65 79 3b 0a 09 43 4b 5f  ject, hKey;..CK_
1fa0: 55 4c 4f 4e 47 20 75 6c 4f 62 6a 65 63 74 43 6f  ULONG ulObjectCo
1fb0: 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  unt;..CK_ATTRIBU
1fc0: 54 45 20 73 65 61 72 63 68 54 65 6d 70 6c 61 74  TE searchTemplat
1fd0: 65 43 65 72 74 69 66 69 63 61 74 65 73 5b 5d 20  eCertificates[] 
1fe0: 3d 20 7b 0a 09 09 7b 43 4b 41 5f 43 4c 41 53 53  = {...{CKA_CLASS
1ff0: 2c 20 4e 55 4c 4c 2c 20 73 69 7a 65 6f 66 28 43  , NULL, sizeof(C
2000: 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 29 7d  K_OBJECT_CLASS)}
2010: 2c 0a 09 09 7b 43 4b 41 5f 56 41 4c 55 45 2c 20  ,...{CKA_VALUE, 
2020: 4e 55 4c 4c 2c 20 30 7d 0a 09 7d 3b 0a 09 43 4b  NULL, 0}..};..CK
2030: 5f 41 54 54 52 49 42 55 54 45 20 73 65 61 72 63  _ATTRIBUTE searc
2040: 68 54 65 6d 70 6c 61 74 65 50 72 69 76 61 74 65  hTemplatePrivate
2050: 4b 65 79 73 5b 5d 20 3d 20 7b 0a 09 09 7b 43 4b  Keys[] = {...{CK
2060: 41 5f 43 4c 41 53 53 2c 20 4e 55 4c 4c 2c 20 73  A_CLASS, NULL, s
2070: 69 7a 65 6f 66 28 43 4b 5f 4f 42 4a 45 43 54 5f  izeof(CK_OBJECT_
2080: 43 4c 41 53 53 29 7d 2c 0a 09 09 7b 43 4b 41 5f  CLASS)},...{CKA_
2090: 49 44 2c 20 4e 55 4c 4c 2c 20 30 7d 0a 09 7d 3b  ID, NULL, 0}..};
20a0: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 61  ..CK_ATTRIBUTE a
20b0: 74 74 72 54 65 6d 70 6c 61 74 65 43 65 72 74 69  ttrTemplateCerti
20c0: 66 69 63 61 74 65 5b 5d 20 3d 20 7b 0a 09 09 7b  ficate[] = {...{
20d0: 43 4b 41 5f 49 44 2c 20 4e 55 4c 4c 2c 20 30 7d  CKA_ID, NULL, 0}
20e0: 2c 0a 09 09 7b 43 4b 41 5f 4c 41 42 45 4c 2c 20  ,...{CKA_LABEL, 
20f0: 4e 55 4c 4c 2c 20 30 7d 0a 09 7d 3b 0a 09 43 4b  NULL, 0}..};..CK
2100: 5f 4d 45 43 48 41 4e 49 53 4d 20 73 69 67 6e 4d  _MECHANISM signM
2110: 65 63 68 61 6e 69 73 6d 20 3d 20 7b 43 4b 4d 5f  echanism = {CKM_
2120: 52 53 41 5f 50 4b 43 53 2c 20 4e 55 4c 4c 2c 20  RSA_PKCS, NULL, 
2130: 30 7d 3b 20 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f  0}; ..CK_OBJECT_
2140: 43 4c 41 53 53 20 6f 62 6a 65 63 74 43 6c 61 73  CLASS objectClas
2150: 73 50 72 69 76 61 74 65 4b 65 79 20 3d 20 43 4b  sPrivateKey = CK
2160: 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b 0a 09  O_PRIVATE_KEY;..
2170: 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20  CK_OBJECT_CLASS 
2180: 6f 62 6a 65 63 74 43 6c 61 73 73 43 65 72 74 69  objectClassCerti
2190: 66 69 63 61 74 65 20 3d 20 43 4b 4f 5f 43 45 52  ficate = CKO_CER
21a0: 54 49 46 49 43 41 54 45 3b 0a 09 43 4b 5f 54 4f  TIFICATE;..CK_TO
21b0: 4b 45 4e 5f 49 4e 46 4f 20 74 6f 6b 65 6e 49 6e  KEN_INFO tokenIn
21c0: 66 6f 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 74 6d  fo;..CK_ULONG tm
21d0: 70 44 65 73 74 69 6e 61 74 69 6f 6e 4c 65 6e 67  pDestinationLeng
21e0: 74 68 3b 0a 09 63 68 61 72 20 2a 63 65 72 74 69  th;..char *certi
21f0: 66 69 63 61 74 65 4c 61 62 65 6c 3b 0a 09 69 6e  ficateLabel;..in
2200: 74 20 66 6f 75 6e 64 50 72 69 76 61 74 65 4b 65  t foundPrivateKe
2210: 79 4f 62 6a 65 63 74 3b 0a 09 63 61 63 6b 65 79  yObject;..cackey
2220: 5f 63 68 72 6f 6d 65 5f 72 65 74 75 72 6e 54 79  _chrome_returnTy
2230: 70 65 20 72 65 74 76 61 6c 3b 0a 0a 09 2a 70 69  pe retval;...*pi
2240: 6e 50 72 6f 6d 70 74 20 3d 20 4e 55 4c 4c 3b 0a  nPrompt = NULL;.
2250: 0a 09 72 65 74 76 61 6c 20 3d 20 43 41 43 4b 45  ..retval = CACKE
2260: 59 5f 43 48 52 4f 4d 45 5f 45 52 52 4f 52 3b 0a  Y_CHROME_ERROR;.
2270: 0a 09 63 68 6b 5f 72 76 20 3d 20 63 61 63 6b 65  ..chk_rv = cacke
2280: 79 5f 63 68 72 6f 6d 65 5f 69 6e 69 74 28 29 3b  y_chrome_init();
2290: 0a 09 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20  ..if (chk_rv != 
22a0: 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75  CKR_OK) {...retu
22b0: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  rn(retval);..}..
22c0: 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c 65  .chk_rv = module
22d0: 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22e0: 47 65 74 53 6c 6f 74 4c 69 73 74 28 46 41 4c 53  GetSlotList(FALS
22f0: 45 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 53 6c 6f  E, NULL, &numSlo
2300: 74 73 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72 76  ts);..if (chk_rv
2310: 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
2320: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2330: 09 7d 0a 0a 09 73 6c 6f 74 73 20 3d 20 6d 61 6c  .}...slots = mal
2340: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 73 6c 6f 74  loc(sizeof(*slot
2350: 73 29 20 2a 20 6e 75 6d 53 6c 6f 74 73 29 3b 0a  s) * numSlots);.
2360: 0a 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c  ..chk_rv = modul
2370: 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  eFunctionList->C
2380: 5f 47 65 74 53 6c 6f 74 4c 69 73 74 28 46 41 4c  _GetSlotList(FAL
2390: 53 45 2c 20 73 6c 6f 74 73 2c 20 26 6e 75 6d 53  SE, slots, &numS
23a0: 6c 6f 74 73 29 3b 0a 09 69 66 20 28 63 68 6b 5f  lots);..if (chk_
23b0: 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  rv != CKR_OK) {.
23c0: 09 09 66 72 65 65 28 73 6c 6f 74 73 29 3b 0a 0a  ..free(slots);..
23d0: 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
23e0: 3b 0a 09 7d 0a 0a 09 73 65 61 72 63 68 54 65 6d  ;..}...searchTem
23f0: 70 6c 61 74 65 43 65 72 74 69 66 69 63 61 74 65  plateCertificate
2400: 73 5b 30 5d 2e 70 56 61 6c 75 65 20 3d 20 26 6f  s[0].pValue = &o
2410: 62 6a 65 63 74 43 6c 61 73 73 43 65 72 74 69 66  bjectClassCertif
2420: 69 63 61 74 65 3b 0a 09 73 65 61 72 63 68 54 65  icate;..searchTe
2430: 6d 70 6c 61 74 65 50 72 69 76 61 74 65 4b 65 79  mplatePrivateKey
2440: 73 5b 30 5d 2e 70 56 61 6c 75 65 20 3d 20 26 6f  s[0].pValue = &o
2450: 62 6a 65 63 74 43 6c 61 73 73 50 72 69 76 61 74  bjectClassPrivat
2460: 65 4b 65 79 3b 0a 0a 09 73 65 61 72 63 68 54 65  eKey;...searchTe
2470: 6d 70 6c 61 74 65 43 65 72 74 69 66 69 63 61 74  mplateCertificat
2480: 65 73 5b 31 5d 2e 70 56 61 6c 75 65 20 3d 20 63  es[1].pValue = c
2490: 65 72 74 69 66 69 63 61 74 65 2d 3e 63 65 72 74  ertificate->cert
24a0: 69 66 69 63 61 74 65 3b 0a 09 73 65 61 72 63 68  ificate;..search
24b0: 54 65 6d 70 6c 61 74 65 43 65 72 74 69 66 69 63  TemplateCertific
24c0: 61 74 65 73 5b 31 5d 2e 75 6c 56 61 6c 75 65 4c  ates[1].ulValueL
24d0: 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74 65  en = certificate
24e0: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
24f0: 6e 3b 0a 0a 09 66 6f 75 6e 64 50 72 69 76 61 74  n;...foundPrivat
2500: 65 4b 65 79 4f 62 6a 65 63 74 20 3d 20 30 3b 0a  eKeyObject = 0;.
2510: 0a 09 63 65 72 74 69 66 69 63 61 74 65 4c 61 62  ..certificateLab
2520: 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 66 6f 72  el = NULL;...for
2530: 20 28 63 75 72 72 53 6c 6f 74 20 3d 20 30 3b 20   (currSlot = 0; 
2540: 63 75 72 72 53 6c 6f 74 20 3c 20 6e 75 6d 53 6c  currSlot < numSl
2550: 6f 74 73 3b 20 63 75 72 72 53 6c 6f 74 2b 2b 29  ots; currSlot++)
2560: 20 7b 0a 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f   {...chk_rv = mo
2570: 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74  duleFunctionList
2580: 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 28  ->C_GetSlotInfo(
2590: 73 6c 6f 74 73 5b 63 75 72 72 53 6c 6f 74 5d 2c  slots[currSlot],
25a0: 20 26 73 6c 6f 74 49 6e 66 6f 29 3b 0a 09 09 69   &slotInfo);...i
25b0: 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52  f (chk_rv != CKR
25c0: 5f 4f 4b 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e  _OK) {....contin
25d0: 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  ue;...}....if ((
25e0: 73 6c 6f 74 49 6e 66 6f 2e 66 6c 61 67 73 20 26  slotInfo.flags &
25f0: 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45   CKF_TOKEN_PRESE
2600: 4e 54 29 20 21 3d 20 43 4b 46 5f 54 4f 4b 45 4e  NT) != CKF_TOKEN
2610: 5f 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 09 63  _PRESENT) {....c
2620: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
2630: 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c 65 46  chk_rv = moduleF
2640: 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f  unctionList->C_O
2650: 70 65 6e 53 65 73 73 69 6f 6e 28 73 6c 6f 74 73  penSession(slots
2660: 5b 63 75 72 72 53 6c 6f 74 5d 2c 20 43 4b 46 5f  [currSlot], CKF_
2670: 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 2c 20  SERIAL_SESSION, 
2680: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 68 53 65  NULL, NULL, &hSe
2690: 73 73 69 6f 6e 29 3b 0a 09 09 69 66 20 28 63 68  ssion);...if (ch
26a0: 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  k_rv != CKR_OK) 
26b0: 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  {....continue;..
26c0: 09 7d 0a 0a 09 09 63 68 6b 5f 72 76 20 3d 20 6d  .}....chk_rv = m
26d0: 6f 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73  oduleFunctionLis
26e0: 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
26f0: 49 6e 69 74 28 68 53 65 73 73 69 6f 6e 2c 20 73  Init(hSession, s
2700: 65 61 72 63 68 54 65 6d 70 6c 61 74 65 43 65 72  earchTemplateCer
2710: 74 69 66 69 63 61 74 65 73 2c 20 73 69 7a 65 6f  tificates, sizeo
2720: 66 28 73 65 61 72 63 68 54 65 6d 70 6c 61 74 65  f(searchTemplate
2730: 43 65 72 74 69 66 69 63 61 74 65 73 29 20 2f 20  Certificates) / 
2740: 73 69 7a 65 6f 66 28 73 65 61 72 63 68 54 65 6d  sizeof(searchTem
2750: 70 6c 61 74 65 43 65 72 74 69 66 69 63 61 74 65  plateCertificate
2760: 73 5b 30 5d 29 29 3b 20 0a 09 09 69 66 20 28 63  s[0])); ...if (c
2770: 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29  hk_rv != CKR_OK)
2780: 20 7b 0a 09 09 09 6d 6f 64 75 6c 65 46 75 6e 63   {....moduleFunc
2790: 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73  tionList->C_Clos
27a0: 65 53 65 73 73 69 6f 6e 28 68 53 65 73 73 69 6f  eSession(hSessio
27b0: 6e 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  n);.....continue
27c0: 3b 0a 09 09 7d 0a 0a 09 09 77 68 69 6c 65 20 28  ;...}....while (
27d0: 31 29 20 7b 0a 09 09 09 63 68 6b 5f 72 76 20 3d  1) {....chk_rv =
27e0: 20 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c   moduleFunctionL
27f0: 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
2800: 74 73 28 68 53 65 73 73 69 6f 6e 2c 20 26 68 4f  ts(hSession, &hO
2810: 62 6a 65 63 74 2c 20 31 2c 20 26 75 6c 4f 62 6a  bject, 1, &ulObj
2820: 65 63 74 43 6f 75 6e 74 29 3b 0a 09 09 09 69 66  ectCount);....if
2830: 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f   (chk_rv != CKR_
2840: 4f 4b 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  OK) {.....break;
2850: 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 75 6c  ....}.....if (ul
2860: 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30  ObjectCount == 0
2870: 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
2880: 09 09 7d 0a 0a 09 09 09 69 66 20 28 75 6c 4f 62  ..}.....if (ulOb
2890: 6a 65 63 74 43 6f 75 6e 74 20 21 3d 20 31 29 20  jectCount != 1) 
28a0: 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
28b0: 7d 0a 0a 09 09 09 63 68 6b 5f 72 76 20 3d 20 63  }.....chk_rv = c
28c0: 61 63 6b 65 79 5f 63 68 72 6f 6d 65 5f 47 65 74  ackey_chrome_Get
28d0: 41 74 74 72 69 62 75 74 65 73 46 72 6f 6d 54 65  AttributesFromTe
28e0: 6d 70 6c 61 74 65 28 68 53 65 73 73 69 6f 6e 2c  mplate(hSession,
28f0: 20 68 4f 62 6a 65 63 74 2c 20 61 74 74 72 54 65   hObject, attrTe
2900: 6d 70 6c 61 74 65 43 65 72 74 69 66 69 63 61 74  mplateCertificat
2910: 65 2c 20 73 69 7a 65 6f 66 28 61 74 74 72 54 65  e, sizeof(attrTe
2920: 6d 70 6c 61 74 65 43 65 72 74 69 66 69 63 61 74  mplateCertificat
2930: 65 29 20 2f 20 73 69 7a 65 6f 66 28 61 74 74 72  e) / sizeof(attr
2940: 54 65 6d 70 6c 61 74 65 43 65 72 74 69 66 69 63  TemplateCertific
2950: 61 74 65 5b 30 5d 29 29 3b 0a 09 09 09 69 66 20  ate[0]));....if 
2960: 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f  (chk_rv != CKR_O
2970: 4b 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75  K) {.....continu
2980: 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 73 65 61 72  e;....}.....sear
2990: 63 68 54 65 6d 70 6c 61 74 65 50 72 69 76 61 74  chTemplatePrivat
29a0: 65 4b 65 79 73 5b 31 5d 2e 70 56 61 6c 75 65 20  eKeys[1].pValue 
29b0: 3d 20 61 74 74 72 54 65 6d 70 6c 61 74 65 43 65  = attrTemplateCe
29c0: 72 74 69 66 69 63 61 74 65 5b 30 5d 2e 70 56 61  rtificate[0].pVa
29d0: 6c 75 65 3b 0a 09 09 09 73 65 61 72 63 68 54 65  lue;....searchTe
29e0: 6d 70 6c 61 74 65 50 72 69 76 61 74 65 4b 65 79  mplatePrivateKey
29f0: 73 5b 31 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20  s[1].ulValueLen 
2a00: 3d 20 61 74 74 72 54 65 6d 70 6c 61 74 65 43 65  = attrTemplateCe
2a10: 72 74 69 66 69 63 61 74 65 5b 30 5d 2e 75 6c 56  rtificate[0].ulV
2a20: 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 69 66 20  alueLen;.....if 
2a30: 28 61 74 74 72 54 65 6d 70 6c 61 74 65 43 65 72  (attrTemplateCer
2a40: 74 69 66 69 63 61 74 65 5b 31 5d 2e 75 6c 56 61  tificate[1].ulVa
2a50: 6c 75 65 4c 65 6e 20 3e 20 30 20 26 26 20 61 74  lueLen > 0 && at
2a60: 74 72 54 65 6d 70 6c 61 74 65 43 65 72 74 69 66  trTemplateCertif
2a70: 69 63 61 74 65 5b 31 5d 2e 70 56 61 6c 75 65 20  icate[1].pValue 
2a80: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63  != NULL) {.....c
2a90: 65 72 74 69 66 69 63 61 74 65 4c 61 62 65 6c 20  ertificateLabel 
2aa0: 3d 20 6d 61 6c 6c 6f 63 28 61 74 74 72 54 65 6d  = malloc(attrTem
2ab0: 70 6c 61 74 65 43 65 72 74 69 66 69 63 61 74 65  plateCertificate
2ac0: 5b 31 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 2b  [1].ulValueLen +
2ad0: 20 31 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28   1);.....memcpy(
2ae0: 63 65 72 74 69 66 69 63 61 74 65 4c 61 62 65 6c  certificateLabel
2af0: 2c 20 61 74 74 72 54 65 6d 70 6c 61 74 65 43 65  , attrTemplateCe
2b00: 72 74 69 66 69 63 61 74 65 5b 31 5d 2e 70 56 61  rtificate[1].pVa
2b10: 6c 75 65 2c 20 61 74 74 72 54 65 6d 70 6c 61 74  lue, attrTemplat
2b20: 65 43 65 72 74 69 66 69 63 61 74 65 5b 31 5d 2e  eCertificate[1].
2b30: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
2b40: 09 63 65 72 74 69 66 69 63 61 74 65 4c 61 62 65  .certificateLabe
2b50: 6c 5b 61 74 74 72 54 65 6d 70 6c 61 74 65 43 65  l[attrTemplateCe
2b60: 72 74 69 66 69 63 61 74 65 5b 31 5d 2e 75 6c 56  rtificate[1].ulV
2b70: 61 6c 75 65 4c 65 6e 5d 20 3d 20 27 5c 30 27 3b  alueLen] = '\0';
2b80: 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
2b90: 0a 09 09 7d 0a 0a 09 09 6d 6f 64 75 6c 65 46 75  ...}....moduleFu
2ba0: 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69  nctionList->C_Fi
2bb0: 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 28 68  ndObjectsFinal(h
2bc0: 53 65 73 73 69 6f 6e 29 3b 0a 0a 09 09 69 66 20  Session);....if 
2bd0: 28 73 65 61 72 63 68 54 65 6d 70 6c 61 74 65 50  (searchTemplateP
2be0: 72 69 76 61 74 65 4b 65 79 73 5b 31 5d 2e 70 56  rivateKeys[1].pV
2bf0: 61 6c 75 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  alue != NULL) {.
2c00: 09 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75  ...chk_rv = modu
2c10: 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  leFunctionList->
2c20: 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
2c30: 74 28 68 53 65 73 73 69 6f 6e 2c 20 73 65 61 72  t(hSession, sear
2c40: 63 68 54 65 6d 70 6c 61 74 65 43 65 72 74 69 66  chTemplateCertif
2c50: 69 63 61 74 65 73 2c 20 73 69 7a 65 6f 66 28 73  icates, sizeof(s
2c60: 65 61 72 63 68 54 65 6d 70 6c 61 74 65 43 65 72  earchTemplateCer
2c70: 74 69 66 69 63 61 74 65 73 29 20 2f 20 73 69 7a  tificates) / siz
2c80: 65 6f 66 28 73 65 61 72 63 68 54 65 6d 70 6c 61  eof(searchTempla
2c90: 74 65 43 65 72 74 69 66 69 63 61 74 65 73 5b 30  teCertificates[0
2ca0: 5d 29 29 3b 20 0a 09 09 09 69 66 20 28 63 68 6b  ])); ....if (chk
2cb0: 5f 72 76 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b  _rv == CKR_OK) {
2cc0: 0a 09 09 09 09 77 68 69 6c 65 20 28 31 29 20 7b  .....while (1) {
2cd0: 0a 09 09 09 09 09 63 68 6b 5f 72 76 20 3d 20 6d  ......chk_rv = m
2ce0: 6f 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73  oduleFunctionLis
2cf0: 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
2d00: 28 68 53 65 73 73 69 6f 6e 2c 20 26 68 4f 62 6a  (hSession, &hObj
2d10: 65 63 74 2c 20 31 2c 20 26 75 6c 4f 62 6a 65 63  ect, 1, &ulObjec
2d20: 74 43 6f 75 6e 74 29 3b 0a 09 09 09 09 09 69 66  tCount);......if
2d30: 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f   (chk_rv != CKR_
2d40: 4f 4b 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61  OK) {.......brea
2d50: 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
2d60: 69 66 20 28 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  if (ulObjectCoun
2d70: 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09  t == 0) {.......
2d80: 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09  break;......}...
2d90: 09 09 09 09 69 66 20 28 75 6c 4f 62 6a 65 63 74  ....if (ulObject
2da0: 43 6f 75 6e 74 20 21 3d 20 31 29 20 7b 0a 09 09  Count != 1) {...
2db0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
2dc0: 7d 0a 0a 09 09 09 09 09 68 4b 65 79 20 3d 20 68  }.......hKey = h
2dd0: 4f 62 6a 65 63 74 3b 0a 0a 09 09 09 09 09 66 6f  Object;.......fo
2de0: 75 6e 64 50 72 69 76 61 74 65 4b 65 79 4f 62 6a  undPrivateKeyObj
2df0: 65 63 74 20 3d 20 31 3b 0a 0a 09 09 09 09 09 62  ect = 1;.......b
2e00: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
2e10: 09 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c  .moduleFunctionL
2e20: 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
2e30: 74 73 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e  tsFinal(hSession
2e40: 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65  );....}.....free
2e50: 28 73 65 61 72 63 68 54 65 6d 70 6c 61 74 65 50  (searchTemplateP
2e60: 72 69 76 61 74 65 4b 65 79 73 5b 31 5d 2e 70 56  rivateKeys[1].pV
2e70: 61 6c 75 65 29 3b 0a 0a 09 09 7d 0a 0a 09 09 69  alue);....}....i
2e80: 66 20 28 66 6f 75 6e 64 50 72 69 76 61 74 65 4b  f (foundPrivateK
2e90: 65 79 4f 62 6a 65 63 74 29 20 7b 0a 09 09 09 63  eyObject) {....c
2ea0: 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c 65 46 75  hk_rv = moduleFu
2eb0: 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
2ec0: 67 6e 49 6e 69 74 28 68 53 65 73 73 69 6f 6e 2c  gnInit(hSession,
2ed0: 20 26 73 69 67 6e 4d 65 63 68 61 6e 69 73 6d 2c   &signMechanism,
2ee0: 20 68 4b 65 79 29 3b 0a 09 09 09 69 66 20 28 63   hKey);....if (c
2ef0: 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29  hk_rv != CKR_OK)
2f00: 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
2f10: 09 7d 0a 0a 09 09 09 74 6d 70 44 65 73 74 69 6e  .}.....tmpDestin
2f20: 61 74 69 6f 6e 4c 65 6e 67 74 68 20 3d 20 2a 64  ationLength = *d
2f30: 65 73 74 69 6e 61 74 69 6f 6e 4c 65 6e 67 74 68  estinationLength
2f40: 3b 0a 09 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f  ;....chk_rv = mo
2f50: 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74  duleFunctionList
2f60: 2d 3e 43 5f 53 69 67 6e 28 68 53 65 73 73 69 6f  ->C_Sign(hSessio
2f70: 6e 2c 20 64 61 74 61 2c 20 64 61 74 61 4c 65 6e  n, data, dataLen
2f80: 67 74 68 2c 20 64 65 73 74 69 6e 61 74 69 6f 6e  gth, destination
2f90: 2c 20 26 74 6d 70 44 65 73 74 69 6e 61 74 69 6f  , &tmpDestinatio
2fa0: 6e 4c 65 6e 67 74 68 29 3b 0a 09 09 09 73 77 69  nLength);....swi
2fb0: 74 63 68 20 28 63 68 6b 5f 72 76 29 20 7b 0a 09  tch (chk_rv) {..
2fc0: 09 09 09 63 61 73 65 20 43 4b 52 5f 4f 4b 3a 0a  ...case CKR_OK:.
2fd0: 09 09 09 09 09 2a 64 65 73 74 69 6e 61 74 69 6f  .....*destinatio
2fe0: 6e 4c 65 6e 67 74 68 20 3d 20 74 6d 70 44 65 73  nLength = tmpDes
2ff0: 74 69 6e 61 74 69 6f 6e 4c 65 6e 67 74 68 3b 0a  tinationLength;.
3000: 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 41  .....retval = CA
3010: 43 4b 45 59 5f 43 48 52 4f 4d 45 5f 4f 4b 3b 0a  CKEY_CHROME_OK;.
3020: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
3030: 63 61 73 65 20 43 4b 52 5f 55 53 45 52 5f 4e 4f  case CKR_USER_NO
3040: 54 5f 4c 4f 47 47 45 44 5f 49 4e 3a 0a 09 09 09  T_LOGGED_IN:....
3050: 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c  ..chk_rv = modul
3060: 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  eFunctionList->C
3070: 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 28 73 6c  _GetTokenInfo(sl
3080: 6f 74 73 5b 63 75 72 72 53 6c 6f 74 5d 2c 20 26  ots[currSlot], &
3090: 74 6f 6b 65 6e 49 6e 66 6f 29 3b 0a 09 09 09 09  tokenInfo);.....
30a0: 09 69 66 20 28 63 68 6b 5f 72 76 20 3d 3d 20 43  .if (chk_rv == C
30b0: 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 69  KR_OK) {.......i
30c0: 66 20 28 28 74 6f 6b 65 6e 49 6e 66 6f 2e 66 6c  f ((tokenInfo.fl
30d0: 61 67 73 20 26 20 43 4b 46 5f 50 52 4f 54 45 43  ags & CKF_PROTEC
30e0: 54 45 44 5f 41 55 54 48 45 4e 54 49 43 41 54 49  TED_AUTHENTICATI
30f0: 4f 4e 5f 50 41 54 48 29 20 3d 3d 20 43 4b 46 5f  ON_PATH) == CKF_
3100: 50 52 4f 54 45 43 54 45 44 5f 41 55 54 48 45 4e  PROTECTED_AUTHEN
3110: 54 49 43 41 54 49 4f 4e 5f 50 41 54 48 29 20 7b  TICATION_PATH) {
3120: 0a 09 09 09 09 09 09 09 72 65 74 76 61 6c 20 3d  ........retval =
3130: 20 43 41 43 4b 45 59 5f 43 48 52 4f 4d 45 5f 4e   CACKEY_CHROME_N
3140: 45 45 44 50 52 4f 54 45 43 54 45 44 4c 4f 47 49  EEDPROTECTEDLOGI
3150: 4e 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20  N;.......} else 
3160: 7b 0a 09 09 09 09 09 09 09 72 65 74 76 61 6c 20  {........retval 
3170: 3d 20 43 41 43 4b 45 59 5f 43 48 52 4f 4d 45 5f  = CACKEY_CHROME_
3180: 4e 45 45 44 4c 4f 47 49 4e 3b 0a 0a 09 09 09 09  NEEDLOGIN;......
3190: 09 09 09 2a 70 69 6e 50 72 6f 6d 70 74 20 3d 20  ...*pinPrompt = 
31a0: 6d 61 6c 6c 6f 63 28 31 30 32 34 29 3b 0a 09 09  malloc(1024);...
31b0: 09 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
31c0: 63 61 74 65 4c 61 62 65 6c 29 20 7b 0a 09 09 09  cateLabel) {....
31d0: 09 09 09 09 09 73 6e 70 72 69 6e 74 66 28 2a 70  .....snprintf(*p
31e0: 69 6e 50 72 6f 6d 70 74 2c 20 31 30 32 34 2c 20  inPrompt, 1024, 
31f0: 22 50 6c 65 61 73 65 20 65 6e 74 65 72 20 74 68  "Please enter th
3200: 65 20 50 49 4e 20 66 6f 72 20 25 73 3a 25 73 22  e PIN for %s:%s"
3210: 2c 20 74 6f 6b 65 6e 49 6e 66 6f 2e 6c 61 62 65  , tokenInfo.labe
3220: 6c 2c 20 63 65 72 74 69 66 69 63 61 74 65 4c 61  l, certificateLa
3230: 62 65 6c 29 3b 0a 09 09 09 09 09 09 09 7d 20 65  bel);........} e
3240: 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09 73 6e  lse {.........sn
3250: 70 72 69 6e 74 66 28 2a 70 69 6e 50 72 6f 6d 70  printf(*pinPromp
3260: 74 2c 20 31 30 32 34 2c 20 22 50 6c 65 61 73 65  t, 1024, "Please
3270: 20 65 6e 74 65 72 20 74 68 65 20 50 49 4e 20 66   enter the PIN f
3280: 6f 72 20 25 73 22 2c 20 74 6f 6b 65 6e 49 6e 66  or %s", tokenInf
3290: 6f 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 09 09 09  o.label);.......
32a0: 09 7d 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09  .}.......}......
32b0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 72  } else {.......r
32c0: 65 74 76 61 6c 20 3d 20 43 41 43 4b 45 59 5f 43  etval = CACKEY_C
32d0: 48 52 4f 4d 45 5f 4e 45 45 44 4c 4f 47 49 4e 3b  HROME_NEEDLOGIN;
32e0: 0a 0a 09 09 09 09 09 09 2a 70 69 6e 50 72 6f 6d  ........*pinProm
32f0: 70 74 20 3d 20 73 74 72 64 75 70 28 22 50 6c 65  pt = strdup("Ple
3300: 61 73 65 20 65 6e 74 65 72 20 79 6f 75 72 20 53  ase enter your S
3310: 6d 61 72 74 63 61 72 64 20 50 49 4e 22 29 3b 0a  martcard PIN");.
3320: 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
3330: 28 72 65 74 76 61 6c 20 3d 3d 20 43 41 43 4b 45  (retval == CACKE
3340: 59 5f 43 48 52 4f 4d 45 5f 4e 45 45 44 50 52 4f  Y_CHROME_NEEDPRO
3350: 54 45 43 54 45 44 4c 4f 47 49 4e 29 20 7b 0a 09  TECTEDLOGIN) {..
3360: 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 41  .....retval = CA
3370: 43 4b 45 59 5f 43 48 52 4f 4d 45 5f 45 52 52 4f  CKEY_CHROME_ERRO
3380: 52 3b 0a 0a 09 09 09 09 09 09 63 68 6b 5f 72 76  R;........chk_rv
3390: 20 3d 20 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f   = moduleFunctio
33a0: 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 28 68  nList->C_Login(h
33b0: 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45  Session, CKU_USE
33c0: 52 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 09 09  R, NULL, 0);....
33d0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
33e0: 09 69 66 20 28 70 69 6e 29 20 7b 0a 09 09 09 09  .if (pin) {.....
33f0: 09 09 09 72 65 74 76 61 6c 20 3d 20 43 41 43 4b  ...retval = CACK
3400: 45 59 5f 43 48 52 4f 4d 45 5f 45 52 52 4f 52 3b  EY_CHROME_ERROR;
3410: 0a 0a 09 09 09 09 09 09 09 66 72 65 65 28 2a 70  .........free(*p
3420: 69 6e 50 72 6f 6d 70 74 29 3b 0a 09 09 09 09 09  inPrompt);......
3430: 09 09 2a 70 69 6e 50 72 6f 6d 70 74 20 3d 20 4e  ..*pinPrompt = N
3440: 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 09 63 68 6b  ULL;.........chk
3450: 5f 72 76 20 3d 20 6d 6f 64 75 6c 65 46 75 6e 63  _rv = moduleFunc
3460: 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69  tionList->C_Logi
3470: 6e 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f  n(hSession, CKU_
3480: 55 53 45 52 2c 20 28 43 4b 5f 55 54 46 38 43 48  USER, (CK_UTF8CH
3490: 41 52 5f 50 54 52 29 20 70 69 6e 2c 20 73 74 72  AR_PTR) pin, str
34a0: 6c 65 6e 28 70 69 6e 29 29 3b 0a 09 09 09 09 09  len(pin));......
34b0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
34c0: 09 63 68 6b 5f 72 76 20 3d 20 43 4b 52 5f 47 45  .chk_rv = CKR_GE
34d0: 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09  NERAL_ERROR;....
34e0: 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09  ...}......}.....
34f0: 09 09 69 66 20 28 63 68 6b 5f 72 76 20 3d 3d 20  ..if (chk_rv == 
3500: 43 4b 52 5f 4f 4b 20 26 26 20 72 65 74 76 61 6c  CKR_OK && retval
3510: 20 3d 3d 20 43 41 43 4b 45 59 5f 43 48 52 4f 4d   == CACKEY_CHROM
3520: 45 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 09 09  E_ERROR) {......
3530: 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c 65  .chk_rv = module
3540: 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
3550: 53 69 67 6e 49 6e 69 74 28 68 53 65 73 73 69 6f  SignInit(hSessio
3560: 6e 2c 20 26 73 69 67 6e 4d 65 63 68 61 6e 69 73  n, &signMechanis
3570: 6d 2c 20 68 4b 65 79 29 3b 0a 09 09 09 09 09 09  m, hKey);.......
3580: 69 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b  if (chk_rv != CK
3590: 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 09 62  R_OK) {........b
35a0: 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 0a 09  reak;.......}...
35b0: 09 09 09 09 09 74 6d 70 44 65 73 74 69 6e 61 74  .....tmpDestinat
35c0: 69 6f 6e 4c 65 6e 67 74 68 20 3d 20 2a 64 65 73  ionLength = *des
35d0: 74 69 6e 61 74 69 6f 6e 4c 65 6e 67 74 68 3b 0a  tinationLength;.
35e0: 09 09 09 09 09 09 63 68 6b 5f 72 76 20 3d 20 6d  ......chk_rv = m
35f0: 6f 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73  oduleFunctionLis
3600: 74 2d 3e 43 5f 53 69 67 6e 28 68 53 65 73 73 69  t->C_Sign(hSessi
3610: 6f 6e 2c 20 64 61 74 61 2c 20 64 61 74 61 4c 65  on, data, dataLe
3620: 6e 67 74 68 2c 20 64 65 73 74 69 6e 61 74 69 6f  ngth, destinatio
3630: 6e 2c 20 26 74 6d 70 44 65 73 74 69 6e 61 74 69  n, &tmpDestinati
3640: 6f 6e 4c 65 6e 67 74 68 29 3b 0a 09 09 09 09 09  onLength);......
3650: 09 73 77 69 74 63 68 20 28 63 68 6b 5f 72 76 29  .switch (chk_rv)
3660: 20 7b 0a 09 09 09 09 09 09 09 63 61 73 65 20 43   {........case C
3670: 4b 52 5f 4f 4b 3a 0a 09 09 09 09 09 09 09 09 2a  KR_OK:.........*
3680: 64 65 73 74 69 6e 61 74 69 6f 6e 4c 65 6e 67 74  destinationLengt
3690: 68 20 3d 20 74 6d 70 44 65 73 74 69 6e 61 74 69  h = tmpDestinati
36a0: 6f 6e 4c 65 6e 67 74 68 3b 0a 09 09 09 09 09 09  onLength;.......
36b0: 09 09 72 65 74 76 61 6c 20 3d 20 43 41 43 4b 45  ..retval = CACKE
36c0: 59 5f 43 48 52 4f 4d 45 5f 4f 4b 3b 0a 09 09 09  Y_CHROME_OK;....
36d0: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
36e0: 09 09 09 63 61 73 65 20 43 4b 52 5f 55 53 45 52  ...case CKR_USER
36f0: 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3a 0a  _NOT_LOGGED_IN:.
3700: 09 09 09 09 09 09 09 09 72 65 74 76 61 6c 20 3d  ........retval =
3710: 20 43 41 43 4b 45 59 5f 43 48 52 4f 4d 45 5f 4e   CACKEY_CHROME_N
3720: 45 45 44 4c 4f 47 49 4e 3b 0a 09 09 09 09 09 09  EEDLOGIN;.......
3730: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 09  ..break;........
3740: 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 09  default:........
3750: 09 72 65 74 76 61 6c 20 3d 20 43 41 43 4b 45 59  .retval = CACKEY
3760: 5f 43 48 52 4f 4d 45 5f 45 52 52 4f 52 3b 0a 09  _CHROME_ERROR;..
3770: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
3780: 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09  ....}......}....
3790: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 64 65  ...break;.....de
37a0: 66 61 75 6c 74 3a 0a 09 09 09 09 09 72 65 74 76  fault:......retv
37b0: 61 6c 20 3d 20 43 41 43 4b 45 59 5f 43 48 52 4f  al = CACKEY_CHRO
37c0: 4d 45 5f 45 52 52 4f 52 3b 0a 09 09 09 09 09 62  ME_ERROR;......b
37d0: 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62  reak;....}.....b
37e0: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 6d 6f 64  reak;...}....mod
37f0: 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  uleFunctionList-
3800: 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28  >C_CloseSession(
3810: 68 53 65 73 73 69 6f 6e 29 3b 0a 09 7d 0a 0a 09  hSession);..}...
3820: 66 72 65 65 28 73 6c 6f 74 73 29 3b 0a 0a 09 69  free(slots);...i
3830: 66 20 28 63 65 72 74 69 66 69 63 61 74 65 4c 61  f (certificateLa
3840: 62 65 6c 29 20 7b 0a 09 09 66 72 65 65 28 63 65  bel) {...free(ce
3850: 72 74 69 66 69 63 61 74 65 4c 61 62 65 6c 29 3b  rtificateLabel);
3860: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ..}...return(ret
3870: 76 61 6c 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  val);.}..#ifdef 
3880: 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23 65  __cplusplus.}.#e
3890: 6e 64 69 66 0a                                   ndif.