Hex Artifact Content

Artifact c7ea1006946b85d5ce1a48417a7f70e4140b378e:


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 76 6f 69 64 20 2a 64 65 73 74 69  gth, void *desti
1eb0: 6e 61 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64  nation, unsigned
1ec0: 20 6c 6f 6e 67 20 2a 64 65 73 74 69 6e 61 74 69   long *destinati
1ed0: 6f 6e 4c 65 6e 67 74 68 2c 20 63 68 61 72 20 2a  onLength, char *
1ee0: 2a 70 69 6e 50 72 6f 6d 70 74 2c 20 63 6f 6e 73  *pinPrompt, cons
1ef0: 74 20 63 68 61 72 20 2a 70 69 6e 29 20 7b 0a 09  t char *pin) {..
1f00: 43 4b 5f 52 56 20 63 68 6b 5f 72 76 3b 0a 09 43  CK_RV chk_rv;..C
1f10: 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 53 6c 6f 74 73  K_ULONG numSlots
1f20: 2c 20 63 75 72 72 53 6c 6f 74 3b 0a 09 43 4b 5f  , currSlot;..CK_
1f30: 53 4c 4f 54 5f 49 44 5f 50 54 52 20 73 6c 6f 74  SLOT_ID_PTR slot
1f40: 73 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f  s;..CK_SLOT_INFO
1f50: 20 73 6c 6f 74 49 6e 66 6f 3b 0a 09 43 4b 5f 53   slotInfo;..CK_S
1f60: 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1f70: 65 73 73 69 6f 6e 3b 0a 09 43 4b 5f 4f 42 4a 45  ession;..CK_OBJE
1f80: 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
1f90: 74 2c 20 68 4b 65 79 3b 0a 09 43 4b 5f 55 4c 4f  t, hKey;..CK_ULO
1fa0: 4e 47 20 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  NG ulObjectCount
1fb0: 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  ;..CK_ATTRIBUTE 
1fc0: 73 65 61 72 63 68 54 65 6d 70 6c 61 74 65 43 65  searchTemplateCe
1fd0: 72 74 69 66 69 63 61 74 65 73 5b 5d 20 3d 20 7b  rtificates[] = {
1fe0: 0a 09 09 7b 43 4b 41 5f 43 4c 41 53 53 2c 20 4e  ...{CKA_CLASS, N
1ff0: 55 4c 4c 2c 20 73 69 7a 65 6f 66 28 43 4b 5f 4f  ULL, sizeof(CK_O
2000: 42 4a 45 43 54 5f 43 4c 41 53 53 29 7d 2c 0a 09  BJECT_CLASS)},..
2010: 09 7b 43 4b 41 5f 56 41 4c 55 45 2c 20 4e 55 4c  .{CKA_VALUE, NUL
2020: 4c 2c 20 30 7d 0a 09 7d 3b 0a 09 43 4b 5f 41 54  L, 0}..};..CK_AT
2030: 54 52 49 42 55 54 45 20 73 65 61 72 63 68 54 65  TRIBUTE searchTe
2040: 6d 70 6c 61 74 65 50 72 69 76 61 74 65 4b 65 79  mplatePrivateKey
2050: 73 5b 5d 20 3d 20 7b 0a 09 09 7b 43 4b 41 5f 43  s[] = {...{CKA_C
2060: 4c 41 53 53 2c 20 4e 55 4c 4c 2c 20 73 69 7a 65  LASS, NULL, size
2070: 6f 66 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41  of(CK_OBJECT_CLA
2080: 53 53 29 7d 2c 0a 09 09 7b 43 4b 41 5f 49 44 2c  SS)},...{CKA_ID,
2090: 20 4e 55 4c 4c 2c 20 30 7d 0a 09 7d 3b 0a 09 43   NULL, 0}..};..C
20a0: 4b 5f 41 54 54 52 49 42 55 54 45 20 61 74 74 72  K_ATTRIBUTE attr
20b0: 54 65 6d 70 6c 61 74 65 43 65 72 74 69 66 69 63  TemplateCertific
20c0: 61 74 65 5b 5d 20 3d 20 7b 0a 09 09 7b 43 4b 41  ate[] = {...{CKA
20d0: 5f 49 44 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09  _ID, NULL, 0},..
20e0: 09 7b 43 4b 41 5f 4c 41 42 45 4c 2c 20 4e 55 4c  .{CKA_LABEL, NUL
20f0: 4c 2c 20 30 7d 0a 09 7d 3b 0a 09 43 4b 5f 4d 45  L, 0}..};..CK_ME
2100: 43 48 41 4e 49 53 4d 20 73 69 67 6e 4d 65 63 68  CHANISM signMech
2110: 61 6e 69 73 6d 20 3d 20 7b 43 4b 4d 5f 52 53 41  anism = {CKM_RSA
2120: 5f 50 4b 43 53 2c 20 4e 55 4c 4c 2c 20 30 7d 3b  _PKCS, NULL, 0};
2130: 20 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41   ..CK_OBJECT_CLA
2140: 53 53 20 6f 62 6a 65 63 74 43 6c 61 73 73 50 72  SS objectClassPr
2150: 69 76 61 74 65 4b 65 79 20 3d 20 43 4b 4f 5f 50  ivateKey = CKO_P
2160: 52 49 56 41 54 45 5f 4b 45 59 3b 0a 09 43 4b 5f  RIVATE_KEY;..CK_
2170: 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a  OBJECT_CLASS obj
2180: 65 63 74 43 6c 61 73 73 43 65 72 74 69 66 69 63  ectClassCertific
2190: 61 74 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ate = CKO_CERTIF
21a0: 49 43 41 54 45 3b 0a 09 43 4b 5f 54 4f 4b 45 4e  ICATE;..CK_TOKEN
21b0: 5f 49 4e 46 4f 20 74 6f 6b 65 6e 49 6e 66 6f 3b  _INFO tokenInfo;
21c0: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 74 6d 70 44 65  ..CK_ULONG tmpDe
21d0: 73 74 69 6e 61 74 69 6f 6e 4c 65 6e 67 74 68 3b  stinationLength;
21e0: 0a 09 63 68 61 72 20 2a 63 65 72 74 69 66 69 63  ..char *certific
21f0: 61 74 65 4c 61 62 65 6c 3b 0a 09 69 6e 74 20 66  ateLabel;..int f
2200: 6f 75 6e 64 50 72 69 76 61 74 65 4b 65 79 4f 62  oundPrivateKeyOb
2210: 6a 65 63 74 3b 0a 09 63 61 63 6b 65 79 5f 63 68  ject;..cackey_ch
2220: 72 6f 6d 65 5f 72 65 74 75 72 6e 54 79 70 65 20  rome_returnType 
2230: 72 65 74 76 61 6c 3b 0a 0a 09 2a 70 69 6e 50 72  retval;...*pinPr
2240: 6f 6d 70 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 72  ompt = NULL;...r
2250: 65 74 76 61 6c 20 3d 20 43 41 43 4b 45 59 5f 43  etval = CACKEY_C
2260: 48 52 4f 4d 45 5f 45 52 52 4f 52 3b 0a 0a 09 63  HROME_ERROR;...c
2270: 68 6b 5f 72 76 20 3d 20 63 61 63 6b 65 79 5f 63  hk_rv = cackey_c
2280: 68 72 6f 6d 65 5f 69 6e 69 74 28 29 3b 0a 09 69  hrome_init();..i
2290: 66 20 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52  f (chk_rv != CKR
22a0: 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  _OK) {...return(
22b0: 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 63 68  retval);..}...ch
22c0: 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c 65 46 75 6e  k_rv = moduleFun
22d0: 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
22e0: 53 6c 6f 74 4c 69 73 74 28 46 41 4c 53 45 2c 20  SlotList(FALSE, 
22f0: 4e 55 4c 4c 2c 20 26 6e 75 6d 53 6c 6f 74 73 29  NULL, &numSlots)
2300: 3b 0a 09 69 66 20 28 63 68 6b 5f 72 76 20 21 3d  ;..if (chk_rv !=
2310: 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 72 65 74   CKR_OK) {...ret
2320: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a  urn(retval);..}.
2330: 0a 09 73 6c 6f 74 73 20 3d 20 6d 61 6c 6c 6f 63  ..slots = malloc
2340: 28 73 69 7a 65 6f 66 28 2a 73 6c 6f 74 73 29 20  (sizeof(*slots) 
2350: 2a 20 6e 75 6d 53 6c 6f 74 73 29 3b 0a 0a 09 63  * numSlots);...c
2360: 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c 65 46 75  hk_rv = moduleFu
2370: 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2380: 74 53 6c 6f 74 4c 69 73 74 28 46 41 4c 53 45 2c  tSlotList(FALSE,
2390: 20 73 6c 6f 74 73 2c 20 26 6e 75 6d 53 6c 6f 74   slots, &numSlot
23a0: 73 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72 76 20  s);..if (chk_rv 
23b0: 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 66  != CKR_OK) {...f
23c0: 72 65 65 28 73 6c 6f 74 73 29 3b 0a 0a 09 09 72  ree(slots);....r
23d0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09  eturn(retval);..
23e0: 7d 0a 0a 09 73 65 61 72 63 68 54 65 6d 70 6c 61  }...searchTempla
23f0: 74 65 43 65 72 74 69 66 69 63 61 74 65 73 5b 30  teCertificates[0
2400: 5d 2e 70 56 61 6c 75 65 20 3d 20 26 6f 62 6a 65  ].pValue = &obje
2410: 63 74 43 6c 61 73 73 43 65 72 74 69 66 69 63 61  ctClassCertifica
2420: 74 65 3b 0a 09 73 65 61 72 63 68 54 65 6d 70 6c  te;..searchTempl
2430: 61 74 65 50 72 69 76 61 74 65 4b 65 79 73 5b 30  atePrivateKeys[0
2440: 5d 2e 70 56 61 6c 75 65 20 3d 20 26 6f 62 6a 65  ].pValue = &obje
2450: 63 74 43 6c 61 73 73 50 72 69 76 61 74 65 4b 65  ctClassPrivateKe
2460: 79 3b 0a 0a 09 73 65 61 72 63 68 54 65 6d 70 6c  y;...searchTempl
2470: 61 74 65 43 65 72 74 69 66 69 63 61 74 65 73 5b  ateCertificates[
2480: 31 5d 2e 70 56 61 6c 75 65 20 3d 20 63 65 72 74  1].pValue = cert
2490: 69 66 69 63 61 74 65 2d 3e 63 65 72 74 69 66 69  ificate->certifi
24a0: 63 61 74 65 3b 0a 09 73 65 61 72 63 68 54 65 6d  cate;..searchTem
24b0: 70 6c 61 74 65 43 65 72 74 69 66 69 63 61 74 65  plateCertificate
24c0: 73 5b 31 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20  s[1].ulValueLen 
24d0: 3d 20 63 65 72 74 69 66 69 63 61 74 65 2d 3e 63  = certificate->c
24e0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
24f0: 0a 09 66 6f 75 6e 64 50 72 69 76 61 74 65 4b 65  ..foundPrivateKe
2500: 79 4f 62 6a 65 63 74 20 3d 20 30 3b 0a 0a 09 63  yObject = 0;...c
2510: 65 72 74 69 66 69 63 61 74 65 4c 61 62 65 6c 20  ertificateLabel 
2520: 3d 20 4e 55 4c 4c 3b 0a 0a 09 66 6f 72 20 28 63  = NULL;...for (c
2530: 75 72 72 53 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrSlot = 0; cur
2540: 72 53 6c 6f 74 20 3c 20 6e 75 6d 53 6c 6f 74 73  rSlot < numSlots
2550: 3b 20 63 75 72 72 53 6c 6f 74 2b 2b 29 20 7b 0a  ; currSlot++) {.
2560: 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c  ..chk_rv = modul
2570: 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  eFunctionList->C
2580: 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 28 73 6c 6f  _GetSlotInfo(slo
2590: 74 73 5b 63 75 72 72 53 6c 6f 74 5d 2c 20 26 73  ts[currSlot], &s
25a0: 6c 6f 74 49 6e 66 6f 29 3b 0a 09 09 69 66 20 28  lotInfo);...if (
25b0: 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b  chk_rv != CKR_OK
25c0: 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ) {....continue;
25d0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 73 6c 6f  ...}....if ((slo
25e0: 74 49 6e 66 6f 2e 66 6c 61 67 73 20 26 20 43 4b  tInfo.flags & CK
25f0: 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 29  F_TOKEN_PRESENT)
2600: 20 21 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52   != CKF_TOKEN_PR
2610: 45 53 45 4e 54 29 20 7b 0a 09 09 09 63 6f 6e 74  ESENT) {....cont
2620: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 63 68 6b  inue;...}....chk
2630: 5f 72 76 20 3d 20 6d 6f 64 75 6c 65 46 75 6e 63  _rv = moduleFunc
2640: 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e  tionList->C_Open
2650: 53 65 73 73 69 6f 6e 28 73 6c 6f 74 73 5b 63 75  Session(slots[cu
2660: 72 72 53 6c 6f 74 5d 2c 20 43 4b 46 5f 53 45 52  rrSlot], CKF_SER
2670: 49 41 4c 5f 53 45 53 53 49 4f 4e 2c 20 4e 55 4c  IAL_SESSION, NUL
2680: 4c 2c 20 4e 55 4c 4c 2c 20 26 68 53 65 73 73 69  L, NULL, &hSessi
2690: 6f 6e 29 3b 0a 09 09 69 66 20 28 63 68 6b 5f 72  on);...if (chk_r
26a0: 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  v != CKR_OK) {..
26b0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
26c0: 0a 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75  ...chk_rv = modu
26d0: 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  leFunctionList->
26e0: 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
26f0: 74 28 68 53 65 73 73 69 6f 6e 2c 20 73 65 61 72  t(hSession, sear
2700: 63 68 54 65 6d 70 6c 61 74 65 43 65 72 74 69 66  chTemplateCertif
2710: 69 63 61 74 65 73 2c 20 73 69 7a 65 6f 66 28 73  icates, sizeof(s
2720: 65 61 72 63 68 54 65 6d 70 6c 61 74 65 43 65 72  earchTemplateCer
2730: 74 69 66 69 63 61 74 65 73 29 20 2f 20 73 69 7a  tificates) / siz
2740: 65 6f 66 28 73 65 61 72 63 68 54 65 6d 70 6c 61  eof(searchTempla
2750: 74 65 43 65 72 74 69 66 69 63 61 74 65 73 5b 30  teCertificates[0
2760: 5d 29 29 3b 20 0a 09 09 69 66 20 28 63 68 6b 5f  ])); ...if (chk_
2770: 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  rv != CKR_OK) {.
2780: 09 09 09 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f  ...moduleFunctio
2790: 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65  nList->C_CloseSe
27a0: 73 73 69 6f 6e 28 68 53 65 73 73 69 6f 6e 29 3b  ssion(hSession);
27b0: 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
27c0: 09 7d 0a 0a 09 09 77 68 69 6c 65 20 28 31 29 20  .}....while (1) 
27d0: 7b 0a 09 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f  {....chk_rv = mo
27e0: 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74  duleFunctionList
27f0: 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 28  ->C_FindObjects(
2800: 68 53 65 73 73 69 6f 6e 2c 20 26 68 4f 62 6a 65  hSession, &hObje
2810: 63 74 2c 20 31 2c 20 26 75 6c 4f 62 6a 65 63 74  ct, 1, &ulObject
2820: 43 6f 75 6e 74 29 3b 0a 09 09 09 69 66 20 28 63  Count);....if (c
2830: 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29  hk_rv != CKR_OK)
2840: 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
2850: 09 7d 0a 0a 09 09 09 69 66 20 28 75 6c 4f 62 6a  .}.....if (ulObj
2860: 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  ectCount == 0) {
2870: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
2880: 0a 0a 09 09 09 69 66 20 28 75 6c 4f 62 6a 65 63  .....if (ulObjec
2890: 74 43 6f 75 6e 74 20 21 3d 20 31 29 20 7b 0a 09  tCount != 1) {..
28a0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a  ...break;....}..
28b0: 09 09 09 63 68 6b 5f 72 76 20 3d 20 63 61 63 6b  ...chk_rv = cack
28c0: 65 79 5f 63 68 72 6f 6d 65 5f 47 65 74 41 74 74  ey_chrome_GetAtt
28d0: 72 69 62 75 74 65 73 46 72 6f 6d 54 65 6d 70 6c  ributesFromTempl
28e0: 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 68 4f  ate(hSession, hO
28f0: 62 6a 65 63 74 2c 20 61 74 74 72 54 65 6d 70 6c  bject, attrTempl
2900: 61 74 65 43 65 72 74 69 66 69 63 61 74 65 2c 20  ateCertificate, 
2910: 73 69 7a 65 6f 66 28 61 74 74 72 54 65 6d 70 6c  sizeof(attrTempl
2920: 61 74 65 43 65 72 74 69 66 69 63 61 74 65 29 20  ateCertificate) 
2930: 2f 20 73 69 7a 65 6f 66 28 61 74 74 72 54 65 6d  / sizeof(attrTem
2940: 70 6c 61 74 65 43 65 72 74 69 66 69 63 61 74 65  plateCertificate
2950: 5b 30 5d 29 29 3b 0a 09 09 09 69 66 20 28 63 68  [0]));....if (ch
2960: 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  k_rv != CKR_OK) 
2970: 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
2980: 09 09 09 7d 0a 0a 09 09 09 73 65 61 72 63 68 54  ...}.....searchT
2990: 65 6d 70 6c 61 74 65 50 72 69 76 61 74 65 4b 65  emplatePrivateKe
29a0: 79 73 5b 31 5d 2e 70 56 61 6c 75 65 20 3d 20 61  ys[1].pValue = a
29b0: 74 74 72 54 65 6d 70 6c 61 74 65 43 65 72 74 69  ttrTemplateCerti
29c0: 66 69 63 61 74 65 5b 30 5d 2e 70 56 61 6c 75 65  ficate[0].pValue
29d0: 3b 0a 09 09 09 73 65 61 72 63 68 54 65 6d 70 6c  ;....searchTempl
29e0: 61 74 65 50 72 69 76 61 74 65 4b 65 79 73 5b 31  atePrivateKeys[1
29f0: 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 61  ].ulValueLen = a
2a00: 74 74 72 54 65 6d 70 6c 61 74 65 43 65 72 74 69  ttrTemplateCerti
2a10: 66 69 63 61 74 65 5b 30 5d 2e 75 6c 56 61 6c 75  ficate[0].ulValu
2a20: 65 4c 65 6e 3b 0a 0a 09 09 09 69 66 20 28 61 74  eLen;.....if (at
2a30: 74 72 54 65 6d 70 6c 61 74 65 43 65 72 74 69 66  trTemplateCertif
2a40: 69 63 61 74 65 5b 31 5d 2e 75 6c 56 61 6c 75 65  icate[1].ulValue
2a50: 4c 65 6e 20 3e 20 30 20 26 26 20 61 74 74 72 54  Len > 0 && attrT
2a60: 65 6d 70 6c 61 74 65 43 65 72 74 69 66 69 63 61  emplateCertifica
2a70: 74 65 5b 31 5d 2e 70 56 61 6c 75 65 20 21 3d 20  te[1].pValue != 
2a80: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 65 72 74  NULL) {.....cert
2a90: 69 66 69 63 61 74 65 4c 61 62 65 6c 20 3d 20 6d  ificateLabel = m
2aa0: 61 6c 6c 6f 63 28 61 74 74 72 54 65 6d 70 6c 61  alloc(attrTempla
2ab0: 74 65 43 65 72 74 69 66 69 63 61 74 65 5b 31 5d  teCertificate[1]
2ac0: 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 2b 20 31 29  .ulValueLen + 1)
2ad0: 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 65 72  ;.....memcpy(cer
2ae0: 74 69 66 69 63 61 74 65 4c 61 62 65 6c 2c 20 61  tificateLabel, a
2af0: 74 74 72 54 65 6d 70 6c 61 74 65 43 65 72 74 69  ttrTemplateCerti
2b00: 66 69 63 61 74 65 5b 31 5d 2e 70 56 61 6c 75 65  ficate[1].pValue
2b10: 2c 20 61 74 74 72 54 65 6d 70 6c 61 74 65 43 65  , attrTemplateCe
2b20: 72 74 69 66 69 63 61 74 65 5b 31 5d 2e 75 6c 56  rtificate[1].ulV
2b30: 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 63 65  alueLen);.....ce
2b40: 72 74 69 66 69 63 61 74 65 4c 61 62 65 6c 5b 61  rtificateLabel[a
2b50: 74 74 72 54 65 6d 70 6c 61 74 65 43 65 72 74 69  ttrTemplateCerti
2b60: 66 69 63 61 74 65 5b 31 5d 2e 75 6c 56 61 6c 75  ficate[1].ulValu
2b70: 65 4c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 09  eLen] = '\0';...
2b80: 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
2b90: 7d 0a 0a 09 09 6d 6f 64 75 6c 65 46 75 6e 63 74  }....moduleFunct
2ba0: 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f  ionList->C_FindO
2bb0: 62 6a 65 63 74 73 46 69 6e 61 6c 28 68 53 65 73  bjectsFinal(hSes
2bc0: 73 69 6f 6e 29 3b 0a 0a 09 09 69 66 20 28 73 65  sion);....if (se
2bd0: 61 72 63 68 54 65 6d 70 6c 61 74 65 50 72 69 76  archTemplatePriv
2be0: 61 74 65 4b 65 79 73 5b 31 5d 2e 70 56 61 6c 75  ateKeys[1].pValu
2bf0: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e != NULL) {....
2c00: 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c 65 46  chk_rv = moduleF
2c10: 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
2c20: 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 28 68  indObjectsInit(h
2c30: 53 65 73 73 69 6f 6e 2c 20 73 65 61 72 63 68 54  Session, searchT
2c40: 65 6d 70 6c 61 74 65 43 65 72 74 69 66 69 63 61  emplateCertifica
2c50: 74 65 73 2c 20 73 69 7a 65 6f 66 28 73 65 61 72  tes, sizeof(sear
2c60: 63 68 54 65 6d 70 6c 61 74 65 43 65 72 74 69 66  chTemplateCertif
2c70: 69 63 61 74 65 73 29 20 2f 20 73 69 7a 65 6f 66  icates) / sizeof
2c80: 28 73 65 61 72 63 68 54 65 6d 70 6c 61 74 65 43  (searchTemplateC
2c90: 65 72 74 69 66 69 63 61 74 65 73 5b 30 5d 29 29  ertificates[0]))
2ca0: 3b 20 0a 09 09 09 69 66 20 28 63 68 6b 5f 72 76  ; ....if (chk_rv
2cb0: 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   == CKR_OK) {...
2cc0: 09 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09  ..while (1) {...
2cd0: 09 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75  ...chk_rv = modu
2ce0: 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  leFunctionList->
2cf0: 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 28 68 53  C_FindObjects(hS
2d00: 65 73 73 69 6f 6e 2c 20 26 68 4f 62 6a 65 63 74  ession, &hObject
2d10: 2c 20 31 2c 20 26 75 6c 4f 62 6a 65 63 74 43 6f  , 1, &ulObjectCo
2d20: 75 6e 74 29 3b 0a 09 09 09 09 09 69 66 20 28 63  unt);......if (c
2d30: 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29  hk_rv != CKR_OK)
2d40: 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
2d50: 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
2d60: 28 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  (ulObjectCount =
2d70: 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65  = 0) {.......bre
2d80: 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ak;......}......
2d90: 09 69 66 20 28 75 6c 4f 62 6a 65 63 74 43 6f 75  .if (ulObjectCou
2da0: 6e 74 20 21 3d 20 31 29 20 7b 0a 09 09 09 09 09  nt != 1) {......
2db0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a  .break;......}..
2dc0: 09 09 09 09 09 68 4b 65 79 20 3d 20 68 4f 62 6a  .....hKey = hObj
2dd0: 65 63 74 3b 0a 0a 09 09 09 09 09 66 6f 75 6e 64  ect;.......found
2de0: 50 72 69 76 61 74 65 4b 65 79 4f 62 6a 65 63 74  PrivateKeyObject
2df0: 20 3d 20 31 3b 0a 0a 09 09 09 09 09 62 72 65 61   = 1;.......brea
2e00: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 6f  k;.....}......mo
2e10: 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74  duleFunctionList
2e20: 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46  ->C_FindObjectsF
2e30: 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 29 3b 0a  inal(hSession);.
2e40: 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 73 65  ...}.....free(se
2e50: 61 72 63 68 54 65 6d 70 6c 61 74 65 50 72 69 76  archTemplatePriv
2e60: 61 74 65 4b 65 79 73 5b 31 5d 2e 70 56 61 6c 75  ateKeys[1].pValu
2e70: 65 29 3b 0a 0a 09 09 7d 0a 0a 09 09 69 66 20 28  e);....}....if (
2e80: 66 6f 75 6e 64 50 72 69 76 61 74 65 4b 65 79 4f  foundPrivateKeyO
2e90: 62 6a 65 63 74 29 20 7b 0a 09 09 09 63 68 6b 5f  bject) {....chk_
2ea0: 72 76 20 3d 20 6d 6f 64 75 6c 65 46 75 6e 63 74  rv = moduleFunct
2eb0: 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49  ionList->C_SignI
2ec0: 6e 69 74 28 68 53 65 73 73 69 6f 6e 2c 20 26 73  nit(hSession, &s
2ed0: 69 67 6e 4d 65 63 68 61 6e 69 73 6d 2c 20 68 4b  ignMechanism, hK
2ee0: 65 79 29 3b 0a 09 09 09 69 66 20 28 63 68 6b 5f  ey);....if (chk_
2ef0: 72 76 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  rv != CKR_OK) {.
2f00: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
2f10: 0a 09 09 09 74 6d 70 44 65 73 74 69 6e 61 74 69  ....tmpDestinati
2f20: 6f 6e 4c 65 6e 67 74 68 20 3d 20 2a 64 65 73 74  onLength = *dest
2f30: 69 6e 61 74 69 6f 6e 4c 65 6e 67 74 68 3b 0a 09  inationLength;..
2f40: 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c  ..chk_rv = modul
2f50: 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  eFunctionList->C
2f60: 5f 53 69 67 6e 28 68 53 65 73 73 69 6f 6e 2c 20  _Sign(hSession, 
2f70: 64 61 74 61 2c 20 64 61 74 61 4c 65 6e 67 74 68  data, dataLength
2f80: 2c 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 20 26  , destination, &
2f90: 74 6d 70 44 65 73 74 69 6e 61 74 69 6f 6e 4c 65  tmpDestinationLe
2fa0: 6e 67 74 68 29 3b 0a 09 09 09 73 77 69 74 63 68  ngth);....switch
2fb0: 20 28 63 68 6b 5f 72 76 29 20 7b 0a 09 09 09 09   (chk_rv) {.....
2fc0: 63 61 73 65 20 43 4b 52 5f 4f 4b 3a 0a 09 09 09  case CKR_OK:....
2fd0: 09 09 2a 64 65 73 74 69 6e 61 74 69 6f 6e 4c 65  ..*destinationLe
2fe0: 6e 67 74 68 20 3d 20 74 6d 70 44 65 73 74 69 6e  ngth = tmpDestin
2ff0: 61 74 69 6f 6e 4c 65 6e 67 74 68 3b 0a 09 09 09  ationLength;....
3000: 09 09 72 65 74 76 61 6c 20 3d 20 43 41 43 4b 45  ..retval = CACKE
3010: 59 5f 43 48 52 4f 4d 45 5f 4f 4b 3b 0a 09 09 09  Y_CHROME_OK;....
3020: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73  ..break;.....cas
3030: 65 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c  e CKR_USER_NOT_L
3040: 4f 47 47 45 44 5f 49 4e 3a 0a 09 09 09 09 09 63  OGGED_IN:......c
3050: 68 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c 65 46 75  hk_rv = moduleFu
3060: 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
3070: 74 54 6f 6b 65 6e 49 6e 66 6f 28 73 6c 6f 74 73  tTokenInfo(slots
3080: 5b 63 75 72 72 53 6c 6f 74 5d 2c 20 26 74 6f 6b  [currSlot], &tok
3090: 65 6e 49 6e 66 6f 29 3b 0a 09 09 09 09 09 69 66  enInfo);......if
30a0: 20 28 63 68 6b 5f 72 76 20 3d 3d 20 43 4b 52 5f   (chk_rv == CKR_
30b0: 4f 4b 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28  OK) {.......if (
30c0: 28 74 6f 6b 65 6e 49 6e 66 6f 2e 66 6c 61 67 73  (tokenInfo.flags
30d0: 20 26 20 43 4b 46 5f 50 52 4f 54 45 43 54 45 44   & CKF_PROTECTED
30e0: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 5f  _AUTHENTICATION_
30f0: 50 41 54 48 29 20 3d 3d 20 43 4b 46 5f 50 52 4f  PATH) == CKF_PRO
3100: 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54 49 43  TECTED_AUTHENTIC
3110: 41 54 49 4f 4e 5f 50 41 54 48 29 20 7b 0a 09 09  ATION_PATH) {...
3120: 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 41  .....retval = CA
3130: 43 4b 45 59 5f 43 48 52 4f 4d 45 5f 4e 45 45 44  CKEY_CHROME_NEED
3140: 50 52 4f 54 45 43 54 45 44 4c 4f 47 49 4e 3b 0a  PROTECTEDLOGIN;.
3150: 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
3160: 09 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
3170: 41 43 4b 45 59 5f 43 48 52 4f 4d 45 5f 4e 45 45  ACKEY_CHROME_NEE
3180: 44 4c 4f 47 49 4e 3b 0a 0a 09 09 09 09 09 09 09  DLOGIN;.........
3190: 2a 70 69 6e 50 72 6f 6d 70 74 20 3d 20 6d 61 6c  *pinPrompt = mal
31a0: 6c 6f 63 28 31 30 32 34 29 3b 0a 09 09 09 09 09  loc(1024);......
31b0: 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
31c0: 65 4c 61 62 65 6c 29 20 7b 0a 09 09 09 09 09 09  eLabel) {.......
31d0: 09 09 73 6e 70 72 69 6e 74 66 28 2a 70 69 6e 50  ..snprintf(*pinP
31e0: 72 6f 6d 70 74 2c 20 31 30 32 34 2c 20 22 50 6c  rompt, 1024, "Pl
31f0: 65 61 73 65 20 65 6e 74 65 72 20 74 68 65 20 50  ease enter the P
3200: 49 4e 20 66 6f 72 20 25 73 3a 25 73 22 2c 20 74  IN for %s:%s", t
3210: 6f 6b 65 6e 49 6e 66 6f 2e 6c 61 62 65 6c 2c 20  okenInfo.label, 
3220: 63 65 72 74 69 66 69 63 61 74 65 4c 61 62 65 6c  certificateLabel
3230: 29 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65  );........} else
3240: 20 7b 0a 09 09 09 09 09 09 09 09 73 6e 70 72 69   {.........snpri
3250: 6e 74 66 28 2a 70 69 6e 50 72 6f 6d 70 74 2c 20  ntf(*pinPrompt, 
3260: 31 30 32 34 2c 20 22 50 6c 65 61 73 65 20 65 6e  1024, "Please en
3270: 74 65 72 20 74 68 65 20 50 49 4e 20 66 6f 72 20  ter the PIN for 
3280: 25 73 22 2c 20 74 6f 6b 65 6e 49 6e 66 6f 2e 6c  %s", tokenInfo.l
3290: 61 62 65 6c 29 3b 0a 09 09 09 09 09 09 09 7d 0a  abel);........}.
32a0: 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65  ......}......} e
32b0: 6c 73 65 20 7b 0a 09 09 09 09 09 09 72 65 74 76  lse {.......retv
32c0: 61 6c 20 3d 20 43 41 43 4b 45 59 5f 43 48 52 4f  al = CACKEY_CHRO
32d0: 4d 45 5f 4e 45 45 44 4c 4f 47 49 4e 3b 0a 0a 09  ME_NEEDLOGIN;...
32e0: 09 09 09 09 09 2a 70 69 6e 50 72 6f 6d 70 74 20  .....*pinPrompt 
32f0: 3d 20 73 74 72 64 75 70 28 22 50 6c 65 61 73 65  = strdup("Please
3300: 20 65 6e 74 65 72 20 79 6f 75 72 20 53 6d 61 72   enter your Smar
3310: 74 63 61 72 64 20 50 49 4e 22 29 3b 0a 09 09 09  tcard PIN");....
3320: 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 72 65  ..}.......if (re
3330: 74 76 61 6c 20 3d 3d 20 43 41 43 4b 45 59 5f 43  tval == CACKEY_C
3340: 48 52 4f 4d 45 5f 4e 45 45 44 50 52 4f 54 45 43  HROME_NEEDPROTEC
3350: 54 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09  TEDLOGIN) {.....
3360: 09 09 72 65 74 76 61 6c 20 3d 20 43 41 43 4b 45  ..retval = CACKE
3370: 59 5f 43 48 52 4f 4d 45 5f 45 52 52 4f 52 3b 0a  Y_CHROME_ERROR;.
3380: 0a 09 09 09 09 09 09 63 68 6b 5f 72 76 20 3d 20  .......chk_rv = 
3390: 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f 6e 4c 69  moduleFunctionLi
33a0: 73 74 2d 3e 43 5f 4c 6f 67 69 6e 28 68 53 65 73  st->C_Login(hSes
33b0: 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20  sion, CKU_USER, 
33c0: 4e 55 4c 4c 2c 20 30 29 3b 0a 09 09 09 09 09 7d  NULL, 0);......}
33d0: 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 69 66   else {.......if
33e0: 20 28 70 69 6e 29 20 7b 0a 09 09 09 09 09 09 09   (pin) {........
33f0: 72 65 74 76 61 6c 20 3d 20 43 41 43 4b 45 59 5f  retval = CACKEY_
3400: 43 48 52 4f 4d 45 5f 45 52 52 4f 52 3b 0a 0a 09  CHROME_ERROR;...
3410: 09 09 09 09 09 09 66 72 65 65 28 2a 70 69 6e 50  ......free(*pinP
3420: 72 6f 6d 70 74 29 3b 0a 09 09 09 09 09 09 09 2a  rompt);........*
3430: 70 69 6e 50 72 6f 6d 70 74 20 3d 20 4e 55 4c 4c  pinPrompt = NULL
3440: 3b 0a 0a 09 09 09 09 09 09 09 63 68 6b 5f 72 76  ;.........chk_rv
3450: 20 3d 20 6d 6f 64 75 6c 65 46 75 6e 63 74 69 6f   = moduleFunctio
3460: 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 28 68  nList->C_Login(h
3470: 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45  Session, CKU_USE
3480: 52 2c 20 28 43 4b 5f 55 54 46 38 43 48 41 52 5f  R, (CK_UTF8CHAR_
3490: 50 54 52 29 20 70 69 6e 2c 20 73 74 72 6c 65 6e  PTR) pin, strlen
34a0: 28 70 69 6e 29 29 3b 0a 09 09 09 09 09 09 7d 20  (pin));.......} 
34b0: 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 63 68  else {........ch
34c0: 6b 5f 72 76 20 3d 20 43 4b 52 5f 47 45 4e 45 52  k_rv = CKR_GENER
34d0: 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 09 09  AL_ERROR;.......
34e0: 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  }......}.......i
34f0: 66 20 28 63 68 6b 5f 72 76 20 3d 3d 20 43 4b 52  f (chk_rv == CKR
3500: 5f 4f 4b 20 26 26 20 72 65 74 76 61 6c 20 3d 3d  _OK && retval ==
3510: 20 43 41 43 4b 45 59 5f 43 48 52 4f 4d 45 5f 45   CACKEY_CHROME_E
3520: 52 52 4f 52 29 20 7b 0a 09 09 09 09 09 09 63 68  RROR) {.......ch
3530: 6b 5f 72 76 20 3d 20 6d 6f 64 75 6c 65 46 75 6e  k_rv = moduleFun
3540: 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
3550: 6e 49 6e 69 74 28 68 53 65 73 73 69 6f 6e 2c 20  nInit(hSession, 
3560: 26 73 69 67 6e 4d 65 63 68 61 6e 69 73 6d 2c 20  &signMechanism, 
3570: 68 4b 65 79 29 3b 0a 09 09 09 09 09 09 69 66 20  hKey);.......if 
3580: 28 63 68 6b 5f 72 76 20 21 3d 20 43 4b 52 5f 4f  (chk_rv != CKR_O
3590: 4b 29 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61  K) {........brea
35a0: 6b 3b 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09 09  k;.......}......
35b0: 09 09 74 6d 70 44 65 73 74 69 6e 61 74 69 6f 6e  ..tmpDestination
35c0: 4c 65 6e 67 74 68 20 3d 20 2a 64 65 73 74 69 6e  Length = *destin
35d0: 61 74 69 6f 6e 4c 65 6e 67 74 68 3b 0a 09 09 09  ationLength;....
35e0: 09 09 09 63 68 6b 5f 72 76 20 3d 20 6d 6f 64 75  ...chk_rv = modu
35f0: 6c 65 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  leFunctionList->
3600: 43 5f 53 69 67 6e 28 68 53 65 73 73 69 6f 6e 2c  C_Sign(hSession,
3610: 20 64 61 74 61 2c 20 64 61 74 61 4c 65 6e 67 74   data, dataLengt
3620: 68 2c 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 20  h, destination, 
3630: 26 74 6d 70 44 65 73 74 69 6e 61 74 69 6f 6e 4c  &tmpDestinationL
3640: 65 6e 67 74 68 29 3b 0a 09 09 09 09 09 09 73 77  ength);.......sw
3650: 69 74 63 68 20 28 63 68 6b 5f 72 76 29 20 7b 0a  itch (chk_rv) {.
3660: 09 09 09 09 09 09 09 63 61 73 65 20 43 4b 52 5f  .......case CKR_
3670: 4f 4b 3a 0a 09 09 09 09 09 09 09 09 2a 64 65 73  OK:.........*des
3680: 74 69 6e 61 74 69 6f 6e 4c 65 6e 67 74 68 20 3d  tinationLength =
3690: 20 74 6d 70 44 65 73 74 69 6e 61 74 69 6f 6e 4c   tmpDestinationL
36a0: 65 6e 67 74 68 3b 0a 09 09 09 09 09 09 09 09 72  ength;.........r
36b0: 65 74 76 61 6c 20 3d 20 43 41 43 4b 45 59 5f 43  etval = CACKEY_C
36c0: 48 52 4f 4d 45 5f 4f 4b 3b 0a 09 09 09 09 09 09  HROME_OK;.......
36d0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 09  ..break;........
36e0: 63 61 73 65 20 43 4b 52 5f 55 53 45 52 5f 4e 4f  case CKR_USER_NO
36f0: 54 5f 4c 4f 47 47 45 44 5f 49 4e 3a 0a 09 09 09  T_LOGGED_IN:....
3700: 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 41  .....retval = CA
3710: 43 4b 45 59 5f 43 48 52 4f 4d 45 5f 4e 45 45 44  CKEY_CHROME_NEED
3720: 4c 4f 47 49 4e 3b 0a 09 09 09 09 09 09 09 09 62  LOGIN;.........b
3730: 72 65 61 6b 3b 0a 09 09 09 09 09 09 09 64 65 66  reak;........def
3740: 61 75 6c 74 3a 0a 09 09 09 09 09 09 09 09 72 65  ault:.........re
3750: 74 76 61 6c 20 3d 20 43 41 43 4b 45 59 5f 43 48  tval = CACKEY_CH
3760: 52 4f 4d 45 5f 45 52 52 4f 52 3b 0a 09 09 09 09  ROME_ERROR;.....
3770: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
3780: 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  .}......}.......
3790: 62 72 65 61 6b 3b 0a 09 09 09 09 64 65 66 61 75  break;.....defau
37a0: 6c 74 3a 0a 09 09 09 09 09 72 65 74 76 61 6c 20  lt:......retval 
37b0: 3d 20 43 41 43 4b 45 59 5f 43 48 52 4f 4d 45 5f  = CACKEY_CHROME_
37c0: 45 52 52 4f 52 3b 0a 09 09 09 09 09 62 72 65 61  ERROR;......brea
37d0: 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  k;....}.....brea
37e0: 6b 3b 0a 09 09 7d 0a 0a 09 09 6d 6f 64 75 6c 65  k;...}....module
37f0: 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
3800: 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 68 53 65  CloseSession(hSe
3810: 73 73 69 6f 6e 29 3b 0a 09 7d 0a 0a 09 66 72 65  ssion);..}...fre
3820: 65 28 73 6c 6f 74 73 29 3b 0a 0a 09 69 66 20 28  e(slots);...if (
3830: 63 65 72 74 69 66 69 63 61 74 65 4c 61 62 65 6c  certificateLabel
3840: 29 20 7b 0a 09 09 66 72 65 65 28 63 65 72 74 69  ) {...free(certi
3850: 66 69 63 61 74 65 4c 61 62 65 6c 29 3b 0a 09 7d  ficateLabel);..}
3860: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
3870: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 63  );.}..#ifdef __c
3880: 70 6c 75 73 70 6c 75 73 0a 7d 0a 23 65 6e 64 69  plusplus.}.#endi
3890: 66 0a                                            f.