Hex Artifact Content

Artifact bf6905446699f6c6c49da106d69ca8b0016cb14c:


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 0a 09  ertificateId;...
1bb0: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61  console.log("[ca
1bc0: 63 6b 65 79 5d 20 41 73 6b 65 64 20 74 6f 20 73  ckey] Asked to s
1bd0: 69 67 6e 20 61 20 6d 65 73 73 61 67 65 20 2d 2d  ign a message --
1be0: 20 74 68 72 6f 77 69 6e 67 20 74 68 61 74 20 72   throwing that r
1bf0: 65 71 75 65 73 74 20 6f 76 65 72 20 74 6f 20 74  equest over to t
1c00: 68 65 20 4e 61 43 6c 20 73 69 64 65 2e 2e 2e 20  he NaCl side... 
1c10: 22 29 3b 0a 0a 09 63 61 6c 6c 62 61 63 6b 49 64  ");...callbackId
1c20: 20 3d 20 63 61 63 6b 65 79 4f 75 74 73 74 61 6e   = cackeyOutstan
1c30: 64 69 6e 67 43 61 6c 6c 62 61 63 6b 43 6f 75 6e  dingCallbackCoun
1c40: 74 65 72 20 2b 20 31 3b 0a 0a 09 63 6f 6d 6d 61  ter + 1;...comma
1c50: 6e 64 20 3d 20 7b 0a 09 09 27 74 61 72 67 65 74  nd = {...'target
1c60: 27 3a 20 22 63 61 63 6b 65 79 22 2c 0a 09 09 27  ': "cackey",...'
1c70: 63 6f 6d 6d 61 6e 64 27 3a 20 22 73 69 67 6e 22  command': "sign"
1c80: 2c 0a 09 09 27 69 64 27 3a 20 63 61 6c 6c 62 61  ,...'id': callba
1c90: 63 6b 49 64 2c 0a 09 09 27 63 65 72 74 69 66 69  ckId,...'certifi
1ca0: 63 61 74 65 27 3a 20 73 69 67 6e 52 65 71 75 65  cate': signReque
1cb0: 73 74 2e 63 65 72 74 69 66 69 63 61 74 65 2c 0a  st.certificate,.
1cc0: 09 09 27 64 61 74 61 27 3a 20 73 69 67 6e 52 65  ..'data': signRe
1cd0: 71 75 65 73 74 2e 64 69 67 65 73 74 20 2f 2a 20  quest.digest /* 
1ce0: 58 58 58 3a 54 4f 44 4f 3a 20 54 68 69 73 20 6e  XXX:TODO: This n
1cf0: 65 65 64 73 20 74 6f 20 62 65 20 70 72 65 66 69  eeds to be prefi
1d00: 78 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  xed based on the
1d10: 20 73 69 67 6e 52 65 71 75 65 73 74 2e 68 61 73   signRequest.has
1d20: 68 20 2a 2f 0a 09 7d 3b 0a 0a 09 63 65 72 74 69  h */..};...certi
1d30: 66 69 63 61 74 65 49 64 20 3d 20 63 61 63 6b 65  ficateId = cacke
1d40: 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50 49  yCertificateToPI
1d50: 4e 49 44 28 63 6f 6d 6d 61 6e 64 2e 63 65 72 74  NID(command.cert
1d60: 69 66 69 63 61 74 65 29 3b 0a 0a 09 69 66 20 28  ificate);...if (
1d70: 63 61 63 6b 65 79 43 65 72 74 69 66 69 63 61 74  cackeyCertificat
1d80: 65 54 6f 50 49 4e 4d 61 70 5b 63 65 72 74 69 66  eToPINMap[certif
1d90: 69 63 61 74 65 49 64 5d 29 20 7b 0a 09 09 63 6f  icateId]) {...co
1da0: 6d 6d 61 6e 64 2e 70 69 6e 20 3d 20 63 61 63 6b  mmand.pin = cack
1db0: 65 79 43 65 72 74 69 66 69 63 61 74 65 54 6f 50  eyCertificateToP
1dc0: 49 4e 4d 61 70 5b 63 65 72 74 69 66 69 63 61 74  INMap[certificat
1dd0: 65 49 64 5d 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  eId];..}...cacke
1de0: 79 48 61 6e 64 6c 65 2e 70 6f 73 74 4d 65 73 73  yHandle.postMess
1df0: 61 67 65 28 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09  age(command);...
1e00: 63 61 63 6b 65 79 4f 75 74 73 74 61 6e 64 69 6e  cackeyOutstandin
1e10: 67 43 61 6c 6c 62 61 63 6b 43 6f 75 6e 74 65 72  gCallbackCounter
1e20: 20 3d 20 63 61 6c 6c 62 61 63 6b 49 64 3b 0a 09   = callbackId;..
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 63 61 6c 6c 62  gCallbacks[callb
1e50: 61 63 6b 49 64 5d 20 3d 20 63 68 72 6f 6d 65 43  ackId] = chromeC
1e60: 61 6c 6c 62 61 63 6b 3b 0a 0a 09 63 6f 6e 73 6f  allback;...conso
1e70: 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d  le.log("[cackey]
1e80: 20 54 68 72 6f 77 6e 2e 22 29 3b 0a 0a 09 72 65   Thrown.");...re
1e90: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46  turn;.}../*. * F
1ea0: 69 6e 69 73 68 20 70 65 72 66 6f 72 6d 69 6e 67  inish performing
1eb0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1ec0: 74 68 61 74 20 6d 75 73 74 20 77 61 69 74 20 75  that must wait u
1ed0: 6e 74 69 6c 20 77 65 20 68 61 76 65 20 6c 6f 61  ntil we have loa
1ee0: 64 65 64 20 74 68 65 20 43 41 43 4b 65 79 20 6d  ded the CACKey m
1ef0: 6f 64 75 6c 65 0a 20 2a 2f 0a 66 75 6e 63 74 69  odule. */.functi
1f00: 6f 6e 20 63 61 63 6b 65 79 49 6e 69 74 4c 6f 61  on cackeyInitLoa
1f10: 64 65 64 28 6d 65 73 73 61 67 65 45 76 65 6e 74  ded(messageEvent
1f20: 29 20 7b 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67  ) {..console.log
1f30: 28 22 5b 63 61 63 6b 65 79 5d 20 4c 6f 61 64 65  ("[cackey] Loade
1f40: 64 20 43 41 43 4b 65 79 20 50 4e 61 43 6c 20 4d  d CACKey PNaCl M
1f50: 6f 64 75 6c 65 22 29 3b 0a 0a 09 2f 2a 20 52 65  odule");.../* Re
1f60: 67 69 73 74 65 72 20 6c 69 73 74 65 6e 65 72 73  gister listeners
1f70: 20 77 69 74 68 20 43 68 72 6f 6d 65 20 2a 2f 0a   with Chrome */.
1f80: 09 69 66 20 28 63 68 72 6f 6d 65 2e 63 65 72 74  .if (chrome.cert
1f90: 69 66 69 63 61 74 65 50 72 6f 76 69 64 65 72 29  ificateProvider)
1fa0: 20 7b 0a 09 09 63 68 72 6f 6d 65 2e 63 65 72 74   {...chrome.cert
1fb0: 69 66 69 63 61 74 65 50 72 6f 76 69 64 65 72 2e  ificateProvider.
1fc0: 6f 6e 43 65 72 74 69 66 69 63 61 74 65 73 52 65  onCertificatesRe
1fd0: 71 75 65 73 74 65 64 2e 61 64 64 4c 69 73 74 65  quested.addListe
1fe0: 6e 65 72 28 63 61 63 6b 65 79 4c 69 73 74 43 65  ner(cackeyListCe
1ff0: 72 74 69 66 69 63 61 74 65 73 29 3b 0a 09 09 63  rtificates);...c
2000: 68 72 6f 6d 65 2e 63 65 72 74 69 66 69 63 61 74  hrome.certificat
2010: 65 50 72 6f 76 69 64 65 72 2e 6f 6e 53 69 67 6e  eProvider.onSign
2020: 44 69 67 65 73 74 52 65 71 75 65 73 74 65 64 2e  DigestRequested.
2030: 61 64 64 4c 69 73 74 65 6e 65 72 28 63 61 63 6b  addListener(cack
2040: 65 79 53 69 67 6e 4d 65 73 73 61 67 65 29 3b 0a  eySignMessage);.
2050: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 49 6e 69 74  .}.../*.. * Init
2060: 69 61 6c 69 7a 65 20 43 41 43 4b 65 79 20 77 69  ialize CACKey wi
2070: 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 68  th the correct h
2080: 61 6e 64 6c 65 20 74 6f 20 74 61 6c 6b 20 74 6f  andle to talk to
2090: 20 74 68 65 20 47 6f 6f 67 6c 65 20 53 6d 61 72   the Google Smar
20a0: 74 63 61 72 64 20 4d 61 6e 61 67 65 72 20 41 70  tcard Manager Ap
20b0: 70 0a 09 20 2a 2f 0a 09 63 61 63 6b 65 79 48 61  p.. */..cackeyHa
20c0: 6e 64 6c 65 2e 70 6f 73 74 4d 65 73 73 61 67 65  ndle.postMessage
20d0: 28 0a 09 09 7b 0a 09 09 09 22 74 61 72 67 65 74  (...{...."target
20e0: 22 3a 20 22 63 61 63 6b 65 79 22 2c 0a 09 09 09  ": "cackey",....
20f0: 22 63 6f 6d 6d 61 6e 64 22 3a 20 22 69 6e 69 74  "command": "init
2100: 22 2c 0a 09 09 09 22 73 6d 61 72 74 63 61 72 64  ",...."smartcard
2110: 4d 61 6e 61 67 65 72 41 70 70 49 64 22 3a 20 22  ManagerAppId": "
2120: 6b 68 70 66 65 61 61 6e 6a 6e 67 6d 63 6e 70 6c  khpfeaanjngmcnpl
2130: 62 64 6c 70 65 67 69 69 66 67 70 66 67 64 63 6f  bdlpegiifgpfgdco
2140: 22 0a 09 09 7d 0a 09 29 3b 0a 0a 09 2f 2a 0a 09  "...}..);.../*..
2150: 20 2a 20 53 74 61 72 74 20 74 68 65 20 47 6f 6f   * Start the Goo
2160: 67 6c 65 20 50 43 53 43 20 49 6e 74 65 72 66 61  gle PCSC Interfa
2170: 63 65 0a 09 20 2a 2f 0a 09 6e 65 77 20 47 6f 6f  ce.. */..new Goo
2180: 67 6c 65 53 6d 61 72 74 43 61 72 64 2e 50 63 73  gleSmartCard.Pcs
2190: 63 4e 61 63 6c 28 63 61 63 6b 65 79 48 61 6e 64  cNacl(cackeyHand
21a0: 6c 65 29 3b 0a 0a 0a 09 72 65 74 75 72 6e 3b 0a  le);....return;.
21b0: 7d 0a 0a 2f 2a 0a 20 2a 20 49 6e 69 74 69 61 6c  }../*. * Initial
21c0: 69 7a 65 20 43 41 43 4b 65 79 20 61 6e 64 20 74  ize CACKey and t
21d0: 68 65 20 50 43 53 43 20 6c 69 62 72 61 72 79 20  he PCSC library 
21e0: 66 72 6f 6d 20 47 6f 6f 67 6c 65 0a 20 2a 2f 0a  from Google. */.
21f0: 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 49  function cackeyI
2200: 6e 69 74 28 29 20 7b 0a 09 76 61 72 20 65 6c 65  nit() {..var ele
2210: 6d 65 6e 74 45 6d 62 65 64 3b 0a 0a 09 2f 2a 20  mentEmbed;.../* 
2220: 4c 6f 67 20 74 68 61 74 20 77 65 20 61 72 65 20  Log that we are 
2230: 6f 70 65 72 61 74 69 6f 6e 61 6c 20 2a 2f 0a 09  operational */..
2240: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b 63 61  console.log("[ca
2250: 63 6b 65 79 5d 20 63 61 63 6b 65 79 49 6e 69 74  ckey] cackeyInit
2260: 28 29 3a 20 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  (): Called.");..
2270: 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
2280: 77 65 20 63 61 6e 20 72 65 67 69 73 74 65 72 20  we can register 
2290: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 69 66  callbacks */..if
22a0: 20 28 21 63 68 72 6f 6d 65 2e 63 65 72 74 69 66   (!chrome.certif
22b0: 69 63 61 74 65 50 72 6f 76 69 64 65 72 29 20 7b  icateProvider) {
22c0: 0a 09 09 69 66 20 28 21 47 6f 6f 67 6c 65 53 6d  ...if (!GoogleSm
22d0: 61 72 74 43 61 72 64 2e 49 53 5f 44 45 42 55 47  artCard.IS_DEBUG
22e0: 5f 42 55 49 4c 44 29 20 7b 0a 09 09 09 63 6f 6e  _BUILD) {....con
22f0: 73 6f 6c 65 2e 65 72 72 6f 72 28 22 5b 63 61 63  sole.error("[cac
2300: 6b 65 79 5d 20 54 68 69 73 20 65 78 74 65 6e 73  key] This extens
2310: 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f  ion only works o
2320: 6e 20 43 68 72 6f 6d 65 4f 53 21 22 29 3b 0a 0a  n ChromeOS!");..
2330: 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 7d 20 65  ...return;...} e
2340: 6c 73 65 20 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65  lse {....console
2350: 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 54  .log("[cackey] T
2360: 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e  his extension on
2370: 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 43 68 72 6f  ly works on Chro
2380: 6d 65 4f 53 2c 20 62 75 74 20 79 6f 75 20 61 70  meOS, but you ap
2390: 70 65 61 72 20 74 6f 20 62 65 20 64 65 62 75 67  pear to be debug
23a0: 67 69 6e 67 20 69 74 20 2d 2d 20 74 72 79 69 6e  ging it -- tryin
23b0: 67 20 61 6e 79 77 61 79 2e 22 29 3b 0a 09 09 7d  g anyway.");...}
23c0: 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
23d0: 48 61 6e 64 6c 65 20 21 3d 20 6e 75 6c 6c 29 20  Handle != null) 
23e0: 7b 0a 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28  {...console.log(
23f0: 22 5b 63 61 63 6b 65 79 5d 20 63 61 63 6b 65 79  "[cackey] cackey
2400: 49 6e 69 74 28 29 3a 20 41 6c 72 65 61 64 79 20  Init(): Already 
2410: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 52 65  initialized.  Re
2420: 74 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 09 72  turning.");....r
2430: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 65 6c 65 6d  eturn;..}...elem
2440: 65 6e 74 45 6d 62 65 64 20 3d 20 64 6f 63 75 6d  entEmbed = docum
2450: 65 6e 74 2e 63 72 65 61 74 65 45 6c 65 6d 65 6e  ent.createElemen
2460: 74 28 27 65 6d 62 65 64 27 29 3b 0a 09 65 6c 65  t('embed');..ele
2470: 6d 65 6e 74 45 6d 62 65 64 2e 74 79 70 65 20 3d  mentEmbed.type =
2480: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
2490: 70 6e 61 63 6c 22 3b 0a 09 65 6c 65 6d 65 6e 74  pnacl";..element
24a0: 45 6d 62 65 64 2e 77 69 64 74 68 20 3d 20 30 3b  Embed.width = 0;
24b0: 0a 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64 2e 68  ..elementEmbed.h
24c0: 65 69 67 68 74 20 3d 20 30 3b 0a 09 65 6c 65 6d  eight = 0;..elem
24d0: 65 6e 74 45 6d 62 65 64 2e 73 72 63 20 3d 20 22  entEmbed.src = "
24e0: 63 61 63 6b 65 79 2e 6e 6d 66 22 3b 0a 09 65 6c  cackey.nmf";..el
24f0: 65 6d 65 6e 74 45 6d 62 65 64 2e 69 64 20 3d 20  ementEmbed.id = 
2500: 22 63 61 63 6b 65 79 4d 6f 64 75 6c 65 22 3b 0a  "cackeyModule";.
2510: 09 65 6c 65 6d 65 6e 74 45 6d 62 65 64 2e 61 64  .elementEmbed.ad
2520: 64 45 76 65 6e 74 4c 69 73 74 65 6e 65 72 28 27  dEventListener('
2530: 65 72 72 6f 72 27 2c 20 66 75 6e 63 74 69 6f 6e  error', function
2540: 28 6d 65 73 73 61 67 65 45 76 65 6e 74 29 20 7b  (messageEvent) {
2550: 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 22   console.error("
2560: 45 72 72 6f 72 20 6c 6f 61 64 69 6e 67 20 43 41  Error loading CA
2570: 43 4b 65 79 20 50 4e 61 43 6c 20 4d 6f 64 75 6c  CKey PNaCl Modul
2580: 65 3a 20 22 20 2b 20 6d 65 73 73 61 67 65 45 76  e: " + messageEv
2590: 65 6e 74 2e 64 61 74 61 29 3b 20 7d 2c 20 74 72  ent.data); }, tr
25a0: 75 65 29 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d 62  ue);..elementEmb
25b0: 65 64 2e 61 64 64 45 76 65 6e 74 4c 69 73 74 65  ed.addEventListe
25c0: 6e 65 72 28 27 6c 6f 61 64 27 2c 20 63 61 63 6b  ner('load', cack
25d0: 65 79 49 6e 69 74 4c 6f 61 64 65 64 2c 20 74 72  eyInitLoaded, tr
25e0: 75 65 29 3b 0a 09 65 6c 65 6d 65 6e 74 45 6d 62  ue);..elementEmb
25f0: 65 64 2e 61 64 64 45 76 65 6e 74 4c 69 73 74 65  ed.addEventListe
2600: 6e 65 72 28 27 6d 65 73 73 61 67 65 27 2c 20 63  ner('message', c
2610: 61 63 6b 65 79 4d 65 73 73 61 67 65 49 6e 63 6f  ackeyMessageInco
2620: 6d 69 6e 67 2c 20 74 72 75 65 29 3b 0a 0a 09 63  ming, true);...c
2630: 61 63 6b 65 79 48 61 6e 64 6c 65 20 3d 20 65 6c  ackeyHandle = el
2640: 65 6d 65 6e 74 45 6d 62 65 64 3b 0a 0a 09 64 6f  ementEmbed;...do
2650: 63 75 6d 65 6e 74 2e 62 6f 64 79 2e 61 70 70 65  cument.body.appe
2660: 6e 64 43 68 69 6c 64 28 63 61 63 6b 65 79 48 61  ndChild(cackeyHa
2670: 6e 64 6c 65 29 0a 0a 09 63 6f 6e 73 6f 6c 65 2e  ndle)...console.
2680: 6c 6f 67 28 22 5b 63 61 63 6b 65 79 5d 20 63 61  log("[cackey] ca
2690: 63 6b 65 79 49 6e 69 74 28 29 3a 20 43 6f 6d 70  ckeyInit(): Comp
26a0: 6c 65 74 65 64 2e 20 20 52 65 74 75 72 6e 69 6e  leted.  Returnin
26b0: 67 2e 22 29 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74  g.");.}../* Init
26c0: 69 61 6c 69 7a 65 20 43 41 43 4b 65 79 20 2a 2f  ialize CACKey */
26d0: 0a 63 61 63 6b 65 79 49 6e 69 74 28 29 3b 0a     .cackeyInit();.