Hex Artifact Content

Artifact 42af92888f72a047ff992f46e078056018611749:


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 48 61 6e 64 6c 65 20 66  ../*. * Handle f
0120: 6f 72 20 74 68 65 20 43 41 43 4b 65 79 20 4e 61  or the CACKey Na
0130: 43 6c 20 54 61 72 67 65 74 0a 20 2a 2f 0a 76 61  Cl Target. */.va
0140: 72 20 63 61 63 6b 65 79 48 61 6e 64 6c 65 20 3d  r cackeyHandle =
0150: 20 6e 75 6c 6c 3b 0a 76 61 72 20 63 61 63 6b 65   null;.var cacke
0160: 79 50 43 53 43 48 61 6e 64 6c 65 20 3d 20 6e 75  yPCSCHandle = nu
0170: 6c 6c 3b 0a 76 61 72 20 63 61 63 6b 65 79 50 43  ll;.var cackeyPC
0180: 53 43 48 61 6e 64 6c 65 55 73 61 62 6c 65 20 3d  SCHandleUsable =
0190: 20 66 61 6c 73 65 3b 0a 0a 2f 2a 0a 20 2a 20 48   false;../*. * H
01a0: 61 6e 64 6c 65 20 61 6e 64 20 49 44 20 66 6f 72  andle and ID for
01b0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 61 6c   outstanding cal
01c0: 6c 62 61 63 6b 73 0a 20 2a 2f 0a 76 61 72 20 63  lbacks. */.var c
01d0: 61 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67  ackeyOutstanding
01e0: 43 61 6c 6c 62 61 63 6b 73 20 3d 20 7b 7d 0a 76  Callbacks = {}.v
01f0: 61 72 20 63 61 63 6b 65 79 4f 75 74 73 74 61 6e  ar cackeyOutstan
0200: 64 69 6e 67 43 61 6c 6c 62 61 63 6b 43 6f 75 6e  dingCallbackCoun
0210: 74 65 72 20 3d 20 2d 31 3b 0a 0a 2f 2a 0a 20 2a  ter = -1;../*. *
0220: 20 43 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 20 77   Communication w
0230: 69 74 68 20 74 68 65 20 50 49 4e 20 65 6e 74 72  ith the PIN entr
0240: 79 20 77 69 6e 64 6f 77 0a 20 2a 2f 0a 76 61 72  y window. */.var
0250: 20 70 69 6e 57 69 6e 64 6f 77 50 49 4e 56 61 6c   pinWindowPINVal
0260: 75 65 20 3d 20 22 22 3b 0a 76 61 72 20 70 69 6e  ue = "";.var pin
0270: 57 69 6e 64 6f 77 50 72 65 76 69 6f 75 73 48 61  WindowPreviousHa
0280: 6e 64 6c 65 20 3d 20 6e 75 6c 6c 3b 0a 0a 2f 2a  ndle = null;../*
0290: 0a 20 2a 20 4d 65 73 73 61 67 65 73 20 74 68 61  . * Messages tha
02a0: 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
02b0: 20 72 65 74 72 69 65 64 20 61 66 74 65 72 20 67   retried after g
02c0: 65 74 74 69 6e 67 20 61 20 50 49 4e 0a 20 2a 2f  etting a PIN. */
02d0: 0a 76 61 72 20 63 61 63 6b 65 79 4d 65 73 73 61  .var cackeyMessa
02e0: 67 65 73 54 6f 52 65 74 72 79 20 3d 20 5b 5d 3b  gesToRetry = [];
02f0: 0a 0a 2f 2a 0a 20 2a 20 53 74 6f 72 65 64 20 50  ../*. * Stored P
0300: 49 4e 20 66 6f 72 20 61 20 67 69 76 65 6e 20 63  IN for a given c
0310: 65 72 74 69 66 69 63 61 74 65 0a 20 2a 2f 0a 76  ertificate. */.v
0320: 61 72 20 63 61 63 6b 65 79 43 65 72 74 69 66 69  ar cackeyCertifi
0330: 63 61 74 65 54 6f 50 49 4e 4d 61 70 20 3d 20 7b  cateToPINMap = {
0340: 7d 3b 0a 0a 2f 2a 0a 20 2a 20 43 61 6c 6c 62 61  };../*. * Callba
0350: 63 6b 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 61  cks to perform a
0360: 66 74 65 72 20 50 43 53 43 20 63 6f 6d 65 73 20  fter PCSC comes 
0370: 6f 6e 6c 69 6e 65 0a 20 2a 2f 0a 63 61 63 6b 65  online. */.cacke
0380: 79 43 61 6c 6c 62 61 63 6b 41 66 74 65 72 49 6e  yCallbackAfterIn
0390: 69 74 20 3d 20 5b 5d 3b 0a 0a 2f 2a 0a 20 2a 20  it = [];../*. * 
03a0: 43 6f 6d 70 75 74 65 20 61 20 74 65 78 74 2d 62  Compute a text-b
03b0: 61 73 65 64 20 68 61 6e 64 6c 65 20 66 6f 72 20  ased handle for 
03c0: 61 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f  a certificate to
03d0: 20 62 65 20 68 61 73 68 65 64 20 62 79 0a 20 2a   be hashed by. *
03e0: 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65  /.function cacke
03f0: 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49  yCertificateToPI
0400: 4e 49 44 28 63 65 72 74 69 66 69 63 61 74 65 29  NID(certificate)
0410: 20 7b 0a 09 76 61 72 20 69 64 3b 0a 09 76 61 72   {..var id;..var
0420: 20 63 65 72 74 69 66 69 63 61 74 65 41 72 72 61   certificateArra
0430: 79 3b 0a 0a 09 69 64 20 3d 20 22 22 3b 0a 0a 09  y;...id = "";...
0440: 63 65 72 74 69 66 69 63 61 74 65 41 72 72 61 79  certificateArray
0450: 20 3d 20 6e 65 77 20 55 69 6e 74 38 41 72 72 61   = new Uint8Arra
0460: 79 28 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a  y(certificate);.
0470: 0a 09 63 65 72 74 69 66 69 63 61 74 65 41 72 72  ..certificateArr
0480: 61 79 2e 6d 61 70 28 0a 09 09 66 75 6e 63 74 69  ay.map(...functi
0490: 6f 6e 28 62 79 74 65 29 20 7b 0a 09 09 09 69 64  on(byte) {....id
04a0: 20 2b 3d 20 28 22 30 22 20 2b 20 62 79 74 65 2e   += ("0" + byte.
04b0: 74 6f 53 74 72 69 6e 67 28 31 36 29 29 2e 73 6c  toString(16)).sl
04c0: 69 63 65 28 2d 32 29 3b 0a 09 09 7d 0a 09 29 3b  ice(-2);...}..);
04d0: 0a 0a 09 64 65 6c 65 74 65 20 63 65 72 74 69 66  ...delete certif
04e0: 69 63 61 74 65 41 72 72 61 79 3b 0a 0a 09 72 65  icateArray;...re
04f0: 74 75 72 6e 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a  turn(id);.}../*.
0500: 20 2a 20 48 61 6e 64 6c 65 20 61 20 72 65 73 70   * Handle a resp
0510: 6f 6e 73 65 20 66 72 6f 6d 20 74 68 65 20 4e 61  onse from the Na
0520: 43 6c 20 73 69 64 65 20 72 65 67 61 72 64 69 6e  Cl side regardin
0530: 67 20 63 65 72 74 69 66 69 63 61 74 65 73 20 61  g certificates a
0540: 76 61 69 6c 61 62 6c 65 0a 20 2a 2f 0a 66 75 6e  vailable. */.fun
0550: 63 74 69 6f 6e 20 63 61 63 6b 65 79 4d 65 73 73  ction cackeyMess
0560: 61 67 65 49 6e 63 6f 6d 69 6e 67 4c 69 73 74 43  ageIncomingListC
0570: 65 72 74 69 66 69 63 61 74 65 73 28 6d 65 73 73  ertificates(mess
0580: 61 67 65 2c 20 63 68 72 6f 6d 65 43 61 6c 6c 62  age, chromeCallb
0590: 61 63 6b 29 20 7b 0a 09 76 61 72 20 69 64 78 3b  ack) {..var idx;
05a0: 0a 09 76 61 72 20 63 65 72 74 69 66 69 63 61 74  ..var certificat
05b0: 65 73 20 3d 20 5b 5d 3b 0a 0a 09 66 6f 72 20 28  es = [];...for (
05c0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 6d  idx = 0; idx < m
05d0: 65 73 73 61 67 65 2e 63 65 72 74 69 66 69 63 61  essage.certifica
05e0: 74 65 73 2e 6c 65 6e 67 74 68 3b 20 69 64 78 2b  tes.length; idx+
05f0: 2b 29 20 7b 0a 09 09 63 65 72 74 69 66 69 63 61  +) {...certifica
0600: 74 65 73 2e 70 75 73 68 28 0a 09 09 09 7b 0a 09  tes.push(....{..
0610: 09 09 09 63 65 72 74 69 66 69 63 61 74 65 3a 20  ...certificate: 
0620: 6d 65 73 73 61 67 65 2e 63 65 72 74 69 66 69 63  message.certific
0630: 61 74 65 73 5b 69 64 78 5d 2c 0a 09 09 09 09 73  ates[idx],.....s
0640: 75 70 70 6f 72 74 65 64 48 61 73 68 65 73 3a 20  upportedHashes: 
0650: 5b 27 53 48 41 31 27 2c 20 27 53 48 41 32 35 36  ['SHA1', 'SHA256
0660: 27 2c 20 27 4d 44 35 5f 53 48 41 31 27 5d 0a 09  ', 'MD5_SHA1']..
0670: 09 09 7d 0a 09 09 29 3b 0a 09 7d 0a 0a 09 63 68  ..}...);..}...ch
0680: 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 28 63 65 72  romeCallback(cer
0690: 74 69 66 69 63 61 74 65 73 2c 0a 09 09 66 75 6e  tificates,...fun
06a0: 63 74 69 6f 6e 28 72 65 6a 65 63 74 65 64 43 65  ction(rejectedCe
06b0: 72 74 73 29 20 7b 0a 09 09 09 69 66 20 28 63 68  rts) {....if (ch
06c0: 72 6f 6d 65 2e 72 75 6e 74 69 6d 65 2e 6c 61 73  rome.runtime.las
06d0: 74 45 72 72 6f 72 29 20 7b 0a 09 09 09 09 72 65  tError) {.....re
06e0: 74 75 72 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  turn;....}.....i
06f0: 66 20 28 72 65 6a 65 63 74 65 64 43 65 72 74 73  f (rejectedCerts
0700: 2e 6c 65 6e 67 74 68 20 21 3d 3d 20 30 29 20 7b  .length !== 0) {
0710: 0a 09 09 09 09 6f 6e 43 65 72 74 69 66 69 63 61  .....onCertifica
0720: 74 65 73 52 65 6a 65 63 74 65 64 28 72 65 6a 65  tesRejected(reje
0730: 63 74 65 64 43 65 72 74 73 29 3b 0a 09 09 09 7d  ctedCerts);....}
0740: 0a 0a 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 7d  .....return;...}
0750: 0a 09 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ..);...return;.}
0760: 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65 20 61  ../*. * Handle a
0770: 20 72 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 74   response from t
0780: 68 65 20 4e 61 43 6c 20 73 69 64 65 20 72 65 67  he NaCl side reg
0790: 61 72 64 69 6e 67 20 73 69 67 6e 69 6e 67 20 61  arding signing a
07a0: 20 6d 65 73 73 61 67 65 0a 20 2a 2f 0a 66 75 6e   message. */.fun
07b0: 63 74 69 6f 6e 20 63 61 63 6b 65 79 4d 65 73 73  ction cackeyMess
07c0: 61 67 65 49 6e 63 6f 6d 69 6e 67 53 69 67 6e 4d  ageIncomingSignM
07d0: 65 73 73 61 67 65 28 6d 65 73 73 61 67 65 2c 20  essage(message, 
07e0: 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 20  chromeCallback) 
07f0: 7b 0a 09 76 61 72 20 70 61 79 6c 6f 61 64 3b 0a  {..var payload;.
0800: 0a 09 70 61 79 6c 6f 61 64 20 3d 20 6d 65 73 73  ..payload = mess
0810: 61 67 65 2e 73 69 67 6e 65 64 44 61 74 61 3b 0a  age.signedData;.
0820: 0a 09 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b  ..chromeCallback
0830: 28 70 61 79 6c 6f 61 64 29 3b 0a 0a 09 72 65 74  (payload);...ret
0840: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48 61  urn;.}../*. * Ha
0850: 6e 64 6c 65 20 61 6e 20 69 6e 63 6f 6d 69 6e 67  ndle an incoming
0860: 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
0870: 65 20 4e 61 43 6c 20 73 69 64 65 20 61 6e 64 20  e NaCl side and 
0880: 70 61 73 73 20 69 74 20 6f 66 66 20 74 6f 0a 20  pass it off to. 
0890: 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 68 61 6e  * one of the han
08a0: 64 6c 65 72 73 20 61 62 6f 76 65 20 66 6f 72 20  dlers above for 
08b0: 61 63 74 75 61 6c 20 66 6f 72 6d 61 74 74 69 6e  actual formattin
08c0: 67 20 61 6e 64 20 70 61 73 73 69 6e 67 20 74 6f  g and passing to
08d0: 0a 20 2a 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  . * the callback
08e0: 0a 20 2a 0a 20 2a 20 49 66 20 61 6e 20 65 72 72  . *. * If an err
08f0: 6f 72 20 6f 63 63 75 72 65 64 2c 20 69 6e 76 6f  or occured, invo
0900: 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
0910: 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
0920: 73 2e 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20  s.. */.function 
0930: 63 61 63 6b 65 79 4d 65 73 73 61 67 65 49 6e 63  cackeyMessageInc
0940: 6f 6d 69 6e 67 28 6d 65 73 73 61 67 65 45 76 65  oming(messageEve
0950: 6e 74 29 20 7b 0a 09 76 61 72 20 6e 65 78 74 46  nt) {..var nextF
0960: 75 6e 63 74 69 6f 6e 20 3d 20 6e 75 6c 6c 3b 0a  unction = null;.
0970: 09 76 61 72 20 63 68 72 6f 6d 65 43 61 6c 6c 62  .var chromeCallb
0980: 61 63 6b 20 3d 20 6e 75 6c 6c 3b 0a 0a 09 69 66  ack = null;...if
0990: 20 28 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64   (messageEvent.d
09a0: 61 74 61 2e 74 61 72 67 65 74 20 21 3d 20 22 63  ata.target != "c
09b0: 61 63 6b 65 79 22 29 20 7b 0a 09 09 72 65 74 75  ackey") {...retu
09c0: 72 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 47 6f 6f  rn;..}...if (Goo
09d0: 67 6c 65 53 6d 61 72 74 43 61 72 64 2e 49 53 5f  gleSmartCard.IS_
09e0: 44 45 42 55 47 5f 42 55 49 4c 44 29 20 7b 0a 09  DEBUG_BUILD) {..
09f0: 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 53 54  .console.log("ST
0a00: 41 52 54 20 4d 45 53 53 41 47 45 22 29 3b 0a 09  ART MESSAGE");..
0a10: 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 6d 65 73  .console.log(mes
0a20: 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 29 3b  sageEvent.data);
0a30: 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22  ...console.log("
0a40: 45 4e 44 20 4d 45 53 53 41 47 45 22 29 3b 0a 09  END MESSAGE");..
0a50: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 77 65  }.../*.. * If we
0a60: 20 66 61 69 6c 65 64 20 66 6f 72 20 73 6f 6d 65   failed for some
0a70: 20 72 65 61 73 6f 6e 20 61 6e 64 20 77 65 20 68   reason and we h
0a80: 61 76 65 20 61 20 63 65 72 74 69 66 69 63 61 74  ave a certificat
0a90: 65 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  e in the origina
0aa0: 6c 0a 09 20 2a 20 72 65 71 75 65 73 74 20 74 68  l.. * request th
0ab0: 65 6e 20 66 6f 72 67 65 74 20 61 6e 79 20 50 49  en forget any PI
0ac0: 4e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  N associated wit
0ad0: 68 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61  h that certifica
0ae0: 74 65 0a 09 20 2a 2f 0a 09 69 66 20 28 6d 65 73  te.. */..if (mes
0af0: 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 73  sageEvent.data.s
0b00: 74 61 74 75 73 20 21 3d 20 22 73 75 63 63 65 73  tatus != "succes
0b10: 73 22 29 20 7b 0a 09 09 69 66 20 28 6d 65 73 73  s") {...if (mess
0b20: 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 6f 72  ageEvent.data.or
0b30: 69 67 69 6e 61 6c 72 65 71 75 65 73 74 29 20 7b  iginalrequest) {
0b40: 0a 09 09 09 69 66 20 28 6d 65 73 73 61 67 65 45  ....if (messageE
0b50: 76 65 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69 6e  vent.data.origin
0b60: 61 6c 72 65 71 75 65 73 74 2e 63 65 72 74 69 66  alrequest.certif
0b70: 69 63 61 74 65 29 20 7b 0a 09 09 09 09 64 65 6c  icate) {.....del
0b80: 65 74 65 20 63 61 63 6b 65 79 43 65 72 74 69 66  ete cackeyCertif
0b90: 69 63 61 74 65 54 6f 50 49 4e 4d 61 70 5b 63 61  icateToPINMap[ca
0ba0: 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54  ckeyCertificateT
0bb0: 6f 50 49 4e 49 44 28 6d 65 73 73 61 67 65 45 76  oPINID(messageEv
0bc0: 65 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69 6e 61  ent.data.origina
0bd0: 6c 72 65 71 75 65 73 74 2e 63 65 72 74 69 66 69  lrequest.certifi
0be0: 63 61 74 65 29 5d 3b 0a 09 09 09 7d 0a 09 09 7d  cate)];....}...}
0bf0: 0a 09 7d 0a 0a 09 69 66 20 28 6d 65 73 73 61 67  ..}...if (messag
0c00: 65 45 76 65 6e 74 2e 64 61 74 61 2e 63 6f 6d 6d  eEvent.data.comm
0c10: 61 6e 64 20 3d 3d 20 22 69 6e 69 74 22 20 26 26  and == "init" &&
0c20: 20 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61   messageEvent.da
0c30: 74 61 2e 73 74 61 74 75 73 20 3d 3d 20 22 73 75  ta.status == "su
0c40: 63 63 65 73 73 22 29 20 7b 0a 09 09 69 66 20 28  ccess") {...if (
0c50: 47 6f 6f 67 6c 65 53 6d 61 72 74 43 61 72 64 2e  GoogleSmartCard.
0c60: 49 53 5f 44 45 42 55 47 5f 42 55 49 4c 44 29 20  IS_DEBUG_BUILD) 
0c70: 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67  {....console.log
0c80: 28 22 5b 63 61 63 6b 65 79 5d 20 49 6e 69 74 69  ("[cackey] Initi
0c90: 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6d 70 6c 65  alization comple
0ca0: 74 65 64 2c 20 72 65 73 65 6e 64 69 6e 67 20 61  ted, resending a
0cb0: 6e 79 20 71 75 65 75 65 64 20 6d 65 73 73 61 67  ny queued messag
0cc0: 65 73 22 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  es");...}....cac
0cd0: 6b 65 79 49 6e 69 74 50 43 53 43 43 6f 6d 70 6c  keyInitPCSCCompl
0ce0: 65 74 65 64 28 29 3b 0a 09 7d 0a 0a 09 69 66 20  eted();..}...if 
0cf0: 28 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61  (messageEvent.da
0d00: 74 61 2e 69 64 20 3d 3d 20 6e 75 6c 6c 29 20 7b  ta.id == null) {
0d10: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
0d20: 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 20 3d  chromeCallback =
0d30: 20 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64 69   cackeyOutstandi
0d40: 6e 67 43 61 6c 6c 62 61 63 6b 73 5b 6d 65 73 73  ngCallbacks[mess
0d50: 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 69 64  ageEvent.data.id
0d60: 5d 3b 0a 0a 09 69 66 20 28 63 68 72 6f 6d 65 43  ];...if (chromeC
0d70: 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e 75 6c 6c 29  allback == null)
0d80: 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 65 72 72   {...console.err
0d90: 6f 72 28 22 5b 63 61 63 6b 65 79 5d 20 44 69 73  or("[cackey] Dis
0da0: 63 61 72 64 69 6e 67 20 6f 75 74 64 61 74 65 64  carding outdated
0db0: 20 6d 65 73 73 61 67 65 22 29 3b 0a 0a 09 09 72   message");....r
0dc0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 73 77 69 74  eturn;..}...swit
0dd0: 63 68 20 28 6d 65 73 73 61 67 65 45 76 65 6e 74  ch (messageEvent
0de0: 2e 64 61 74 61 2e 73 74 61 74 75 73 29 20 7b 0a  .data.status) {.
0df0: 09 09 63 61 73 65 20 22 65 72 72 6f 72 22 3a 0a  ..case "error":.
0e00: 09 09 09 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72  ...console.error
0e10: 28 22 5b 63 61 63 6b 65 79 5d 20 46 61 69 6c 65  ("[cackey] Faile
0e20: 64 20 74 6f 20 65 78 65 63 75 74 65 20 63 6f 6d  d to execute com
0e30: 6d 61 6e 64 20 27 22 20 2b 20 6d 65 73 73 61 67  mand '" + messag
0e40: 65 45 76 65 6e 74 2e 64 61 74 61 2e 63 6f 6d 6d  eEvent.data.comm
0e50: 61 6e 64 20 2b 20 22 27 3a 20 22 20 2b 20 6d 65  and + "': " + me
0e60: 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e  ssageEvent.data.
0e70: 65 72 72 6f 72 29 3b 0a 0a 09 09 09 63 68 72 6f  error);.....chro
0e80: 6d 65 43 61 6c 6c 62 61 63 6b 28 29 3b 0a 0a 09  meCallback();...
0e90: 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
0ea0: 22 72 65 74 72 79 22 3a 0a 09 09 09 2f 2a 0a 09  "retry":..../*..
0eb0: 09 09 20 2a 20 41 64 64 20 74 68 65 20 6e 65 77  .. * Add the new
0ec0: 20 72 65 71 75 65 73 74 20 74 6f 20 74 68 65 20   request to the 
0ed0: 71 75 65 75 65 20 6f 66 20 65 76 65 6e 74 73 20  queue of events 
0ee0: 74 6f 20 70 72 6f 63 65 73 73 20 77 68 65 6e 20  to process when 
0ef0: 74 68 65 20 50 49 4e 0a 09 09 09 20 2a 20 70 72  the PIN.... * pr
0f00: 6f 6d 70 74 20 69 73 20 74 65 72 6d 69 6e 61 74  ompt is terminat
0f10: 65 64 2e 0a 09 09 09 20 2a 2f 0a 09 09 09 63 61  ed..... */....ca
0f20: 63 6b 65 79 4d 65 73 73 61 67 65 73 54 6f 52 65  ckeyMessagesToRe
0f30: 74 72 79 2e 70 75 73 68 28 6d 65 73 73 61 67 65  try.push(message
0f40: 45 76 65 6e 74 29 3b 0a 0a 09 09 09 69 66 20 28  Event);.....if (
0f50: 70 69 6e 57 69 6e 64 6f 77 50 72 65 76 69 6f 75  pinWindowPreviou
0f60: 73 48 61 6e 64 6c 65 29 20 7b 0a 09 09 09 09 2f  sHandle) {...../
0f70: 2a 0a 09 09 09 09 20 2a 20 41 6e 20 65 78 69 73  *..... * An exis
0f80: 74 69 6e 67 20 50 49 4e 20 65 6e 74 72 79 20 69  ting PIN entry i
0f90: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 0a 09 09  s in progress...
0fa0: 09 09 20 2a 20 4a 75 73 74 20 61 64 64 20 74 68  .. * Just add th
0fb0: 65 20 72 65 71 75 65 73 74 20 74 6f 20 74 68 65  e request to the
0fc0: 20 71 75 65 75 65 20 28 61 62 6f 76 65 29 20 61   queue (above) a
0fd0: 6e 64 20 77 61 69 74 0a 09 09 09 09 20 2a 2f 0a  nd wait..... */.
0fe0: 0a 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09  .....return;....
0ff0: 7d 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 53  }...../*.... * S
1000: 65 74 20 74 68 65 20 68 61 6e 64 6c 65 20 74 6f  et the handle to
1010: 20 61 6e 20 69 6e 76 61 6c 69 64 20 28 62 75 74   an invalid (but
1020: 20 6e 6f 6e 2d 6e 75 6c 6c 29 20 76 61 6c 75 65   non-null) value
1030: 20 75 6e 74 69 6c 20 74 68 65 20 77 69 6e 64 6f   until the windo
1040: 77 0a 09 09 09 20 2a 20 69 73 20 63 72 65 61 74  w.... * is creat
1050: 65 64 20 69 6e 20 63 61 73 65 20 77 65 20 61 72  ed in case we ar
1060: 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 20  e invoked again 
1070: 73 6f 6f 6e 2e 0a 09 09 09 20 2a 2f 0a 09 09 09  soon..... */....
1080: 70 69 6e 57 69 6e 64 6f 77 50 72 65 76 69 6f 75  pinWindowPreviou
1090: 73 48 61 6e 64 6c 65 20 3d 20 22 69 6e 76 61 6c  sHandle = "inval
10a0: 69 64 22 3b 0a 0a 09 09 09 63 68 72 6f 6d 65 2e  id";.....chrome.
10b0: 61 70 70 2e 77 69 6e 64 6f 77 2e 63 72 65 61 74  app.window.creat
10c0: 65 28 22 70 69 6e 2e 68 74 6d 6c 22 2c 20 7b 0a  e("pin.html", {.
10d0: 09 09 09 09 22 69 64 22 3a 20 22 63 61 63 6b 65  ...."id": "cacke
10e0: 79 50 49 4e 45 6e 74 72 79 22 2c 0a 09 09 09 09  yPINEntry",.....
10f0: 22 72 65 73 69 7a 61 62 6c 65 22 3a 20 66 61 6c  "resizable": fal
1100: 73 65 2c 0a 09 09 09 09 22 61 6c 77 61 79 73 4f  se,....."alwaysO
1110: 6e 54 6f 70 22 3a 20 74 72 75 65 2c 0a 09 09 09  nTop": true,....
1120: 09 22 66 6f 63 75 73 65 64 22 3a 20 74 72 75 65  ."focused": true
1130: 2c 0a 09 09 09 09 22 76 69 73 69 62 6c 65 4f 6e  ,....."visibleOn
1140: 41 6c 6c 57 6f 72 6b 73 70 61 63 65 73 22 3a 20  AllWorkspaces": 
1150: 74 72 75 65 2c 0a 09 09 09 09 22 69 6e 6e 65 72  true,....."inner
1160: 42 6f 75 6e 64 73 22 3a 20 7b 0a 09 09 09 09 09  Bounds": {......
1170: 22 77 69 64 74 68 22 3a 20 33 35 30 2c 0a 09 09  "width": 350,...
1180: 09 09 09 22 6d 69 6e 57 69 64 74 68 22 3a 20 33  ..."minWidth": 3
1190: 35 30 2c 0a 09 09 09 09 09 22 68 65 69 67 68 74  50,......"height
11a0: 22 3a 20 31 33 35 2c 0a 09 09 09 09 09 22 6d 69  ": 135,......"mi
11b0: 6e 48 65 69 67 68 74 22 3a 20 31 33 35 0a 09 09  nHeight": 135...
11c0: 09 09 7d 0a 09 09 09 7d 2c 20 66 75 6e 63 74 69  ..}....}, functi
11d0: 6f 6e 28 70 69 6e 57 69 6e 64 6f 77 29 20 7b 0a  on(pinWindow) {.
11e0: 09 09 09 09 2f 2a 0a 09 09 09 09 20 2a 20 53 65  ..../*..... * Se
11f0: 74 20 74 68 65 20 50 49 4e 20 76 61 6c 75 65 20  t the PIN value 
1200: 74 6f 20 62 6c 61 6e 6b 0a 09 09 09 09 20 2a 2f  to blank..... */
1210: 0a 09 09 09 09 70 69 6e 57 69 6e 64 6f 77 50 49  .....pinWindowPI
1220: 4e 56 61 6c 75 65 20 3d 20 22 22 3b 0a 0a 09 09  NValue = "";....
1230: 09 09 69 66 20 28 21 70 69 6e 57 69 6e 64 6f 77  ..if (!pinWindow
1240: 29 20 7b 0a 09 09 09 09 09 63 6f 6e 73 6f 6c 65  ) {......console
1250: 2e 65 72 72 6f 72 28 22 5b 63 61 63 6b 65 79 5d  .error("[cackey]
1260: 20 4e 6f 20 77 69 6e 64 6f 77 20 77 61 73 20 70   No window was p
1270: 72 6f 76 69 64 65 64 20 66 6f 72 20 50 49 4e 20  rovided for PIN 
1280: 65 6e 74 72 79 2c 20 74 68 69 73 20 77 69 6c 6c  entry, this will
1290: 20 6e 6f 74 20 67 6f 20 77 65 6c 6c 2e 22 29 3b   not go well.");
12a0: 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 3b 0a 09  .......return;..
12b0: 09 09 09 7d 0a 0a 09 09 09 09 70 69 6e 57 69 6e  ...}......pinWin
12c0: 64 6f 77 50 72 65 76 69 6f 75 73 48 61 6e 64 6c  dowPreviousHandl
12d0: 65 20 3d 20 70 69 6e 57 69 6e 64 6f 77 3b 0a 0a  e = pinWindow;..
12e0: 09 09 09 09 70 69 6e 57 69 6e 64 6f 77 2e 64 72  ....pinWindow.dr
12f0: 61 77 41 74 74 65 6e 74 69 6f 6e 28 29 3b 0a 09  awAttention();..
1300: 09 09 09 70 69 6e 57 69 6e 64 6f 77 2e 66 6f 63  ...pinWindow.foc
1310: 75 73 28 29 3b 0a 0a 09 09 09 09 2f 2a 0a 09 09  us();....../*...
1320: 09 09 20 2a 20 52 65 67 69 73 74 65 72 20 61 20  .. * Register a 
1330: 68 61 6e 64 6c 65 72 20 74 6f 20 68 61 6e 64 6c  handler to handl
1340: 65 20 74 68 65 20 77 69 6e 64 6f 77 20 62 65 69  e the window bei
1350: 6e 67 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75  ng closed withou
1360: 74 0a 09 09 09 09 20 2a 20 68 61 76 69 6e 67 20  t..... * having 
1370: 73 65 6e 74 20 61 6e 79 74 68 69 6e 67 0a 09 09  sent anything...
1380: 09 09 20 2a 2f 0a 09 09 09 09 70 69 6e 57 69 6e  .. */.....pinWin
1390: 64 6f 77 2e 6f 6e 43 6c 6f 73 65 64 2e 61 64 64  dow.onClosed.add
13a0: 4c 69 73 74 65 6e 65 72 28 66 75 6e 63 74 69 6f  Listener(functio
13b0: 6e 28 29 20 7b 0a 09 09 09 09 09 76 61 72 20 6d  n() {......var m
13c0: 65 73 73 61 67 65 49 64 78 3b 0a 0a 09 09 09 09  essageIdx;......
13d0: 09 70 69 6e 57 69 6e 64 6f 77 50 72 65 76 69 6f  .pinWindowPrevio
13e0: 75 73 48 61 6e 64 6c 65 20 3d 20 6e 75 6c 6c 3b  usHandle = null;
13f0: 0a 0a 09 09 09 09 09 66 6f 72 20 28 6d 65 73 73  .......for (mess
1400: 61 67 65 49 64 78 20 3d 20 30 3b 20 6d 65 73 73  ageIdx = 0; mess
1410: 61 67 65 49 64 78 20 3c 20 63 61 63 6b 65 79 4d  ageIdx < cackeyM
1420: 65 73 73 61 67 65 73 54 6f 52 65 74 72 79 2e 6c  essagesToRetry.l
1430: 65 6e 67 74 68 3b 20 6d 65 73 73 61 67 65 49 64  ength; messageId
1440: 78 2b 2b 29 20 7b 0a 09 09 09 09 09 09 76 61 72  x++) {.......var
1450: 20 74 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74   tmpMessageEvent
1460: 3b 0a 0a 09 09 09 09 09 09 74 6d 70 4d 65 73 73  ;........tmpMess
1470: 61 67 65 45 76 65 6e 74 20 3d 20 63 61 63 6b 65  ageEvent = cacke
1480: 79 4d 65 73 73 61 67 65 73 54 6f 52 65 74 72 79  yMessagesToRetry
1490: 5b 6d 65 73 73 61 67 65 49 64 78 5d 3b 0a 0a 09  [messageIdx];...
14a0: 09 09 09 09 09 69 66 20 28 70 69 6e 57 69 6e 64  .....if (pinWind
14b0: 6f 77 50 49 4e 56 61 6c 75 65 20 3d 3d 20 22 22  owPINValue == ""
14c0: 29 20 7b 0a 09 09 09 09 09 09 09 69 66 20 28 47  ) {........if (G
14d0: 6f 6f 67 6c 65 53 6d 61 72 74 43 61 72 64 2e 49  oogleSmartCard.I
14e0: 53 5f 44 45 42 55 47 5f 42 55 49 4c 44 29 20 7b  S_DEBUG_BUILD) {
14f0: 0a 09 09 09 09 09 09 09 09 63 6f 6e 73 6f 6c 65  .........console
1500: 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 54  .log("[cackey] T
1510: 68 65 20 50 49 4e 20 64 69 61 6c 6f 67 20 77 61  he PIN dialog wa
1520: 73 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75 74  s closed without
1530: 20 67 61 74 68 65 72 69 6e 67 20 61 20 50 49 4e   gathering a PIN
1540: 2c 20 74 72 65 61 74 69 6e 67 20 69 74 20 61 73  , treating it as
1550: 20 61 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a 09   a failure.");..
1560: 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 09  ......}.........
1570: 74 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74 2e  tmpMessageEvent.
1580: 64 61 74 61 2e 73 74 61 74 75 73 20 3d 20 22 65  data.status = "e
1590: 72 72 6f 72 22 3b 0a 09 09 09 09 09 09 09 74 6d  rror";........tm
15a0: 70 4d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61  pMessageEvent.da
15b0: 74 61 2e 65 72 72 6f 72 20 3d 20 22 50 49 4e 20  ta.error = "PIN 
15c0: 77 69 6e 64 6f 77 20 63 6c 6f 73 65 64 20 77 69  window closed wi
15d0: 74 68 6f 75 74 20 61 20 50 49 4e 20 62 65 69 6e  thout a PIN bein
15e0: 67 20 70 72 6f 76 69 64 65 64 22 3b 0a 0a 09 09  g provided";....
15f0: 09 09 09 09 09 63 61 63 6b 65 79 4d 65 73 73 61  .....cackeyMessa
1600: 67 65 49 6e 63 6f 6d 69 6e 67 28 74 6d 70 4d 65  geIncoming(tmpMe
1610: 73 73 61 67 65 45 76 65 6e 74 29 3b 0a 09 09 09  ssageEvent);....
1620: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1630: 09 09 09 74 6d 70 4d 65 73 73 61 67 65 45 76 65  ...tmpMessageEve
1640: 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69 6e 61 6c  nt.data.original
1650: 72 65 71 75 65 73 74 2e 70 69 6e 20 3d 20 70 69  request.pin = pi
1660: 6e 57 69 6e 64 6f 77 50 49 4e 56 61 6c 75 65 3b  nWindowPINValue;
1670: 0a 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 43  .........cackeyC
1680: 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d  ertificateToPINM
1690: 61 70 5b 63 61 63 6b 65 79 43 65 72 74 69 66 69  ap[cackeyCertifi
16a0: 63 61 74 65 54 6f 50 49 4e 49 44 28 74 6d 70 4d  cateToPINID(tmpM
16b0: 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61  essageEvent.data
16c0: 2e 6f 72 69 67 69 6e 61 6c 72 65 71 75 65 73 74  .originalrequest
16d0: 2e 63 65 72 74 69 66 69 63 61 74 65 29 5d 20 3d  .certificate)] =
16e0: 20 70 69 6e 57 69 6e 64 6f 77 50 49 4e 56 61 6c   pinWindowPINVal
16f0: 75 65 3b 0a 0a 09 09 09 09 09 09 09 63 61 63 6b  ue;.........cack
1700: 65 79 49 6e 69 74 50 43 53 43 28 66 75 6e 63 74  eyInitPCSC(funct
1710: 69 6f 6e 28 29 20 7b 0a 09 09 09 09 09 09 09 09  ion() {.........
1720: 63 61 63 6b 65 79 48 61 6e 64 6c 65 2e 70 6f 73  cackeyHandle.pos
1730: 74 4d 65 73 73 61 67 65 28 74 6d 70 4d 65 73 73  tMessage(tmpMess
1740: 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 6f 72  ageEvent.data.or
1750: 69 67 69 6e 61 6c 72 65 71 75 65 73 74 29 3b 0a  iginalrequest);.
1760: 09 09 09 09 09 09 09 7d 29 3b 0a 09 09 09 09 09  .......});......
1770: 09 7d 0a 09 09 09 09 09 7d 0a 0a 0a 09 09 09 09  .}......}.......
1780: 09 2f 2a 0a 09 09 09 09 09 20 2a 20 44 65 6c 65  ./*...... * Dele
1790: 74 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  te the existing 
17a0: 68 61 6e 64 6c 65 20 61 6e 64 20 63 72 65 61 74  handle and creat
17b0: 65 20 61 20 6e 65 77 20 6f 6e 65 0a 09 09 09 09  e a new one.....
17c0: 09 20 2a 2f 0a 09 09 09 09 09 64 65 6c 65 74 65  . */......delete
17d0: 20 63 61 63 6b 65 79 4d 65 73 73 61 67 65 73 54   cackeyMessagesT
17e0: 6f 52 65 74 72 79 3b 0a 0a 09 09 09 09 09 63 61  oRetry;.......ca
17f0: 63 6b 65 79 4d 65 73 73 61 67 65 73 54 6f 52 65  ckeyMessagesToRe
1800: 74 72 79 20 3d 20 5b 5d 3b 0a 0a 09 09 09 09 09  try = [];.......
1810: 2f 2a 0a 09 09 09 09 09 20 2a 20 57 65 20 61 72  /*...... * We ar
1820: 65 20 64 6f 6e 65 20 66 65 74 63 68 69 6e 67 20  e done fetching 
1830: 74 68 65 20 75 73 65 72 20 50 49 4e 2c 20 63 6c  the user PIN, cl
1840: 65 61 72 20 74 68 65 20 76 61 6c 75 65 0a 09 09  ear the value...
1850: 09 09 09 20 2a 2f 0a 09 09 09 09 09 70 69 6e 57  ... */......pinW
1860: 69 6e 64 6f 77 50 49 4e 56 61 6c 75 65 20 3d 20  indowPINValue = 
1870: 22 22 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e  "";.......return
1880: 3b 0a 09 09 09 09 7d 29 0a 0a 09 09 09 09 2f 2a  ;.....})....../*
1890: 0a 09 09 09 09 20 2a 20 50 61 73 73 20 74 68 69  ..... * Pass thi
18a0: 73 20 6d 65 73 73 61 67 65 20 6f 66 66 20 74 6f  s message off to
18b0: 20 74 68 65 20 6f 74 68 65 72 20 77 69 6e 64 6f   the other windo
18c0: 77 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 79  w so that it may
18d0: 20 72 65 73 75 62 6d 69 74 20 74 68 65 20 72 65   resubmit the re
18e0: 71 75 65 73 74 2e 0a 09 09 09 09 20 2a 2f 0a 09  quest...... */..
18f0: 09 09 09 70 69 6e 57 69 6e 64 6f 77 2e 63 6f 6e  ...pinWindow.con
1900: 74 65 6e 74 57 69 6e 64 6f 77 2e 70 61 72 65 6e  tentWindow.paren
1910: 74 57 69 6e 64 6f 77 20 3d 20 77 69 6e 64 6f 77  tWindow = window
1920: 3b 0a 09 09 09 09 70 69 6e 57 69 6e 64 6f 77 2e  ;.....pinWindow.
1930: 63 6f 6e 74 65 6e 74 57 69 6e 64 6f 77 2e 6d 65  contentWindow.me
1940: 73 73 61 67 65 45 76 65 6e 74 20 3d 20 6d 65 73  ssageEvent = mes
1950: 73 61 67 65 45 76 65 6e 74 3b 0a 0a 09 09 09 09  sageEvent;......
1960: 72 65 74 75 72 6e 3b 0a 09 09 09 7d 29 3b 0a 0a  return;....});..
1970: 09 09 09 2f 2a 0a 09 09 09 20 2a 20 57 65 20 72  .../*.... * We r
1980: 65 74 75 72 6e 20 68 65 72 65 20 69 6e 73 74 65  eturn here inste
1990: 61 64 20 6f 66 20 62 72 65 61 6b 20 74 6f 20 61  ad of break to a
19a0: 76 6f 69 64 20 64 65 6c 65 74 69 6e 67 20 74 68  void deleting th
19b0: 65 20 63 61 6c 6c 62 61 63 6b 0a 09 09 09 20 2a  e callback.... *
19c0: 20 65 6e 74 72 79 2e 0a 09 09 09 20 2a 2f 0a 09   entry..... */..
19d0: 09 09 72 65 74 75 72 6e 3b 0a 09 09 63 61 73 65  ..return;...case
19e0: 20 22 73 75 63 63 65 73 73 22 3a 0a 09 09 09 73   "success":....s
19f0: 77 69 74 63 68 20 28 6d 65 73 73 61 67 65 45 76  witch (messageEv
1a00: 65 6e 74 2e 64 61 74 61 2e 63 6f 6d 6d 61 6e 64  ent.data.command
1a10: 29 20 7b 0a 09 09 09 09 63 61 73 65 20 22 6c 69  ) {.....case "li
1a20: 73 74 63 65 72 74 69 66 69 63 61 74 65 73 22 3a  stcertificates":
1a30: 0a 09 09 09 09 09 6e 65 78 74 46 75 6e 63 74 69  ......nextFuncti
1a40: 6f 6e 20 3d 20 63 61 63 6b 65 79 4d 65 73 73 61  on = cackeyMessa
1a50: 67 65 49 6e 63 6f 6d 69 6e 67 4c 69 73 74 43 65  geIncomingListCe
1a60: 72 74 69 66 69 63 61 74 65 73 3b 0a 0a 09 09 09  rtificates;.....
1a70: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73  ..break;.....cas
1a80: 65 20 22 73 69 67 6e 22 3a 0a 09 09 09 09 09 6e  e "sign":......n
1a90: 65 78 74 46 75 6e 63 74 69 6f 6e 20 3d 20 63 61  extFunction = ca
1aa0: 63 6b 65 79 4d 65 73 73 61 67 65 49 6e 63 6f 6d  ckeyMessageIncom
1ab0: 69 6e 67 53 69 67 6e 4d 65 73 73 61 67 65 3b 0a  ingSignMessage;.
1ac0: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1ad0: 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  }.....break;..}.
1ae0: 0a 09 69 66 20 28 6e 65 78 74 46 75 6e 63 74 69  ..if (nextFuncti
1af0: 6f 6e 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09  on != null) {...
1b00: 6e 65 78 74 46 75 6e 63 74 69 6f 6e 28 6d 65 73  nextFunction(mes
1b10: 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2c 20  sageEvent.data, 
1b20: 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 3b  chromeCallback);
1b30: 0a 09 7d 0a 0a 09 64 65 6c 65 74 65 20 63 61 63  ..}...delete cac
1b40: 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43 61  keyOutstandingCa
1b50: 6c 6c 62 61 63 6b 73 5b 6d 65 73 73 61 67 65 45  llbacks[messageE
1b60: 76 65 6e 74 2e 64 61 74 61 2e 69 64 5d 3b 0a 0a  vent.data.id];..
1b70: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
1b80: 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 6d 65  * Handler for me
1b90: 73 73 61 67 65 73 20 66 72 6f 6d 20 43 68 72 6f  ssages from Chro
1ba0: 6d 65 20 72 65 6c 61 74 65 64 20 74 6f 20 6c 69  me related to li
1bb0: 73 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  sting certificat
1bc0: 65 73 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20  es. */.function 
1bd0: 63 61 63 6b 65 79 4c 69 73 74 43 65 72 74 69 66  cackeyListCertif
1be0: 69 63 61 74 65 73 28 63 68 72 6f 6d 65 43 61 6c  icates(chromeCal
1bf0: 6c 62 61 63 6b 29 20 7b 0a 09 76 61 72 20 63 61  lback) {..var ca
1c00: 6c 6c 62 61 63 6b 49 64 3b 0a 0a 09 69 66 20 28  llbackId;...if (
1c10: 47 6f 6f 67 6c 65 53 6d 61 72 74 43 61 72 64 2e  GoogleSmartCard.
1c20: 49 53 5f 44 45 42 55 47 5f 42 55 49 4c 44 29 20  IS_DEBUG_BUILD) 
1c30: 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28  {...console.log(
1c40: 22 5b 63 61 63 6b 65 79 5d 20 41 73 6b 65 64 20  "[cackey] Asked 
1c50: 74 6f 20 70 72 6f 76 69 64 65 20 61 20 6c 69 73  to provide a lis
1c60: 74 20 6f 66 20 63 65 72 74 69 66 69 63 61 74 65  t of certificate
1c70: 73 20 2d 2d 20 74 68 72 6f 77 69 6e 67 20 74 68  s -- throwing th
1c80: 61 74 20 72 65 71 75 65 73 74 20 6f 76 65 72 20  at request over 
1c90: 74 6f 20 74 68 65 20 4e 61 43 6c 20 73 69 64 65  to the NaCl side
1ca0: 2e 2e 2e 20 22 29 3b 0a 09 7d 0a 0a 09 63 61 6c  ... ");..}...cal
1cb0: 6c 62 61 63 6b 49 64 20 3d 20 63 61 63 6b 65 79  lbackId = cackey
1cc0: 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62  OutstandingCallb
1cd0: 61 63 6b 43 6f 75 6e 74 65 72 20 2b 20 31 3b 0a  ackCounter + 1;.
1ce0: 0a 09 63 61 63 6b 65 79 49 6e 69 74 50 43 53 43  ..cackeyInitPCSC
1cf0: 28 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 09 09  (function() {...
1d00: 63 61 63 6b 65 79 48 61 6e 64 6c 65 2e 70 6f 73  cackeyHandle.pos
1d10: 74 4d 65 73 73 61 67 65 28 0a 09 09 09 7b 0a 09  tMessage(....{..
1d20: 09 09 09 27 74 61 72 67 65 74 27 3a 20 22 63 61  ...'target': "ca
1d30: 63 6b 65 79 22 2c 0a 09 09 09 09 27 63 6f 6d 6d  ckey",.....'comm
1d40: 61 6e 64 27 3a 20 22 6c 69 73 74 63 65 72 74 69  and': "listcerti
1d50: 66 69 63 61 74 65 73 22 2c 0a 09 09 09 09 27 69  ficates",.....'i
1d60: 64 27 3a 20 63 61 6c 6c 62 61 63 6b 49 64 0a 09  d': callbackId..
1d70: 09 09 7d 0a 09 09 29 3b 0a 0a 09 09 63 61 63 6b  ..}...);....cack
1d80: 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c  eyOutstandingCal
1d90: 6c 62 61 63 6b 43 6f 75 6e 74 65 72 20 3d 20 63  lbackCounter = c
1da0: 61 6c 6c 62 61 63 6b 49 64 3b 0a 09 09 63 61 63  allbackId;...cac
1db0: 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43 61  keyOutstandingCa
1dc0: 6c 6c 62 61 63 6b 73 5b 63 61 6c 6c 62 61 63 6b  llbacks[callback
1dd0: 49 64 5d 20 3d 20 63 68 72 6f 6d 65 43 61 6c 6c  Id] = chromeCall
1de0: 62 61 63 6b 3b 0a 0a 09 09 69 66 20 28 47 6f 6f  back;....if (Goo
1df0: 67 6c 65 53 6d 61 72 74 43 61 72 64 2e 49 53 5f  gleSmartCard.IS_
1e00: 44 45 42 55 47 5f 42 55 49 4c 44 29 20 7b 0a 09  DEBUG_BUILD) {..
1e10: 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b  ..console.log("[
1e20: 63 61 63 6b 65 79 5d 20 54 68 72 6f 77 6e 2e 22  cackey] Thrown."
1e30: 29 3b 0a 09 09 7d 0a 09 7d 29 3b 0a 0a 09 72 65  );...}..});...re
1e40: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48  turn;.}../*. * H
1e50: 61 6e 64 6c 65 72 20 66 6f 72 20 6d 65 73 73 61  andler for messa
1e60: 67 65 73 20 66 72 6f 6d 20 43 68 72 6f 6d 65 20  ges from Chrome 
1e70: 72 65 6c 61 74 65 64 20 74 6f 20 73 69 67 6e 69  related to signi
1e80: 6e 67 20 61 20 68 61 73 68 20 6f 66 20 73 6f 6d  ng a hash of som
1e90: 65 20 73 6f 72 74 0a 20 2a 2f 0a 66 75 6e 63 74  e sort. */.funct
1ea0: 69 6f 6e 20 63 61 63 6b 65 79 53 69 67 6e 4d 65  ion cackeySignMe
1eb0: 73 73 61 67 65 28 73 69 67 6e 52 65 71 75 65 73  ssage(signReques
1ec0: 74 2c 20 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63  t, chromeCallbac
1ed0: 6b 29 20 7b 0a 09 76 61 72 20 63 61 6c 6c 62 61  k) {..var callba
1ee0: 63 6b 49 64 3b 0a 09 76 61 72 20 63 6f 6d 6d 61  ckId;..var comma
1ef0: 6e 64 3b 0a 09 76 61 72 20 63 65 72 74 69 66 69  nd;..var certifi
1f00: 63 61 74 65 49 64 3b 0a 09 76 61 72 20 64 69 67  cateId;..var dig
1f10: 65 73 74 2c 20 64 69 67 65 73 74 48 65 61 64 65  est, digestHeade
1f20: 72 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 50 72 65 66  r;.../*.. * Pref
1f30: 69 78 20 74 68 65 20 64 69 67 65 73 74 20 77 69  ix the digest wi
1f40: 74 68 20 74 68 65 20 41 53 4e 2e 31 20 68 65 61  th the ASN.1 hea
1f50: 64 65 72 20 72 65 71 75 69 72 65 64 20 6f 66 20  der required of 
1f60: 69 74 0a 09 20 2a 2f 0a 09 73 77 69 74 63 68 20  it.. */..switch 
1f70: 28 73 69 67 6e 52 65 71 75 65 73 74 2e 68 61 73  (signRequest.has
1f80: 68 29 20 7b 0a 09 09 63 61 73 65 20 22 53 48 41  h) {...case "SHA
1f90: 31 22 3a 0a 09 09 09 64 69 67 65 73 74 48 65 61  1":....digestHea
1fa0: 64 65 72 20 3d 20 6e 65 77 20 55 69 6e 74 38 41  der = new Uint8A
1fb0: 72 72 61 79 28 5b 30 78 33 30 2c 20 30 78 32 31  rray([0x30, 0x21
1fc0: 2c 20 30 78 33 30 2c 20 30 78 30 39 2c 20 30 78  , 0x30, 0x09, 0x
1fd0: 30 36 2c 20 30 78 30 35 2c 20 30 78 32 62 2c 20  06, 0x05, 0x2b, 
1fe0: 30 78 30 65 2c 20 30 78 30 33 2c 20 30 78 30 32  0x0e, 0x03, 0x02
1ff0: 2c 20 30 78 31 61 2c 20 30 78 30 35 2c 20 30 78  , 0x1a, 0x05, 0x
2000: 30 30 2c 20 30 78 30 34 2c 20 30 78 31 34 5d 29  00, 0x04, 0x14])
2010: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
2020: 73 65 20 22 53 48 41 32 35 36 22 3a 0a 09 09 09  se "SHA256":....
2030: 64 69 67 65 73 74 48 65 61 64 65 72 20 3d 20 6e  digestHeader = n
2040: 65 77 20 55 69 6e 74 38 41 72 72 61 79 28 5b 30  ew Uint8Array([0
2050: 78 33 30 2c 20 30 78 33 31 2c 20 30 78 33 30 2c  x30, 0x31, 0x30,
2060: 20 30 78 30 64 2c 20 30 78 30 36 2c 20 30 78 30   0x0d, 0x06, 0x0
2070: 39 2c 20 30 78 36 30 2c 20 30 78 38 36 2c 20 30  9, 0x60, 0x86, 0
2080: 78 34 38 2c 20 30 78 30 31 2c 20 30 78 36 35 2c  x48, 0x01, 0x65,
2090: 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30   0x03, 0x04, 0x0
20a0: 32 2c 20 30 78 30 31 2c 20 30 78 30 35 2c 20 30  2, 0x01, 0x05, 0
20b0: 78 30 30 2c 20 30 78 30 34 2c 20 30 78 32 30 5d  x00, 0x04, 0x20]
20c0: 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  );....break;...c
20d0: 61 73 65 20 22 4d 44 35 5f 53 48 41 31 22 3a 0a  ase "MD5_SHA1":.
20e0: 09 09 09 64 69 67 65 73 74 48 65 61 64 65 72 20  ...digestHeader 
20f0: 3d 20 6e 65 77 20 55 69 6e 74 38 41 72 72 61 79  = new Uint8Array
2100: 28 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ();....break;...
2110: 64 65 66 61 75 6c 74 3a 0a 09 09 09 63 6f 6e 73  default:....cons
2120: 6f 6c 65 2e 65 72 72 6f 72 28 22 5b 63 61 63 6b  ole.error("[cack
2130: 65 79 5d 20 41 73 6b 65 64 20 74 6f 20 73 69 67  ey] Asked to sig
2140: 6e 20 61 20 6d 65 73 73 61 67 65 20 77 69 74 68  n a message with
2150: 20 61 20 68 61 73 68 20 77 65 20 64 6f 20 6e 6f   a hash we do no
2160: 74 20 73 75 70 70 6f 72 74 3a 20 22 20 2b 20 73  t support: " + s
2170: 69 67 6e 52 65 71 75 65 73 74 2e 68 61 73 68 29  ignRequest.hash)
2180: 3b 0a 0a 09 09 09 63 68 72 6f 6d 65 43 61 6c 6c  ;.....chromeCall
2190: 62 61 63 6b 28 29 3b 0a 0a 09 09 09 72 65 74 75  back();.....retu
21a0: 72 6e 3b 0a 09 7d 0a 0a 09 64 69 67 65 73 74 20  rn;..}...digest 
21b0: 3d 20 6e 65 77 20 55 69 6e 74 38 41 72 72 61 79  = new Uint8Array
21c0: 28 64 69 67 65 73 74 48 65 61 64 65 72 2e 6c 65  (digestHeader.le
21d0: 6e 67 74 68 20 2b 20 73 69 67 6e 52 65 71 75 65  ngth + signReque
21e0: 73 74 2e 64 69 67 65 73 74 2e 62 79 74 65 4c 65  st.digest.byteLe
21f0: 6e 67 74 68 29 3b 0a 09 64 69 67 65 73 74 2e 73  ngth);..digest.s
2200: 65 74 28 64 69 67 65 73 74 48 65 61 64 65 72 2c  et(digestHeader,
2210: 20 30 29 3b 0a 09 64 69 67 65 73 74 2e 73 65 74   0);..digest.set
2220: 28 6e 65 77 20 55 69 6e 74 38 41 72 72 61 79 28  (new Uint8Array(
2230: 73 69 67 6e 52 65 71 75 65 73 74 2e 64 69 67 65  signRequest.dige
2240: 73 74 29 2c 20 64 69 67 65 73 74 48 65 61 64 65  st), digestHeade
2250: 72 2e 6c 65 6e 67 74 68 29 3b 0a 0a 09 64 65 6c  r.length);...del
2260: 65 74 65 20 64 69 67 65 73 74 48 65 61 64 65 72  ete digestHeader
2270: 3b 0a 0a 09 69 66 20 28 47 6f 6f 67 6c 65 53 6d  ;...if (GoogleSm
2280: 61 72 74 43 61 72 64 2e 49 53 5f 44 45 42 55 47  artCard.IS_DEBUG
2290: 5f 42 55 49 4c 44 29 20 7b 0a 09 09 63 6f 6e 73  _BUILD) {...cons
22a0: 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79  ole.log("[cackey
22b0: 5d 20 41 73 6b 65 64 20 74 6f 20 73 69 67 6e 20  ] Asked to sign 
22c0: 61 20 6d 65 73 73 61 67 65 20 2d 2d 20 74 68 72  a message -- thr
22d0: 6f 77 69 6e 67 20 74 68 61 74 20 72 65 71 75 65  owing that reque
22e0: 73 74 20 6f 76 65 72 20 74 6f 20 74 68 65 20 4e  st over to the N
22f0: 61 43 6c 20 73 69 64 65 2e 2e 2e 20 22 29 3b 0a  aCl side... ");.
2300: 09 7d 0a 0a 09 63 61 6c 6c 62 61 63 6b 49 64 20  .}...callbackId 
2310: 3d 20 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64  = cackeyOutstand
2320: 69 6e 67 43 61 6c 6c 62 61 63 6b 43 6f 75 6e 74  ingCallbackCount
2330: 65 72 20 2b 20 31 3b 0a 0a 09 63 6f 6d 6d 61 6e  er + 1;...comman
2340: 64 20 3d 20 7b 0a 09 09 27 74 61 72 67 65 74 27  d = {...'target'
2350: 3a 20 22 63 61 63 6b 65 79 22 2c 0a 09 09 27 63  : "cackey",...'c
2360: 6f 6d 6d 61 6e 64 27 3a 20 22 73 69 67 6e 22 2c  ommand': "sign",
2370: 0a 09 09 27 69 64 27 3a 20 63 61 6c 6c 62 61 63  ...'id': callbac
2380: 6b 49 64 2c 0a 09 09 27 63 65 72 74 69 66 69 63  kId,...'certific
2390: 61 74 65 27 3a 20 73 69 67 6e 52 65 71 75 65 73  ate': signReques
23a0: 74 2e 63 65 72 74 69 66 69 63 61 74 65 2c 0a 09  t.certificate,..
23b0: 09 27 64 61 74 61 27 3a 20 64 69 67 65 73 74 2e  .'data': digest.
23c0: 62 75 66 66 65 72 0a 09 7d 3b 0a 0a 09 63 65 72  buffer..};...cer
23d0: 74 69 66 69 63 61 74 65 49 64 20 3d 20 63 61 63  tificateId = cac
23e0: 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f  keyCertificateTo
23f0: 50 49 4e 49 44 28 63 6f 6d 6d 61 6e 64 2e 63 65  PINID(command.ce
2400: 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 69 66  rtificate);...if
2410: 20 28 63 61 63 6b 65 79 43 65 72 74 69 66 69 63   (cackeyCertific
2420: 61 74 65 54 6f 50 49 4e 4d 61 70 5b 63 65 72 74  ateToPINMap[cert
2430: 69 66 69 63 61 74 65 49 64 5d 29 20 7b 0a 09 09  ificateId]) {...
2440: 63 6f 6d 6d 61 6e 64 2e 70 69 6e 20 3d 20 63 61  command.pin = ca
2450: 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54  ckeyCertificateT
2460: 6f 50 49 4e 4d 61 70 5b 63 65 72 74 69 66 69 63  oPINMap[certific
2470: 61 74 65 49 64 5d 3b 0a 09 7d 0a 0a 09 63 61 63  ateId];..}...cac
2480: 6b 65 79 49 6e 69 74 50 43 53 43 28 66 75 6e 63  keyInitPCSC(func
2490: 74 69 6f 6e 28 29 20 7b 0a 09 09 63 61 63 6b 65  tion() {...cacke
24a0: 79 48 61 6e 64 6c 65 2e 70 6f 73 74 4d 65 73 73  yHandle.postMess
24b0: 61 67 65 28 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09  age(command);...
24c0: 09 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64 69  .cackeyOutstandi
24d0: 6e 67 43 61 6c 6c 62 61 63 6b 43 6f 75 6e 74 65  ngCallbackCounte
24e0: 72 20 3d 20 63 61 6c 6c 62 61 63 6b 49 64 3b 0a  r = callbackId;.
24f0: 09 09 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64  ..cackeyOutstand
2500: 69 6e 67 43 61 6c 6c 62 61 63 6b 73 5b 63 61 6c  ingCallbacks[cal
2510: 6c 62 61 63 6b 49 64 5d 20 3d 20 63 68 72 6f 6d  lbackId] = chrom
2520: 65 43 61 6c 6c 62 61 63 6b 3b 0a 0a 09 09 69 66  eCallback;....if
2530: 20 28 47 6f 6f 67 6c 65 53 6d 61 72 74 43 61 72   (GoogleSmartCar
2540: 64 2e 49 53 5f 44 45 42 55 47 5f 42 55 49 4c 44  d.IS_DEBUG_BUILD
2550: 29 20 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c  ) {....console.l
2560: 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 54 68 72  og("[cackey] Thr
2570: 6f 77 6e 2e 22 29 3b 0a 09 09 7d 0a 09 7d 29 3b  own.");...}..});
2580: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
2590: 0a 20 2a 20 55 6e 69 74 69 74 61 6c 69 7a 65 73  . * Unititalizes
25a0: 20 74 68 65 20 43 41 43 4b 65 79 20 50 43 53 43   the CACKey PCSC
25b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 2f 0a   connection. */.
25c0: 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 55  function cackeyU
25d0: 6e 69 6e 69 74 50 43 53 43 28 29 20 7b 0a 09 63  ninitPCSC() {..c
25e0: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63  onsole.log("[cac
25f0: 6b 65 79 5d 20 63 61 63 6b 65 79 55 6e 69 6e 69  key] cackeyUnini
2600: 74 50 43 53 43 28 29 20 63 61 6c 6c 65 64 22 29  tPCSC() called")
2610: 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 50 43  ;...if (cackeyPC
2620: 53 43 48 61 6e 64 6c 65 20 21 3d 20 6e 75 6c 6c  SCHandle != null
2630: 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f  ) {...console.lo
2640: 67 28 22 5b 63 61 63 6b 65 79 5d 20 44 65 6c 65  g("[cackey] Dele
2650: 74 69 6e 67 20 50 43 53 43 20 68 61 6e 64 6c 65  ting PCSC handle
2660: 22 29 3b 0a 0a 09 09 64 65 6c 65 74 65 20 63 61  ");....delete ca
2670: 63 6b 65 79 50 43 53 43 48 61 6e 64 6c 65 3b 0a  ckeyPCSCHandle;.
2680: 0a 09 09 63 61 63 6b 65 79 50 43 53 43 48 61 6e  ...cackeyPCSCHan
2690: 64 6c 65 20 3d 20 6e 75 6c 6c 3b 0a 09 7d 0a 0a  dle = null;..}..
26a0: 09 63 61 63 6b 65 79 50 43 53 43 48 61 6e 64 6c  .cackeyPCSCHandl
26b0: 65 55 73 61 62 6c 65 20 3d 20 66 61 6c 73 65 3b  eUsable = false;
26c0: 0a 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22  ...console.log("
26d0: 5b 63 61 63 6b 65 79 5d 20 63 61 63 6b 65 79 55  [cackey] cackeyU
26e0: 6e 69 6e 69 74 50 43 53 43 28 29 20 72 65 74 75  ninitPCSC() retu
26f0: 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72  rning");...retur
2700: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 6e 69 6e  n;.}../*. * Unin
2710: 69 74 69 61 6c 69 7a 65 73 20 43 41 43 4b 65 79  itializes CACKey
2720: 20 28 70 72 6f 62 61 62 6c 79 20 64 75 65 20 74   (probably due t
2730: 6f 20 61 20 63 72 61 73 68 29 0a 20 2a 2f 0a 66  o a crash). */.f
2740: 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 55 6e  unction cackeyUn
2750: 69 6e 69 74 28 29 20 7b 0a 09 63 6f 6e 73 6f 6c  init() {..consol
2760: 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20  e.log("[cackey] 
2770: 63 61 63 6b 65 79 55 6e 69 6e 69 74 28 29 20 63  cackeyUninit() c
2780: 61 6c 6c 65 64 22 29 3b 0a 0a 09 69 66 20 28 63  alled");...if (c
2790: 68 72 6f 6d 65 2e 63 65 72 74 69 66 69 63 61 74  hrome.certificat
27a0: 65 50 72 6f 76 69 64 65 72 29 20 7b 0a 09 09 63  eProvider) {...c
27b0: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63  onsole.log("[cac
27c0: 6b 65 79 5d 20 55 6e 72 65 67 69 73 74 65 72 65  key] Unregistere
27d0: 64 20 43 68 72 6f 6d 65 20 63 65 72 74 69 66 69  d Chrome certifi
27e0: 63 61 74 65 20 68 61 6e 64 6c 65 72 73 22 29 3b  cate handlers");
27f0: 0a 0a 09 09 63 68 72 6f 6d 65 2e 63 65 72 74 69  ....chrome.certi
2800: 66 69 63 61 74 65 50 72 6f 76 69 64 65 72 2e 6f  ficateProvider.o
2810: 6e 43 65 72 74 69 66 69 63 61 74 65 73 52 65 71  nCertificatesReq
2820: 75 65 73 74 65 64 2e 72 65 6d 6f 76 65 4c 69 73  uested.removeLis
2830: 74 65 6e 65 72 28 63 61 63 6b 65 79 4c 69 73 74  tener(cackeyList
2840: 43 65 72 74 69 66 69 63 61 74 65 73 29 3b 0a 09  Certificates);..
2850: 09 63 68 72 6f 6d 65 2e 63 65 72 74 69 66 69 63  .chrome.certific
2860: 61 74 65 50 72 6f 76 69 64 65 72 2e 6f 6e 53 69  ateProvider.onSi
2870: 67 6e 44 69 67 65 73 74 52 65 71 75 65 73 74 65  gnDigestRequeste
2880: 64 2e 72 65 6d 6f 76 65 4c 69 73 74 65 6e 65 72  d.removeListener
2890: 28 63 61 63 6b 65 79 53 69 67 6e 4d 65 73 73 61  (cackeySignMessa
28a0: 67 65 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ge);..}...cackey
28b0: 55 6e 69 6e 69 74 50 43 53 43 28 29 3b 0a 0a 09  UninitPCSC();...
28c0: 69 66 20 28 63 61 63 6b 65 79 48 61 6e 64 6c 65  if (cackeyHandle
28d0: 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09 63 6f   != null) {...co
28e0: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b  nsole.log("[cack
28f0: 65 79 5d 20 44 65 6c 65 74 69 6e 67 20 50 4e 61  ey] Deleting PNa
2900: 43 6c 20 6d 6f 64 75 6c 65 22 29 3b 0a 0a 09 09  Cl module");....
2910: 74 72 79 20 7b 0a 09 09 09 64 6f 63 75 6d 65 6e  try {....documen
2920: 74 2e 62 6f 64 79 2e 72 65 6d 6f 76 65 43 68 69  t.body.removeChi
2930: 6c 64 28 63 61 63 6b 65 79 48 61 6e 64 6c 65 29  ld(cackeyHandle)
2940: 3b 0a 09 09 7d 20 63 61 74 63 68 20 28 65 29 20  ;...} catch (e) 
2950: 7b 20 7d 0a 0a 09 09 64 65 6c 65 74 65 20 63 61  { }....delete ca
2960: 63 6b 65 79 48 61 6e 64 6c 65 3b 0a 0a 09 09 63  ckeyHandle;....c
2970: 61 63 6b 65 79 48 61 6e 64 6c 65 20 3d 20 6e 75  ackeyHandle = nu
2980: 6c 6c 3b 0a 09 7d 0a 0a 09 63 6f 6e 73 6f 6c 65  ll;..}...console
2990: 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 63  .log("[cackey] c
29a0: 61 63 6b 65 79 55 6e 69 6e 69 74 28 29 20 63 6f  ackeyUninit() co
29b0: 6d 70 6c 65 74 65 22 29 3b 0a 0a 09 72 65 74 75  mplete");...retu
29c0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 52 65 73  rn;.}../*. * Res
29d0: 74 61 72 74 73 20 43 41 43 4b 65 79 0a 20 2a 2f  tarts CACKey. */
29e0: 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79  .function cackey
29f0: 52 65 73 74 61 72 74 28 29 20 7b 0a 09 63 61 63  Restart() {..cac
2a00: 6b 65 79 55 6e 69 6e 69 74 28 29 3b 0a 09 63 61  keyUninit();..ca
2a10: 63 6b 65 79 49 6e 69 74 28 29 3b 0a 0a 09 72 65  ckeyInit();...re
2a20: 74 75 72 6e 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  turn;.}..functio
2a30: 6e 20 63 61 63 6b 65 79 49 6e 69 74 47 6c 6f 62  n cackeyInitGlob
2a40: 61 6c 53 74 61 74 65 28 29 20 7b 0a 09 63 61 63  alState() {..cac
2a50: 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43 61  keyOutstandingCa
2a60: 6c 6c 62 61 63 6b 73 20 3d 20 7b 7d 3b 0a 7d 3b  llbacks = {};.};
2a70: 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65 20 61  ../*. * Handle a
2a80: 20 43 41 43 4b 65 79 20 63 72 61 73 68 20 28 70   CACKey crash (p
2a90: 72 6f 62 61 62 6c 79 20 64 75 65 20 74 6f 20 6c  robably due to l
2aa0: 6f 73 73 20 6f 66 20 63 6f 6e 6e 65 63 74 69 76  oss of connectiv
2ab0: 69 74 79 20 74 6f 20 74 68 65 20 50 43 53 43 20  ity to the PCSC 
2ac0: 64 61 65 6d 6f 6e 29 0a 20 2a 2f 0a 66 75 6e 63  daemon). */.func
2ad0: 74 69 6f 6e 20 63 61 63 6b 65 79 43 72 61 73 68  tion cackeyCrash
2ae0: 28 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 65 2d  () {../*.. * De-
2af0: 69 6e 69 74 69 61 6c 69 7a 65 20 43 41 43 4b 65  initialize CACKe
2b00: 79 0a 09 20 2a 2f 0a 09 63 61 63 6b 65 79 55 6e  y.. */..cackeyUn
2b10: 69 6e 69 74 28 29 3b 0a 0a 09 2f 2a 0a 09 20 2a  init();.../*.. *
2b20: 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 67 6c   Reinitialize gl
2b30: 6f 62 61 6c 20 73 74 61 74 65 0a 09 20 2a 2f 0a  obal state.. */.
2b40: 09 63 61 63 6b 65 79 49 6e 69 74 47 6c 6f 62 61  .cackeyInitGloba
2b50: 6c 53 74 61 74 65 28 29 3b 0a 0a 09 2f 2a 0a 09  lState();.../*..
2b60: 20 2a 20 53 63 68 65 64 75 6c 65 20 74 68 65 20   * Schedule the 
2b70: 72 65 73 74 61 72 74 20 74 6f 20 6f 63 63 75 72  restart to occur
2b80: 20 69 6e 20 33 30 20 73 65 63 6f 6e 64 73 20 69   in 30 seconds i
2b90: 6e 20 63 61 73 65 20 77 65 20 72 65 61 6c 6c 79  n case we really
2ba0: 20 61 72 65 0a 09 20 2a 20 6e 6f 74 20 77 6f 72   are.. * not wor
2bb0: 6b 69 6e 67 2e 0a 09 20 2a 2f 0a 09 73 65 74 54  king... */..setT
2bc0: 69 6d 65 6f 75 74 28 63 61 63 6b 65 79 49 6e 69  imeout(cackeyIni
2bd0: 74 2c 20 33 30 30 30 30 29 3b 0a 0a 09 72 65 74  t, 30000);...ret
2be0: 75 72 6e 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e  urn;.}..function
2bf0: 20 63 61 63 6b 65 79 49 6e 69 74 50 43 53 43 43   cackeyInitPCSCC
2c00: 6f 6d 70 6c 65 74 65 64 28 29 20 7b 0a 09 76 61  ompleted() {..va
2c10: 72 20 69 64 78 3b 0a 0a 09 63 61 63 6b 65 79 50  r idx;...cackeyP
2c20: 43 53 43 48 61 6e 64 6c 65 55 73 61 62 6c 65 20  CSCHandleUsable 
2c30: 3d 20 74 72 75 65 3b 0a 0a 09 66 6f 72 20 28 69  = true;...for (i
2c40: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 61  dx = 0; idx < ca
2c50: 63 6b 65 79 43 61 6c 6c 62 61 63 6b 41 66 74 65  ckeyCallbackAfte
2c60: 72 49 6e 69 74 2e 6c 65 6e 67 74 68 3b 20 69 64  rInit.length; id
2c70: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61  x++) {...if (!ca
2c80: 63 6b 65 79 43 61 6c 6c 62 61 63 6b 41 66 74 65  ckeyCallbackAfte
2c90: 72 49 6e 69 74 5b 69 64 78 5d 29 20 7b 0a 09 09  rInit[idx]) {...
2ca0: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
2cb0: 09 09 63 61 63 6b 65 79 43 61 6c 6c 62 61 63 6b  ..cackeyCallback
2cc0: 41 66 74 65 72 49 6e 69 74 5b 69 64 78 5d 28 29  AfterInit[idx]()
2cd0: 3b 0a 09 7d 0a 0a 09 64 65 6c 65 74 65 20 63 61  ;..}...delete ca
2ce0: 63 6b 65 79 43 61 6c 6c 62 61 63 6b 41 66 74 65  ckeyCallbackAfte
2cf0: 72 49 6e 69 74 3b 0a 0a 09 63 61 63 6b 65 79 43  rInit;...cackeyC
2d00: 61 6c 6c 62 61 63 6b 41 66 74 65 72 49 6e 69 74  allbackAfterInit
2d10: 20 3d 20 5b 5d 3b 0a 0a 09 72 65 74 75 72 6e 3b   = [];...return;
2d20: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 49 6e 69 74 69 61  .}../*. * Initia
2d30: 6c 69 7a 65 20 74 68 65 20 50 43 53 43 20 63 6f  lize the PCSC co
2d40: 6e 6e 65 63 74 69 6f 6e 0a 20 2a 2f 0a 66 75 6e  nnection. */.fun
2d50: 63 74 69 6f 6e 20 63 61 63 6b 65 79 49 6e 69 74  ction cackeyInit
2d60: 50 43 53 43 28 63 61 6c 6c 62 61 63 6b 41 66 74  PCSC(callbackAft
2d70: 65 72 49 6e 69 74 29 20 7b 0a 09 2f 2a 0a 09 20  erInit) {../*.. 
2d80: 2a 20 53 74 61 72 74 20 74 68 65 20 47 6f 6f 67  * Start the Goog
2d90: 6c 65 20 50 43 53 43 20 49 6e 74 65 72 66 61 63  le PCSC Interfac
2da0: 65 0a 09 20 2a 2f 0a 0a 09 63 6f 6e 73 6f 6c 65  e.. */...console
2db0: 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 63  .log("[cackey] c
2dc0: 61 63 6b 65 79 49 6e 69 74 50 43 53 43 28 29 20  ackeyInitPCSC() 
2dd0: 63 61 6c 6c 65 64 22 29 3b 0a 0a 09 2f 2a 0a 09  called");.../*..
2de0: 20 2a 20 51 75 65 75 65 20 74 68 69 73 20 63 61   * Queue this ca
2df0: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 63 6f 6d  llback to be com
2e00: 70 6c 65 74 65 64 20 77 68 65 6e 20 69 6e 69 74  pleted when init
2e10: 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  ialization is co
2e20: 6d 70 6c 65 74 65 0a 09 20 2a 2f 0a 09 69 66 20  mplete.. */..if 
2e30: 28 63 61 6c 6c 62 61 63 6b 41 66 74 65 72 49 6e  (callbackAfterIn
2e40: 69 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 43 61  it) {...cackeyCa
2e50: 6c 6c 62 61 63 6b 41 66 74 65 72 49 6e 69 74 2e  llbackAfterInit.
2e60: 70 75 73 68 28 63 61 6c 6c 62 61 63 6b 41 66 74  push(callbackAft
2e70: 65 72 49 6e 69 74 29 3b 0a 09 7d 0a 0a 09 2f 2a  erInit);..}.../*
2e80: 0a 09 20 2a 20 4e 6f 20 61 64 64 69 74 69 6f 6e  .. * No addition
2e90: 61 6c 20 77 6f 72 6b 20 69 73 20 72 65 71 75 69  al work is requi
2ea0: 72 65 64 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 63  red.. */...if (c
2eb0: 61 63 6b 65 79 50 43 53 43 48 61 6e 64 6c 65 29  ackeyPCSCHandle)
2ec0: 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67   {...console.log
2ed0: 28 22 5b 63 61 63 6b 65 79 5d 20 50 43 53 43 20  ("[cackey] PCSC 
2ee0: 68 61 6e 64 6c 65 20 69 73 20 61 6c 72 65 61 64  handle is alread
2ef0: 79 20 76 61 6c 69 64 2c 20 6e 6f 74 68 69 6e 67  y valid, nothing
2f00: 20 74 6f 20 64 6f 2e 22 29 3b 0a 0a 09 09 69 66   to do.");....if
2f10: 20 28 63 61 63 6b 65 79 50 43 53 43 48 61 6e 64   (cackeyPCSCHand
2f20: 6c 65 55 73 61 62 6c 65 29 20 7b 0a 09 09 09 63  leUsable) {....c
2f30: 61 63 6b 65 79 49 6e 69 74 50 43 53 43 43 6f 6d  ackeyInitPCSCCom
2f40: 70 6c 65 74 65 64 28 29 3b 0a 09 09 7d 0a 0a 09  pleted();...}...
2f50: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 2f 2a  .return;..}.../*
2f60: 0a 09 20 2a 20 53 61 6e 65 6c 79 20 69 6e 69 74  .. * Sanely init
2f70: 69 61 6c 69 7a 65 20 74 68 69 73 0a 09 20 2a 2f  ialize this.. */
2f80: 0a 09 63 61 63 6b 65 79 50 43 53 43 48 61 6e 64  ..cackeyPCSCHand
2f90: 6c 65 55 73 61 62 6c 65 20 3d 20 66 61 6c 73 65  leUsable = false
2fa0: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 49 6e 69 74 69  ;.../*.. * Initi
2fb0: 61 6c 69 7a 65 20 74 68 65 20 43 41 43 4b 65 79  alize the CACKey
2fc0: 20 50 4e 61 43 6c 20 6d 6f 64 75 6c 65 20 69 66   PNaCl module if
2fd0: 20 6e 65 65 64 65 64 0a 09 20 2a 2f 0a 09 69 66   needed.. */..if
2fe0: 20 28 63 61 63 6b 65 79 48 61 6e 64 6c 65 20 3d   (cackeyHandle =
2ff0: 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09 63 61 63 6b  = null) {...cack
3000: 65 79 49 6e 69 74 28 29 3b 0a 09 7d 0a 0a 09 2f  eyInit();..}.../
3010: 2a 0a 09 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65  *.. * Initialize
3020: 20 43 41 43 4b 65 79 20 77 69 74 68 20 74 68 65   CACKey with the
3030: 20 63 6f 72 72 65 63 74 20 68 61 6e 64 6c 65 20   correct handle 
3040: 74 6f 20 74 61 6c 6b 20 74 6f 20 74 68 65 20 47  to talk to the G
3050: 6f 6f 67 6c 65 20 53 6d 61 72 74 63 61 72 64 20  oogle Smartcard 
3060: 4d 61 6e 61 67 65 72 20 41 70 70 0a 09 20 2a 2f  Manager App.. */
3070: 0a 09 63 61 63 6b 65 79 48 61 6e 64 6c 65 2e 70  ..cackeyHandle.p
3080: 6f 73 74 4d 65 73 73 61 67 65 28 0a 09 09 7b 0a  ostMessage(...{.
3090: 09 09 09 22 74 61 72 67 65 74 22 3a 20 22 63 61  ..."target": "ca
30a0: 63 6b 65 79 22 2c 0a 09 09 09 22 63 6f 6d 6d 61  ckey",...."comma
30b0: 6e 64 22 3a 20 22 69 6e 69 74 22 2c 0a 09 09 09  nd": "init",....
30c0: 22 73 6d 61 72 74 63 61 72 64 4d 61 6e 61 67 65  "smartcardManage
30d0: 72 41 70 70 49 64 22 3a 20 22 6b 68 70 66 65 61  rAppId": "khpfea
30e0: 61 6e 6a 6e 67 6d 63 6e 70 6c 62 64 6c 70 65 67  anjngmcnplbdlpeg
30f0: 69 69 66 67 70 66 67 64 63 6f 22 0a 09 09 7d 0a  iifgpfgdco"...}.
3100: 09 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 49 6e 69  .);.../*.. * Ini
3110: 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 53 43  tialize the PCSC
3120: 20 4e 61 43 6c 20 69 6e 74 65 72 66 61 63 65 0a   NaCl interface.
3130: 09 20 2a 2f 0a 09 63 61 63 6b 65 79 50 43 53 43  . */..cackeyPCSC
3140: 48 61 6e 64 6c 65 20 3d 20 6e 65 77 20 47 6f 6f  Handle = new Goo
3150: 67 6c 65 53 6d 61 72 74 43 61 72 64 2e 50 63 73  gleSmartCard.Pcs
3160: 63 4e 61 63 6c 28 63 61 63 6b 65 79 48 61 6e 64  cNacl(cackeyHand
3170: 6c 65 29 3b 0a 0a 09 63 6f 6e 73 6f 6c 65 2e 6c  le);...console.l
3180: 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 63 61 63  og("[cackey] cac
3190: 6b 65 79 49 6e 69 74 50 43 53 43 28 29 20 63 6f  keyInitPCSC() co
31a0: 6d 70 6c 65 74 65 22 29 3b 0a 0a 09 72 65 74 75  mplete");...retu
31b0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69 6e  rn;.}../*. * Fin
31c0: 69 73 68 20 70 65 72 66 6f 72 6d 69 6e 67 20 69  ish performing i
31d0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 68  nitialization th
31e0: 61 74 20 6d 75 73 74 20 77 61 69 74 20 75 6e 74  at must wait unt
31f0: 69 6c 20 77 65 20 68 61 76 65 20 6c 6f 61 64 65  il we have loade
3200: 64 20 74 68 65 20 43 41 43 4b 65 79 20 6d 6f 64  d the CACKey mod
3210: 75 6c 65 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e  ule. */.function
3220: 20 63 61 63 6b 65 79 49 6e 69 74 4c 6f 61 64 65   cackeyInitLoade
3230: 64 28 6d 65 73 73 61 67 65 45 76 65 6e 74 29 20  d(messageEvent) 
3240: 7b 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22  {..console.log("
3250: 5b 63 61 63 6b 65 79 5d 20 4c 6f 61 64 65 64 20  [cackey] Loaded 
3260: 43 41 43 4b 65 79 20 50 4e 61 43 6c 20 4d 6f 64  CACKey PNaCl Mod
3270: 75 6c 65 22 29 3b 0a 0a 09 2f 2a 20 52 65 67 69  ule");.../* Regi
3280: 73 74 65 72 20 6c 69 73 74 65 6e 65 72 73 20 77  ster listeners w
3290: 69 74 68 20 43 68 72 6f 6d 65 20 2a 2f 0a 09 69  ith Chrome */..i
32a0: 66 20 28 63 68 72 6f 6d 65 2e 63 65 72 74 69 66  f (chrome.certif
32b0: 69 63 61 74 65 50 72 6f 76 69 64 65 72 29 20 7b  icateProvider) {
32c0: 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22  ...console.log("
32d0: 5b 63 61 63 6b 65 79 5d 20 52 65 67 69 73 74 65  [cackey] Registe
32e0: 72 65 64 20 43 65 72 74 69 66 69 63 61 74 65 20  red Certificate 
32f0: 68 61 6e 64 6c 65 72 73 20 77 69 74 68 20 43 68  handlers with Ch
3300: 72 6f 6d 65 22 29 3b 0a 0a 09 09 63 68 72 6f 6d  rome");....chrom
3310: 65 2e 63 65 72 74 69 66 69 63 61 74 65 50 72 6f  e.certificatePro
3320: 76 69 64 65 72 2e 6f 6e 43 65 72 74 69 66 69 63  vider.onCertific
3330: 61 74 65 73 52 65 71 75 65 73 74 65 64 2e 61 64  atesRequested.ad
3340: 64 4c 69 73 74 65 6e 65 72 28 63 61 63 6b 65 79  dListener(cackey
3350: 4c 69 73 74 43 65 72 74 69 66 69 63 61 74 65 73  ListCertificates
3360: 29 3b 0a 09 09 63 68 72 6f 6d 65 2e 63 65 72 74  );...chrome.cert
3370: 69 66 69 63 61 74 65 50 72 6f 76 69 64 65 72 2e  ificateProvider.
3380: 6f 6e 53 69 67 6e 44 69 67 65 73 74 52 65 71 75  onSignDigestRequ
3390: 65 73 74 65 64 2e 61 64 64 4c 69 73 74 65 6e 65  ested.addListene
33a0: 72 28 63 61 63 6b 65 79 53 69 67 6e 4d 65 73 73  r(cackeySignMess
33b0: 61 67 65 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  age);..}...retur
33c0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 49 6e 69 74  n;.}../*. * Init
33d0: 69 61 6c 69 7a 65 20 43 41 43 4b 65 79 20 61 6e  ialize CACKey an
33e0: 64 20 74 68 65 20 50 43 53 43 20 6c 69 62 72 61  d the PCSC libra
33f0: 72 79 20 66 72 6f 6d 20 47 6f 6f 67 6c 65 0a 20  ry from Google. 
3400: 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b  */.function cack
3410: 65 79 49 6e 69 74 28 29 20 7b 0a 09 76 61 72 20  eyInit() {..var 
3420: 65 6c 65 6d 65 6e 74 45 6d 62 65 64 3b 0a 09 76  elementEmbed;..v
3430: 61 72 20 66 6f 72 63 65 4c 6f 61 64 45 6c 65 6d  ar forceLoadElem
3440: 65 6e 74 3b 0a 0a 09 2f 2a 20 4c 6f 67 20 74 68  ent;.../* Log th
3450: 61 74 20 77 65 20 61 72 65 20 6f 70 65 72 61 74  at we are operat
3460: 69 6f 6e 61 6c 20 2a 2f 0a 09 63 6f 6e 73 6f 6c  ional */..consol
3470: 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20  e.log("[cackey] 
3480: 63 61 63 6b 65 79 49 6e 69 74 28 29 3a 20 43 61  cackeyInit(): Ca
3490: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 0a 09 20  lled.");.../*.. 
34a0: 2a 20 44 6f 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * Do not initial
34b0: 69 7a 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ize multiple tim
34c0: 65 73 0a 09 20 2a 2f 0a 09 69 66 20 28 63 61 63  es.. */..if (cac
34d0: 6b 65 79 48 61 6e 64 6c 65 20 21 3d 20 6e 75 6c  keyHandle != nul
34e0: 6c 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c  l) {...console.l
34f0: 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 63 61 63  og("[cackey] cac
3500: 6b 65 79 49 6e 69 74 28 29 3a 20 41 6c 72 65 61  keyInit(): Alrea
3510: 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  dy initialized. 
3520: 20 52 65 74 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a   Returning.");..
3530: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 2f  ..return;..}.../
3540: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 77 65  * Verify that we
3550: 20 63 61 6e 20 72 65 67 69 73 74 65 72 20 63 61   can register ca
3560: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 69 66 20 28  llbacks */..if (
3570: 21 63 68 72 6f 6d 65 2e 63 65 72 74 69 66 69 63  !chrome.certific
3580: 61 74 65 50 72 6f 76 69 64 65 72 29 20 7b 0a 09  ateProvider) {..
3590: 09 69 66 20 28 21 47 6f 6f 67 6c 65 53 6d 61 72  .if (!GoogleSmar
35a0: 74 43 61 72 64 2e 49 53 5f 44 45 42 55 47 5f 42  tCard.IS_DEBUG_B
35b0: 55 49 4c 44 29 20 7b 0a 09 09 09 63 6f 6e 73 6f  UILD) {....conso
35c0: 6c 65 2e 65 72 72 6f 72 28 22 5b 63 61 63 6b 65  le.error("[cacke
35d0: 79 5d 20 54 68 69 73 20 65 78 74 65 6e 73 69 6f  y] This extensio
35e0: 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20  n only works on 
35f0: 43 68 72 6f 6d 65 4f 53 21 22 29 3b 0a 0a 09 09  ChromeOS!");....
3600: 09 72 65 74 75 72 6e 3b 0a 09 09 7d 20 65 6c 73  .return;...} els
3610: 65 20 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c  e {....console.l
3620: 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 54 68 69  og("[cackey] Thi
3630: 73 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79  s extension only
3640: 20 77 6f 72 6b 73 20 6f 6e 20 43 68 72 6f 6d 65   works on Chrome
3650: 4f 53 2c 20 62 75 74 20 79 6f 75 20 61 70 70 65  OS, but you appe
3660: 61 72 20 74 6f 20 62 65 20 64 65 62 75 67 67 69  ar to be debuggi
3670: 6e 67 20 69 74 20 2d 2d 20 74 72 79 69 6e 67 20  ng it -- trying 
3680: 61 6e 79 77 61 79 2e 22 29 3b 0a 09 09 7d 0a 09  anyway.");...}..
3690: 7d 0a 0a 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64  }...elementEmbed
36a0: 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 63 72 65 61   = document.crea
36b0: 74 65 45 6c 65 6d 65 6e 74 28 27 65 6d 62 65 64  teElement('embed
36c0: 27 29 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d 62 65  ');..elementEmbe
36d0: 64 2e 74 79 70 65 20 3d 20 22 61 70 70 6c 69 63  d.type = "applic
36e0: 61 74 69 6f 6e 2f 78 2d 70 6e 61 63 6c 22 3b 0a  ation/x-pnacl";.
36f0: 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64 2e 77 69  .elementEmbed.wi
3700: 64 74 68 20 3d 20 30 3b 0a 09 65 6c 65 6d 65 6e  dth = 0;..elemen
3710: 74 45 6d 62 65 64 2e 68 65 69 67 68 74 20 3d 20  tEmbed.height = 
3720: 30 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64  0;..elementEmbed
3730: 2e 73 72 63 20 3d 20 22 63 61 63 6b 65 79 2e 6e  .src = "cackey.n
3740: 6d 66 22 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d 62  mf";..elementEmb
3750: 65 64 2e 69 64 20 3d 20 22 63 61 63 6b 65 79 4d  ed.id = "cackeyM
3760: 6f 64 75 6c 65 22 3b 0a 09 65 6c 65 6d 65 6e 74  odule";..element
3770: 45 6d 62 65 64 2e 61 64 64 45 76 65 6e 74 4c 69  Embed.addEventLi
3780: 73 74 65 6e 65 72 28 27 65 72 72 6f 72 27 2c 20  stener('error', 
3790: 66 75 6e 63 74 69 6f 6e 28 6d 65 73 73 61 67 65  function(message
37a0: 45 76 65 6e 74 29 20 7b 20 63 6f 6e 73 6f 6c 65  Event) { console
37b0: 2e 65 72 72 6f 72 28 22 45 72 72 6f 72 20 6c 6f  .error("Error lo
37c0: 61 64 69 6e 67 20 43 41 43 4b 65 79 20 50 4e 61  ading CACKey PNa
37d0: 43 6c 20 4d 6f 64 75 6c 65 3a 20 22 20 2b 20 6d  Cl Module: " + m
37e0: 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61  essageEvent.data
37f0: 29 3b 20 7d 2c 20 74 72 75 65 29 3b 0a 09 65 6c  ); }, true);..el
3800: 65 6d 65 6e 74 45 6d 62 65 64 2e 61 64 64 45 76  ementEmbed.addEv
3810: 65 6e 74 4c 69 73 74 65 6e 65 72 28 27 6c 6f 61  entListener('loa
3820: 64 27 2c 20 63 61 63 6b 65 79 49 6e 69 74 4c 6f  d', cackeyInitLo
3830: 61 64 65 64 2c 20 74 72 75 65 29 3b 0a 09 65 6c  aded, true);..el
3840: 65 6d 65 6e 74 45 6d 62 65 64 2e 61 64 64 45 76  ementEmbed.addEv
3850: 65 6e 74 4c 69 73 74 65 6e 65 72 28 27 63 72 61  entListener('cra
3860: 73 68 27 2c 20 63 61 63 6b 65 79 43 72 61 73 68  sh', cackeyCrash
3870: 2c 20 74 72 75 65 29 3b 0a 09 65 6c 65 6d 65 6e  , true);..elemen
3880: 74 45 6d 62 65 64 2e 61 64 64 45 76 65 6e 74 4c  tEmbed.addEventL
3890: 69 73 74 65 6e 65 72 28 27 6d 65 73 73 61 67 65  istener('message
38a0: 27 2c 20 63 61 63 6b 65 79 4d 65 73 73 61 67 65  ', cackeyMessage
38b0: 49 6e 63 6f 6d 69 6e 67 2c 20 74 72 75 65 29 3b  Incoming, true);
38c0: 0a 0a 09 63 61 63 6b 65 79 48 61 6e 64 6c 65 20  ...cackeyHandle 
38d0: 3d 20 65 6c 65 6d 65 6e 74 45 6d 62 65 64 3b 0a  = elementEmbed;.
38e0: 0a 09 64 6f 63 75 6d 65 6e 74 2e 62 6f 64 79 2e  ..document.body.
38f0: 61 70 70 65 6e 64 43 68 69 6c 64 28 63 61 63 6b  appendChild(cack
3900: 65 79 48 61 6e 64 6c 65 29 0a 0a 09 2f 2a 0a 09  eyHandle).../*..
3910: 20 2a 20 46 6f 72 63 65 20 74 68 65 20 62 72 6f   * Force the bro
3920: 77 73 65 72 20 74 6f 20 6c 6f 61 64 20 74 68 65  wser to load the
3930: 20 65 6c 65 6d 65 6e 74 0a 09 20 2a 20 62 79 20   element.. * by 
3940: 72 65 71 75 65 73 74 69 6e 67 20 69 74 73 20 70  requesting its p
3950: 6f 73 69 74 69 6f 6e 0a 09 20 2a 2f 0a 09 66 6f  osition.. */..fo
3960: 72 63 65 4c 6f 61 64 45 6c 65 6d 65 6e 74 20 3d  rceLoadElement =
3970: 20 63 61 63 6b 65 79 48 61 6e 64 6c 65 2e 6f 66   cackeyHandle.of
3980: 66 73 65 74 54 6f 70 3b 0a 0a 09 63 6f 6e 73 6f  fsetTop;...conso
3990: 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d  le.log("[cackey]
39a0: 20 63 61 63 6b 65 79 49 6e 69 74 28 29 3a 20 43   cackeyInit(): C
39b0: 6f 6d 70 6c 65 74 65 64 2e 20 20 52 65 74 75 72  ompleted.  Retur
39c0: 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72  ning.");...retur
39d0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 49 6e 69 74  n;.}../*. * Init
39e0: 69 61 6c 69 7a 65 20 74 68 65 20 43 41 43 4b 65  ialize the CACKe
39f0: 79 20 43 68 72 6f 6d 65 20 41 70 70 6c 69 63 61  y Chrome Applica
3a00: 74 69 6f 6e 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f  tion. */.functio
3a10: 6e 20 63 61 63 6b 65 79 41 70 70 49 6e 69 74 28  n cackeyAppInit(
3a20: 29 20 7b 0a 09 76 61 72 20 6f 6c 64 4f 6e 50 6f  ) {..var oldOnPo
3a30: 72 74 44 69 73 63 6f 6e 6e 65 63 74 65 64 46 75  rtDisconnectedFu
3a40: 6e 63 74 69 6f 6e 3b 0a 09 76 61 72 20 6f 6c 64  nction;..var old
3a50: 50 43 53 43 49 6e 69 74 69 61 6c 69 7a 61 74 69  PCSCInitializati
3a60: 6f 6e 43 61 6c 6c 62 61 63 6b 3b 0a 0a 09 2f 2a  onCallback;.../*
3a70: 0a 09 20 2a 20 43 72 65 61 74 65 20 61 20 68 61  .. * Create a ha
3a80: 6e 64 6c 65 72 20 66 6f 72 20 73 74 61 72 74 69  ndler for starti
3a90: 6e 67 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  ng the applicati
3aa0: 6f 6e 20 55 49 0a 09 20 2a 2f 0a 09 63 68 72 6f  on UI.. */..chro
3ab0: 6d 65 2e 61 70 70 2e 72 75 6e 74 69 6d 65 2e 6f  me.app.runtime.o
3ac0: 6e 4c 61 75 6e 63 68 65 64 2e 61 64 64 4c 69 73  nLaunched.addLis
3ad0: 74 65 6e 65 72 28 66 75 6e 63 74 69 6f 6e 28 29  tener(function()
3ae0: 20 7b 0a 09 09 63 68 72 6f 6d 65 2e 61 70 70 2e   {...chrome.app.
3af0: 77 69 6e 64 6f 77 2e 63 72 65 61 74 65 28 27 75  window.create('u
3b00: 69 2e 68 74 6d 6c 27 2c 20 7b 0a 09 09 09 22 69  i.html', {...."i
3b10: 64 22 3a 20 22 63 61 63 6b 65 79 55 49 22 2c 0a  d": "cackeyUI",.
3b20: 09 09 09 22 66 6f 63 75 73 65 64 22 3a 20 74 72  ..."focused": tr
3b30: 75 65 2c 0a 09 09 09 22 69 6e 6e 65 72 42 6f 75  ue,...."innerBou
3b40: 6e 64 73 22 3a 20 7b 0a 09 09 09 09 22 77 69 64  nds": {....."wid
3b50: 74 68 22 3a 20 33 35 30 2c 0a 09 09 09 09 22 6d  th": 350,....."m
3b60: 69 6e 57 69 64 74 68 22 3a 20 33 35 30 2c 0a 09  inWidth": 350,..
3b70: 09 09 09 22 68 65 69 67 68 74 22 3a 20 31 33 35  ..."height": 135
3b80: 2c 0a 09 09 09 09 22 6d 69 6e 48 65 69 67 68 74  ,....."minHeight
3b90: 22 3a 20 31 33 35 0a 09 09 09 7d 0a 09 09 7d 2c  ": 135....}...},
3ba0: 20 66 75 6e 63 74 69 6f 6e 28 75 69 57 69 6e 64   function(uiWind
3bb0: 6f 77 29 20 7b 0a 09 09 09 69 66 20 28 21 75 69  ow) {....if (!ui
3bc0: 57 69 6e 64 6f 77 29 20 7b 0a 09 09 09 09 72 65  Window) {.....re
3bd0: 74 75 72 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 75  turn;....}.....u
3be0: 69 57 69 6e 64 6f 77 2e 63 6f 6e 74 65 6e 74 57  iWindow.contentW
3bf0: 69 6e 64 6f 77 2e 70 61 72 65 6e 74 57 69 6e 64  indow.parentWind
3c00: 6f 77 20 3d 20 77 69 6e 64 6f 77 3b 0a 09 09 7d  ow = window;...}
3c10: 29 3b 0a 09 7d 29 3b 0a 0a 09 2f 2a 0a 09 20 2a  );..});.../*.. *
3c20: 20 52 65 67 69 73 74 65 72 20 61 20 68 61 6e 64   Register a hand
3c30: 6c 65 72 20 66 6f 72 20 64 65 61 6c 69 6e 67 20  ler for dealing 
3c40: 77 69 74 68 20 74 68 65 20 50 43 53 43 20 70 6f  with the PCSC po
3c50: 72 74 20 62 65 69 6e 67 20 64 69 73 63 6f 6e 6e  rt being disconn
3c60: 65 63 74 65 64 0a 09 20 2a 2f 0a 09 6f 6c 64 4f  ected.. */..oldO
3c70: 6e 50 6f 72 74 44 69 73 63 6f 6e 6e 65 63 74 65  nPortDisconnecte
3c80: 64 46 75 6e 63 74 69 6f 6e 20 3d 20 47 6f 6f 67  dFunction = Goog
3c90: 6c 65 53 6d 61 72 74 43 61 72 64 2e 50 63 73 63  leSmartCard.Pcsc
3ca0: 2e 70 72 6f 74 6f 74 79 70 65 2e 6f 6e 50 6f 72  .prototype.onPor
3cb0: 74 44 69 73 63 6f 6e 6e 65 63 74 65 64 5f 3b 0a  tDisconnected_;.
3cc0: 09 47 6f 6f 67 6c 65 53 6d 61 72 74 43 61 72 64  .GoogleSmartCard
3cd0: 2e 50 63 73 63 2e 70 72 6f 74 6f 74 79 70 65 2e  .Pcsc.prototype.
3ce0: 6f 6e 50 6f 72 74 44 69 73 63 6f 6e 6e 65 63 74  onPortDisconnect
3cf0: 65 64 5f 20 3d 20 66 75 6e 63 74 69 6f 6e 28 29  ed_ = function()
3d00: 20 7b 0a 09 09 6f 6c 64 4f 6e 50 6f 72 74 44 69   {...oldOnPortDi
3d10: 73 63 6f 6e 6e 65 63 74 65 64 46 75 6e 63 74 69  sconnectedFuncti
3d20: 6f 6e 2e 61 70 70 6c 79 28 74 68 69 73 29 3b 0a  on.apply(this);.
3d30: 0a 09 09 63 61 63 6b 65 79 52 65 73 74 61 72 74  ...cackeyRestart
3d40: 28 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09  ();....return;..
3d50: 7d 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 52 65 67 69  };.../*.. * Regi
3d60: 73 74 65 72 20 61 20 68 61 6e 64 6c 65 72 20 66  ster a handler f
3d70: 6f 72 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  or dealing with 
3d80: 74 68 65 20 50 43 53 43 20 70 6f 72 74 20 62 65  the PCSC port be
3d90: 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 0a 09 20  ing available.. 
3da0: 2a 2f 0a 09 6f 6c 64 50 43 53 43 49 6e 69 74 69  */..oldPCSCIniti
3db0: 61 6c 69 7a 61 74 69 6f 6e 43 61 6c 6c 62 61 63  alizationCallbac
3dc0: 6b 20 3d 20 47 6f 6f 67 6c 65 53 6d 61 72 74 43  k = GoogleSmartC
3dd0: 61 72 64 2e 50 63 73 63 4e 61 63 6c 2e 70 72 6f  ard.PcscNacl.pro
3de0: 74 6f 74 79 70 65 2e 70 63 73 63 49 6e 69 74 69  totype.pcscIniti
3df0: 61 6c 69 7a 61 74 69 6f 6e 43 61 6c 6c 62 61 63  alizationCallbac
3e00: 6b 5f 3b 0a 09 47 6f 6f 67 6c 65 53 6d 61 72 74  k_;..GoogleSmart
3e10: 43 61 72 64 2e 50 63 73 63 4e 61 63 6c 2e 70 72  Card.PcscNacl.pr
3e20: 6f 74 6f 74 79 70 65 2e 70 63 73 63 49 6e 69 74  ototype.pcscInit
3e30: 69 61 6c 69 7a 61 74 69 6f 6e 43 61 6c 6c 62 61  ializationCallba
3e40: 63 6b 5f 20 3d 20 66 75 6e 63 74 69 6f 6e 28 72  ck_ = function(r
3e50: 65 71 75 65 73 74 49 64 2c 20 69 6e 73 74 61 6e  equestId, instan
3e60: 63 65 49 64 2c 20 69 6e 73 74 61 6e 63 65 2c 20  ceId, instance, 
3e70: 65 72 72 6f 72 29 20 7b 0a 09 09 6f 6c 64 50 43  error) {...oldPC
3e80: 53 43 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  SCInitialization
3e90: 43 61 6c 6c 62 61 63 6b 2e 61 70 70 6c 79 28 74  Callback.apply(t
3ea0: 68 69 73 2c 20 5b 72 65 71 75 65 73 74 49 64 2c  his, [requestId,
3eb0: 20 69 6e 73 74 61 6e 63 65 49 64 2c 20 69 6e 73   instanceId, ins
3ec0: 74 61 6e 63 65 2c 20 65 72 72 6f 72 5d 29 3b 0a  tance, error]);.
3ed0: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 3b 0a 0a  ...return;..};..
3ee0: 09 2f 2a 0a 09 20 2a 20 49 6e 69 74 69 61 6c 69  ./*.. * Initiali
3ef0: 7a 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 0a  ze global state.
3f00: 09 20 2a 2f 0a 09 63 61 63 6b 65 79 49 6e 69 74  . */..cackeyInit
3f10: 47 6c 6f 62 61 6c 53 74 61 74 65 28 29 3b 0a 0a  GlobalState();..
3f20: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49  .return;.}../* I
3f30: 6e 69 74 69 61 6c 69 7a 65 20 43 41 43 4b 65 79  nitialize CACKey
3f40: 20 2a 2f 0a 63 61 63 6b 65 79 41 70 70 49 6e 69   */.cackeyAppIni
3f50: 74 28 29 3b 0a 63 61 63 6b 65 79 49 6e 69 74 28  t();.cackeyInit(
3f60: 29 3b 0a                                         );.