Hex Artifact Content

Artifact 10c678f5159125215432c009cd05a6ade6bb7e8d:


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 0a 2f 2a 0a 20 2a 20 48 61   null;../*. * Ha
0160: 6e 64 6c 65 20 61 6e 64 20 49 44 20 66 6f 72 20  ndle and ID for 
0170: 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 61 6c 6c  outstanding call
0180: 62 61 63 6b 73 0a 20 2a 2f 0a 76 61 72 20 63 61  backs. */.var ca
0190: 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43  ckeyOutstandingC
01a0: 61 6c 6c 62 61 63 6b 73 20 3d 20 7b 7d 0a 76 61  allbacks = {}.va
01b0: 72 20 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64  r cackeyOutstand
01c0: 69 6e 67 43 61 6c 6c 62 61 63 6b 43 6f 75 6e 74  ingCallbackCount
01d0: 65 72 20 3d 20 2d 31 3b 0a 0a 2f 2a 0a 20 2a 20  er = -1;../*. * 
01e0: 43 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 20 77 69  Communication wi
01f0: 74 68 20 74 68 65 20 50 49 4e 20 65 6e 74 72 79  th the PIN entry
0200: 20 77 69 6e 64 6f 77 0a 20 2a 2f 0a 76 61 72 20   window. */.var 
0210: 70 69 6e 57 69 6e 64 6f 77 50 49 4e 56 61 6c 75  pinWindowPINValu
0220: 65 20 3d 20 22 22 3b 0a 76 61 72 20 70 69 6e 57  e = "";.var pinW
0230: 69 6e 64 6f 77 50 72 65 76 69 6f 75 73 48 61 6e  indowPreviousHan
0240: 64 6c 65 20 3d 20 6e 75 6c 6c 3b 0a 0a 2f 2a 0a  dle = null;../*.
0250: 20 2a 20 4d 65 73 73 61 67 65 73 20 74 68 61 74   * Messages that
0260: 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
0270: 72 65 74 72 69 65 64 20 61 66 74 65 72 20 67 65  retried after ge
0280: 74 74 69 6e 67 20 61 20 50 49 4e 0a 20 2a 2f 0a  tting a PIN. */.
0290: 76 61 72 20 63 61 63 6b 65 79 4d 65 73 73 61 67  var cackeyMessag
02a0: 65 73 54 6f 52 65 74 72 79 20 3d 20 5b 5d 3b 0a  esToRetry = [];.
02b0: 0a 2f 2a 0a 20 2a 20 53 74 6f 72 65 64 20 50 49  ./*. * Stored PI
02c0: 4e 20 66 6f 72 20 61 20 67 69 76 65 6e 20 63 65  N for a given ce
02d0: 72 74 69 66 69 63 61 74 65 0a 20 2a 2f 0a 76 61  rtificate. */.va
02e0: 72 20 63 61 63 6b 65 79 43 65 72 74 69 66 69 63  r cackeyCertific
02f0: 61 74 65 54 6f 50 49 4e 4d 61 70 20 3d 20 7b 7d  ateToPINMap = {}
0300: 3b 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d 70 75 74 65  ;../*. * Compute
0310: 20 61 20 74 65 78 74 2d 62 61 73 65 64 20 68 61   a text-based ha
0320: 6e 64 6c 65 20 66 6f 72 20 61 20 63 65 72 74 69  ndle for a certi
0330: 66 69 63 61 74 65 20 74 6f 20 62 65 20 68 61 73  ficate to be has
0340: 68 65 64 20 62 79 0a 20 2a 2f 0a 66 75 6e 63 74  hed by. */.funct
0350: 69 6f 6e 20 63 61 63 6b 65 79 43 65 72 74 69 66  ion cackeyCertif
0360: 69 63 61 74 65 54 6f 50 49 4e 49 44 28 63 65 72  icateToPINID(cer
0370: 74 69 66 69 63 61 74 65 29 20 7b 0a 09 76 61 72  tificate) {..var
0380: 20 69 64 3b 0a 09 76 61 72 20 63 65 72 74 69 66   id;..var certif
0390: 69 63 61 74 65 41 72 72 61 79 3b 0a 0a 09 69 64  icateArray;...id
03a0: 20 3d 20 22 22 3b 0a 0a 09 63 65 72 74 69 66 69   = "";...certifi
03b0: 63 61 74 65 41 72 72 61 79 20 3d 20 6e 65 77 20  cateArray = new 
03c0: 55 69 6e 74 38 41 72 72 61 79 28 63 65 72 74 69  Uint8Array(certi
03d0: 66 69 63 61 74 65 29 3b 0a 0a 09 63 65 72 74 69  ficate);...certi
03e0: 66 69 63 61 74 65 41 72 72 61 79 2e 6d 61 70 28  ficateArray.map(
03f0: 0a 09 09 66 75 6e 63 74 69 6f 6e 28 62 79 74 65  ...function(byte
0400: 29 20 7b 0a 09 09 09 69 64 20 2b 3d 20 28 22 30  ) {....id += ("0
0410: 22 20 2b 20 62 79 74 65 2e 74 6f 53 74 72 69 6e  " + byte.toStrin
0420: 67 28 31 36 29 29 2e 73 6c 69 63 65 28 2d 32 29  g(16)).slice(-2)
0430: 3b 0a 09 09 7d 0a 09 29 3b 0a 0a 09 64 65 6c 65  ;...}..);...dele
0440: 74 65 20 63 65 72 74 69 66 69 63 61 74 65 41 72  te certificateAr
0450: 72 61 79 3b 0a 0a 09 72 65 74 75 72 6e 28 69 64  ray;...return(id
0460: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64  );.}../*. * Hand
0470: 6c 65 20 61 20 72 65 73 70 6f 6e 73 65 20 66 72  le a response fr
0480: 6f 6d 20 74 68 65 20 4e 61 43 6c 20 73 69 64 65  om the NaCl side
0490: 20 72 65 67 61 72 64 69 6e 67 20 63 65 72 74 69   regarding certi
04a0: 66 69 63 61 74 65 73 20 61 76 61 69 6c 61 62 6c  ficates availabl
04b0: 65 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63  e. */.function c
04c0: 61 63 6b 65 79 4d 65 73 73 61 67 65 49 6e 63 6f  ackeyMessageInco
04d0: 6d 69 6e 67 4c 69 73 74 43 65 72 74 69 66 69 63  mingListCertific
04e0: 61 74 65 73 28 6d 65 73 73 61 67 65 2c 20 63 68  ates(message, ch
04f0: 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29 20 7b 0a  romeCallback) {.
0500: 09 76 61 72 20 69 64 78 3b 0a 09 76 61 72 20 63  .var idx;..var c
0510: 65 72 74 69 66 69 63 61 74 65 73 20 3d 20 5b 5d  ertificates = []
0520: 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ;...for (idx = 0
0530: 3b 20 69 64 78 20 3c 20 6d 65 73 73 61 67 65 2e  ; idx < message.
0540: 63 65 72 74 69 66 69 63 61 74 65 73 2e 6c 65 6e  certificates.len
0550: 67 74 68 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  gth; idx++) {...
0560: 63 65 72 74 69 66 69 63 61 74 65 73 2e 70 75 73  certificates.pus
0570: 68 28 0a 09 09 09 7b 0a 09 09 09 09 63 65 72 74  h(....{.....cert
0580: 69 66 69 63 61 74 65 3a 20 6d 65 73 73 61 67 65  ificate: message
0590: 2e 63 65 72 74 69 66 69 63 61 74 65 73 5b 69 64  .certificates[id
05a0: 78 5d 2c 0a 09 09 09 09 73 75 70 70 6f 72 74 65  x],.....supporte
05b0: 64 48 61 73 68 65 73 3a 20 5b 27 53 48 41 31 27  dHashes: ['SHA1'
05c0: 2c 20 27 53 48 41 32 35 36 27 5d 0a 09 09 09 7d  , 'SHA256']....}
05d0: 0a 09 09 29 3b 0a 09 7d 0a 0a 09 63 68 72 6f 6d  ...);..}...chrom
05e0: 65 43 61 6c 6c 62 61 63 6b 28 63 65 72 74 69 66  eCallback(certif
05f0: 69 63 61 74 65 73 2c 0a 09 09 66 75 6e 63 74 69  icates,...functi
0600: 6f 6e 28 72 65 6a 65 63 74 65 64 43 65 72 74 73  on(rejectedCerts
0610: 29 20 7b 0a 09 09 09 69 66 20 28 63 68 72 6f 6d  ) {....if (chrom
0620: 65 2e 72 75 6e 74 69 6d 65 2e 6c 61 73 74 45 72  e.runtime.lastEr
0630: 72 6f 72 29 20 7b 0a 09 09 09 09 72 65 74 75 72  ror) {.....retur
0640: 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  n;....}.....if (
0650: 72 65 6a 65 63 74 65 64 43 65 72 74 73 2e 6c 65  rejectedCerts.le
0660: 6e 67 74 68 20 21 3d 3d 20 30 29 20 7b 0a 09 09  ngth !== 0) {...
0670: 09 09 6f 6e 43 65 72 74 69 66 69 63 61 74 65 73  ..onCertificates
0680: 52 65 6a 65 63 74 65 64 28 72 65 6a 65 63 74 65  Rejected(rejecte
0690: 64 43 65 72 74 73 29 3b 0a 09 09 09 7d 0a 0a 09  dCerts);....}...
06a0: 09 09 72 65 74 75 72 6e 3b 0a 09 09 7d 0a 09 29  ..return;...}..)
06b0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c  ;.}../*. * Handl
06c0: 65 20 61 20 72 65 73 70 6f 6e 73 65 20 66 72 6f  e a response fro
06d0: 6d 20 74 68 65 20 4e 61 43 6c 20 73 69 64 65 20  m the NaCl side 
06e0: 72 65 67 61 72 64 69 6e 67 20 73 69 67 6e 69 6e  regarding signin
06f0: 67 20 61 20 6d 65 73 73 61 67 65 0a 20 2a 2f 0a  g a message. */.
0700: 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 4d  function cackeyM
0710: 65 73 73 61 67 65 49 6e 63 6f 6d 69 6e 67 53 69  essageIncomingSi
0720: 67 6e 4d 65 73 73 61 67 65 28 6d 65 73 73 61 67  gnMessage(messag
0730: 65 2c 20 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63  e, chromeCallbac
0740: 6b 29 20 7b 0a 09 76 61 72 20 70 61 79 6c 6f 61  k) {..var payloa
0750: 64 3b 0a 0a 09 70 61 79 6c 6f 61 64 20 3d 20 6d  d;...payload = m
0760: 65 73 73 61 67 65 2e 73 69 67 6e 65 64 44 61 74  essage.signedDat
0770: 61 3b 0a 0a 09 63 68 72 6f 6d 65 43 61 6c 6c 62  a;...chromeCallb
0780: 61 63 6b 28 70 61 79 6c 6f 61 64 29 3b 0a 7d 0a  ack(payload);.}.
0790: 0a 2f 2a 0a 20 2a 20 48 61 6e 64 6c 65 20 61 6e  ./*. * Handle an
07a0: 20 69 6e 63 6f 6d 69 6e 67 20 6d 65 73 73 61 67   incoming messag
07b0: 65 20 66 72 6f 6d 20 74 68 65 20 4e 61 43 6c 20  e from the NaCl 
07c0: 73 69 64 65 20 61 6e 64 20 70 61 73 73 20 69 74  side and pass it
07d0: 20 6f 66 66 20 74 6f 0a 20 2a 20 6f 6e 65 20 6f   off to. * one o
07e0: 66 20 74 68 65 20 68 61 6e 64 6c 65 72 73 20 61  f the handlers a
07f0: 62 6f 76 65 20 66 6f 72 20 61 63 74 75 61 6c 20  bove for actual 
0800: 66 6f 72 6d 61 74 74 69 6e 67 20 61 6e 64 20 70  formatting and p
0810: 61 73 73 69 6e 67 20 74 6f 0a 20 2a 20 74 68 65  assing to. * the
0820: 20 63 61 6c 6c 62 61 63 6b 0a 20 2a 0a 20 2a 20   callback. *. * 
0830: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
0840: 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  red, invoke the 
0850: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 6e 6f  callback with no
0860: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 2a 2f 0a   arguments.. */.
0870: 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 4d  function cackeyM
0880: 65 73 73 61 67 65 49 6e 63 6f 6d 69 6e 67 28 6d  essageIncoming(m
0890: 65 73 73 61 67 65 45 76 65 6e 74 29 20 7b 0a 09  essageEvent) {..
08a0: 76 61 72 20 6e 65 78 74 46 75 6e 63 74 69 6f 6e  var nextFunction
08b0: 20 3d 20 6e 75 6c 6c 3b 0a 09 76 61 72 20 63 68   = null;..var ch
08c0: 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 20 3d 20 6e  romeCallback = n
08d0: 75 6c 6c 3b 0a 0a 09 69 66 20 28 6d 65 73 73 61  ull;...if (messa
08e0: 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 74 61 72  geEvent.data.tar
08f0: 67 65 74 20 21 3d 20 22 63 61 63 6b 65 79 22 29  get != "cackey")
0900: 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a   {...return;..}.
0910: 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 53  ..console.log("S
0920: 54 41 52 54 20 4d 45 53 53 41 47 45 22 29 3b 0a  TART MESSAGE");.
0930: 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 6d 65 73  .console.log(mes
0940: 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 29 3b  sageEvent.data);
0950: 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 45  ..console.log("E
0960: 4e 44 20 4d 45 53 53 41 47 45 22 29 3b 0a 0a 09  ND MESSAGE");...
0970: 2f 2a 0a 09 20 2a 20 49 66 20 77 65 20 66 61 69  /*.. * If we fai
0980: 6c 65 64 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  led for some rea
0990: 73 6f 6e 20 61 6e 64 20 77 65 20 68 61 76 65 20  son and we have 
09a0: 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e  a certificate in
09b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 09 20   the original.. 
09c0: 2a 20 72 65 71 75 65 73 74 20 74 68 65 6e 20 66  * request then f
09d0: 6f 72 67 65 74 20 61 6e 79 20 50 49 4e 20 61 73  orget any PIN as
09e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
09f0: 61 74 20 63 65 72 74 69 66 69 63 61 74 65 0a 09  at certificate..
0a00: 20 2a 2f 0a 09 69 66 20 28 6d 65 73 73 61 67 65   */..if (message
0a10: 45 76 65 6e 74 2e 64 61 74 61 2e 73 74 61 74 75  Event.data.statu
0a20: 73 20 21 3d 20 22 73 75 63 63 65 73 73 22 29 20  s != "success") 
0a30: 7b 0a 09 09 69 66 20 28 6d 65 73 73 61 67 65 45  {...if (messageE
0a40: 76 65 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69 6e  vent.data.origin
0a50: 61 6c 72 65 71 75 65 73 74 2e 63 65 72 74 69 66  alrequest.certif
0a60: 69 63 61 74 65 29 20 7b 0a 09 09 09 64 65 6c 65  icate) {....dele
0a70: 74 65 20 63 61 63 6b 65 79 43 65 72 74 69 66 69  te cackeyCertifi
0a80: 63 61 74 65 54 6f 50 49 4e 4d 61 70 5b 63 61 63  cateToPINMap[cac
0a90: 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f  keyCertificateTo
0aa0: 50 49 4e 49 44 28 6d 65 73 73 61 67 65 45 76 65  PINID(messageEve
0ab0: 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69 6e 61 6c  nt.data.original
0ac0: 72 65 71 75 65 73 74 2e 63 65 72 74 69 66 69 63  request.certific
0ad0: 61 74 65 29 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  ate)];...}..}...
0ae0: 69 66 20 28 6d 65 73 73 61 67 65 45 76 65 6e 74  if (messageEvent
0af0: 2e 64 61 74 61 2e 69 64 20 3d 3d 20 6e 75 6c 6c  .data.id == null
0b00: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
0b10: 0a 0a 09 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63  ...chromeCallbac
0b20: 6b 20 3d 20 63 61 63 6b 65 79 4f 75 74 73 74 61  k = cackeyOutsta
0b30: 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73 5b 6d  ndingCallbacks[m
0b40: 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61  essageEvent.data
0b50: 2e 69 64 5d 3b 0a 0a 09 69 66 20 28 63 68 72 6f  .id];...if (chro
0b60: 6d 65 43 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e 75  meCallback == nu
0b70: 6c 6c 29 20 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e  ll) {...console.
0b80: 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 44 69  log("[cackey] Di
0b90: 73 63 61 72 64 69 6e 67 20 6f 75 74 64 61 74 65  scarding outdate
0ba0: 64 20 6d 65 73 73 61 67 65 22 29 3b 0a 0a 09 09  d message");....
0bb0: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 73 77 69  return;..}...swi
0bc0: 74 63 68 20 28 6d 65 73 73 61 67 65 45 76 65 6e  tch (messageEven
0bd0: 74 2e 64 61 74 61 2e 73 74 61 74 75 73 29 20 7b  t.data.status) {
0be0: 0a 09 09 63 61 73 65 20 22 65 72 72 6f 72 22 3a  ...case "error":
0bf0: 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f  ....console.erro
0c00: 72 28 22 5b 63 61 63 6b 65 79 5d 20 46 61 69 6c  r("[cackey] Fail
0c10: 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 63 6f  ed to execute co
0c20: 6d 6d 61 6e 64 20 27 22 20 2b 20 6d 65 73 73 61  mmand '" + messa
0c30: 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 63 6f 6d  geEvent.data.com
0c40: 6d 61 6e 64 20 2b 20 22 27 3a 20 22 20 2b 20 6d  mand + "': " + m
0c50: 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61  essageEvent.data
0c60: 2e 65 72 72 6f 72 29 3b 0a 0a 09 09 09 63 68 72  .error);.....chr
0c70: 6f 6d 65 43 61 6c 6c 62 61 63 6b 28 29 3b 0a 0a  omeCallback();..
0c80: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
0c90: 20 22 72 65 74 72 79 22 3a 0a 09 09 09 2f 2a 0a   "retry":..../*.
0ca0: 09 09 09 20 2a 20 41 64 64 20 74 68 65 20 6e 65  ... * Add the ne
0cb0: 77 20 72 65 71 75 65 73 74 20 74 6f 20 74 68 65  w request to the
0cc0: 20 71 75 65 75 65 20 6f 66 20 65 76 65 6e 74 73   queue of events
0cd0: 20 74 6f 20 70 72 6f 63 65 73 73 20 77 68 65 6e   to process when
0ce0: 20 74 68 65 20 50 49 4e 0a 09 09 09 20 2a 20 70   the PIN.... * p
0cf0: 72 6f 6d 70 74 20 69 73 20 74 65 72 6d 69 6e 61  rompt is termina
0d00: 74 65 64 2e 0a 09 09 09 20 2a 2f 0a 09 09 09 63  ted..... */....c
0d10: 61 63 6b 65 79 4d 65 73 73 61 67 65 73 54 6f 52  ackeyMessagesToR
0d20: 65 74 72 79 2e 70 75 73 68 28 6d 65 73 73 61 67  etry.push(messag
0d30: 65 45 76 65 6e 74 29 3b 0a 0a 09 09 09 69 66 20  eEvent);.....if 
0d40: 28 70 69 6e 57 69 6e 64 6f 77 50 72 65 76 69 6f  (pinWindowPrevio
0d50: 75 73 48 61 6e 64 6c 65 29 20 7b 0a 09 09 09 09  usHandle) {.....
0d60: 2f 2a 0a 09 09 09 09 20 2a 20 41 6e 20 65 78 69  /*..... * An exi
0d70: 73 74 69 6e 67 20 50 49 4e 20 65 6e 74 72 79 20  sting PIN entry 
0d80: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 0a 09  is in progress..
0d90: 09 09 09 20 2a 20 4a 75 73 74 20 61 64 64 20 74  ... * Just add t
0da0: 68 65 20 72 65 71 75 65 73 74 20 74 6f 20 74 68  he request to th
0db0: 65 20 71 75 65 75 65 20 28 61 62 6f 76 65 29 20  e queue (above) 
0dc0: 61 6e 64 20 77 61 69 74 0a 09 09 09 09 20 2a 2f  and wait..... */
0dd0: 0a 0a 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09  ......return;...
0de0: 09 7d 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20  .}...../*.... * 
0df0: 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 20 74  Set the handle t
0e00: 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 28 62 75  o an invalid (bu
0e10: 74 20 6e 6f 6e 2d 6e 75 6c 6c 29 20 76 61 6c 75  t non-null) valu
0e20: 65 20 75 6e 74 69 6c 20 74 68 65 20 77 69 6e 64  e until the wind
0e30: 6f 77 0a 09 09 09 20 2a 20 69 73 20 63 72 65 61  ow.... * is crea
0e40: 74 65 64 20 69 6e 20 63 61 73 65 20 77 65 20 61  ted in case we a
0e50: 72 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e  re invoked again
0e60: 20 73 6f 6f 6e 2e 0a 09 09 09 20 2a 2f 0a 09 09   soon..... */...
0e70: 09 70 69 6e 57 69 6e 64 6f 77 50 72 65 76 69 6f  .pinWindowPrevio
0e80: 75 73 48 61 6e 64 6c 65 20 3d 20 22 69 6e 76 61  usHandle = "inva
0e90: 6c 69 64 22 3b 0a 0a 09 09 09 63 68 72 6f 6d 65  lid";.....chrome
0ea0: 2e 61 70 70 2e 77 69 6e 64 6f 77 2e 63 72 65 61  .app.window.crea
0eb0: 74 65 28 22 70 69 6e 2e 68 74 6d 6c 22 2c 20 7b  te("pin.html", {
0ec0: 0a 09 09 09 09 22 69 64 22 3a 20 22 63 61 63 6b  ....."id": "cack
0ed0: 65 79 50 49 4e 45 6e 74 72 79 22 2c 0a 09 09 09  eyPINEntry",....
0ee0: 09 22 72 65 73 69 7a 61 62 6c 65 22 3a 20 66 61  ."resizable": fa
0ef0: 6c 73 65 2c 0a 09 09 09 09 22 61 6c 77 61 79 73  lse,....."always
0f00: 4f 6e 54 6f 70 22 3a 20 74 72 75 65 2c 0a 09 09  OnTop": true,...
0f10: 09 09 22 66 6f 63 75 73 65 64 22 3a 20 74 72 75  .."focused": tru
0f20: 65 2c 0a 09 09 09 09 22 76 69 73 69 62 6c 65 4f  e,....."visibleO
0f30: 6e 41 6c 6c 57 6f 72 6b 73 70 61 63 65 73 22 3a  nAllWorkspaces":
0f40: 20 74 72 75 65 2c 0a 09 09 09 09 22 69 6e 6e 65   true,....."inne
0f50: 72 42 6f 75 6e 64 73 22 3a 20 7b 0a 09 09 09 09  rBounds": {.....
0f60: 09 22 77 69 64 74 68 22 3a 20 33 35 30 2c 0a 09  ."width": 350,..
0f70: 09 09 09 09 22 6d 69 6e 57 69 64 74 68 22 3a 20  ...."minWidth": 
0f80: 33 35 30 2c 0a 09 09 09 09 09 22 68 65 69 67 68  350,......"heigh
0f90: 74 22 3a 20 31 33 35 2c 0a 09 09 09 09 09 22 6d  t": 135,......"m
0fa0: 69 6e 48 65 69 67 68 74 22 3a 20 31 33 35 0a 09  inHeight": 135..
0fb0: 09 09 09 7d 0a 09 09 09 7d 2c 20 66 75 6e 63 74  ...}....}, funct
0fc0: 69 6f 6e 28 70 69 6e 57 69 6e 64 6f 77 29 20 7b  ion(pinWindow) {
0fd0: 0a 09 09 09 09 2f 2a 0a 09 09 09 09 20 2a 20 53  ...../*..... * S
0fe0: 65 74 20 74 68 65 20 50 49 4e 20 76 61 6c 75 65  et the PIN value
0ff0: 20 74 6f 20 62 6c 61 6e 6b 0a 09 09 09 09 20 2a   to blank..... *
1000: 2f 0a 09 09 09 09 70 69 6e 57 69 6e 64 6f 77 50  /.....pinWindowP
1010: 49 4e 56 61 6c 75 65 20 3d 20 22 22 3b 0a 0a 09  INValue = "";...
1020: 09 09 09 69 66 20 28 21 70 69 6e 57 69 6e 64 6f  ...if (!pinWindo
1030: 77 29 20 7b 0a 09 09 09 09 09 63 6f 6e 73 6f 6c  w) {......consol
1040: 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20  e.log("[cackey] 
1050: 4e 6f 20 77 69 6e 64 6f 77 20 77 61 73 20 70 72  No window was pr
1060: 6f 76 69 64 65 64 20 66 6f 72 20 50 49 4e 20 65  ovided for PIN e
1070: 6e 74 72 79 2c 20 74 68 69 73 20 77 69 6c 6c 20  ntry, this will 
1080: 6e 6f 74 20 67 6f 20 77 65 6c 6c 2e 22 29 3b 0a  not go well.");.
1090: 0a 09 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09  ......return;...
10a0: 09 09 7d 0a 0a 09 09 09 09 70 69 6e 57 69 6e 64  ..}......pinWind
10b0: 6f 77 50 72 65 76 69 6f 75 73 48 61 6e 64 6c 65  owPreviousHandle
10c0: 20 3d 20 70 69 6e 57 69 6e 64 6f 77 3b 0a 0a 09   = pinWindow;...
10d0: 09 09 09 70 69 6e 57 69 6e 64 6f 77 2e 64 72 61  ...pinWindow.dra
10e0: 77 41 74 74 65 6e 74 69 6f 6e 28 29 3b 0a 09 09  wAttention();...
10f0: 09 09 70 69 6e 57 69 6e 64 6f 77 2e 66 6f 63 75  ..pinWindow.focu
1100: 73 28 29 3b 0a 0a 09 09 09 09 2f 2a 0a 09 09 09  s();....../*....
1110: 09 20 2a 20 52 65 67 69 73 74 65 72 20 61 20 68  . * Register a h
1120: 61 6e 64 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  andler to handle
1130: 20 74 68 65 20 77 69 6e 64 6f 77 20 62 65 69 6e   the window bein
1140: 67 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75 74  g closed without
1150: 0a 09 09 09 09 20 2a 20 68 61 76 69 6e 67 20 73  ..... * having s
1160: 65 6e 74 20 61 6e 79 74 68 69 6e 67 0a 09 09 09  ent anything....
1170: 09 20 2a 2f 0a 09 09 09 09 70 69 6e 57 69 6e 64  . */.....pinWind
1180: 6f 77 2e 6f 6e 43 6c 6f 73 65 64 2e 61 64 64 4c  ow.onClosed.addL
1190: 69 73 74 65 6e 65 72 28 66 75 6e 63 74 69 6f 6e  istener(function
11a0: 28 29 20 7b 0a 09 09 09 09 09 76 61 72 20 6d 65  () {......var me
11b0: 73 73 61 67 65 49 64 78 3b 0a 0a 09 09 09 09 09  ssageIdx;.......
11c0: 70 69 6e 57 69 6e 64 6f 77 50 72 65 76 69 6f 75  pinWindowPreviou
11d0: 73 48 61 6e 64 6c 65 20 3d 20 6e 75 6c 6c 3b 0a  sHandle = null;.
11e0: 0a 09 09 09 09 09 66 6f 72 20 28 6d 65 73 73 61  ......for (messa
11f0: 67 65 49 64 78 20 3d 20 30 3b 20 6d 65 73 73 61  geIdx = 0; messa
1200: 67 65 49 64 78 20 3c 20 63 61 63 6b 65 79 4d 65  geIdx < cackeyMe
1210: 73 73 61 67 65 73 54 6f 52 65 74 72 79 2e 6c 65  ssagesToRetry.le
1220: 6e 67 74 68 3b 20 6d 65 73 73 61 67 65 49 64 78  ngth; messageIdx
1230: 2b 2b 29 20 7b 0a 09 09 09 09 09 09 76 61 72 20  ++) {.......var 
1240: 74 6d 70 4d 65 73 73 61 67 65 45 76 65 6e 74 3b  tmpMessageEvent;
1250: 0a 0a 09 09 09 09 09 09 74 6d 70 4d 65 73 73 61  ........tmpMessa
1260: 67 65 45 76 65 6e 74 20 3d 20 63 61 63 6b 65 79  geEvent = cackey
1270: 4d 65 73 73 61 67 65 73 54 6f 52 65 74 72 79 5b  MessagesToRetry[
1280: 6d 65 73 73 61 67 65 49 64 78 5d 3b 0a 0a 09 09  messageIdx];....
1290: 09 09 09 09 69 66 20 28 70 69 6e 57 69 6e 64 6f  ....if (pinWindo
12a0: 77 50 49 4e 56 61 6c 75 65 20 3d 3d 20 22 22 29  wPINValue == "")
12b0: 20 7b 0a 09 09 09 09 09 09 09 63 6f 6e 73 6f 6c   {........consol
12c0: 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20  e.log("[cackey] 
12d0: 54 68 65 20 50 49 4e 20 64 69 61 6c 6f 67 20 77  The PIN dialog w
12e0: 61 73 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75  as closed withou
12f0: 74 20 67 61 74 68 65 72 69 6e 67 20 61 20 50 49  t gathering a PI
1300: 4e 2c 20 74 72 65 61 74 69 6e 67 20 69 74 20 61  N, treating it a
1310: 73 20 61 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a  s a failure.");.
1320: 0a 09 09 09 09 09 09 09 74 6d 70 4d 65 73 73 61  ........tmpMessa
1330: 67 65 45 76 65 6e 74 2e 64 61 74 61 2e 73 74 61  geEvent.data.sta
1340: 74 75 73 20 3d 20 22 65 72 72 6f 72 22 3b 0a 09  tus = "error";..
1350: 09 09 09 09 09 09 74 6d 70 4d 65 73 73 61 67 65  ......tmpMessage
1360: 45 76 65 6e 74 2e 64 61 74 61 2e 65 72 72 6f 72  Event.data.error
1370: 20 3d 20 22 50 49 4e 20 77 69 6e 64 6f 77 20 63   = "PIN window c
1380: 6c 6f 73 65 64 20 77 69 74 68 6f 75 74 20 61 20  losed without a 
1390: 50 49 4e 20 62 65 69 6e 67 20 70 72 6f 76 69 64  PIN being provid
13a0: 65 64 22 3b 0a 0a 09 09 09 09 09 09 09 63 61 63  ed";.........cac
13b0: 6b 65 79 4d 65 73 73 61 67 65 49 6e 63 6f 6d 69  keyMessageIncomi
13c0: 6e 67 28 74 6d 70 4d 65 73 73 61 67 65 45 76 65  ng(tmpMessageEve
13d0: 6e 74 29 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73  nt);.......} els
13e0: 65 20 7b 0a 09 09 09 09 09 09 09 74 6d 70 4d 65  e {........tmpMe
13f0: 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74 61 2e  ssageEvent.data.
1400: 6f 72 69 67 69 6e 61 6c 72 65 71 75 65 73 74 2e  originalrequest.
1410: 70 69 6e 20 3d 20 70 69 6e 57 69 6e 64 6f 77 50  pin = pinWindowP
1420: 49 4e 56 61 6c 75 65 3b 0a 0a 09 09 09 09 09 09  INValue;........
1430: 09 63 61 63 6b 65 79 43 65 72 74 69 66 69 63 61  .cackeyCertifica
1440: 74 65 54 6f 50 49 4e 4d 61 70 5b 63 61 63 6b 65  teToPINMap[cacke
1450: 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49  yCertificateToPI
1460: 4e 49 44 28 74 6d 70 4d 65 73 73 61 67 65 45 76  NID(tmpMessageEv
1470: 65 6e 74 2e 64 61 74 61 2e 6f 72 69 67 69 6e 61  ent.data.origina
1480: 6c 72 65 71 75 65 73 74 2e 63 65 72 74 69 66 69  lrequest.certifi
1490: 63 61 74 65 29 5d 20 3d 20 70 69 6e 57 69 6e 64  cate)] = pinWind
14a0: 6f 77 50 49 4e 56 61 6c 75 65 3b 0a 0a 09 09 09  owPINValue;.....
14b0: 09 09 09 09 63 61 63 6b 65 79 48 61 6e 64 6c 65  ....cackeyHandle
14c0: 2e 70 6f 73 74 4d 65 73 73 61 67 65 28 74 6d 70  .postMessage(tmp
14d0: 4d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61 74  MessageEvent.dat
14e0: 61 2e 6f 72 69 67 69 6e 61 6c 72 65 71 75 65 73  a.originalreques
14f0: 74 29 3b 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09  t);.......}.....
1500: 09 09 09 64 65 6c 65 74 65 20 63 61 63 6b 65 79  ...delete cackey
1510: 4d 65 73 73 61 67 65 73 54 6f 52 65 74 72 79 5b  MessagesToRetry[
1520: 6d 65 73 73 61 67 65 49 64 78 5d 3b 0a 09 09 09  messageIdx];....
1530: 09 09 7d 0a 0a 09 09 09 09 09 2f 2a 0a 09 09 09  ..}......./*....
1540: 09 09 20 2a 20 57 65 20 61 72 65 20 64 6f 6e 65  .. * We are done
1550: 20 66 65 74 63 68 69 6e 67 20 74 68 65 20 75 73   fetching the us
1560: 65 72 20 50 49 4e 2c 20 63 6c 65 61 72 20 74 68  er PIN, clear th
1570: 65 20 76 61 6c 75 65 0a 09 09 09 09 09 20 2a 2f  e value...... */
1580: 0a 09 09 09 09 09 70 69 6e 57 69 6e 64 6f 77 50  ......pinWindowP
1590: 49 4e 56 61 6c 75 65 20 3d 20 22 22 3b 0a 0a 09  INValue = "";...
15a0: 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09 09  ....return;.....
15b0: 7d 29 0a 0a 09 09 09 09 2f 2a 0a 09 09 09 09 20  })....../*..... 
15c0: 2a 20 50 61 73 73 20 74 68 69 73 20 6d 65 73 73  * Pass this mess
15d0: 61 67 65 20 6f 66 66 20 74 6f 20 74 68 65 20 6f  age off to the o
15e0: 74 68 65 72 20 77 69 6e 64 6f 77 20 73 6f 20 74  ther window so t
15f0: 68 61 74 20 69 74 20 6d 61 79 20 72 65 73 75 62  hat it may resub
1600: 6d 69 74 20 74 68 65 20 72 65 71 75 65 73 74 2e  mit the request.
1610: 0a 09 09 09 09 20 2a 2f 0a 09 09 09 09 70 69 6e  ..... */.....pin
1620: 57 69 6e 64 6f 77 2e 63 6f 6e 74 65 6e 74 57 69  Window.contentWi
1630: 6e 64 6f 77 2e 70 61 72 65 6e 74 57 69 6e 64 6f  ndow.parentWindo
1640: 77 20 3d 20 77 69 6e 64 6f 77 3b 0a 09 09 09 09  w = window;.....
1650: 70 69 6e 57 69 6e 64 6f 77 2e 63 6f 6e 74 65 6e  pinWindow.conten
1660: 74 57 69 6e 64 6f 77 2e 6d 65 73 73 61 67 65 45  tWindow.messageE
1670: 76 65 6e 74 20 3d 20 6d 65 73 73 61 67 65 45 76  vent = messageEv
1680: 65 6e 74 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  ent;......return
1690: 3b 0a 09 09 09 7d 29 3b 0a 0a 09 09 09 2f 2a 0a  ;....});...../*.
16a0: 09 09 09 20 2a 20 57 65 20 72 65 74 75 72 6e 20  ... * We return 
16b0: 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20  here instead of 
16c0: 62 72 65 61 6b 20 74 6f 20 61 76 6f 69 64 20 64  break to avoid d
16d0: 65 6c 65 74 69 6e 67 20 74 68 65 20 63 61 6c 6c  eleting the call
16e0: 62 61 63 6b 0a 09 09 09 20 2a 20 65 6e 74 72 79  back.... * entry
16f0: 2e 0a 09 09 09 20 2a 2f 0a 09 09 09 72 65 74 75  ..... */....retu
1700: 72 6e 3b 0a 09 09 63 61 73 65 20 22 73 75 63 63  rn;...case "succ
1710: 65 73 73 22 3a 0a 09 09 09 73 77 69 74 63 68 20  ess":....switch 
1720: 28 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64 61  (messageEvent.da
1730: 74 61 2e 63 6f 6d 6d 61 6e 64 29 20 7b 0a 09 09  ta.command) {...
1740: 09 09 63 61 73 65 20 22 6c 69 73 74 63 65 72 74  ..case "listcert
1750: 69 66 69 63 61 74 65 73 22 3a 0a 09 09 09 09 09  ificates":......
1760: 6e 65 78 74 46 75 6e 63 74 69 6f 6e 20 3d 20 63  nextFunction = c
1770: 61 63 6b 65 79 4d 65 73 73 61 67 65 49 6e 63 6f  ackeyMessageInco
1780: 6d 69 6e 67 4c 69 73 74 43 65 72 74 69 66 69 63  mingListCertific
1790: 61 74 65 73 3b 0a 0a 09 09 09 09 09 62 72 65 61  ates;.......brea
17a0: 6b 3b 0a 09 09 09 09 63 61 73 65 20 22 73 69 67  k;.....case "sig
17b0: 6e 22 3a 0a 09 09 09 09 09 6e 65 78 74 46 75 6e  n":......nextFun
17c0: 63 74 69 6f 6e 20 3d 20 63 61 63 6b 65 79 4d 65  ction = cackeyMe
17d0: 73 73 61 67 65 49 6e 63 6f 6d 69 6e 67 53 69 67  ssageIncomingSig
17e0: 6e 4d 65 73 73 61 67 65 3b 0a 0a 09 09 09 09 09  nMessage;.......
17f0: 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09  break;....}.....
1800: 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28  break;..}...if (
1810: 6e 65 78 74 46 75 6e 63 74 69 6f 6e 20 21 3d 20  nextFunction != 
1820: 6e 75 6c 6c 29 20 7b 0a 09 09 6e 65 78 74 46 75  null) {...nextFu
1830: 6e 63 74 69 6f 6e 28 6d 65 73 73 61 67 65 45 76  nction(messageEv
1840: 65 6e 74 2e 64 61 74 61 2c 20 63 68 72 6f 6d 65  ent.data, chrome
1850: 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 0a 09  Callback);..}...
1860: 64 65 6c 65 74 65 20 63 61 63 6b 65 79 4f 75 74  delete cackeyOut
1870: 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b  standingCallback
1880: 73 5b 6d 65 73 73 61 67 65 45 76 65 6e 74 2e 64  s[messageEvent.d
1890: 61 74 61 2e 69 64 5d 3b 0a 0a 09 72 65 74 75 72  ata.id];...retur
18a0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 48 61 6e 64  n;.}../*. * Hand
18b0: 6c 65 72 20 66 6f 72 20 6d 65 73 73 61 67 65 73  ler for messages
18c0: 20 66 72 6f 6d 20 43 68 72 6f 6d 65 20 72 65 6c   from Chrome rel
18d0: 61 74 65 64 20 74 6f 20 6c 69 73 74 69 6e 67 20  ated to listing 
18e0: 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a 2f  certificates. */
18f0: 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79  .function cackey
1900: 4c 69 73 74 43 65 72 74 69 66 69 63 61 74 65 73  ListCertificates
1910: 28 63 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 29  (chromeCallback)
1920: 20 7b 0a 09 76 61 72 20 63 61 6c 6c 62 61 63 6b   {..var callback
1930: 49 64 3b 0a 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f  Id;...console.lo
1940: 67 28 22 5b 63 61 63 6b 65 79 5d 20 41 73 6b 65  g("[cackey] Aske
1950: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 6c  d to provide a l
1960: 69 73 74 20 6f 66 20 63 65 72 74 69 66 69 63 61  ist of certifica
1970: 74 65 73 20 2d 2d 20 74 68 72 6f 77 69 6e 67 20  tes -- throwing 
1980: 74 68 61 74 20 72 65 71 75 65 73 74 20 6f 76 65  that request ove
1990: 72 20 74 6f 20 74 68 65 20 4e 61 43 6c 20 73 69  r to the NaCl si
19a0: 64 65 2e 2e 2e 20 22 29 3b 0a 0a 09 63 61 6c 6c  de... ");...call
19b0: 62 61 63 6b 49 64 20 3d 20 63 61 63 6b 65 79 4f  backId = cackeyO
19c0: 75 74 73 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61  utstandingCallba
19d0: 63 6b 43 6f 75 6e 74 65 72 20 2b 20 31 3b 0a 0a  ckCounter + 1;..
19e0: 09 63 61 63 6b 65 79 48 61 6e 64 6c 65 2e 70 6f  .cackeyHandle.po
19f0: 73 74 4d 65 73 73 61 67 65 28 0a 09 09 7b 0a 09  stMessage(...{..
1a00: 09 09 27 74 61 72 67 65 74 27 3a 20 22 63 61 63  ..'target': "cac
1a10: 6b 65 79 22 2c 0a 09 09 09 27 63 6f 6d 6d 61 6e  key",....'comman
1a20: 64 27 3a 20 22 6c 69 73 74 63 65 72 74 69 66 69  d': "listcertifi
1a30: 63 61 74 65 73 22 2c 0a 09 09 09 27 69 64 27 3a  cates",....'id':
1a40: 20 63 61 6c 6c 62 61 63 6b 49 64 0a 09 09 7d 0a   callbackId...}.
1a50: 09 29 3b 0a 0a 09 63 61 63 6b 65 79 4f 75 74 73  .);...cackeyOuts
1a60: 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b 43  tandingCallbackC
1a70: 6f 75 6e 74 65 72 20 3d 20 63 61 6c 6c 62 61 63  ounter = callbac
1a80: 6b 49 64 3b 0a 09 63 61 63 6b 65 79 4f 75 74 73  kId;..cackeyOuts
1a90: 74 61 6e 64 69 6e 67 43 61 6c 6c 62 61 63 6b 73  tandingCallbacks
1aa0: 5b 63 61 6c 6c 62 61 63 6b 49 64 5d 20 3d 20 63  [callbackId] = c
1ab0: 68 72 6f 6d 65 43 61 6c 6c 62 61 63 6b 3b 0a 0a  hromeCallback;..
1ac0: 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63  .console.log("[c
1ad0: 61 63 6b 65 79 5d 20 54 68 72 6f 77 6e 2e 22 29  ackey] Thrown.")
1ae0: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
1af0: 2a 0a 20 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72  *. * Handler for
1b00: 20 6d 65 73 73 61 67 65 73 20 66 72 6f 6d 20 43   messages from C
1b10: 68 72 6f 6d 65 20 72 65 6c 61 74 65 64 20 74 6f  hrome related to
1b20: 20 73 69 67 6e 69 6e 67 20 61 20 68 61 73 68 20   signing a hash 
1b30: 6f 66 20 73 6f 6d 65 20 73 6f 72 74 0a 20 2a 2f  of some sort. */
1b40: 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79  .function cackey
1b50: 53 69 67 6e 4d 65 73 73 61 67 65 28 73 69 67 6e  SignMessage(sign
1b60: 52 65 71 75 65 73 74 2c 20 63 68 72 6f 6d 65 43  Request, chromeC
1b70: 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 76 61 72 20  allback) {..var 
1b80: 63 61 6c 6c 62 61 63 6b 49 64 3b 0a 09 76 61 72  callbackId;..var
1b90: 20 63 6f 6d 6d 61 6e 64 3b 0a 09 76 61 72 20 63   command;..var c
1ba0: 65 72 74 69 66 69 63 61 74 65 49 64 3b 0a 09 76  ertificateId;..v
1bb0: 61 72 20 64 69 67 65 73 74 2c 20 64 69 67 65 73  ar digest, diges
1bc0: 74 48 65 61 64 65 72 3b 0a 0a 09 2f 2a 0a 09 20  tHeader;.../*.. 
1bd0: 2a 20 50 72 65 66 69 78 20 74 68 65 20 64 69 67  * Prefix the dig
1be0: 65 73 74 20 77 69 74 68 20 74 68 65 20 41 53 4e  est with the ASN
1bf0: 2e 31 20 68 65 61 64 65 72 20 72 65 71 75 69 72  .1 header requir
1c00: 65 64 20 6f 66 20 69 74 0a 09 20 2a 2f 0a 09 73  ed of it.. */..s
1c10: 77 69 74 63 68 20 28 73 69 67 6e 52 65 71 75 65  witch (signReque
1c20: 73 74 2e 68 61 73 68 29 20 7b 0a 09 09 63 61 73  st.hash) {...cas
1c30: 65 20 22 53 48 41 2d 31 22 3a 0a 09 09 09 64 69  e "SHA-1":....di
1c40: 67 65 73 74 48 65 61 64 65 72 20 3d 20 6e 65 77  gestHeader = new
1c50: 20 55 69 6e 74 38 41 72 72 61 79 28 5b 30 78 33   Uint8Array([0x3
1c60: 30 2c 20 30 78 32 31 2c 20 30 78 33 30 2c 20 30  0, 0x21, 0x30, 0
1c70: 78 30 39 2c 20 30 78 30 36 2c 20 30 78 30 35 2c  x09, 0x06, 0x05,
1c80: 20 30 78 32 62 2c 20 30 78 30 65 2c 20 30 78 30   0x2b, 0x0e, 0x0
1c90: 33 2c 20 30 78 30 32 2c 20 30 78 31 61 2c 20 30  3, 0x02, 0x1a, 0
1ca0: 78 30 35 2c 20 30 78 30 30 2c 20 30 78 30 34 2c  x05, 0x00, 0x04,
1cb0: 20 30 78 31 34 5d 29 3b 0a 09 09 09 62 72 65 61   0x14]);....brea
1cc0: 6b 3b 0a 09 09 63 61 73 65 20 22 53 48 41 2d 32  k;...case "SHA-2
1cd0: 35 36 22 3a 0a 09 09 09 64 69 67 65 73 74 48 65  56":....digestHe
1ce0: 61 64 65 72 20 3d 20 6e 65 77 20 55 69 6e 74 38  ader = new Uint8
1cf0: 41 72 72 61 79 28 5b 30 78 33 30 2c 20 30 78 33  Array([0x30, 0x3
1d00: 31 2c 20 30 78 33 30 2c 20 30 78 30 64 2c 20 30  1, 0x30, 0x0d, 0
1d10: 78 30 36 2c 20 30 78 30 39 2c 20 30 78 36 30 2c  x06, 0x09, 0x60,
1d20: 20 30 78 38 36 2c 20 30 78 34 38 2c 20 30 78 30   0x86, 0x48, 0x0
1d30: 31 2c 20 30 78 36 35 2c 20 30 78 30 33 2c 20 30  1, 0x65, 0x03, 0
1d40: 78 30 34 2c 20 30 78 30 32 2c 20 30 78 30 31 2c  x04, 0x02, 0x01,
1d50: 20 30 78 30 35 2c 20 30 78 30 30 2c 20 30 78 30   0x05, 0x00, 0x0
1d60: 34 2c 20 30 78 32 30 5d 29 3b 0a 09 09 09 62 72  4, 0x20]);....br
1d70: 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a  eak;...default:.
1d80: 09 09 09 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72  ...console.error
1d90: 28 22 5b 63 61 63 6b 65 79 5d 20 41 73 6b 65 64  ("[cackey] Asked
1da0: 20 74 6f 20 73 69 67 6e 20 61 20 6d 65 73 73 61   to sign a messa
1db0: 67 65 20 77 69 74 68 20 61 20 68 61 73 68 20 77  ge with a hash w
1dc0: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
1dd0: 3a 20 22 20 2b 20 73 69 67 6e 52 65 71 75 65 73  : " + signReques
1de0: 74 2e 68 61 73 68 29 3b 0a 0a 09 09 09 63 68 72  t.hash);.....chr
1df0: 6f 6d 65 43 61 6c 6c 62 61 63 6b 28 29 3b 0a 0a  omeCallback();..
1e00: 09 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
1e10: 64 69 67 65 73 74 20 3d 20 6e 65 77 20 55 69 6e  digest = new Uin
1e20: 74 38 41 72 72 61 79 28 64 69 67 65 73 74 48 65  t8Array(digestHe
1e30: 61 64 65 72 2e 6c 65 6e 67 74 68 20 2b 20 73 69  ader.length + si
1e40: 67 6e 52 65 71 75 65 73 74 2e 64 69 67 65 73 74  gnRequest.digest
1e50: 2e 62 79 74 65 4c 65 6e 67 74 68 29 3b 0a 09 64  .byteLength);..d
1e60: 69 67 65 73 74 2e 73 65 74 28 64 69 67 65 73 74  igest.set(digest
1e70: 48 65 61 64 65 72 2c 20 30 29 3b 0a 09 64 69 67  Header, 0);..dig
1e80: 65 73 74 2e 73 65 74 28 6e 65 77 20 55 69 6e 74  est.set(new Uint
1e90: 38 41 72 72 61 79 28 73 69 67 6e 52 65 71 75 65  8Array(signReque
1ea0: 73 74 2e 64 69 67 65 73 74 29 2c 20 64 69 67 65  st.digest), dige
1eb0: 73 74 48 65 61 64 65 72 2e 6c 65 6e 67 74 68 29  stHeader.length)
1ec0: 3b 0a 0a 09 64 65 6c 65 74 65 20 64 69 67 65 73  ;...delete diges
1ed0: 74 48 65 61 64 65 72 3b 0a 0a 09 63 6f 6e 73 6f  tHeader;...conso
1ee0: 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d  le.log("[cackey]
1ef0: 20 41 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 61   Asked to sign a
1f00: 20 6d 65 73 73 61 67 65 20 2d 2d 20 74 68 72 6f   message -- thro
1f10: 77 69 6e 67 20 74 68 61 74 20 72 65 71 75 65 73  wing that reques
1f20: 74 20 6f 76 65 72 20 74 6f 20 74 68 65 20 4e 61  t over to the Na
1f30: 43 6c 20 73 69 64 65 2e 2e 2e 20 22 29 3b 0a 0a  Cl side... ");..
1f40: 09 63 61 6c 6c 62 61 63 6b 49 64 20 3d 20 63 61  .callbackId = ca
1f50: 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43  ckeyOutstandingC
1f60: 61 6c 6c 62 61 63 6b 43 6f 75 6e 74 65 72 20 2b  allbackCounter +
1f70: 20 31 3b 0a 0a 09 63 6f 6d 6d 61 6e 64 20 3d 20   1;...command = 
1f80: 7b 0a 09 09 27 74 61 72 67 65 74 27 3a 20 22 63  {...'target': "c
1f90: 61 63 6b 65 79 22 2c 0a 09 09 27 63 6f 6d 6d 61  ackey",...'comma
1fa0: 6e 64 27 3a 20 22 73 69 67 6e 22 2c 0a 09 09 27  nd': "sign",...'
1fb0: 69 64 27 3a 20 63 61 6c 6c 62 61 63 6b 49 64 2c  id': callbackId,
1fc0: 0a 09 09 27 63 65 72 74 69 66 69 63 61 74 65 27  ...'certificate'
1fd0: 3a 20 73 69 67 6e 52 65 71 75 65 73 74 2e 63 65  : signRequest.ce
1fe0: 72 74 69 66 69 63 61 74 65 2c 0a 09 09 27 64 61  rtificate,...'da
1ff0: 74 61 27 3a 20 64 69 67 65 73 74 2e 62 75 66 66  ta': digest.buff
2000: 65 72 0a 09 7d 3b 0a 0a 09 63 65 72 74 69 66 69  er..};...certifi
2010: 63 61 74 65 49 64 20 3d 20 63 61 63 6b 65 79 43  cateId = cackeyC
2020: 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e 49  ertificateToPINI
2030: 44 28 63 6f 6d 6d 61 6e 64 2e 63 65 72 74 69 66  D(command.certif
2040: 69 63 61 74 65 29 3b 0a 0a 09 69 66 20 28 63 61  icate);...if (ca
2050: 63 6b 65 79 43 65 72 74 69 66 69 63 61 74 65 54  ckeyCertificateT
2060: 6f 50 49 4e 4d 61 70 5b 63 65 72 74 69 66 69 63  oPINMap[certific
2070: 61 74 65 49 64 5d 29 20 7b 0a 09 09 63 6f 6d 6d  ateId]) {...comm
2080: 61 6e 64 2e 70 69 6e 20 3d 20 63 61 63 6b 65 79  and.pin = cackey
2090: 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49 4e  CertificateToPIN
20a0: 4d 61 70 5b 63 65 72 74 69 66 69 63 61 74 65 49  Map[certificateI
20b0: 64 5d 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 48  d];..}...cackeyH
20c0: 61 6e 64 6c 65 2e 70 6f 73 74 4d 65 73 73 61 67  andle.postMessag
20d0: 65 28 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 63 61  e(command);...ca
20e0: 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43  ckeyOutstandingC
20f0: 61 6c 6c 62 61 63 6b 43 6f 75 6e 74 65 72 20 3d  allbackCounter =
2100: 20 63 61 6c 6c 62 61 63 6b 49 64 3b 0a 09 63 61   callbackId;..ca
2110: 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e 67 43  ckeyOutstandingC
2120: 61 6c 6c 62 61 63 6b 73 5b 63 61 6c 6c 62 61 63  allbacks[callbac
2130: 6b 49 64 5d 20 3d 20 63 68 72 6f 6d 65 43 61 6c  kId] = chromeCal
2140: 6c 62 61 63 6b 3b 0a 0a 09 63 6f 6e 73 6f 6c 65  lback;...console
2150: 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 54  .log("[cackey] T
2160: 68 72 6f 77 6e 2e 22 29 3b 0a 0a 09 72 65 74 75  hrown.");...retu
2170: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69 6e  rn;.}../*. * Fin
2180: 69 73 68 20 70 65 72 66 6f 72 6d 69 6e 67 20 69  ish performing i
2190: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 68  nitialization th
21a0: 61 74 20 6d 75 73 74 20 77 61 69 74 20 75 6e 74  at must wait unt
21b0: 69 6c 20 77 65 20 68 61 76 65 20 6c 6f 61 64 65  il we have loade
21c0: 64 20 74 68 65 20 43 41 43 4b 65 79 20 6d 6f 64  d the CACKey mod
21d0: 75 6c 65 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e  ule. */.function
21e0: 20 63 61 63 6b 65 79 49 6e 69 74 4c 6f 61 64 65   cackeyInitLoade
21f0: 64 28 6d 65 73 73 61 67 65 45 76 65 6e 74 29 20  d(messageEvent) 
2200: 7b 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22  {..console.log("
2210: 5b 63 61 63 6b 65 79 5d 20 4c 6f 61 64 65 64 20  [cackey] Loaded 
2220: 43 41 43 4b 65 79 20 50 4e 61 43 6c 20 4d 6f 64  CACKey PNaCl Mod
2230: 75 6c 65 22 29 3b 0a 0a 09 2f 2a 20 52 65 67 69  ule");.../* Regi
2240: 73 74 65 72 20 6c 69 73 74 65 6e 65 72 73 20 77  ster listeners w
2250: 69 74 68 20 43 68 72 6f 6d 65 20 2a 2f 0a 09 69  ith Chrome */..i
2260: 66 20 28 63 68 72 6f 6d 65 2e 63 65 72 74 69 66  f (chrome.certif
2270: 69 63 61 74 65 50 72 6f 76 69 64 65 72 29 20 7b  icateProvider) {
2280: 0a 09 09 63 68 72 6f 6d 65 2e 63 65 72 74 69 66  ...chrome.certif
2290: 69 63 61 74 65 50 72 6f 76 69 64 65 72 2e 6f 6e  icateProvider.on
22a0: 43 65 72 74 69 66 69 63 61 74 65 73 52 65 71 75  CertificatesRequ
22b0: 65 73 74 65 64 2e 61 64 64 4c 69 73 74 65 6e 65  ested.addListene
22c0: 72 28 63 61 63 6b 65 79 4c 69 73 74 43 65 72 74  r(cackeyListCert
22d0: 69 66 69 63 61 74 65 73 29 3b 0a 09 09 63 68 72  ificates);...chr
22e0: 6f 6d 65 2e 63 65 72 74 69 66 69 63 61 74 65 50  ome.certificateP
22f0: 72 6f 76 69 64 65 72 2e 6f 6e 53 69 67 6e 44 69  rovider.onSignDi
2300: 67 65 73 74 52 65 71 75 65 73 74 65 64 2e 61 64  gestRequested.ad
2310: 64 4c 69 73 74 65 6e 65 72 28 63 61 63 6b 65 79  dListener(cackey
2320: 53 69 67 6e 4d 65 73 73 61 67 65 29 3b 0a 09 7d  SignMessage);..}
2330: 0a 0a 09 2f 2a 0a 09 20 2a 20 49 6e 69 74 69 61  .../*.. * Initia
2340: 6c 69 7a 65 20 43 41 43 4b 65 79 20 77 69 74 68  lize CACKey with
2350: 20 74 68 65 20 63 6f 72 72 65 63 74 20 68 61 6e   the correct han
2360: 64 6c 65 20 74 6f 20 74 61 6c 6b 20 74 6f 20 74  dle to talk to t
2370: 68 65 20 47 6f 6f 67 6c 65 20 53 6d 61 72 74 63  he Google Smartc
2380: 61 72 64 20 4d 61 6e 61 67 65 72 20 41 70 70 0a  ard Manager App.
2390: 09 20 2a 2f 0a 09 63 61 63 6b 65 79 48 61 6e 64  . */..cackeyHand
23a0: 6c 65 2e 70 6f 73 74 4d 65 73 73 61 67 65 28 0a  le.postMessage(.
23b0: 09 09 7b 0a 09 09 09 22 74 61 72 67 65 74 22 3a  ..{...."target":
23c0: 20 22 63 61 63 6b 65 79 22 2c 0a 09 09 09 22 63   "cackey",...."c
23d0: 6f 6d 6d 61 6e 64 22 3a 20 22 69 6e 69 74 22 2c  ommand": "init",
23e0: 0a 09 09 09 22 73 6d 61 72 74 63 61 72 64 4d 61  ...."smartcardMa
23f0: 6e 61 67 65 72 41 70 70 49 64 22 3a 20 22 6b 68  nagerAppId": "kh
2400: 70 66 65 61 61 6e 6a 6e 67 6d 63 6e 70 6c 62 64  pfeaanjngmcnplbd
2410: 6c 70 65 67 69 69 66 67 70 66 67 64 63 6f 22 0a  lpegiifgpfgdco".
2420: 09 09 7d 0a 09 29 3b 0a 0a 09 2f 2a 0a 09 20 2a  ..}..);.../*.. *
2430: 20 53 74 61 72 74 20 74 68 65 20 47 6f 6f 67 6c   Start the Googl
2440: 65 20 50 43 53 43 20 49 6e 74 65 72 66 61 63 65  e PCSC Interface
2450: 0a 09 20 2a 2f 0a 09 6e 65 77 20 47 6f 6f 67 6c  .. */..new Googl
2460: 65 53 6d 61 72 74 43 61 72 64 2e 50 63 73 63 4e  eSmartCard.PcscN
2470: 61 63 6c 28 63 61 63 6b 65 79 48 61 6e 64 6c 65  acl(cackeyHandle
2480: 29 3b 0a 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  );....return;.}.
2490: 0a 2f 2a 0a 20 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*. * Initializ
24a0: 65 20 43 41 43 4b 65 79 20 61 6e 64 20 74 68 65  e CACKey and the
24b0: 20 50 43 53 43 20 6c 69 62 72 61 72 79 20 66 72   PCSC library fr
24c0: 6f 6d 20 47 6f 6f 67 6c 65 0a 20 2a 2f 0a 66 75  om Google. */.fu
24d0: 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 49 6e 69  nction cackeyIni
24e0: 74 28 29 20 7b 0a 09 76 61 72 20 65 6c 65 6d 65  t() {..var eleme
24f0: 6e 74 45 6d 62 65 64 3b 0a 0a 09 2f 2a 20 4c 6f  ntEmbed;.../* Lo
2500: 67 20 74 68 61 74 20 77 65 20 61 72 65 20 6f 70  g that we are op
2510: 65 72 61 74 69 6f 6e 61 6c 20 2a 2f 0a 09 63 6f  erational */..co
2520: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b  nsole.log("[cack
2530: 65 79 5d 20 63 61 63 6b 65 79 49 6e 69 74 28 29  ey] cackeyInit()
2540: 3a 20 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f  : Called.");.../
2550: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 77 65  * Verify that we
2560: 20 63 61 6e 20 72 65 67 69 73 74 65 72 20 63 61   can register ca
2570: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 69 66 20 28  llbacks */..if (
2580: 21 63 68 72 6f 6d 65 2e 63 65 72 74 69 66 69 63  !chrome.certific
2590: 61 74 65 50 72 6f 76 69 64 65 72 29 20 7b 0a 09  ateProvider) {..
25a0: 09 69 66 20 28 21 47 6f 6f 67 6c 65 53 6d 61 72  .if (!GoogleSmar
25b0: 74 43 61 72 64 2e 49 53 5f 44 45 42 55 47 5f 42  tCard.IS_DEBUG_B
25c0: 55 49 4c 44 29 20 7b 0a 09 09 09 63 6f 6e 73 6f  UILD) {....conso
25d0: 6c 65 2e 65 72 72 6f 72 28 22 5b 63 61 63 6b 65  le.error("[cacke
25e0: 79 5d 20 54 68 69 73 20 65 78 74 65 6e 73 69 6f  y] This extensio
25f0: 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20  n only works on 
2600: 43 68 72 6f 6d 65 4f 53 21 22 29 3b 0a 0a 09 09  ChromeOS!");....
2610: 09 72 65 74 75 72 6e 3b 0a 09 09 7d 20 65 6c 73  .return;...} els
2620: 65 20 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c  e {....console.l
2630: 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 54 68 69  og("[cackey] Thi
2640: 73 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79  s extension only
2650: 20 77 6f 72 6b 73 20 6f 6e 20 43 68 72 6f 6d 65   works on Chrome
2660: 4f 53 2c 20 62 75 74 20 79 6f 75 20 61 70 70 65  OS, but you appe
2670: 61 72 20 74 6f 20 62 65 20 64 65 62 75 67 67 69  ar to be debuggi
2680: 6e 67 20 69 74 20 2d 2d 20 74 72 79 69 6e 67 20  ng it -- trying 
2690: 61 6e 79 77 61 79 2e 22 29 3b 0a 09 09 7d 0a 09  anyway.");...}..
26a0: 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 48 61  }...if (cackeyHa
26b0: 6e 64 6c 65 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a  ndle != null) {.
26c0: 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b  ..console.log("[
26d0: 63 61 63 6b 65 79 5d 20 63 61 63 6b 65 79 49 6e  cackey] cackeyIn
26e0: 69 74 28 29 3a 20 41 6c 72 65 61 64 79 20 69 6e  it(): Already in
26f0: 69 74 69 61 6c 69 7a 65 64 2e 20 20 52 65 74 75  itialized.  Retu
2700: 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 09 72 65 74  rning.");....ret
2710: 75 72 6e 3b 0a 09 7d 0a 0a 09 65 6c 65 6d 65 6e  urn;..}...elemen
2720: 74 45 6d 62 65 64 20 3d 20 64 6f 63 75 6d 65 6e  tEmbed = documen
2730: 74 2e 63 72 65 61 74 65 45 6c 65 6d 65 6e 74 28  t.createElement(
2740: 27 65 6d 62 65 64 27 29 3b 0a 09 65 6c 65 6d 65  'embed');..eleme
2750: 6e 74 45 6d 62 65 64 2e 74 79 70 65 20 3d 20 22  ntEmbed.type = "
2760: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 6e  application/x-pn
2770: 61 63 6c 22 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d  acl";..elementEm
2780: 62 65 64 2e 77 69 64 74 68 20 3d 20 30 3b 0a 09  bed.width = 0;..
2790: 65 6c 65 6d 65 6e 74 45 6d 62 65 64 2e 68 65 69  elementEmbed.hei
27a0: 67 68 74 20 3d 20 30 3b 0a 09 65 6c 65 6d 65 6e  ght = 0;..elemen
27b0: 74 45 6d 62 65 64 2e 73 72 63 20 3d 20 22 63 61  tEmbed.src = "ca
27c0: 63 6b 65 79 2e 6e 6d 66 22 3b 0a 09 65 6c 65 6d  ckey.nmf";..elem
27d0: 65 6e 74 45 6d 62 65 64 2e 69 64 20 3d 20 22 63  entEmbed.id = "c
27e0: 61 63 6b 65 79 4d 6f 64 75 6c 65 22 3b 0a 09 65  ackeyModule";..e
27f0: 6c 65 6d 65 6e 74 45 6d 62 65 64 2e 61 64 64 45  lementEmbed.addE
2800: 76 65 6e 74 4c 69 73 74 65 6e 65 72 28 27 65 72  ventListener('er
2810: 72 6f 72 27 2c 20 66 75 6e 63 74 69 6f 6e 28 6d  ror', function(m
2820: 65 73 73 61 67 65 45 76 65 6e 74 29 20 7b 20 63  essageEvent) { c
2830: 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 22 45 72  onsole.error("Er
2840: 72 6f 72 20 6c 6f 61 64 69 6e 67 20 43 41 43 4b  ror loading CACK
2850: 65 79 20 50 4e 61 43 6c 20 4d 6f 64 75 6c 65 3a  ey PNaCl Module:
2860: 20 22 20 2b 20 6d 65 73 73 61 67 65 45 76 65 6e   " + messageEven
2870: 74 2e 64 61 74 61 29 3b 20 7d 2c 20 74 72 75 65  t.data); }, true
2880: 29 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64  );..elementEmbed
2890: 2e 61 64 64 45 76 65 6e 74 4c 69 73 74 65 6e 65  .addEventListene
28a0: 72 28 27 6c 6f 61 64 27 2c 20 63 61 63 6b 65 79  r('load', cackey
28b0: 49 6e 69 74 4c 6f 61 64 65 64 2c 20 74 72 75 65  InitLoaded, true
28c0: 29 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64  );..elementEmbed
28d0: 2e 61 64 64 45 76 65 6e 74 4c 69 73 74 65 6e 65  .addEventListene
28e0: 72 28 27 6d 65 73 73 61 67 65 27 2c 20 63 61 63  r('message', cac
28f0: 6b 65 79 4d 65 73 73 61 67 65 49 6e 63 6f 6d 69  keyMessageIncomi
2900: 6e 67 2c 20 74 72 75 65 29 3b 0a 0a 09 63 61 63  ng, true);...cac
2910: 6b 65 79 48 61 6e 64 6c 65 20 3d 20 65 6c 65 6d  keyHandle = elem
2920: 65 6e 74 45 6d 62 65 64 3b 0a 0a 09 64 6f 63 75  entEmbed;...docu
2930: 6d 65 6e 74 2e 62 6f 64 79 2e 61 70 70 65 6e 64  ment.body.append
2940: 43 68 69 6c 64 28 63 61 63 6b 65 79 48 61 6e 64  Child(cackeyHand
2950: 6c 65 29 0a 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f  le)...console.lo
2960: 67 28 22 5b 63 61 63 6b 65 79 5d 20 63 61 63 6b  g("[cackey] cack
2970: 65 79 49 6e 69 74 28 29 3a 20 43 6f 6d 70 6c 65  eyInit(): Comple
2980: 74 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 2e  ted.  Returning.
2990: 22 29 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61  ");.}../* Initia
29a0: 6c 69 7a 65 20 43 41 43 4b 65 79 20 2a 2f 0a 63  lize CACKey */.c
29b0: 61 63 6b 65 79 49 6e 69 74 28 29 3b 0a           ackeyInit();.