Hex Artifact Content

Artifact 21d583c5914b2c5ed0b2aa46839ec78b2fcf5e83:


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 2c 0a 09 75 73 65 43 68 72 6f  : true,..useChro
0170: 6d 65 50 49 4e 44 69 61 6c 6f 67 3a 20 74 72 75  mePINDialog: tru
0180: 65 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64  e.};../*. * Hand
0190: 6c 65 20 66 6f 72 20 74 68 65 20 43 41 43 4b 65  le for the CACKe
01a0: 79 20 4e 61 43 6c 20 54 61 72 67 65 74 0a 20 2a  y NaCl Target. *
01b0: 2f 0a 76 61 72 20 63 61 63 6b 65 79 48 61 6e 64  /.var cackeyHand
01c0: 6c 65 20 3d 20 6e 75 6c 6c 3b 0a 76 61 72 20 63  le = null;.var c
01d0: 61 63 6b 65 79 50 43 53 43 48 61 6e 64 6c 65 20  ackeyPCSCHandle 
01e0: 3d 20 6e 75 6c 6c 3b 0a 76 61 72 20 63 61 63 6b  = null;.var cack
01f0: 65 79 50 43 53 43 48 61 6e 64 6c 65 55 73 61 62  eyPCSCHandleUsab
0200: 6c 65 20 3d 20 66 61 6c 73 65 3b 0a 76 61 72 20  le = false;.var 
0210: 63 61 63 6b 65 79 50 43 53 43 48 61 6e 64 6c 65  cackeyPCSCHandle
0220: 4c 61 73 74 55 73 65 64 20 3d 20 28 6e 65 77 20  LastUsed = (new 
0230: 44 61 74 65 28 29 29 2e 67 65 74 54 69 6d 65 28  Date()).getTime(
0240: 29 3b 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65  );../*. * Handle
0250: 20 61 6e 64 20 49 44 20 66 6f 72 20 6f 75 74 73   and ID for outs
0260: 74 61 6e 64 69 6e 67 20 63 61 6c 6c 62 61 63 6b  tanding callback
0270: 73 0a 20 2a 2f 0a 76 61 72 20 63 61 63 6b 65 79  s. */.var cackey
0280: 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62  OutstandingCallb
0290: 61 63 6b 73 20 3d 20 7b 7d 0a 76 61 72 20 63 61  acks = {}.var ca
02a0: 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43  ckeyOutstandingC
02b0: 61 6c 6c 62 61 63 6b 43 6f 75 6e 74 65 72 20 3d  allbackCounter =
02c0: 20 2d 31 3b 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d 6d   -1;../*. * Comm
02d0: 75 6e 69 63 61 74 69 6f 6e 20 77 69 74 68 20 74  unication with t
02e0: 68 65 20 50 49 4e 20 65 6e 74 72 79 20 77 69 6e  he PIN entry win
02f0: 64 6f 77 0a 20 2a 2f 0a 76 61 72 20 70 69 6e 57  dow. */.var pinW
0300: 69 6e 64 6f 77 50 49 4e 56 61 6c 75 65 20 3d 20  indowPINValue = 
0310: 22 22 3b 0a 76 61 72 20 70 69 6e 57 69 6e 64 6f  "";.var pinWindo
0320: 77 50 72 65 76 69 6f 75 73 48 61 6e 64 6c 65 20  wPreviousHandle 
0330: 3d 20 6e 75 6c 6c 3b 0a 0a 2f 2a 0a 20 2a 20 4d  = null;../*. * M
0340: 65 73 73 61 67 65 73 20 74 68 61 74 20 6d 61 79  essages that may
0350: 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 74 72   need to be retr
0360: 69 65 64 20 61 66 74 65 72 20 67 65 74 74 69 6e  ied after gettin
0370: 67 20 61 20 50 49 4e 0a 20 2a 2f 0a 76 61 72 20  g a PIN. */.var 
0380: 63 61 63 6b 65 79 4d 65 73 73 61 67 65 73 54 6f  cackeyMessagesTo
0390: 52 65 74 72 79 20 3d 20 5b 5d 3b 0a 0a 2f 2a 0a  Retry = [];../*.
03a0: 20 2a 20 53 74 6f 72 65 64 20 50 49 4e 20 66 6f   * Stored PIN fo
03b0: 72 20 61 20 67 69 76 65 6e 20 63 65 72 74 69 66  r a given certif
03c0: 69 63 61 74 65 0a 20 2a 2f 0a 76 61 72 20 63 61  icate. */.var ca
03d0: 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54  ckeyCertificateT
03e0: 6f 50 49 4e 4d 61 70 20 3d 20 7b 7d 3b 0a 76 61  oPINMap = {};.va
03f0: 72 20 63 61 63 6b 65 79 43 65 72 74 69 66 69 63  r cackeyCertific
0400: 61 74 65 54 6f 50 49 4e 4d 61 70 4c 61 73 74 55  ateToPINMapLastU
0410: 73 65 64 52 75 6e 6e 65 72 20 3d 20 66 61 6c 73  sedRunner = fals
0420: 65 3b 0a 0a 2f 2a 0a 20 2a 20 43 61 6c 6c 62 61  e;../*. * Callba
0430: 63 6b 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 61  cks to perform a
0440: 66 74 65 72 20 50 43 53 43 20 63 6f 6d 65 73 20  fter PCSC comes 
0450: 6f 6e 6c 69 6e 65 0a 20 2a 2f 0a 63 61 63 6b 65  online. */.cacke
0460: 79 43 61 6c 6c 62 61 63 6b 41 66 74 65 72 49 6e  yCallbackAfterIn
0470: 69 74 20 3d 20 5b 5d 3b 0a 0a 2f 2a 0a 20 2a 20  it = [];../*. * 
0480: 43 6f 6d 70 75 74 65 20 61 20 74 65 78 74 2d 62  Compute a text-b
0490: 61 73 65 64 20 68 61 6e 64 6c 65 20 66 6f 72 20  ased handle for 
04a0: 61 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f  a certificate to
04b0: 20 62 65 20 68 61 73 68 65 64 20 62 79 0a 20 2a   be hashed by. *
04c0: 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65  /.function cacke
04d0: 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49  yCertificateToPI
04e0: 4e 49 44 28 63 65 72 74 69 66 69 63 61 74 65 29  NID(certificate)
04f0: 20 7b 0a 09 76 61 72 20 69 64 3b 0a 09 76 61 72   {..var id;..var
0500: 20 63 65 72 74 69 66 69 63 61 74 65 41 72 72 61   certificateArra
0510: 79 3b 0a 0a 09 69 64 20 3d 20 22 22 3b 0a 0a 09  y;...id = "";...
0520: 63 65 72 74 69 66 69 63 61 74 65 41 72 72 61 79  certificateArray
0530: 20 3d 20 6e 65 77 20 55 69 6e 74 38 41 72 72 61   = new Uint8Arra
0540: 79 28 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a  y(certificate);.
0550: 0a 09 63 65 72 74 69 66 69 63 61 74 65 41 72 72  ..certificateArr
0560: 61 79 2e 6d 61 70 28 0a 09 09 66 75 6e 63 74 69  ay.map(...functi
0570: 6f 6e 28 62 79 74 65 29 20 7b 0a 09 09 09 69 64  on(byte) {....id
0580: 20 2b 3d 20 28 22 30 22 20 2b 20 62 79 74 65 2e   += ("0" + byte.
0590: 74 6f 53 74 72 69 6e 67 28 31 36 29 29 2e 73 6c  toString(16)).sl
05a0: 69 63 65 28 2d 32 29 3b 0a 09 09 7d 0a 09 29 3b  ice(-2);...}..);
05b0: 0a 0a 09 64 65 6c 65 74 65 20 63 65 72 74 69 66  ...delete certif
05c0: 69 63 61 74 65 41 72 72 61 79 3b 0a 0a 09 72 65  icateArray;...re
05d0: 74 75 72 6e 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a  turn(id);.}../*.
05e0: 20 2a 20 48 61 6e 64 6c 65 20 61 20 72 65 73 70   * Handle a resp
05f0: 6f 6e 73 65 20 66 72 6f 6d 20 74 68 65 20 4e 61  onse from the Na
0600: 43 6c 20 73 69 64 65 20 72 65 67 61 72 64 69 6e  Cl side regardin
0610: 67 20 63 65 72 74 69 66 69 63 61 74 65 73 20 61  g certificates a
0620: 76 61 69 6c 61 62 6c 65 0a 20 2a 2f 0a 66 75 6e  vailable. */.fun
0630: 63 74 69 6f 6e 20 63 61 63 6b 65 79 4d 65 73 73  ction cackeyMess
0640: 61 67 65 49 6e 63 6f 6d 69 6e 67 4c 69 73 74 43  ageIncomingListC
0650: 65 72 74 69 66 69 63 61 74 65 73 28 6d 65 73 73  ertificates(mess
0660: 61 67 65 2c 20 63 68 72 6f 6d 65 43 61 6c 6c 62  age, chromeCallb
0670: 61 63 6b 29 20 7b 0a 09 76 61 72 20 69 64 78 3b  ack) {..var idx;
0680: 0a 09 76 61 72 20 63 65 72 74 69 66 69 63 61 74  ..var certificat
0690: 65 73 20 3d 20 5b 5d 3b 0a 0a 09 69 66 20 28 21  es = [];...if (!
06a0: 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 20  chromeCallback) 
06b0: 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  {...return;..}..
06c0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
06d0: 64 78 20 3c 20 6d 65 73 73 61 67 65 2e 63 65 72  dx < message.cer
06e0: 74 69 66 69 63 61 74 65 73 2e 6c 65 6e 67 74 68  tificates.length
06f0: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 65 72  ; idx++) {...cer
0700: 74 69 66 69 63 61 74 65 73 2e 70 75 73 68 28 0a  tificates.push(.
0710: 09 09 09 7b 0a 09 09 09 09 63 65 72 74 69 66 69  ...{.....certifi
0720: 63 61 74 65 3a 20 6d 65 73 73 61 67 65 2e 63 65  cate: message.ce
0730: 72 74 69 66 69 63 61 74 65 73 5b 69 64 78 5d 2c  rtificates[idx],
0740: 0a 09 09 09 09 73 75 70 70 6f 72 74 65 64 48 61  .....supportedHa
0750: 73 68 65 73 3a 20 5b 27 53 48 41 31 27 2c 20 27  shes: ['SHA1', '
0760: 53 48 41 32 35 36 27 2c 20 27 53 48 41 35 31 32  SHA256', 'SHA512
0770: 27 2c 20 27 4d 44 35 5f 53 48 41 31 27 5d 0a 09  ', 'MD5_SHA1']..
0780: 09 09 7d 0a 09 09 29 3b 0a 09 7d 0a 0a 09 63 68  ..}...);..}...ch
0790: 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 28 63 65 72  romeCallback(cer
07a0: 74 69 66 69 63 61 74 65 73 2c 0a 09 09 66 75 6e  tificates,...fun
07b0: 63 74 69 6f 6e 28 72 65 6a 65 63 74 65 64 43 65  ction(rejectedCe
07c0: 72 74 73 29 20 7b 0a 09 09 09 69 66 20 28 63 68  rts) {....if (ch
07d0: 72 6f 6d 65 2e 72 75 6e 74 69 6d 65 2e 6c 61 73  rome.runtime.las
07e0: 74 45 72 72 6f 72 29 20 7b 0a 09 09 09 09 72 65  tError) {.....re
07f0: 74 75 72 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  turn;....}.....i
0800: 66 20 28 72 65 6a 65 63 74 65 64 43 65 72 74 73  f (rejectedCerts
0810: 2e 6c 65 6e 67 74 68 20 21 3d 3d 20 30 29 20 7b  .length !== 0) {
0820: 0a 09 09 09 09 6f 6e 43 65 72 74 69 66 69 63 61  .....onCertifica
0830: 74 65 73 52 65 6a 65 63 74 65 64 28 72 65 6a 65  tesRejected(reje
0840: 63 74 65 64 43 65 72 74 73 29 3b 0a 09 09 09 7d  ctedCerts);....}
0850: 0a 0a 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 7d  .....return;...}
0860: 0a 09 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ..);...return;.}
0870: 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65 20 61  ../*. * Handle a
0880: 20 72 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 74   response from t
0890: 68 65 20 4e 61 43 6c 20 73 69 64 65 20 72 65 67  he NaCl side reg
08a0: 61 72 64 69 6e 67 20 61 20 6c 69 73 74 20 6f 66  arding a list of
08b0: 20 72 65 61 64 65 72 73 0a 20 2a 2f 0a 66 75 6e   readers. */.fun
08c0: 63 74 69 6f 6e 20 63 61 63 6b 65 79 4d 65 73 73  ction cackeyMess
08d0: 61 67 65 49 6e 63 6f 6d 69 6e 67 4c 69 73 74 52  ageIncomingListR
08e0: 65 61 64 65 72 73 28 6d 65 73 73 61 67 65 2c 20  eaders(message, 
08f0: 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 20  chromeCallback) 
0900: 7b 0a 09 69 66 20 28 21 63 68 72 6f 6d 65 43 61  {..if (!chromeCa
0910: 6c 6c 62 61 63 6b 29 20 7b 0a 09 09 72 65 74 75  llback) {...retu
0920: 72 6e 3b 0a 09 7d 0a 0a 09 63 68 72 6f 6d 65 43  rn;..}...chromeC
0930: 61 6c 6c 62 61 63 6b 28 6d 65 73 73 61 67 65 2e  allback(message.
0940: 72 65 61 64 65 72 73 29 3b 0a 0a 09 72 65 74 75  readers);...retu
0950: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48 61 6e  rn;.}../*. * Han
0960: 64 6c 65 20 61 20 72 65 73 70 6f 6e 73 65 20 66  dle a response f
0970: 72 6f 6d 20 74 68 65 20 4e 61 43 6c 20 73 69 64  rom the NaCl sid
0980: 65 20 72 65 67 61 72 64 69 6e 67 20 73 69 67 6e  e regarding sign
0990: 69 6e 67 20 61 20 6d 65 73 73 61 67 65 0a 20 2a  ing a message. *
09a0: 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65  /.function cacke
09b0: 79 4d 65 73 73 61 67 65 49 6e 63 6f 6d 69 6e 67  yMessageIncoming
09c0: 53 69 67 6e 4d 65 73 73 61 67 65 28 6d 65 73 73  SignMessage(mess
09d0: 61 67 65 2c 20 63 68 72 6f 6d 65 43 61 6c 6c 62  age, chromeCallb
09e0: 61 63 6b 29 20 7b 0a 09 76 61 72 20 70 61 79 6c  ack) {..var payl
09f0: 6f 61 64 3b 0a 0a 09 69 66 20 28 21 63 68 72 6f  oad;...if (!chro
0a00: 6d 65 43 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 09  meCallback) {...
0a10: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 70 61 79  return;..}...pay
0a20: 6c 6f 61 64 20 3d 20 6d 65 73 73 61 67 65 2e 73  load = message.s
0a30: 69 67 6e 65 64 44 61 74 61 3b 0a 0a 09 63 68 72  ignedData;...chr
0a40: 6f 6d 65 43 61 6c 6c 62 61 63 6b 28 70 61 79 6c  omeCallback(payl
0a50: 6f 61 64 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  oad);...return;.
0a60: 7d 0a 0a 2f 2a 0a 20 2a 20 55 70 64 61 74 65 20  }../*. * Update 
0a70: 74 68 65 20 74 69 6d 65 20 61 20 50 49 4e 20 77  the time a PIN w
0a80: 61 73 20 6c 61 73 74 20 75 73 65 64 20 66 6f 72  as last used for
0a90: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 0a 20   a certificate. 
0aa0: 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b  */.function cack
0ab0: 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50  eyCertificateToP
0ac0: 49 4e 4d 61 70 55 70 64 61 74 65 4c 61 73 74 55  INMapUpdateLastU
0ad0: 73 65 64 28 69 64 29 20 7b 0a 09 69 66 20 28 69  sed(id) {..if (i
0ae0: 64 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09 63  d != null) {...c
0af0: 61 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65  ackeyCertificate
0b00: 54 6f 50 49 4e 4d 61 70 5b 69 64 5d 2e 6c 61 73  ToPINMap[id].las
0b10: 74 55 73 65 64 20 3d 20 28 6e 65 77 20 44 61 74  tUsed = (new Dat
0b20: 65 28 29 29 2e 67 65 74 54 69 6d 65 28 29 3b 0a  e()).getTime();.
0b30: 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
0b40: 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e  CertificateToPIN
0b50: 4d 61 70 4c 61 73 74 55 73 65 64 52 75 6e 6e 65  MapLastUsedRunne
0b60: 72 29 20 7b 0a 09 09 63 61 63 6b 65 79 43 65 72  r) {...cackeyCer
0b70: 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d 61 70  tificateToPINMap
0b80: 4c 61 73 74 55 73 65 64 52 75 6e 6e 65 72 20 3d  LastUsedRunner =
0b90: 20 74 72 75 65 3b 0a 0a 09 09 73 65 74 54 69 6d   true;....setTim
0ba0: 65 6f 75 74 28 66 75 6e 63 74 69 6f 6e 28 29 20  eout(function() 
0bb0: 7b 0a 09 09 09 76 61 72 20 63 75 72 72 65 6e 74  {....var current
0bc0: 54 69 6d 65 3b 0a 09 09 09 76 61 72 20 63 65 72  Time;....var cer
0bd0: 74 69 66 69 63 61 74 65 73 2c 20 63 65 72 74 69  tificates, certi
0be0: 66 69 63 61 74 65 3b 0a 09 09 09 76 61 72 20 69  ficate;....var i
0bf0: 64 78 3b 0a 0a 09 09 09 63 75 72 72 65 6e 74 54  dx;.....currentT
0c00: 69 6d 65 20 3d 20 28 6e 65 77 20 44 61 74 65 28  ime = (new Date(
0c10: 29 29 2e 67 65 74 54 69 6d 65 28 29 3b 0a 0a 09  )).getTime();...
0c20: 09 09 63 65 72 74 69 66 69 63 61 74 65 73 20 3d  ..certificates =
0c30: 20 4f 62 6a 65 63 74 2e 6b 65 79 73 28 63 61 63   Object.keys(cac
0c40: 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f  keyCertificateTo
0c50: 50 49 4e 4d 61 70 29 3b 0a 0a 09 09 09 63 6f 6e  PINMap);.....con
0c60: 73 6f 6c 65 2e 6c 6f 67 28 22 4c 6f 6f 6b 69 6e  sole.log("Lookin
0c70: 67 20 66 6f 72 20 50 49 4e 73 20 74 6f 20 63 6c  g for PINs to cl
0c80: 65 61 72 22 29 3b 0a 0a 09 09 09 66 6f 72 20 28  ear");.....for (
0c90: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63  idx = 0; idx < c
0ca0: 65 72 74 69 66 69 63 61 74 65 73 2e 6c 65 6e 67  ertificates.leng
0cb0: 74 68 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09  th; idx++) {....
0cc0: 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 63  .certificate = c
0cd0: 65 72 74 69 66 69 63 61 74 65 73 5b 69 64 78 5d  ertificates[idx]
0ce0: 3b 0a 0a 09 09 09 09 69 66 20 28 28 63 61 63 6b  ;......if ((cack
0cf0: 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50  eyCertificateToP
0d00: 49 4e 4d 61 70 5b 63 65 72 74 69 66 69 63 61 74  INMap[certificat
0d10: 65 5d 2e 6c 61 73 74 55 73 65 64 20 2b 20 39 30  e].lastUsed + 90
0d20: 30 30 30 30 29 20 3e 20 63 75 72 72 65 6e 74 54  0000) > currentT
0d30: 69 6d 65 29 20 7b 0a 09 09 09 09 09 63 6f 6e 74  ime) {......cont
0d40: 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  inue;.....}.....
0d50: 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 44 65  .console.log("De
0d60: 6c 65 74 65 74 69 6e 67 20 22 20 2b 20 63 65 72  leteting " + cer
0d70: 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 09  tificate);......
0d80: 64 65 6c 65 74 65 20 63 61 63 6b 65 79 43 65 72  delete cackeyCer
0d90: 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d 61 70  tificateToPINMap
0da0: 5b 63 65 72 74 69 66 69 63 61 74 65 5d 3b 0a 09  [certificate];..
0db0: 09 09 7d 0a 0a 09 09 09 63 65 72 74 69 66 69 63  ..}.....certific
0dc0: 61 74 65 73 20 3d 20 4f 62 6a 65 63 74 2e 6b 65  ates = Object.ke
0dd0: 79 73 28 63 61 63 6b 65 79 43 65 72 74 69 66 69  ys(cackeyCertifi
0de0: 63 61 74 65 54 6f 50 49 4e 4d 61 70 29 3b 0a 0a  cateToPINMap);..
0df0: 09 09 09 63 61 63 6b 65 79 43 65 72 74 69 66 69  ...cackeyCertifi
0e00: 63 61 74 65 54 6f 50 49 4e 4d 61 70 4c 61 73 74  cateToPINMapLast
0e10: 55 73 65 64 52 75 6e 6e 65 72 20 3d 20 66 61 6c  UsedRunner = fal
0e20: 73 65 3b 0a 0a 09 09 09 69 66 20 28 63 65 72 74  se;.....if (cert
0e30: 69 66 69 63 61 74 65 73 2e 6c 65 6e 67 74 68 20  ificates.length 
0e40: 3d 3d 20 30 29 20 7b 0a 09 09 09 09 72 65 74 75  == 0) {.....retu
0e50: 72 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  rn;....}.....cac
0e60: 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f  keyCertificateTo
0e70: 50 49 4e 4d 61 70 55 70 64 61 74 65 4c 61 73 74  PINMapUpdateLast
0e80: 55 73 65 64 28 6e 75 6c 6c 29 3b 0a 09 09 7d 2c  Used(null);...},
0e90: 20 39 30 30 30 30 30 29 3b 0a 09 7d 0a 7d 0a 0a   900000);..}.}..
0ea0: 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65 20 72 65 64  /*. * Handle red
0eb0: 69 73 70 61 74 63 68 69 6e 67 20 72 65 71 75 65  ispatching reque
0ec0: 73 74 73 20 61 66 74 65 72 20 72 65 63 65 69 76  sts after receiv
0ed0: 69 6e 67 20 61 20 50 49 4e 0a 20 2a 2f 0a 66 75  ing a PIN. */.fu
0ee0: 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 50 49 4e  nction cackeyPIN
0ef0: 50 72 6f 6d 70 74 43 6f 6d 70 6c 65 74 65 64 28  PromptCompleted(
0f00: 70 69 6e 56 61 6c 75 65 29 20 7b 0a 09 76 61 72  pinValue) {..var
0f10: 20 74 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74   tmpMessageEvent
0f20: 3b 0a 0a 09 66 6f 72 20 28 6d 65 73 73 61 67 65  ;...for (message
0f30: 49 64 78 20 3d 20 30 3b 20 6d 65 73 73 61 67 65  Idx = 0; message
0f40: 49 64 78 20 3c 20 63 61 63 6b 65 79 4d 65 73 73  Idx < cackeyMess
0f50: 61 67 65 73 54 6f 52 65 74 72 79 2e 6c 65 6e 67  agesToRetry.leng
0f60: 74 68 3b 20 6d 65 73 73 61 67 65 49 64 78 2b 2b  th; messageIdx++
0f70: 29 20 7b 0a 09 09 74 6d 70 4d 65 73 73 61 67 65  ) {...tmpMessage
0f80: 45 76 65 6e 74 20 3d 20 63 61 63 6b 65 79 4d 65  Event = cackeyMe
0f90: 73 73 61 67 65 73 54 6f 52 65 74 72 79 5b 6d 65  ssagesToRetry[me
0fa0: 73 73 61 67 65 49 64 78 5d 3b 0a 0a 09 09 69 66  ssageIdx];....if
0fb0: 20 28 70 69 6e 56 61 6c 75 65 20 3d 3d 20 22 22   (pinValue == ""
0fc0: 29 20 7b 0a 09 09 09 69 66 20 28 67 6f 6f 67 2e  ) {....if (goog.
0fd0: 44 45 42 55 47 29 20 7b 0a 09 09 09 09 63 6f 6e  DEBUG) {.....con
0fe0: 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65  sole.log("[cacke
0ff0: 79 5d 20 54 68 65 20 50 49 4e 20 64 69 61 6c 6f  y] The PIN dialo
1000: 67 20 77 61 73 20 63 6c 6f 73 65 64 20 77 69 74  g was closed wit
1010: 68 6f 75 74 20 67 61 74 68 65 72 69 6e 67 20 61  hout gathering a
1020: 20 50 49 4e 2c 20 74 72 65 61 74 69 6e 67 20 69   PIN, treating i
1030: 74 20 61 73 20 61 20 66 61 69 6c 75 72 65 2e 22  t as a failure."
1040: 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 74 6d 70 4d  );....}.....tmpM
1050: 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61  essageEvent.data
1060: 2e 73 74 61 74 75 73 20 3d 20 22 65 72 72 6f 72  .status = "error
1070: 22 3b 0a 09 09 09 74 6d 70 4d 65 73 73 61 67 65  ";....tmpMessage
1080: 45 76 65 6e 74 2e 64 61 74 61 2e 65 72 72 6f 72  Event.data.error
1090: 20 3d 20 22 50 49 4e 20 77 69 6e 64 6f 77 20 63   = "PIN window c
10a0: 6c 6f 73 65 64 20 77 69 74 68 6f 75 74 20 61 20  losed without a 
10b0: 50 49 4e 20 62 65 69 6e 67 20 70 72 6f 76 69 64  PIN being provid
10c0: 65 64 22 3b 0a 0a 09 09 09 63 61 63 6b 65 79 4d  ed";.....cackeyM
10d0: 65 73 73 61 67 65 49 6e 63 6f 6d 69 6e 67 28 74  essageIncoming(t
10e0: 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74 29 3b  mpMessageEvent);
10f0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 74  ...} else {....t
1100: 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74 2e 64  mpMessageEvent.d
1110: 61 74 61 2e 6f 72 69 67 69 6e 61 6c 72 65 71 75  ata.originalrequ
1120: 65 73 74 2e 70 69 6e 20 3d 20 70 69 6e 56 61 6c  est.pin = pinVal
1130: 75 65 3b 0a 0a 09 09 09 63 61 63 6b 65 79 43 65  ue;.....cackeyCe
1140: 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d 61  rtificateToPINMa
1150: 70 5b 63 61 63 6b 65 79 43 65 72 74 69 66 69 63  p[cackeyCertific
1160: 61 74 65 54 6f 50 49 4e 49 44 28 74 6d 70 4d 65  ateToPINID(tmpMe
1170: 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e  ssageEvent.data.
1180: 6f 72 69 67 69 6e 61 6c 72 65 71 75 65 73 74 2e  originalrequest.
1190: 63 65 72 74 69 66 69 63 61 74 65 29 5d 20 3d 20  certificate)] = 
11a0: 7b 7d 0a 09 09 09 63 61 63 6b 65 79 43 65 72 74  {}....cackeyCert
11b0: 69 66 69 63 61 74 65 54 6f 50 49 4e 4d 61 70 5b  ificateToPINMap[
11c0: 63 61 63 6b 65 79 43 65 72 74 69 66 69 63 61 74  cackeyCertificat
11d0: 65 54 6f 50 49 4e 49 44 28 74 6d 70 4d 65 73 73  eToPINID(tmpMess
11e0: 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 6f 72  ageEvent.data.or
11f0: 69 67 69 6e 61 6c 72 65 71 75 65 73 74 2e 63 65  iginalrequest.ce
1200: 72 74 69 66 69 63 61 74 65 29 5d 2e 70 69 6e 20  rtificate)].pin 
1210: 3d 20 70 69 6e 56 61 6c 75 65 3b 0a 09 09 09 63  = pinValue;....c
1220: 61 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65  ackeyCertificate
1230: 54 6f 50 49 4e 4d 61 70 55 70 64 61 74 65 4c 61  ToPINMapUpdateLa
1240: 73 74 55 73 65 64 28 63 61 63 6b 65 79 43 65 72  stUsed(cackeyCer
1250: 74 69 66 69 63 61 74 65 54 6f 50 49 4e 49 44 28  tificateToPINID(
1260: 74 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74 2e  tmpMessageEvent.
1270: 64 61 74 61 2e 6f 72 69 67 69 6e 61 6c 72 65 71  data.originalreq
1280: 75 65 73 74 2e 63 65 72 74 69 66 69 63 61 74 65  uest.certificate
1290: 29 29 3b 0a 0a 09 09 09 63 68 72 6f 6d 65 43 61  ));.....chromeCa
12a0: 6c 6c 62 61 63 6b 20 3d 20 6e 75 6c 6c 3b 0a 09  llback = null;..
12b0: 09 09 69 66 20 28 74 6d 70 4d 65 73 73 61 67 65  ..if (tmpMessage
12c0: 45 76 65 6e 74 2e 64 61 74 61 2e 69 64 29 20 7b  Event.data.id) {
12d0: 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 4f  .....if (cackeyO
12e0: 75 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61  utstandingCallba
12f0: 63 6b 73 29 20 7b 0a 09 09 09 09 09 63 68 72 6f  cks) {......chro
1300: 6d 65 43 61 6c 6c 62 61 63 6b 20 3d 20 63 61 63  meCallback = cac
1310: 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43 61  keyOutstandingCa
1320: 6c 6c 62 61 63 6b 73 5b 74 6d 70 4d 65 73 73 61  llbacks[tmpMessa
1330: 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 69 64 5d  geEvent.data.id]
1340: 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
1350: 09 63 61 63 6b 65 79 49 6e 69 74 50 43 53 43 28  .cackeyInitPCSC(
1360: 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 09 09 09  function() {....
1370: 09 63 61 63 6b 65 79 48 61 6e 64 6c 65 2e 70 6f  .cackeyHandle.po
1380: 73 74 4d 65 73 73 61 67 65 28 74 6d 70 4d 65 73  stMessage(tmpMes
1390: 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 6f  sageEvent.data.o
13a0: 72 69 67 69 6e 61 6c 72 65 71 75 65 73 74 29 3b  riginalrequest);
13b0: 0a 09 09 09 7d 2c 20 66 75 6e 63 74 69 6f 6e 28  ....}, function(
13c0: 29 20 7b 0a 09 09 09 09 69 66 20 28 63 68 72 6f  ) {.....if (chro
13d0: 6d 65 43 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 09  meCallback) {...
13e0: 09 09 09 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63  ...chromeCallbac
13f0: 6b 28 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  k();.....}......
1400: 69 66 20 28 74 6d 70 4d 65 73 73 61 67 65 45 76  if (tmpMessageEv
1410: 65 6e 74 2e 64 61 74 61 2e 69 64 20 26 26 20 63  ent.data.id && c
1420: 61 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67  ackeyOutstanding
1430: 43 61 6c 6c 62 61 63 6b 73 5b 74 6d 70 4d 65 73  Callbacks[tmpMes
1440: 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 69  sageEvent.data.i
1450: 64 5d 29 20 7b 0a 09 09 09 09 09 64 65 6c 65 74  d]) {......delet
1460: 65 20 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64  e cackeyOutstand
1470: 69 6e 67 43 61 6c 6c 62 61 63 6b 73 5b 74 6d 70  ingCallbacks[tmp
1480: 4d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74  MessageEvent.dat
1490: 61 2e 69 64 5d 3b 0a 09 09 09 09 7d 0a 09 09 09  a.id];.....}....
14a0: 7d 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 0a  });...}..}.../*.
14b0: 09 20 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65  . * Delete the e
14c0: 78 69 73 74 69 6e 67 20 68 61 6e 64 6c 65 20 61  xisting handle a
14d0: 6e 64 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  nd create a new 
14e0: 6f 6e 65 0a 09 20 2a 2f 0a 09 64 65 6c 65 74 65  one.. */..delete
14f0: 20 63 61 63 6b 65 79 4d 65 73 73 61 67 65 73 54   cackeyMessagesT
1500: 6f 52 65 74 72 79 3b 0a 0a 09 63 61 63 6b 65 79  oRetry;...cackey
1510: 4d 65 73 73 61 67 65 73 54 6f 52 65 74 72 79 20  MessagesToRetry 
1520: 3d 20 5b 5d 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48  = [];.}../*. * H
1530: 61 6e 64 6c 65 20 61 6e 20 69 6e 63 6f 6d 69 6e  andle an incomin
1540: 67 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  g message from t
1550: 68 65 20 4e 61 43 6c 20 73 69 64 65 20 61 6e 64  he NaCl side and
1560: 20 70 61 73 73 20 69 74 20 6f 66 66 20 74 6f 0a   pass it off to.
1570: 20 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 68 61   * one of the ha
1580: 6e 64 6c 65 72 73 20 61 62 6f 76 65 20 66 6f 72  ndlers above for
1590: 20 61 63 74 75 61 6c 20 66 6f 72 6d 61 74 74 69   actual formatti
15a0: 6e 67 20 61 6e 64 20 70 61 73 73 69 6e 67 20 74  ng and passing t
15b0: 6f 0a 20 2a 20 74 68 65 20 63 61 6c 6c 62 61 63  o. * the callbac
15c0: 6b 0a 20 2a 0a 20 2a 20 49 66 20 61 6e 20 65 72  k. *. * If an er
15d0: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 69 6e 76  ror occured, inv
15e0: 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
15f0: 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e   with no argumen
1600: 74 73 2e 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e  ts.. */.function
1610: 20 63 61 63 6b 65 79 4d 65 73 73 61 67 65 49 6e   cackeyMessageIn
1620: 63 6f 6d 69 6e 67 28 6d 65 73 73 61 67 65 45 76  coming(messageEv
1630: 65 6e 74 29 20 7b 0a 09 76 61 72 20 6e 65 78 74  ent) {..var next
1640: 46 75 6e 63 74 69 6f 6e 20 3d 20 6e 75 6c 6c 3b  Function = null;
1650: 0a 09 76 61 72 20 63 68 72 6f 6d 65 43 61 6c 6c  ..var chromeCall
1660: 62 61 63 6b 20 3d 20 6e 75 6c 6c 3b 0a 0a 09 69  back = null;...i
1670: 66 20 28 6d 65 73 73 61 67 65 45 76 65 6e 74 2e  f (messageEvent.
1680: 64 61 74 61 2e 74 61 72 67 65 74 20 21 3d 20 22  data.target != "
1690: 63 61 63 6b 65 79 22 29 20 7b 0a 09 09 72 65 74  cackey") {...ret
16a0: 75 72 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 6f  urn;..}...if (go
16b0: 6f 67 2e 44 45 42 55 47 29 20 7b 0a 09 09 63 6f  og.DEBUG) {...co
16c0: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 53 54 41 52 54  nsole.log("START
16d0: 20 4d 45 53 53 41 47 45 22 29 3b 0a 09 09 63 6f   MESSAGE");...co
16e0: 6e 73 6f 6c 65 2e 6c 6f 67 28 6d 65 73 73 61 67  nsole.log(messag
16f0: 65 45 76 65 6e 74 2e 64 61 74 61 29 3b 0a 09 09  eEvent.data);...
1700: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 45 4e 44  console.log("END
1710: 20 4d 45 53 53 41 47 45 22 29 3b 0a 09 7d 0a 0a   MESSAGE");..}..
1720: 09 2f 2a 0a 09 20 2a 20 49 66 20 77 65 20 66 61  ./*.. * If we fa
1730: 69 6c 65 64 20 66 6f 72 20 73 6f 6d 65 20 72 65  iled for some re
1740: 61 73 6f 6e 20 61 6e 64 20 77 65 20 68 61 76 65  ason and we have
1750: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69   a certificate i
1760: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 09  n the original..
1770: 20 2a 20 72 65 71 75 65 73 74 20 74 68 65 6e 20   * request then 
1780: 66 6f 72 67 65 74 20 61 6e 79 20 50 49 4e 20 61  forget any PIN a
1790: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
17a0: 68 61 74 20 63 65 72 74 69 66 69 63 61 74 65 0a  hat certificate.
17b0: 09 20 2a 2f 0a 09 69 66 20 28 6d 65 73 73 61 67  . */..if (messag
17c0: 65 45 76 65 6e 74 2e 64 61 74 61 2e 73 74 61 74  eEvent.data.stat
17d0: 75 73 20 21 3d 20 22 73 75 63 63 65 73 73 22 29  us != "success")
17e0: 20 7b 0a 09 09 69 66 20 28 6d 65 73 73 61 67 65   {...if (message
17f0: 45 76 65 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69  Event.data.origi
1800: 6e 61 6c 72 65 71 75 65 73 74 29 20 7b 0a 09 09  nalrequest) {...
1810: 09 69 66 20 28 6d 65 73 73 61 67 65 45 76 65 6e  .if (messageEven
1820: 74 2e 64 61 74 61 2e 6f 72 69 67 69 6e 61 6c 72  t.data.originalr
1830: 65 71 75 65 73 74 2e 63 65 72 74 69 66 69 63 61  equest.certifica
1840: 74 65 29 20 7b 0a 09 09 09 09 64 65 6c 65 74 65  te) {.....delete
1850: 20 63 61 63 6b 65 79 43 65 72 74 69 66 69 63 61   cackeyCertifica
1860: 74 65 54 6f 50 49 4e 4d 61 70 5b 63 61 63 6b 65  teToPINMap[cacke
1870: 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49  yCertificateToPI
1880: 4e 49 44 28 6d 65 73 73 61 67 65 45 76 65 6e 74  NID(messageEvent
1890: 2e 64 61 74 61 2e 6f 72 69 67 69 6e 61 6c 72 65  .data.originalre
18a0: 71 75 65 73 74 2e 63 65 72 74 69 66 69 63 61 74  quest.certificat
18b0: 65 29 5d 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  e)];....}...}..}
18c0: 0a 0a 09 69 66 20 28 6d 65 73 73 61 67 65 45 76  ...if (messageEv
18d0: 65 6e 74 2e 64 61 74 61 2e 63 6f 6d 6d 61 6e 64  ent.data.command
18e0: 20 3d 3d 20 22 69 6e 69 74 22 20 26 26 20 6d 65   == "init" && me
18f0: 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e  ssageEvent.data.
1900: 73 74 61 74 75 73 20 3d 3d 20 22 73 75 63 63 65  status == "succe
1910: 73 73 22 29 20 7b 0a 09 09 69 66 20 28 67 6f 6f  ss") {...if (goo
1920: 67 2e 44 45 42 55 47 29 20 7b 0a 09 09 09 63 6f  g.DEBUG) {....co
1930: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b  nsole.log("[cack
1940: 65 79 5d 20 49 6e 69 74 69 61 6c 69 7a 61 74 69  ey] Initializati
1950: 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 2c 20 72 65  on completed, re
1960: 73 65 6e 64 69 6e 67 20 61 6e 79 20 71 75 65 75  sending any queu
1970: 65 64 20 6d 65 73 73 61 67 65 73 22 29 3b 0a 09  ed messages");..
1980: 09 7d 0a 0a 09 09 63 61 63 6b 65 79 49 6e 69 74  .}....cackeyInit
1990: 50 43 53 43 43 6f 6d 70 6c 65 74 65 64 28 22 73  PCSCCompleted("s
19a0: 75 63 63 65 73 73 22 29 3b 0a 09 7d 0a 0a 09 69  uccess");..}...i
19b0: 66 20 28 6d 65 73 73 61 67 65 45 76 65 6e 74 2e  f (messageEvent.
19c0: 64 61 74 61 2e 69 64 20 3d 3d 20 6e 75 6c 6c 29  data.id == null)
19d0: 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a   {...return;..}.
19e0: 0a 09 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b  ..chromeCallback
19f0: 20 3d 20 63 61 63 6b 65 79 4f 75 74 73 74 61 6e   = cackeyOutstan
1a00: 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73 5b 6d 65  dingCallbacks[me
1a10: 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e  ssageEvent.data.
1a20: 69 64 5d 3b 0a 0a 09 69 66 20 28 63 68 72 6f 6d  id];...if (chrom
1a30: 65 43 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e 75 6c  eCallback == nul
1a40: 6c 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 65  l) {...console.e
1a50: 72 72 6f 72 28 22 5b 63 61 63 6b 65 79 5d 20 44  rror("[cackey] D
1a60: 69 73 63 61 72 64 69 6e 67 20 6f 75 74 64 61 74  iscarding outdat
1a70: 65 64 20 6d 65 73 73 61 67 65 22 29 3b 0a 0a 09  ed message");...
1a80: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 73 77  .return;..}...sw
1a90: 69 74 63 68 20 28 6d 65 73 73 61 67 65 45 76 65  itch (messageEve
1aa0: 6e 74 2e 64 61 74 61 2e 73 74 61 74 75 73 29 20  nt.data.status) 
1ab0: 7b 0a 09 09 63 61 73 65 20 22 65 72 72 6f 72 22  {...case "error"
1ac0: 3a 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 65 72 72  :....console.err
1ad0: 6f 72 28 22 5b 63 61 63 6b 65 79 5d 20 46 61 69  or("[cackey] Fai
1ae0: 6c 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 63  led to execute c
1af0: 6f 6d 6d 61 6e 64 20 27 22 20 2b 20 6d 65 73 73  ommand '" + mess
1b00: 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 63 6f  ageEvent.data.co
1b10: 6d 6d 61 6e 64 20 2b 20 22 27 3a 20 22 20 2b 20  mmand + "': " + 
1b20: 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74  messageEvent.dat
1b30: 61 2e 65 72 72 6f 72 29 3b 0a 0a 09 09 09 63 68  a.error);.....ch
1b40: 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 28 29 3b 0a  romeCallback();.
1b50: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
1b60: 65 20 22 72 65 74 72 79 22 3a 0a 09 09 09 2f 2a  e "retry":..../*
1b70: 0a 09 09 09 20 2a 20 41 64 64 20 74 68 65 20 6e  .... * Add the n
1b80: 65 77 20 72 65 71 75 65 73 74 20 74 6f 20 74 68  ew request to th
1b90: 65 20 71 75 65 75 65 20 6f 66 20 65 76 65 6e 74  e queue of event
1ba0: 73 20 74 6f 20 70 72 6f 63 65 73 73 20 77 68 65  s to process whe
1bb0: 6e 20 74 68 65 20 50 49 4e 0a 09 09 09 20 2a 20  n the PIN.... * 
1bc0: 70 72 6f 6d 70 74 20 69 73 20 74 65 72 6d 69 6e  prompt is termin
1bd0: 61 74 65 64 2e 0a 09 09 09 20 2a 2f 0a 09 09 09  ated..... */....
1be0: 63 61 63 6b 65 79 4d 65 73 73 61 67 65 73 54 6f  cackeyMessagesTo
1bf0: 52 65 74 72 79 2e 70 75 73 68 28 6d 65 73 73 61  Retry.push(messa
1c00: 67 65 45 76 65 6e 74 29 3b 0a 0a 09 09 09 69 66  geEvent);.....if
1c10: 20 28 70 69 6e 57 69 6e 64 6f 77 50 72 65 76 69   (pinWindowPrevi
1c20: 6f 75 73 48 61 6e 64 6c 65 29 20 7b 0a 09 09 09  ousHandle) {....
1c30: 09 2f 2a 0a 09 09 09 09 20 2a 20 41 6e 20 65 78  ./*..... * An ex
1c40: 69 73 74 69 6e 67 20 50 49 4e 20 65 6e 74 72 79  isting PIN entry
1c50: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 0a   is in progress.
1c60: 09 09 09 09 20 2a 20 4a 75 73 74 20 61 64 64 20  .... * Just add 
1c70: 74 68 65 20 72 65 71 75 65 73 74 20 74 6f 20 74  the request to t
1c80: 68 65 20 71 75 65 75 65 20 28 61 62 6f 76 65 29  he queue (above)
1c90: 20 61 6e 64 20 77 61 69 74 0a 09 09 09 09 20 2a   and wait..... *
1ca0: 2f 0a 0a 09 09 09 09 72 65 74 75 72 6e 3b 0a 09  /......return;..
1cb0: 09 09 7d 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a  ..}...../*.... *
1cc0: 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 20   Set the handle 
1cd0: 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 28 62  to an invalid (b
1ce0: 75 74 20 6e 6f 6e 2d 6e 75 6c 6c 29 20 76 61 6c  ut non-null) val
1cf0: 75 65 20 75 6e 74 69 6c 20 74 68 65 20 77 69 6e  ue until the win
1d00: 64 6f 77 0a 09 09 09 20 2a 20 69 73 20 63 72 65  dow.... * is cre
1d10: 61 74 65 64 20 69 6e 20 63 61 73 65 20 77 65 20  ated in case we 
1d20: 61 72 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69  are invoked agai
1d30: 6e 20 73 6f 6f 6e 2e 0a 09 09 09 20 2a 2f 0a 09  n soon..... */..
1d40: 09 09 70 69 6e 57 69 6e 64 6f 77 50 72 65 76 69  ..pinWindowPrevi
1d50: 6f 75 73 48 61 6e 64 6c 65 20 3d 20 22 69 6e 76  ousHandle = "inv
1d60: 61 6c 69 64 22 3b 0a 0a 09 09 09 69 66 20 28 6d  alid";.....if (m
1d70: 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61  essageEvent.data
1d80: 2e 6f 72 69 67 69 6e 61 6c 72 65 71 75 65 73 74  .originalrequest
1d90: 2e 73 69 67 6e 52 65 71 75 65 73 74 49 64 20 3d  .signRequestId =
1da0: 3d 3d 20 6e 75 6c 6c 20 7c 7c 20 63 61 63 6b 65  == null || cacke
1db0: 79 46 65 61 74 75 72 65 73 2e 75 73 65 43 68 72  yFeatures.useChr
1dc0: 6f 6d 65 50 49 4e 44 69 61 6c 6f 67 20 3d 3d 3d  omePINDialog ===
1dd0: 20 66 61 6c 73 65 29 20 7b 0a 09 09 09 09 63 68   false) {.....ch
1de0: 72 6f 6d 65 2e 61 70 70 2e 77 69 6e 64 6f 77 2e  rome.app.window.
1df0: 63 72 65 61 74 65 28 22 70 69 6e 2e 68 74 6d 6c  create("pin.html
1e00: 22 2c 20 7b 0a 09 09 09 09 09 22 69 64 22 3a 20  ", {......"id": 
1e10: 22 63 61 63 6b 65 79 50 49 4e 45 6e 74 72 79 22  "cackeyPINEntry"
1e20: 2c 0a 09 09 09 09 09 22 72 65 73 69 7a 61 62 6c  ,......"resizabl
1e30: 65 22 3a 20 66 61 6c 73 65 2c 0a 09 09 09 09 09  e": false,......
1e40: 22 61 6c 77 61 79 73 4f 6e 54 6f 70 22 3a 20 74  "alwaysOnTop": t
1e50: 72 75 65 2c 0a 09 09 09 09 09 22 66 6f 63 75 73  rue,......"focus
1e60: 65 64 22 3a 20 74 72 75 65 2c 0a 09 09 09 09 09  ed": true,......
1e70: 22 76 69 73 69 62 6c 65 4f 6e 41 6c 6c 57 6f 72  "visibleOnAllWor
1e80: 6b 73 70 61 63 65 73 22 3a 20 74 72 75 65 2c 0a  kspaces": true,.
1e90: 09 09 09 09 09 22 69 6e 6e 65 72 42 6f 75 6e 64  ....."innerBound
1ea0: 73 22 3a 20 7b 0a 09 09 09 09 09 09 22 77 69 64  s": {......."wid
1eb0: 74 68 22 3a 20 33 35 30 2c 0a 09 09 09 09 09 09  th": 350,.......
1ec0: 22 6d 69 6e 57 69 64 74 68 22 3a 20 33 35 30 2c  "minWidth": 350,
1ed0: 0a 09 09 09 09 09 09 22 68 65 69 67 68 74 22 3a  ......."height":
1ee0: 20 31 33 35 2c 0a 09 09 09 09 09 09 22 6d 69 6e   135,......."min
1ef0: 48 65 69 67 68 74 22 3a 20 31 33 35 0a 09 09 09  Height": 135....
1f00: 09 09 7d 0a 09 09 09 09 7d 2c 20 66 75 6e 63 74  ..}.....}, funct
1f10: 69 6f 6e 28 70 69 6e 57 69 6e 64 6f 77 29 20 7b  ion(pinWindow) {
1f20: 0a 09 09 09 09 09 2f 2a 0a 09 09 09 09 09 20 2a  ....../*...... *
1f30: 20 53 65 74 20 74 68 65 20 50 49 4e 20 76 61 6c   Set the PIN val
1f40: 75 65 20 74 6f 20 62 6c 61 6e 6b 0a 09 09 09 09  ue to blank.....
1f50: 09 20 2a 2f 0a 09 09 09 09 09 70 69 6e 57 69 6e  . */......pinWin
1f60: 64 6f 77 50 49 4e 56 61 6c 75 65 20 3d 20 22 22  dowPINValue = ""
1f70: 3b 0a 09 0a 09 09 09 09 09 69 66 20 28 21 70 69  ;........if (!pi
1f80: 6e 57 69 6e 64 6f 77 29 20 7b 0a 09 09 09 09 09  nWindow) {......
1f90: 09 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 22  .console.error("
1fa0: 5b 63 61 63 6b 65 79 5d 20 4e 6f 20 77 69 6e 64  [cackey] No wind
1fb0: 6f 77 20 77 61 73 20 70 72 6f 76 69 64 65 64 20  ow was provided 
1fc0: 66 6f 72 20 50 49 4e 20 65 6e 74 72 79 2c 20 74  for PIN entry, t
1fd0: 68 69 73 20 77 69 6c 6c 20 6e 6f 74 20 67 6f 20  his will not go 
1fe0: 77 65 6c 6c 2e 22 29 3b 0a 09 0a 09 09 09 09 09  well.");........
1ff0: 09 72 65 74 75 72 6e 3b 0a 09 09 09 09 09 7d 0a  .return;......}.
2000: 09 0a 09 09 09 09 09 70 69 6e 57 69 6e 64 6f 77  .......pinWindow
2010: 50 72 65 76 69 6f 75 73 48 61 6e 64 6c 65 20 3d  PreviousHandle =
2020: 20 70 69 6e 57 69 6e 64 6f 77 3b 0a 0a 09 09 09   pinWindow;.....
2030: 09 09 70 69 6e 57 69 6e 64 6f 77 2e 64 72 61 77  ..pinWindow.draw
2040: 41 74 74 65 6e 74 69 6f 6e 28 29 3b 0a 09 09 09  Attention();....
2050: 09 09 70 69 6e 57 69 6e 64 6f 77 2e 66 6f 63 75  ..pinWindow.focu
2060: 73 28 29 3b 0a 09 0a 09 09 09 09 09 2f 2a 0a 09  s();......../*..
2070: 09 09 09 09 20 2a 20 52 65 67 69 73 74 65 72 20  .... * Register 
2080: 61 20 68 61 6e 64 6c 65 72 20 74 6f 20 68 61 6e  a handler to han
2090: 64 6c 65 20 74 68 65 20 77 69 6e 64 6f 77 20 62  dle the window b
20a0: 65 69 6e 67 20 63 6c 6f 73 65 64 20 77 69 74 68  eing closed with
20b0: 6f 75 74 0a 09 09 09 09 09 20 2a 20 68 61 76 69  out...... * havi
20c0: 6e 67 20 73 65 6e 74 20 61 6e 79 74 68 69 6e 67  ng sent anything
20d0: 0a 09 09 09 09 09 20 2a 2f 0a 09 09 09 09 09 70  ...... */......p
20e0: 69 6e 57 69 6e 64 6f 77 2e 6f 6e 43 6c 6f 73 65  inWindow.onClose
20f0: 64 2e 61 64 64 4c 69 73 74 65 6e 65 72 28 66 75  d.addListener(fu
2100: 6e 63 74 69 6f 6e 28 29 20 7b 0a 09 09 09 09 09  nction() {......
2110: 09 76 61 72 20 6d 65 73 73 61 67 65 49 64 78 3b  .var messageIdx;
2120: 0a 09 09 09 09 09 09 76 61 72 20 63 68 72 6f 6d  .......var chrom
2130: 65 43 61 6c 6c 62 61 63 6b 3b 0a 09 09 09 09 09  eCallback;......
2140: 09 76 61 72 20 70 69 6e 56 61 6c 75 65 3b 0a 09  .var pinValue;..
2150: 0a 09 09 09 09 09 09 70 69 6e 57 69 6e 64 6f 77  .......pinWindow
2160: 50 72 65 76 69 6f 75 73 48 61 6e 64 6c 65 20 3d  PreviousHandle =
2170: 20 6e 75 6c 6c 3b 0a 0a 09 09 09 09 09 09 2f 2a   null;......../*
2180: 0a 09 09 09 09 09 09 20 2a 20 57 65 20 61 72 65  ....... * We are
2190: 20 64 6f 6e 65 20 66 65 74 63 68 69 6e 67 20 74   done fetching t
21a0: 68 65 20 75 73 65 72 20 50 49 4e 2c 20 63 6c 65  he user PIN, cle
21b0: 61 72 20 74 68 65 20 76 61 6c 75 65 0a 09 09 09  ar the value....
21c0: 09 09 09 20 2a 2f 0a 09 09 09 09 09 09 70 69 6e  ... */.......pin
21d0: 56 61 6c 75 65 20 3d 20 70 69 6e 57 69 6e 64 6f  Value = pinWindo
21e0: 77 50 49 4e 56 61 6c 75 65 3b 0a 09 09 09 09 09  wPINValue;......
21f0: 09 70 69 6e 57 69 6e 64 6f 77 50 49 4e 56 61 6c  .pinWindowPINVal
2200: 75 65 20 3d 20 22 22 3b 0a 0a 09 09 09 09 09 09  ue = "";........
2210: 63 61 63 6b 65 79 50 49 4e 50 72 6f 6d 70 74 43  cackeyPINPromptC
2220: 6f 6d 70 6c 65 74 65 64 28 70 69 6e 56 61 6c 75  ompleted(pinValu
2230: 65 29 3b 0a 09 0a 09 09 09 09 09 09 72 65 74 75  e);.........retu
2240: 72 6e 3b 0a 09 09 09 09 09 7d 29 0a 09 0a 09 09  rn;......}).....
2250: 09 09 09 2f 2a 0a 09 09 09 09 09 20 2a 20 50 61  .../*...... * Pa
2260: 73 73 20 74 68 69 73 20 6d 65 73 73 61 67 65 20  ss this message 
2270: 6f 66 66 20 74 6f 20 74 68 65 20 6f 74 68 65 72  off to the other
2280: 20 77 69 6e 64 6f 77 20 73 6f 20 74 68 61 74 20   window so that 
2290: 69 74 20 6d 61 79 20 72 65 73 75 62 6d 69 74 20  it may resubmit 
22a0: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 09 09 09  the request.....
22b0: 09 09 20 2a 2f 0a 09 09 09 09 09 70 69 6e 57 69  .. */......pinWi
22c0: 6e 64 6f 77 2e 63 6f 6e 74 65 6e 74 57 69 6e 64  ndow.contentWind
22d0: 6f 77 2e 70 61 72 65 6e 74 57 69 6e 64 6f 77 20  ow.parentWindow 
22e0: 3d 20 77 69 6e 64 6f 77 3b 0a 09 09 09 09 09 70  = window;......p
22f0: 69 6e 57 69 6e 64 6f 77 2e 63 6f 6e 74 65 6e 74  inWindow.content
2300: 57 69 6e 64 6f 77 2e 6d 65 73 73 61 67 65 45 76  Window.messageEv
2310: 65 6e 74 20 3d 20 6d 65 73 73 61 67 65 45 76 65  ent = messageEve
2320: 6e 74 3b 0a 0a 09 09 09 09 09 69 66 20 28 63 61  nt;.......if (ca
2330: 63 6b 65 79 46 65 61 74 75 72 65 73 2e 63 75 73  ckeyFeatures.cus
2340: 74 6f 6d 50 49 4e 50 72 6f 6d 70 74 29 20 7b 0a  tomPINPrompt) {.
2350: 09 09 09 09 09 09 70 69 6e 57 69 6e 64 6f 77 2e  ......pinWindow.
2360: 63 6f 6e 74 65 6e 74 57 69 6e 64 6f 77 2e 70 69  contentWindow.pi
2370: 6e 70 72 6f 6d 70 74 20 3d 20 6d 65 73 73 61 67  nprompt = messag
2380: 65 45 76 65 6e 74 2e 64 61 74 61 2e 70 69 6e 70  eEvent.data.pinp
2390: 72 6f 6d 70 74 3b 0a 09 09 09 09 09 7d 0a 09 0a  rompt;......}...
23a0: 09 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09  .....return;....
23b0: 09 7d 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  .});....} else {
23c0: 0a 09 09 09 09 63 68 72 6f 6d 65 2e 63 65 72 74  .....chrome.cert
23d0: 69 66 69 63 61 74 65 50 72 6f 76 69 64 65 72 2e  ificateProvider.
23e0: 72 65 71 75 65 73 74 50 69 6e 28 7b 0a 09 09 09  requestPin({....
23f0: 09 09 73 69 67 6e 52 65 71 75 65 73 74 49 64 3a  ..signRequestId:
2400: 20 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61   messageEvent.da
2410: 74 61 2e 6f 72 69 67 69 6e 61 6c 72 65 71 75 65  ta.originalreque
2420: 73 74 2e 73 69 67 6e 52 65 71 75 65 73 74 49 64  st.signRequestId
2430: 2c 0a 09 09 09 09 09 72 65 71 75 65 73 74 54 79  ,......requestTy
2440: 70 65 3a 20 22 50 49 4e 22 0a 09 09 09 09 7d 2c  pe: "PIN".....},
2450: 20 66 75 6e 63 74 69 6f 6e 28 75 73 65 72 49 6e   function(userIn
2460: 66 6f 29 20 7b 0a 09 09 09 09 09 76 61 72 20 64  fo) {......var d
2470: 65 73 74 72 6f 79 45 72 72 6f 72 3b 0a 09 09 09  estroyError;....
2480: 09 09 76 61 72 20 70 69 6e 56 61 6c 75 65 20 3d  ..var pinValue =
2490: 20 22 22 3b 0a 0a 09 09 09 09 09 74 72 79 20 7b   "";.......try {
24a0: 0a 09 09 09 09 09 09 63 68 72 6f 6d 65 2e 63 65  .......chrome.ce
24b0: 72 74 69 66 69 63 61 74 65 50 72 6f 76 69 64 65  rtificateProvide
24c0: 72 2e 73 74 6f 70 50 69 6e 52 65 71 75 65 73 74  r.stopPinRequest
24d0: 28 7b 0a 09 09 09 09 09 09 09 73 69 67 6e 52 65  ({........signRe
24e0: 71 75 65 73 74 49 64 3a 20 6d 65 73 73 61 67 65  questId: message
24f0: 45 76 65 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69  Event.data.origi
2500: 6e 61 6c 72 65 71 75 65 73 74 2e 73 69 67 6e 52  nalrequest.signR
2510: 65 71 75 65 73 74 49 64 0a 09 09 09 09 09 09 7d  equestId.......}
2520: 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 7d 29  , function() {})
2530: 3b 0a 09 09 09 09 09 7d 20 63 61 74 63 68 20 28  ;......} catch (
2540: 64 65 73 74 72 6f 79 45 72 72 6f 72 29 20 7b 0a  destroyError) {.
2550: 09 09 09 09 09 09 2f 2a 20 44 6f 20 6e 6f 74 68  ....../* Do noth
2560: 69 6e 67 2c 20 77 65 20 64 6f 6e 27 74 20 63 61  ing, we don't ca
2570: 72 65 20 69 66 20 69 74 20 66 61 69 6c 73 20 72  re if it fails r
2580: 65 61 6c 6c 79 20 2a 2f 0a 09 09 09 09 09 7d 0a  eally */......}.
2590: 0a 09 09 09 09 09 70 69 6e 57 69 6e 64 6f 77 50  ......pinWindowP
25a0: 72 65 76 69 6f 75 73 48 61 6e 64 6c 65 20 3d 20  reviousHandle = 
25b0: 6e 75 6c 6c 3b 0a 0a 09 09 09 09 09 69 66 20 28  null;.......if (
25c0: 75 73 65 72 49 6e 66 6f 20 26 26 20 75 73 65 72  userInfo && user
25d0: 49 6e 66 6f 2e 75 73 65 72 49 6e 70 75 74 29 20  Info.userInput) 
25e0: 7b 0a 09 09 09 09 09 09 70 69 6e 56 61 6c 75 65  {.......pinValue
25f0: 20 3d 20 75 73 65 72 49 6e 66 6f 2e 75 73 65 72   = userInfo.user
2600: 49 6e 70 75 74 3b 0a 09 09 09 09 09 7d 0a 0a 09  Input;......}...
2610: 09 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
2620: 79 50 49 4e 50 72 6f 6d 70 74 43 6f 6d 70 6c 65  yPINPromptComple
2630: 74 65 64 28 70 69 6e 56 61 6c 75 65 29 29 3b 0a  ted(pinValue));.
2640: 09 09 09 09 7d 29 3b 0a 09 09 09 7d 0a 0a 09 09  ....});....}....
2650: 09 2f 2a 0a 09 09 09 20 2a 20 57 65 20 72 65 74  ./*.... * We ret
2660: 75 72 6e 20 68 65 72 65 20 69 6e 73 74 65 61 64  urn here instead
2670: 20 6f 66 20 62 72 65 61 6b 20 74 6f 20 61 76 6f   of break to avo
2680: 69 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  id deleting the 
2690: 63 61 6c 6c 62 61 63 6b 0a 09 09 09 20 2a 20 65  callback.... * e
26a0: 6e 74 72 79 2e 0a 09 09 09 20 2a 2f 0a 09 09 09  ntry..... */....
26b0: 72 65 74 75 72 6e 3b 0a 09 09 63 61 73 65 20 22  return;...case "
26c0: 73 75 63 63 65 73 73 22 3a 0a 09 09 09 73 77 69  success":....swi
26d0: 74 63 68 20 28 6d 65 73 73 61 67 65 45 76 65 6e  tch (messageEven
26e0: 74 2e 64 61 74 61 2e 63 6f 6d 6d 61 6e 64 29 20  t.data.command) 
26f0: 7b 0a 09 09 09 09 63 61 73 65 20 22 6c 69 73 74  {.....case "list
2700: 63 65 72 74 69 66 69 63 61 74 65 73 22 3a 0a 09  certificates":..
2710: 09 09 09 09 6e 65 78 74 46 75 6e 63 74 69 6f 6e  ....nextFunction
2720: 20 3d 20 63 61 63 6b 65 79 4d 65 73 73 61 67 65   = cackeyMessage
2730: 49 6e 63 6f 6d 69 6e 67 4c 69 73 74 43 65 72 74  IncomingListCert
2740: 69 66 69 63 61 74 65 73 3b 0a 0a 09 09 09 09 09  ificates;.......
2750: 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20  break;.....case 
2760: 22 6c 69 73 74 72 65 61 64 65 72 73 22 3a 0a 09  "listreaders":..
2770: 09 09 09 09 6e 65 78 74 46 75 6e 63 74 69 6f 6e  ....nextFunction
2780: 20 3d 20 63 61 63 6b 65 79 4d 65 73 73 61 67 65   = cackeyMessage
2790: 49 6e 63 6f 6d 69 6e 67 4c 69 73 74 52 65 61 64  IncomingListRead
27a0: 65 72 73 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  ers;.......break
27b0: 3b 0a 09 09 09 09 63 61 73 65 20 22 73 69 67 6e  ;.....case "sign
27c0: 22 3a 0a 09 09 09 09 09 6e 65 78 74 46 75 6e 63  ":......nextFunc
27d0: 74 69 6f 6e 20 3d 20 63 61 63 6b 65 79 4d 65 73  tion = cackeyMes
27e0: 73 61 67 65 49 6e 63 6f 6d 69 6e 67 53 69 67 6e  sageIncomingSign
27f0: 4d 65 73 73 61 67 65 3b 0a 0a 09 09 09 09 09 62  Message;.......b
2800: 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62  reak;....}.....b
2810: 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 6e  reak;..}...if (n
2820: 65 78 74 46 75 6e 63 74 69 6f 6e 20 21 3d 20 6e  extFunction != n
2830: 75 6c 6c 29 20 7b 0a 09 09 6e 65 78 74 46 75 6e  ull) {...nextFun
2840: 63 74 69 6f 6e 28 6d 65 73 73 61 67 65 45 76 65  ction(messageEve
2850: 6e 74 2e 64 61 74 61 2c 20 63 68 72 6f 6d 65 43  nt.data, chromeC
2860: 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 0a 09 64  allback);..}...d
2870: 65 6c 65 74 65 20 63 61 63 6b 65 79 4f 75 74 73  elete cackeyOuts
2880: 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73  tandingCallbacks
2890: 5b 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61  [messageEvent.da
28a0: 74 61 2e 69 64 5d 3b 0a 0a 09 72 65 74 75 72 6e  ta.id];...return
28b0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c  ;.}../*. * Handl
28c0: 65 72 20 66 6f 72 20 6d 65 73 73 61 67 65 73 20  er for messages 
28d0: 66 72 6f 6d 20 43 68 72 6f 6d 65 20 72 65 6c 61  from Chrome rela
28e0: 74 65 64 20 74 6f 20 6c 69 73 74 69 6e 67 20 63  ted to listing c
28f0: 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a 2f 0a  ertificates. */.
2900: 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 4c  function cackeyL
2910: 69 73 74 43 65 72 74 69 66 69 63 61 74 65 73 28  istCertificates(
2920: 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 20  chromeCallback) 
2930: 7b 0a 09 76 61 72 20 63 61 6c 6c 62 61 63 6b 49  {..var callbackI
2940: 64 3b 0a 09 76 61 72 20 70 72 6f 6d 69 73 65 48  d;..var promiseH
2950: 61 6e 64 6c 65 20 3d 20 6e 75 6c 6c 2c 20 70 72  andle = null, pr
2960: 6f 6d 69 73 65 52 65 73 6f 6c 76 65 2c 20 70 72  omiseResolve, pr
2970: 6f 6d 69 73 65 52 65 6a 65 63 74 3b 0a 0a 09 69  omiseReject;...i
2980: 66 20 28 67 6f 6f 67 2e 44 45 42 55 47 29 20 7b  f (goog.DEBUG) {
2990: 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22  ...console.log("
29a0: 5b 63 61 63 6b 65 79 5d 20 41 73 6b 65 64 20 74  [cackey] Asked t
29b0: 6f 20 70 72 6f 76 69 64 65 20 61 20 6c 69 73 74  o provide a list
29c0: 20 6f 66 20 63 65 72 74 69 66 69 63 61 74 65 73   of certificates
29d0: 20 2d 2d 20 74 68 72 6f 77 69 6e 67 20 74 68 61   -- throwing tha
29e0: 74 20 72 65 71 75 65 73 74 20 6f 76 65 72 20 74  t request over t
29f0: 6f 20 74 68 65 20 4e 61 43 6c 20 73 69 64 65 2e  o the NaCl side.
2a00: 2e 2e 20 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  .. ");..}...if (
2a10: 21 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29  !chromeCallback)
2a20: 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 49 66 20   {.../*... * If 
2a30: 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 73 75 70 70  no callback supp
2a40: 6c 69 65 64 2c 20 61 72 72 61 6e 67 65 20 66 6f  lied, arrange fo
2a50: 72 20 61 20 70 72 6f 6d 69 73 65 20 74 6f 20 62  r a promise to b
2a60: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  e returned inste
2a70: 61 64 0a 09 09 20 2a 2f 0a 09 09 70 72 6f 6d 69  ad... */...promi
2a80: 73 65 48 61 6e 64 6c 65 20 3d 20 6e 65 77 20 50  seHandle = new P
2a90: 72 6f 6d 69 73 65 28 66 75 6e 63 74 69 6f 6e 28  romise(function(
2aa0: 72 65 73 6f 6c 76 65 2c 20 72 65 6a 65 63 74 29  resolve, reject)
2ab0: 20 7b 0a 09 09 09 70 72 6f 6d 69 73 65 52 65 73   {....promiseRes
2ac0: 6f 6c 76 65 20 3d 20 72 65 73 6f 6c 76 65 3b 0a  olve = resolve;.
2ad0: 09 09 09 70 72 6f 6d 69 73 65 52 65 6a 65 63 74  ...promiseReject
2ae0: 20 3d 20 72 65 6a 65 63 74 3b 0a 09 09 7d 29 3b   = reject;...});
2af0: 0a 0a 09 09 63 68 72 6f 6d 65 43 61 6c 6c 62 61  ....chromeCallba
2b00: 63 6b 20 3d 20 66 75 6e 63 74 69 6f 6e 28 63 65  ck = function(ce
2b10: 72 74 73 29 20 7b 0a 09 09 09 70 72 6f 6d 69 73  rts) {....promis
2b20: 65 52 65 73 6f 6c 76 65 28 63 65 72 74 73 29 3b  eResolve(certs);
2b30: 0a 09 09 7d 3b 0a 09 7d 0a 0a 09 63 61 6c 6c 62  ...};..}...callb
2b40: 61 63 6b 49 64 20 3d 20 2b 2b 63 61 63 6b 65 79  ackId = ++cackey
2b50: 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62  OutstandingCallb
2b60: 61 63 6b 43 6f 75 6e 74 65 72 3b 0a 0a 09 63 61  ackCounter;...ca
2b70: 63 6b 65 79 49 6e 69 74 50 43 53 43 28 66 75 6e  ckeyInitPCSC(fun
2b80: 63 74 69 6f 6e 28 29 20 7b 0a 09 09 63 61 63 6b  ction() {...cack
2b90: 65 79 48 61 6e 64 6c 65 2e 70 6f 73 74 4d 65 73  eyHandle.postMes
2ba0: 73 61 67 65 28 0a 09 09 09 7b 0a 09 09 09 09 27  sage(....{.....'
2bb0: 74 61 72 67 65 74 27 3a 20 22 63 61 63 6b 65 79  target': "cackey
2bc0: 22 2c 0a 09 09 09 09 27 63 6f 6d 6d 61 6e 64 27  ",.....'command'
2bd0: 3a 20 22 6c 69 73 74 63 65 72 74 69 66 69 63 61  : "listcertifica
2be0: 74 65 73 22 2c 0a 09 09 09 09 27 69 64 27 3a 20  tes",.....'id': 
2bf0: 63 61 6c 6c 62 61 63 6b 49 64 0a 09 09 09 7d 0a  callbackId....}.
2c00: 09 09 29 3b 0a 0a 09 09 63 61 63 6b 65 79 4f 75  ..);....cackeyOu
2c10: 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63  tstandingCallbac
2c20: 6b 73 5b 63 61 6c 6c 62 61 63 6b 49 64 5d 20 3d  ks[callbackId] =
2c30: 20 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 3b   chromeCallback;
2c40: 0a 0a 09 09 69 66 20 28 67 6f 6f 67 2e 44 45 42  ....if (goog.DEB
2c50: 55 47 29 20 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65  UG) {....console
2c60: 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 54  .log("[cackey] T
2c70: 68 72 6f 77 6e 2e 22 29 3b 0a 09 09 7d 0a 09 7d  hrown.");...}..}
2c80: 2c 20 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b  , chromeCallback
2c90: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 70 72 6f 6d  );...return(prom
2ca0: 69 73 65 48 61 6e 64 6c 65 29 3b 0a 7d 0a 0a 2f  iseHandle);.}../
2cb0: 2a 0a 20 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72  *. * Handler for
2cc0: 20 6d 65 73 73 61 67 65 73 20 66 72 6f 6d 20 43   messages from C
2cd0: 68 72 6f 6d 65 20 72 65 6c 61 74 65 64 20 74 6f  hrome related to
2ce0: 20 6c 69 73 74 69 6e 67 20 72 65 61 64 65 72 73   listing readers
2cf0: 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61  . */.function ca
2d00: 63 6b 65 79 4c 69 73 74 52 65 61 64 65 72 73 28  ckeyListReaders(
2d10: 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 20  chromeCallback) 
2d20: 7b 0a 09 76 61 72 20 63 61 6c 6c 62 61 63 6b 49  {..var callbackI
2d30: 64 3b 0a 0a 09 69 66 20 28 67 6f 6f 67 2e 44 45  d;...if (goog.DE
2d40: 42 55 47 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65  BUG) {...console
2d50: 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 41  .log("[cackey] A
2d60: 73 6b 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  sked to provide 
2d70: 61 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  a list of reader
2d80: 73 20 2d 2d 20 74 68 72 6f 77 69 6e 67 20 74 68  s -- throwing th
2d90: 61 74 20 72 65 71 75 65 73 74 20 6f 76 65 72 20  at request over 
2da0: 74 6f 20 74 68 65 20 4e 61 43 6c 20 73 69 64 65  to the NaCl side
2db0: 2e 2e 2e 20 22 29 3b 0a 09 7d 0a 0a 09 63 61 6c  ... ");..}...cal
2dc0: 6c 62 61 63 6b 49 64 20 3d 20 2b 2b 63 61 63 6b  lbackId = ++cack
2dd0: 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c  eyOutstandingCal
2de0: 6c 62 61 63 6b 43 6f 75 6e 74 65 72 3b 0a 0a 09  lbackCounter;...
2df0: 63 61 63 6b 65 79 49 6e 69 74 50 43 53 43 28 66  cackeyInitPCSC(f
2e00: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 09 09 63 61  unction() {...ca
2e10: 63 6b 65 79 48 61 6e 64 6c 65 2e 70 6f 73 74 4d  ckeyHandle.postM
2e20: 65 73 73 61 67 65 28 0a 09 09 09 7b 0a 09 09 09  essage(....{....
2e30: 09 27 74 61 72 67 65 74 27 3a 20 22 63 61 63 6b  .'target': "cack
2e40: 65 79 22 2c 0a 09 09 09 09 27 63 6f 6d 6d 61 6e  ey",.....'comman
2e50: 64 27 3a 20 22 6c 69 73 74 72 65 61 64 65 72 73  d': "listreaders
2e60: 22 2c 0a 09 09 09 09 27 69 64 27 3a 20 63 61 6c  ",.....'id': cal
2e70: 6c 62 61 63 6b 49 64 0a 09 09 09 7d 0a 09 09 29  lbackId....}...)
2e80: 3b 0a 0a 09 09 63 61 63 6b 65 79 4f 75 74 73 74  ;....cackeyOutst
2e90: 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73 5b  andingCallbacks[
2ea0: 63 61 6c 6c 62 61 63 6b 49 64 5d 20 3d 20 63 68  callbackId] = ch
2eb0: 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 3b 0a 0a 09  romeCallback;...
2ec0: 09 69 66 20 28 67 6f 6f 67 2e 44 45 42 55 47 29  .if (goog.DEBUG)
2ed0: 20 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f   {....console.lo
2ee0: 67 28 22 5b 63 61 63 6b 65 79 5d 20 54 68 72 6f  g("[cackey] Thro
2ef0: 77 6e 2e 22 29 3b 0a 09 09 7d 0a 09 7d 2c 20 63  wn.");...}..}, c
2f00: 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 3b 0a  hromeCallback);.
2f10: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
2f20: 20 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 6d   * Handler for m
2f30: 65 73 73 61 67 65 73 20 66 72 6f 6d 20 43 68 72  essages from Chr
2f40: 6f 6d 65 20 72 65 6c 61 74 65 64 20 74 6f 20 73  ome related to s
2f50: 69 67 6e 69 6e 67 20 61 20 68 61 73 68 20 6f 66  igning a hash of
2f60: 20 73 6f 6d 65 20 73 6f 72 74 0a 20 2a 2f 0a 66   some sort. */.f
2f70: 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 53 69  unction cackeySi
2f80: 67 6e 4d 65 73 73 61 67 65 28 73 69 67 6e 52 65  gnMessage(signRe
2f90: 71 75 65 73 74 2c 20 63 68 72 6f 6d 65 43 61 6c  quest, chromeCal
2fa0: 6c 62 61 63 6b 29 20 7b 0a 09 76 61 72 20 63 61  lback) {..var ca
2fb0: 6c 6c 62 61 63 6b 49 64 3b 0a 09 76 61 72 20 63  llbackId;..var c
2fc0: 6f 6d 6d 61 6e 64 3b 0a 09 76 61 72 20 63 65 72  ommand;..var cer
2fd0: 74 69 66 69 63 61 74 65 49 64 3b 0a 09 76 61 72  tificateId;..var
2fe0: 20 64 69 67 65 73 74 2c 20 64 69 67 65 73 74 48   digest, digestH
2ff0: 65 61 64 65 72 3b 0a 09 76 61 72 20 70 72 6f 6d  eader;..var prom
3000: 69 73 65 48 61 6e 64 6c 65 20 3d 20 6e 75 6c 6c  iseHandle = null
3010: 2c 20 70 72 6f 6d 69 73 65 52 65 73 6f 6c 76 65  , promiseResolve
3020: 2c 20 70 72 6f 6d 69 73 65 52 65 6a 65 63 74 3b  , promiseReject;
3030: 0a 0a 09 69 66 20 28 73 69 67 6e 52 65 71 75 65  ...if (signReque
3040: 73 74 2e 73 69 67 6e 52 65 71 75 65 73 74 49 64  st.signRequestId
3050: 20 3d 3d 3d 20 75 6e 64 65 66 69 6e 65 64 20 7c   === undefined |
3060: 7c 20 73 69 67 6e 52 65 71 75 65 73 74 2e 73 69  | signRequest.si
3070: 67 6e 52 65 71 75 65 73 74 49 64 20 3d 3d 3d 20  gnRequestId === 
3080: 6e 75 6c 6c 29 20 7b 0a 09 09 73 69 67 6e 52 65  null) {...signRe
3090: 71 75 65 73 74 2e 73 69 67 6e 52 65 71 75 65 73  quest.signReques
30a0: 74 49 64 20 3d 20 6e 75 6c 6c 3b 0a 09 7d 0a 0a  tId = null;..}..
30b0: 09 69 66 20 28 21 63 68 72 6f 6d 65 43 61 6c 6c  .if (!chromeCall
30c0: 62 61 63 6b 29 20 7b 0a 09 09 2f 2a 0a 09 09 20  back) {.../*... 
30d0: 2a 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b  * If no callback
30e0: 20 73 75 70 70 6c 69 65 64 2c 20 61 72 72 61 6e   supplied, arran
30f0: 67 65 20 66 6f 72 20 61 20 70 72 6f 6d 69 73 65  ge for a promise
3100: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
3110: 69 6e 73 74 65 61 64 0a 09 09 20 2a 2f 0a 09 09  instead... */...
3120: 70 72 6f 6d 69 73 65 48 61 6e 64 6c 65 20 3d 20  promiseHandle = 
3130: 6e 65 77 20 50 72 6f 6d 69 73 65 28 66 75 6e 63  new Promise(func
3140: 74 69 6f 6e 28 72 65 73 6f 6c 76 65 2c 20 72 65  tion(resolve, re
3150: 6a 65 63 74 29 20 7b 0a 09 09 09 70 72 6f 6d 69  ject) {....promi
3160: 73 65 52 65 73 6f 6c 76 65 20 3d 20 72 65 73 6f  seResolve = reso
3170: 6c 76 65 3b 0a 09 09 09 70 72 6f 6d 69 73 65 52  lve;....promiseR
3180: 65 6a 65 63 74 20 3d 20 72 65 6a 65 63 74 3b 0a  eject = reject;.
3190: 09 09 7d 29 3b 0a 0a 09 09 63 68 72 6f 6d 65 43  ..});....chromeC
31a0: 61 6c 6c 62 61 63 6b 20 3d 20 66 75 6e 63 74 69  allback = functi
31b0: 6f 6e 28 70 61 79 6c 6f 61 64 29 20 7b 0a 09 09  on(payload) {...
31c0: 09 69 66 20 28 21 70 61 79 6c 6f 61 64 29 20 7b  .if (!payload) {
31d0: 0a 09 09 09 09 70 72 6f 6d 69 73 65 52 65 6a 65  .....promiseReje
31e0: 63 74 28 6e 65 77 20 45 72 72 6f 72 28 22 53 69  ct(new Error("Si
31f0: 67 6e 69 6e 67 20 70 61 79 6c 6f 61 64 20 69 73  gning payload is
3200: 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 20 73 75   empty or not su
3210: 70 70 6c 69 65 64 22 29 29 3b 0a 09 09 09 7d 20  pplied"));....} 
3220: 65 6c 73 65 20 7b 0a 09 09 09 09 70 72 6f 6d 69  else {.....promi
3230: 73 65 52 65 73 6f 6c 76 65 28 70 61 79 6c 6f 61  seResolve(payloa
3240: 64 29 3b 0a 09 09 09 7d 0a 09 09 7d 3b 0a 09 7d  d);....}...};..}
3250: 0a 0a 09 2f 2a 0a 09 20 2a 20 50 72 65 66 69 78  .../*.. * Prefix
3260: 20 74 68 65 20 64 69 67 65 73 74 20 77 69 74 68   the digest with
3270: 20 74 68 65 20 41 53 4e 2e 31 20 68 65 61 64 65   the ASN.1 heade
3280: 72 20 72 65 71 75 69 72 65 64 20 6f 66 20 69 74  r required of it
3290: 0a 09 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 73  .. */..switch (s
32a0: 69 67 6e 52 65 71 75 65 73 74 2e 68 61 73 68 29  ignRequest.hash)
32b0: 20 7b 0a 09 09 63 61 73 65 20 22 53 48 41 31 22   {...case "SHA1"
32c0: 3a 0a 09 09 09 64 69 67 65 73 74 48 65 61 64 65  :....digestHeade
32d0: 72 20 3d 20 6e 65 77 20 55 69 6e 74 38 41 72 72  r = new Uint8Arr
32e0: 61 79 28 5b 30 78 33 30 2c 20 30 78 32 31 2c 20  ay([0x30, 0x21, 
32f0: 30 78 33 30 2c 20 30 78 30 39 2c 20 30 78 30 36  0x30, 0x09, 0x06
3300: 2c 20 30 78 30 35 2c 20 30 78 32 62 2c 20 30 78  , 0x05, 0x2b, 0x
3310: 30 65 2c 20 30 78 30 33 2c 20 30 78 30 32 2c 20  0e, 0x03, 0x02, 
3320: 30 78 31 61 2c 20 30 78 30 35 2c 20 30 78 30 30  0x1a, 0x05, 0x00
3330: 2c 20 30 78 30 34 2c 20 30 78 31 34 5d 29 3b 0a  , 0x04, 0x14]);.
3340: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
3350: 20 22 53 48 41 32 35 36 22 3a 0a 09 09 09 64 69   "SHA256":....di
3360: 67 65 73 74 48 65 61 64 65 72 20 3d 20 6e 65 77  gestHeader = new
3370: 20 55 69 6e 74 38 41 72 72 61 79 28 5b 30 78 33   Uint8Array([0x3
3380: 30 2c 20 30 78 33 31 2c 20 30 78 33 30 2c 20 30  0, 0x31, 0x30, 0
3390: 78 30 64 2c 20 30 78 30 36 2c 20 30 78 30 39 2c  x0d, 0x06, 0x09,
33a0: 20 30 78 36 30 2c 20 30 78 38 36 2c 20 30 78 34   0x60, 0x86, 0x4
33b0: 38 2c 20 30 78 30 31 2c 20 30 78 36 35 2c 20 30  8, 0x01, 0x65, 0
33c0: 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 32 2c  x03, 0x04, 0x02,
33d0: 20 30 78 30 31 2c 20 30 78 30 35 2c 20 30 78 30   0x01, 0x05, 0x0
33e0: 30 2c 20 30 78 30 34 2c 20 30 78 32 30 5d 29 3b  0, 0x04, 0x20]);
33f0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
3400: 65 20 22 53 48 41 35 31 32 22 3a 0a 09 09 09 64  e "SHA512":....d
3410: 69 67 65 73 74 48 65 61 64 65 72 20 3d 20 6e 65  igestHeader = ne
3420: 77 20 55 69 6e 74 38 41 72 72 61 79 28 5b 30 78  w Uint8Array([0x
3430: 33 30 2c 20 30 78 35 31 2c 20 30 78 33 30 2c 20  30, 0x51, 0x30, 
3440: 30 78 30 64 2c 20 30 78 30 36 2c 20 30 78 30 39  0x0d, 0x06, 0x09
3450: 2c 20 30 78 36 30 2c 20 30 78 38 36 2c 20 30 78  , 0x60, 0x86, 0x
3460: 34 38 2c 20 30 78 30 31 2c 20 30 78 36 35 2c 20  48, 0x01, 0x65, 
3470: 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 32  0x03, 0x04, 0x02
3480: 2c 20 30 78 30 33 2c 20 30 78 30 35 2c 20 30 78  , 0x03, 0x05, 0x
3490: 30 30 2c 20 30 78 30 34 2c 20 30 78 34 30 5d 29  00, 0x04, 0x40])
34a0: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
34b0: 73 65 20 22 4d 44 35 5f 53 48 41 31 22 3a 0a 09  se "MD5_SHA1":..
34c0: 09 63 61 73 65 20 22 52 41 57 22 3a 0a 09 09 09  .case "RAW":....
34d0: 64 69 67 65 73 74 48 65 61 64 65 72 20 3d 20 6e  digestHeader = n
34e0: 65 77 20 55 69 6e 74 38 41 72 72 61 79 28 29 3b  ew Uint8Array();
34f0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66  ....break;...def
3500: 61 75 6c 74 3a 0a 09 09 09 63 6f 6e 73 6f 6c 65  ault:....console
3510: 2e 65 72 72 6f 72 28 22 5b 63 61 63 6b 65 79 5d  .error("[cackey]
3520: 20 41 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 61   Asked to sign a
3530: 20 6d 65 73 73 61 67 65 20 77 69 74 68 20 61 20   message with a 
3540: 68 61 73 68 20 77 65 20 64 6f 20 6e 6f 74 20 73  hash we do not s
3550: 75 70 70 6f 72 74 3a 20 22 20 2b 20 73 69 67 6e  upport: " + sign
3560: 52 65 71 75 65 73 74 2e 68 61 73 68 29 3b 0a 0a  Request.hash);..
3570: 09 09 09 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63  ...chromeCallbac
3580: 6b 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  k();.....return(
3590: 70 72 6f 6d 69 73 65 48 61 6e 64 6c 65 29 3b 0a  promiseHandle);.
35a0: 09 7d 0a 0a 09 64 69 67 65 73 74 20 3d 20 6e 65  .}...digest = ne
35b0: 77 20 55 69 6e 74 38 41 72 72 61 79 28 64 69 67  w Uint8Array(dig
35c0: 65 73 74 48 65 61 64 65 72 2e 6c 65 6e 67 74 68  estHeader.length
35d0: 20 2b 20 73 69 67 6e 52 65 71 75 65 73 74 2e 64   + signRequest.d
35e0: 69 67 65 73 74 2e 62 79 74 65 4c 65 6e 67 74 68  igest.byteLength
35f0: 29 3b 0a 09 64 69 67 65 73 74 2e 73 65 74 28 64  );..digest.set(d
3600: 69 67 65 73 74 48 65 61 64 65 72 2c 20 30 29 3b  igestHeader, 0);
3610: 0a 09 64 69 67 65 73 74 2e 73 65 74 28 6e 65 77  ..digest.set(new
3620: 20 55 69 6e 74 38 41 72 72 61 79 28 73 69 67 6e   Uint8Array(sign
3630: 52 65 71 75 65 73 74 2e 64 69 67 65 73 74 29 2c  Request.digest),
3640: 20 64 69 67 65 73 74 48 65 61 64 65 72 2e 6c 65   digestHeader.le
3650: 6e 67 74 68 29 3b 0a 0a 09 64 65 6c 65 74 65 20  ngth);...delete 
3660: 64 69 67 65 73 74 48 65 61 64 65 72 3b 0a 0a 09  digestHeader;...
3670: 69 66 20 28 67 6f 6f 67 2e 44 45 42 55 47 29 20  if (goog.DEBUG) 
3680: 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28  {...console.log(
3690: 22 5b 63 61 63 6b 65 79 5d 20 41 73 6b 65 64 20  "[cackey] Asked 
36a0: 74 6f 20 73 69 67 6e 20 61 20 6d 65 73 73 61 67  to sign a messag
36b0: 65 20 2d 2d 20 74 68 72 6f 77 69 6e 67 20 74 68  e -- throwing th
36c0: 61 74 20 72 65 71 75 65 73 74 20 6f 76 65 72 20  at request over 
36d0: 74 6f 20 74 68 65 20 4e 61 43 6c 20 73 69 64 65  to the NaCl side
36e0: 2e 2e 2e 20 22 29 3b 0a 09 7d 0a 0a 09 63 61 6c  ... ");..}...cal
36f0: 6c 62 61 63 6b 49 64 20 3d 20 2b 2b 63 61 63 6b  lbackId = ++cack
3700: 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c  eyOutstandingCal
3710: 6c 62 61 63 6b 43 6f 75 6e 74 65 72 3b 0a 0a 09  lbackCounter;...
3720: 63 6f 6d 6d 61 6e 64 20 3d 20 7b 0a 09 09 27 74  command = {...'t
3730: 61 72 67 65 74 27 3a 20 22 63 61 63 6b 65 79 22  arget': "cackey"
3740: 2c 0a 09 09 27 63 6f 6d 6d 61 6e 64 27 3a 20 22  ,...'command': "
3750: 73 69 67 6e 22 2c 0a 09 09 27 73 69 67 6e 52 65  sign",...'signRe
3760: 71 75 65 73 74 49 64 27 3a 20 73 69 67 6e 52 65  questId': signRe
3770: 71 75 65 73 74 2e 73 69 67 6e 52 65 71 75 65 73  quest.signReques
3780: 74 49 64 2c 0a 09 09 27 69 64 27 3a 20 63 61 6c  tId,...'id': cal
3790: 6c 62 61 63 6b 49 64 2c 0a 09 09 27 63 65 72 74  lbackId,...'cert
37a0: 69 66 69 63 61 74 65 27 3a 20 73 69 67 6e 52 65  ificate': signRe
37b0: 71 75 65 73 74 2e 63 65 72 74 69 66 69 63 61 74  quest.certificat
37c0: 65 2c 0a 09 09 27 64 61 74 61 27 3a 20 64 69 67  e,...'data': dig
37d0: 65 73 74 2e 62 75 66 66 65 72 0a 09 7d 3b 0a 0a  est.buffer..};..
37e0: 09 63 65 72 74 69 66 69 63 61 74 65 49 64 20 3d  .certificateId =
37f0: 20 63 61 63 6b 65 79 43 65 72 74 69 66 69 63 61   cackeyCertifica
3800: 74 65 54 6f 50 49 4e 49 44 28 63 6f 6d 6d 61 6e  teToPINID(comman
3810: 64 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a  d.certificate);.
3820: 0a 09 69 66 20 28 63 61 63 6b 65 79 43 65 72 74  ..if (cackeyCert
3830: 69 66 69 63 61 74 65 54 6f 50 49 4e 4d 61 70 5b  ificateToPINMap[
3840: 63 65 72 74 69 66 69 63 61 74 65 49 64 5d 20 26  certificateId] &
3850: 26 20 63 61 63 6b 65 79 43 65 72 74 69 66 69 63  & cackeyCertific
3860: 61 74 65 54 6f 50 49 4e 4d 61 70 5b 63 65 72 74  ateToPINMap[cert
3870: 69 66 69 63 61 74 65 49 64 5d 2e 70 69 6e 29 20  ificateId].pin) 
3880: 7b 0a 09 09 63 6f 6d 6d 61 6e 64 2e 70 69 6e 20  {...command.pin 
3890: 3d 20 63 61 63 6b 65 79 43 65 72 74 69 66 69 63  = cackeyCertific
38a0: 61 74 65 54 6f 50 49 4e 4d 61 70 5b 63 65 72 74  ateToPINMap[cert
38b0: 69 66 69 63 61 74 65 49 64 5d 2e 70 69 6e 3b 0a  ificateId].pin;.
38c0: 0a 09 09 63 61 63 6b 65 79 43 65 72 74 69 66 69  ...cackeyCertifi
38d0: 63 61 74 65 54 6f 50 49 4e 4d 61 70 55 70 64 61  cateToPINMapUpda
38e0: 74 65 4c 61 73 74 55 73 65 64 28 63 65 72 74 69  teLastUsed(certi
38f0: 66 69 63 61 74 65 49 64 29 3b 0a 09 7d 0a 0a 09  ficateId);..}...
3900: 63 61 63 6b 65 79 49 6e 69 74 50 43 53 43 28 66  cackeyInitPCSC(f
3910: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 09 09 63 61  unction() {...ca
3920: 63 6b 65 79 48 61 6e 64 6c 65 2e 70 6f 73 74 4d  ckeyHandle.postM
3930: 65 73 73 61 67 65 28 63 6f 6d 6d 61 6e 64 29 3b  essage(command);
3940: 0a 0a 09 09 63 61 63 6b 65 79 4f 75 74 73 74 61  ....cackeyOutsta
3950: 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73 5b 63  ndingCallbacks[c
3960: 61 6c 6c 62 61 63 6b 49 64 5d 20 3d 20 63 68 72  allbackId] = chr
3970: 6f 6d 65 43 61 6c 6c 62 61 63 6b 3b 0a 0a 09 09  omeCallback;....
3980: 69 66 20 28 67 6f 6f 67 2e 44 45 42 55 47 29 20  if (goog.DEBUG) 
3990: 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67  {....console.log
39a0: 28 22 5b 63 61 63 6b 65 79 5d 20 54 68 72 6f 77  ("[cackey] Throw
39b0: 6e 2e 22 29 3b 0a 09 09 7d 0a 09 7d 2c 20 63 68  n.");...}..}, ch
39c0: 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a  romeCallback);..
39d0: 09 72 65 74 75 72 6e 28 70 72 6f 6d 69 73 65 48  .return(promiseH
39e0: 61 6e 64 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  andle);.}../*. *
39f0: 20 55 6e 69 74 69 74 61 6c 69 7a 65 73 20 74 68   Unititalizes th
3a00: 65 20 43 41 43 4b 65 79 20 50 43 53 43 20 63 6f  e CACKey PCSC co
3a10: 6e 6e 65 63 74 69 6f 6e 0a 20 2a 2f 0a 66 75 6e  nnection. */.fun
3a20: 63 74 69 6f 6e 20 63 61 63 6b 65 79 55 6e 69 6e  ction cackeyUnin
3a30: 69 74 50 43 53 43 28 29 20 7b 0a 09 63 6f 6e 73  itPCSC() {..cons
3a40: 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79  ole.log("[cackey
3a50: 5d 20 63 61 63 6b 65 79 55 6e 69 6e 69 74 50 43  ] cackeyUninitPC
3a60: 53 43 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 0a  SC() called");..
3a70: 09 69 66 20 28 63 61 63 6b 65 79 50 43 53 43 48  .if (cackeyPCSCH
3a80: 61 6e 64 6c 65 20 21 3d 20 6e 75 6c 6c 29 20 7b  andle != null) {
3a90: 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22  ...console.log("
3aa0: 5b 63 61 63 6b 65 79 5d 20 44 65 6c 65 74 69 6e  [cackey] Deletin
3ab0: 67 20 50 43 53 43 20 68 61 6e 64 6c 65 22 29 3b  g PCSC handle");
3ac0: 0a 0a 09 09 63 61 63 6b 65 79 50 43 53 43 48 61  ....cackeyPCSCHa
3ad0: 6e 64 6c 65 20 3d 20 6e 75 6c 6c 3b 0a 09 7d 0a  ndle = null;..}.
3ae0: 0a 09 63 61 63 6b 65 79 50 43 53 43 48 61 6e 64  ..cackeyPCSCHand
3af0: 6c 65 55 73 61 62 6c 65 20 3d 20 66 61 6c 73 65  leUsable = false
3b00: 3b 0a 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28  ;...console.log(
3b10: 22 5b 63 61 63 6b 65 79 5d 20 63 61 63 6b 65 79  "[cackey] cackey
3b20: 55 6e 69 6e 69 74 50 43 53 43 28 29 20 72 65 74  UninitPCSC() ret
3b30: 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75  urning");...retu
3b40: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 6e 69  rn;.}../*. * Uni
3b50: 6e 69 74 69 61 6c 69 7a 65 73 20 43 41 43 4b 65  nitializes CACKe
3b60: 79 20 28 70 72 6f 62 61 62 6c 79 20 64 75 65 20  y (probably due 
3b70: 74 6f 20 61 20 63 72 61 73 68 29 0a 20 2a 2f 0a  to a crash). */.
3b80: 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 55  function cackeyU
3b90: 6e 69 6e 69 74 28 29 20 7b 0a 09 63 6f 6e 73 6f  ninit() {..conso
3ba0: 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d  le.log("[cackey]
3bb0: 20 63 61 63 6b 65 79 55 6e 69 6e 69 74 28 29 20   cackeyUninit() 
3bc0: 63 61 6c 6c 65 64 22 29 3b 0a 0a 09 69 66 20 28  called");...if (
3bd0: 63 68 72 6f 6d 65 2e 63 65 72 74 69 66 69 63 61  chrome.certifica
3be0: 74 65 50 72 6f 76 69 64 65 72 29 20 7b 0a 09 09  teProvider) {...
3bf0: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61  console.log("[ca
3c00: 63 6b 65 79 5d 20 55 6e 72 65 67 69 73 74 65 72  ckey] Unregister
3c10: 65 64 20 43 68 72 6f 6d 65 20 63 65 72 74 69 66  ed Chrome certif
3c20: 69 63 61 74 65 20 68 61 6e 64 6c 65 72 73 22 29  icate handlers")
3c30: 3b 0a 0a 09 09 63 68 72 6f 6d 65 2e 63 65 72 74  ;....chrome.cert
3c40: 69 66 69 63 61 74 65 50 72 6f 76 69 64 65 72 2e  ificateProvider.
3c50: 6f 6e 43 65 72 74 69 66 69 63 61 74 65 73 52 65  onCertificatesRe
3c60: 71 75 65 73 74 65 64 2e 72 65 6d 6f 76 65 4c 69  quested.removeLi
3c70: 73 74 65 6e 65 72 28 63 61 63 6b 65 79 4c 69 73  stener(cackeyLis
3c80: 74 43 65 72 74 69 66 69 63 61 74 65 73 29 3b 0a  tCertificates);.
3c90: 09 09 63 68 72 6f 6d 65 2e 63 65 72 74 69 66 69  ..chrome.certifi
3ca0: 63 61 74 65 50 72 6f 76 69 64 65 72 2e 6f 6e 53  cateProvider.onS
3cb0: 69 67 6e 44 69 67 65 73 74 52 65 71 75 65 73 74  ignDigestRequest
3cc0: 65 64 2e 72 65 6d 6f 76 65 4c 69 73 74 65 6e 65  ed.removeListene
3cd0: 72 28 63 61 63 6b 65 79 53 69 67 6e 4d 65 73 73  r(cackeySignMess
3ce0: 61 67 65 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  age);..}...cacke
3cf0: 79 55 6e 69 6e 69 74 50 43 53 43 28 29 3b 0a 0a  yUninitPCSC();..
3d00: 09 69 66 20 28 63 61 63 6b 65 79 48 61 6e 64 6c  .if (cackeyHandl
3d10: 65 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09 63  e != null) {...c
3d20: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63  onsole.log("[cac
3d30: 6b 65 79 5d 20 44 65 6c 65 74 69 6e 67 20 50 4e  key] Deleting PN
3d40: 61 43 6c 20 6d 6f 64 75 6c 65 22 29 3b 0a 0a 09  aCl module");...
3d50: 09 74 72 79 20 7b 0a 09 09 09 64 6f 63 75 6d 65  .try {....docume
3d60: 6e 74 2e 62 6f 64 79 2e 72 65 6d 6f 76 65 43 68  nt.body.removeCh
3d70: 69 6c 64 28 63 61 63 6b 65 79 48 61 6e 64 6c 65  ild(cackeyHandle
3d80: 29 3b 0a 09 09 7d 20 63 61 74 63 68 20 28 65 29  );...} catch (e)
3d90: 20 7b 20 7d 0a 0a 09 09 64 65 6c 65 74 65 20 63   { }....delete c
3da0: 61 63 6b 65 79 48 61 6e 64 6c 65 3b 0a 0a 09 09  ackeyHandle;....
3db0: 63 61 63 6b 65 79 48 61 6e 64 6c 65 20 3d 20 6e  cackeyHandle = n
3dc0: 75 6c 6c 3b 0a 09 7d 0a 0a 09 63 6f 6e 73 6f 6c  ull;..}...consol
3dd0: 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20  e.log("[cackey] 
3de0: 63 61 63 6b 65 79 55 6e 69 6e 69 74 28 29 20 63  cackeyUninit() c
3df0: 6f 6d 70 6c 65 74 65 22 29 3b 0a 0a 09 72 65 74  omplete");...ret
3e00: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 52 65  urn;.}../*. * Re
3e10: 73 74 61 72 74 73 20 43 41 43 4b 65 79 0a 20 2a  starts CACKey. *
3e20: 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65  /.function cacke
3e30: 79 52 65 73 74 61 72 74 28 29 20 7b 0a 09 63 61  yRestart() {..ca
3e40: 63 6b 65 79 55 6e 69 6e 69 74 28 29 3b 0a 09 63  ckeyUninit();..c
3e50: 61 63 6b 65 79 49 6e 69 74 28 29 3b 0a 0a 09 72  ackeyInit();...r
3e60: 65 74 75 72 6e 3b 0a 7d 0a 0a 66 75 6e 63 74 69  eturn;.}..functi
3e70: 6f 6e 20 63 61 63 6b 65 79 49 6e 69 74 47 6c 6f  on cackeyInitGlo
3e80: 62 61 6c 53 74 61 74 65 28 29 20 7b 0a 09 63 61  balState() {..ca
3e90: 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43  ckeyOutstandingC
3ea0: 61 6c 6c 62 61 63 6b 73 20 3d 20 7b 7d 3b 0a 7d  allbacks = {};.}
3eb0: 3b 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65 20  ;../*. * Handle 
3ec0: 61 20 43 41 43 4b 65 79 20 63 72 61 73 68 20 28  a CACKey crash (
3ed0: 70 72 6f 62 61 62 6c 79 20 64 75 65 20 74 6f 20  probably due to 
3ee0: 6c 6f 73 73 20 6f 66 20 63 6f 6e 6e 65 63 74 69  loss of connecti
3ef0: 76 69 74 79 20 74 6f 20 74 68 65 20 50 43 53 43  vity to the PCSC
3f00: 20 64 61 65 6d 6f 6e 29 0a 20 2a 2f 0a 66 75 6e   daemon). */.fun
3f10: 63 74 69 6f 6e 20 63 61 63 6b 65 79 43 72 61 73  ction cackeyCras
3f20: 68 28 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 65  h() {../*.. * De
3f30: 2d 69 6e 69 74 69 61 6c 69 7a 65 20 43 41 43 4b  -initialize CACK
3f40: 65 79 0a 09 20 2a 2f 0a 09 63 61 63 6b 65 79 55  ey.. */..cackeyU
3f50: 6e 69 6e 69 74 28 29 3b 0a 0a 09 2f 2a 0a 09 20  ninit();.../*.. 
3f60: 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 67  * Reinitialize g
3f70: 6c 6f 62 61 6c 20 73 74 61 74 65 0a 09 20 2a 2f  lobal state.. */
3f80: 0a 09 63 61 63 6b 65 79 49 6e 69 74 47 6c 6f 62  ..cackeyInitGlob
3f90: 61 6c 53 74 61 74 65 28 29 3b 0a 0a 09 2f 2a 0a  alState();.../*.
3fa0: 09 20 2a 20 53 63 68 65 64 75 6c 65 20 74 68 65  . * Schedule the
3fb0: 20 72 65 73 74 61 72 74 20 74 6f 20 6f 63 63 75   restart to occu
3fc0: 72 20 69 6e 20 33 30 20 73 65 63 6f 6e 64 73 20  r in 30 seconds 
3fd0: 69 6e 20 63 61 73 65 20 77 65 20 72 65 61 6c 6c  in case we reall
3fe0: 79 20 61 72 65 0a 09 20 2a 20 6e 6f 74 20 77 6f  y are.. * not wo
3ff0: 72 6b 69 6e 67 2e 0a 09 20 2a 2f 0a 09 73 65 74  rking... */..set
4000: 54 69 6d 65 6f 75 74 28 63 61 63 6b 65 79 49 6e  Timeout(cackeyIn
4010: 69 74 2c 20 33 30 30 30 30 29 3b 0a 0a 09 72 65  it, 30000);...re
4020: 74 75 72 6e 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  turn;.}..functio
4030: 6e 20 63 61 63 6b 65 79 49 6e 69 74 50 43 53 43  n cackeyInitPCSC
4040: 43 6f 6d 70 6c 65 74 65 64 28 73 74 61 74 65 29  Completed(state)
4050: 20 7b 0a 09 76 61 72 20 69 64 78 3b 0a 0a 09 63   {..var idx;...c
4060: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63  onsole.log("[cac
4070: 6b 65 79 5d 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  key] Connection 
4080: 63 6f 6d 70 6c 65 74 65 64 20 28 73 74 61 74 65  completed (state
4090: 20 3d 20 5c 22 22 20 2b 20 73 74 61 74 65 20 2b   = \"" + state +
40a0: 20 22 5c 22 29 2c 20 73 65 6e 64 69 6e 67 20 71   "\"), sending q
40b0: 75 65 75 65 64 20 65 76 65 6e 74 73 3a 20 22 20  ueued events: " 
40c0: 2b 20 63 61 63 6b 65 79 43 61 6c 6c 62 61 63 6b  + cackeyCallback
40d0: 41 66 74 65 72 49 6e 69 74 2e 6c 65 6e 67 74 68  AfterInit.length
40e0: 29 3b 0a 0a 09 73 77 69 74 63 68 20 28 73 74 61  );...switch (sta
40f0: 74 65 29 20 7b 0a 09 09 63 61 73 65 20 22 73 75  te) {...case "su
4100: 63 63 65 73 73 22 3a 0a 09 09 09 63 61 63 6b 65  ccess":....cacke
4110: 79 50 43 53 43 48 61 6e 64 6c 65 55 73 61 62 6c  yPCSCHandleUsabl
4120: 65 20 3d 20 74 72 75 65 3b 0a 0a 09 09 09 62 72  e = true;.....br
4130: 65 61 6b 3b 0a 09 09 63 61 73 65 20 22 66 61 69  eak;...case "fai
4140: 6c 75 72 65 22 3a 0a 09 09 09 63 61 63 6b 65 79  lure":....cackey
4150: 50 43 53 43 48 61 6e 64 6c 65 55 73 61 62 6c 65  PCSCHandleUsable
4160: 20 3d 20 66 61 6c 73 65 3b 0a 0a 09 09 09 62 72   = false;.....br
4170: 65 61 6b 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  eak;..}...for (i
4180: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 61  dx = 0; idx < ca
4190: 63 6b 65 79 43 61 6c 6c 62 61 63 6b 41 66 74 65  ckeyCallbackAfte
41a0: 72 49 6e 69 74 2e 6c 65 6e 67 74 68 3b 20 69 64  rInit.length; id
41b0: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61  x++) {...if (!ca
41c0: 63 6b 65 79 43 61 6c 6c 62 61 63 6b 41 66 74 65  ckeyCallbackAfte
41d0: 72 49 6e 69 74 5b 69 64 78 5d 29 20 7b 0a 09 09  rInit[idx]) {...
41e0: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
41f0: 09 09 73 77 69 74 63 68 20 28 73 74 61 74 65 29  ..switch (state)
4200: 20 7b 0a 09 09 09 63 61 73 65 20 22 73 75 63 63   {....case "succ
4210: 65 73 73 22 3a 0a 09 09 09 09 28 63 61 63 6b 65  ess":.....(cacke
4220: 79 43 61 6c 6c 62 61 63 6b 41 66 74 65 72 49 6e  yCallbackAfterIn
4230: 69 74 5b 69 64 78 5d 2e 73 75 63 63 65 73 73 43  it[idx].successC
4240: 61 6c 6c 62 61 63 6b 29 28 29 3b 0a 0a 09 09 09  allback)();.....
4250: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
4260: 22 66 61 69 6c 75 72 65 22 3a 0a 09 09 09 09 28  "failure":.....(
4270: 63 61 63 6b 65 79 43 61 6c 6c 62 61 63 6b 41 66  cackeyCallbackAf
4280: 74 65 72 49 6e 69 74 5b 69 64 78 5d 2e 66 61 69  terInit[idx].fai
4290: 6c 75 72 65 43 61 6c 6c 62 61 63 6b 29 28 29 3b  lureCallback)();
42a0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ......break;...}
42b0: 0a 09 7d 0a 0a 09 64 65 6c 65 74 65 20 63 61 63  ..}...delete cac
42c0: 6b 65 79 43 61 6c 6c 62 61 63 6b 41 66 74 65 72  keyCallbackAfter
42d0: 49 6e 69 74 3b 0a 0a 09 63 61 63 6b 65 79 43 61  Init;...cackeyCa
42e0: 6c 6c 62 61 63 6b 41 66 74 65 72 49 6e 69 74 20  llbackAfterInit 
42f0: 3d 20 5b 5d 3b 0a 0a 09 63 6f 6e 73 6f 6c 65 2e  = [];...console.
4300: 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 41 6c  log("[cackey] Al
4310: 6c 20 71 75 65 75 65 64 20 65 76 65 6e 74 73 20  l queued events 
4320: 70 72 6f 63 65 73 73 65 64 22 29 3b 0a 0a 09 72  processed");...r
4330: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
4340: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50  Initialize the P
4350: 43 53 43 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  CSC connection. 
4360: 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b  */.function cack
4370: 65 79 49 6e 69 74 50 43 53 43 28 63 61 6c 6c 62  eyInitPCSC(callb
4380: 61 63 6b 41 66 74 65 72 49 6e 69 74 2c 20 63 61  ackAfterInit, ca
4390: 6c 6c 62 61 63 6b 49 6e 69 74 46 61 69 6c 65 64  llbackInitFailed
43a0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 74 61 72  ) {../*.. * Star
43b0: 74 20 74 68 65 20 47 6f 6f 67 6c 65 20 50 43 53  t the Google PCS
43c0: 43 20 49 6e 74 65 72 66 61 63 65 0a 09 20 2a 2f  C Interface.. */
43d0: 0a 09 76 61 72 20 6e 6f 77 2c 20 6c 61 73 74 55  ..var now, lastU
43e0: 73 65 64 4d 69 6c 6c 69 73 65 63 6f 6e 64 73 41  sedMillisecondsA
43f0: 67 6f 3b 0a 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f  go;...console.lo
4400: 67 28 22 5b 63 61 63 6b 65 79 5d 20 63 61 63 6b  g("[cackey] cack
4410: 65 79 49 6e 69 74 50 43 53 43 28 29 20 63 61 6c  eyInitPCSC() cal
4420: 6c 65 64 22 29 3b 0a 0a 09 6e 6f 77 20 3d 20 28  led");...now = (
4430: 6e 65 77 20 44 61 74 65 28 29 29 2e 67 65 74 54  new Date()).getT
4440: 69 6d 65 28 29 3b 0a 09 6c 61 73 74 55 73 65 64  ime();..lastUsed
4450: 4d 69 6c 6c 69 73 65 63 6f 6e 64 73 41 67 6f 20  MillisecondsAgo 
4460: 3d 20 6e 6f 77 20 2d 20 63 61 63 6b 65 79 50 43  = now - cackeyPC
4470: 53 43 48 61 6e 64 6c 65 4c 61 73 74 55 73 65 64  SCHandleLastUsed
4480: 3b 0a 0a 09 69 66 20 28 6c 61 73 74 55 73 65 64  ;...if (lastUsed
4490: 4d 69 6c 6c 69 73 65 63 6f 6e 64 73 41 67 6f 20  MillisecondsAgo 
44a0: 3e 20 33 30 30 30 30 29 20 7b 0a 09 09 63 6f 6e  > 30000) {...con
44b0: 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65  sole.log("[cacke
44c0: 79 5d 20 50 43 53 43 20 68 61 6e 64 6c 65 20 77  y] PCSC handle w
44d0: 61 73 20 6c 61 73 74 20 75 73 65 64 20 22 20 2b  as last used " +
44e0: 20 6c 61 73 74 55 73 65 64 4d 69 6c 6c 69 73 65   lastUsedMillise
44f0: 63 6f 6e 64 73 41 67 6f 20 2b 20 22 6d 73 20 61  condsAgo + "ms a
4500: 67 6f 2c 20 72 65 73 74 61 72 74 69 6e 67 20 74  go, restarting t
4510: 6f 20 67 65 74 20 61 20 6e 65 77 20 68 61 6e 64  o get a new hand
4520: 6c 65 22 29 3b 0a 09 09 63 61 63 6b 65 79 52 65  le");...cackeyRe
4530: 73 74 61 72 74 28 29 3b 0a 09 7d 0a 0a 09 63 61  start();..}...ca
4540: 63 6b 65 79 50 43 53 43 48 61 6e 64 6c 65 4c 61  ckeyPCSCHandleLa
4550: 73 74 55 73 65 64 20 3d 20 6e 6f 77 3b 0a 0a 09  stUsed = now;...
4560: 2f 2a 0a 09 20 2a 20 51 75 65 75 65 20 74 68 69  /*.. * Queue thi
4570: 73 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  s callback to be
4580: 20 63 6f 6d 70 6c 65 74 65 64 20 77 68 65 6e 20   completed when 
4590: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69  initialization i
45a0: 73 20 63 6f 6d 70 6c 65 74 65 0a 09 20 2a 2f 0a  s complete.. */.
45b0: 09 69 66 20 28 63 61 6c 6c 62 61 63 6b 41 66 74  .if (callbackAft
45c0: 65 72 49 6e 69 74 29 20 7b 0a 09 09 63 61 63 6b  erInit) {...cack
45d0: 65 79 43 61 6c 6c 62 61 63 6b 41 66 74 65 72 49  eyCallbackAfterI
45e0: 6e 69 74 2e 70 75 73 68 28 7b 22 73 75 63 63 65  nit.push({"succe
45f0: 73 73 43 61 6c 6c 62 61 63 6b 22 3a 20 63 61 6c  ssCallback": cal
4600: 6c 62 61 63 6b 41 66 74 65 72 49 6e 69 74 2c 20  lbackAfterInit, 
4610: 22 66 61 69 6c 75 72 65 43 61 6c 6c 62 61 63 6b  "failureCallback
4620: 22 3a 20 63 61 6c 6c 62 61 63 6b 49 6e 69 74 46  ": callbackInitF
4630: 61 69 6c 65 64 7d 29 3b 0a 09 7d 0a 0a 09 2f 2a  ailed});..}.../*
4640: 0a 09 20 2a 20 4e 6f 20 61 64 64 69 74 69 6f 6e  .. * No addition
4650: 61 6c 20 77 6f 72 6b 20 69 73 20 72 65 71 75 69  al work is requi
4660: 72 65 64 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 63  red.. */...if (c
4670: 61 63 6b 65 79 50 43 53 43 48 61 6e 64 6c 65 29  ackeyPCSCHandle)
4680: 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67   {...console.log
4690: 28 22 5b 63 61 63 6b 65 79 5d 20 50 43 53 43 20  ("[cackey] PCSC 
46a0: 68 61 6e 64 6c 65 20 69 73 20 61 6c 72 65 61 64  handle is alread
46b0: 79 20 76 61 6c 69 64 2c 20 6e 6f 74 68 69 6e 67  y valid, nothing
46c0: 20 74 6f 20 64 6f 2e 22 29 3b 0a 0a 09 09 69 66   to do.");....if
46d0: 20 28 63 61 63 6b 65 79 50 43 53 43 48 61 6e 64   (cackeyPCSCHand
46e0: 6c 65 55 73 61 62 6c 65 29 20 7b 0a 09 09 09 63  leUsable) {....c
46f0: 61 63 6b 65 79 49 6e 69 74 50 43 53 43 43 6f 6d  ackeyInitPCSCCom
4700: 70 6c 65 74 65 64 28 22 73 75 63 63 65 73 73 22  pleted("success"
4710: 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  );...}....return
4720: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 53 61  ;..}.../*.. * Sa
4730: 6e 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 20  nely initialize 
4740: 74 68 69 73 0a 09 20 2a 2f 0a 09 63 61 63 6b 65  this.. */..cacke
4750: 79 50 43 53 43 48 61 6e 64 6c 65 55 73 61 62 6c  yPCSCHandleUsabl
4760: 65 20 3d 20 66 61 6c 73 65 3b 0a 0a 09 2f 2a 0a  e = false;.../*.
4770: 09 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  . * Initialize t
4780: 68 65 20 43 41 43 4b 65 79 20 50 4e 61 43 6c 20  he CACKey PNaCl 
4790: 6d 6f 64 75 6c 65 20 69 66 20 6e 65 65 64 65 64  module if needed
47a0: 0a 09 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65  .. */..if (cacke
47b0: 79 48 61 6e 64 6c 65 20 3d 3d 20 6e 75 6c 6c 29  yHandle == null)
47c0: 20 7b 0a 09 09 63 61 63 6b 65 79 49 6e 69 74 28   {...cackeyInit(
47d0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 49  );..}.../*.. * I
47e0: 6e 69 74 69 61 6c 69 7a 65 20 43 41 43 4b 65 79  nitialize CACKey
47f0: 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
4800: 74 20 68 61 6e 64 6c 65 20 74 6f 20 74 61 6c 6b  t handle to talk
4810: 20 74 6f 20 74 68 65 20 47 6f 6f 67 6c 65 20 53   to the Google S
4820: 6d 61 72 74 63 61 72 64 20 4d 61 6e 61 67 65 72  martcard Manager
4830: 20 41 70 70 0a 09 20 2a 2f 0a 09 63 61 63 6b 65   App.. */..cacke
4840: 79 48 61 6e 64 6c 65 2e 70 6f 73 74 4d 65 73 73  yHandle.postMess
4850: 61 67 65 28 0a 09 09 7b 0a 09 09 09 22 74 61 72  age(...{...."tar
4860: 67 65 74 22 3a 20 22 63 61 63 6b 65 79 22 2c 0a  get": "cackey",.
4870: 09 09 09 22 63 6f 6d 6d 61 6e 64 22 3a 20 22 69  ..."command": "i
4880: 6e 69 74 22 0a 09 09 7d 0a 09 29 3b 0a 0a 09 2f  nit"...}..);.../
4890: 2a 0a 09 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65  *.. * Initialize
48a0: 20 74 68 65 20 50 43 53 43 20 4e 61 43 6c 20 69   the PCSC NaCl i
48b0: 6e 74 65 72 66 61 63 65 0a 09 20 2a 2f 0a 09 63  nterface.. */..c
48c0: 61 63 6b 65 79 50 43 53 43 48 61 6e 64 6c 65 20  ackeyPCSCHandle 
48d0: 3d 20 6e 65 77 20 47 6f 6f 67 6c 65 53 6d 61 72  = new GoogleSmar
48e0: 74 43 61 72 64 2e 50 63 73 63 4c 69 74 65 43 6c  tCard.PcscLiteCl
48f0: 69 65 6e 74 2e 4e 61 63 6c 43 6c 69 65 6e 74 42  ient.NaclClientB
4900: 61 63 6b 65 6e 64 28 0a 09 09 6e 75 6c 6c 2c 0a  ackend(...null,.
4910: 09 09 22 43 41 43 4b 65 79 22 2c 0a 09 09 22 6b  .."CACKey",..."k
4920: 68 70 66 65 61 61 6e 6a 6e 67 6d 63 6e 70 6c 62  hpfeaanjngmcnplb
4930: 64 6c 70 65 67 69 69 66 67 70 66 67 64 63 6f 22  dlpegiifgpfgdco"
4940: 2c 0a 09 09 63 61 63 6b 65 79 48 61 6e 64 6c 65  ,...cackeyHandle
4950: 0a 09 29 3b 20 0a 0a 09 63 6f 6e 73 6f 6c 65 2e  ..); ...console.
4960: 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 63 61  log("[cackey] ca
4970: 63 6b 65 79 49 6e 69 74 50 43 53 43 28 29 20 63  ckeyInitPCSC() c
4980: 6f 6d 70 6c 65 74 65 22 29 3b 0a 0a 09 72 65 74  omplete");...ret
4990: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69  urn;.}../*. * Fi
49a0: 6e 69 73 68 20 70 65 72 66 6f 72 6d 69 6e 67 20  nish performing 
49b0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
49c0: 68 61 74 20 6d 75 73 74 20 77 61 69 74 20 75 6e  hat must wait un
49d0: 74 69 6c 20 77 65 20 68 61 76 65 20 6c 6f 61 64  til we have load
49e0: 65 64 20 74 68 65 20 43 41 43 4b 65 79 20 6d 6f  ed the CACKey mo
49f0: 64 75 6c 65 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f  dule. */.functio
4a00: 6e 20 63 61 63 6b 65 79 49 6e 69 74 4c 6f 61 64  n cackeyInitLoad
4a10: 65 64 28 6d 65 73 73 61 67 65 45 76 65 6e 74 29  ed(messageEvent)
4a20: 20 7b 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28   {..console.log(
4a30: 22 5b 63 61 63 6b 65 79 5d 20 4c 6f 61 64 65 64  "[cackey] Loaded
4a40: 20 43 41 43 4b 65 79 20 50 4e 61 43 6c 20 4d 6f   CACKey PNaCl Mo
4a50: 64 75 6c 65 22 29 3b 0a 0a 09 2f 2a 20 52 65 67  dule");.../* Reg
4a60: 69 73 74 65 72 20 6c 69 73 74 65 6e 65 72 73 20  ister listeners 
4a70: 77 69 74 68 20 43 68 72 6f 6d 65 20 2a 2f 0a 09  with Chrome */..
4a80: 69 66 20 28 63 68 72 6f 6d 65 2e 63 65 72 74 69  if (chrome.certi
4a90: 66 69 63 61 74 65 50 72 6f 76 69 64 65 72 29 20  ficateProvider) 
4aa0: 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28  {...console.log(
4ab0: 22 5b 63 61 63 6b 65 79 5d 20 52 65 67 69 73 74  "[cackey] Regist
4ac0: 65 72 65 64 20 43 65 72 74 69 66 69 63 61 74 65  ered Certificate
4ad0: 20 68 61 6e 64 6c 65 72 73 20 77 69 74 68 20 43   handlers with C
4ae0: 68 72 6f 6d 65 22 29 3b 0a 0a 09 09 63 68 72 6f  hrome");....chro
4af0: 6d 65 2e 63 65 72 74 69 66 69 63 61 74 65 50 72  me.certificatePr
4b00: 6f 76 69 64 65 72 2e 6f 6e 43 65 72 74 69 66 69  ovider.onCertifi
4b10: 63 61 74 65 73 52 65 71 75 65 73 74 65 64 2e 61  catesRequested.a
4b20: 64 64 4c 69 73 74 65 6e 65 72 28 63 61 63 6b 65  ddListener(cacke
4b30: 79 4c 69 73 74 43 65 72 74 69 66 69 63 61 74 65  yListCertificate
4b40: 73 29 3b 0a 09 09 63 68 72 6f 6d 65 2e 63 65 72  s);...chrome.cer
4b50: 74 69 66 69 63 61 74 65 50 72 6f 76 69 64 65 72  tificateProvider
4b60: 2e 6f 6e 53 69 67 6e 44 69 67 65 73 74 52 65 71  .onSignDigestReq
4b70: 75 65 73 74 65 64 2e 61 64 64 4c 69 73 74 65 6e  uested.addListen
4b80: 65 72 28 63 61 63 6b 65 79 53 69 67 6e 4d 65 73  er(cackeySignMes
4b90: 73 61 67 65 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  sage);..}...retu
4ba0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 49 6e 69  rn;.}../*. * Ini
4bb0: 74 69 61 6c 69 7a 65 20 43 41 43 4b 65 79 20 61  tialize CACKey a
4bc0: 6e 64 20 74 68 65 20 50 43 53 43 20 6c 69 62 72  nd the PCSC libr
4bd0: 61 72 79 20 66 72 6f 6d 20 47 6f 6f 67 6c 65 0a  ary from Google.
4be0: 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63   */.function cac
4bf0: 6b 65 79 49 6e 69 74 28 29 20 7b 0a 09 76 61 72  keyInit() {..var
4c00: 20 65 6c 65 6d 65 6e 74 45 6d 62 65 64 3b 0a 09   elementEmbed;..
4c10: 76 61 72 20 66 6f 72 63 65 4c 6f 61 64 45 6c 65  var forceLoadEle
4c20: 6d 65 6e 74 3b 0a 0a 09 2f 2a 20 4c 6f 67 20 74  ment;.../* Log t
4c30: 68 61 74 20 77 65 20 61 72 65 20 6f 70 65 72 61  hat we are opera
4c40: 74 69 6f 6e 61 6c 20 2a 2f 0a 09 63 6f 6e 73 6f  tional */..conso
4c50: 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d  le.log("[cackey]
4c60: 20 63 61 63 6b 65 79 49 6e 69 74 28 29 3a 20 43   cackeyInit(): C
4c70: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 0a 09  alled.");.../*..
4c80: 20 2a 20 44 6f 20 6e 6f 74 20 69 6e 69 74 69 61   * Do not initia
4c90: 6c 69 7a 65 20 6d 75 6c 74 69 70 6c 65 20 74 69  lize multiple ti
4ca0: 6d 65 73 0a 09 20 2a 2f 0a 09 69 66 20 28 63 61  mes.. */..if (ca
4cb0: 63 6b 65 79 48 61 6e 64 6c 65 20 21 3d 20 6e 75  ckeyHandle != nu
4cc0: 6c 6c 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e  ll) {...console.
4cd0: 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 63 61  log("[cackey] ca
4ce0: 63 6b 65 79 49 6e 69 74 28 29 3a 20 41 6c 72 65  ckeyInit(): Alre
4cf0: 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  ady initialized.
4d00: 20 20 52 65 74 75 72 6e 69 6e 67 2e 22 29 3b 0a    Returning.");.
4d10: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
4d20: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 77  /* Verify that w
4d30: 65 20 63 61 6e 20 72 65 67 69 73 74 65 72 20 63  e can register c
4d40: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 69 66 20  allbacks */..if 
4d50: 28 21 63 68 72 6f 6d 65 2e 63 65 72 74 69 66 69  (!chrome.certifi
4d60: 63 61 74 65 50 72 6f 76 69 64 65 72 29 20 7b 0a  cateProvider) {.
4d70: 09 09 69 66 20 28 21 67 6f 6f 67 2e 44 45 42 55  ..if (!goog.DEBU
4d80: 47 29 20 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e  G) {....console.
4d90: 69 6e 66 6f 28 22 5b 63 61 63 6b 65 79 5d 20 54  info("[cackey] T
4da0: 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 27 73 20  his extension's 
4db0: 70 72 69 6d 61 72 79 20 66 75 6e 63 74 69 6f 6e  primary function
4dc0: 61 6c 69 74 79 20 6f 6e 6c 79 20 77 6f 72 6b 73  ality only works
4dd0: 20 6f 6e 20 43 68 72 6f 6d 65 4f 53 21 20 20 59   on ChromeOS!  Y
4de0: 6f 75 20 77 6f 6e 27 74 20 62 65 20 61 62 6c 65  ou won't be able
4df0: 20 74 6f 20 64 6f 20 6d 75 63 68 20 77 69 74 68   to do much with
4e00: 20 69 74 2e 22 29 3b 0a 09 09 7d 0a 09 7d 0a 0a   it.");...}..}..
4e10: 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64 20 3d 20  .elementEmbed = 
4e20: 64 6f 63 75 6d 65 6e 74 2e 63 72 65 61 74 65 45  document.createE
4e30: 6c 65 6d 65 6e 74 28 27 65 6d 62 65 64 27 29 3b  lement('embed');
4e40: 0a 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64 2e 74  ..elementEmbed.t
4e50: 79 70 65 20 3d 20 22 61 70 70 6c 69 63 61 74 69  ype = "applicati
4e60: 6f 6e 2f 78 2d 70 6e 61 63 6c 22 3b 0a 09 65 6c  on/x-pnacl";..el
4e70: 65 6d 65 6e 74 45 6d 62 65 64 2e 77 69 64 74 68  ementEmbed.width
4e80: 20 3d 20 30 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d   = 0;..elementEm
4e90: 62 65 64 2e 68 65 69 67 68 74 20 3d 20 30 3b 0a  bed.height = 0;.
4ea0: 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64 2e 73 72  .elementEmbed.sr
4eb0: 63 20 3d 20 22 63 61 63 6b 65 79 2e 6e 6d 66 22  c = "cackey.nmf"
4ec0: 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64 2e  ;..elementEmbed.
4ed0: 69 64 20 3d 20 22 63 61 63 6b 65 79 4d 6f 64 75  id = "cackeyModu
4ee0: 6c 65 22 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d 62  le";..elementEmb
4ef0: 65 64 2e 61 64 64 45 76 65 6e 74 4c 69 73 74 65  ed.addEventListe
4f00: 6e 65 72 28 27 65 72 72 6f 72 27 2c 20 66 75 6e  ner('error', fun
4f10: 63 74 69 6f 6e 28 6d 65 73 73 61 67 65 45 76 65  ction(messageEve
4f20: 6e 74 29 20 7b 20 63 6f 6e 73 6f 6c 65 2e 65 72  nt) { console.er
4f30: 72 6f 72 28 22 45 72 72 6f 72 20 6c 6f 61 64 69  ror("Error loadi
4f40: 6e 67 20 43 41 43 4b 65 79 20 50 4e 61 43 6c 20  ng CACKey PNaCl 
4f50: 4d 6f 64 75 6c 65 3a 20 22 20 2b 20 6d 65 73 73  Module: " + mess
4f60: 61 67 65 45 76 65 6e 74 2e 64 61 74 61 29 3b 20  ageEvent.data); 
4f70: 7d 2c 20 74 72 75 65 29 3b 0a 09 65 6c 65 6d 65  }, true);..eleme
4f80: 6e 74 45 6d 62 65 64 2e 61 64 64 45 76 65 6e 74  ntEmbed.addEvent
4f90: 4c 69 73 74 65 6e 65 72 28 27 6c 6f 61 64 27 2c  Listener('load',
4fa0: 20 63 61 63 6b 65 79 49 6e 69 74 4c 6f 61 64 65   cackeyInitLoade
4fb0: 64 2c 20 74 72 75 65 29 3b 0a 09 65 6c 65 6d 65  d, true);..eleme
4fc0: 6e 74 45 6d 62 65 64 2e 61 64 64 45 76 65 6e 74  ntEmbed.addEvent
4fd0: 4c 69 73 74 65 6e 65 72 28 27 63 72 61 73 68 27  Listener('crash'
4fe0: 2c 20 63 61 63 6b 65 79 43 72 61 73 68 2c 20 74  , cackeyCrash, t
4ff0: 72 75 65 29 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d  rue);..elementEm
5000: 62 65 64 2e 61 64 64 45 76 65 6e 74 4c 69 73 74  bed.addEventList
5010: 65 6e 65 72 28 27 6d 65 73 73 61 67 65 27 2c 20  ener('message', 
5020: 63 61 63 6b 65 79 4d 65 73 73 61 67 65 49 6e 63  cackeyMessageInc
5030: 6f 6d 69 6e 67 2c 20 74 72 75 65 29 3b 0a 0a 09  oming, true);...
5040: 63 61 63 6b 65 79 48 61 6e 64 6c 65 20 3d 20 65  cackeyHandle = e
5050: 6c 65 6d 65 6e 74 45 6d 62 65 64 3b 0a 0a 09 64  lementEmbed;...d
5060: 6f 63 75 6d 65 6e 74 2e 62 6f 64 79 2e 61 70 70  ocument.body.app
5070: 65 6e 64 43 68 69 6c 64 28 63 61 63 6b 65 79 48  endChild(cackeyH
5080: 61 6e 64 6c 65 29 0a 0a 09 2f 2a 0a 09 20 2a 20  andle).../*.. * 
5090: 46 6f 72 63 65 20 74 68 65 20 62 72 6f 77 73 65  Force the browse
50a0: 72 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 6c  r to load the el
50b0: 65 6d 65 6e 74 0a 09 20 2a 20 62 79 20 72 65 71  ement.. * by req
50c0: 75 65 73 74 69 6e 67 20 69 74 73 20 70 6f 73 69  uesting its posi
50d0: 74 69 6f 6e 0a 09 20 2a 2f 0a 09 66 6f 72 63 65  tion.. */..force
50e0: 4c 6f 61 64 45 6c 65 6d 65 6e 74 20 3d 20 63 61  LoadElement = ca
50f0: 63 6b 65 79 48 61 6e 64 6c 65 2e 6f 66 66 73 65  ckeyHandle.offse
5100: 74 54 6f 70 3b 0a 0a 09 63 6f 6e 73 6f 6c 65 2e  tTop;...console.
5110: 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 63 61  log("[cackey] ca
5120: 63 6b 65 79 49 6e 69 74 28 29 3a 20 43 6f 6d 70  ckeyInit(): Comp
5130: 6c 65 74 65 64 2e 20 20 52 65 74 75 72 6e 69 6e  leted.  Returnin
5140: 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  g.");...return;.
5150: 7d 0a 0a 2f 2a 0a 20 2a 20 49 6e 69 74 69 61 6c  }../*. * Initial
5160: 69 7a 65 20 74 68 65 20 43 41 43 4b 65 79 20 43  ize the CACKey C
5170: 68 72 6f 6d 65 20 41 70 70 6c 69 63 61 74 69 6f  hrome Applicatio
5180: 6e 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63  n. */.function c
5190: 61 63 6b 65 79 41 70 70 49 6e 69 74 28 29 20 7b  ackeyAppInit() {
51a0: 0a 09 76 61 72 20 6f 6c 64 4f 6e 50 6f 72 74 44  ..var oldOnPortD
51b0: 69 73 63 6f 6e 6e 65 63 74 65 64 46 75 6e 63 74  isconnectedFunct
51c0: 69 6f 6e 3b 0a 09 76 61 72 20 6f 6c 64 50 43 53  ion;..var oldPCS
51d0: 43 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 43  CInitializationC
51e0: 61 6c 6c 62 61 63 6b 3b 0a 0a 09 2f 2a 0a 09 20  allback;.../*.. 
51f0: 2a 20 43 72 65 61 74 65 20 61 20 68 61 6e 64 6c  * Create a handl
5200: 65 72 20 66 6f 72 20 73 74 61 72 74 69 6e 67 20  er for starting 
5210: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
5220: 55 49 0a 09 20 2a 2f 0a 09 63 68 72 6f 6d 65 2e  UI.. */..chrome.
5230: 61 70 70 2e 72 75 6e 74 69 6d 65 2e 6f 6e 4c 61  app.runtime.onLa
5240: 75 6e 63 68 65 64 2e 61 64 64 4c 69 73 74 65 6e  unched.addListen
5250: 65 72 28 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  er(function() {.
5260: 09 09 63 68 72 6f 6d 65 2e 61 70 70 2e 77 69 6e  ..chrome.app.win
5270: 64 6f 77 2e 63 72 65 61 74 65 28 27 75 69 2e 68  dow.create('ui.h
5280: 74 6d 6c 27 2c 20 7b 0a 09 09 09 22 69 64 22 3a  tml', {...."id":
5290: 20 22 63 61 63 6b 65 79 55 49 22 2c 0a 09 09 09   "cackeyUI",....
52a0: 22 66 6f 63 75 73 65 64 22 3a 20 74 72 75 65 2c  "focused": true,
52b0: 0a 09 09 09 22 69 6e 6e 65 72 42 6f 75 6e 64 73  ...."innerBounds
52c0: 22 3a 20 7b 0a 09 09 09 09 22 77 69 64 74 68 22  ": {....."width"
52d0: 3a 20 33 35 30 2c 0a 09 09 09 09 22 6d 69 6e 57  : 350,....."minW
52e0: 69 64 74 68 22 3a 20 33 35 30 2c 0a 09 09 09 09  idth": 350,.....
52f0: 22 68 65 69 67 68 74 22 3a 20 31 33 36 2c 0a 09  "height": 136,..
5300: 09 09 09 22 6d 69 6e 48 65 69 67 68 74 22 3a 20  ..."minHeight": 
5310: 31 33 35 0a 09 09 09 7d 0a 09 09 7d 2c 20 66 75  135....}...}, fu
5320: 6e 63 74 69 6f 6e 28 75 69 57 69 6e 64 6f 77 29  nction(uiWindow)
5330: 20 7b 0a 09 09 09 69 66 20 28 21 75 69 57 69 6e   {....if (!uiWin
5340: 64 6f 77 29 20 7b 0a 09 09 09 09 72 65 74 75 72  dow) {.....retur
5350: 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 75 69 57 69  n;....}.....uiWi
5360: 6e 64 6f 77 2e 63 6f 6e 74 65 6e 74 57 69 6e 64  ndow.contentWind
5370: 6f 77 2e 70 61 72 65 6e 74 57 69 6e 64 6f 77 20  ow.parentWindow 
5380: 3d 20 77 69 6e 64 6f 77 3b 0a 09 09 7d 29 3b 0a  = window;...});.
5390: 09 7d 29 3b 0a 0a 2f 2f 20 47 6f 6f 67 6c 65 20  .});..// Google 
53a0: 67 6f 74 20 72 69 64 20 6f 66 20 61 6c 6c 20 6f  got rid of all o
53b0: 66 20 74 68 65 20 63 6f 64 65 20 77 65 20 77 65  f the code we we
53c0: 72 65 20 75 73 69 6e 67 20 74 6f 20 69 6e 74 65  re using to inte
53d0: 72 66 61 63 65 20 77 69 74 68 20 50 43 53 43 2e  rface with PCSC.
53e0: 2e 2e 20 0a 2f 2f 20 54 68 69 73 20 6e 65 65 64  .. .// This need
53f0: 73 20 74 6f 20 62 65 20 72 65 77 72 69 74 74 65  s to be rewritte
5400: 6e 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77  n to use the new
5410: 20 69 6e 74 65 72 66 61 63 65 0a 2f 2f 0a 2f 2f   interface.//.//
5420: 09 2f 2a 0a 2f 2f 09 20 2a 20 52 65 67 69 73 74  ./*.//. * Regist
5430: 65 72 20 61 20 68 61 6e 64 6c 65 72 20 66 6f 72  er a handler for
5440: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68   dealing with th
5450: 65 20 50 43 53 43 20 70 6f 72 74 20 62 65 69 6e  e PCSC port bein
5460: 67 20 64 69 73 63 6f 6e 6e 65 63 74 65 64 0a 2f  g disconnected./
5470: 2f 09 20 2a 2f 0a 2f 2f 09 6f 6c 64 4f 6e 50 6f  /. */.//.oldOnPo
5480: 72 74 44 69 73 63 6f 6e 6e 65 63 74 65 64 46 75  rtDisconnectedFu
5490: 6e 63 74 69 6f 6e 20 3d 20 47 6f 6f 67 6c 65 53  nction = GoogleS
54a0: 6d 61 72 74 43 61 72 64 2e 50 63 73 63 2e 70 72  martCard.Pcsc.pr
54b0: 6f 74 6f 74 79 70 65 2e 6f 6e 50 6f 72 74 44 69  ototype.onPortDi
54c0: 73 63 6f 6e 6e 65 63 74 65 64 5f 3b 0a 2f 2f 09  sconnected_;.//.
54d0: 47 6f 6f 67 6c 65 53 6d 61 72 74 43 61 72 64 2e  GoogleSmartCard.
54e0: 50 63 73 63 2e 70 72 6f 74 6f 74 79 70 65 2e 6f  Pcsc.prototype.o
54f0: 6e 50 6f 72 74 44 69 73 63 6f 6e 6e 65 63 74 65  nPortDisconnecte
5500: 64 5f 20 3d 20 66 75 6e 63 74 69 6f 6e 28 29 20  d_ = function() 
5510: 7b 0a 2f 2f 09 09 6f 6c 64 4f 6e 50 6f 72 74 44  {.//..oldOnPortD
5520: 69 73 63 6f 6e 6e 65 63 74 65 64 46 75 6e 63 74  isconnectedFunct
5530: 69 6f 6e 2e 61 70 70 6c 79 28 74 68 69 73 29 3b  ion.apply(this);
5540: 0a 2f 2f 0a 2f 2f 09 09 63 61 63 6b 65 79 49 6e  .//.//..cackeyIn
5550: 69 74 50 43 53 43 43 6f 6d 70 6c 65 74 65 64 28  itPCSCCompleted(
5560: 22 66 61 69 6c 75 72 65 22 29 3b 0a 2f 2f 0a 2f  "failure");.//./
5570: 2f 09 09 63 61 63 6b 65 79 52 65 73 74 61 72 74  /..cackeyRestart
5580: 28 29 3b 0a 2f 2f 0a 2f 2f 09 09 72 65 74 75 72  ();.//.//..retur
5590: 6e 3b 0a 2f 2f 09 7d 3b 0a 2f 2f 0a 2f 2f 09 2f  n;.//.};.//.//./
55a0: 2a 0a 2f 2f 09 20 2a 20 52 65 67 69 73 74 65 72  *.//. * Register
55b0: 20 61 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 64   a handler for d
55c0: 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20  ealing with the 
55d0: 50 43 53 43 20 70 6f 72 74 20 62 65 69 6e 67 20  PCSC port being 
55e0: 61 76 61 69 6c 61 62 6c 65 0a 2f 2f 09 20 2a 2f  available.//. */
55f0: 0a 2f 2f 09 6f 6c 64 50 43 53 43 49 6e 69 74 69  .//.oldPCSCIniti
5600: 61 6c 69 7a 61 74 69 6f 6e 43 61 6c 6c 62 61 63  alizationCallbac
5610: 6b 20 3d 20 47 6f 6f 67 6c 65 53 6d 61 72 74 43  k = GoogleSmartC
5620: 61 72 64 2e 50 63 73 63 4e 61 63 6c 2e 70 72 6f  ard.PcscNacl.pro
5630: 74 6f 74 79 70 65 2e 70 63 73 63 49 6e 69 74 69  totype.pcscIniti
5640: 61 6c 69 7a 61 74 69 6f 6e 43 61 6c 6c 62 61 63  alizationCallbac
5650: 6b 5f 3b 0a 2f 2f 09 47 6f 6f 67 6c 65 53 6d 61  k_;.//.GoogleSma
5660: 72 74 43 61 72 64 2e 50 63 73 63 4e 61 63 6c 2e  rtCard.PcscNacl.
5670: 70 72 6f 74 6f 74 79 70 65 2e 70 63 73 63 49 6e  prototype.pcscIn
5680: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 43 61 6c 6c  itializationCall
5690: 62 61 63 6b 5f 20 3d 20 66 75 6e 63 74 69 6f 6e  back_ = function
56a0: 28 72 65 71 75 65 73 74 49 64 2c 20 69 6e 73 74  (requestId, inst
56b0: 61 6e 63 65 49 64 2c 20 69 6e 73 74 61 6e 63 65  anceId, instance
56c0: 2c 20 65 72 72 6f 72 29 20 7b 0a 2f 2f 09 09 6f  , error) {.//..o
56d0: 6c 64 50 43 53 43 49 6e 69 74 69 61 6c 69 7a 61  ldPCSCInitializa
56e0: 74 69 6f 6e 43 61 6c 6c 62 61 63 6b 2e 61 70 70  tionCallback.app
56f0: 6c 79 28 74 68 69 73 2c 20 5b 72 65 71 75 65 73  ly(this, [reques
5700: 74 49 64 2c 20 69 6e 73 74 61 6e 63 65 49 64 2c  tId, instanceId,
5710: 20 69 6e 73 74 61 6e 63 65 2c 20 65 72 72 6f 72   instance, error
5720: 5d 29 3b 0a 2f 2f 0a 2f 2f 09 09 72 65 74 75 72  ]);.//.//..retur
5730: 6e 3b 0a 2f 2f 09 7d 3b 0a 2f 2f 0a 09 2f 2a 0a  n;.//.};.//../*.
5740: 09 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 67  . * Initialize g
5750: 6c 6f 62 61 6c 20 73 74 61 74 65 0a 09 20 2a 2f  lobal state.. */
5760: 0a 09 63 61 63 6b 65 79 49 6e 69 74 47 6c 6f 62  ..cackeyInitGlob
5770: 61 6c 53 74 61 74 65 28 29 3b 0a 0a 09 72 65 74  alState();...ret
5780: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69  urn;.}../* Initi
5790: 61 6c 69 7a 65 20 43 41 43 4b 65 79 20 2a 2f 0a  alize CACKey */.
57a0: 63 61 63 6b 65 79 41 70 70 49 6e 69 74 28 29 3b  cackeyAppInit();
57b0: 0a 63 61 63 6b 65 79 49 6e 69 74 28 29 3b 0a     .cackeyInit();.