Hex Artifact Content

Artifact b238d956753adb00c26726c65a30c0eb5c013807:


0000: 2f 2a 0a 20 2a 20 43 41 43 4b 65 79 20 43 68 72  /*. * CACKey Chr
0010: 6f 6d 65 4f 53 20 63 68 72 6f 6d 65 2e 63 65 72  omeOS chrome.cer
0020: 74 69 66 69 63 61 74 65 50 72 6f 76 69 64 65 72  tificateProvider
0030: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   Implementation.
0040: 20 2a 2f 0a 0a 66 75 6e 63 74 69 6f 6e 20 6f 6e   */..function on
0050: 43 65 72 74 69 66 69 63 61 74 65 73 52 65 6a 65  CertificatesReje
0060: 63 74 65 64 28 72 65 6a 65 63 74 65 64 43 65 72  cted(rejectedCer
0070: 74 73 29 20 7b 0a 09 2f 2f 20 49 66 20 63 65 72  ts) {..// If cer
0080: 74 69 66 69 63 61 74 65 73 20 77 65 72 65 20 72  tificates were r
0090: 65 6a 65 63 74 65 64 20 62 79 20 74 68 65 20 41  ejected by the A
00a0: 50 49 2c 20 6c 6f 67 20 61 6e 20 65 72 72 6f 72  PI, log an error
00b0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 0a 09  , for example...
00c0: 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 72 65  console.error(re
00d0: 6a 65 63 74 65 64 43 65 72 74 73 2e 6c 65 6e 67  jectedCerts.leng
00e0: 74 68 20 2b 20 27 20 63 65 72 74 69 66 69 63 61  th + ' certifica
00f0: 74 65 73 20 77 65 72 65 20 72 65 6a 65 63 74 65  tes were rejecte
0100: 64 2e 27 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 7d  d.');..return;.}
0110: 0a 0a 2f 2a 0a 20 2a 20 4f 70 74 69 6f 6e 61 6c  ../*. * Optional
0120: 20 66 65 61 74 75 72 65 73 20 66 6f 72 20 43 41   features for CA
0130: 43 4b 65 79 0a 20 2a 2f 0a 76 61 72 20 63 61 63  CKey. */.var cac
0140: 6b 65 79 46 65 61 74 75 72 65 73 20 3d 20 7b 0a  keyFeatures = {.
0150: 09 63 75 73 74 6f 6d 50 49 4e 50 72 6f 6d 70 74  .customPINPrompt
0160: 3a 20 74 72 75 65 0a 7d 3b 0a 0a 2f 2a 0a 20 2a  : true.};../*. *
0170: 20 48 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   Handle for the 
0180: 43 41 43 4b 65 79 20 4e 61 43 6c 20 54 61 72 67  CACKey NaCl Targ
0190: 65 74 0a 20 2a 2f 0a 76 61 72 20 63 61 63 6b 65  et. */.var cacke
01a0: 79 48 61 6e 64 6c 65 20 3d 20 6e 75 6c 6c 3b 0a  yHandle = null;.
01b0: 76 61 72 20 63 61 63 6b 65 79 50 43 53 43 48 61  var cackeyPCSCHa
01c0: 6e 64 6c 65 20 3d 20 6e 75 6c 6c 3b 0a 76 61 72  ndle = null;.var
01d0: 20 63 61 63 6b 65 79 50 43 53 43 48 61 6e 64 6c   cackeyPCSCHandl
01e0: 65 55 73 61 62 6c 65 20 3d 20 66 61 6c 73 65 3b  eUsable = false;
01f0: 0a 76 61 72 20 63 61 63 6b 65 79 50 43 53 43 48  .var cackeyPCSCH
0200: 61 6e 64 6c 65 4c 61 73 74 55 73 65 64 20 3d 20  andleLastUsed = 
0210: 28 6e 65 77 20 44 61 74 65 28 29 29 2e 67 65 74  (new Date()).get
0220: 54 69 6d 65 28 29 3b 0a 0a 2f 2a 0a 20 2a 20 48  Time();../*. * H
0230: 61 6e 64 6c 65 20 61 6e 64 20 49 44 20 66 6f 72  andle and ID for
0240: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 61 6c   outstanding cal
0250: 6c 62 61 63 6b 73 0a 20 2a 2f 0a 76 61 72 20 63  lbacks. */.var c
0260: 61 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67  ackeyOutstanding
0270: 43 61 6c 6c 62 61 63 6b 73 20 3d 20 7b 7d 0a 76  Callbacks = {}.v
0280: 61 72 20 63 61 63 6b 65 79 4f 75 74 73 74 61 6e  ar cackeyOutstan
0290: 64 69 6e 67 43 61 6c 6c 62 61 63 6b 43 6f 75 6e  dingCallbackCoun
02a0: 74 65 72 20 3d 20 2d 31 3b 0a 0a 2f 2a 0a 20 2a  ter = -1;../*. *
02b0: 20 43 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 20 77   Communication w
02c0: 69 74 68 20 74 68 65 20 50 49 4e 20 65 6e 74 72  ith the PIN entr
02d0: 79 20 77 69 6e 64 6f 77 0a 20 2a 2f 0a 76 61 72  y window. */.var
02e0: 20 70 69 6e 57 69 6e 64 6f 77 50 49 4e 56 61 6c   pinWindowPINVal
02f0: 75 65 20 3d 20 22 22 3b 0a 76 61 72 20 70 69 6e  ue = "";.var pin
0300: 57 69 6e 64 6f 77 50 72 65 76 69 6f 75 73 48 61  WindowPreviousHa
0310: 6e 64 6c 65 20 3d 20 6e 75 6c 6c 3b 0a 0a 2f 2a  ndle = null;../*
0320: 0a 20 2a 20 4d 65 73 73 61 67 65 73 20 74 68 61  . * Messages tha
0330: 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
0340: 20 72 65 74 72 69 65 64 20 61 66 74 65 72 20 67   retried after g
0350: 65 74 74 69 6e 67 20 61 20 50 49 4e 0a 20 2a 2f  etting a PIN. */
0360: 0a 76 61 72 20 63 61 63 6b 65 79 4d 65 73 73 61  .var cackeyMessa
0370: 67 65 73 54 6f 52 65 74 72 79 20 3d 20 5b 5d 3b  gesToRetry = [];
0380: 0a 0a 2f 2a 0a 20 2a 20 53 74 6f 72 65 64 20 50  ../*. * Stored P
0390: 49 4e 20 66 6f 72 20 61 20 67 69 76 65 6e 20 63  IN for a given c
03a0: 65 72 74 69 66 69 63 61 74 65 0a 20 2a 2f 0a 76  ertificate. */.v
03b0: 61 72 20 63 61 63 6b 65 79 43 65 72 74 69 66 69  ar cackeyCertifi
03c0: 63 61 74 65 54 6f 50 49 4e 4d 61 70 20 3d 20 7b  cateToPINMap = {
03d0: 7d 3b 0a 76 61 72 20 63 61 63 6b 65 79 43 65 72  };.var cackeyCer
03e0: 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d 61 70  tificateToPINMap
03f0: 4c 61 73 74 55 73 65 64 52 75 6e 6e 65 72 20 3d  LastUsedRunner =
0400: 20 66 61 6c 73 65 3b 0a 0a 2f 2a 0a 20 2a 20 43   false;../*. * C
0410: 61 6c 6c 62 61 63 6b 73 20 74 6f 20 70 65 72 66  allbacks to perf
0420: 6f 72 6d 20 61 66 74 65 72 20 50 43 53 43 20 63  orm after PCSC c
0430: 6f 6d 65 73 20 6f 6e 6c 69 6e 65 0a 20 2a 2f 0a  omes online. */.
0440: 63 61 63 6b 65 79 43 61 6c 6c 62 61 63 6b 41 66  cackeyCallbackAf
0450: 74 65 72 49 6e 69 74 20 3d 20 5b 5d 3b 0a 0a 2f  terInit = [];../
0460: 2a 0a 20 2a 20 43 6f 6d 70 75 74 65 20 61 20 74  *. * Compute a t
0470: 65 78 74 2d 62 61 73 65 64 20 68 61 6e 64 6c 65  ext-based handle
0480: 20 66 6f 72 20 61 20 63 65 72 74 69 66 69 63 61   for a certifica
0490: 74 65 20 74 6f 20 62 65 20 68 61 73 68 65 64 20  te to be hashed 
04a0: 62 79 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20  by. */.function 
04b0: 63 61 63 6b 65 79 43 65 72 74 69 66 69 63 61 74  cackeyCertificat
04c0: 65 54 6f 50 49 4e 49 44 28 63 65 72 74 69 66 69  eToPINID(certifi
04d0: 63 61 74 65 29 20 7b 0a 09 76 61 72 20 69 64 3b  cate) {..var id;
04e0: 0a 09 76 61 72 20 63 65 72 74 69 66 69 63 61 74  ..var certificat
04f0: 65 41 72 72 61 79 3b 0a 0a 09 69 64 20 3d 20 22  eArray;...id = "
0500: 22 3b 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65  ";...certificate
0510: 41 72 72 61 79 20 3d 20 6e 65 77 20 55 69 6e 74  Array = new Uint
0520: 38 41 72 72 61 79 28 63 65 72 74 69 66 69 63 61  8Array(certifica
0530: 74 65 29 3b 0a 0a 09 63 65 72 74 69 66 69 63 61  te);...certifica
0540: 74 65 41 72 72 61 79 2e 6d 61 70 28 0a 09 09 66  teArray.map(...f
0550: 75 6e 63 74 69 6f 6e 28 62 79 74 65 29 20 7b 0a  unction(byte) {.
0560: 09 09 09 69 64 20 2b 3d 20 28 22 30 22 20 2b 20  ...id += ("0" + 
0570: 62 79 74 65 2e 74 6f 53 74 72 69 6e 67 28 31 36  byte.toString(16
0580: 29 29 2e 73 6c 69 63 65 28 2d 32 29 3b 0a 09 09  )).slice(-2);...
0590: 7d 0a 09 29 3b 0a 0a 09 64 65 6c 65 74 65 20 63  }..);...delete c
05a0: 65 72 74 69 66 69 63 61 74 65 41 72 72 61 79 3b  ertificateArray;
05b0: 0a 0a 09 72 65 74 75 72 6e 28 69 64 29 3b 0a 7d  ...return(id);.}
05c0: 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65 20 61  ../*. * Handle a
05d0: 20 72 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 74   response from t
05e0: 68 65 20 4e 61 43 6c 20 73 69 64 65 20 72 65 67  he NaCl side reg
05f0: 61 72 64 69 6e 67 20 63 65 72 74 69 66 69 63 61  arding certifica
0600: 74 65 73 20 61 76 61 69 6c 61 62 6c 65 0a 20 2a  tes available. *
0610: 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65  /.function cacke
0620: 79 4d 65 73 73 61 67 65 49 6e 63 6f 6d 69 6e 67  yMessageIncoming
0630: 4c 69 73 74 43 65 72 74 69 66 69 63 61 74 65 73  ListCertificates
0640: 28 6d 65 73 73 61 67 65 2c 20 63 68 72 6f 6d 65  (message, chrome
0650: 43 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 76 61 72  Callback) {..var
0660: 20 69 64 78 3b 0a 09 76 61 72 20 63 65 72 74 69   idx;..var certi
0670: 66 69 63 61 74 65 73 20 3d 20 5b 5d 3b 0a 0a 09  ficates = [];...
0680: 69 66 20 28 21 63 68 72 6f 6d 65 43 61 6c 6c 62  if (!chromeCallb
0690: 61 63 6b 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  ack) {...return;
06a0: 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
06b0: 20 30 3b 20 69 64 78 20 3c 20 6d 65 73 73 61 67   0; idx < messag
06c0: 65 2e 63 65 72 74 69 66 69 63 61 74 65 73 2e 6c  e.certificates.l
06d0: 65 6e 67 74 68 3b 20 69 64 78 2b 2b 29 20 7b 0a  ength; idx++) {.
06e0: 09 09 63 65 72 74 69 66 69 63 61 74 65 73 2e 70  ..certificates.p
06f0: 75 73 68 28 0a 09 09 09 7b 0a 09 09 09 09 63 65  ush(....{.....ce
0700: 72 74 69 66 69 63 61 74 65 3a 20 6d 65 73 73 61  rtificate: messa
0710: 67 65 2e 63 65 72 74 69 66 69 63 61 74 65 73 5b  ge.certificates[
0720: 69 64 78 5d 2c 0a 09 09 09 09 73 75 70 70 6f 72  idx],.....suppor
0730: 74 65 64 48 61 73 68 65 73 3a 20 5b 27 53 48 41  tedHashes: ['SHA
0740: 31 27 2c 20 27 53 48 41 32 35 36 27 2c 20 27 53  1', 'SHA256', 'S
0750: 48 41 35 31 32 27 2c 20 27 4d 44 35 5f 53 48 41  HA512', 'MD5_SHA
0760: 31 27 5d 0a 09 09 09 7d 0a 09 09 29 3b 0a 09 7d  1']....}...);..}
0770: 0a 0a 09 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63  ...chromeCallbac
0780: 6b 28 63 65 72 74 69 66 69 63 61 74 65 73 2c 0a  k(certificates,.
0790: 09 09 66 75 6e 63 74 69 6f 6e 28 72 65 6a 65 63  ..function(rejec
07a0: 74 65 64 43 65 72 74 73 29 20 7b 0a 09 09 09 69  tedCerts) {....i
07b0: 66 20 28 63 68 72 6f 6d 65 2e 72 75 6e 74 69 6d  f (chrome.runtim
07c0: 65 2e 6c 61 73 74 45 72 72 6f 72 29 20 7b 0a 09  e.lastError) {..
07d0: 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09 7d 0a  ...return;....}.
07e0: 0a 09 09 09 69 66 20 28 72 65 6a 65 63 74 65 64  ....if (rejected
07f0: 43 65 72 74 73 2e 6c 65 6e 67 74 68 20 21 3d 3d  Certs.length !==
0800: 20 30 29 20 7b 0a 09 09 09 09 6f 6e 43 65 72 74   0) {.....onCert
0810: 69 66 69 63 61 74 65 73 52 65 6a 65 63 74 65 64  ificatesRejected
0820: 28 72 65 6a 65 63 74 65 64 43 65 72 74 73 29 3b  (rejectedCerts);
0830: 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
0840: 3b 0a 09 09 7d 0a 09 29 3b 0a 0a 09 72 65 74 75  ;...}..);...retu
0850: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48 61 6e  rn;.}../*. * Han
0860: 64 6c 65 20 61 20 72 65 73 70 6f 6e 73 65 20 66  dle a response f
0870: 72 6f 6d 20 74 68 65 20 4e 61 43 6c 20 73 69 64  rom the NaCl sid
0880: 65 20 72 65 67 61 72 64 69 6e 67 20 61 20 6c 69  e regarding a li
0890: 73 74 20 6f 66 20 72 65 61 64 65 72 73 0a 20 2a  st of readers. *
08a0: 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65  /.function cacke
08b0: 79 4d 65 73 73 61 67 65 49 6e 63 6f 6d 69 6e 67  yMessageIncoming
08c0: 4c 69 73 74 52 65 61 64 65 72 73 28 6d 65 73 73  ListReaders(mess
08d0: 61 67 65 2c 20 63 68 72 6f 6d 65 43 61 6c 6c 62  age, chromeCallb
08e0: 61 63 6b 29 20 7b 0a 09 69 66 20 28 21 63 68 72  ack) {..if (!chr
08f0: 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 20 7b 0a 09  omeCallback) {..
0900: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 63 68  .return;..}...ch
0910: 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 28 6d 65 73  romeCallback(mes
0920: 73 61 67 65 2e 72 65 61 64 65 72 73 29 3b 0a 0a  sage.readers);..
0930: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
0940: 2a 20 48 61 6e 64 6c 65 20 61 20 72 65 73 70 6f  * Handle a respo
0950: 6e 73 65 20 66 72 6f 6d 20 74 68 65 20 4e 61 43  nse from the NaC
0960: 6c 20 73 69 64 65 20 72 65 67 61 72 64 69 6e 67  l side regarding
0970: 20 73 69 67 6e 69 6e 67 20 61 20 6d 65 73 73 61   signing a messa
0980: 67 65 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20  ge. */.function 
0990: 63 61 63 6b 65 79 4d 65 73 73 61 67 65 49 6e 63  cackeyMessageInc
09a0: 6f 6d 69 6e 67 53 69 67 6e 4d 65 73 73 61 67 65  omingSignMessage
09b0: 28 6d 65 73 73 61 67 65 2c 20 63 68 72 6f 6d 65  (message, chrome
09c0: 43 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 76 61 72  Callback) {..var
09d0: 20 70 61 79 6c 6f 61 64 3b 0a 0a 09 69 66 20 28   payload;...if (
09e0: 21 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29  !chromeCallback)
09f0: 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a   {...return;..}.
0a00: 0a 09 70 61 79 6c 6f 61 64 20 3d 20 6d 65 73 73  ..payload = mess
0a10: 61 67 65 2e 73 69 67 6e 65 64 44 61 74 61 3b 0a  age.signedData;.
0a20: 0a 09 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b  ..chromeCallback
0a30: 28 70 61 79 6c 6f 61 64 29 3b 0a 0a 09 72 65 74  (payload);...ret
0a40: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 70  urn;.}../*. * Up
0a50: 64 61 74 65 20 74 68 65 20 74 69 6d 65 20 61 20  date the time a 
0a60: 50 49 4e 20 77 61 73 20 6c 61 73 74 20 75 73 65  PIN was last use
0a70: 64 20 66 6f 72 20 61 20 63 65 72 74 69 66 69 63  d for a certific
0a80: 61 74 65 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e  ate. */.function
0a90: 20 63 61 63 6b 65 79 43 65 72 74 69 66 69 63 61   cackeyCertifica
0aa0: 74 65 54 6f 50 49 4e 4d 61 70 55 70 64 61 74 65  teToPINMapUpdate
0ab0: 4c 61 73 74 55 73 65 64 28 69 64 29 20 7b 0a 09  LastUsed(id) {..
0ac0: 69 66 20 28 69 64 20 21 3d 20 6e 75 6c 6c 29 20  if (id != null) 
0ad0: 7b 0a 09 09 63 61 63 6b 65 79 43 65 72 74 69 66  {...cackeyCertif
0ae0: 69 63 61 74 65 54 6f 50 49 4e 4d 61 70 5b 69 64  icateToPINMap[id
0af0: 5d 2e 6c 61 73 74 55 73 65 64 20 3d 20 28 6e 65  ].lastUsed = (ne
0b00: 77 20 44 61 74 65 28 29 29 2e 67 65 74 54 69 6d  w Date()).getTim
0b10: 65 28 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  e();..}...if (!c
0b20: 61 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65  ackeyCertificate
0b30: 54 6f 50 49 4e 4d 61 70 4c 61 73 74 55 73 65 64  ToPINMapLastUsed
0b40: 52 75 6e 6e 65 72 29 20 7b 0a 09 09 63 61 63 6b  Runner) {...cack
0b50: 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50  eyCertificateToP
0b60: 49 4e 4d 61 70 4c 61 73 74 55 73 65 64 52 75 6e  INMapLastUsedRun
0b70: 6e 65 72 20 3d 20 74 72 75 65 3b 0a 0a 09 09 73  ner = true;....s
0b80: 65 74 54 69 6d 65 6f 75 74 28 66 75 6e 63 74 69  etTimeout(functi
0b90: 6f 6e 28 29 20 7b 0a 09 09 09 76 61 72 20 63 75  on() {....var cu
0ba0: 72 72 65 6e 74 54 69 6d 65 3b 0a 09 09 09 76 61  rrentTime;....va
0bb0: 72 20 63 65 72 74 69 66 69 63 61 74 65 73 2c 20  r certificates, 
0bc0: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09  certificate;....
0bd0: 76 61 72 20 69 64 78 3b 0a 0a 09 09 09 63 75 72  var idx;.....cur
0be0: 72 65 6e 74 54 69 6d 65 20 3d 20 28 6e 65 77 20  rentTime = (new 
0bf0: 44 61 74 65 28 29 29 2e 67 65 74 54 69 6d 65 28  Date()).getTime(
0c00: 29 3b 0a 0a 09 09 09 63 65 72 74 69 66 69 63 61  );.....certifica
0c10: 74 65 73 20 3d 20 4f 62 6a 65 63 74 2e 6b 65 79  tes = Object.key
0c20: 73 28 63 61 63 6b 65 79 43 65 72 74 69 66 69 63  s(cackeyCertific
0c30: 61 74 65 54 6f 50 49 4e 4d 61 70 29 3b 0a 0a 09  ateToPINMap);...
0c40: 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 4c  ..console.log("L
0c50: 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 49 4e 73 20  ooking for PINs 
0c60: 74 6f 20 63 6c 65 61 72 22 29 3b 0a 0a 09 09 09  to clear");.....
0c70: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
0c80: 78 20 3c 20 63 65 72 74 69 66 69 63 61 74 65 73  x < certificates
0c90: 2e 6c 65 6e 67 74 68 3b 20 69 64 78 2b 2b 29 20  .length; idx++) 
0ca0: 7b 0a 09 09 09 09 63 65 72 74 69 66 69 63 61 74  {.....certificat
0cb0: 65 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 73  e = certificates
0cc0: 5b 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28  [idx];......if (
0cd0: 28 63 61 63 6b 65 79 43 65 72 74 69 66 69 63 61  (cackeyCertifica
0ce0: 74 65 54 6f 50 49 4e 4d 61 70 5b 63 65 72 74 69  teToPINMap[certi
0cf0: 66 69 63 61 74 65 5d 2e 6c 61 73 74 55 73 65 64  ficate].lastUsed
0d00: 20 2b 20 39 30 30 30 30 30 29 20 3e 20 63 75 72   + 900000) > cur
0d10: 72 65 6e 74 54 69 6d 65 29 20 7b 0a 09 09 09 09  rentTime) {.....
0d20: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d  .continue;.....}
0d30: 0a 0a 09 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f  ......console.lo
0d40: 67 28 22 44 65 6c 65 74 65 74 69 6e 67 20 22 20  g("Deleteting " 
0d50: 2b 20 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a  + certificate);.
0d60: 0a 09 09 09 09 64 65 6c 65 74 65 20 63 61 63 6b  .....delete cack
0d70: 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50  eyCertificateToP
0d80: 49 4e 4d 61 70 5b 63 65 72 74 69 66 69 63 61 74  INMap[certificat
0d90: 65 5d 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 65 72  e];....}.....cer
0da0: 74 69 66 69 63 61 74 65 73 20 3d 20 4f 62 6a 65  tificates = Obje
0db0: 63 74 2e 6b 65 79 73 28 63 61 63 6b 65 79 43 65  ct.keys(cackeyCe
0dc0: 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d 61  rtificateToPINMa
0dd0: 70 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 43 65  p);.....cackeyCe
0de0: 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d 61  rtificateToPINMa
0df0: 70 4c 61 73 74 55 73 65 64 52 75 6e 6e 65 72 20  pLastUsedRunner 
0e00: 3d 20 66 61 6c 73 65 3b 0a 0a 09 09 09 69 66 20  = false;.....if 
0e10: 28 63 65 72 74 69 66 69 63 61 74 65 73 2e 6c 65  (certificates.le
0e20: 6e 67 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 09  ngth == 0) {....
0e30: 09 72 65 74 75 72 6e 3b 0a 09 09 09 7d 0a 0a 09  .return;....}...
0e40: 09 09 63 61 63 6b 65 79 43 65 72 74 69 66 69 63  ..cackeyCertific
0e50: 61 74 65 54 6f 50 49 4e 4d 61 70 55 70 64 61 74  ateToPINMapUpdat
0e60: 65 4c 61 73 74 55 73 65 64 28 6e 75 6c 6c 29 3b  eLastUsed(null);
0e70: 0a 09 09 7d 2c 20 39 30 30 30 30 30 29 3b 0a 09  ...}, 900000);..
0e80: 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c  }.}../*. * Handl
0e90: 65 20 72 65 64 69 73 70 61 74 63 68 69 6e 67 20  e redispatching 
0ea0: 72 65 71 75 65 73 74 73 20 61 66 74 65 72 20 72  requests after r
0eb0: 65 63 65 69 76 69 6e 67 20 61 20 50 49 4e 0a 20  eceiving a PIN. 
0ec0: 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b  */.function cack
0ed0: 65 79 50 49 4e 50 72 6f 6d 70 74 43 6f 6d 70 6c  eyPINPromptCompl
0ee0: 65 74 65 64 28 70 69 6e 56 61 6c 75 65 29 20 7b  eted(pinValue) {
0ef0: 0a 09 76 61 72 20 74 6d 70 4d 65 73 73 61 67 65  ..var tmpMessage
0f00: 45 76 65 6e 74 3b 0a 0a 09 66 6f 72 20 28 6d 65  Event;...for (me
0f10: 73 73 61 67 65 49 64 78 20 3d 20 30 3b 20 6d 65  ssageIdx = 0; me
0f20: 73 73 61 67 65 49 64 78 20 3c 20 63 61 63 6b 65  ssageIdx < cacke
0f30: 79 4d 65 73 73 61 67 65 73 54 6f 52 65 74 72 79  yMessagesToRetry
0f40: 2e 6c 65 6e 67 74 68 3b 20 6d 65 73 73 61 67 65  .length; message
0f50: 49 64 78 2b 2b 29 20 7b 0a 09 09 74 6d 70 4d 65  Idx++) {...tmpMe
0f60: 73 73 61 67 65 45 76 65 6e 74 20 3d 20 63 61 63  ssageEvent = cac
0f70: 6b 65 79 4d 65 73 73 61 67 65 73 54 6f 52 65 74  keyMessagesToRet
0f80: 72 79 5b 6d 65 73 73 61 67 65 49 64 78 5d 3b 0a  ry[messageIdx];.
0f90: 0a 09 09 69 66 20 28 70 69 6e 56 61 6c 75 65 20  ...if (pinValue 
0fa0: 3d 3d 20 22 22 29 20 7b 0a 09 09 09 69 66 20 28  == "") {....if (
0fb0: 67 6f 6f 67 2e 44 45 42 55 47 29 20 7b 0a 09 09  goog.DEBUG) {...
0fc0: 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b  ..console.log("[
0fd0: 63 61 63 6b 65 79 5d 20 54 68 65 20 50 49 4e 20  cackey] The PIN 
0fe0: 64 69 61 6c 6f 67 20 77 61 73 20 63 6c 6f 73 65  dialog was close
0ff0: 64 20 77 69 74 68 6f 75 74 20 67 61 74 68 65 72  d without gather
1000: 69 6e 67 20 61 20 50 49 4e 2c 20 74 72 65 61 74  ing a PIN, treat
1010: 69 6e 67 20 69 74 20 61 73 20 61 20 66 61 69 6c  ing it as a fail
1020: 75 72 65 2e 22 29 3b 0a 09 09 09 7d 0a 0a 09 09  ure.");....}....
1030: 09 74 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74  .tmpMessageEvent
1040: 2e 64 61 74 61 2e 73 74 61 74 75 73 20 3d 20 22  .data.status = "
1050: 65 72 72 6f 72 22 3b 0a 09 09 09 74 6d 70 4d 65  error";....tmpMe
1060: 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e  ssageEvent.data.
1070: 65 72 72 6f 72 20 3d 20 22 50 49 4e 20 77 69 6e  error = "PIN win
1080: 64 6f 77 20 63 6c 6f 73 65 64 20 77 69 74 68 6f  dow closed witho
1090: 75 74 20 61 20 50 49 4e 20 62 65 69 6e 67 20 70  ut a PIN being p
10a0: 72 6f 76 69 64 65 64 22 3b 0a 0a 09 09 09 63 61  rovided";.....ca
10b0: 63 6b 65 79 4d 65 73 73 61 67 65 49 6e 63 6f 6d  ckeyMessageIncom
10c0: 69 6e 67 28 74 6d 70 4d 65 73 73 61 67 65 45 76  ing(tmpMessageEv
10d0: 65 6e 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  ent);...} else {
10e0: 0a 09 09 09 74 6d 70 4d 65 73 73 61 67 65 45 76  ....tmpMessageEv
10f0: 65 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69 6e 61  ent.data.origina
1100: 6c 72 65 71 75 65 73 74 2e 70 69 6e 20 3d 20 70  lrequest.pin = p
1110: 69 6e 56 61 6c 75 65 3b 0a 0a 09 09 09 63 61 63  inValue;.....cac
1120: 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f  keyCertificateTo
1130: 50 49 4e 4d 61 70 5b 63 61 63 6b 65 79 43 65 72  PINMap[cackeyCer
1140: 74 69 66 69 63 61 74 65 54 6f 50 49 4e 49 44 28  tificateToPINID(
1150: 74 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74 2e  tmpMessageEvent.
1160: 64 61 74 61 2e 6f 72 69 67 69 6e 61 6c 72 65 71  data.originalreq
1170: 75 65 73 74 2e 63 65 72 74 69 66 69 63 61 74 65  uest.certificate
1180: 29 5d 20 3d 20 7b 7d 0a 09 09 09 63 61 63 6b 65  )] = {}....cacke
1190: 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49  yCertificateToPI
11a0: 4e 4d 61 70 5b 63 61 63 6b 65 79 43 65 72 74 69  NMap[cackeyCerti
11b0: 66 69 63 61 74 65 54 6f 50 49 4e 49 44 28 74 6d  ficateToPINID(tm
11c0: 70 4d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61  pMessageEvent.da
11d0: 74 61 2e 6f 72 69 67 69 6e 61 6c 72 65 71 75 65  ta.originalreque
11e0: 73 74 2e 63 65 72 74 69 66 69 63 61 74 65 29 5d  st.certificate)]
11f0: 2e 70 69 6e 20 3d 20 70 69 6e 56 61 6c 75 65 3b  .pin = pinValue;
1200: 0a 09 09 09 63 61 63 6b 65 79 43 65 72 74 69 66  ....cackeyCertif
1210: 69 63 61 74 65 54 6f 50 49 4e 4d 61 70 55 70 64  icateToPINMapUpd
1220: 61 74 65 4c 61 73 74 55 73 65 64 28 63 61 63 6b  ateLastUsed(cack
1230: 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50  eyCertificateToP
1240: 49 4e 49 44 28 74 6d 70 4d 65 73 73 61 67 65 45  INID(tmpMessageE
1250: 76 65 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69 6e  vent.data.origin
1260: 61 6c 72 65 71 75 65 73 74 2e 63 65 72 74 69 66  alrequest.certif
1270: 69 63 61 74 65 29 29 3b 0a 0a 09 09 09 63 68 72  icate));.....chr
1280: 6f 6d 65 43 61 6c 6c 62 61 63 6b 20 3d 20 6e 75  omeCallback = nu
1290: 6c 6c 3b 0a 09 09 09 69 66 20 28 74 6d 70 4d 65  ll;....if (tmpMe
12a0: 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e  ssageEvent.data.
12b0: 69 64 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61  id) {.....if (ca
12c0: 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43  ckeyOutstandingC
12d0: 61 6c 6c 62 61 63 6b 73 29 20 7b 0a 09 09 09 09  allbacks) {.....
12e0: 09 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 20  .chromeCallback 
12f0: 3d 20 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64  = cackeyOutstand
1300: 69 6e 67 43 61 6c 6c 62 61 63 6b 73 5b 74 6d 70  ingCallbacks[tmp
1310: 4d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74  MessageEvent.dat
1320: 61 2e 69 64 5d 3b 0a 09 09 09 09 7d 0a 09 09 09  a.id];.....}....
1330: 7d 0a 0a 09 09 09 63 61 63 6b 65 79 49 6e 69 74  }.....cackeyInit
1340: 50 43 53 43 28 66 75 6e 63 74 69 6f 6e 28 29 20  PCSC(function() 
1350: 7b 0a 09 09 09 09 63 61 63 6b 65 79 48 61 6e 64  {.....cackeyHand
1360: 6c 65 2e 70 6f 73 74 4d 65 73 73 61 67 65 28 74  le.postMessage(t
1370: 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74 2e 64  mpMessageEvent.d
1380: 61 74 61 2e 6f 72 69 67 69 6e 61 6c 72 65 71 75  ata.originalrequ
1390: 65 73 74 29 3b 0a 09 09 09 7d 2c 20 66 75 6e 63  est);....}, func
13a0: 74 69 6f 6e 28 29 20 7b 0a 09 09 09 09 69 66 20  tion() {.....if 
13b0: 28 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29  (chromeCallback)
13c0: 20 7b 0a 09 09 09 09 09 63 68 72 6f 6d 65 43 61   {......chromeCa
13d0: 6c 6c 62 61 63 6b 28 29 3b 0a 09 09 09 09 7d 0a  llback();.....}.
13e0: 0a 09 09 09 09 69 66 20 28 74 6d 70 4d 65 73 73  .....if (tmpMess
13f0: 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 69 64  ageEvent.data.id
1400: 20 26 26 20 63 61 63 6b 65 79 4f 75 74 73 74 61   && cackeyOutsta
1410: 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73 5b 74  ndingCallbacks[t
1420: 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74 2e 64  mpMessageEvent.d
1430: 61 74 61 2e 69 64 5d 29 20 7b 0a 09 09 09 09 09  ata.id]) {......
1440: 64 65 6c 65 74 65 20 63 61 63 6b 65 79 4f 75 74  delete cackeyOut
1450: 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b  standingCallback
1460: 73 5b 74 6d 70 4d 65 73 73 61 67 65 45 76 65 6e  s[tmpMessageEven
1470: 74 2e 64 61 74 61 2e 69 64 5d 3b 0a 09 09 09 09  t.data.id];.....
1480: 7d 0a 09 09 09 7d 29 3b 0a 09 09 7d 0a 09 7d 0a  }....});...}..}.
1490: 0a 09 2f 2a 0a 09 20 2a 20 44 65 6c 65 74 65 20  ../*.. * Delete 
14a0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 68 61 6e  the existing han
14b0: 64 6c 65 20 61 6e 64 20 63 72 65 61 74 65 20 61  dle and create a
14c0: 20 6e 65 77 20 6f 6e 65 0a 09 20 2a 2f 0a 09 64   new one.. */..d
14d0: 65 6c 65 74 65 20 63 61 63 6b 65 79 4d 65 73 73  elete cackeyMess
14e0: 61 67 65 73 54 6f 52 65 74 72 79 3b 0a 0a 09 63  agesToRetry;...c
14f0: 61 63 6b 65 79 4d 65 73 73 61 67 65 73 54 6f 52  ackeyMessagesToR
1500: 65 74 72 79 20 3d 20 5b 5d 3b 0a 7d 0a 0a 2f 2a  etry = [];.}../*
1510: 0a 20 2a 20 48 61 6e 64 6c 65 20 61 6e 20 69 6e  . * Handle an in
1520: 63 6f 6d 69 6e 67 20 6d 65 73 73 61 67 65 20 66  coming message f
1530: 72 6f 6d 20 74 68 65 20 4e 61 43 6c 20 73 69 64  rom the NaCl sid
1540: 65 20 61 6e 64 20 70 61 73 73 20 69 74 20 6f 66  e and pass it of
1550: 66 20 74 6f 0a 20 2a 20 6f 6e 65 20 6f 66 20 74  f to. * one of t
1560: 68 65 20 68 61 6e 64 6c 65 72 73 20 61 62 6f 76  he handlers abov
1570: 65 20 66 6f 72 20 61 63 74 75 61 6c 20 66 6f 72  e for actual for
1580: 6d 61 74 74 69 6e 67 20 61 6e 64 20 70 61 73 73  matting and pass
1590: 69 6e 67 20 74 6f 0a 20 2a 20 74 68 65 20 63 61  ing to. * the ca
15a0: 6c 6c 62 61 63 6b 0a 20 2a 0a 20 2a 20 49 66 20  llback. *. * If 
15b0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
15c0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c  , invoke the cal
15d0: 6c 62 61 63 6b 20 77 69 74 68 20 6e 6f 20 61 72  lback with no ar
15e0: 67 75 6d 65 6e 74 73 2e 0a 20 2a 2f 0a 66 75 6e  guments.. */.fun
15f0: 63 74 69 6f 6e 20 63 61 63 6b 65 79 4d 65 73 73  ction cackeyMess
1600: 61 67 65 49 6e 63 6f 6d 69 6e 67 28 6d 65 73 73  ageIncoming(mess
1610: 61 67 65 45 76 65 6e 74 29 20 7b 0a 09 76 61 72  ageEvent) {..var
1620: 20 6e 65 78 74 46 75 6e 63 74 69 6f 6e 20 3d 20   nextFunction = 
1630: 6e 75 6c 6c 3b 0a 09 76 61 72 20 63 68 72 6f 6d  null;..var chrom
1640: 65 43 61 6c 6c 62 61 63 6b 20 3d 20 6e 75 6c 6c  eCallback = null
1650: 3b 0a 0a 09 69 66 20 28 6d 65 73 73 61 67 65 45  ;...if (messageE
1660: 76 65 6e 74 2e 64 61 74 61 2e 74 61 72 67 65 74  vent.data.target
1670: 20 21 3d 20 22 63 61 63 6b 65 79 22 29 20 7b 0a   != "cackey") {.
1680: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 69  ..return;..}...i
1690: 66 20 28 67 6f 6f 67 2e 44 45 42 55 47 29 20 7b  f (goog.DEBUG) {
16a0: 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22  ...console.log("
16b0: 53 54 41 52 54 20 4d 45 53 53 41 47 45 22 29 3b  START MESSAGE");
16c0: 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 6d  ...console.log(m
16d0: 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61  essageEvent.data
16e0: 29 3b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67  );...console.log
16f0: 28 22 45 4e 44 20 4d 45 53 53 41 47 45 22 29 3b  ("END MESSAGE");
1700: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 49 66 20  ..}.../*.. * If 
1710: 77 65 20 66 61 69 6c 65 64 20 66 6f 72 20 73 6f  we failed for so
1720: 6d 65 20 72 65 61 73 6f 6e 20 61 6e 64 20 77 65  me reason and we
1730: 20 68 61 76 65 20 61 20 63 65 72 74 69 66 69 63   have a certific
1740: 61 74 65 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ate in the origi
1750: 6e 61 6c 0a 09 20 2a 20 72 65 71 75 65 73 74 20  nal.. * request 
1760: 74 68 65 6e 20 66 6f 72 67 65 74 20 61 6e 79 20  then forget any 
1770: 50 49 4e 20 61 73 73 6f 63 69 61 74 65 64 20 77  PIN associated w
1780: 69 74 68 20 74 68 61 74 20 63 65 72 74 69 66 69  ith that certifi
1790: 63 61 74 65 0a 09 20 2a 2f 0a 09 69 66 20 28 6d  cate.. */..if (m
17a0: 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61  essageEvent.data
17b0: 2e 73 74 61 74 75 73 20 21 3d 20 22 73 75 63 63  .status != "succ
17c0: 65 73 73 22 29 20 7b 0a 09 09 69 66 20 28 6d 65  ess") {...if (me
17d0: 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e  ssageEvent.data.
17e0: 6f 72 69 67 69 6e 61 6c 72 65 71 75 65 73 74 29  originalrequest)
17f0: 20 7b 0a 09 09 09 69 66 20 28 6d 65 73 73 61 67   {....if (messag
1800: 65 45 76 65 6e 74 2e 64 61 74 61 2e 6f 72 69 67  eEvent.data.orig
1810: 69 6e 61 6c 72 65 71 75 65 73 74 2e 63 65 72 74  inalrequest.cert
1820: 69 66 69 63 61 74 65 29 20 7b 0a 09 09 09 09 64  ificate) {.....d
1830: 65 6c 65 74 65 20 63 61 63 6b 65 79 43 65 72 74  elete cackeyCert
1840: 69 66 69 63 61 74 65 54 6f 50 49 4e 4d 61 70 5b  ificateToPINMap[
1850: 63 61 63 6b 65 79 43 65 72 74 69 66 69 63 61 74  cackeyCertificat
1860: 65 54 6f 50 49 4e 49 44 28 6d 65 73 73 61 67 65  eToPINID(message
1870: 45 76 65 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69  Event.data.origi
1880: 6e 61 6c 72 65 71 75 65 73 74 2e 63 65 72 74 69  nalrequest.certi
1890: 66 69 63 61 74 65 29 5d 3b 0a 09 09 09 7d 0a 09  ficate)];....}..
18a0: 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 65 73 73  .}..}...if (mess
18b0: 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 63 6f  ageEvent.data.co
18c0: 6d 6d 61 6e 64 20 3d 3d 20 22 69 6e 69 74 22 20  mmand == "init" 
18d0: 26 26 20 6d 65 73 73 61 67 65 45 76 65 6e 74 2e  && messageEvent.
18e0: 64 61 74 61 2e 73 74 61 74 75 73 20 3d 3d 20 22  data.status == "
18f0: 73 75 63 63 65 73 73 22 29 20 7b 0a 09 09 69 66  success") {...if
1900: 20 28 67 6f 6f 67 2e 44 45 42 55 47 29 20 7b 0a   (goog.DEBUG) {.
1910: 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22  ...console.log("
1920: 5b 63 61 63 6b 65 79 5d 20 49 6e 69 74 69 61 6c  [cackey] Initial
1930: 69 7a 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65  ization complete
1940: 64 2c 20 72 65 73 65 6e 64 69 6e 67 20 61 6e 79  d, resending any
1950: 20 71 75 65 75 65 64 20 6d 65 73 73 61 67 65 73   queued messages
1960: 22 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  ");...}....cacke
1970: 79 49 6e 69 74 50 43 53 43 43 6f 6d 70 6c 65 74  yInitPCSCComplet
1980: 65 64 28 22 73 75 63 63 65 73 73 22 29 3b 0a 09  ed("success");..
1990: 7d 0a 0a 09 69 66 20 28 6d 65 73 73 61 67 65 45  }...if (messageE
19a0: 76 65 6e 74 2e 64 61 74 61 2e 69 64 20 3d 3d 20  vent.data.id == 
19b0: 6e 75 6c 6c 29 20 7b 0a 09 09 72 65 74 75 72 6e  null) {...return
19c0: 3b 0a 09 7d 0a 0a 09 63 68 72 6f 6d 65 43 61 6c  ;..}...chromeCal
19d0: 6c 62 61 63 6b 20 3d 20 63 61 63 6b 65 79 4f 75  lback = cackeyOu
19e0: 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63  tstandingCallbac
19f0: 6b 73 5b 6d 65 73 73 61 67 65 45 76 65 6e 74 2e  ks[messageEvent.
1a00: 64 61 74 61 2e 69 64 5d 3b 0a 0a 09 69 66 20 28  data.id];...if (
1a10: 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 20 3d  chromeCallback =
1a20: 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09 63 6f 6e 73  = null) {...cons
1a30: 6f 6c 65 2e 65 72 72 6f 72 28 22 5b 63 61 63 6b  ole.error("[cack
1a40: 65 79 5d 20 44 69 73 63 61 72 64 69 6e 67 20 6f  ey] Discarding o
1a50: 75 74 64 61 74 65 64 20 6d 65 73 73 61 67 65 22  utdated message"
1a60: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  );....return;..}
1a70: 0a 0a 09 73 77 69 74 63 68 20 28 6d 65 73 73 61  ...switch (messa
1a80: 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 73 74 61  geEvent.data.sta
1a90: 74 75 73 29 20 7b 0a 09 09 63 61 73 65 20 22 65  tus) {...case "e
1aa0: 72 72 6f 72 22 3a 0a 09 09 09 63 6f 6e 73 6f 6c  rror":....consol
1ab0: 65 2e 65 72 72 6f 72 28 22 5b 63 61 63 6b 65 79  e.error("[cackey
1ac0: 5d 20 46 61 69 6c 65 64 20 74 6f 20 65 78 65 63  ] Failed to exec
1ad0: 75 74 65 20 63 6f 6d 6d 61 6e 64 20 27 22 20 2b  ute command '" +
1ae0: 20 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61   messageEvent.da
1af0: 74 61 2e 63 6f 6d 6d 61 6e 64 20 2b 20 22 27 3a  ta.command + "':
1b00: 20 22 20 2b 20 6d 65 73 73 61 67 65 45 76 65 6e   " + messageEven
1b10: 74 2e 64 61 74 61 2e 65 72 72 6f 72 29 3b 0a 0a  t.data.error);..
1b20: 09 09 09 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63  ...chromeCallbac
1b30: 6b 28 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  k();.....break;.
1b40: 09 09 63 61 73 65 20 22 72 65 74 72 79 22 3a 0a  ..case "retry":.
1b50: 09 09 09 2f 2a 0a 09 09 09 20 2a 20 41 64 64 20  .../*.... * Add 
1b60: 74 68 65 20 6e 65 77 20 72 65 71 75 65 73 74 20  the new request 
1b70: 74 6f 20 74 68 65 20 71 75 65 75 65 20 6f 66 20  to the queue of 
1b80: 65 76 65 6e 74 73 20 74 6f 20 70 72 6f 63 65 73  events to proces
1b90: 73 20 77 68 65 6e 20 74 68 65 20 50 49 4e 0a 09  s when the PIN..
1ba0: 09 09 20 2a 20 70 72 6f 6d 70 74 20 69 73 20 74  .. * prompt is t
1bb0: 65 72 6d 69 6e 61 74 65 64 2e 0a 09 09 09 20 2a  erminated..... *
1bc0: 2f 0a 09 09 09 63 61 63 6b 65 79 4d 65 73 73 61  /....cackeyMessa
1bd0: 67 65 73 54 6f 52 65 74 72 79 2e 70 75 73 68 28  gesToRetry.push(
1be0: 6d 65 73 73 61 67 65 45 76 65 6e 74 29 3b 0a 0a  messageEvent);..
1bf0: 09 09 09 69 66 20 28 70 69 6e 57 69 6e 64 6f 77  ...if (pinWindow
1c00: 50 72 65 76 69 6f 75 73 48 61 6e 64 6c 65 29 20  PreviousHandle) 
1c10: 7b 0a 09 09 09 09 2f 2a 0a 09 09 09 09 20 2a 20  {...../*..... * 
1c20: 41 6e 20 65 78 69 73 74 69 6e 67 20 50 49 4e 20  An existing PIN 
1c30: 65 6e 74 72 79 20 69 73 20 69 6e 20 70 72 6f 67  entry is in prog
1c40: 72 65 73 73 0a 09 09 09 09 20 2a 20 4a 75 73 74  ress..... * Just
1c50: 20 61 64 64 20 74 68 65 20 72 65 71 75 65 73 74   add the request
1c60: 20 74 6f 20 74 68 65 20 71 75 65 75 65 20 28 61   to the queue (a
1c70: 62 6f 76 65 29 20 61 6e 64 20 77 61 69 74 0a 09  bove) and wait..
1c80: 09 09 09 20 2a 2f 0a 0a 09 09 09 09 72 65 74 75  ... */......retu
1c90: 72 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 0a  rn;....}...../*.
1ca0: 09 09 09 20 2a 20 53 65 74 20 74 68 65 20 68 61  ... * Set the ha
1cb0: 6e 64 6c 65 20 74 6f 20 61 6e 20 69 6e 76 61 6c  ndle to an inval
1cc0: 69 64 20 28 62 75 74 20 6e 6f 6e 2d 6e 75 6c 6c  id (but non-null
1cd0: 29 20 76 61 6c 75 65 20 75 6e 74 69 6c 20 74 68  ) value until th
1ce0: 65 20 77 69 6e 64 6f 77 0a 09 09 09 20 2a 20 69  e window.... * i
1cf0: 73 20 63 72 65 61 74 65 64 20 69 6e 20 63 61 73  s created in cas
1d00: 65 20 77 65 20 61 72 65 20 69 6e 76 6f 6b 65 64  e we are invoked
1d10: 20 61 67 61 69 6e 20 73 6f 6f 6e 2e 0a 09 09 09   again soon.....
1d20: 20 2a 2f 0a 09 09 09 70 69 6e 57 69 6e 64 6f 77   */....pinWindow
1d30: 50 72 65 76 69 6f 75 73 48 61 6e 64 6c 65 20 3d  PreviousHandle =
1d40: 20 22 69 6e 76 61 6c 69 64 22 3b 0a 0a 09 09 09   "invalid";.....
1d50: 69 66 20 28 6d 65 73 73 61 67 65 45 76 65 6e 74  if (messageEvent
1d60: 2e 64 61 74 61 2e 6f 72 69 67 69 6e 61 6c 72 65  .data.originalre
1d70: 71 75 65 73 74 2e 73 69 67 6e 52 65 71 75 65 73  quest.signReques
1d80: 74 49 64 20 3d 3d 3d 20 6e 75 6c 6c 29 20 7b 0a  tId === null) {.
1d90: 09 09 09 09 63 68 72 6f 6d 65 2e 61 70 70 2e 77  ....chrome.app.w
1da0: 69 6e 64 6f 77 2e 63 72 65 61 74 65 28 22 70 69  indow.create("pi
1db0: 6e 2e 68 74 6d 6c 22 2c 20 7b 0a 09 09 09 09 09  n.html", {......
1dc0: 22 69 64 22 3a 20 22 63 61 63 6b 65 79 50 49 4e  "id": "cackeyPIN
1dd0: 45 6e 74 72 79 22 2c 0a 09 09 09 09 09 22 72 65  Entry",......"re
1de0: 73 69 7a 61 62 6c 65 22 3a 20 66 61 6c 73 65 2c  sizable": false,
1df0: 0a 09 09 09 09 09 22 61 6c 77 61 79 73 4f 6e 54  ......"alwaysOnT
1e00: 6f 70 22 3a 20 74 72 75 65 2c 0a 09 09 09 09 09  op": true,......
1e10: 22 66 6f 63 75 73 65 64 22 3a 20 74 72 75 65 2c  "focused": true,
1e20: 0a 09 09 09 09 09 22 76 69 73 69 62 6c 65 4f 6e  ......"visibleOn
1e30: 41 6c 6c 57 6f 72 6b 73 70 61 63 65 73 22 3a 20  AllWorkspaces": 
1e40: 74 72 75 65 2c 0a 09 09 09 09 09 22 69 6e 6e 65  true,......"inne
1e50: 72 42 6f 75 6e 64 73 22 3a 20 7b 0a 09 09 09 09  rBounds": {.....
1e60: 09 09 22 77 69 64 74 68 22 3a 20 33 35 30 2c 0a  .."width": 350,.
1e70: 09 09 09 09 09 09 22 6d 69 6e 57 69 64 74 68 22  ......"minWidth"
1e80: 3a 20 33 35 30 2c 0a 09 09 09 09 09 09 22 68 65  : 350,......."he
1e90: 69 67 68 74 22 3a 20 31 33 35 2c 0a 09 09 09 09  ight": 135,.....
1ea0: 09 09 22 6d 69 6e 48 65 69 67 68 74 22 3a 20 31  .."minHeight": 1
1eb0: 33 35 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 2c  35......}.....},
1ec0: 20 66 75 6e 63 74 69 6f 6e 28 70 69 6e 57 69 6e   function(pinWin
1ed0: 64 6f 77 29 20 7b 0a 09 09 09 09 09 2f 2a 0a 09  dow) {....../*..
1ee0: 09 09 09 09 20 2a 20 53 65 74 20 74 68 65 20 50  .... * Set the P
1ef0: 49 4e 20 76 61 6c 75 65 20 74 6f 20 62 6c 61 6e  IN value to blan
1f00: 6b 0a 09 09 09 09 09 20 2a 2f 0a 09 09 09 09 09  k...... */......
1f10: 70 69 6e 57 69 6e 64 6f 77 50 49 4e 56 61 6c 75  pinWindowPINValu
1f20: 65 20 3d 20 22 22 3b 0a 09 0a 09 09 09 09 09 69  e = "";........i
1f30: 66 20 28 21 70 69 6e 57 69 6e 64 6f 77 29 20 7b  f (!pinWindow) {
1f40: 0a 09 09 09 09 09 09 63 6f 6e 73 6f 6c 65 2e 65  .......console.e
1f50: 72 72 6f 72 28 22 5b 63 61 63 6b 65 79 5d 20 4e  rror("[cackey] N
1f60: 6f 20 77 69 6e 64 6f 77 20 77 61 73 20 70 72 6f  o window was pro
1f70: 76 69 64 65 64 20 66 6f 72 20 50 49 4e 20 65 6e  vided for PIN en
1f80: 74 72 79 2c 20 74 68 69 73 20 77 69 6c 6c 20 6e  try, this will n
1f90: 6f 74 20 67 6f 20 77 65 6c 6c 2e 22 29 3b 0a 09  ot go well.");..
1fa0: 0a 09 09 09 09 09 09 72 65 74 75 72 6e 3b 0a 09  .......return;..
1fb0: 09 09 09 09 7d 0a 09 0a 09 09 09 09 09 70 69 6e  ....}........pin
1fc0: 57 69 6e 64 6f 77 50 72 65 76 69 6f 75 73 48 61  WindowPreviousHa
1fd0: 6e 64 6c 65 20 3d 20 70 69 6e 57 69 6e 64 6f 77  ndle = pinWindow
1fe0: 3b 0a 0a 09 09 09 09 09 70 69 6e 57 69 6e 64 6f  ;.......pinWindo
1ff0: 77 2e 64 72 61 77 41 74 74 65 6e 74 69 6f 6e 28  w.drawAttention(
2000: 29 3b 0a 09 09 09 09 09 70 69 6e 57 69 6e 64 6f  );......pinWindo
2010: 77 2e 66 6f 63 75 73 28 29 3b 0a 09 0a 09 09 09  w.focus();......
2020: 09 09 2f 2a 0a 09 09 09 09 09 20 2a 20 52 65 67  ../*...... * Reg
2030: 69 73 74 65 72 20 61 20 68 61 6e 64 6c 65 72 20  ister a handler 
2040: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 77 69  to handle the wi
2050: 6e 64 6f 77 20 62 65 69 6e 67 20 63 6c 6f 73 65  ndow being close
2060: 64 20 77 69 74 68 6f 75 74 0a 09 09 09 09 09 20  d without...... 
2070: 2a 20 68 61 76 69 6e 67 20 73 65 6e 74 20 61 6e  * having sent an
2080: 79 74 68 69 6e 67 0a 09 09 09 09 09 20 2a 2f 0a  ything...... */.
2090: 09 09 09 09 09 70 69 6e 57 69 6e 64 6f 77 2e 6f  .....pinWindow.o
20a0: 6e 43 6c 6f 73 65 64 2e 61 64 64 4c 69 73 74 65  nClosed.addListe
20b0: 6e 65 72 28 66 75 6e 63 74 69 6f 6e 28 29 20 7b  ner(function() {
20c0: 0a 09 09 09 09 09 09 76 61 72 20 6d 65 73 73 61  .......var messa
20d0: 67 65 49 64 78 3b 0a 09 09 09 09 09 09 76 61 72  geIdx;.......var
20e0: 20 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 3b   chromeCallback;
20f0: 0a 09 09 09 09 09 09 76 61 72 20 70 69 6e 56 61  .......var pinVa
2100: 6c 75 65 3b 0a 09 0a 09 09 09 09 09 09 70 69 6e  lue;.........pin
2110: 57 69 6e 64 6f 77 50 72 65 76 69 6f 75 73 48 61  WindowPreviousHa
2120: 6e 64 6c 65 20 3d 20 6e 75 6c 6c 3b 0a 0a 09 09  ndle = null;....
2130: 09 09 09 09 2f 2a 0a 09 09 09 09 09 09 20 2a 20  ..../*....... * 
2140: 57 65 20 61 72 65 20 64 6f 6e 65 20 66 65 74 63  We are done fetc
2150: 68 69 6e 67 20 74 68 65 20 75 73 65 72 20 50 49  hing the user PI
2160: 4e 2c 20 63 6c 65 61 72 20 74 68 65 20 76 61 6c  N, clear the val
2170: 75 65 0a 09 09 09 09 09 09 20 2a 2f 0a 09 09 09  ue....... */....
2180: 09 09 09 70 69 6e 56 61 6c 75 65 20 3d 20 70 69  ...pinValue = pi
2190: 6e 57 69 6e 64 6f 77 50 49 4e 56 61 6c 75 65 3b  nWindowPINValue;
21a0: 0a 09 09 09 09 09 09 70 69 6e 57 69 6e 64 6f 77  .......pinWindow
21b0: 50 49 4e 56 61 6c 75 65 20 3d 20 22 22 3b 0a 0a  PINValue = "";..
21c0: 09 09 09 09 09 09 63 61 63 6b 65 79 50 49 4e 50  ......cackeyPINP
21d0: 72 6f 6d 70 74 43 6f 6d 70 6c 65 74 65 64 28 70  romptCompleted(p
21e0: 69 6e 56 61 6c 75 65 29 3b 0a 09 0a 09 09 09 09  inValue);.......
21f0: 09 09 72 65 74 75 72 6e 3b 0a 09 09 09 09 09 7d  ..return;......}
2200: 29 0a 09 0a 09 09 09 09 09 2f 2a 0a 09 09 09 09  )......../*.....
2210: 09 20 2a 20 50 61 73 73 20 74 68 69 73 20 6d 65  . * Pass this me
2220: 73 73 61 67 65 20 6f 66 66 20 74 6f 20 74 68 65  ssage off to the
2230: 20 6f 74 68 65 72 20 77 69 6e 64 6f 77 20 73 6f   other window so
2240: 20 74 68 61 74 20 69 74 20 6d 61 79 20 72 65 73   that it may res
2250: 75 62 6d 69 74 20 74 68 65 20 72 65 71 75 65 73  ubmit the reques
2260: 74 2e 0a 09 09 09 09 09 20 2a 2f 0a 09 09 09 09  t....... */.....
2270: 09 70 69 6e 57 69 6e 64 6f 77 2e 63 6f 6e 74 65  .pinWindow.conte
2280: 6e 74 57 69 6e 64 6f 77 2e 70 61 72 65 6e 74 57  ntWindow.parentW
2290: 69 6e 64 6f 77 20 3d 20 77 69 6e 64 6f 77 3b 0a  indow = window;.
22a0: 09 09 09 09 09 70 69 6e 57 69 6e 64 6f 77 2e 63  .....pinWindow.c
22b0: 6f 6e 74 65 6e 74 57 69 6e 64 6f 77 2e 6d 65 73  ontentWindow.mes
22c0: 73 61 67 65 45 76 65 6e 74 20 3d 20 6d 65 73 73  sageEvent = mess
22d0: 61 67 65 45 76 65 6e 74 3b 0a 0a 09 09 09 09 09  ageEvent;.......
22e0: 69 66 20 28 63 61 63 6b 65 79 46 65 61 74 75 72  if (cackeyFeatur
22f0: 65 73 2e 63 75 73 74 6f 6d 50 49 4e 50 72 6f 6d  es.customPINProm
2300: 70 74 29 20 7b 0a 09 09 09 09 09 09 70 69 6e 57  pt) {.......pinW
2310: 69 6e 64 6f 77 2e 63 6f 6e 74 65 6e 74 57 69 6e  indow.contentWin
2320: 64 6f 77 2e 70 69 6e 70 72 6f 6d 70 74 20 3d 20  dow.pinprompt = 
2330: 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74  messageEvent.dat
2340: 61 2e 70 69 6e 70 72 6f 6d 70 74 3b 0a 09 09 09  a.pinprompt;....
2350: 09 09 7d 0a 09 0a 09 09 09 09 09 72 65 74 75 72  ..}........retur
2360: 6e 3b 0a 09 09 09 09 7d 29 3b 0a 09 09 09 7d 20  n;.....});....} 
2370: 65 6c 73 65 20 7b 0a 09 09 09 09 63 68 72 6f 6d  else {.....chrom
2380: 65 2e 63 65 72 74 69 66 69 63 61 74 65 50 72 6f  e.certificatePro
2390: 76 69 64 65 72 2e 72 65 71 75 65 73 74 50 69 6e  vider.requestPin
23a0: 28 7b 0a 09 09 09 09 09 73 69 67 6e 52 65 71 75  ({......signRequ
23b0: 65 73 74 49 64 3a 20 6d 65 73 73 61 67 65 45 76  estId: messageEv
23c0: 65 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69 6e 61  ent.data.origina
23d0: 6c 72 65 71 75 65 73 74 2e 73 69 67 6e 52 65 71  lrequest.signReq
23e0: 75 65 73 74 49 64 2c 0a 09 09 09 09 09 72 65 71  uestId,......req
23f0: 75 65 73 74 54 79 70 65 3a 20 22 50 49 4e 22 0a  uestType: "PIN".
2400: 09 09 09 09 7d 2c 20 66 75 6e 63 74 69 6f 6e 28  ....}, function(
2410: 75 73 65 72 49 6e 66 6f 29 20 7b 0a 09 09 09 09  userInfo) {.....
2420: 09 76 61 72 20 64 65 73 74 72 6f 79 45 72 72 6f  .var destroyErro
2430: 72 3b 0a 09 09 09 09 09 76 61 72 20 70 69 6e 56  r;......var pinV
2440: 61 6c 75 65 20 3d 20 22 22 3b 0a 0a 09 09 09 09  alue = "";......
2450: 09 74 72 79 20 7b 0a 09 09 09 09 09 09 63 68 72  .try {.......chr
2460: 6f 6d 65 2e 63 65 72 74 69 66 69 63 61 74 65 50  ome.certificateP
2470: 72 6f 76 69 64 65 72 2e 73 74 6f 70 50 69 6e 52  rovider.stopPinR
2480: 65 71 75 65 73 74 28 7b 0a 09 09 09 09 09 09 09  equest({........
2490: 73 69 67 6e 52 65 71 75 65 73 74 49 64 3a 20 6d  signRequestId: m
24a0: 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61  essageEvent.data
24b0: 2e 6f 72 69 67 69 6e 61 6c 72 65 71 75 65 73 74  .originalrequest
24c0: 2e 73 69 67 6e 52 65 71 75 65 73 74 49 64 0a 09  .signRequestId..
24d0: 09 09 09 09 09 7d 2c 20 66 75 6e 63 74 69 6f 6e  .....}, function
24e0: 28 29 20 7b 7d 29 3b 0a 09 09 09 09 09 7d 20 63  () {});......} c
24f0: 61 74 63 68 20 28 64 65 73 74 72 6f 79 45 72 72  atch (destroyErr
2500: 6f 72 29 20 7b 0a 09 09 09 09 09 09 2f 2a 20 44  or) {......./* D
2510: 6f 20 6e 6f 74 68 69 6e 67 2c 20 77 65 20 64 6f  o nothing, we do
2520: 6e 27 74 20 63 61 72 65 20 69 66 20 69 74 20 66  n't care if it f
2530: 61 69 6c 73 20 72 65 61 6c 6c 79 20 2a 2f 0a 09  ails really */..
2540: 09 09 09 09 7d 0a 0a 09 09 09 09 09 70 69 6e 57  ....}.......pinW
2550: 69 6e 64 6f 77 50 72 65 76 69 6f 75 73 48 61 6e  indowPreviousHan
2560: 64 6c 65 20 3d 20 6e 75 6c 6c 3b 0a 0a 09 09 09  dle = null;.....
2570: 09 09 69 66 20 28 75 73 65 72 49 6e 66 6f 20 26  ..if (userInfo &
2580: 26 20 75 73 65 72 49 6e 66 6f 2e 75 73 65 72 49  & userInfo.userI
2590: 6e 70 75 74 29 20 7b 0a 09 09 09 09 09 09 70 69  nput) {.......pi
25a0: 6e 56 61 6c 75 65 20 3d 20 75 73 65 72 49 6e 66  nValue = userInf
25b0: 6f 2e 75 73 65 72 49 6e 70 75 74 3b 0a 09 09 09  o.userInput;....
25c0: 09 09 7d 0a 0a 09 09 09 09 09 72 65 74 75 72 6e  ..}.......return
25d0: 28 63 61 63 6b 65 79 50 49 4e 50 72 6f 6d 70 74  (cackeyPINPrompt
25e0: 43 6f 6d 70 6c 65 74 65 64 28 70 69 6e 56 61 6c  Completed(pinVal
25f0: 75 65 29 29 3b 0a 09 09 09 09 7d 29 3b 0a 09 09  ue));.....});...
2600: 09 7d 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20  .}...../*.... * 
2610: 57 65 20 72 65 74 75 72 6e 20 68 65 72 65 20 69  We return here i
2620: 6e 73 74 65 61 64 20 6f 66 20 62 72 65 61 6b 20  nstead of break 
2630: 74 6f 20 61 76 6f 69 64 20 64 65 6c 65 74 69 6e  to avoid deletin
2640: 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 09  g the callback..
2650: 09 09 20 2a 20 65 6e 74 72 79 2e 0a 09 09 09 20  .. * entry..... 
2660: 2a 2f 0a 09 09 09 72 65 74 75 72 6e 3b 0a 09 09  */....return;...
2670: 63 61 73 65 20 22 73 75 63 63 65 73 73 22 3a 0a  case "success":.
2680: 09 09 09 73 77 69 74 63 68 20 28 6d 65 73 73 61  ...switch (messa
2690: 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 63 6f 6d  geEvent.data.com
26a0: 6d 61 6e 64 29 20 7b 0a 09 09 09 09 63 61 73 65  mand) {.....case
26b0: 20 22 6c 69 73 74 63 65 72 74 69 66 69 63 61 74   "listcertificat
26c0: 65 73 22 3a 0a 09 09 09 09 09 6e 65 78 74 46 75  es":......nextFu
26d0: 6e 63 74 69 6f 6e 20 3d 20 63 61 63 6b 65 79 4d  nction = cackeyM
26e0: 65 73 73 61 67 65 49 6e 63 6f 6d 69 6e 67 4c 69  essageIncomingLi
26f0: 73 74 43 65 72 74 69 66 69 63 61 74 65 73 3b 0a  stCertificates;.
2700: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
2710: 09 63 61 73 65 20 22 6c 69 73 74 72 65 61 64 65  .case "listreade
2720: 72 73 22 3a 0a 09 09 09 09 09 6e 65 78 74 46 75  rs":......nextFu
2730: 6e 63 74 69 6f 6e 20 3d 20 63 61 63 6b 65 79 4d  nction = cackeyM
2740: 65 73 73 61 67 65 49 6e 63 6f 6d 69 6e 67 4c 69  essageIncomingLi
2750: 73 74 52 65 61 64 65 72 73 3b 0a 0a 09 09 09 09  stReaders;......
2760: 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65  .break;.....case
2770: 20 22 73 69 67 6e 22 3a 0a 09 09 09 09 09 6e 65   "sign":......ne
2780: 78 74 46 75 6e 63 74 69 6f 6e 20 3d 20 63 61 63  xtFunction = cac
2790: 6b 65 79 4d 65 73 73 61 67 65 49 6e 63 6f 6d 69  keyMessageIncomi
27a0: 6e 67 53 69 67 6e 4d 65 73 73 61 67 65 3b 0a 0a  ngSignMessage;..
27b0: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
27c0: 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  .....break;..}..
27d0: 09 69 66 20 28 6e 65 78 74 46 75 6e 63 74 69 6f  .if (nextFunctio
27e0: 6e 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09 6e  n != null) {...n
27f0: 65 78 74 46 75 6e 63 74 69 6f 6e 28 6d 65 73 73  extFunction(mess
2800: 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2c 20 63  ageEvent.data, c
2810: 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 3b 0a  hromeCallback);.
2820: 09 7d 0a 0a 09 64 65 6c 65 74 65 20 63 61 63 6b  .}...delete cack
2830: 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c  eyOutstandingCal
2840: 6c 62 61 63 6b 73 5b 6d 65 73 73 61 67 65 45 76  lbacks[messageEv
2850: 65 6e 74 2e 64 61 74 61 2e 69 64 5d 3b 0a 0a 09  ent.data.id];...
2860: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
2870: 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 6d 65 73   Handler for mes
2880: 73 61 67 65 73 20 66 72 6f 6d 20 43 68 72 6f 6d  sages from Chrom
2890: 65 20 72 65 6c 61 74 65 64 20 74 6f 20 6c 69 73  e related to lis
28a0: 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ting certificate
28b0: 73 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63  s. */.function c
28c0: 61 63 6b 65 79 4c 69 73 74 43 65 72 74 69 66 69  ackeyListCertifi
28d0: 63 61 74 65 73 28 63 68 72 6f 6d 65 43 61 6c 6c  cates(chromeCall
28e0: 62 61 63 6b 29 20 7b 0a 09 76 61 72 20 63 61 6c  back) {..var cal
28f0: 6c 62 61 63 6b 49 64 3b 0a 09 76 61 72 20 70 72  lbackId;..var pr
2900: 6f 6d 69 73 65 48 61 6e 64 6c 65 20 3d 20 6e 75  omiseHandle = nu
2910: 6c 6c 2c 20 70 72 6f 6d 69 73 65 52 65 73 6f 6c  ll, promiseResol
2920: 76 65 2c 20 70 72 6f 6d 69 73 65 52 65 6a 65 63  ve, promiseRejec
2930: 74 3b 0a 0a 09 69 66 20 28 67 6f 6f 67 2e 44 45  t;...if (goog.DE
2940: 42 55 47 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65  BUG) {...console
2950: 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 41  .log("[cackey] A
2960: 73 6b 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  sked to provide 
2970: 61 20 6c 69 73 74 20 6f 66 20 63 65 72 74 69 66  a list of certif
2980: 69 63 61 74 65 73 20 2d 2d 20 74 68 72 6f 77 69  icates -- throwi
2990: 6e 67 20 74 68 61 74 20 72 65 71 75 65 73 74 20  ng that request 
29a0: 6f 76 65 72 20 74 6f 20 74 68 65 20 4e 61 43 6c  over to the NaCl
29b0: 20 73 69 64 65 2e 2e 2e 20 22 29 3b 0a 09 7d 0a   side... ");..}.
29c0: 0a 09 69 66 20 28 21 63 68 72 6f 6d 65 43 61 6c  ..if (!chromeCal
29d0: 6c 62 61 63 6b 29 20 7b 0a 09 09 2f 2a 0a 09 09  lback) {.../*...
29e0: 20 2a 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63   * If no callbac
29f0: 6b 20 73 75 70 70 6c 69 65 64 2c 20 61 72 72 61  k supplied, arra
2a00: 6e 67 65 20 66 6f 72 20 61 20 70 72 6f 6d 69 73  nge for a promis
2a10: 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
2a20: 20 69 6e 73 74 65 61 64 0a 09 09 20 2a 2f 0a 09   instead... */..
2a30: 09 70 72 6f 6d 69 73 65 48 61 6e 64 6c 65 20 3d  .promiseHandle =
2a40: 20 6e 65 77 20 50 72 6f 6d 69 73 65 28 66 75 6e   new Promise(fun
2a50: 63 74 69 6f 6e 28 72 65 73 6f 6c 76 65 2c 20 72  ction(resolve, r
2a60: 65 6a 65 63 74 29 20 7b 0a 09 09 09 70 72 6f 6d  eject) {....prom
2a70: 69 73 65 52 65 73 6f 6c 76 65 20 3d 20 72 65 73  iseResolve = res
2a80: 6f 6c 76 65 3b 0a 09 09 09 70 72 6f 6d 69 73 65  olve;....promise
2a90: 52 65 6a 65 63 74 20 3d 20 72 65 6a 65 63 74 3b  Reject = reject;
2aa0: 0a 09 09 7d 29 3b 0a 0a 09 09 63 68 72 6f 6d 65  ...});....chrome
2ab0: 43 61 6c 6c 62 61 63 6b 20 3d 20 66 75 6e 63 74  Callback = funct
2ac0: 69 6f 6e 28 63 65 72 74 73 29 20 7b 0a 09 09 09  ion(certs) {....
2ad0: 70 72 6f 6d 69 73 65 52 65 73 6f 6c 76 65 28 63  promiseResolve(c
2ae0: 65 72 74 73 29 3b 0a 09 09 7d 3b 0a 09 7d 0a 0a  erts);...};..}..
2af0: 09 63 61 6c 6c 62 61 63 6b 49 64 20 3d 20 2b 2b  .callbackId = ++
2b00: 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e  cackeyOutstandin
2b10: 67 43 61 6c 6c 62 61 63 6b 43 6f 75 6e 74 65 72  gCallbackCounter
2b20: 3b 0a 0a 09 63 61 63 6b 65 79 49 6e 69 74 50 43  ;...cackeyInitPC
2b30: 53 43 28 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  SC(function() {.
2b40: 09 09 63 61 63 6b 65 79 48 61 6e 64 6c 65 2e 70  ..cackeyHandle.p
2b50: 6f 73 74 4d 65 73 73 61 67 65 28 0a 09 09 09 7b  ostMessage(....{
2b60: 0a 09 09 09 09 27 74 61 72 67 65 74 27 3a 20 22  .....'target': "
2b70: 63 61 63 6b 65 79 22 2c 0a 09 09 09 09 27 63 6f  cackey",.....'co
2b80: 6d 6d 61 6e 64 27 3a 20 22 6c 69 73 74 63 65 72  mmand': "listcer
2b90: 74 69 66 69 63 61 74 65 73 22 2c 0a 09 09 09 09  tificates",.....
2ba0: 27 69 64 27 3a 20 63 61 6c 6c 62 61 63 6b 49 64  'id': callbackId
2bb0: 0a 09 09 09 7d 0a 09 09 29 3b 0a 0a 09 09 63 61  ....}...);....ca
2bc0: 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43  ckeyOutstandingC
2bd0: 61 6c 6c 62 61 63 6b 73 5b 63 61 6c 6c 62 61 63  allbacks[callbac
2be0: 6b 49 64 5d 20 3d 20 63 68 72 6f 6d 65 43 61 6c  kId] = chromeCal
2bf0: 6c 62 61 63 6b 3b 0a 0a 09 09 69 66 20 28 67 6f  lback;....if (go
2c00: 6f 67 2e 44 45 42 55 47 29 20 7b 0a 09 09 09 63  og.DEBUG) {....c
2c10: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63  onsole.log("[cac
2c20: 6b 65 79 5d 20 54 68 72 6f 77 6e 2e 22 29 3b 0a  key] Thrown.");.
2c30: 09 09 7d 0a 09 7d 2c 20 63 68 72 6f 6d 65 43 61  ..}..}, chromeCa
2c40: 6c 6c 62 61 63 6b 29 3b 0a 0a 09 72 65 74 75 72  llback);...retur
2c50: 6e 28 70 72 6f 6d 69 73 65 48 61 6e 64 6c 65 29  n(promiseHandle)
2c60: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c  ;.}../*. * Handl
2c70: 65 72 20 66 6f 72 20 6d 65 73 73 61 67 65 73 20  er for messages 
2c80: 66 72 6f 6d 20 43 68 72 6f 6d 65 20 72 65 6c 61  from Chrome rela
2c90: 74 65 64 20 74 6f 20 6c 69 73 74 69 6e 67 20 72  ted to listing r
2ca0: 65 61 64 65 72 73 0a 20 2a 2f 0a 66 75 6e 63 74  eaders. */.funct
2cb0: 69 6f 6e 20 63 61 63 6b 65 79 4c 69 73 74 52 65  ion cackeyListRe
2cc0: 61 64 65 72 73 28 63 68 72 6f 6d 65 43 61 6c 6c  aders(chromeCall
2cd0: 62 61 63 6b 29 20 7b 0a 09 76 61 72 20 63 61 6c  back) {..var cal
2ce0: 6c 62 61 63 6b 49 64 3b 0a 0a 09 69 66 20 28 67  lbackId;...if (g
2cf0: 6f 6f 67 2e 44 45 42 55 47 29 20 7b 0a 09 09 63  oog.DEBUG) {...c
2d00: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63  onsole.log("[cac
2d10: 6b 65 79 5d 20 41 73 6b 65 64 20 74 6f 20 70 72  key] Asked to pr
2d20: 6f 76 69 64 65 20 61 20 6c 69 73 74 20 6f 66 20  ovide a list of 
2d30: 72 65 61 64 65 72 73 20 2d 2d 20 74 68 72 6f 77  readers -- throw
2d40: 69 6e 67 20 74 68 61 74 20 72 65 71 75 65 73 74  ing that request
2d50: 20 6f 76 65 72 20 74 6f 20 74 68 65 20 4e 61 43   over to the NaC
2d60: 6c 20 73 69 64 65 2e 2e 2e 20 22 29 3b 0a 09 7d  l side... ");..}
2d70: 0a 0a 09 63 61 6c 6c 62 61 63 6b 49 64 20 3d 20  ...callbackId = 
2d80: 2b 2b 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64  ++cackeyOutstand
2d90: 69 6e 67 43 61 6c 6c 62 61 63 6b 43 6f 75 6e 74  ingCallbackCount
2da0: 65 72 3b 0a 0a 09 63 61 63 6b 65 79 49 6e 69 74  er;...cackeyInit
2db0: 50 43 53 43 28 66 75 6e 63 74 69 6f 6e 28 29 20  PCSC(function() 
2dc0: 7b 0a 09 09 63 61 63 6b 65 79 48 61 6e 64 6c 65  {...cackeyHandle
2dd0: 2e 70 6f 73 74 4d 65 73 73 61 67 65 28 0a 09 09  .postMessage(...
2de0: 09 7b 0a 09 09 09 09 27 74 61 72 67 65 74 27 3a  .{.....'target':
2df0: 20 22 63 61 63 6b 65 79 22 2c 0a 09 09 09 09 27   "cackey",.....'
2e00: 63 6f 6d 6d 61 6e 64 27 3a 20 22 6c 69 73 74 72  command': "listr
2e10: 65 61 64 65 72 73 22 2c 0a 09 09 09 09 27 69 64  eaders",.....'id
2e20: 27 3a 20 63 61 6c 6c 62 61 63 6b 49 64 0a 09 09  ': callbackId...
2e30: 09 7d 0a 09 09 29 3b 0a 0a 09 09 63 61 63 6b 65  .}...);....cacke
2e40: 79 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c  yOutstandingCall
2e50: 62 61 63 6b 73 5b 63 61 6c 6c 62 61 63 6b 49 64  backs[callbackId
2e60: 5d 20 3d 20 63 68 72 6f 6d 65 43 61 6c 6c 62 61  ] = chromeCallba
2e70: 63 6b 3b 0a 0a 09 09 69 66 20 28 67 6f 6f 67 2e  ck;....if (goog.
2e80: 44 45 42 55 47 29 20 7b 0a 09 09 09 63 6f 6e 73  DEBUG) {....cons
2e90: 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79  ole.log("[cackey
2ea0: 5d 20 54 68 72 6f 77 6e 2e 22 29 3b 0a 09 09 7d  ] Thrown.");...}
2eb0: 0a 09 7d 2c 20 63 68 72 6f 6d 65 43 61 6c 6c 62  ..}, chromeCallb
2ec0: 61 63 6b 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  ack);...return;.
2ed0: 7d 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65 72  }../*. * Handler
2ee0: 20 66 6f 72 20 6d 65 73 73 61 67 65 73 20 66 72   for messages fr
2ef0: 6f 6d 20 43 68 72 6f 6d 65 20 72 65 6c 61 74 65  om Chrome relate
2f00: 64 20 74 6f 20 73 69 67 6e 69 6e 67 20 61 20 68  d to signing a h
2f10: 61 73 68 20 6f 66 20 73 6f 6d 65 20 73 6f 72 74  ash of some sort
2f20: 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61  . */.function ca
2f30: 63 6b 65 79 53 69 67 6e 4d 65 73 73 61 67 65 28  ckeySignMessage(
2f40: 73 69 67 6e 52 65 71 75 65 73 74 2c 20 63 68 72  signRequest, chr
2f50: 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 20 7b 0a 09  omeCallback) {..
2f60: 76 61 72 20 63 61 6c 6c 62 61 63 6b 49 64 3b 0a  var callbackId;.
2f70: 09 76 61 72 20 63 6f 6d 6d 61 6e 64 3b 0a 09 76  .var command;..v
2f80: 61 72 20 63 65 72 74 69 66 69 63 61 74 65 49 64  ar certificateId
2f90: 3b 0a 09 76 61 72 20 64 69 67 65 73 74 2c 20 64  ;..var digest, d
2fa0: 69 67 65 73 74 48 65 61 64 65 72 3b 0a 09 76 61  igestHeader;..va
2fb0: 72 20 70 72 6f 6d 69 73 65 48 61 6e 64 6c 65 20  r promiseHandle 
2fc0: 3d 20 6e 75 6c 6c 2c 20 70 72 6f 6d 69 73 65 52  = null, promiseR
2fd0: 65 73 6f 6c 76 65 2c 20 70 72 6f 6d 69 73 65 52  esolve, promiseR
2fe0: 65 6a 65 63 74 3b 0a 0a 09 69 66 20 28 73 69 67  eject;...if (sig
2ff0: 6e 52 65 71 75 65 73 74 2e 73 69 67 6e 52 65 71  nRequest.signReq
3000: 75 65 73 74 49 64 20 3d 3d 3d 20 75 6e 64 65 66  uestId === undef
3010: 69 6e 65 64 20 7c 7c 20 73 69 67 6e 52 65 71 75  ined || signRequ
3020: 65 73 74 2e 73 69 67 6e 52 65 71 75 65 73 74 49  est.signRequestI
3030: 64 20 3d 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09  d === null) {...
3040: 73 69 67 6e 52 65 71 75 65 73 74 2e 73 69 67 6e  signRequest.sign
3050: 52 65 71 75 65 73 74 49 64 20 3d 20 6e 75 6c 6c  RequestId = null
3060: 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 68 72 6f  ;..}...if (!chro
3070: 6d 65 43 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 09  meCallback) {...
3080: 2f 2a 0a 09 09 20 2a 20 49 66 20 6e 6f 20 63 61  /*... * If no ca
3090: 6c 6c 62 61 63 6b 20 73 75 70 70 6c 69 65 64 2c  llback supplied,
30a0: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 61 20 70   arrange for a p
30b0: 72 6f 6d 69 73 65 20 74 6f 20 62 65 20 72 65 74  romise to be ret
30c0: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 0a 09 09  urned instead...
30d0: 20 2a 2f 0a 09 09 70 72 6f 6d 69 73 65 48 61 6e   */...promiseHan
30e0: 64 6c 65 20 3d 20 6e 65 77 20 50 72 6f 6d 69 73  dle = new Promis
30f0: 65 28 66 75 6e 63 74 69 6f 6e 28 72 65 73 6f 6c  e(function(resol
3100: 76 65 2c 20 72 65 6a 65 63 74 29 20 7b 0a 09 09  ve, reject) {...
3110: 09 70 72 6f 6d 69 73 65 52 65 73 6f 6c 76 65 20  .promiseResolve 
3120: 3d 20 72 65 73 6f 6c 76 65 3b 0a 09 09 09 70 72  = resolve;....pr
3130: 6f 6d 69 73 65 52 65 6a 65 63 74 20 3d 20 72 65  omiseReject = re
3140: 6a 65 63 74 3b 0a 09 09 7d 29 3b 0a 0a 09 09 63  ject;...});....c
3150: 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 20 3d 20  hromeCallback = 
3160: 66 75 6e 63 74 69 6f 6e 28 70 61 79 6c 6f 61 64  function(payload
3170: 29 20 7b 0a 09 09 09 69 66 20 28 21 70 61 79 6c  ) {....if (!payl
3180: 6f 61 64 29 20 7b 0a 09 09 09 09 70 72 6f 6d 69  oad) {.....promi
3190: 73 65 52 65 6a 65 63 74 28 6e 65 77 20 45 72 72  seReject(new Err
31a0: 6f 72 28 22 53 69 67 6e 69 6e 67 20 70 61 79 6c  or("Signing payl
31b0: 6f 61 64 20 69 73 20 65 6d 70 74 79 20 6f 72 20  oad is empty or 
31c0: 6e 6f 74 20 73 75 70 70 6c 69 65 64 22 29 29 3b  not supplied"));
31d0: 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
31e0: 09 70 72 6f 6d 69 73 65 52 65 73 6f 6c 76 65 28  .promiseResolve(
31f0: 70 61 79 6c 6f 61 64 29 3b 0a 09 09 09 7d 0a 09  payload);....}..
3200: 09 7d 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  .};..}.../*.. * 
3210: 50 72 65 66 69 78 20 74 68 65 20 64 69 67 65 73  Prefix the diges
3220: 74 20 77 69 74 68 20 74 68 65 20 41 53 4e 2e 31  t with the ASN.1
3230: 20 68 65 61 64 65 72 20 72 65 71 75 69 72 65 64   header required
3240: 20 6f 66 20 69 74 0a 09 20 2a 2f 0a 09 73 77 69   of it.. */..swi
3250: 74 63 68 20 28 73 69 67 6e 52 65 71 75 65 73 74  tch (signRequest
3260: 2e 68 61 73 68 29 20 7b 0a 09 09 63 61 73 65 20  .hash) {...case 
3270: 22 53 48 41 31 22 3a 0a 09 09 09 64 69 67 65 73  "SHA1":....diges
3280: 74 48 65 61 64 65 72 20 3d 20 6e 65 77 20 55 69  tHeader = new Ui
3290: 6e 74 38 41 72 72 61 79 28 5b 30 78 33 30 2c 20  nt8Array([0x30, 
32a0: 30 78 32 31 2c 20 30 78 33 30 2c 20 30 78 30 39  0x21, 0x30, 0x09
32b0: 2c 20 30 78 30 36 2c 20 30 78 30 35 2c 20 30 78  , 0x06, 0x05, 0x
32c0: 32 62 2c 20 30 78 30 65 2c 20 30 78 30 33 2c 20  2b, 0x0e, 0x03, 
32d0: 30 78 30 32 2c 20 30 78 31 61 2c 20 30 78 30 35  0x02, 0x1a, 0x05
32e0: 2c 20 30 78 30 30 2c 20 30 78 30 34 2c 20 30 78  , 0x00, 0x04, 0x
32f0: 31 34 5d 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  14]);....break;.
3300: 09 09 63 61 73 65 20 22 53 48 41 32 35 36 22 3a  ..case "SHA256":
3310: 0a 09 09 09 64 69 67 65 73 74 48 65 61 64 65 72  ....digestHeader
3320: 20 3d 20 6e 65 77 20 55 69 6e 74 38 41 72 72 61   = new Uint8Arra
3330: 79 28 5b 30 78 33 30 2c 20 30 78 33 31 2c 20 30  y([0x30, 0x31, 0
3340: 78 33 30 2c 20 30 78 30 64 2c 20 30 78 30 36 2c  x30, 0x0d, 0x06,
3350: 20 30 78 30 39 2c 20 30 78 36 30 2c 20 30 78 38   0x09, 0x60, 0x8
3360: 36 2c 20 30 78 34 38 2c 20 30 78 30 31 2c 20 30  6, 0x48, 0x01, 0
3370: 78 36 35 2c 20 30 78 30 33 2c 20 30 78 30 34 2c  x65, 0x03, 0x04,
3380: 20 30 78 30 32 2c 20 30 78 30 31 2c 20 30 78 30   0x02, 0x01, 0x0
3390: 35 2c 20 30 78 30 30 2c 20 30 78 30 34 2c 20 30  5, 0x00, 0x04, 0
33a0: 78 32 30 5d 29 3b 0a 09 09 09 62 72 65 61 6b 3b  x20]);....break;
33b0: 0a 09 09 63 61 73 65 20 22 53 48 41 35 31 32 22  ...case "SHA512"
33c0: 3a 0a 09 09 09 64 69 67 65 73 74 48 65 61 64 65  :....digestHeade
33d0: 72 20 3d 20 6e 65 77 20 55 69 6e 74 38 41 72 72  r = new Uint8Arr
33e0: 61 79 28 5b 30 78 33 30 2c 20 30 78 35 31 2c 20  ay([0x30, 0x51, 
33f0: 30 78 33 30 2c 20 30 78 30 64 2c 20 30 78 30 36  0x30, 0x0d, 0x06
3400: 2c 20 30 78 30 39 2c 20 30 78 36 30 2c 20 30 78  , 0x09, 0x60, 0x
3410: 38 36 2c 20 30 78 34 38 2c 20 30 78 30 31 2c 20  86, 0x48, 0x01, 
3420: 30 78 36 35 2c 20 30 78 30 33 2c 20 30 78 30 34  0x65, 0x03, 0x04
3430: 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78  , 0x02, 0x03, 0x
3440: 30 35 2c 20 30 78 30 30 2c 20 30 78 30 34 2c 20  05, 0x00, 0x04, 
3450: 30 78 34 30 5d 29 3b 0a 09 09 09 62 72 65 61 6b  0x40]);....break
3460: 3b 0a 09 09 63 61 73 65 20 22 4d 44 35 5f 53 48  ;...case "MD5_SH
3470: 41 31 22 3a 0a 09 09 63 61 73 65 20 22 52 41 57  A1":...case "RAW
3480: 22 3a 0a 09 09 09 64 69 67 65 73 74 48 65 61 64  ":....digestHead
3490: 65 72 20 3d 20 6e 65 77 20 55 69 6e 74 38 41 72  er = new Uint8Ar
34a0: 72 61 79 28 29 3b 0a 09 09 09 62 72 65 61 6b 3b  ray();....break;
34b0: 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 63  ...default:....c
34c0: 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 22 5b 63  onsole.error("[c
34d0: 61 63 6b 65 79 5d 20 41 73 6b 65 64 20 74 6f 20  ackey] Asked to 
34e0: 73 69 67 6e 20 61 20 6d 65 73 73 61 67 65 20 77  sign a message w
34f0: 69 74 68 20 61 20 68 61 73 68 20 77 65 20 64 6f  ith a hash we do
3500: 20 6e 6f 74 20 73 75 70 70 6f 72 74 3a 20 22 20   not support: " 
3510: 2b 20 73 69 67 6e 52 65 71 75 65 73 74 2e 68 61  + signRequest.ha
3520: 73 68 29 3b 0a 0a 09 09 09 63 68 72 6f 6d 65 43  sh);.....chromeC
3530: 61 6c 6c 62 61 63 6b 28 29 3b 0a 0a 09 09 09 72  allback();.....r
3540: 65 74 75 72 6e 28 70 72 6f 6d 69 73 65 48 61 6e  eturn(promiseHan
3550: 64 6c 65 29 3b 0a 09 7d 0a 0a 09 64 69 67 65 73  dle);..}...diges
3560: 74 20 3d 20 6e 65 77 20 55 69 6e 74 38 41 72 72  t = new Uint8Arr
3570: 61 79 28 64 69 67 65 73 74 48 65 61 64 65 72 2e  ay(digestHeader.
3580: 6c 65 6e 67 74 68 20 2b 20 73 69 67 6e 52 65 71  length + signReq
3590: 75 65 73 74 2e 64 69 67 65 73 74 2e 62 79 74 65  uest.digest.byte
35a0: 4c 65 6e 67 74 68 29 3b 0a 09 64 69 67 65 73 74  Length);..digest
35b0: 2e 73 65 74 28 64 69 67 65 73 74 48 65 61 64 65  .set(digestHeade
35c0: 72 2c 20 30 29 3b 0a 09 64 69 67 65 73 74 2e 73  r, 0);..digest.s
35d0: 65 74 28 6e 65 77 20 55 69 6e 74 38 41 72 72 61  et(new Uint8Arra
35e0: 79 28 73 69 67 6e 52 65 71 75 65 73 74 2e 64 69  y(signRequest.di
35f0: 67 65 73 74 29 2c 20 64 69 67 65 73 74 48 65 61  gest), digestHea
3600: 64 65 72 2e 6c 65 6e 67 74 68 29 3b 0a 0a 09 64  der.length);...d
3610: 65 6c 65 74 65 20 64 69 67 65 73 74 48 65 61 64  elete digestHead
3620: 65 72 3b 0a 0a 09 69 66 20 28 67 6f 6f 67 2e 44  er;...if (goog.D
3630: 45 42 55 47 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c  EBUG) {...consol
3640: 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20  e.log("[cackey] 
3650: 41 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 61 20  Asked to sign a 
3660: 6d 65 73 73 61 67 65 20 2d 2d 20 74 68 72 6f 77  message -- throw
3670: 69 6e 67 20 74 68 61 74 20 72 65 71 75 65 73 74  ing that request
3680: 20 6f 76 65 72 20 74 6f 20 74 68 65 20 4e 61 43   over to the NaC
3690: 6c 20 73 69 64 65 2e 2e 2e 20 22 29 3b 0a 09 7d  l side... ");..}
36a0: 0a 0a 09 63 61 6c 6c 62 61 63 6b 49 64 20 3d 20  ...callbackId = 
36b0: 2b 2b 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64  ++cackeyOutstand
36c0: 69 6e 67 43 61 6c 6c 62 61 63 6b 43 6f 75 6e 74  ingCallbackCount
36d0: 65 72 3b 0a 0a 09 63 6f 6d 6d 61 6e 64 20 3d 20  er;...command = 
36e0: 7b 0a 09 09 27 74 61 72 67 65 74 27 3a 20 22 63  {...'target': "c
36f0: 61 63 6b 65 79 22 2c 0a 09 09 27 63 6f 6d 6d 61  ackey",...'comma
3700: 6e 64 27 3a 20 22 73 69 67 6e 22 2c 0a 09 09 27  nd': "sign",...'
3710: 73 69 67 6e 52 65 71 75 65 73 74 49 64 27 3a 20  signRequestId': 
3720: 73 69 67 6e 52 65 71 75 65 73 74 2e 73 69 67 6e  signRequest.sign
3730: 52 65 71 75 65 73 74 49 64 2c 0a 09 09 27 69 64  RequestId,...'id
3740: 27 3a 20 63 61 6c 6c 62 61 63 6b 49 64 2c 0a 09  ': callbackId,..
3750: 09 27 63 65 72 74 69 66 69 63 61 74 65 27 3a 20  .'certificate': 
3760: 73 69 67 6e 52 65 71 75 65 73 74 2e 63 65 72 74  signRequest.cert
3770: 69 66 69 63 61 74 65 2c 0a 09 09 27 64 61 74 61  ificate,...'data
3780: 27 3a 20 64 69 67 65 73 74 2e 62 75 66 66 65 72  ': digest.buffer
3790: 0a 09 7d 3b 0a 0a 09 63 65 72 74 69 66 69 63 61  ..};...certifica
37a0: 74 65 49 64 20 3d 20 63 61 63 6b 65 79 43 65 72  teId = cackeyCer
37b0: 74 69 66 69 63 61 74 65 54 6f 50 49 4e 49 44 28  tificateToPINID(
37c0: 63 6f 6d 6d 61 6e 64 2e 63 65 72 74 69 66 69 63  command.certific
37d0: 61 74 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  ate);...if (cack
37e0: 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50  eyCertificateToP
37f0: 49 4e 4d 61 70 5b 63 65 72 74 69 66 69 63 61 74  INMap[certificat
3800: 65 49 64 5d 20 26 26 20 63 61 63 6b 65 79 43 65  eId] && cackeyCe
3810: 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d 61  rtificateToPINMa
3820: 70 5b 63 65 72 74 69 66 69 63 61 74 65 49 64 5d  p[certificateId]
3830: 2e 70 69 6e 29 20 7b 0a 09 09 63 6f 6d 6d 61 6e  .pin) {...comman
3840: 64 2e 70 69 6e 20 3d 20 63 61 63 6b 65 79 43 65  d.pin = cackeyCe
3850: 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d 61  rtificateToPINMa
3860: 70 5b 63 65 72 74 69 66 69 63 61 74 65 49 64 5d  p[certificateId]
3870: 2e 70 69 6e 3b 0a 0a 09 09 63 61 63 6b 65 79 43  .pin;....cackeyC
3880: 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d  ertificateToPINM
3890: 61 70 55 70 64 61 74 65 4c 61 73 74 55 73 65 64  apUpdateLastUsed
38a0: 28 63 65 72 74 69 66 69 63 61 74 65 49 64 29 3b  (certificateId);
38b0: 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 49 6e 69 74  ..}...cackeyInit
38c0: 50 43 53 43 28 66 75 6e 63 74 69 6f 6e 28 29 20  PCSC(function() 
38d0: 7b 0a 09 09 63 61 63 6b 65 79 48 61 6e 64 6c 65  {...cackeyHandle
38e0: 2e 70 6f 73 74 4d 65 73 73 61 67 65 28 63 6f 6d  .postMessage(com
38f0: 6d 61 6e 64 29 3b 0a 0a 09 09 63 61 63 6b 65 79  mand);....cackey
3900: 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62  OutstandingCallb
3910: 61 63 6b 73 5b 63 61 6c 6c 62 61 63 6b 49 64 5d  acks[callbackId]
3920: 20 3d 20 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63   = chromeCallbac
3930: 6b 3b 0a 0a 09 09 69 66 20 28 67 6f 6f 67 2e 44  k;....if (goog.D
3940: 45 42 55 47 29 20 7b 0a 09 09 09 63 6f 6e 73 6f  EBUG) {....conso
3950: 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d  le.log("[cackey]
3960: 20 54 68 72 6f 77 6e 2e 22 29 3b 0a 09 09 7d 0a   Thrown.");...}.
3970: 09 7d 2c 20 63 68 72 6f 6d 65 43 61 6c 6c 62 61  .}, chromeCallba
3980: 63 6b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 70 72  ck);...return(pr
3990: 6f 6d 69 73 65 48 61 6e 64 6c 65 29 3b 0a 7d 0a  omiseHandle);.}.
39a0: 0a 2f 2a 0a 20 2a 20 55 6e 69 74 69 74 61 6c 69  ./*. * Unititali
39b0: 7a 65 73 20 74 68 65 20 43 41 43 4b 65 79 20 50  zes the CACKey P
39c0: 43 53 43 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  CSC connection. 
39d0: 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b  */.function cack
39e0: 65 79 55 6e 69 6e 69 74 50 43 53 43 28 29 20 7b  eyUninitPCSC() {
39f0: 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b  ..console.log("[
3a00: 63 61 63 6b 65 79 5d 20 63 61 63 6b 65 79 55 6e  cackey] cackeyUn
3a10: 69 6e 69 74 50 43 53 43 28 29 20 63 61 6c 6c 65  initPCSC() calle
3a20: 64 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  d");...if (cacke
3a30: 79 50 43 53 43 48 61 6e 64 6c 65 20 21 3d 20 6e  yPCSCHandle != n
3a40: 75 6c 6c 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65  ull) {...console
3a50: 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 44  .log("[cackey] D
3a60: 65 6c 65 74 69 6e 67 20 50 43 53 43 20 68 61 6e  eleting PCSC han
3a70: 64 6c 65 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79  dle");....cackey
3a80: 50 43 53 43 48 61 6e 64 6c 65 20 3d 20 6e 75 6c  PCSCHandle = nul
3a90: 6c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 50 43  l;..}...cackeyPC
3aa0: 53 43 48 61 6e 64 6c 65 55 73 61 62 6c 65 20 3d  SCHandleUsable =
3ab0: 20 66 61 6c 73 65 3b 0a 0a 09 63 6f 6e 73 6f 6c   false;...consol
3ac0: 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20  e.log("[cackey] 
3ad0: 63 61 63 6b 65 79 55 6e 69 6e 69 74 50 43 53 43  cackeyUninitPCSC
3ae0: 28 29 20 72 65 74 75 72 6e 69 6e 67 22 29 3b 0a  () returning");.
3af0: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
3b00: 20 2a 20 55 6e 69 6e 69 74 69 61 6c 69 7a 65 73   * Uninitializes
3b10: 20 43 41 43 4b 65 79 20 28 70 72 6f 62 61 62 6c   CACKey (probabl
3b20: 79 20 64 75 65 20 74 6f 20 61 20 63 72 61 73 68  y due to a crash
3b30: 29 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63  ). */.function c
3b40: 61 63 6b 65 79 55 6e 69 6e 69 74 28 29 20 7b 0a  ackeyUninit() {.
3b50: 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63  .console.log("[c
3b60: 61 63 6b 65 79 5d 20 63 61 63 6b 65 79 55 6e 69  ackey] cackeyUni
3b70: 6e 69 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  nit() called");.
3b80: 0a 09 69 66 20 28 63 68 72 6f 6d 65 2e 63 65 72  ..if (chrome.cer
3b90: 74 69 66 69 63 61 74 65 50 72 6f 76 69 64 65 72  tificateProvider
3ba0: 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f  ) {...console.lo
3bb0: 67 28 22 5b 63 61 63 6b 65 79 5d 20 55 6e 72 65  g("[cackey] Unre
3bc0: 67 69 73 74 65 72 65 64 20 43 68 72 6f 6d 65 20  gistered Chrome 
3bd0: 63 65 72 74 69 66 69 63 61 74 65 20 68 61 6e 64  certificate hand
3be0: 6c 65 72 73 22 29 3b 0a 0a 09 09 63 68 72 6f 6d  lers");....chrom
3bf0: 65 2e 63 65 72 74 69 66 69 63 61 74 65 50 72 6f  e.certificatePro
3c00: 76 69 64 65 72 2e 6f 6e 43 65 72 74 69 66 69 63  vider.onCertific
3c10: 61 74 65 73 52 65 71 75 65 73 74 65 64 2e 72 65  atesRequested.re
3c20: 6d 6f 76 65 4c 69 73 74 65 6e 65 72 28 63 61 63  moveListener(cac
3c30: 6b 65 79 4c 69 73 74 43 65 72 74 69 66 69 63 61  keyListCertifica
3c40: 74 65 73 29 3b 0a 09 09 63 68 72 6f 6d 65 2e 63  tes);...chrome.c
3c50: 65 72 74 69 66 69 63 61 74 65 50 72 6f 76 69 64  ertificateProvid
3c60: 65 72 2e 6f 6e 53 69 67 6e 44 69 67 65 73 74 52  er.onSignDigestR
3c70: 65 71 75 65 73 74 65 64 2e 72 65 6d 6f 76 65 4c  equested.removeL
3c80: 69 73 74 65 6e 65 72 28 63 61 63 6b 65 79 53 69  istener(cackeySi
3c90: 67 6e 4d 65 73 73 61 67 65 29 3b 0a 09 7d 0a 0a  gnMessage);..}..
3ca0: 09 63 61 63 6b 65 79 55 6e 69 6e 69 74 50 43 53  .cackeyUninitPCS
3cb0: 43 28 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  C();...if (cacke
3cc0: 79 48 61 6e 64 6c 65 20 21 3d 20 6e 75 6c 6c 29  yHandle != null)
3cd0: 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67   {...console.log
3ce0: 28 22 5b 63 61 63 6b 65 79 5d 20 44 65 6c 65 74  ("[cackey] Delet
3cf0: 69 6e 67 20 50 4e 61 43 6c 20 6d 6f 64 75 6c 65  ing PNaCl module
3d00: 22 29 3b 0a 0a 09 09 74 72 79 20 7b 0a 09 09 09  ");....try {....
3d10: 64 6f 63 75 6d 65 6e 74 2e 62 6f 64 79 2e 72 65  document.body.re
3d20: 6d 6f 76 65 43 68 69 6c 64 28 63 61 63 6b 65 79  moveChild(cackey
3d30: 48 61 6e 64 6c 65 29 3b 0a 09 09 7d 20 63 61 74  Handle);...} cat
3d40: 63 68 20 28 65 29 20 7b 20 7d 0a 0a 09 09 64 65  ch (e) { }....de
3d50: 6c 65 74 65 20 63 61 63 6b 65 79 48 61 6e 64 6c  lete cackeyHandl
3d60: 65 3b 0a 0a 09 09 63 61 63 6b 65 79 48 61 6e 64  e;....cackeyHand
3d70: 6c 65 20 3d 20 6e 75 6c 6c 3b 0a 09 7d 0a 0a 09  le = null;..}...
3d80: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61  console.log("[ca
3d90: 63 6b 65 79 5d 20 63 61 63 6b 65 79 55 6e 69 6e  ckey] cackeyUnin
3da0: 69 74 28 29 20 63 6f 6d 70 6c 65 74 65 22 29 3b  it() complete");
3db0: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
3dc0: 0a 20 2a 20 52 65 73 74 61 72 74 73 20 43 41 43  . * Restarts CAC
3dd0: 4b 65 79 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e  Key. */.function
3de0: 20 63 61 63 6b 65 79 52 65 73 74 61 72 74 28 29   cackeyRestart()
3df0: 20 7b 0a 09 63 61 63 6b 65 79 55 6e 69 6e 69 74   {..cackeyUninit
3e00: 28 29 3b 0a 09 63 61 63 6b 65 79 49 6e 69 74 28  ();..cackeyInit(
3e10: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );...return;.}..
3e20: 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 49  function cackeyI
3e30: 6e 69 74 47 6c 6f 62 61 6c 53 74 61 74 65 28 29  nitGlobalState()
3e40: 20 7b 0a 09 63 61 63 6b 65 79 4f 75 74 73 74 61   {..cackeyOutsta
3e50: 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73 20 3d  ndingCallbacks =
3e60: 20 7b 7d 3b 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20 48   {};.};../*. * H
3e70: 61 6e 64 6c 65 20 61 20 43 41 43 4b 65 79 20 63  andle a CACKey c
3e80: 72 61 73 68 20 28 70 72 6f 62 61 62 6c 79 20 64  rash (probably d
3e90: 75 65 20 74 6f 20 6c 6f 73 73 20 6f 66 20 63 6f  ue to loss of co
3ea0: 6e 6e 65 63 74 69 76 69 74 79 20 74 6f 20 74 68  nnectivity to th
3eb0: 65 20 50 43 53 43 20 64 61 65 6d 6f 6e 29 0a 20  e PCSC daemon). 
3ec0: 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b  */.function cack
3ed0: 65 79 43 72 61 73 68 28 29 20 7b 0a 09 2f 2a 0a  eyCrash() {../*.
3ee0: 09 20 2a 20 44 65 2d 69 6e 69 74 69 61 6c 69 7a  . * De-initializ
3ef0: 65 20 43 41 43 4b 65 79 0a 09 20 2a 2f 0a 09 63  e CACKey.. */..c
3f00: 61 63 6b 65 79 55 6e 69 6e 69 74 28 29 3b 0a 0a  ackeyUninit();..
3f10: 09 2f 2a 0a 09 20 2a 20 52 65 69 6e 69 74 69 61  ./*.. * Reinitia
3f20: 6c 69 7a 65 20 67 6c 6f 62 61 6c 20 73 74 61 74  lize global stat
3f30: 65 0a 09 20 2a 2f 0a 09 63 61 63 6b 65 79 49 6e  e.. */..cackeyIn
3f40: 69 74 47 6c 6f 62 61 6c 53 74 61 74 65 28 29 3b  itGlobalState();
3f50: 0a 0a 09 2f 2a 0a 09 20 2a 20 53 63 68 65 64 75  .../*.. * Schedu
3f60: 6c 65 20 74 68 65 20 72 65 73 74 61 72 74 20 74  le the restart t
3f70: 6f 20 6f 63 63 75 72 20 69 6e 20 33 30 20 73 65  o occur in 30 se
3f80: 63 6f 6e 64 73 20 69 6e 20 63 61 73 65 20 77 65  conds in case we
3f90: 20 72 65 61 6c 6c 79 20 61 72 65 0a 09 20 2a 20   really are.. * 
3fa0: 6e 6f 74 20 77 6f 72 6b 69 6e 67 2e 0a 09 20 2a  not working... *
3fb0: 2f 0a 09 73 65 74 54 69 6d 65 6f 75 74 28 63 61  /..setTimeout(ca
3fc0: 63 6b 65 79 49 6e 69 74 2c 20 33 30 30 30 30 29  ckeyInit, 30000)
3fd0: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 66  ;...return;.}..f
3fe0: 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 49 6e  unction cackeyIn
3ff0: 69 74 50 43 53 43 43 6f 6d 70 6c 65 74 65 64 28  itPCSCCompleted(
4000: 73 74 61 74 65 29 20 7b 0a 09 76 61 72 20 69 64  state) {..var id
4010: 78 3b 0a 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67  x;...console.log
4020: 28 22 5b 63 61 63 6b 65 79 5d 20 43 6f 6e 6e 65  ("[cackey] Conne
4030: 63 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20  ction completed 
4040: 28 73 74 61 74 65 20 3d 20 5c 22 22 20 2b 20 73  (state = \"" + s
4050: 74 61 74 65 20 2b 20 22 5c 22 29 2c 20 73 65 6e  tate + "\"), sen
4060: 64 69 6e 67 20 71 75 65 75 65 64 20 65 76 65 6e  ding queued even
4070: 74 73 3a 20 22 20 2b 20 63 61 63 6b 65 79 43 61  ts: " + cackeyCa
4080: 6c 6c 62 61 63 6b 41 66 74 65 72 49 6e 69 74 2e  llbackAfterInit.
4090: 6c 65 6e 67 74 68 29 3b 0a 0a 09 73 77 69 74 63  length);...switc
40a0: 68 20 28 73 74 61 74 65 29 20 7b 0a 09 09 63 61  h (state) {...ca
40b0: 73 65 20 22 73 75 63 63 65 73 73 22 3a 0a 09 09  se "success":...
40c0: 09 63 61 63 6b 65 79 50 43 53 43 48 61 6e 64 6c  .cackeyPCSCHandl
40d0: 65 55 73 61 62 6c 65 20 3d 20 74 72 75 65 3b 0a  eUsable = true;.
40e0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
40f0: 65 20 22 66 61 69 6c 75 72 65 22 3a 0a 09 09 09  e "failure":....
4100: 63 61 63 6b 65 79 50 43 53 43 48 61 6e 64 6c 65  cackeyPCSCHandle
4110: 55 73 61 62 6c 65 20 3d 20 66 61 6c 73 65 3b 0a  Usable = false;.
4120: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
4130: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
4140: 78 20 3c 20 63 61 63 6b 65 79 43 61 6c 6c 62 61  x < cackeyCallba
4150: 63 6b 41 66 74 65 72 49 6e 69 74 2e 6c 65 6e 67  ckAfterInit.leng
4160: 74 68 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  th; idx++) {...i
4170: 66 20 28 21 63 61 63 6b 65 79 43 61 6c 6c 62 61  f (!cackeyCallba
4180: 63 6b 41 66 74 65 72 49 6e 69 74 5b 69 64 78 5d  ckAfterInit[idx]
4190: 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ) {....continue;
41a0: 0a 09 09 7d 0a 0a 09 09 73 77 69 74 63 68 20 28  ...}....switch (
41b0: 73 74 61 74 65 29 20 7b 0a 09 09 09 63 61 73 65  state) {....case
41c0: 20 22 73 75 63 63 65 73 73 22 3a 0a 09 09 09 09   "success":.....
41d0: 28 63 61 63 6b 65 79 43 61 6c 6c 62 61 63 6b 41  (cackeyCallbackA
41e0: 66 74 65 72 49 6e 69 74 5b 69 64 78 5d 2e 73 75  fterInit[idx].su
41f0: 63 63 65 73 73 43 61 6c 6c 62 61 63 6b 29 28 29  ccessCallback)()
4200: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
4210: 09 63 61 73 65 20 22 66 61 69 6c 75 72 65 22 3a  .case "failure":
4220: 0a 09 09 09 09 28 63 61 63 6b 65 79 43 61 6c 6c  .....(cackeyCall
4230: 62 61 63 6b 41 66 74 65 72 49 6e 69 74 5b 69 64  backAfterInit[id
4240: 78 5d 2e 66 61 69 6c 75 72 65 43 61 6c 6c 62 61  x].failureCallba
4250: 63 6b 29 28 29 3b 0a 0a 09 09 09 09 62 72 65 61  ck)();......brea
4260: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 64 65 6c 65  k;...}..}...dele
4270: 74 65 20 63 61 63 6b 65 79 43 61 6c 6c 62 61 63  te cackeyCallbac
4280: 6b 41 66 74 65 72 49 6e 69 74 3b 0a 0a 09 63 61  kAfterInit;...ca
4290: 63 6b 65 79 43 61 6c 6c 62 61 63 6b 41 66 74 65  ckeyCallbackAfte
42a0: 72 49 6e 69 74 20 3d 20 5b 5d 3b 0a 0a 09 63 6f  rInit = [];...co
42b0: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b  nsole.log("[cack
42c0: 65 79 5d 20 41 6c 6c 20 71 75 65 75 65 64 20 65  ey] All queued e
42d0: 76 65 6e 74 73 20 70 72 6f 63 65 73 73 65 64 22  vents processed"
42e0: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );...return;.}..
42f0: 2f 2a 0a 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*. * Initialize
4300: 20 74 68 65 20 50 43 53 43 20 63 6f 6e 6e 65 63   the PCSC connec
4310: 74 69 6f 6e 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f  tion. */.functio
4320: 6e 20 63 61 63 6b 65 79 49 6e 69 74 50 43 53 43  n cackeyInitPCSC
4330: 28 63 61 6c 6c 62 61 63 6b 41 66 74 65 72 49 6e  (callbackAfterIn
4340: 69 74 2c 20 63 61 6c 6c 62 61 63 6b 49 6e 69 74  it, callbackInit
4350: 46 61 69 6c 65 64 29 20 7b 0a 09 2f 2a 0a 09 20  Failed) {../*.. 
4360: 2a 20 53 74 61 72 74 20 74 68 65 20 47 6f 6f 67  * Start the Goog
4370: 6c 65 20 50 43 53 43 20 49 6e 74 65 72 66 61 63  le PCSC Interfac
4380: 65 0a 09 20 2a 2f 0a 09 76 61 72 20 6e 6f 77 2c  e.. */..var now,
4390: 20 6c 61 73 74 55 73 65 64 4d 69 6c 6c 69 73 65   lastUsedMillise
43a0: 63 6f 6e 64 73 41 67 6f 3b 0a 0a 09 63 6f 6e 73  condsAgo;...cons
43b0: 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79  ole.log("[cackey
43c0: 5d 20 63 61 63 6b 65 79 49 6e 69 74 50 43 53 43  ] cackeyInitPCSC
43d0: 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 0a 09 6e  () called");...n
43e0: 6f 77 20 3d 20 28 6e 65 77 20 44 61 74 65 28 29  ow = (new Date()
43f0: 29 2e 67 65 74 54 69 6d 65 28 29 3b 0a 09 6c 61  ).getTime();..la
4400: 73 74 55 73 65 64 4d 69 6c 6c 69 73 65 63 6f 6e  stUsedMillisecon
4410: 64 73 41 67 6f 20 3d 20 6e 6f 77 20 2d 20 63 61  dsAgo = now - ca
4420: 63 6b 65 79 50 43 53 43 48 61 6e 64 6c 65 4c 61  ckeyPCSCHandleLa
4430: 73 74 55 73 65 64 3b 0a 0a 09 69 66 20 28 6c 61  stUsed;...if (la
4440: 73 74 55 73 65 64 4d 69 6c 6c 69 73 65 63 6f 6e  stUsedMillisecon
4450: 64 73 41 67 6f 20 3e 20 33 30 30 30 30 29 20 7b  dsAgo > 30000) {
4460: 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22  ...console.log("
4470: 5b 63 61 63 6b 65 79 5d 20 50 43 53 43 20 68 61  [cackey] PCSC ha
4480: 6e 64 6c 65 20 77 61 73 20 6c 61 73 74 20 75 73  ndle was last us
4490: 65 64 20 22 20 2b 20 6c 61 73 74 55 73 65 64 4d  ed " + lastUsedM
44a0: 69 6c 6c 69 73 65 63 6f 6e 64 73 41 67 6f 20 2b  illisecondsAgo +
44b0: 20 22 6d 73 20 61 67 6f 2c 20 72 65 73 74 61 72   "ms ago, restar
44c0: 74 69 6e 67 20 74 6f 20 67 65 74 20 61 20 6e 65  ting to get a ne
44d0: 77 20 68 61 6e 64 6c 65 22 29 3b 0a 09 09 63 61  w handle");...ca
44e0: 63 6b 65 79 52 65 73 74 61 72 74 28 29 3b 0a 09  ckeyRestart();..
44f0: 7d 0a 0a 09 63 61 63 6b 65 79 50 43 53 43 48 61  }...cackeyPCSCHa
4500: 6e 64 6c 65 4c 61 73 74 55 73 65 64 20 3d 20 6e  ndleLastUsed = n
4510: 6f 77 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 51 75 65  ow;.../*.. * Que
4520: 75 65 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b  ue this callback
4530: 20 74 6f 20 62 65 20 63 6f 6d 70 6c 65 74 65 64   to be completed
4540: 20 77 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 61   when initializa
4550: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65  tion is complete
4560: 0a 09 20 2a 2f 0a 09 69 66 20 28 63 61 6c 6c 62  .. */..if (callb
4570: 61 63 6b 41 66 74 65 72 49 6e 69 74 29 20 7b 0a  ackAfterInit) {.
4580: 09 09 63 61 63 6b 65 79 43 61 6c 6c 62 61 63 6b  ..cackeyCallback
4590: 41 66 74 65 72 49 6e 69 74 2e 70 75 73 68 28 7b  AfterInit.push({
45a0: 22 73 75 63 63 65 73 73 43 61 6c 6c 62 61 63 6b  "successCallback
45b0: 22 3a 20 63 61 6c 6c 62 61 63 6b 41 66 74 65 72  ": callbackAfter
45c0: 49 6e 69 74 2c 20 22 66 61 69 6c 75 72 65 43 61  Init, "failureCa
45d0: 6c 6c 62 61 63 6b 22 3a 20 63 61 6c 6c 62 61 63  llback": callbac
45e0: 6b 49 6e 69 74 46 61 69 6c 65 64 7d 29 3b 0a 09  kInitFailed});..
45f0: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 61 64  }.../*.. * No ad
4600: 64 69 74 69 6f 6e 61 6c 20 77 6f 72 6b 20 69 73  ditional work is
4610: 20 72 65 71 75 69 72 65 64 0a 09 20 2a 2f 0a 0a   required.. */..
4620: 09 69 66 20 28 63 61 63 6b 65 79 50 43 53 43 48  .if (cackeyPCSCH
4630: 61 6e 64 6c 65 29 20 7b 0a 09 09 63 6f 6e 73 6f  andle) {...conso
4640: 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d  le.log("[cackey]
4650: 20 50 43 53 43 20 68 61 6e 64 6c 65 20 69 73 20   PCSC handle is 
4660: 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 6e  already valid, n
4670: 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 22 29 3b  othing to do.");
4680: 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 50 43  ....if (cackeyPC
4690: 53 43 48 61 6e 64 6c 65 55 73 61 62 6c 65 29 20  SCHandleUsable) 
46a0: 7b 0a 09 09 09 63 61 63 6b 65 79 49 6e 69 74 50  {....cackeyInitP
46b0: 43 53 43 43 6f 6d 70 6c 65 74 65 64 28 22 73 75  CSCCompleted("su
46c0: 63 63 65 73 73 22 29 3b 0a 09 09 7d 0a 0a 09 09  ccess");...}....
46d0: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 2f 2a 0a  return;..}.../*.
46e0: 09 20 2a 20 53 61 6e 65 6c 79 20 69 6e 69 74 69  . * Sanely initi
46f0: 61 6c 69 7a 65 20 74 68 69 73 0a 09 20 2a 2f 0a  alize this.. */.
4700: 09 63 61 63 6b 65 79 50 43 53 43 48 61 6e 64 6c  .cackeyPCSCHandl
4710: 65 55 73 61 62 6c 65 20 3d 20 66 61 6c 73 65 3b  eUsable = false;
4720: 0a 0a 09 2f 2a 0a 09 20 2a 20 49 6e 69 74 69 61  .../*.. * Initia
4730: 6c 69 7a 65 20 74 68 65 20 43 41 43 4b 65 79 20  lize the CACKey 
4740: 50 4e 61 43 6c 20 6d 6f 64 75 6c 65 20 69 66 20  PNaCl module if 
4750: 6e 65 65 64 65 64 0a 09 20 2a 2f 0a 09 69 66 20  needed.. */..if 
4760: 28 63 61 63 6b 65 79 48 61 6e 64 6c 65 20 3d 3d  (cackeyHandle ==
4770: 20 6e 75 6c 6c 29 20 7b 0a 09 09 63 61 63 6b 65   null) {...cacke
4780: 79 49 6e 69 74 28 29 3b 0a 09 7d 0a 0a 09 2f 2a  yInit();..}.../*
4790: 0a 09 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  .. * Initialize 
47a0: 43 41 43 4b 65 79 20 77 69 74 68 20 74 68 65 20  CACKey with the 
47b0: 63 6f 72 72 65 63 74 20 68 61 6e 64 6c 65 20 74  correct handle t
47c0: 6f 20 74 61 6c 6b 20 74 6f 20 74 68 65 20 47 6f  o talk to the Go
47d0: 6f 67 6c 65 20 53 6d 61 72 74 63 61 72 64 20 4d  ogle Smartcard M
47e0: 61 6e 61 67 65 72 20 41 70 70 0a 09 20 2a 2f 0a  anager App.. */.
47f0: 09 63 61 63 6b 65 79 48 61 6e 64 6c 65 2e 70 6f  .cackeyHandle.po
4800: 73 74 4d 65 73 73 61 67 65 28 0a 09 09 7b 0a 09  stMessage(...{..
4810: 09 09 22 74 61 72 67 65 74 22 3a 20 22 63 61 63  .."target": "cac
4820: 6b 65 79 22 2c 0a 09 09 09 22 63 6f 6d 6d 61 6e  key",...."comman
4830: 64 22 3a 20 22 69 6e 69 74 22 0a 09 09 7d 0a 09  d": "init"...}..
4840: 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 49 6e 69 74  );.../*.. * Init
4850: 69 61 6c 69 7a 65 20 74 68 65 20 50 43 53 43 20  ialize the PCSC 
4860: 4e 61 43 6c 20 69 6e 74 65 72 66 61 63 65 0a 09  NaCl interface..
4870: 20 2a 2f 0a 09 63 61 63 6b 65 79 50 43 53 43 48   */..cackeyPCSCH
4880: 61 6e 64 6c 65 20 3d 20 6e 65 77 20 47 6f 6f 67  andle = new Goog
4890: 6c 65 53 6d 61 72 74 43 61 72 64 2e 50 63 73 63  leSmartCard.Pcsc
48a0: 4c 69 74 65 43 6c 69 65 6e 74 2e 4e 61 63 6c 43  LiteClient.NaclC
48b0: 6c 69 65 6e 74 42 61 63 6b 65 6e 64 28 0a 09 09  lientBackend(...
48c0: 6e 75 6c 6c 2c 0a 09 09 22 43 41 43 4b 65 79 22  null,..."CACKey"
48d0: 2c 0a 09 09 22 6b 68 70 66 65 61 61 6e 6a 6e 67  ,..."khpfeaanjng
48e0: 6d 63 6e 70 6c 62 64 6c 70 65 67 69 69 66 67 70  mcnplbdlpegiifgp
48f0: 66 67 64 63 6f 22 2c 0a 09 09 63 61 63 6b 65 79  fgdco",...cackey
4900: 48 61 6e 64 6c 65 0a 09 29 3b 20 0a 0a 09 63 6f  Handle..); ...co
4910: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b  nsole.log("[cack
4920: 65 79 5d 20 63 61 63 6b 65 79 49 6e 69 74 50 43  ey] cackeyInitPC
4930: 53 43 28 29 20 63 6f 6d 70 6c 65 74 65 22 29 3b  SC() complete");
4940: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
4950: 0a 20 2a 20 46 69 6e 69 73 68 20 70 65 72 66 6f  . * Finish perfo
4960: 72 6d 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  rming initializa
4970: 74 69 6f 6e 20 74 68 61 74 20 6d 75 73 74 20 77  tion that must w
4980: 61 69 74 20 75 6e 74 69 6c 20 77 65 20 68 61 76  ait until we hav
4990: 65 20 6c 6f 61 64 65 64 20 74 68 65 20 43 41 43  e loaded the CAC
49a0: 4b 65 79 20 6d 6f 64 75 6c 65 0a 20 2a 2f 0a 66  Key module. */.f
49b0: 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 49 6e  unction cackeyIn
49c0: 69 74 4c 6f 61 64 65 64 28 6d 65 73 73 61 67 65  itLoaded(message
49d0: 45 76 65 6e 74 29 20 7b 0a 09 63 6f 6e 73 6f 6c  Event) {..consol
49e0: 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20  e.log("[cackey] 
49f0: 4c 6f 61 64 65 64 20 43 41 43 4b 65 79 20 50 4e  Loaded CACKey PN
4a00: 61 43 6c 20 4d 6f 64 75 6c 65 22 29 3b 0a 0a 09  aCl Module");...
4a10: 2f 2a 20 52 65 67 69 73 74 65 72 20 6c 69 73 74  /* Register list
4a20: 65 6e 65 72 73 20 77 69 74 68 20 43 68 72 6f 6d  eners with Chrom
4a30: 65 20 2a 2f 0a 09 69 66 20 28 63 68 72 6f 6d 65  e */..if (chrome
4a40: 2e 63 65 72 74 69 66 69 63 61 74 65 50 72 6f 76  .certificateProv
4a50: 69 64 65 72 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c  ider) {...consol
4a60: 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20  e.log("[cackey] 
4a70: 52 65 67 69 73 74 65 72 65 64 20 43 65 72 74 69  Registered Certi
4a80: 66 69 63 61 74 65 20 68 61 6e 64 6c 65 72 73 20  ficate handlers 
4a90: 77 69 74 68 20 43 68 72 6f 6d 65 22 29 3b 0a 0a  with Chrome");..
4aa0: 09 09 63 68 72 6f 6d 65 2e 63 65 72 74 69 66 69  ..chrome.certifi
4ab0: 63 61 74 65 50 72 6f 76 69 64 65 72 2e 6f 6e 43  cateProvider.onC
4ac0: 65 72 74 69 66 69 63 61 74 65 73 52 65 71 75 65  ertificatesReque
4ad0: 73 74 65 64 2e 61 64 64 4c 69 73 74 65 6e 65 72  sted.addListener
4ae0: 28 63 61 63 6b 65 79 4c 69 73 74 43 65 72 74 69  (cackeyListCerti
4af0: 66 69 63 61 74 65 73 29 3b 0a 09 09 63 68 72 6f  ficates);...chro
4b00: 6d 65 2e 63 65 72 74 69 66 69 63 61 74 65 50 72  me.certificatePr
4b10: 6f 76 69 64 65 72 2e 6f 6e 53 69 67 6e 44 69 67  ovider.onSignDig
4b20: 65 73 74 52 65 71 75 65 73 74 65 64 2e 61 64 64  estRequested.add
4b30: 4c 69 73 74 65 6e 65 72 28 63 61 63 6b 65 79 53  Listener(cackeyS
4b40: 69 67 6e 4d 65 73 73 61 67 65 29 3b 0a 09 7d 0a  ignMessage);..}.
4b50: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
4b60: 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 43 41   * Initialize CA
4b70: 43 4b 65 79 20 61 6e 64 20 74 68 65 20 50 43 53  CKey and the PCS
4b80: 43 20 6c 69 62 72 61 72 79 20 66 72 6f 6d 20 47  C library from G
4b90: 6f 6f 67 6c 65 0a 20 2a 2f 0a 66 75 6e 63 74 69  oogle. */.functi
4ba0: 6f 6e 20 63 61 63 6b 65 79 49 6e 69 74 28 29 20  on cackeyInit() 
4bb0: 7b 0a 09 76 61 72 20 65 6c 65 6d 65 6e 74 45 6d  {..var elementEm
4bc0: 62 65 64 3b 0a 09 76 61 72 20 66 6f 72 63 65 4c  bed;..var forceL
4bd0: 6f 61 64 45 6c 65 6d 65 6e 74 3b 0a 0a 09 2f 2a  oadElement;.../*
4be0: 20 4c 6f 67 20 74 68 61 74 20 77 65 20 61 72 65   Log that we are
4bf0: 20 6f 70 65 72 61 74 69 6f 6e 61 6c 20 2a 2f 0a   operational */.
4c00: 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63  .console.log("[c
4c10: 61 63 6b 65 79 5d 20 63 61 63 6b 65 79 49 6e 69  ackey] cackeyIni
4c20: 74 28 29 3a 20 43 61 6c 6c 65 64 2e 22 29 3b 0a  t(): Called.");.
4c30: 0a 09 2f 2a 0a 09 20 2a 20 44 6f 20 6e 6f 74 20  ../*.. * Do not 
4c40: 69 6e 69 74 69 61 6c 69 7a 65 20 6d 75 6c 74 69  initialize multi
4c50: 70 6c 65 20 74 69 6d 65 73 0a 09 20 2a 2f 0a 09  ple times.. */..
4c60: 69 66 20 28 63 61 63 6b 65 79 48 61 6e 64 6c 65  if (cackeyHandle
4c70: 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09 63 6f   != null) {...co
4c80: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b  nsole.log("[cack
4c90: 65 79 5d 20 63 61 63 6b 65 79 49 6e 69 74 28 29  ey] cackeyInit()
4ca0: 3a 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61  : Already initia
4cb0: 6c 69 7a 65 64 2e 20 20 52 65 74 75 72 6e 69 6e  lized.  Returnin
4cc0: 67 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b  g.");....return;
4cd0: 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20  ..}.../* Verify 
4ce0: 74 68 61 74 20 77 65 20 63 61 6e 20 72 65 67 69  that we can regi
4cf0: 73 74 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a  ster callbacks *
4d00: 2f 0a 09 69 66 20 28 21 63 68 72 6f 6d 65 2e 63  /..if (!chrome.c
4d10: 65 72 74 69 66 69 63 61 74 65 50 72 6f 76 69 64  ertificateProvid
4d20: 65 72 29 20 7b 0a 09 09 69 66 20 28 21 67 6f 6f  er) {...if (!goo
4d30: 67 2e 44 45 42 55 47 29 20 7b 0a 09 09 09 63 6f  g.DEBUG) {....co
4d40: 6e 73 6f 6c 65 2e 69 6e 66 6f 28 22 5b 63 61 63  nsole.info("[cac
4d50: 6b 65 79 5d 20 54 68 69 73 20 65 78 74 65 6e 73  key] This extens
4d60: 69 6f 6e 27 73 20 70 72 69 6d 61 72 79 20 66 75  ion's primary fu
4d70: 6e 63 74 69 6f 6e 61 6c 69 74 79 20 6f 6e 6c 79  nctionality only
4d80: 20 77 6f 72 6b 73 20 6f 6e 20 43 68 72 6f 6d 65   works on Chrome
4d90: 4f 53 21 20 20 59 6f 75 20 77 6f 6e 27 74 20 62  OS!  You won't b
4da0: 65 20 61 62 6c 65 20 74 6f 20 64 6f 20 6d 75 63  e able to do muc
4db0: 68 20 77 69 74 68 20 69 74 2e 22 29 3b 0a 09 09  h with it.");...
4dc0: 7d 0a 09 7d 0a 0a 09 65 6c 65 6d 65 6e 74 45 6d  }..}...elementEm
4dd0: 62 65 64 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 63  bed = document.c
4de0: 72 65 61 74 65 45 6c 65 6d 65 6e 74 28 27 65 6d  reateElement('em
4df0: 62 65 64 27 29 3b 0a 09 65 6c 65 6d 65 6e 74 45  bed');..elementE
4e00: 6d 62 65 64 2e 74 79 70 65 20 3d 20 22 61 70 70  mbed.type = "app
4e10: 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 6e 61 63 6c  lication/x-pnacl
4e20: 22 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64  ";..elementEmbed
4e30: 2e 77 69 64 74 68 20 3d 20 30 3b 0a 09 65 6c 65  .width = 0;..ele
4e40: 6d 65 6e 74 45 6d 62 65 64 2e 68 65 69 67 68 74  mentEmbed.height
4e50: 20 3d 20 30 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d   = 0;..elementEm
4e60: 62 65 64 2e 73 72 63 20 3d 20 22 63 61 63 6b 65  bed.src = "cacke
4e70: 79 2e 6e 6d 66 22 3b 0a 09 65 6c 65 6d 65 6e 74  y.nmf";..element
4e80: 45 6d 62 65 64 2e 69 64 20 3d 20 22 63 61 63 6b  Embed.id = "cack
4e90: 65 79 4d 6f 64 75 6c 65 22 3b 0a 09 65 6c 65 6d  eyModule";..elem
4ea0: 65 6e 74 45 6d 62 65 64 2e 61 64 64 45 76 65 6e  entEmbed.addEven
4eb0: 74 4c 69 73 74 65 6e 65 72 28 27 65 72 72 6f 72  tListener('error
4ec0: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 6d 65 73 73  ', function(mess
4ed0: 61 67 65 45 76 65 6e 74 29 20 7b 20 63 6f 6e 73  ageEvent) { cons
4ee0: 6f 6c 65 2e 65 72 72 6f 72 28 22 45 72 72 6f 72  ole.error("Error
4ef0: 20 6c 6f 61 64 69 6e 67 20 43 41 43 4b 65 79 20   loading CACKey 
4f00: 50 4e 61 43 6c 20 4d 6f 64 75 6c 65 3a 20 22 20  PNaCl Module: " 
4f10: 2b 20 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64  + messageEvent.d
4f20: 61 74 61 29 3b 20 7d 2c 20 74 72 75 65 29 3b 0a  ata); }, true);.
4f30: 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64 2e 61 64  .elementEmbed.ad
4f40: 64 45 76 65 6e 74 4c 69 73 74 65 6e 65 72 28 27  dEventListener('
4f50: 6c 6f 61 64 27 2c 20 63 61 63 6b 65 79 49 6e 69  load', cackeyIni
4f60: 74 4c 6f 61 64 65 64 2c 20 74 72 75 65 29 3b 0a  tLoaded, true);.
4f70: 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64 2e 61 64  .elementEmbed.ad
4f80: 64 45 76 65 6e 74 4c 69 73 74 65 6e 65 72 28 27  dEventListener('
4f90: 63 72 61 73 68 27 2c 20 63 61 63 6b 65 79 43 72  crash', cackeyCr
4fa0: 61 73 68 2c 20 74 72 75 65 29 3b 0a 09 65 6c 65  ash, true);..ele
4fb0: 6d 65 6e 74 45 6d 62 65 64 2e 61 64 64 45 76 65  mentEmbed.addEve
4fc0: 6e 74 4c 69 73 74 65 6e 65 72 28 27 6d 65 73 73  ntListener('mess
4fd0: 61 67 65 27 2c 20 63 61 63 6b 65 79 4d 65 73 73  age', cackeyMess
4fe0: 61 67 65 49 6e 63 6f 6d 69 6e 67 2c 20 74 72 75  ageIncoming, tru
4ff0: 65 29 3b 0a 0a 09 63 61 63 6b 65 79 48 61 6e 64  e);...cackeyHand
5000: 6c 65 20 3d 20 65 6c 65 6d 65 6e 74 45 6d 62 65  le = elementEmbe
5010: 64 3b 0a 0a 09 64 6f 63 75 6d 65 6e 74 2e 62 6f  d;...document.bo
5020: 64 79 2e 61 70 70 65 6e 64 43 68 69 6c 64 28 63  dy.appendChild(c
5030: 61 63 6b 65 79 48 61 6e 64 6c 65 29 0a 0a 09 2f  ackeyHandle).../
5040: 2a 0a 09 20 2a 20 46 6f 72 63 65 20 74 68 65 20  *.. * Force the 
5050: 62 72 6f 77 73 65 72 20 74 6f 20 6c 6f 61 64 20  browser to load 
5060: 74 68 65 20 65 6c 65 6d 65 6e 74 0a 09 20 2a 20  the element.. * 
5070: 62 79 20 72 65 71 75 65 73 74 69 6e 67 20 69 74  by requesting it
5080: 73 20 70 6f 73 69 74 69 6f 6e 0a 09 20 2a 2f 0a  s position.. */.
5090: 09 66 6f 72 63 65 4c 6f 61 64 45 6c 65 6d 65 6e  .forceLoadElemen
50a0: 74 20 3d 20 63 61 63 6b 65 79 48 61 6e 64 6c 65  t = cackeyHandle
50b0: 2e 6f 66 66 73 65 74 54 6f 70 3b 0a 0a 09 63 6f  .offsetTop;...co
50c0: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b  nsole.log("[cack
50d0: 65 79 5d 20 63 61 63 6b 65 79 49 6e 69 74 28 29  ey] cackeyInit()
50e0: 3a 20 43 6f 6d 70 6c 65 74 65 64 2e 20 20 52 65  : Completed.  Re
50f0: 74 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65  turning.");...re
5100: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 49  turn;.}../*. * I
5110: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 43 41  nitialize the CA
5120: 43 4b 65 79 20 43 68 72 6f 6d 65 20 41 70 70 6c  CKey Chrome Appl
5130: 69 63 61 74 69 6f 6e 0a 20 2a 2f 0a 66 75 6e 63  ication. */.func
5140: 74 69 6f 6e 20 63 61 63 6b 65 79 41 70 70 49 6e  tion cackeyAppIn
5150: 69 74 28 29 20 7b 0a 09 76 61 72 20 6f 6c 64 4f  it() {..var oldO
5160: 6e 50 6f 72 74 44 69 73 63 6f 6e 6e 65 63 74 65  nPortDisconnecte
5170: 64 46 75 6e 63 74 69 6f 6e 3b 0a 09 76 61 72 20  dFunction;..var 
5180: 6f 6c 64 50 43 53 43 49 6e 69 74 69 61 6c 69 7a  oldPCSCInitializ
5190: 61 74 69 6f 6e 43 61 6c 6c 62 61 63 6b 3b 0a 0a  ationCallback;..
51a0: 09 2f 2a 0a 09 20 2a 20 43 72 65 61 74 65 20 61  ./*.. * Create a
51b0: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 73 74 61   handler for sta
51c0: 72 74 69 6e 67 20 74 68 65 20 61 70 70 6c 69 63  rting the applic
51d0: 61 74 69 6f 6e 20 55 49 0a 09 20 2a 2f 0a 09 63  ation UI.. */..c
51e0: 68 72 6f 6d 65 2e 61 70 70 2e 72 75 6e 74 69 6d  hrome.app.runtim
51f0: 65 2e 6f 6e 4c 61 75 6e 63 68 65 64 2e 61 64 64  e.onLaunched.add
5200: 4c 69 73 74 65 6e 65 72 28 66 75 6e 63 74 69 6f  Listener(functio
5210: 6e 28 29 20 7b 0a 09 09 63 68 72 6f 6d 65 2e 61  n() {...chrome.a
5220: 70 70 2e 77 69 6e 64 6f 77 2e 63 72 65 61 74 65  pp.window.create
5230: 28 27 75 69 2e 68 74 6d 6c 27 2c 20 7b 0a 09 09  ('ui.html', {...
5240: 09 22 69 64 22 3a 20 22 63 61 63 6b 65 79 55 49  ."id": "cackeyUI
5250: 22 2c 0a 09 09 09 22 66 6f 63 75 73 65 64 22 3a  ",...."focused":
5260: 20 74 72 75 65 2c 0a 09 09 09 22 69 6e 6e 65 72   true,...."inner
5270: 42 6f 75 6e 64 73 22 3a 20 7b 0a 09 09 09 09 22  Bounds": {....."
5280: 77 69 64 74 68 22 3a 20 33 35 30 2c 0a 09 09 09  width": 350,....
5290: 09 22 6d 69 6e 57 69 64 74 68 22 3a 20 33 35 30  ."minWidth": 350
52a0: 2c 0a 09 09 09 09 22 68 65 69 67 68 74 22 3a 20  ,....."height": 
52b0: 31 33 36 2c 0a 09 09 09 09 22 6d 69 6e 48 65 69  136,....."minHei
52c0: 67 68 74 22 3a 20 31 33 35 0a 09 09 09 7d 0a 09  ght": 135....}..
52d0: 09 7d 2c 20 66 75 6e 63 74 69 6f 6e 28 75 69 57  .}, function(uiW
52e0: 69 6e 64 6f 77 29 20 7b 0a 09 09 09 69 66 20 28  indow) {....if (
52f0: 21 75 69 57 69 6e 64 6f 77 29 20 7b 0a 09 09 09  !uiWindow) {....
5300: 09 72 65 74 75 72 6e 3b 0a 09 09 09 7d 0a 0a 09  .return;....}...
5310: 09 09 75 69 57 69 6e 64 6f 77 2e 63 6f 6e 74 65  ..uiWindow.conte
5320: 6e 74 57 69 6e 64 6f 77 2e 70 61 72 65 6e 74 57  ntWindow.parentW
5330: 69 6e 64 6f 77 20 3d 20 77 69 6e 64 6f 77 3b 0a  indow = window;.
5340: 09 09 7d 29 3b 0a 09 7d 29 3b 0a 0a 2f 2f 20 47  ..});..});..// G
5350: 6f 6f 67 6c 65 20 67 6f 74 20 72 69 64 20 6f 66  oogle got rid of
5360: 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
5370: 20 77 65 20 77 65 72 65 20 75 73 69 6e 67 20 74   we were using t
5380: 6f 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68  o interface with
5390: 20 50 43 53 43 2e 2e 2e 20 0a 2f 2f 20 54 68 69   PCSC... .// Thi
53a0: 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
53b0: 77 72 69 74 74 65 6e 20 74 6f 20 75 73 65 20 74  written to use t
53c0: 68 65 20 6e 65 77 20 69 6e 74 65 72 66 61 63 65  he new interface
53d0: 0a 2f 2f 0a 2f 2f 09 2f 2a 0a 2f 2f 09 20 2a 20  .//.//./*.//. * 
53e0: 52 65 67 69 73 74 65 72 20 61 20 68 61 6e 64 6c  Register a handl
53f0: 65 72 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77  er for dealing w
5400: 69 74 68 20 74 68 65 20 50 43 53 43 20 70 6f 72  ith the PCSC por
5410: 74 20 62 65 69 6e 67 20 64 69 73 63 6f 6e 6e 65  t being disconne
5420: 63 74 65 64 0a 2f 2f 09 20 2a 2f 0a 2f 2f 09 6f  cted.//. */.//.o
5430: 6c 64 4f 6e 50 6f 72 74 44 69 73 63 6f 6e 6e 65  ldOnPortDisconne
5440: 63 74 65 64 46 75 6e 63 74 69 6f 6e 20 3d 20 47  ctedFunction = G
5450: 6f 6f 67 6c 65 53 6d 61 72 74 43 61 72 64 2e 50  oogleSmartCard.P
5460: 63 73 63 2e 70 72 6f 74 6f 74 79 70 65 2e 6f 6e  csc.prototype.on
5470: 50 6f 72 74 44 69 73 63 6f 6e 6e 65 63 74 65 64  PortDisconnected
5480: 5f 3b 0a 2f 2f 09 47 6f 6f 67 6c 65 53 6d 61 72  _;.//.GoogleSmar
5490: 74 43 61 72 64 2e 50 63 73 63 2e 70 72 6f 74 6f  tCard.Pcsc.proto
54a0: 74 79 70 65 2e 6f 6e 50 6f 72 74 44 69 73 63 6f  type.onPortDisco
54b0: 6e 6e 65 63 74 65 64 5f 20 3d 20 66 75 6e 63 74  nnected_ = funct
54c0: 69 6f 6e 28 29 20 7b 0a 2f 2f 09 09 6f 6c 64 4f  ion() {.//..oldO
54d0: 6e 50 6f 72 74 44 69 73 63 6f 6e 6e 65 63 74 65  nPortDisconnecte
54e0: 64 46 75 6e 63 74 69 6f 6e 2e 61 70 70 6c 79 28  dFunction.apply(
54f0: 74 68 69 73 29 3b 0a 2f 2f 0a 2f 2f 09 09 63 61  this);.//.//..ca
5500: 63 6b 65 79 49 6e 69 74 50 43 53 43 43 6f 6d 70  ckeyInitPCSCComp
5510: 6c 65 74 65 64 28 22 66 61 69 6c 75 72 65 22 29  leted("failure")
5520: 3b 0a 2f 2f 0a 2f 2f 09 09 63 61 63 6b 65 79 52  ;.//.//..cackeyR
5530: 65 73 74 61 72 74 28 29 3b 0a 2f 2f 0a 2f 2f 09  estart();.//.//.
5540: 09 72 65 74 75 72 6e 3b 0a 2f 2f 09 7d 3b 0a 2f  .return;.//.};./
5550: 2f 0a 2f 2f 09 2f 2a 0a 2f 2f 09 20 2a 20 52 65  /.//./*.//. * Re
5560: 67 69 73 74 65 72 20 61 20 68 61 6e 64 6c 65 72  gister a handler
5570: 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77 69 74   for dealing wit
5580: 68 20 74 68 65 20 50 43 53 43 20 70 6f 72 74 20  h the PCSC port 
5590: 62 65 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 0a  being available.
55a0: 2f 2f 09 20 2a 2f 0a 2f 2f 09 6f 6c 64 50 43 53  //. */.//.oldPCS
55b0: 43 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 43  CInitializationC
55c0: 61 6c 6c 62 61 63 6b 20 3d 20 47 6f 6f 67 6c 65  allback = Google
55d0: 53 6d 61 72 74 43 61 72 64 2e 50 63 73 63 4e 61  SmartCard.PcscNa
55e0: 63 6c 2e 70 72 6f 74 6f 74 79 70 65 2e 70 63 73  cl.prototype.pcs
55f0: 63 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 43  cInitializationC
5600: 61 6c 6c 62 61 63 6b 5f 3b 0a 2f 2f 09 47 6f 6f  allback_;.//.Goo
5610: 67 6c 65 53 6d 61 72 74 43 61 72 64 2e 50 63 73  gleSmartCard.Pcs
5620: 63 4e 61 63 6c 2e 70 72 6f 74 6f 74 79 70 65 2e  cNacl.prototype.
5630: 70 63 73 63 49 6e 69 74 69 61 6c 69 7a 61 74 69  pcscInitializati
5640: 6f 6e 43 61 6c 6c 62 61 63 6b 5f 20 3d 20 66 75  onCallback_ = fu
5650: 6e 63 74 69 6f 6e 28 72 65 71 75 65 73 74 49 64  nction(requestId
5660: 2c 20 69 6e 73 74 61 6e 63 65 49 64 2c 20 69 6e  , instanceId, in
5670: 73 74 61 6e 63 65 2c 20 65 72 72 6f 72 29 20 7b  stance, error) {
5680: 0a 2f 2f 09 09 6f 6c 64 50 43 53 43 49 6e 69 74  .//..oldPCSCInit
5690: 69 61 6c 69 7a 61 74 69 6f 6e 43 61 6c 6c 62 61  ializationCallba
56a0: 63 6b 2e 61 70 70 6c 79 28 74 68 69 73 2c 20 5b  ck.apply(this, [
56b0: 72 65 71 75 65 73 74 49 64 2c 20 69 6e 73 74 61  requestId, insta
56c0: 6e 63 65 49 64 2c 20 69 6e 73 74 61 6e 63 65 2c  nceId, instance,
56d0: 20 65 72 72 6f 72 5d 29 3b 0a 2f 2f 0a 2f 2f 09   error]);.//.//.
56e0: 09 72 65 74 75 72 6e 3b 0a 2f 2f 09 7d 3b 0a 2f  .return;.//.};./
56f0: 2f 0a 09 2f 2a 0a 09 20 2a 20 49 6e 69 74 69 61  /../*.. * Initia
5700: 6c 69 7a 65 20 67 6c 6f 62 61 6c 20 73 74 61 74  lize global stat
5710: 65 0a 09 20 2a 2f 0a 09 63 61 63 6b 65 79 49 6e  e.. */..cackeyIn
5720: 69 74 47 6c 6f 62 61 6c 53 74 61 74 65 28 29 3b  itGlobalState();
5730: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
5740: 20 49 6e 69 74 69 61 6c 69 7a 65 20 43 41 43 4b   Initialize CACK
5750: 65 79 20 2a 2f 0a 63 61 63 6b 65 79 41 70 70 49  ey */.cackeyAppI
5760: 6e 69 74 28 29 3b 0a 63 61 63 6b 65 79 49 6e 69  nit();.cackeyIni
5770: 74 28 29 3b 0a                                   t();.