Hex Artifact Content

Artifact 3c603656387164b49422fceba2f4439127853ad6:


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 76 61 72 20 63 61 63 6b   false;.var cack
01a0: 65 79 50 43 53 43 48 61 6e 64 6c 65 4c 61 73 74  eyPCSCHandleLast
01b0: 55 73 65 64 20 3d 20 28 6e 65 77 20 44 61 74 65  Used = (new Date
01c0: 28 29 29 2e 67 65 74 54 69 6d 65 28 29 3b 0a 0a  ()).getTime();..
01d0: 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65 20 61 6e 64  /*. * Handle and
01e0: 20 49 44 20 66 6f 72 20 6f 75 74 73 74 61 6e 64   ID for outstand
01f0: 69 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a  ing callbacks. *
0200: 2f 0a 76 61 72 20 63 61 63 6b 65 79 4f 75 74 73  /.var cackeyOuts
0210: 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73  tandingCallbacks
0220: 20 3d 20 7b 7d 0a 76 61 72 20 63 61 63 6b 65 79   = {}.var cackey
0230: 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62  OutstandingCallb
0240: 61 63 6b 43 6f 75 6e 74 65 72 20 3d 20 2d 31 3b  ackCounter = -1;
0250: 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d 6d 75 6e 69 63  ../*. * Communic
0260: 61 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 50  ation with the P
0270: 49 4e 20 65 6e 74 72 79 20 77 69 6e 64 6f 77 0a  IN entry window.
0280: 20 2a 2f 0a 76 61 72 20 70 69 6e 57 69 6e 64 6f   */.var pinWindo
0290: 77 50 49 4e 56 61 6c 75 65 20 3d 20 22 22 3b 0a  wPINValue = "";.
02a0: 76 61 72 20 70 69 6e 57 69 6e 64 6f 77 50 72 65  var pinWindowPre
02b0: 76 69 6f 75 73 48 61 6e 64 6c 65 20 3d 20 6e 75  viousHandle = nu
02c0: 6c 6c 3b 0a 0a 2f 2a 0a 20 2a 20 4d 65 73 73 61  ll;../*. * Messa
02d0: 67 65 73 20 74 68 61 74 20 6d 61 79 20 6e 65 65  ges that may nee
02e0: 64 20 74 6f 20 62 65 20 72 65 74 72 69 65 64 20  d to be retried 
02f0: 61 66 74 65 72 20 67 65 74 74 69 6e 67 20 61 20  after getting a 
0300: 50 49 4e 0a 20 2a 2f 0a 76 61 72 20 63 61 63 6b  PIN. */.var cack
0310: 65 79 4d 65 73 73 61 67 65 73 54 6f 52 65 74 72  eyMessagesToRetr
0320: 79 20 3d 20 5b 5d 3b 0a 0a 2f 2a 0a 20 2a 20 53  y = [];../*. * S
0330: 74 6f 72 65 64 20 50 49 4e 20 66 6f 72 20 61 20  tored PIN for a 
0340: 67 69 76 65 6e 20 63 65 72 74 69 66 69 63 61 74  given certificat
0350: 65 0a 20 2a 2f 0a 76 61 72 20 63 61 63 6b 65 79  e. */.var cackey
0360: 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e  CertificateToPIN
0370: 4d 61 70 20 3d 20 7b 7d 3b 0a 76 61 72 20 63 61  Map = {};.var ca
0380: 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54  ckeyCertificateT
0390: 6f 50 49 4e 4d 61 70 4c 61 73 74 55 73 65 64 52  oPINMapLastUsedR
03a0: 75 6e 6e 65 72 20 3d 20 66 61 6c 73 65 3b 0a 0a  unner = false;..
03b0: 2f 2a 0a 20 2a 20 43 61 6c 6c 62 61 63 6b 73 20  /*. * Callbacks 
03c0: 74 6f 20 70 65 72 66 6f 72 6d 20 61 66 74 65 72  to perform after
03d0: 20 50 43 53 43 20 63 6f 6d 65 73 20 6f 6e 6c 69   PCSC comes onli
03e0: 6e 65 0a 20 2a 2f 0a 63 61 63 6b 65 79 43 61 6c  ne. */.cackeyCal
03f0: 6c 62 61 63 6b 41 66 74 65 72 49 6e 69 74 20 3d  lbackAfterInit =
0400: 20 5b 5d 3b 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d 70   [];../*. * Comp
0410: 75 74 65 20 61 20 74 65 78 74 2d 62 61 73 65 64  ute a text-based
0420: 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 65   handle for a ce
0430: 72 74 69 66 69 63 61 74 65 20 74 6f 20 62 65 20  rtificate to be 
0440: 68 61 73 68 65 64 20 62 79 0a 20 2a 2f 0a 66 75  hashed by. */.fu
0450: 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 43 65 72  nction cackeyCer
0460: 74 69 66 69 63 61 74 65 54 6f 50 49 4e 49 44 28  tificateToPINID(
0470: 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09  certificate) {..
0480: 76 61 72 20 69 64 3b 0a 09 76 61 72 20 63 65 72  var id;..var cer
0490: 74 69 66 69 63 61 74 65 41 72 72 61 79 3b 0a 0a  tificateArray;..
04a0: 09 69 64 20 3d 20 22 22 3b 0a 0a 09 63 65 72 74  .id = "";...cert
04b0: 69 66 69 63 61 74 65 41 72 72 61 79 20 3d 20 6e  ificateArray = n
04c0: 65 77 20 55 69 6e 74 38 41 72 72 61 79 28 63 65  ew Uint8Array(ce
04d0: 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 63 65  rtificate);...ce
04e0: 72 74 69 66 69 63 61 74 65 41 72 72 61 79 2e 6d  rtificateArray.m
04f0: 61 70 28 0a 09 09 66 75 6e 63 74 69 6f 6e 28 62  ap(...function(b
0500: 79 74 65 29 20 7b 0a 09 09 09 69 64 20 2b 3d 20  yte) {....id += 
0510: 28 22 30 22 20 2b 20 62 79 74 65 2e 74 6f 53 74  ("0" + byte.toSt
0520: 72 69 6e 67 28 31 36 29 29 2e 73 6c 69 63 65 28  ring(16)).slice(
0530: 2d 32 29 3b 0a 09 09 7d 0a 09 29 3b 0a 0a 09 64  -2);...}..);...d
0540: 65 6c 65 74 65 20 63 65 72 74 69 66 69 63 61 74  elete certificat
0550: 65 41 72 72 61 79 3b 0a 0a 09 72 65 74 75 72 6e  eArray;...return
0560: 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48  (id);.}../*. * H
0570: 61 6e 64 6c 65 20 61 20 72 65 73 70 6f 6e 73 65  andle a response
0580: 20 66 72 6f 6d 20 74 68 65 20 4e 61 43 6c 20 73   from the NaCl s
0590: 69 64 65 20 72 65 67 61 72 64 69 6e 67 20 63 65  ide regarding ce
05a0: 72 74 69 66 69 63 61 74 65 73 20 61 76 61 69 6c  rtificates avail
05b0: 61 62 6c 65 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f  able. */.functio
05c0: 6e 20 63 61 63 6b 65 79 4d 65 73 73 61 67 65 49  n cackeyMessageI
05d0: 6e 63 6f 6d 69 6e 67 4c 69 73 74 43 65 72 74 69  ncomingListCerti
05e0: 66 69 63 61 74 65 73 28 6d 65 73 73 61 67 65 2c  ficates(message,
05f0: 20 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29   chromeCallback)
0600: 20 7b 0a 09 76 61 72 20 69 64 78 3b 0a 09 76 61   {..var idx;..va
0610: 72 20 63 65 72 74 69 66 69 63 61 74 65 73 20 3d  r certificates =
0620: 20 5b 5d 3b 0a 0a 09 69 66 20 28 21 63 68 72 6f   [];...if (!chro
0630: 6d 65 43 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 09  meCallback) {...
0640: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72  return;..}...for
0650: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
0660: 20 6d 65 73 73 61 67 65 2e 63 65 72 74 69 66 69   message.certifi
0670: 63 61 74 65 73 2e 6c 65 6e 67 74 68 3b 20 69 64  cates.length; id
0680: 78 2b 2b 29 20 7b 0a 09 09 63 65 72 74 69 66 69  x++) {...certifi
0690: 63 61 74 65 73 2e 70 75 73 68 28 0a 09 09 09 7b  cates.push(....{
06a0: 0a 09 09 09 09 63 65 72 74 69 66 69 63 61 74 65  .....certificate
06b0: 3a 20 6d 65 73 73 61 67 65 2e 63 65 72 74 69 66  : message.certif
06c0: 69 63 61 74 65 73 5b 69 64 78 5d 2c 0a 09 09 09  icates[idx],....
06d0: 09 73 75 70 70 6f 72 74 65 64 48 61 73 68 65 73  .supportedHashes
06e0: 3a 20 5b 27 53 48 41 31 27 2c 20 27 53 48 41 32  : ['SHA1', 'SHA2
06f0: 35 36 27 2c 20 27 4d 44 35 5f 53 48 41 31 27 5d  56', 'MD5_SHA1']
0700: 0a 09 09 09 7d 0a 09 09 29 3b 0a 09 7d 0a 0a 09  ....}...);..}...
0710: 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 28 63  chromeCallback(c
0720: 65 72 74 69 66 69 63 61 74 65 73 2c 0a 09 09 66  ertificates,...f
0730: 75 6e 63 74 69 6f 6e 28 72 65 6a 65 63 74 65 64  unction(rejected
0740: 43 65 72 74 73 29 20 7b 0a 09 09 09 69 66 20 28  Certs) {....if (
0750: 63 68 72 6f 6d 65 2e 72 75 6e 74 69 6d 65 2e 6c  chrome.runtime.l
0760: 61 73 74 45 72 72 6f 72 29 20 7b 0a 09 09 09 09  astError) {.....
0770: 72 65 74 75 72 6e 3b 0a 09 09 09 7d 0a 0a 09 09  return;....}....
0780: 09 69 66 20 28 72 65 6a 65 63 74 65 64 43 65 72  .if (rejectedCer
0790: 74 73 2e 6c 65 6e 67 74 68 20 21 3d 3d 20 30 29  ts.length !== 0)
07a0: 20 7b 0a 09 09 09 09 6f 6e 43 65 72 74 69 66 69   {.....onCertifi
07b0: 63 61 74 65 73 52 65 6a 65 63 74 65 64 28 72 65  catesRejected(re
07c0: 6a 65 63 74 65 64 43 65 72 74 73 29 3b 0a 09 09  jectedCerts);...
07d0: 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 3b 0a 09  .}.....return;..
07e0: 09 7d 0a 09 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  .}..);...return;
07f0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65  .}../*. * Handle
0800: 20 61 20 72 65 73 70 6f 6e 73 65 20 66 72 6f 6d   a response from
0810: 20 74 68 65 20 4e 61 43 6c 20 73 69 64 65 20 72   the NaCl side r
0820: 65 67 61 72 64 69 6e 67 20 61 20 6c 69 73 74 20  egarding a list 
0830: 6f 66 20 72 65 61 64 65 72 73 0a 20 2a 2f 0a 66  of readers. */.f
0840: 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 4d 65  unction cackeyMe
0850: 73 73 61 67 65 49 6e 63 6f 6d 69 6e 67 4c 69 73  ssageIncomingLis
0860: 74 52 65 61 64 65 72 73 28 6d 65 73 73 61 67 65  tReaders(message
0870: 2c 20 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b  , chromeCallback
0880: 29 20 7b 0a 09 69 66 20 28 21 63 68 72 6f 6d 65  ) {..if (!chrome
0890: 43 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 09 72 65  Callback) {...re
08a0: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 63 68 72 6f 6d  turn;..}...chrom
08b0: 65 43 61 6c 6c 62 61 63 6b 28 6d 65 73 73 61 67  eCallback(messag
08c0: 65 2e 72 65 61 64 65 72 73 29 3b 0a 0a 09 72 65  e.readers);...re
08d0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48  turn;.}../*. * H
08e0: 61 6e 64 6c 65 20 61 20 72 65 73 70 6f 6e 73 65  andle a response
08f0: 20 66 72 6f 6d 20 74 68 65 20 4e 61 43 6c 20 73   from the NaCl s
0900: 69 64 65 20 72 65 67 61 72 64 69 6e 67 20 73 69  ide regarding si
0910: 67 6e 69 6e 67 20 61 20 6d 65 73 73 61 67 65 0a  gning a message.
0920: 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63   */.function cac
0930: 6b 65 79 4d 65 73 73 61 67 65 49 6e 63 6f 6d 69  keyMessageIncomi
0940: 6e 67 53 69 67 6e 4d 65 73 73 61 67 65 28 6d 65  ngSignMessage(me
0950: 73 73 61 67 65 2c 20 63 68 72 6f 6d 65 43 61 6c  ssage, chromeCal
0960: 6c 62 61 63 6b 29 20 7b 0a 09 76 61 72 20 70 61  lback) {..var pa
0970: 79 6c 6f 61 64 3b 0a 0a 09 69 66 20 28 21 63 68  yload;...if (!ch
0980: 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 20 7b 0a  romeCallback) {.
0990: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 70  ..return;..}...p
09a0: 61 79 6c 6f 61 64 20 3d 20 6d 65 73 73 61 67 65  ayload = message
09b0: 2e 73 69 67 6e 65 64 44 61 74 61 3b 0a 0a 09 63  .signedData;...c
09c0: 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 28 70 61  hromeCallback(pa
09d0: 79 6c 6f 61 64 29 3b 0a 0a 09 72 65 74 75 72 6e  yload);...return
09e0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 70 64 61 74  ;.}../*. * Updat
09f0: 65 20 74 68 65 20 74 69 6d 65 20 61 20 50 49 4e  e the time a PIN
0a00: 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 20 66   was last used f
0a10: 6f 72 20 61 20 63 65 72 74 69 66 69 63 61 74 65  or a certificate
0a20: 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61  . */.function ca
0a30: 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54  ckeyCertificateT
0a40: 6f 50 49 4e 4d 61 70 55 70 64 61 74 65 4c 61 73  oPINMapUpdateLas
0a50: 74 55 73 65 64 28 69 64 29 20 7b 0a 09 69 66 20  tUsed(id) {..if 
0a60: 28 69 64 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 09  (id != null) {..
0a70: 09 63 61 63 6b 65 79 43 65 72 74 69 66 69 63 61  .cackeyCertifica
0a80: 74 65 54 6f 50 49 4e 4d 61 70 5b 69 64 5d 2e 6c  teToPINMap[id].l
0a90: 61 73 74 55 73 65 64 20 3d 20 28 6e 65 77 20 44  astUsed = (new D
0aa0: 61 74 65 28 29 29 2e 67 65 74 54 69 6d 65 28 29  ate()).getTime()
0ab0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
0ac0: 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50  eyCertificateToP
0ad0: 49 4e 4d 61 70 4c 61 73 74 55 73 65 64 52 75 6e  INMapLastUsedRun
0ae0: 6e 65 72 29 20 7b 0a 09 09 63 61 63 6b 65 79 43  ner) {...cackeyC
0af0: 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d  ertificateToPINM
0b00: 61 70 4c 61 73 74 55 73 65 64 52 75 6e 6e 65 72  apLastUsedRunner
0b10: 20 3d 20 74 72 75 65 3b 0a 0a 09 09 73 65 74 54   = true;....setT
0b20: 69 6d 65 6f 75 74 28 66 75 6e 63 74 69 6f 6e 28  imeout(function(
0b30: 29 20 7b 0a 09 09 09 76 61 72 20 63 75 72 72 65  ) {....var curre
0b40: 6e 74 54 69 6d 65 3b 0a 09 09 09 76 61 72 20 63  ntTime;....var c
0b50: 65 72 74 69 66 69 63 61 74 65 73 2c 20 63 65 72  ertificates, cer
0b60: 74 69 66 69 63 61 74 65 3b 0a 09 09 09 76 61 72  tificate;....var
0b70: 20 69 64 78 3b 0a 0a 09 09 09 63 75 72 72 65 6e   idx;.....curren
0b80: 74 54 69 6d 65 20 3d 20 28 6e 65 77 20 44 61 74  tTime = (new Dat
0b90: 65 28 29 29 2e 67 65 74 54 69 6d 65 28 29 3b 0a  e()).getTime();.
0ba0: 0a 09 09 09 63 65 72 74 69 66 69 63 61 74 65 73  ....certificates
0bb0: 20 3d 20 4f 62 6a 65 63 74 2e 6b 65 79 73 28 63   = Object.keys(c
0bc0: 61 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65  ackeyCertificate
0bd0: 54 6f 50 49 4e 4d 61 70 29 3b 0a 0a 09 09 09 63  ToPINMap);.....c
0be0: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 4c 6f 6f 6b  onsole.log("Look
0bf0: 69 6e 67 20 66 6f 72 20 50 49 4e 73 20 74 6f 20  ing for PINs to 
0c00: 63 6c 65 61 72 22 29 3b 0a 0a 09 09 09 66 6f 72  clear");.....for
0c10: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
0c20: 20 63 65 72 74 69 66 69 63 61 74 65 73 2e 6c 65   certificates.le
0c30: 6e 67 74 68 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ngth; idx++) {..
0c40: 09 09 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
0c50: 20 63 65 72 74 69 66 69 63 61 74 65 73 5b 69 64   certificates[id
0c60: 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 28 63 61  x];......if ((ca
0c70: 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54  ckeyCertificateT
0c80: 6f 50 49 4e 4d 61 70 5b 63 65 72 74 69 66 69 63  oPINMap[certific
0c90: 61 74 65 5d 2e 6c 61 73 74 55 73 65 64 20 2b 20  ate].lastUsed + 
0ca0: 39 30 30 30 30 30 29 20 3e 20 63 75 72 72 65 6e  900000) > curren
0cb0: 74 54 69 6d 65 29 20 7b 0a 09 09 09 09 09 63 6f  tTime) {......co
0cc0: 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09  ntinue;.....}...
0cd0: 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22  ...console.log("
0ce0: 44 65 6c 65 74 65 74 69 6e 67 20 22 20 2b 20 63  Deleteting " + c
0cf0: 65 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09  ertificate);....
0d00: 09 09 64 65 6c 65 74 65 20 63 61 63 6b 65 79 43  ..delete cackeyC
0d10: 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d  ertificateToPINM
0d20: 61 70 5b 63 65 72 74 69 66 69 63 61 74 65 5d 3b  ap[certificate];
0d30: 0a 09 09 09 7d 0a 0a 09 09 09 63 65 72 74 69 66  ....}.....certif
0d40: 69 63 61 74 65 73 20 3d 20 4f 62 6a 65 63 74 2e  icates = Object.
0d50: 6b 65 79 73 28 63 61 63 6b 65 79 43 65 72 74 69  keys(cackeyCerti
0d60: 66 69 63 61 74 65 54 6f 50 49 4e 4d 61 70 29 3b  ficateToPINMap);
0d70: 0a 0a 09 09 09 63 61 63 6b 65 79 43 65 72 74 69  .....cackeyCerti
0d80: 66 69 63 61 74 65 54 6f 50 49 4e 4d 61 70 4c 61  ficateToPINMapLa
0d90: 73 74 55 73 65 64 52 75 6e 6e 65 72 20 3d 20 66  stUsedRunner = f
0da0: 61 6c 73 65 3b 0a 0a 09 09 09 69 66 20 28 63 65  alse;.....if (ce
0db0: 72 74 69 66 69 63 61 74 65 73 2e 6c 65 6e 67 74  rtificates.lengt
0dc0: 68 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 72 65  h == 0) {.....re
0dd0: 74 75 72 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  turn;....}.....c
0de0: 61 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65  ackeyCertificate
0df0: 54 6f 50 49 4e 4d 61 70 55 70 64 61 74 65 4c 61  ToPINMapUpdateLa
0e00: 73 74 55 73 65 64 28 6e 75 6c 6c 29 3b 0a 09 09  stUsed(null);...
0e10: 7d 2c 20 39 30 30 30 30 30 29 3b 0a 09 7d 0a 7d  }, 900000);..}.}
0e20: 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65 20 61  ../*. * Handle a
0e30: 6e 20 69 6e 63 6f 6d 69 6e 67 20 6d 65 73 73 61  n incoming messa
0e40: 67 65 20 66 72 6f 6d 20 74 68 65 20 4e 61 43 6c  ge from the NaCl
0e50: 20 73 69 64 65 20 61 6e 64 20 70 61 73 73 20 69   side and pass i
0e60: 74 20 6f 66 66 20 74 6f 0a 20 2a 20 6f 6e 65 20  t off to. * one 
0e70: 6f 66 20 74 68 65 20 68 61 6e 64 6c 65 72 73 20  of the handlers 
0e80: 61 62 6f 76 65 20 66 6f 72 20 61 63 74 75 61 6c  above for actual
0e90: 20 66 6f 72 6d 61 74 74 69 6e 67 20 61 6e 64 20   formatting and 
0ea0: 70 61 73 73 69 6e 67 20 74 6f 0a 20 2a 20 74 68  passing to. * th
0eb0: 65 20 63 61 6c 6c 62 61 63 6b 0a 20 2a 0a 20 2a  e callback. *. *
0ec0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
0ed0: 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65  ured, invoke the
0ee0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 6e   callback with n
0ef0: 6f 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 2a 2f  o arguments.. */
0f00: 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79  .function cackey
0f10: 4d 65 73 73 61 67 65 49 6e 63 6f 6d 69 6e 67 28  MessageIncoming(
0f20: 6d 65 73 73 61 67 65 45 76 65 6e 74 29 20 7b 0a  messageEvent) {.
0f30: 09 76 61 72 20 6e 65 78 74 46 75 6e 63 74 69 6f  .var nextFunctio
0f40: 6e 20 3d 20 6e 75 6c 6c 3b 0a 09 76 61 72 20 63  n = null;..var c
0f50: 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 20 3d 20  hromeCallback = 
0f60: 6e 75 6c 6c 3b 0a 0a 09 69 66 20 28 6d 65 73 73  null;...if (mess
0f70: 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 74 61  ageEvent.data.ta
0f80: 72 67 65 74 20 21 3d 20 22 63 61 63 6b 65 79 22  rget != "cackey"
0f90: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
0fa0: 0a 0a 09 69 66 20 28 67 6f 6f 67 2e 44 45 42 55  ...if (goog.DEBU
0fb0: 47 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c  G) {...console.l
0fc0: 6f 67 28 22 53 54 41 52 54 20 4d 45 53 53 41 47  og("START MESSAG
0fd0: 45 22 29 3b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c  E");...console.l
0fe0: 6f 67 28 6d 65 73 73 61 67 65 45 76 65 6e 74 2e  og(messageEvent.
0ff0: 64 61 74 61 29 3b 0a 09 09 63 6f 6e 73 6f 6c 65  data);...console
1000: 2e 6c 6f 67 28 22 45 4e 44 20 4d 45 53 53 41 47  .log("END MESSAG
1010: 45 22 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  E");..}.../*.. *
1020: 20 49 66 20 77 65 20 66 61 69 6c 65 64 20 66 6f   If we failed fo
1030: 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 61 6e  r some reason an
1040: 64 20 77 65 20 68 61 76 65 20 61 20 63 65 72 74  d we have a cert
1050: 69 66 69 63 61 74 65 20 69 6e 20 74 68 65 20 6f  ificate in the o
1060: 72 69 67 69 6e 61 6c 0a 09 20 2a 20 72 65 71 75  riginal.. * requ
1070: 65 73 74 20 74 68 65 6e 20 66 6f 72 67 65 74 20  est then forget 
1080: 61 6e 79 20 50 49 4e 20 61 73 73 6f 63 69 61 74  any PIN associat
1090: 65 64 20 77 69 74 68 20 74 68 61 74 20 63 65 72  ed with that cer
10a0: 74 69 66 69 63 61 74 65 0a 09 20 2a 2f 0a 09 69  tificate.. */..i
10b0: 66 20 28 6d 65 73 73 61 67 65 45 76 65 6e 74 2e  f (messageEvent.
10c0: 64 61 74 61 2e 73 74 61 74 75 73 20 21 3d 20 22  data.status != "
10d0: 73 75 63 63 65 73 73 22 29 20 7b 0a 09 09 69 66  success") {...if
10e0: 20 28 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64   (messageEvent.d
10f0: 61 74 61 2e 6f 72 69 67 69 6e 61 6c 72 65 71 75  ata.originalrequ
1100: 65 73 74 29 20 7b 0a 09 09 09 69 66 20 28 6d 65  est) {....if (me
1110: 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e  ssageEvent.data.
1120: 6f 72 69 67 69 6e 61 6c 72 65 71 75 65 73 74 2e  originalrequest.
1130: 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09  certificate) {..
1140: 09 09 09 64 65 6c 65 74 65 20 63 61 63 6b 65 79  ...delete cackey
1150: 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e  CertificateToPIN
1160: 4d 61 70 5b 63 61 63 6b 65 79 43 65 72 74 69 66  Map[cackeyCertif
1170: 69 63 61 74 65 54 6f 50 49 4e 49 44 28 6d 65 73  icateToPINID(mes
1180: 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 6f  sageEvent.data.o
1190: 72 69 67 69 6e 61 6c 72 65 71 75 65 73 74 2e 63  riginalrequest.c
11a0: 65 72 74 69 66 69 63 61 74 65 29 5d 3b 0a 09 09  ertificate)];...
11b0: 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  .}...}..}...if (
11c0: 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74  messageEvent.dat
11d0: 61 2e 63 6f 6d 6d 61 6e 64 20 3d 3d 20 22 69 6e  a.command == "in
11e0: 69 74 22 20 26 26 20 6d 65 73 73 61 67 65 45 76  it" && messageEv
11f0: 65 6e 74 2e 64 61 74 61 2e 73 74 61 74 75 73 20  ent.data.status 
1200: 3d 3d 20 22 73 75 63 63 65 73 73 22 29 20 7b 0a  == "success") {.
1210: 09 09 69 66 20 28 67 6f 6f 67 2e 44 45 42 55 47  ..if (goog.DEBUG
1220: 29 20 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c  ) {....console.l
1230: 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 49 6e 69  og("[cackey] Ini
1240: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6d 70  tialization comp
1250: 6c 65 74 65 64 2c 20 72 65 73 65 6e 64 69 6e 67  leted, resending
1260: 20 61 6e 79 20 71 75 65 75 65 64 20 6d 65 73 73   any queued mess
1270: 61 67 65 73 22 29 3b 0a 09 09 7d 0a 0a 09 09 63  ages");...}....c
1280: 61 63 6b 65 79 49 6e 69 74 50 43 53 43 43 6f 6d  ackeyInitPCSCCom
1290: 70 6c 65 74 65 64 28 22 73 75 63 63 65 73 73 22  pleted("success"
12a0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6d 65 73 73  );..}...if (mess
12b0: 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 69 64  ageEvent.data.id
12c0: 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09 72 65   == null) {...re
12d0: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 63 68 72 6f 6d  turn;..}...chrom
12e0: 65 43 61 6c 6c 62 61 63 6b 20 3d 20 63 61 63 6b  eCallback = cack
12f0: 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c  eyOutstandingCal
1300: 6c 62 61 63 6b 73 5b 6d 65 73 73 61 67 65 45 76  lbacks[messageEv
1310: 65 6e 74 2e 64 61 74 61 2e 69 64 5d 3b 0a 0a 09  ent.data.id];...
1320: 69 66 20 28 63 68 72 6f 6d 65 43 61 6c 6c 62 61  if (chromeCallba
1330: 63 6b 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09  ck == null) {...
1340: 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 22 5b  console.error("[
1350: 63 61 63 6b 65 79 5d 20 44 69 73 63 61 72 64 69  cackey] Discardi
1360: 6e 67 20 6f 75 74 64 61 74 65 64 20 6d 65 73 73  ng outdated mess
1370: 61 67 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  age");....return
1380: 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 6d  ;..}...switch (m
1390: 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61  essageEvent.data
13a0: 2e 73 74 61 74 75 73 29 20 7b 0a 09 09 63 61 73  .status) {...cas
13b0: 65 20 22 65 72 72 6f 72 22 3a 0a 09 09 09 63 6f  e "error":....co
13c0: 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 22 5b 63 61  nsole.error("[ca
13d0: 63 6b 65 79 5d 20 46 61 69 6c 65 64 20 74 6f 20  ckey] Failed to 
13e0: 65 78 65 63 75 74 65 20 63 6f 6d 6d 61 6e 64 20  execute command 
13f0: 27 22 20 2b 20 6d 65 73 73 61 67 65 45 76 65 6e  '" + messageEven
1400: 74 2e 64 61 74 61 2e 63 6f 6d 6d 61 6e 64 20 2b  t.data.command +
1410: 20 22 27 3a 20 22 20 2b 20 6d 65 73 73 61 67 65   "': " + message
1420: 45 76 65 6e 74 2e 64 61 74 61 2e 65 72 72 6f 72  Event.data.error
1430: 29 3b 0a 0a 09 09 09 63 68 72 6f 6d 65 43 61 6c  );.....chromeCal
1440: 6c 62 61 63 6b 28 29 3b 0a 0a 09 09 09 62 72 65  lback();.....bre
1450: 61 6b 3b 0a 09 09 63 61 73 65 20 22 72 65 74 72  ak;...case "retr
1460: 79 22 3a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20  y":..../*.... * 
1470: 41 64 64 20 74 68 65 20 6e 65 77 20 72 65 71 75  Add the new requ
1480: 65 73 74 20 74 6f 20 74 68 65 20 71 75 65 75 65  est to the queue
1490: 20 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 70 72   of events to pr
14a0: 6f 63 65 73 73 20 77 68 65 6e 20 74 68 65 20 50  ocess when the P
14b0: 49 4e 0a 09 09 09 20 2a 20 70 72 6f 6d 70 74 20  IN.... * prompt 
14c0: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 2e 0a 09  is terminated...
14d0: 09 09 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 4d  .. */....cackeyM
14e0: 65 73 73 61 67 65 73 54 6f 52 65 74 72 79 2e 70  essagesToRetry.p
14f0: 75 73 68 28 6d 65 73 73 61 67 65 45 76 65 6e 74  ush(messageEvent
1500: 29 3b 0a 0a 09 09 09 69 66 20 28 70 69 6e 57 69  );.....if (pinWi
1510: 6e 64 6f 77 50 72 65 76 69 6f 75 73 48 61 6e 64  ndowPreviousHand
1520: 6c 65 29 20 7b 0a 09 09 09 09 2f 2a 0a 09 09 09  le) {...../*....
1530: 09 20 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  . * An existing 
1540: 50 49 4e 20 65 6e 74 72 79 20 69 73 20 69 6e 20  PIN entry is in 
1550: 70 72 6f 67 72 65 73 73 0a 09 09 09 09 20 2a 20  progress..... * 
1560: 4a 75 73 74 20 61 64 64 20 74 68 65 20 72 65 71  Just add the req
1570: 75 65 73 74 20 74 6f 20 74 68 65 20 71 75 65 75  uest to the queu
1580: 65 20 28 61 62 6f 76 65 29 20 61 6e 64 20 77 61  e (above) and wa
1590: 69 74 0a 09 09 09 09 20 2a 2f 0a 0a 09 09 09 09  it..... */......
15a0: 72 65 74 75 72 6e 3b 0a 09 09 09 7d 0a 0a 09 09  return;....}....
15b0: 09 2f 2a 0a 09 09 09 20 2a 20 53 65 74 20 74 68  ./*.... * Set th
15c0: 65 20 68 61 6e 64 6c 65 20 74 6f 20 61 6e 20 69  e handle to an i
15d0: 6e 76 61 6c 69 64 20 28 62 75 74 20 6e 6f 6e 2d  nvalid (but non-
15e0: 6e 75 6c 6c 29 20 76 61 6c 75 65 20 75 6e 74 69  null) value unti
15f0: 6c 20 74 68 65 20 77 69 6e 64 6f 77 0a 09 09 09  l the window....
1600: 20 2a 20 69 73 20 63 72 65 61 74 65 64 20 69 6e   * is created in
1610: 20 63 61 73 65 20 77 65 20 61 72 65 20 69 6e 76   case we are inv
1620: 6f 6b 65 64 20 61 67 61 69 6e 20 73 6f 6f 6e 2e  oked again soon.
1630: 0a 09 09 09 20 2a 2f 0a 09 09 09 70 69 6e 57 69  .... */....pinWi
1640: 6e 64 6f 77 50 72 65 76 69 6f 75 73 48 61 6e 64  ndowPreviousHand
1650: 6c 65 20 3d 20 22 69 6e 76 61 6c 69 64 22 3b 0a  le = "invalid";.
1660: 0a 09 09 09 63 68 72 6f 6d 65 2e 61 70 70 2e 77  ....chrome.app.w
1670: 69 6e 64 6f 77 2e 63 72 65 61 74 65 28 22 70 69  indow.create("pi
1680: 6e 2e 68 74 6d 6c 22 2c 20 7b 0a 09 09 09 09 22  n.html", {....."
1690: 69 64 22 3a 20 22 63 61 63 6b 65 79 50 49 4e 45  id": "cackeyPINE
16a0: 6e 74 72 79 22 2c 0a 09 09 09 09 22 72 65 73 69  ntry",....."resi
16b0: 7a 61 62 6c 65 22 3a 20 66 61 6c 73 65 2c 0a 09  zable": false,..
16c0: 09 09 09 22 61 6c 77 61 79 73 4f 6e 54 6f 70 22  ..."alwaysOnTop"
16d0: 3a 20 74 72 75 65 2c 0a 09 09 09 09 22 66 6f 63  : true,....."foc
16e0: 75 73 65 64 22 3a 20 74 72 75 65 2c 0a 09 09 09  used": true,....
16f0: 09 22 76 69 73 69 62 6c 65 4f 6e 41 6c 6c 57 6f  ."visibleOnAllWo
1700: 72 6b 73 70 61 63 65 73 22 3a 20 74 72 75 65 2c  rkspaces": true,
1710: 0a 09 09 09 09 22 69 6e 6e 65 72 42 6f 75 6e 64  ....."innerBound
1720: 73 22 3a 20 7b 0a 09 09 09 09 09 22 77 69 64 74  s": {......"widt
1730: 68 22 3a 20 33 35 30 2c 0a 09 09 09 09 09 22 6d  h": 350,......"m
1740: 69 6e 57 69 64 74 68 22 3a 20 33 35 30 2c 0a 09  inWidth": 350,..
1750: 09 09 09 09 22 68 65 69 67 68 74 22 3a 20 31 33  ...."height": 13
1760: 35 2c 0a 09 09 09 09 09 22 6d 69 6e 48 65 69 67  5,......"minHeig
1770: 68 74 22 3a 20 31 33 35 0a 09 09 09 09 7d 0a 09  ht": 135.....}..
1780: 09 09 7d 2c 20 66 75 6e 63 74 69 6f 6e 28 70 69  ..}, function(pi
1790: 6e 57 69 6e 64 6f 77 29 20 7b 0a 09 09 09 09 2f  nWindow) {...../
17a0: 2a 0a 09 09 09 09 20 2a 20 53 65 74 20 74 68 65  *..... * Set the
17b0: 20 50 49 4e 20 76 61 6c 75 65 20 74 6f 20 62 6c   PIN value to bl
17c0: 61 6e 6b 0a 09 09 09 09 20 2a 2f 0a 09 09 09 09  ank..... */.....
17d0: 70 69 6e 57 69 6e 64 6f 77 50 49 4e 56 61 6c 75  pinWindowPINValu
17e0: 65 20 3d 20 22 22 3b 0a 0a 09 09 09 09 69 66 20  e = "";......if 
17f0: 28 21 70 69 6e 57 69 6e 64 6f 77 29 20 7b 0a 09  (!pinWindow) {..
1800: 09 09 09 09 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f  ....console.erro
1810: 72 28 22 5b 63 61 63 6b 65 79 5d 20 4e 6f 20 77  r("[cackey] No w
1820: 69 6e 64 6f 77 20 77 61 73 20 70 72 6f 76 69 64  indow was provid
1830: 65 64 20 66 6f 72 20 50 49 4e 20 65 6e 74 72 79  ed for PIN entry
1840: 2c 20 74 68 69 73 20 77 69 6c 6c 20 6e 6f 74 20  , this will not 
1850: 67 6f 20 77 65 6c 6c 2e 22 29 3b 0a 0a 09 09 09  go well.");.....
1860: 09 09 72 65 74 75 72 6e 3b 0a 09 09 09 09 7d 0a  ..return;.....}.
1870: 0a 09 09 09 09 70 69 6e 57 69 6e 64 6f 77 50 72  .....pinWindowPr
1880: 65 76 69 6f 75 73 48 61 6e 64 6c 65 20 3d 20 70  eviousHandle = p
1890: 69 6e 57 69 6e 64 6f 77 3b 0a 0a 09 09 09 09 70  inWindow;......p
18a0: 69 6e 57 69 6e 64 6f 77 2e 64 72 61 77 41 74 74  inWindow.drawAtt
18b0: 65 6e 74 69 6f 6e 28 29 3b 0a 09 09 09 09 70 69  ention();.....pi
18c0: 6e 57 69 6e 64 6f 77 2e 66 6f 63 75 73 28 29 3b  nWindow.focus();
18d0: 0a 0a 09 09 09 09 2f 2a 0a 09 09 09 09 20 2a 20  ....../*..... * 
18e0: 52 65 67 69 73 74 65 72 20 61 20 68 61 6e 64 6c  Register a handl
18f0: 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
1900: 20 77 69 6e 64 6f 77 20 62 65 69 6e 67 20 63 6c   window being cl
1910: 6f 73 65 64 20 77 69 74 68 6f 75 74 0a 09 09 09  osed without....
1920: 09 20 2a 20 68 61 76 69 6e 67 20 73 65 6e 74 20  . * having sent 
1930: 61 6e 79 74 68 69 6e 67 0a 09 09 09 09 20 2a 2f  anything..... */
1940: 0a 09 09 09 09 70 69 6e 57 69 6e 64 6f 77 2e 6f  .....pinWindow.o
1950: 6e 43 6c 6f 73 65 64 2e 61 64 64 4c 69 73 74 65  nClosed.addListe
1960: 6e 65 72 28 66 75 6e 63 74 69 6f 6e 28 29 20 7b  ner(function() {
1970: 0a 09 09 09 09 09 76 61 72 20 6d 65 73 73 61 67  ......var messag
1980: 65 49 64 78 3b 0a 09 09 09 09 09 76 61 72 20 63  eIdx;......var c
1990: 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 3b 0a 0a  hromeCallback;..
19a0: 09 09 09 09 09 70 69 6e 57 69 6e 64 6f 77 50 72  .....pinWindowPr
19b0: 65 76 69 6f 75 73 48 61 6e 64 6c 65 20 3d 20 6e  eviousHandle = n
19c0: 75 6c 6c 3b 0a 0a 09 09 09 09 09 66 6f 72 20 28  ull;.......for (
19d0: 6d 65 73 73 61 67 65 49 64 78 20 3d 20 30 3b 20  messageIdx = 0; 
19e0: 6d 65 73 73 61 67 65 49 64 78 20 3c 20 63 61 63  messageIdx < cac
19f0: 6b 65 79 4d 65 73 73 61 67 65 73 54 6f 52 65 74  keyMessagesToRet
1a00: 72 79 2e 6c 65 6e 67 74 68 3b 20 6d 65 73 73 61  ry.length; messa
1a10: 67 65 49 64 78 2b 2b 29 20 7b 0a 09 09 09 09 09  geIdx++) {......
1a20: 09 76 61 72 20 74 6d 70 4d 65 73 73 61 67 65 45  .var tmpMessageE
1a30: 76 65 6e 74 3b 0a 0a 09 09 09 09 09 09 74 6d 70  vent;........tmp
1a40: 4d 65 73 73 61 67 65 45 76 65 6e 74 20 3d 20 63  MessageEvent = c
1a50: 61 63 6b 65 79 4d 65 73 73 61 67 65 73 54 6f 52  ackeyMessagesToR
1a60: 65 74 72 79 5b 6d 65 73 73 61 67 65 49 64 78 5d  etry[messageIdx]
1a70: 3b 0a 0a 09 09 09 09 09 09 69 66 20 28 70 69 6e  ;........if (pin
1a80: 57 69 6e 64 6f 77 50 49 4e 56 61 6c 75 65 20 3d  WindowPINValue =
1a90: 3d 20 22 22 29 20 7b 0a 09 09 09 09 09 09 09 69  = "") {........i
1aa0: 66 20 28 67 6f 6f 67 2e 44 45 42 55 47 29 20 7b  f (goog.DEBUG) {
1ab0: 0a 09 09 09 09 09 09 09 09 63 6f 6e 73 6f 6c 65  .........console
1ac0: 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 54  .log("[cackey] T
1ad0: 68 65 20 50 49 4e 20 64 69 61 6c 6f 67 20 77 61  he PIN dialog wa
1ae0: 73 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75 74  s closed without
1af0: 20 67 61 74 68 65 72 69 6e 67 20 61 20 50 49 4e   gathering a PIN
1b00: 2c 20 74 72 65 61 74 69 6e 67 20 69 74 20 61 73  , treating it as
1b10: 20 61 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a 09   a failure.");..
1b20: 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 09  ......}.........
1b30: 74 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74 2e  tmpMessageEvent.
1b40: 64 61 74 61 2e 73 74 61 74 75 73 20 3d 20 22 65  data.status = "e
1b50: 72 72 6f 72 22 3b 0a 09 09 09 09 09 09 09 74 6d  rror";........tm
1b60: 70 4d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61  pMessageEvent.da
1b70: 74 61 2e 65 72 72 6f 72 20 3d 20 22 50 49 4e 20  ta.error = "PIN 
1b80: 77 69 6e 64 6f 77 20 63 6c 6f 73 65 64 20 77 69  window closed wi
1b90: 74 68 6f 75 74 20 61 20 50 49 4e 20 62 65 69 6e  thout a PIN bein
1ba0: 67 20 70 72 6f 76 69 64 65 64 22 3b 0a 0a 09 09  g provided";....
1bb0: 09 09 09 09 09 63 61 63 6b 65 79 4d 65 73 73 61  .....cackeyMessa
1bc0: 67 65 49 6e 63 6f 6d 69 6e 67 28 74 6d 70 4d 65  geIncoming(tmpMe
1bd0: 73 73 61 67 65 45 76 65 6e 74 29 3b 0a 09 09 09  ssageEvent);....
1be0: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1bf0: 09 09 09 74 6d 70 4d 65 73 73 61 67 65 45 76 65  ...tmpMessageEve
1c00: 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69 6e 61 6c  nt.data.original
1c10: 72 65 71 75 65 73 74 2e 70 69 6e 20 3d 20 70 69  request.pin = pi
1c20: 6e 57 69 6e 64 6f 77 50 49 4e 56 61 6c 75 65 3b  nWindowPINValue;
1c30: 0a 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 43  .........cackeyC
1c40: 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e 4d  ertificateToPINM
1c50: 61 70 5b 63 61 63 6b 65 79 43 65 72 74 69 66 69  ap[cackeyCertifi
1c60: 63 61 74 65 54 6f 50 49 4e 49 44 28 74 6d 70 4d  cateToPINID(tmpM
1c70: 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61  essageEvent.data
1c80: 2e 6f 72 69 67 69 6e 61 6c 72 65 71 75 65 73 74  .originalrequest
1c90: 2e 63 65 72 74 69 66 69 63 61 74 65 29 5d 20 3d  .certificate)] =
1ca0: 20 7b 7d 0a 09 09 09 09 09 09 09 63 61 63 6b 65   {}........cacke
1cb0: 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49  yCertificateToPI
1cc0: 4e 4d 61 70 5b 63 61 63 6b 65 79 43 65 72 74 69  NMap[cackeyCerti
1cd0: 66 69 63 61 74 65 54 6f 50 49 4e 49 44 28 74 6d  ficateToPINID(tm
1ce0: 70 4d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61  pMessageEvent.da
1cf0: 74 61 2e 6f 72 69 67 69 6e 61 6c 72 65 71 75 65  ta.originalreque
1d00: 73 74 2e 63 65 72 74 69 66 69 63 61 74 65 29 5d  st.certificate)]
1d10: 2e 70 69 6e 20 3d 20 70 69 6e 57 69 6e 64 6f 77  .pin = pinWindow
1d20: 50 49 4e 56 61 6c 75 65 3b 0a 0a 09 09 09 09 09  PINValue;.......
1d30: 09 09 63 61 63 6b 65 79 43 65 72 74 69 66 69 63  ..cackeyCertific
1d40: 61 74 65 54 6f 50 49 4e 4d 61 70 55 70 64 61 74  ateToPINMapUpdat
1d50: 65 4c 61 73 74 55 73 65 64 28 63 61 63 6b 65 79  eLastUsed(cackey
1d60: 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e  CertificateToPIN
1d70: 49 44 28 74 6d 70 4d 65 73 73 61 67 65 45 76 65  ID(tmpMessageEve
1d80: 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69 6e 61 6c  nt.data.original
1d90: 72 65 71 75 65 73 74 2e 63 65 72 74 69 66 69 63  request.certific
1da0: 61 74 65 29 29 3b 0a 0a 09 09 09 09 09 09 09 63  ate));.........c
1db0: 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 20 3d 20  hromeCallback = 
1dc0: 6e 75 6c 6c 3b 0a 09 09 09 09 09 09 09 69 66 20  null;........if 
1dd0: 28 74 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74  (tmpMessageEvent
1de0: 2e 64 61 74 61 2e 69 64 29 20 7b 0a 09 09 09 09  .data.id) {.....
1df0: 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 4f 75  ....if (cackeyOu
1e00: 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63  tstandingCallbac
1e10: 6b 73 29 20 7b 0a 09 09 09 09 09 09 09 09 09 63  ks) {..........c
1e20: 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 20 3d 20  hromeCallback = 
1e30: 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e  cackeyOutstandin
1e40: 67 43 61 6c 6c 62 61 63 6b 73 5b 74 6d 70 4d 65  gCallbacks[tmpMe
1e50: 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e  ssageEvent.data.
1e60: 69 64 5d 3b 0a 09 09 09 09 09 09 09 09 7d 0a 09  id];.........}..
1e70: 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 09  ......}.........
1e80: 63 61 63 6b 65 79 49 6e 69 74 50 43 53 43 28 66  cackeyInitPCSC(f
1e90: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 09 09 09 09  unction() {.....
1ea0: 09 09 09 09 63 61 63 6b 65 79 48 61 6e 64 6c 65  ....cackeyHandle
1eb0: 2e 70 6f 73 74 4d 65 73 73 61 67 65 28 74 6d 70  .postMessage(tmp
1ec0: 4d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74  MessageEvent.dat
1ed0: 61 2e 6f 72 69 67 69 6e 61 6c 72 65 71 75 65 73  a.originalreques
1ee0: 74 29 3b 0a 09 09 09 09 09 09 09 7d 2c 20 66 75  t);........}, fu
1ef0: 6e 63 74 69 6f 6e 28 29 20 7b 0a 09 09 09 09 09  nction() {......
1f00: 09 09 09 69 66 20 28 63 68 72 6f 6d 65 43 61 6c  ...if (chromeCal
1f10: 6c 62 61 63 6b 29 20 7b 0a 09 09 09 09 09 09 09  lback) {........
1f20: 09 09 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b  ..chromeCallback
1f30: 28 29 3b 0a 09 09 09 09 09 09 09 09 7d 0a 0a 09  ();.........}...
1f40: 09 09 09 09 09 09 09 69 66 20 28 74 6d 70 4d 65  .......if (tmpMe
1f50: 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e  ssageEvent.data.
1f60: 69 64 20 26 26 20 63 61 63 6b 65 79 4f 75 74 73  id && cackeyOuts
1f70: 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73  tandingCallbacks
1f80: 5b 74 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74  [tmpMessageEvent
1f90: 2e 64 61 74 61 2e 69 64 5d 29 20 7b 0a 09 09 09  .data.id]) {....
1fa0: 09 09 09 09 09 09 64 65 6c 65 74 65 20 63 61 63  ......delete cac
1fb0: 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43 61  keyOutstandingCa
1fc0: 6c 6c 62 61 63 6b 73 5b 74 6d 70 4d 65 73 73 61  llbacks[tmpMessa
1fd0: 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 69 64 5d  geEvent.data.id]
1fe0: 3b 0a 09 09 09 09 09 09 09 09 7d 0a 09 09 09 09  ;.........}.....
1ff0: 09 09 09 7d 29 3b 0a 09 09 09 09 09 09 7d 0a 09  ...});.......}..
2000: 09 09 09 09 7d 0a 0a 0a 09 09 09 09 09 2f 2a 0a  ....}......../*.
2010: 09 09 09 09 09 20 2a 20 44 65 6c 65 74 65 20 74  ..... * Delete t
2020: 68 65 20 65 78 69 73 74 69 6e 67 20 68 61 6e 64  he existing hand
2030: 6c 65 20 61 6e 64 20 63 72 65 61 74 65 20 61 20  le and create a 
2040: 6e 65 77 20 6f 6e 65 0a 09 09 09 09 09 20 2a 2f  new one...... */
2050: 0a 09 09 09 09 09 64 65 6c 65 74 65 20 63 61 63  ......delete cac
2060: 6b 65 79 4d 65 73 73 61 67 65 73 54 6f 52 65 74  keyMessagesToRet
2070: 72 79 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79  ry;.......cackey
2080: 4d 65 73 73 61 67 65 73 54 6f 52 65 74 72 79 20  MessagesToRetry 
2090: 3d 20 5b 5d 3b 0a 0a 09 09 09 09 09 2f 2a 0a 09  = [];......./*..
20a0: 09 09 09 09 20 2a 20 57 65 20 61 72 65 20 64 6f  .... * We are do
20b0: 6e 65 20 66 65 74 63 68 69 6e 67 20 74 68 65 20  ne fetching the 
20c0: 75 73 65 72 20 50 49 4e 2c 20 63 6c 65 61 72 20  user PIN, clear 
20d0: 74 68 65 20 76 61 6c 75 65 0a 09 09 09 09 09 20  the value...... 
20e0: 2a 2f 0a 09 09 09 09 09 70 69 6e 57 69 6e 64 6f  */......pinWindo
20f0: 77 50 49 4e 56 61 6c 75 65 20 3d 20 22 22 3b 0a  wPINValue = "";.
2100: 0a 09 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09  ......return;...
2110: 09 09 7d 29 0a 0a 09 09 09 09 2f 2a 0a 09 09 09  ..})....../*....
2120: 09 20 2a 20 50 61 73 73 20 74 68 69 73 20 6d 65  . * Pass this me
2130: 73 73 61 67 65 20 6f 66 66 20 74 6f 20 74 68 65  ssage off to the
2140: 20 6f 74 68 65 72 20 77 69 6e 64 6f 77 20 73 6f   other window so
2150: 20 74 68 61 74 20 69 74 20 6d 61 79 20 72 65 73   that it may res
2160: 75 62 6d 69 74 20 74 68 65 20 72 65 71 75 65 73  ubmit the reques
2170: 74 2e 0a 09 09 09 09 20 2a 2f 0a 09 09 09 09 70  t...... */.....p
2180: 69 6e 57 69 6e 64 6f 77 2e 63 6f 6e 74 65 6e 74  inWindow.content
2190: 57 69 6e 64 6f 77 2e 70 61 72 65 6e 74 57 69 6e  Window.parentWin
21a0: 64 6f 77 20 3d 20 77 69 6e 64 6f 77 3b 0a 09 09  dow = window;...
21b0: 09 09 70 69 6e 57 69 6e 64 6f 77 2e 63 6f 6e 74  ..pinWindow.cont
21c0: 65 6e 74 57 69 6e 64 6f 77 2e 6d 65 73 73 61 67  entWindow.messag
21d0: 65 45 76 65 6e 74 20 3d 20 6d 65 73 73 61 67 65  eEvent = message
21e0: 45 76 65 6e 74 3b 0a 0a 09 09 09 09 72 65 74 75  Event;......retu
21f0: 72 6e 3b 0a 09 09 09 7d 29 3b 0a 0a 09 09 09 2f  rn;....});...../
2200: 2a 0a 09 09 09 20 2a 20 57 65 20 72 65 74 75 72  *.... * We retur
2210: 6e 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f  n here instead o
2220: 66 20 62 72 65 61 6b 20 74 6f 20 61 76 6f 69 64  f break to avoid
2230: 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 63 61   deleting the ca
2240: 6c 6c 62 61 63 6b 0a 09 09 09 20 2a 20 65 6e 74  llback.... * ent
2250: 72 79 2e 0a 09 09 09 20 2a 2f 0a 09 09 09 72 65  ry..... */....re
2260: 74 75 72 6e 3b 0a 09 09 63 61 73 65 20 22 73 75  turn;...case "su
2270: 63 63 65 73 73 22 3a 0a 09 09 09 73 77 69 74 63  ccess":....switc
2280: 68 20 28 6d 65 73 73 61 67 65 45 76 65 6e 74 2e  h (messageEvent.
2290: 64 61 74 61 2e 63 6f 6d 6d 61 6e 64 29 20 7b 0a  data.command) {.
22a0: 09 09 09 09 63 61 73 65 20 22 6c 69 73 74 63 65  ....case "listce
22b0: 72 74 69 66 69 63 61 74 65 73 22 3a 0a 09 09 09  rtificates":....
22c0: 09 09 6e 65 78 74 46 75 6e 63 74 69 6f 6e 20 3d  ..nextFunction =
22d0: 20 63 61 63 6b 65 79 4d 65 73 73 61 67 65 49 6e   cackeyMessageIn
22e0: 63 6f 6d 69 6e 67 4c 69 73 74 43 65 72 74 69 66  comingListCertif
22f0: 69 63 61 74 65 73 3b 0a 0a 09 09 09 09 09 62 72  icates;.......br
2300: 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 22 6c  eak;.....case "l
2310: 69 73 74 72 65 61 64 65 72 73 22 3a 0a 09 09 09  istreaders":....
2320: 09 09 6e 65 78 74 46 75 6e 63 74 69 6f 6e 20 3d  ..nextFunction =
2330: 20 63 61 63 6b 65 79 4d 65 73 73 61 67 65 49 6e   cackeyMessageIn
2340: 63 6f 6d 69 6e 67 4c 69 73 74 52 65 61 64 65 72  comingListReader
2350: 73 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  s;.......break;.
2360: 09 09 09 09 63 61 73 65 20 22 73 69 67 6e 22 3a  ....case "sign":
2370: 0a 09 09 09 09 09 6e 65 78 74 46 75 6e 63 74 69  ......nextFuncti
2380: 6f 6e 20 3d 20 63 61 63 6b 65 79 4d 65 73 73 61  on = cackeyMessa
2390: 67 65 49 6e 63 6f 6d 69 6e 67 53 69 67 6e 4d 65  geIncomingSignMe
23a0: 73 73 61 67 65 3b 0a 0a 09 09 09 09 09 62 72 65  ssage;.......bre
23b0: 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65  ak;....}.....bre
23c0: 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 6e 65 78  ak;..}...if (nex
23d0: 74 46 75 6e 63 74 69 6f 6e 20 21 3d 20 6e 75 6c  tFunction != nul
23e0: 6c 29 20 7b 0a 09 09 6e 65 78 74 46 75 6e 63 74  l) {...nextFunct
23f0: 69 6f 6e 28 6d 65 73 73 61 67 65 45 76 65 6e 74  ion(messageEvent
2400: 2e 64 61 74 61 2c 20 63 68 72 6f 6d 65 43 61 6c  .data, chromeCal
2410: 6c 62 61 63 6b 29 3b 0a 09 7d 0a 0a 09 64 65 6c  lback);..}...del
2420: 65 74 65 20 63 61 63 6b 65 79 4f 75 74 73 74 61  ete cackeyOutsta
2430: 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73 5b 6d  ndingCallbacks[m
2440: 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61  essageEvent.data
2450: 2e 69 64 5d 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  .id];...return;.
2460: 7d 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65 72  }../*. * Handler
2470: 20 66 6f 72 20 6d 65 73 73 61 67 65 73 20 66 72   for messages fr
2480: 6f 6d 20 43 68 72 6f 6d 65 20 72 65 6c 61 74 65  om Chrome relate
2490: 64 20 74 6f 20 6c 69 73 74 69 6e 67 20 63 65 72  d to listing cer
24a0: 74 69 66 69 63 61 74 65 73 0a 20 2a 2f 0a 66 75  tificates. */.fu
24b0: 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 4c 69 73  nction cackeyLis
24c0: 74 43 65 72 74 69 66 69 63 61 74 65 73 28 63 68  tCertificates(ch
24d0: 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 20 7b 0a  romeCallback) {.
24e0: 09 76 61 72 20 63 61 6c 6c 62 61 63 6b 49 64 3b  .var callbackId;
24f0: 0a 09 76 61 72 20 70 72 6f 6d 69 73 65 48 61 6e  ..var promiseHan
2500: 64 6c 65 20 3d 20 6e 75 6c 6c 2c 20 70 72 6f 6d  dle = null, prom
2510: 69 73 65 52 65 73 6f 6c 76 65 2c 20 70 72 6f 6d  iseResolve, prom
2520: 69 73 65 52 65 6a 65 63 74 3b 0a 0a 09 69 66 20  iseReject;...if 
2530: 28 67 6f 6f 67 2e 44 45 42 55 47 29 20 7b 0a 09  (goog.DEBUG) {..
2540: 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63  .console.log("[c
2550: 61 63 6b 65 79 5d 20 41 73 6b 65 64 20 74 6f 20  ackey] Asked to 
2560: 70 72 6f 76 69 64 65 20 61 20 6c 69 73 74 20 6f  provide a list o
2570: 66 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2d  f certificates -
2580: 2d 20 74 68 72 6f 77 69 6e 67 20 74 68 61 74 20  - throwing that 
2590: 72 65 71 75 65 73 74 20 6f 76 65 72 20 74 6f 20  request over to 
25a0: 74 68 65 20 4e 61 43 6c 20 73 69 64 65 2e 2e 2e  the NaCl side...
25b0: 20 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63   ");..}...if (!c
25c0: 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 20 7b  hromeCallback) {
25d0: 0a 09 09 2f 2a 0a 09 09 20 2a 20 49 66 20 6e 6f  .../*... * If no
25e0: 20 63 61 6c 6c 62 61 63 6b 20 73 75 70 70 6c 69   callback suppli
25f0: 65 64 2c 20 61 72 72 61 6e 67 65 20 66 6f 72 20  ed, arrange for 
2600: 61 20 70 72 6f 6d 69 73 65 20 74 6f 20 62 65 20  a promise to be 
2610: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
2620: 0a 09 09 20 2a 2f 0a 09 09 70 72 6f 6d 69 73 65  ... */...promise
2630: 48 61 6e 64 6c 65 20 3d 20 6e 65 77 20 50 72 6f  Handle = new Pro
2640: 6d 69 73 65 28 66 75 6e 63 74 69 6f 6e 28 72 65  mise(function(re
2650: 73 6f 6c 76 65 2c 20 72 65 6a 65 63 74 29 20 7b  solve, reject) {
2660: 0a 09 09 09 70 72 6f 6d 69 73 65 52 65 73 6f 6c  ....promiseResol
2670: 76 65 20 3d 20 72 65 73 6f 6c 76 65 3b 0a 09 09  ve = resolve;...
2680: 09 70 72 6f 6d 69 73 65 52 65 6a 65 63 74 20 3d  .promiseReject =
2690: 20 72 65 6a 65 63 74 3b 0a 09 09 7d 29 3b 0a 0a   reject;...});..
26a0: 09 09 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b  ..chromeCallback
26b0: 20 3d 20 66 75 6e 63 74 69 6f 6e 28 63 65 72 74   = function(cert
26c0: 73 29 20 7b 0a 09 09 09 70 72 6f 6d 69 73 65 52  s) {....promiseR
26d0: 65 73 6f 6c 76 65 28 63 65 72 74 73 29 3b 0a 09  esolve(certs);..
26e0: 09 7d 3b 0a 09 7d 0a 0a 09 63 61 6c 6c 62 61 63  .};..}...callbac
26f0: 6b 49 64 20 3d 20 2b 2b 63 61 63 6b 65 79 4f 75  kId = ++cackeyOu
2700: 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63  tstandingCallbac
2710: 6b 43 6f 75 6e 74 65 72 3b 0a 0a 09 63 61 63 6b  kCounter;...cack
2720: 65 79 49 6e 69 74 50 43 53 43 28 66 75 6e 63 74  eyInitPCSC(funct
2730: 69 6f 6e 28 29 20 7b 0a 09 09 63 61 63 6b 65 79  ion() {...cackey
2740: 48 61 6e 64 6c 65 2e 70 6f 73 74 4d 65 73 73 61  Handle.postMessa
2750: 67 65 28 0a 09 09 09 7b 0a 09 09 09 09 27 74 61  ge(....{.....'ta
2760: 72 67 65 74 27 3a 20 22 63 61 63 6b 65 79 22 2c  rget': "cackey",
2770: 0a 09 09 09 09 27 63 6f 6d 6d 61 6e 64 27 3a 20  .....'command': 
2780: 22 6c 69 73 74 63 65 72 74 69 66 69 63 61 74 65  "listcertificate
2790: 73 22 2c 0a 09 09 09 09 27 69 64 27 3a 20 63 61  s",.....'id': ca
27a0: 6c 6c 62 61 63 6b 49 64 0a 09 09 09 7d 0a 09 09  llbackId....}...
27b0: 29 3b 0a 0a 09 09 63 61 63 6b 65 79 4f 75 74 73  );....cackeyOuts
27c0: 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73  tandingCallbacks
27d0: 5b 63 61 6c 6c 62 61 63 6b 49 64 5d 20 3d 20 63  [callbackId] = c
27e0: 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 3b 0a 0a  hromeCallback;..
27f0: 09 09 69 66 20 28 67 6f 6f 67 2e 44 45 42 55 47  ..if (goog.DEBUG
2800: 29 20 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c  ) {....console.l
2810: 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 54 68 72  og("[cackey] Thr
2820: 6f 77 6e 2e 22 29 3b 0a 09 09 7d 0a 09 7d 2c 20  own.");...}..}, 
2830: 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 3b  chromeCallback);
2840: 0a 0a 09 72 65 74 75 72 6e 28 70 72 6f 6d 69 73  ...return(promis
2850: 65 48 61 6e 64 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a  eHandle);.}../*.
2860: 20 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 6d   * Handler for m
2870: 65 73 73 61 67 65 73 20 66 72 6f 6d 20 43 68 72  essages from Chr
2880: 6f 6d 65 20 72 65 6c 61 74 65 64 20 74 6f 20 6c  ome related to l
2890: 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 0a 20  isting readers. 
28a0: 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b  */.function cack
28b0: 65 79 4c 69 73 74 52 65 61 64 65 72 73 28 63 68  eyListReaders(ch
28c0: 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 20 7b 0a  romeCallback) {.
28d0: 09 76 61 72 20 63 61 6c 6c 62 61 63 6b 49 64 3b  .var callbackId;
28e0: 0a 0a 09 69 66 20 28 67 6f 6f 67 2e 44 45 42 55  ...if (goog.DEBU
28f0: 47 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c  G) {...console.l
2900: 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 41 73 6b  og("[cackey] Ask
2910: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ed to provide a 
2920: 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 20  list of readers 
2930: 2d 2d 20 74 68 72 6f 77 69 6e 67 20 74 68 61 74  -- throwing that
2940: 20 72 65 71 75 65 73 74 20 6f 76 65 72 20 74 6f   request over to
2950: 20 74 68 65 20 4e 61 43 6c 20 73 69 64 65 2e 2e   the NaCl side..
2960: 2e 20 22 29 3b 0a 09 7d 0a 0a 09 63 61 6c 6c 62  . ");..}...callb
2970: 61 63 6b 49 64 20 3d 20 2b 2b 63 61 63 6b 65 79  ackId = ++cackey
2980: 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62  OutstandingCallb
2990: 61 63 6b 43 6f 75 6e 74 65 72 3b 0a 0a 09 63 61  ackCounter;...ca
29a0: 63 6b 65 79 49 6e 69 74 50 43 53 43 28 66 75 6e  ckeyInitPCSC(fun
29b0: 63 74 69 6f 6e 28 29 20 7b 0a 09 09 63 61 63 6b  ction() {...cack
29c0: 65 79 48 61 6e 64 6c 65 2e 70 6f 73 74 4d 65 73  eyHandle.postMes
29d0: 73 61 67 65 28 0a 09 09 09 7b 0a 09 09 09 09 27  sage(....{.....'
29e0: 74 61 72 67 65 74 27 3a 20 22 63 61 63 6b 65 79  target': "cackey
29f0: 22 2c 0a 09 09 09 09 27 63 6f 6d 6d 61 6e 64 27  ",.....'command'
2a00: 3a 20 22 6c 69 73 74 72 65 61 64 65 72 73 22 2c  : "listreaders",
2a10: 0a 09 09 09 09 27 69 64 27 3a 20 63 61 6c 6c 62  .....'id': callb
2a20: 61 63 6b 49 64 0a 09 09 09 7d 0a 09 09 29 3b 0a  ackId....}...);.
2a30: 0a 09 09 63 61 63 6b 65 79 4f 75 74 73 74 61 6e  ...cackeyOutstan
2a40: 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73 5b 63 61  dingCallbacks[ca
2a50: 6c 6c 62 61 63 6b 49 64 5d 20 3d 20 63 68 72 6f  llbackId] = chro
2a60: 6d 65 43 61 6c 6c 62 61 63 6b 3b 0a 0a 09 09 69  meCallback;....i
2a70: 66 20 28 67 6f 6f 67 2e 44 45 42 55 47 29 20 7b  f (goog.DEBUG) {
2a80: 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28  ....console.log(
2a90: 22 5b 63 61 63 6b 65 79 5d 20 54 68 72 6f 77 6e  "[cackey] Thrown
2aa0: 2e 22 29 3b 0a 09 09 7d 0a 09 7d 2c 20 63 68 72  .");...}..}, chr
2ab0: 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09  omeCallback);...
2ac0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
2ad0: 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 6d 65 73   Handler for mes
2ae0: 73 61 67 65 73 20 66 72 6f 6d 20 43 68 72 6f 6d  sages from Chrom
2af0: 65 20 72 65 6c 61 74 65 64 20 74 6f 20 73 69 67  e related to sig
2b00: 6e 69 6e 67 20 61 20 68 61 73 68 20 6f 66 20 73  ning a hash of s
2b10: 6f 6d 65 20 73 6f 72 74 0a 20 2a 2f 0a 66 75 6e  ome sort. */.fun
2b20: 63 74 69 6f 6e 20 63 61 63 6b 65 79 53 69 67 6e  ction cackeySign
2b30: 4d 65 73 73 61 67 65 28 73 69 67 6e 52 65 71 75  Message(signRequ
2b40: 65 73 74 2c 20 63 68 72 6f 6d 65 43 61 6c 6c 62  est, chromeCallb
2b50: 61 63 6b 29 20 7b 0a 09 76 61 72 20 63 61 6c 6c  ack) {..var call
2b60: 62 61 63 6b 49 64 3b 0a 09 76 61 72 20 63 6f 6d  backId;..var com
2b70: 6d 61 6e 64 3b 0a 09 76 61 72 20 63 65 72 74 69  mand;..var certi
2b80: 66 69 63 61 74 65 49 64 3b 0a 09 76 61 72 20 64  ficateId;..var d
2b90: 69 67 65 73 74 2c 20 64 69 67 65 73 74 48 65 61  igest, digestHea
2ba0: 64 65 72 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 50 72  der;.../*.. * Pr
2bb0: 65 66 69 78 20 74 68 65 20 64 69 67 65 73 74 20  efix the digest 
2bc0: 77 69 74 68 20 74 68 65 20 41 53 4e 2e 31 20 68  with the ASN.1 h
2bd0: 65 61 64 65 72 20 72 65 71 75 69 72 65 64 20 6f  eader required o
2be0: 66 20 69 74 0a 09 20 2a 2f 0a 09 73 77 69 74 63  f it.. */..switc
2bf0: 68 20 28 73 69 67 6e 52 65 71 75 65 73 74 2e 68  h (signRequest.h
2c00: 61 73 68 29 20 7b 0a 09 09 63 61 73 65 20 22 53  ash) {...case "S
2c10: 48 41 31 22 3a 0a 09 09 09 64 69 67 65 73 74 48  HA1":....digestH
2c20: 65 61 64 65 72 20 3d 20 6e 65 77 20 55 69 6e 74  eader = new Uint
2c30: 38 41 72 72 61 79 28 5b 30 78 33 30 2c 20 30 78  8Array([0x30, 0x
2c40: 32 31 2c 20 30 78 33 30 2c 20 30 78 30 39 2c 20  21, 0x30, 0x09, 
2c50: 30 78 30 36 2c 20 30 78 30 35 2c 20 30 78 32 62  0x06, 0x05, 0x2b
2c60: 2c 20 30 78 30 65 2c 20 30 78 30 33 2c 20 30 78  , 0x0e, 0x03, 0x
2c70: 30 32 2c 20 30 78 31 61 2c 20 30 78 30 35 2c 20  02, 0x1a, 0x05, 
2c80: 30 78 30 30 2c 20 30 78 30 34 2c 20 30 78 31 34  0x00, 0x04, 0x14
2c90: 5d 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ]);....break;...
2ca0: 63 61 73 65 20 22 53 48 41 32 35 36 22 3a 0a 09  case "SHA256":..
2cb0: 09 09 64 69 67 65 73 74 48 65 61 64 65 72 20 3d  ..digestHeader =
2cc0: 20 6e 65 77 20 55 69 6e 74 38 41 72 72 61 79 28   new Uint8Array(
2cd0: 5b 30 78 33 30 2c 20 30 78 33 31 2c 20 30 78 33  [0x30, 0x31, 0x3
2ce0: 30 2c 20 30 78 30 64 2c 20 30 78 30 36 2c 20 30  0, 0x0d, 0x06, 0
2cf0: 78 30 39 2c 20 30 78 36 30 2c 20 30 78 38 36 2c  x09, 0x60, 0x86,
2d00: 20 30 78 34 38 2c 20 30 78 30 31 2c 20 30 78 36   0x48, 0x01, 0x6
2d10: 35 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30  5, 0x03, 0x04, 0
2d20: 78 30 32 2c 20 30 78 30 31 2c 20 30 78 30 35 2c  x02, 0x01, 0x05,
2d30: 20 30 78 30 30 2c 20 30 78 30 34 2c 20 30 78 32   0x00, 0x04, 0x2
2d40: 30 5d 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  0]);....break;..
2d50: 09 63 61 73 65 20 22 4d 44 35 5f 53 48 41 31 22  .case "MD5_SHA1"
2d60: 3a 0a 09 09 09 64 69 67 65 73 74 48 65 61 64 65  :....digestHeade
2d70: 72 20 3d 20 6e 65 77 20 55 69 6e 74 38 41 72 72  r = new Uint8Arr
2d80: 61 79 28 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  ay();....break;.
2d90: 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 63 6f  ..default:....co
2da0: 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 22 5b 63 61  nsole.error("[ca
2db0: 63 6b 65 79 5d 20 41 73 6b 65 64 20 74 6f 20 73  ckey] Asked to s
2dc0: 69 67 6e 20 61 20 6d 65 73 73 61 67 65 20 77 69  ign a message wi
2dd0: 74 68 20 61 20 68 61 73 68 20 77 65 20 64 6f 20  th a hash we do 
2de0: 6e 6f 74 20 73 75 70 70 6f 72 74 3a 20 22 20 2b  not support: " +
2df0: 20 73 69 67 6e 52 65 71 75 65 73 74 2e 68 61 73   signRequest.has
2e00: 68 29 3b 0a 0a 09 09 09 63 68 72 6f 6d 65 43 61  h);.....chromeCa
2e10: 6c 6c 62 61 63 6b 28 29 3b 0a 0a 09 09 09 72 65  llback();.....re
2e20: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 64 69 67 65 73  turn;..}...diges
2e30: 74 20 3d 20 6e 65 77 20 55 69 6e 74 38 41 72 72  t = new Uint8Arr
2e40: 61 79 28 64 69 67 65 73 74 48 65 61 64 65 72 2e  ay(digestHeader.
2e50: 6c 65 6e 67 74 68 20 2b 20 73 69 67 6e 52 65 71  length + signReq
2e60: 75 65 73 74 2e 64 69 67 65 73 74 2e 62 79 74 65  uest.digest.byte
2e70: 4c 65 6e 67 74 68 29 3b 0a 09 64 69 67 65 73 74  Length);..digest
2e80: 2e 73 65 74 28 64 69 67 65 73 74 48 65 61 64 65  .set(digestHeade
2e90: 72 2c 20 30 29 3b 0a 09 64 69 67 65 73 74 2e 73  r, 0);..digest.s
2ea0: 65 74 28 6e 65 77 20 55 69 6e 74 38 41 72 72 61  et(new Uint8Arra
2eb0: 79 28 73 69 67 6e 52 65 71 75 65 73 74 2e 64 69  y(signRequest.di
2ec0: 67 65 73 74 29 2c 20 64 69 67 65 73 74 48 65 61  gest), digestHea
2ed0: 64 65 72 2e 6c 65 6e 67 74 68 29 3b 0a 0a 09 64  der.length);...d
2ee0: 65 6c 65 74 65 20 64 69 67 65 73 74 48 65 61 64  elete digestHead
2ef0: 65 72 3b 0a 0a 09 69 66 20 28 67 6f 6f 67 2e 44  er;...if (goog.D
2f00: 45 42 55 47 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c  EBUG) {...consol
2f10: 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20  e.log("[cackey] 
2f20: 41 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 61 20  Asked to sign a 
2f30: 6d 65 73 73 61 67 65 20 2d 2d 20 74 68 72 6f 77  message -- throw
2f40: 69 6e 67 20 74 68 61 74 20 72 65 71 75 65 73 74  ing that request
2f50: 20 6f 76 65 72 20 74 6f 20 74 68 65 20 4e 61 43   over to the NaC
2f60: 6c 20 73 69 64 65 2e 2e 2e 20 22 29 3b 0a 09 7d  l side... ");..}
2f70: 0a 0a 09 63 61 6c 6c 62 61 63 6b 49 64 20 3d 20  ...callbackId = 
2f80: 2b 2b 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64  ++cackeyOutstand
2f90: 69 6e 67 43 61 6c 6c 62 61 63 6b 43 6f 75 6e 74  ingCallbackCount
2fa0: 65 72 3b 0a 0a 09 63 6f 6d 6d 61 6e 64 20 3d 20  er;...command = 
2fb0: 7b 0a 09 09 27 74 61 72 67 65 74 27 3a 20 22 63  {...'target': "c
2fc0: 61 63 6b 65 79 22 2c 0a 09 09 27 63 6f 6d 6d 61  ackey",...'comma
2fd0: 6e 64 27 3a 20 22 73 69 67 6e 22 2c 0a 09 09 27  nd': "sign",...'
2fe0: 69 64 27 3a 20 63 61 6c 6c 62 61 63 6b 49 64 2c  id': callbackId,
2ff0: 0a 09 09 27 63 65 72 74 69 66 69 63 61 74 65 27  ...'certificate'
3000: 3a 20 73 69 67 6e 52 65 71 75 65 73 74 2e 63 65  : signRequest.ce
3010: 72 74 69 66 69 63 61 74 65 2c 0a 09 09 27 64 61  rtificate,...'da
3020: 74 61 27 3a 20 64 69 67 65 73 74 2e 62 75 66 66  ta': digest.buff
3030: 65 72 0a 09 7d 3b 0a 0a 09 63 65 72 74 69 66 69  er..};...certifi
3040: 63 61 74 65 49 64 20 3d 20 63 61 63 6b 65 79 43  cateId = cackeyC
3050: 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e 49  ertificateToPINI
3060: 44 28 63 6f 6d 6d 61 6e 64 2e 63 65 72 74 69 66  D(command.certif
3070: 69 63 61 74 65 29 3b 0a 0a 09 69 66 20 28 63 61  icate);...if (ca
3080: 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54  ckeyCertificateT
3090: 6f 50 49 4e 4d 61 70 5b 63 65 72 74 69 66 69 63  oPINMap[certific
30a0: 61 74 65 49 64 5d 20 26 26 20 63 61 63 6b 65 79  ateId] && cackey
30b0: 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e  CertificateToPIN
30c0: 4d 61 70 5b 63 65 72 74 69 66 69 63 61 74 65 49  Map[certificateI
30d0: 64 5d 2e 70 69 6e 29 20 7b 0a 09 09 63 6f 6d 6d  d].pin) {...comm
30e0: 61 6e 64 2e 70 69 6e 20 3d 20 63 61 63 6b 65 79  and.pin = cackey
30f0: 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e  CertificateToPIN
3100: 4d 61 70 5b 63 65 72 74 69 66 69 63 61 74 65 49  Map[certificateI
3110: 64 5d 2e 70 69 6e 3b 0a 0a 09 09 63 61 63 6b 65  d].pin;....cacke
3120: 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49  yCertificateToPI
3130: 4e 4d 61 70 55 70 64 61 74 65 4c 61 73 74 55 73  NMapUpdateLastUs
3140: 65 64 28 63 65 72 74 69 66 69 63 61 74 65 49 64  ed(certificateId
3150: 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 49 6e  );..}...cackeyIn
3160: 69 74 50 43 53 43 28 66 75 6e 63 74 69 6f 6e 28  itPCSC(function(
3170: 29 20 7b 0a 09 09 63 61 63 6b 65 79 48 61 6e 64  ) {...cackeyHand
3180: 6c 65 2e 70 6f 73 74 4d 65 73 73 61 67 65 28 63  le.postMessage(c
3190: 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 63 61 63 6b  ommand);....cack
31a0: 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43 61 6c  eyOutstandingCal
31b0: 6c 62 61 63 6b 73 5b 63 61 6c 6c 62 61 63 6b 49  lbacks[callbackI
31c0: 64 5d 20 3d 20 63 68 72 6f 6d 65 43 61 6c 6c 62  d] = chromeCallb
31d0: 61 63 6b 3b 0a 0a 09 09 69 66 20 28 67 6f 6f 67  ack;....if (goog
31e0: 2e 44 45 42 55 47 29 20 7b 0a 09 09 09 63 6f 6e  .DEBUG) {....con
31f0: 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65  sole.log("[cacke
3200: 79 5d 20 54 68 72 6f 77 6e 2e 22 29 3b 0a 09 09  y] Thrown.");...
3210: 7d 0a 09 7d 2c 20 63 68 72 6f 6d 65 43 61 6c 6c  }..}, chromeCall
3220: 62 61 63 6b 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  back);...return;
3230: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 6e 69 74 69 74  .}../*. * Unitit
3240: 61 6c 69 7a 65 73 20 74 68 65 20 43 41 43 4b 65  alizes the CACKe
3250: 79 20 50 43 53 43 20 63 6f 6e 6e 65 63 74 69 6f  y PCSC connectio
3260: 6e 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63  n. */.function c
3270: 61 63 6b 65 79 55 6e 69 6e 69 74 50 43 53 43 28  ackeyUninitPCSC(
3280: 29 20 7b 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67  ) {..console.log
3290: 28 22 5b 63 61 63 6b 65 79 5d 20 63 61 63 6b 65  ("[cackey] cacke
32a0: 79 55 6e 69 6e 69 74 50 43 53 43 28 29 20 63 61  yUninitPCSC() ca
32b0: 6c 6c 65 64 22 29 3b 0a 0a 09 69 66 20 28 63 61  lled");...if (ca
32c0: 63 6b 65 79 50 43 53 43 48 61 6e 64 6c 65 20 21  ckeyPCSCHandle !
32d0: 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09 63 6f 6e 73  = null) {...cons
32e0: 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79  ole.log("[cackey
32f0: 5d 20 44 65 6c 65 74 69 6e 67 20 50 43 53 43 20  ] Deleting PCSC 
3300: 68 61 6e 64 6c 65 22 29 3b 0a 0a 09 09 63 61 63  handle");....cac
3310: 6b 65 79 50 43 53 43 48 61 6e 64 6c 65 20 3d 20  keyPCSCHandle = 
3320: 6e 75 6c 6c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  null;..}...cacke
3330: 79 50 43 53 43 48 61 6e 64 6c 65 55 73 61 62 6c  yPCSCHandleUsabl
3340: 65 20 3d 20 66 61 6c 73 65 3b 0a 0a 09 63 6f 6e  e = false;...con
3350: 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65  sole.log("[cacke
3360: 79 5d 20 63 61 63 6b 65 79 55 6e 69 6e 69 74 50  y] cackeyUninitP
3370: 43 53 43 28 29 20 72 65 74 75 72 6e 69 6e 67 22  CSC() returning"
3380: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );...return;.}..
3390: 2f 2a 0a 20 2a 20 55 6e 69 6e 69 74 69 61 6c 69  /*. * Uninitiali
33a0: 7a 65 73 20 43 41 43 4b 65 79 20 28 70 72 6f 62  zes CACKey (prob
33b0: 61 62 6c 79 20 64 75 65 20 74 6f 20 61 20 63 72  ably due to a cr
33c0: 61 73 68 29 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f  ash). */.functio
33d0: 6e 20 63 61 63 6b 65 79 55 6e 69 6e 69 74 28 29  n cackeyUninit()
33e0: 20 7b 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28   {..console.log(
33f0: 22 5b 63 61 63 6b 65 79 5d 20 63 61 63 6b 65 79  "[cackey] cackey
3400: 55 6e 69 6e 69 74 28 29 20 63 61 6c 6c 65 64 22  Uninit() called"
3410: 29 3b 0a 0a 09 69 66 20 28 63 68 72 6f 6d 65 2e  );...if (chrome.
3420: 63 65 72 74 69 66 69 63 61 74 65 50 72 6f 76 69  certificateProvi
3430: 64 65 72 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65  der) {...console
3440: 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 55  .log("[cackey] U
3450: 6e 72 65 67 69 73 74 65 72 65 64 20 43 68 72 6f  nregistered Chro
3460: 6d 65 20 63 65 72 74 69 66 69 63 61 74 65 20 68  me certificate h
3470: 61 6e 64 6c 65 72 73 22 29 3b 0a 0a 09 09 63 68  andlers");....ch
3480: 72 6f 6d 65 2e 63 65 72 74 69 66 69 63 61 74 65  rome.certificate
3490: 50 72 6f 76 69 64 65 72 2e 6f 6e 43 65 72 74 69  Provider.onCerti
34a0: 66 69 63 61 74 65 73 52 65 71 75 65 73 74 65 64  ficatesRequested
34b0: 2e 72 65 6d 6f 76 65 4c 69 73 74 65 6e 65 72 28  .removeListener(
34c0: 63 61 63 6b 65 79 4c 69 73 74 43 65 72 74 69 66  cackeyListCertif
34d0: 69 63 61 74 65 73 29 3b 0a 09 09 63 68 72 6f 6d  icates);...chrom
34e0: 65 2e 63 65 72 74 69 66 69 63 61 74 65 50 72 6f  e.certificatePro
34f0: 76 69 64 65 72 2e 6f 6e 53 69 67 6e 44 69 67 65  vider.onSignDige
3500: 73 74 52 65 71 75 65 73 74 65 64 2e 72 65 6d 6f  stRequested.remo
3510: 76 65 4c 69 73 74 65 6e 65 72 28 63 61 63 6b 65  veListener(cacke
3520: 79 53 69 67 6e 4d 65 73 73 61 67 65 29 3b 0a 09  ySignMessage);..
3530: 7d 0a 0a 09 63 61 63 6b 65 79 55 6e 69 6e 69 74  }...cackeyUninit
3540: 50 43 53 43 28 29 3b 0a 0a 09 69 66 20 28 63 61  PCSC();...if (ca
3550: 63 6b 65 79 48 61 6e 64 6c 65 20 21 3d 20 6e 75  ckeyHandle != nu
3560: 6c 6c 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e  ll) {...console.
3570: 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 44 65  log("[cackey] De
3580: 6c 65 74 69 6e 67 20 50 4e 61 43 6c 20 6d 6f 64  leting PNaCl mod
3590: 75 6c 65 22 29 3b 0a 0a 09 09 74 72 79 20 7b 0a  ule");....try {.
35a0: 09 09 09 64 6f 63 75 6d 65 6e 74 2e 62 6f 64 79  ...document.body
35b0: 2e 72 65 6d 6f 76 65 43 68 69 6c 64 28 63 61 63  .removeChild(cac
35c0: 6b 65 79 48 61 6e 64 6c 65 29 3b 0a 09 09 7d 20  keyHandle);...} 
35d0: 63 61 74 63 68 20 28 65 29 20 7b 20 7d 0a 0a 09  catch (e) { }...
35e0: 09 64 65 6c 65 74 65 20 63 61 63 6b 65 79 48 61  .delete cackeyHa
35f0: 6e 64 6c 65 3b 0a 0a 09 09 63 61 63 6b 65 79 48  ndle;....cackeyH
3600: 61 6e 64 6c 65 20 3d 20 6e 75 6c 6c 3b 0a 09 7d  andle = null;..}
3610: 0a 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22  ...console.log("
3620: 5b 63 61 63 6b 65 79 5d 20 63 61 63 6b 65 79 55  [cackey] cackeyU
3630: 6e 69 6e 69 74 28 29 20 63 6f 6d 70 6c 65 74 65  ninit() complete
3640: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  ");...return;.}.
3650: 0a 2f 2a 0a 20 2a 20 52 65 73 74 61 72 74 73 20  ./*. * Restarts 
3660: 43 41 43 4b 65 79 0a 20 2a 2f 0a 66 75 6e 63 74  CACKey. */.funct
3670: 69 6f 6e 20 63 61 63 6b 65 79 52 65 73 74 61 72  ion cackeyRestar
3680: 74 28 29 20 7b 0a 09 63 61 63 6b 65 79 55 6e 69  t() {..cackeyUni
3690: 6e 69 74 28 29 3b 0a 09 63 61 63 6b 65 79 49 6e  nit();..cackeyIn
36a0: 69 74 28 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  it();...return;.
36b0: 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b  }..function cack
36c0: 65 79 49 6e 69 74 47 6c 6f 62 61 6c 53 74 61 74  eyInitGlobalStat
36d0: 65 28 29 20 7b 0a 09 63 61 63 6b 65 79 4f 75 74  e() {..cackeyOut
36e0: 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b  standingCallback
36f0: 73 20 3d 20 7b 7d 3b 0a 7d 3b 0a 0a 2f 2a 0a 20  s = {};.};../*. 
3700: 2a 20 48 61 6e 64 6c 65 20 61 20 43 41 43 4b 65  * Handle a CACKe
3710: 79 20 63 72 61 73 68 20 28 70 72 6f 62 61 62 6c  y crash (probabl
3720: 79 20 64 75 65 20 74 6f 20 6c 6f 73 73 20 6f 66  y due to loss of
3730: 20 63 6f 6e 6e 65 63 74 69 76 69 74 79 20 74 6f   connectivity to
3740: 20 74 68 65 20 50 43 53 43 20 64 61 65 6d 6f 6e   the PCSC daemon
3750: 29 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63  ). */.function c
3760: 61 63 6b 65 79 43 72 61 73 68 28 29 20 7b 0a 09  ackeyCrash() {..
3770: 2f 2a 0a 09 20 2a 20 44 65 2d 69 6e 69 74 69 61  /*.. * De-initia
3780: 6c 69 7a 65 20 43 41 43 4b 65 79 0a 09 20 2a 2f  lize CACKey.. */
3790: 0a 09 63 61 63 6b 65 79 55 6e 69 6e 69 74 28 29  ..cackeyUninit()
37a0: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 52 65 69 6e 69  ;.../*.. * Reini
37b0: 74 69 61 6c 69 7a 65 20 67 6c 6f 62 61 6c 20 73  tialize global s
37c0: 74 61 74 65 0a 09 20 2a 2f 0a 09 63 61 63 6b 65  tate.. */..cacke
37d0: 79 49 6e 69 74 47 6c 6f 62 61 6c 53 74 61 74 65  yInitGlobalState
37e0: 28 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 53 63 68  ();.../*.. * Sch
37f0: 65 64 75 6c 65 20 74 68 65 20 72 65 73 74 61 72  edule the restar
3800: 74 20 74 6f 20 6f 63 63 75 72 20 69 6e 20 33 30  t to occur in 30
3810: 20 73 65 63 6f 6e 64 73 20 69 6e 20 63 61 73 65   seconds in case
3820: 20 77 65 20 72 65 61 6c 6c 79 20 61 72 65 0a 09   we really are..
3830: 20 2a 20 6e 6f 74 20 77 6f 72 6b 69 6e 67 2e 0a   * not working..
3840: 09 20 2a 2f 0a 09 73 65 74 54 69 6d 65 6f 75 74  . */..setTimeout
3850: 28 63 61 63 6b 65 79 49 6e 69 74 2c 20 33 30 30  (cackeyInit, 300
3860: 30 30 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  00);...return;.}
3870: 0a 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65  ..function cacke
3880: 79 49 6e 69 74 50 43 53 43 43 6f 6d 70 6c 65 74  yInitPCSCComplet
3890: 65 64 28 73 74 61 74 65 29 20 7b 0a 09 76 61 72  ed(state) {..var
38a0: 20 69 64 78 3b 0a 0a 09 63 6f 6e 73 6f 6c 65 2e   idx;...console.
38b0: 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 43 6f  log("[cackey] Co
38c0: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6d 70 6c 65 74  nnection complet
38d0: 65 64 20 28 73 74 61 74 65 20 3d 20 5c 22 22 20  ed (state = \"" 
38e0: 2b 20 73 74 61 74 65 20 2b 20 22 5c 22 29 2c 20  + state + "\"), 
38f0: 73 65 6e 64 69 6e 67 20 71 75 65 75 65 64 20 65  sending queued e
3900: 76 65 6e 74 73 3a 20 22 20 2b 20 63 61 63 6b 65  vents: " + cacke
3910: 79 43 61 6c 6c 62 61 63 6b 41 66 74 65 72 49 6e  yCallbackAfterIn
3920: 69 74 2e 6c 65 6e 67 74 68 29 3b 0a 0a 09 73 77  it.length);...sw
3930: 69 74 63 68 20 28 73 74 61 74 65 29 20 7b 0a 09  itch (state) {..
3940: 09 63 61 73 65 20 22 73 75 63 63 65 73 73 22 3a  .case "success":
3950: 0a 09 09 09 63 61 63 6b 65 79 50 43 53 43 48 61  ....cackeyPCSCHa
3960: 6e 64 6c 65 55 73 61 62 6c 65 20 3d 20 74 72 75  ndleUsable = tru
3970: 65 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  e;.....break;...
3980: 63 61 73 65 20 22 66 61 69 6c 75 72 65 22 3a 0a  case "failure":.
3990: 09 09 09 63 61 63 6b 65 79 50 43 53 43 48 61 6e  ...cackeyPCSCHan
39a0: 64 6c 65 55 73 61 62 6c 65 20 3d 20 66 61 6c 73  dleUsable = fals
39b0: 65 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  e;.....break;..}
39c0: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
39d0: 20 69 64 78 20 3c 20 63 61 63 6b 65 79 43 61 6c   idx < cackeyCal
39e0: 6c 62 61 63 6b 41 66 74 65 72 49 6e 69 74 2e 6c  lbackAfterInit.l
39f0: 65 6e 67 74 68 3b 20 69 64 78 2b 2b 29 20 7b 0a  ength; idx++) {.
3a00: 09 09 69 66 20 28 21 63 61 63 6b 65 79 43 61 6c  ..if (!cackeyCal
3a10: 6c 62 61 63 6b 41 66 74 65 72 49 6e 69 74 5b 69  lbackAfterInit[i
3a20: 64 78 5d 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e  dx]) {....contin
3a30: 75 65 3b 0a 09 09 7d 0a 0a 09 09 73 77 69 74 63  ue;...}....switc
3a40: 68 20 28 73 74 61 74 65 29 20 7b 0a 09 09 09 63  h (state) {....c
3a50: 61 73 65 20 22 73 75 63 63 65 73 73 22 3a 0a 09  ase "success":..
3a60: 09 09 09 28 63 61 63 6b 65 79 43 61 6c 6c 62 61  ...(cackeyCallba
3a70: 63 6b 41 66 74 65 72 49 6e 69 74 5b 69 64 78 5d  ckAfterInit[idx]
3a80: 2e 73 75 63 63 65 73 73 43 61 6c 6c 62 61 63 6b  .successCallback
3a90: 29 28 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  )();......break;
3aa0: 0a 09 09 09 63 61 73 65 20 22 66 61 69 6c 75 72  ....case "failur
3ab0: 65 22 3a 0a 09 09 09 09 28 63 61 63 6b 65 79 43  e":.....(cackeyC
3ac0: 61 6c 6c 62 61 63 6b 41 66 74 65 72 49 6e 69 74  allbackAfterInit
3ad0: 5b 69 64 78 5d 2e 66 61 69 6c 75 72 65 43 61 6c  [idx].failureCal
3ae0: 6c 62 61 63 6b 29 28 29 3b 0a 0a 09 09 09 09 62  lback)();......b
3af0: 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 64  reak;...}..}...d
3b00: 65 6c 65 74 65 20 63 61 63 6b 65 79 43 61 6c 6c  elete cackeyCall
3b10: 62 61 63 6b 41 66 74 65 72 49 6e 69 74 3b 0a 0a  backAfterInit;..
3b20: 09 63 61 63 6b 65 79 43 61 6c 6c 62 61 63 6b 41  .cackeyCallbackA
3b30: 66 74 65 72 49 6e 69 74 20 3d 20 5b 5d 3b 0a 0a  fterInit = [];..
3b40: 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63  .console.log("[c
3b50: 61 63 6b 65 79 5d 20 41 6c 6c 20 71 75 65 75 65  ackey] All queue
3b60: 64 20 65 76 65 6e 74 73 20 70 72 6f 63 65 73 73  d events process
3b70: 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  ed");...return;.
3b80: 7d 0a 0a 2f 2a 0a 20 2a 20 49 6e 69 74 69 61 6c  }../*. * Initial
3b90: 69 7a 65 20 74 68 65 20 50 43 53 43 20 63 6f 6e  ize the PCSC con
3ba0: 6e 65 63 74 69 6f 6e 0a 20 2a 2f 0a 66 75 6e 63  nection. */.func
3bb0: 74 69 6f 6e 20 63 61 63 6b 65 79 49 6e 69 74 50  tion cackeyInitP
3bc0: 43 53 43 28 63 61 6c 6c 62 61 63 6b 41 66 74 65  CSC(callbackAfte
3bd0: 72 49 6e 69 74 2c 20 63 61 6c 6c 62 61 63 6b 49  rInit, callbackI
3be0: 6e 69 74 46 61 69 6c 65 64 29 20 7b 0a 09 2f 2a  nitFailed) {../*
3bf0: 0a 09 20 2a 20 53 74 61 72 74 20 74 68 65 20 47  .. * Start the G
3c00: 6f 6f 67 6c 65 20 50 43 53 43 20 49 6e 74 65 72  oogle PCSC Inter
3c10: 66 61 63 65 0a 09 20 2a 2f 0a 09 76 61 72 20 6e  face.. */..var n
3c20: 6f 77 2c 20 6c 61 73 74 55 73 65 64 4d 69 6c 6c  ow, lastUsedMill
3c30: 69 73 65 63 6f 6e 64 73 41 67 6f 3b 0a 0a 09 63  isecondsAgo;...c
3c40: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63  onsole.log("[cac
3c50: 6b 65 79 5d 20 63 61 63 6b 65 79 49 6e 69 74 50  key] cackeyInitP
3c60: 43 53 43 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  CSC() called");.
3c70: 0a 09 6e 6f 77 20 3d 20 28 6e 65 77 20 44 61 74  ..now = (new Dat
3c80: 65 28 29 29 2e 67 65 74 54 69 6d 65 28 29 3b 0a  e()).getTime();.
3c90: 09 6c 61 73 74 55 73 65 64 4d 69 6c 6c 69 73 65  .lastUsedMillise
3ca0: 63 6f 6e 64 73 41 67 6f 20 3d 20 6e 6f 77 20 2d  condsAgo = now -
3cb0: 20 63 61 63 6b 65 79 50 43 53 43 48 61 6e 64 6c   cackeyPCSCHandl
3cc0: 65 4c 61 73 74 55 73 65 64 3b 0a 0a 09 69 66 20  eLastUsed;...if 
3cd0: 28 6c 61 73 74 55 73 65 64 4d 69 6c 6c 69 73 65  (lastUsedMillise
3ce0: 63 6f 6e 64 73 41 67 6f 20 3e 20 33 30 30 30 30  condsAgo > 30000
3cf0: 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f  ) {...console.lo
3d00: 67 28 22 5b 63 61 63 6b 65 79 5d 20 50 43 53 43  g("[cackey] PCSC
3d10: 20 68 61 6e 64 6c 65 20 77 61 73 20 6c 61 73 74   handle was last
3d20: 20 75 73 65 64 20 22 20 2b 20 6c 61 73 74 55 73   used " + lastUs
3d30: 65 64 4d 69 6c 6c 69 73 65 63 6f 6e 64 73 41 67  edMillisecondsAg
3d40: 6f 20 2b 20 22 6d 73 20 61 67 6f 2c 20 72 65 73  o + "ms ago, res
3d50: 74 61 72 74 69 6e 67 20 74 6f 20 67 65 74 20 61  tarting to get a
3d60: 20 6e 65 77 20 68 61 6e 64 6c 65 22 29 3b 0a 09   new handle");..
3d70: 09 63 61 63 6b 65 79 52 65 73 74 61 72 74 28 29  .cackeyRestart()
3d80: 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 50 43 53  ;..}...cackeyPCS
3d90: 43 48 61 6e 64 6c 65 4c 61 73 74 55 73 65 64 20  CHandleLastUsed 
3da0: 3d 20 6e 6f 77 3b 0a 0a 09 2f 2a 0a 09 20 2a 20  = now;.../*.. * 
3db0: 51 75 65 75 65 20 74 68 69 73 20 63 61 6c 6c 62  Queue this callb
3dc0: 61 63 6b 20 74 6f 20 62 65 20 63 6f 6d 70 6c 65  ack to be comple
3dd0: 74 65 64 20 77 68 65 6e 20 69 6e 69 74 69 61 6c  ted when initial
3de0: 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c  ization is compl
3df0: 65 74 65 0a 09 20 2a 2f 0a 09 69 66 20 28 63 61  ete.. */..if (ca
3e00: 6c 6c 62 61 63 6b 41 66 74 65 72 49 6e 69 74 29  llbackAfterInit)
3e10: 20 7b 0a 09 09 63 61 63 6b 65 79 43 61 6c 6c 62   {...cackeyCallb
3e20: 61 63 6b 41 66 74 65 72 49 6e 69 74 2e 70 75 73  ackAfterInit.pus
3e30: 68 28 7b 22 73 75 63 63 65 73 73 43 61 6c 6c 62  h({"successCallb
3e40: 61 63 6b 22 3a 20 63 61 6c 6c 62 61 63 6b 41 66  ack": callbackAf
3e50: 74 65 72 49 6e 69 74 2c 20 22 66 61 69 6c 75 72  terInit, "failur
3e60: 65 43 61 6c 6c 62 61 63 6b 22 3a 20 63 61 6c 6c  eCallback": call
3e70: 62 61 63 6b 49 6e 69 74 46 61 69 6c 65 64 7d 29  backInitFailed})
3e80: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4e 6f  ;..}.../*.. * No
3e90: 20 61 64 64 69 74 69 6f 6e 61 6c 20 77 6f 72 6b   additional work
3ea0: 20 69 73 20 72 65 71 75 69 72 65 64 0a 09 20 2a   is required.. *
3eb0: 2f 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 50 43  /...if (cackeyPC
3ec0: 53 43 48 61 6e 64 6c 65 29 20 7b 0a 09 09 63 6f  SCHandle) {...co
3ed0: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b  nsole.log("[cack
3ee0: 65 79 5d 20 50 43 53 43 20 68 61 6e 64 6c 65 20  ey] PCSC handle 
3ef0: 69 73 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  is already valid
3f00: 2c 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e  , nothing to do.
3f10: 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ");....if (cacke
3f20: 79 50 43 53 43 48 61 6e 64 6c 65 55 73 61 62 6c  yPCSCHandleUsabl
3f30: 65 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 49 6e  e) {....cackeyIn
3f40: 69 74 50 43 53 43 43 6f 6d 70 6c 65 74 65 64 28  itPCSCCompleted(
3f50: 22 73 75 63 63 65 73 73 22 29 3b 0a 09 09 7d 0a  "success");...}.
3f60: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
3f70: 2f 2a 0a 09 20 2a 20 53 61 6e 65 6c 79 20 69 6e  /*.. * Sanely in
3f80: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 0a 09 20  itialize this.. 
3f90: 2a 2f 0a 09 63 61 63 6b 65 79 50 43 53 43 48 61  */..cackeyPCSCHa
3fa0: 6e 64 6c 65 55 73 61 62 6c 65 20 3d 20 66 61 6c  ndleUsable = fal
3fb0: 73 65 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 49 6e 69  se;.../*.. * Ini
3fc0: 74 69 61 6c 69 7a 65 20 74 68 65 20 43 41 43 4b  tialize the CACK
3fd0: 65 79 20 50 4e 61 43 6c 20 6d 6f 64 75 6c 65 20  ey PNaCl module 
3fe0: 69 66 20 6e 65 65 64 65 64 0a 09 20 2a 2f 0a 09  if needed.. */..
3ff0: 69 66 20 28 63 61 63 6b 65 79 48 61 6e 64 6c 65  if (cackeyHandle
4000: 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 09 09 63 61   == null) {...ca
4010: 63 6b 65 79 49 6e 69 74 28 29 3b 0a 09 7d 0a 0a  ckeyInit();..}..
4020: 09 2f 2a 0a 09 20 2a 20 49 6e 69 74 69 61 6c 69  ./*.. * Initiali
4030: 7a 65 20 43 41 43 4b 65 79 20 77 69 74 68 20 74  ze CACKey with t
4040: 68 65 20 63 6f 72 72 65 63 74 20 68 61 6e 64 6c  he correct handl
4050: 65 20 74 6f 20 74 61 6c 6b 20 74 6f 20 74 68 65  e to talk to the
4060: 20 47 6f 6f 67 6c 65 20 53 6d 61 72 74 63 61 72   Google Smartcar
4070: 64 20 4d 61 6e 61 67 65 72 20 41 70 70 0a 09 20  d Manager App.. 
4080: 2a 2f 0a 09 63 61 63 6b 65 79 48 61 6e 64 6c 65  */..cackeyHandle
4090: 2e 70 6f 73 74 4d 65 73 73 61 67 65 28 0a 09 09  .postMessage(...
40a0: 7b 0a 09 09 09 22 74 61 72 67 65 74 22 3a 20 22  {...."target": "
40b0: 63 61 63 6b 65 79 22 2c 0a 09 09 09 22 63 6f 6d  cackey",...."com
40c0: 6d 61 6e 64 22 3a 20 22 69 6e 69 74 22 0a 09 09  mand": "init"...
40d0: 7d 0a 09 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 49  }..);.../*.. * I
40e0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43  nitialize the PC
40f0: 53 43 20 4e 61 43 6c 20 69 6e 74 65 72 66 61 63  SC NaCl interfac
4100: 65 0a 09 20 2a 2f 0a 09 63 61 63 6b 65 79 50 43  e.. */..cackeyPC
4110: 53 43 48 61 6e 64 6c 65 20 3d 20 6e 65 77 20 47  SCHandle = new G
4120: 6f 6f 67 6c 65 53 6d 61 72 74 43 61 72 64 2e 50  oogleSmartCard.P
4130: 63 73 63 4c 69 74 65 43 6c 69 65 6e 74 2e 4e 61  cscLiteClient.Na
4140: 63 6c 43 6c 69 65 6e 74 42 61 63 6b 65 6e 64 28  clClientBackend(
4150: 0a 09 09 6e 75 6c 6c 2c 0a 09 09 22 43 41 43 4b  ...null,..."CACK
4160: 65 79 22 2c 0a 09 09 22 6b 68 70 66 65 61 61 6e  ey",..."khpfeaan
4170: 6a 6e 67 6d 63 6e 70 6c 62 64 6c 70 65 67 69 69  jngmcnplbdlpegii
4180: 66 67 70 66 67 64 63 6f 22 2c 0a 09 09 63 61 63  fgpfgdco",...cac
4190: 6b 65 79 48 61 6e 64 6c 65 0a 09 29 3b 20 0a 0a  keyHandle..); ..
41a0: 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63  .console.log("[c
41b0: 61 63 6b 65 79 5d 20 63 61 63 6b 65 79 49 6e 69  ackey] cackeyIni
41c0: 74 50 43 53 43 28 29 20 63 6f 6d 70 6c 65 74 65  tPCSC() complete
41d0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  ");...return;.}.
41e0: 0a 2f 2a 0a 20 2a 20 46 69 6e 69 73 68 20 70 65  ./*. * Finish pe
41f0: 72 66 6f 72 6d 69 6e 67 20 69 6e 69 74 69 61 6c  rforming initial
4200: 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 6d 75 73  ization that mus
4210: 74 20 77 61 69 74 20 75 6e 74 69 6c 20 77 65 20  t wait until we 
4220: 68 61 76 65 20 6c 6f 61 64 65 64 20 74 68 65 20  have loaded the 
4230: 43 41 43 4b 65 79 20 6d 6f 64 75 6c 65 0a 20 2a  CACKey module. *
4240: 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65  /.function cacke
4250: 79 49 6e 69 74 4c 6f 61 64 65 64 28 6d 65 73 73  yInitLoaded(mess
4260: 61 67 65 45 76 65 6e 74 29 20 7b 0a 09 63 6f 6e  ageEvent) {..con
4270: 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65  sole.log("[cacke
4280: 79 5d 20 4c 6f 61 64 65 64 20 43 41 43 4b 65 79  y] Loaded CACKey
4290: 20 50 4e 61 43 6c 20 4d 6f 64 75 6c 65 22 29 3b   PNaCl Module");
42a0: 0a 0a 09 2f 2a 20 52 65 67 69 73 74 65 72 20 6c  .../* Register l
42b0: 69 73 74 65 6e 65 72 73 20 77 69 74 68 20 43 68  isteners with Ch
42c0: 72 6f 6d 65 20 2a 2f 0a 09 69 66 20 28 63 68 72  rome */..if (chr
42d0: 6f 6d 65 2e 63 65 72 74 69 66 69 63 61 74 65 50  ome.certificateP
42e0: 72 6f 76 69 64 65 72 29 20 7b 0a 09 09 63 6f 6e  rovider) {...con
42f0: 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65  sole.log("[cacke
4300: 79 5d 20 52 65 67 69 73 74 65 72 65 64 20 43 65  y] Registered Ce
4310: 72 74 69 66 69 63 61 74 65 20 68 61 6e 64 6c 65  rtificate handle
4320: 72 73 20 77 69 74 68 20 43 68 72 6f 6d 65 22 29  rs with Chrome")
4330: 3b 0a 0a 09 09 63 68 72 6f 6d 65 2e 63 65 72 74  ;....chrome.cert
4340: 69 66 69 63 61 74 65 50 72 6f 76 69 64 65 72 2e  ificateProvider.
4350: 6f 6e 43 65 72 74 69 66 69 63 61 74 65 73 52 65  onCertificatesRe
4360: 71 75 65 73 74 65 64 2e 61 64 64 4c 69 73 74 65  quested.addListe
4370: 6e 65 72 28 63 61 63 6b 65 79 4c 69 73 74 43 65  ner(cackeyListCe
4380: 72 74 69 66 69 63 61 74 65 73 29 3b 0a 09 09 63  rtificates);...c
4390: 68 72 6f 6d 65 2e 63 65 72 74 69 66 69 63 61 74  hrome.certificat
43a0: 65 50 72 6f 76 69 64 65 72 2e 6f 6e 53 69 67 6e  eProvider.onSign
43b0: 44 69 67 65 73 74 52 65 71 75 65 73 74 65 64 2e  DigestRequested.
43c0: 61 64 64 4c 69 73 74 65 6e 65 72 28 63 61 63 6b  addListener(cack
43d0: 65 79 53 69 67 6e 4d 65 73 73 61 67 65 29 3b 0a  eySignMessage);.
43e0: 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .}...return;.}..
43f0: 2f 2a 0a 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*. * Initialize
4400: 20 43 41 43 4b 65 79 20 61 6e 64 20 74 68 65 20   CACKey and the 
4410: 50 43 53 43 20 6c 69 62 72 61 72 79 20 66 72 6f  PCSC library fro
4420: 6d 20 47 6f 6f 67 6c 65 0a 20 2a 2f 0a 66 75 6e  m Google. */.fun
4430: 63 74 69 6f 6e 20 63 61 63 6b 65 79 49 6e 69 74  ction cackeyInit
4440: 28 29 20 7b 0a 09 76 61 72 20 65 6c 65 6d 65 6e  () {..var elemen
4450: 74 45 6d 62 65 64 3b 0a 09 76 61 72 20 66 6f 72  tEmbed;..var for
4460: 63 65 4c 6f 61 64 45 6c 65 6d 65 6e 74 3b 0a 0a  ceLoadElement;..
4470: 09 2f 2a 20 4c 6f 67 20 74 68 61 74 20 77 65 20  ./* Log that we 
4480: 61 72 65 20 6f 70 65 72 61 74 69 6f 6e 61 6c 20  are operational 
4490: 2a 2f 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28  */..console.log(
44a0: 22 5b 63 61 63 6b 65 79 5d 20 63 61 63 6b 65 79  "[cackey] cackey
44b0: 49 6e 69 74 28 29 3a 20 43 61 6c 6c 65 64 2e 22  Init(): Called."
44c0: 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 44 6f 20 6e  );.../*.. * Do n
44d0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 6d 75  ot initialize mu
44e0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 09 20 2a  ltiple times.. *
44f0: 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 48 61 6e  /..if (cackeyHan
4500: 64 6c 65 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 09  dle != null) {..
4510: 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63  .console.log("[c
4520: 61 63 6b 65 79 5d 20 63 61 63 6b 65 79 49 6e 69  ackey] cackeyIni
4530: 74 28 29 3a 20 41 6c 72 65 61 64 79 20 69 6e 69  t(): Already ini
4540: 74 69 61 6c 69 7a 65 64 2e 20 20 52 65 74 75 72  tialized.  Retur
4550: 6e 69 6e 67 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ning.");....retu
4560: 72 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69  rn;..}.../* Veri
4570: 66 79 20 74 68 61 74 20 77 65 20 63 61 6e 20 72  fy that we can r
4580: 65 67 69 73 74 65 72 20 63 61 6c 6c 62 61 63 6b  egister callback
4590: 73 20 2a 2f 0a 09 69 66 20 28 21 63 68 72 6f 6d  s */..if (!chrom
45a0: 65 2e 63 65 72 74 69 66 69 63 61 74 65 50 72 6f  e.certificatePro
45b0: 76 69 64 65 72 29 20 7b 0a 09 09 69 66 20 28 21  vider) {...if (!
45c0: 67 6f 6f 67 2e 44 45 42 55 47 29 20 7b 0a 09 09  goog.DEBUG) {...
45d0: 09 63 6f 6e 73 6f 6c 65 2e 69 6e 66 6f 28 22 5b  .console.info("[
45e0: 63 61 63 6b 65 79 5d 20 54 68 69 73 20 65 78 74  cackey] This ext
45f0: 65 6e 73 69 6f 6e 27 73 20 70 72 69 6d 61 72 79  ension's primary
4600: 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 6f   functionality o
4610: 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 43 68 72  nly works on Chr
4620: 6f 6d 65 4f 53 21 20 20 59 6f 75 20 77 6f 6e 27  omeOS!  You won'
4630: 74 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 20  t be able to do 
4640: 6d 75 63 68 20 77 69 74 68 20 69 74 2e 22 29 3b  much with it.");
4650: 0a 09 09 7d 0a 09 7d 0a 0a 09 65 6c 65 6d 65 6e  ...}..}...elemen
4660: 74 45 6d 62 65 64 20 3d 20 64 6f 63 75 6d 65 6e  tEmbed = documen
4670: 74 2e 63 72 65 61 74 65 45 6c 65 6d 65 6e 74 28  t.createElement(
4680: 27 65 6d 62 65 64 27 29 3b 0a 09 65 6c 65 6d 65  'embed');..eleme
4690: 6e 74 45 6d 62 65 64 2e 74 79 70 65 20 3d 20 22  ntEmbed.type = "
46a0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 6e  application/x-pn
46b0: 61 63 6c 22 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d  acl";..elementEm
46c0: 62 65 64 2e 77 69 64 74 68 20 3d 20 30 3b 0a 09  bed.width = 0;..
46d0: 65 6c 65 6d 65 6e 74 45 6d 62 65 64 2e 68 65 69  elementEmbed.hei
46e0: 67 68 74 20 3d 20 30 3b 0a 09 65 6c 65 6d 65 6e  ght = 0;..elemen
46f0: 74 45 6d 62 65 64 2e 73 72 63 20 3d 20 22 63 61  tEmbed.src = "ca
4700: 63 6b 65 79 2e 6e 6d 66 22 3b 0a 09 65 6c 65 6d  ckey.nmf";..elem
4710: 65 6e 74 45 6d 62 65 64 2e 69 64 20 3d 20 22 63  entEmbed.id = "c
4720: 61 63 6b 65 79 4d 6f 64 75 6c 65 22 3b 0a 09 65  ackeyModule";..e
4730: 6c 65 6d 65 6e 74 45 6d 62 65 64 2e 61 64 64 45  lementEmbed.addE
4740: 76 65 6e 74 4c 69 73 74 65 6e 65 72 28 27 65 72  ventListener('er
4750: 72 6f 72 27 2c 20 66 75 6e 63 74 69 6f 6e 28 6d  ror', function(m
4760: 65 73 73 61 67 65 45 76 65 6e 74 29 20 7b 20 63  essageEvent) { c
4770: 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 22 45 72  onsole.error("Er
4780: 72 6f 72 20 6c 6f 61 64 69 6e 67 20 43 41 43 4b  ror loading CACK
4790: 65 79 20 50 4e 61 43 6c 20 4d 6f 64 75 6c 65 3a  ey PNaCl Module:
47a0: 20 22 20 2b 20 6d 65 73 73 61 67 65 45 76 65 6e   " + messageEven
47b0: 74 2e 64 61 74 61 29 3b 20 7d 2c 20 74 72 75 65  t.data); }, true
47c0: 29 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64  );..elementEmbed
47d0: 2e 61 64 64 45 76 65 6e 74 4c 69 73 74 65 6e 65  .addEventListene
47e0: 72 28 27 6c 6f 61 64 27 2c 20 63 61 63 6b 65 79  r('load', cackey
47f0: 49 6e 69 74 4c 6f 61 64 65 64 2c 20 74 72 75 65  InitLoaded, true
4800: 29 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64  );..elementEmbed
4810: 2e 61 64 64 45 76 65 6e 74 4c 69 73 74 65 6e 65  .addEventListene
4820: 72 28 27 63 72 61 73 68 27 2c 20 63 61 63 6b 65  r('crash', cacke
4830: 79 43 72 61 73 68 2c 20 74 72 75 65 29 3b 0a 09  yCrash, true);..
4840: 65 6c 65 6d 65 6e 74 45 6d 62 65 64 2e 61 64 64  elementEmbed.add
4850: 45 76 65 6e 74 4c 69 73 74 65 6e 65 72 28 27 6d  EventListener('m
4860: 65 73 73 61 67 65 27 2c 20 63 61 63 6b 65 79 4d  essage', cackeyM
4870: 65 73 73 61 67 65 49 6e 63 6f 6d 69 6e 67 2c 20  essageIncoming, 
4880: 74 72 75 65 29 3b 0a 0a 09 63 61 63 6b 65 79 48  true);...cackeyH
4890: 61 6e 64 6c 65 20 3d 20 65 6c 65 6d 65 6e 74 45  andle = elementE
48a0: 6d 62 65 64 3b 0a 0a 09 64 6f 63 75 6d 65 6e 74  mbed;...document
48b0: 2e 62 6f 64 79 2e 61 70 70 65 6e 64 43 68 69 6c  .body.appendChil
48c0: 64 28 63 61 63 6b 65 79 48 61 6e 64 6c 65 29 0a  d(cackeyHandle).
48d0: 0a 09 2f 2a 0a 09 20 2a 20 46 6f 72 63 65 20 74  ../*.. * Force t
48e0: 68 65 20 62 72 6f 77 73 65 72 20 74 6f 20 6c 6f  he browser to lo
48f0: 61 64 20 74 68 65 20 65 6c 65 6d 65 6e 74 0a 09  ad the element..
4900: 20 2a 20 62 79 20 72 65 71 75 65 73 74 69 6e 67   * by requesting
4910: 20 69 74 73 20 70 6f 73 69 74 69 6f 6e 0a 09 20   its position.. 
4920: 2a 2f 0a 09 66 6f 72 63 65 4c 6f 61 64 45 6c 65  */..forceLoadEle
4930: 6d 65 6e 74 20 3d 20 63 61 63 6b 65 79 48 61 6e  ment = cackeyHan
4940: 64 6c 65 2e 6f 66 66 73 65 74 54 6f 70 3b 0a 0a  dle.offsetTop;..
4950: 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63  .console.log("[c
4960: 61 63 6b 65 79 5d 20 63 61 63 6b 65 79 49 6e 69  ackey] cackeyIni
4970: 74 28 29 3a 20 43 6f 6d 70 6c 65 74 65 64 2e 20  t(): Completed. 
4980: 20 52 65 74 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a   Returning.");..
4990: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
49a0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
49b0: 20 43 41 43 4b 65 79 20 43 68 72 6f 6d 65 20 41   CACKey Chrome A
49c0: 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 2f 0a 66  pplication. */.f
49d0: 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 41 70  unction cackeyAp
49e0: 70 49 6e 69 74 28 29 20 7b 0a 09 76 61 72 20 6f  pInit() {..var o
49f0: 6c 64 4f 6e 50 6f 72 74 44 69 73 63 6f 6e 6e 65  ldOnPortDisconne
4a00: 63 74 65 64 46 75 6e 63 74 69 6f 6e 3b 0a 09 76  ctedFunction;..v
4a10: 61 72 20 6f 6c 64 50 43 53 43 49 6e 69 74 69 61  ar oldPCSCInitia
4a20: 6c 69 7a 61 74 69 6f 6e 43 61 6c 6c 62 61 63 6b  lizationCallback
4a30: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 43 72 65 61 74  ;.../*.. * Creat
4a40: 65 20 61 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  e a handler for 
4a50: 73 74 61 72 74 69 6e 67 20 74 68 65 20 61 70 70  starting the app
4a60: 6c 69 63 61 74 69 6f 6e 20 55 49 0a 09 20 2a 2f  lication UI.. */
4a70: 0a 09 63 68 72 6f 6d 65 2e 61 70 70 2e 72 75 6e  ..chrome.app.run
4a80: 74 69 6d 65 2e 6f 6e 4c 61 75 6e 63 68 65 64 2e  time.onLaunched.
4a90: 61 64 64 4c 69 73 74 65 6e 65 72 28 66 75 6e 63  addListener(func
4aa0: 74 69 6f 6e 28 29 20 7b 0a 09 09 63 68 72 6f 6d  tion() {...chrom
4ab0: 65 2e 61 70 70 2e 77 69 6e 64 6f 77 2e 63 72 65  e.app.window.cre
4ac0: 61 74 65 28 27 75 69 2e 68 74 6d 6c 27 2c 20 7b  ate('ui.html', {
4ad0: 0a 09 09 09 22 69 64 22 3a 20 22 63 61 63 6b 65  ...."id": "cacke
4ae0: 79 55 49 22 2c 0a 09 09 09 22 66 6f 63 75 73 65  yUI",...."focuse
4af0: 64 22 3a 20 74 72 75 65 2c 0a 09 09 09 22 69 6e  d": true,...."in
4b00: 6e 65 72 42 6f 75 6e 64 73 22 3a 20 7b 0a 09 09  nerBounds": {...
4b10: 09 09 22 77 69 64 74 68 22 3a 20 33 35 30 2c 0a  .."width": 350,.
4b20: 09 09 09 09 22 6d 69 6e 57 69 64 74 68 22 3a 20  ...."minWidth": 
4b30: 33 35 30 2c 0a 09 09 09 09 22 68 65 69 67 68 74  350,....."height
4b40: 22 3a 20 31 33 36 2c 0a 09 09 09 09 22 6d 69 6e  ": 136,....."min
4b50: 48 65 69 67 68 74 22 3a 20 31 33 35 0a 09 09 09  Height": 135....
4b60: 7d 0a 09 09 7d 2c 20 66 75 6e 63 74 69 6f 6e 28  }...}, function(
4b70: 75 69 57 69 6e 64 6f 77 29 20 7b 0a 09 09 09 69  uiWindow) {....i
4b80: 66 20 28 21 75 69 57 69 6e 64 6f 77 29 20 7b 0a  f (!uiWindow) {.
4b90: 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09 7d  ....return;....}
4ba0: 0a 0a 09 09 09 75 69 57 69 6e 64 6f 77 2e 63 6f  .....uiWindow.co
4bb0: 6e 74 65 6e 74 57 69 6e 64 6f 77 2e 70 61 72 65  ntentWindow.pare
4bc0: 6e 74 57 69 6e 64 6f 77 20 3d 20 77 69 6e 64 6f  ntWindow = windo
4bd0: 77 3b 0a 09 09 7d 29 3b 0a 09 7d 29 3b 0a 0a 2f  w;...});..});../
4be0: 2f 20 47 6f 6f 67 6c 65 20 67 6f 74 20 72 69 64  / Google got rid
4bf0: 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 63   of all of the c
4c00: 6f 64 65 20 77 65 20 77 65 72 65 20 75 73 69 6e  ode we were usin
4c10: 67 20 74 6f 20 69 6e 74 65 72 66 61 63 65 20 77  g to interface w
4c20: 69 74 68 20 50 43 53 43 2e 2e 2e 20 0a 2f 2f 20  ith PCSC... .// 
4c30: 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
4c40: 20 72 65 77 72 69 74 74 65 6e 20 74 6f 20 75 73   rewritten to us
4c50: 65 20 74 68 65 20 6e 65 77 20 69 6e 74 65 72 66  e the new interf
4c60: 61 63 65 0a 2f 2f 0a 2f 2f 09 2f 2a 0a 2f 2f 09  ace.//.//./*.//.
4c70: 20 2a 20 52 65 67 69 73 74 65 72 20 61 20 68 61   * Register a ha
4c80: 6e 64 6c 65 72 20 66 6f 72 20 64 65 61 6c 69 6e  ndler for dealin
4c90: 67 20 77 69 74 68 20 74 68 65 20 50 43 53 43 20  g with the PCSC 
4ca0: 70 6f 72 74 20 62 65 69 6e 67 20 64 69 73 63 6f  port being disco
4cb0: 6e 6e 65 63 74 65 64 0a 2f 2f 09 20 2a 2f 0a 2f  nnected.//. */./
4cc0: 2f 09 6f 6c 64 4f 6e 50 6f 72 74 44 69 73 63 6f  /.oldOnPortDisco
4cd0: 6e 6e 65 63 74 65 64 46 75 6e 63 74 69 6f 6e 20  nnectedFunction 
4ce0: 3d 20 47 6f 6f 67 6c 65 53 6d 61 72 74 43 61 72  = GoogleSmartCar
4cf0: 64 2e 50 63 73 63 2e 70 72 6f 74 6f 74 79 70 65  d.Pcsc.prototype
4d00: 2e 6f 6e 50 6f 72 74 44 69 73 63 6f 6e 6e 65 63  .onPortDisconnec
4d10: 74 65 64 5f 3b 0a 2f 2f 09 47 6f 6f 67 6c 65 53  ted_;.//.GoogleS
4d20: 6d 61 72 74 43 61 72 64 2e 50 63 73 63 2e 70 72  martCard.Pcsc.pr
4d30: 6f 74 6f 74 79 70 65 2e 6f 6e 50 6f 72 74 44 69  ototype.onPortDi
4d40: 73 63 6f 6e 6e 65 63 74 65 64 5f 20 3d 20 66 75  sconnected_ = fu
4d50: 6e 63 74 69 6f 6e 28 29 20 7b 0a 2f 2f 09 09 6f  nction() {.//..o
4d60: 6c 64 4f 6e 50 6f 72 74 44 69 73 63 6f 6e 6e 65  ldOnPortDisconne
4d70: 63 74 65 64 46 75 6e 63 74 69 6f 6e 2e 61 70 70  ctedFunction.app
4d80: 6c 79 28 74 68 69 73 29 3b 0a 2f 2f 0a 2f 2f 09  ly(this);.//.//.
4d90: 09 63 61 63 6b 65 79 49 6e 69 74 50 43 53 43 43  .cackeyInitPCSCC
4da0: 6f 6d 70 6c 65 74 65 64 28 22 66 61 69 6c 75 72  ompleted("failur
4db0: 65 22 29 3b 0a 2f 2f 0a 2f 2f 09 09 63 61 63 6b  e");.//.//..cack
4dc0: 65 79 52 65 73 74 61 72 74 28 29 3b 0a 2f 2f 0a  eyRestart();.//.
4dd0: 2f 2f 09 09 72 65 74 75 72 6e 3b 0a 2f 2f 09 7d  //..return;.//.}
4de0: 3b 0a 2f 2f 0a 2f 2f 09 2f 2a 0a 2f 2f 09 20 2a  ;.//.//./*.//. *
4df0: 20 52 65 67 69 73 74 65 72 20 61 20 68 61 6e 64   Register a hand
4e00: 6c 65 72 20 66 6f 72 20 64 65 61 6c 69 6e 67 20  ler for dealing 
4e10: 77 69 74 68 20 74 68 65 20 50 43 53 43 20 70 6f  with the PCSC po
4e20: 72 74 20 62 65 69 6e 67 20 61 76 61 69 6c 61 62  rt being availab
4e30: 6c 65 0a 2f 2f 09 20 2a 2f 0a 2f 2f 09 6f 6c 64  le.//. */.//.old
4e40: 50 43 53 43 49 6e 69 74 69 61 6c 69 7a 61 74 69  PCSCInitializati
4e50: 6f 6e 43 61 6c 6c 62 61 63 6b 20 3d 20 47 6f 6f  onCallback = Goo
4e60: 67 6c 65 53 6d 61 72 74 43 61 72 64 2e 50 63 73  gleSmartCard.Pcs
4e70: 63 4e 61 63 6c 2e 70 72 6f 74 6f 74 79 70 65 2e  cNacl.prototype.
4e80: 70 63 73 63 49 6e 69 74 69 61 6c 69 7a 61 74 69  pcscInitializati
4e90: 6f 6e 43 61 6c 6c 62 61 63 6b 5f 3b 0a 2f 2f 09  onCallback_;.//.
4ea0: 47 6f 6f 67 6c 65 53 6d 61 72 74 43 61 72 64 2e  GoogleSmartCard.
4eb0: 50 63 73 63 4e 61 63 6c 2e 70 72 6f 74 6f 74 79  PcscNacl.prototy
4ec0: 70 65 2e 70 63 73 63 49 6e 69 74 69 61 6c 69 7a  pe.pcscInitializ
4ed0: 61 74 69 6f 6e 43 61 6c 6c 62 61 63 6b 5f 20 3d  ationCallback_ =
4ee0: 20 66 75 6e 63 74 69 6f 6e 28 72 65 71 75 65 73   function(reques
4ef0: 74 49 64 2c 20 69 6e 73 74 61 6e 63 65 49 64 2c  tId, instanceId,
4f00: 20 69 6e 73 74 61 6e 63 65 2c 20 65 72 72 6f 72   instance, error
4f10: 29 20 7b 0a 2f 2f 09 09 6f 6c 64 50 43 53 43 49  ) {.//..oldPCSCI
4f20: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 43 61 6c  nitializationCal
4f30: 6c 62 61 63 6b 2e 61 70 70 6c 79 28 74 68 69 73  lback.apply(this
4f40: 2c 20 5b 72 65 71 75 65 73 74 49 64 2c 20 69 6e  , [requestId, in
4f50: 73 74 61 6e 63 65 49 64 2c 20 69 6e 73 74 61 6e  stanceId, instan
4f60: 63 65 2c 20 65 72 72 6f 72 5d 29 3b 0a 2f 2f 0a  ce, error]);.//.
4f70: 2f 2f 09 09 72 65 74 75 72 6e 3b 0a 2f 2f 09 7d  //..return;.//.}
4f80: 3b 0a 2f 2f 0a 09 2f 2a 0a 09 20 2a 20 49 6e 69  ;.//../*.. * Ini
4f90: 74 69 61 6c 69 7a 65 20 67 6c 6f 62 61 6c 20 73  tialize global s
4fa0: 74 61 74 65 0a 09 20 2a 2f 0a 09 63 61 63 6b 65  tate.. */..cacke
4fb0: 79 49 6e 69 74 47 6c 6f 62 61 6c 53 74 61 74 65  yInitGlobalState
4fc0: 28 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  ();...return;.}.
4fd0: 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 43  ./* Initialize C
4fe0: 41 43 4b 65 79 20 2a 2f 0a 63 61 63 6b 65 79 41  ACKey */.cackeyA
4ff0: 70 70 49 6e 69 74 28 29 3b 0a 63 61 63 6b 65 79  ppInit();.cackey
5000: 49 6e 69 74 28 29 3b 0a                          Init();.