Hex Artifact Content

Artifact f8ff078c8891cc4eeb35c1bbdb337decb02cfd0b:


0000: 2f 2a 0a 20 2a 20 43 41 43 4b 65 79 20 53 53 48  /*. * CACKey SSH
0010: 20 41 67 65 6e 74 20 66 6f 72 20 43 68 72 6f 6d   Agent for Chrom
0020: 65 4f 53 0a 20 2a 2f 0a 0a 63 61 63 6b 65 79 53  eOS. */..cackeyS
0030: 53 48 41 67 65 6e 74 41 70 70 72 6f 76 65 64 41  SHAgentApprovedA
0040: 70 70 73 20 3d 20 5b 0a 09 22 70 6e 68 65 63 68  pps = [.."pnhech
0050: 61 70 66 61 69 6e 64 6a 68 6f 6d 70 62 6e 66 6c  apfaindjhompbnfl
0060: 63 6c 64 61 62 62 67 68 6a 6f 22 0a 5d 3b 0a 0a  cldabbghjo".];..
0070: 2f 2a 0a 20 2a 20 53 53 48 20 45 6c 65 6d 65 6e  /*. * SSH Elemen
0080: 74 20 45 6e 63 6f 64 69 6e 67 2f 44 65 63 6f 64  t Encoding/Decod
0090: 69 6e 67 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e  ing. */.function
00a0: 20 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74 45   cackeySSHAgentE
00b0: 6e 63 6f 64 65 49 6e 74 28 75 69 6e 74 33 32 29  ncodeInt(uint32)
00c0: 20 7b 0a 09 76 61 72 20 72 65 73 75 6c 74 3b 0a   {..var result;.
00d0: 0a 09 72 65 73 75 6c 74 20 3d 20 5b 0a 09 09 28  ..result = [...(
00e0: 75 69 6e 74 33 32 20 3e 3e 20 32 34 29 20 26 20  uint32 >> 24) & 
00f0: 30 78 66 66 2c 0a 09 09 28 75 69 6e 74 33 32 20  0xff,...(uint32 
0100: 3e 3e 20 31 36 29 20 26 20 30 78 66 66 2c 0a 09  >> 16) & 0xff,..
0110: 09 28 75 69 6e 74 33 32 20 3e 3e 20 20 38 29 20  .(uint32 >>  8) 
0120: 26 20 30 78 66 66 2c 0a 09 09 20 75 69 6e 74 33  & 0xff,... uint3
0130: 32 20 20 20 20 20 20 20 20 26 20 30 78 66 66 0a  2        & 0xff.
0140: 09 5d 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 73  .];...return(res
0150: 75 6c 74 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  ult);.}..functio
0160: 6e 20 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74  n cackeySSHAgent
0170: 44 65 63 6f 64 65 49 6e 74 28 69 6e 70 75 74 29  DecodeInt(input)
0180: 20 7b 0a 09 76 61 72 20 72 65 73 75 6c 74 3b 0a   {..var result;.
0190: 0a 09 72 65 73 75 6c 74 20 3d 20 30 3b 0a 09 72  ..result = 0;..r
01a0: 65 73 75 6c 74 20 7c 3d 20 28 69 6e 70 75 74 5b  esult |= (input[
01b0: 30 5d 20 3c 3c 20 32 34 29 3b 0a 09 72 65 73 75  0] << 24);..resu
01c0: 6c 74 20 7c 3d 20 28 69 6e 70 75 74 5b 31 5d 20  lt |= (input[1] 
01d0: 3c 3c 20 31 36 29 3b 0a 09 72 65 73 75 6c 74 20  << 16);..result 
01e0: 7c 3d 20 28 69 6e 70 75 74 5b 32 5d 20 3c 3c 20  |= (input[2] << 
01f0: 38 29 3b 0a 09 72 65 73 75 6c 74 20 7c 3d 20 20  8);..result |=  
0200: 69 6e 70 75 74 5b 33 5d 3b 0a 0a 09 72 65 74 75  input[3];...retu
0210: 72 6e 28 7b 0a 09 09 76 61 6c 75 65 3a 20 72 65  rn({...value: re
0220: 73 75 6c 74 2c 0a 09 09 6f 75 74 70 75 74 3a 20  sult,...output: 
0230: 69 6e 70 75 74 2e 73 6c 69 63 65 28 34 29 0a 09  input.slice(4)..
0240: 7d 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  });.}..function 
0250: 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74 45 6e  cackeySSHAgentEn
0260: 63 6f 64 65 42 69 67 49 6e 74 28 62 69 67 49 6e  codeBigInt(bigIn
0270: 74 29 20 7b 0a 09 76 61 72 20 72 65 73 75 6c 74  t) {..var result
0280: 20 3d 20 5b 5d 3b 0a 0a 09 73 77 69 74 63 68 20   = [];...switch 
0290: 28 74 79 70 65 6f 66 28 62 69 67 49 6e 74 29 29  (typeof(bigInt))
02a0: 20 7b 0a 09 09 63 61 73 65 20 22 6e 75 6d 62 65   {...case "numbe
02b0: 72 22 3a 0a 09 09 09 77 68 69 6c 65 20 28 62 69  r":....while (bi
02c0: 67 49 6e 74 29 20 7b 0a 09 09 09 09 72 65 73 75  gInt) {.....resu
02d0: 6c 74 2e 70 75 73 68 28 62 69 67 49 6e 74 20 26  lt.push(bigInt &
02e0: 20 30 78 66 66 29 3b 0a 09 09 09 09 62 69 67 49   0xff);.....bigI
02f0: 6e 74 20 3d 20 62 69 67 49 6e 74 20 3e 3e 20 38  nt = bigInt >> 8
0300: 3b 0a 09 09 09 7d 0a 09 09 09 72 65 73 75 6c 74  ;....}....result
0310: 2e 72 65 76 65 72 73 65 28 29 3b 0a 09 09 09 62  .reverse();....b
0320: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 22 6f 62  reak;...case "ob
0330: 6a 65 63 74 22 3a 0a 09 09 09 72 65 73 75 6c 74  ject":....result
0340: 20 3d 20 5b 5d 3b 0a 09 09 09 6e 65 77 20 55 69   = [];....new Ui
0350: 6e 74 38 41 72 72 61 79 28 62 69 67 49 6e 74 2e  nt8Array(bigInt.
0360: 74 6f 42 79 74 65 41 72 72 61 79 28 29 29 2e 66  toByteArray()).f
0370: 6f 72 45 61 63 68 28 66 75 6e 63 74 69 6f 6e 28  orEach(function(
0380: 65 29 20 7b 0a 09 09 09 09 72 65 73 75 6c 74 2e  e) {.....result.
0390: 70 75 73 68 28 65 29 3b 0a 09 09 09 7d 29 3b 0a  push(e);....});.
03a0: 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72  ...break;..}...r
03b0: 65 73 75 6c 74 20 3d 20 63 61 63 6b 65 79 53 53  esult = cackeySS
03c0: 48 41 67 65 6e 74 45 6e 63 6f 64 65 4c 56 28 72  HAgentEncodeLV(r
03d0: 65 73 75 6c 74 29 3b 0a 0a 09 72 65 74 75 72 6e  esult);...return
03e0: 28 72 65 73 75 6c 74 29 3b 0a 7d 0a 0a 66 75 6e  (result);.}..fun
03f0: 63 74 69 6f 6e 20 63 61 63 6b 65 79 53 53 48 41  ction cackeySSHA
0400: 67 65 6e 74 45 6e 63 6f 64 65 4c 56 28 69 6e 70  gentEncodeLV(inp
0410: 75 74 29 20 7b 0a 09 76 61 72 20 72 65 73 75 6c  ut) {..var resul
0420: 74 3b 0a 0a 09 72 65 73 75 6c 74 20 3d 20 63 61  t;...result = ca
0430: 63 6b 65 79 53 53 48 41 67 65 6e 74 45 6e 63 6f  ckeySSHAgentEnco
0440: 64 65 49 6e 74 28 69 6e 70 75 74 2e 6c 65 6e 67  deInt(input.leng
0450: 74 68 29 3b 0a 09 72 65 73 75 6c 74 20 3d 20 72  th);..result = r
0460: 65 73 75 6c 74 2e 63 6f 6e 63 61 74 28 69 6e 70  esult.concat(inp
0470: 75 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  ut);...return(re
0480: 73 75 6c 74 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69  sult);.}..functi
0490: 6f 6e 20 63 61 63 6b 65 79 53 53 48 41 67 65 6e  on cackeySSHAgen
04a0: 74 44 65 63 6f 64 65 4c 56 28 69 6e 70 75 74 29  tDecodeLV(input)
04b0: 20 7b 0a 09 76 61 72 20 72 65 73 75 6c 74 2c 20   {..var result, 
04c0: 69 6e 66 6f 3b 0a 0a 09 69 6e 66 6f 20 3d 20 63  info;...info = c
04d0: 61 63 6b 65 79 53 53 48 41 67 65 6e 74 44 65 63  ackeySSHAgentDec
04e0: 6f 64 65 49 6e 74 28 69 6e 70 75 74 29 3b 0a 09  odeInt(input);..
04f0: 69 66 20 28 69 6e 66 6f 2e 76 61 6c 75 65 20 3e  if (info.value >
0500: 3d 20 69 6e 70 75 74 2e 6c 65 6e 67 74 68 29 20  = input.length) 
0510: 7b 0a 09 09 74 68 72 6f 77 28 6e 65 77 20 45 72  {...throw(new Er
0520: 72 6f 72 28 22 49 6e 76 61 6c 69 64 20 64 61 74  ror("Invalid dat
0530: 61 22 29 29 3b 0a 09 7d 0a 0a 09 69 6e 70 75 74  a"));..}...input
0540: 20 3d 20 69 6e 66 6f 2e 6f 75 74 70 75 74 3b 0a   = info.output;.
0550: 0a 09 72 65 73 75 6c 74 20 3d 20 69 6e 70 75 74  ..result = input
0560: 2e 73 6c 69 63 65 28 30 2c 20 69 6e 66 6f 2e 76  .slice(0, info.v
0570: 61 6c 75 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28  alue);...return(
0580: 7b 0a 09 09 76 61 6c 75 65 3a 20 72 65 73 75 6c  {...value: resul
0590: 74 2c 0a 09 09 6f 75 74 70 75 74 3a 20 69 6e 70  t,...output: inp
05a0: 75 74 2e 73 6c 69 63 65 28 69 6e 66 6f 2e 76 61  ut.slice(info.va
05b0: 6c 75 65 29 0a 09 7d 29 3b 0a 7d 0a 0a 66 75 6e  lue)..});.}..fun
05c0: 63 74 69 6f 6e 20 63 61 63 6b 65 79 53 53 48 41  ction cackeySSHA
05d0: 67 65 6e 74 45 6e 63 6f 64 65 54 6f 55 54 46 38  gentEncodeToUTF8
05e0: 41 72 72 61 79 28 73 74 72 29 20 7b 0a 09 76 61  Array(str) {..va
05f0: 72 20 75 74 66 38 20 3d 20 5b 5d 3b 0a 0a 09 69  r utf8 = [];...i
0600: 66 20 28 74 79 70 65 6f 66 28 73 74 72 29 20 3d  f (typeof(str) =
0610: 3d 3d 20 22 73 74 72 69 6e 67 22 29 20 7b 0a 09  == "string") {..
0620: 09 73 74 72 20 3d 20 73 74 72 2e 73 70 6c 69 74  .str = str.split
0630: 28 22 22 29 2e 6d 61 70 28 66 75 6e 63 74 69 6f  ("").map(functio
0640: 6e 28 63 29 20 7b 0a 09 09 09 72 65 74 75 72 6e  n(c) {....return
0650: 28 63 2e 63 68 61 72 43 6f 64 65 41 74 28 30 29  (c.charCodeAt(0)
0660: 29 3b 0a 09 09 7d 29 3b 0a 09 7d 0a 0a 09 66 6f  );...});..}...fo
0670: 72 20 28 76 61 72 20 69 20 3d 20 30 3b 20 69 20  r (var i = 0; i 
0680: 3c 20 73 74 72 2e 6c 65 6e 67 74 68 3b 20 69 2b  < str.length; i+
0690: 2b 29 20 7b 0a 09 09 76 61 72 20 63 68 61 72 63  +) {...var charc
06a0: 6f 64 65 20 3d 20 73 74 72 5b 69 5d 3b 0a 0a 09  ode = str[i];...
06b0: 09 69 66 20 28 63 68 61 72 63 6f 64 65 20 3c 20  .if (charcode < 
06c0: 30 78 38 30 29 20 7b 0a 09 09 09 75 74 66 38 2e  0x80) {....utf8.
06d0: 70 75 73 68 28 63 68 61 72 63 6f 64 65 29 3b 0a  push(charcode);.
06e0: 09 09 7d 20 65 6c 73 65 20 69 66 20 28 63 68 61  ..} else if (cha
06f0: 72 63 6f 64 65 20 3c 20 30 78 38 30 30 29 20 7b  rcode < 0x800) {
0700: 0a 09 09 09 75 74 66 38 2e 70 75 73 68 28 30 78  ....utf8.push(0x
0710: 63 30 20 7c 20 28 63 68 61 72 63 6f 64 65 20 3e  c0 | (charcode >
0720: 3e 20 36 29 2c 20 0a 09 09 09 20 20 20 20 20 20  > 6), ....      
0730: 20 20 20 20 30 78 38 30 20 7c 20 28 63 68 61 72      0x80 | (char
0740: 63 6f 64 65 20 26 20 30 78 33 66 29 29 3b 0a 09  code & 0x3f));..
0750: 09 7d 20 65 6c 73 65 20 69 66 20 28 63 68 61 72  .} else if (char
0760: 63 6f 64 65 20 3c 20 30 78 64 38 30 30 20 7c 7c  code < 0xd800 ||
0770: 20 63 68 61 72 63 6f 64 65 20 3e 3d 20 30 78 65   charcode >= 0xe
0780: 30 30 30 29 20 7b 0a 09 09 09 75 74 66 38 2e 70  000) {....utf8.p
0790: 75 73 68 28 30 78 65 30 20 7c 20 28 63 68 61 72  ush(0xe0 | (char
07a0: 63 6f 64 65 20 3e 3e 20 31 32 29 2c 20 0a 09 09  code >> 12), ...
07b0: 09 20 20 20 20 20 20 20 20 20 20 30 78 38 30 20  .          0x80 
07c0: 7c 20 28 28 63 68 61 72 63 6f 64 65 20 3e 3e 20  | ((charcode >> 
07d0: 36 29 20 26 20 30 78 33 66 29 2c 20 0a 09 09 09  6) & 0x3f), ....
07e0: 20 20 20 20 20 20 20 20 20 20 30 78 38 30 20 7c            0x80 |
07f0: 20 28 63 68 61 72 63 6f 64 65 20 26 20 30 78 33   (charcode & 0x3
0800: 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  f));...} else {.
0810: 09 09 09 2f 2f 20 73 75 72 72 6f 67 61 74 65 20  ...// surrogate 
0820: 70 61 69 72 0a 09 09 09 69 2b 2b 3b 0a 09 09 09  pair....i++;....
0830: 2f 2f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  // UTF-16 encode
0840: 73 20 30 78 31 30 30 30 30 2d 30 78 31 30 46 46  s 0x10000-0x10FF
0850: 46 46 20 62 79 0a 09 09 09 2f 2f 20 73 75 62 74  FF by....// subt
0860: 72 61 63 74 69 6e 67 20 30 78 31 30 30 30 30 20  racting 0x10000 
0870: 61 6e 64 20 73 70 6c 69 74 74 69 6e 67 20 74 68  and splitting th
0880: 65 0a 09 09 09 2f 2f 20 32 30 20 62 69 74 73 20  e....// 20 bits 
0890: 6f 66 20 30 78 30 2d 30 78 46 46 46 46 46 20 69  of 0x0-0xFFFFF i
08a0: 6e 74 6f 20 74 77 6f 20 68 61 6c 76 65 73 0a 09  nto two halves..
08b0: 09 09 63 68 61 72 63 6f 64 65 20 3d 20 30 78 31  ..charcode = 0x1
08c0: 30 30 30 30 20 2b 20 28 28 28 63 68 61 72 63 6f  0000 + (((charco
08d0: 64 65 20 26 20 30 78 33 66 66 29 20 3c 3c 20 31  de & 0x3ff) << 1
08e0: 30 29 0a 09 09 09 20 20 20 20 20 20 20 20 20 20  0)....          
08f0: 20 7c 20 28 73 74 72 5b 69 5d 20 26 20 30 78 33   | (str[i] & 0x3
0900: 66 66 29 29 3b 0a 0a 09 09 09 75 74 66 38 2e 70  ff));.....utf8.p
0910: 75 73 68 28 30 78 66 30 20 7c 20 28 63 68 61 72  ush(0xf0 | (char
0920: 63 6f 64 65 20 3e 3e 31 38 29 2c 20 0a 09 09 09  code >>18), ....
0930: 20 20 20 20 20 20 20 20 20 20 30 78 38 30 20 7c            0x80 |
0940: 20 28 28 63 68 61 72 63 6f 64 65 20 3e 3e 20 31   ((charcode >> 1
0950: 32 29 20 26 20 30 78 33 66 29 2c 20 0a 09 09 09  2) & 0x3f), ....
0960: 20 20 20 20 20 20 20 20 20 20 30 78 38 30 20 7c            0x80 |
0970: 20 28 28 63 68 61 72 63 6f 64 65 20 3e 3e 20 36   ((charcode >> 6
0980: 29 20 26 20 30 78 33 66 29 2c 20 0a 09 09 09 20  ) & 0x3f), .... 
0990: 20 20 20 20 20 20 20 20 20 30 78 38 30 20 7c 20           0x80 | 
09a0: 28 63 68 61 72 63 6f 64 65 20 26 20 30 78 33 66  (charcode & 0x3f
09b0: 29 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  ));...}..}...ret
09c0: 75 72 6e 20 75 74 66 38 3b 0a 7d 0a 0a 66 75 6e  urn utf8;.}..fun
09d0: 63 74 69 6f 6e 20 63 61 63 6b 65 79 53 53 48 41  ction cackeySSHA
09e0: 67 65 6e 74 45 6e 63 6f 64 65 53 74 72 69 6e 67  gentEncodeString
09f0: 28 73 74 72 69 6e 67 29 20 7b 0a 09 76 61 72 20  (string) {..var 
0a00: 72 65 73 75 6c 74 3b 0a 0a 09 72 65 73 75 6c 74  result;...result
0a10: 20 3d 20 63 61 63 6b 65 79 53 53 48 41 67 65 6e   = cackeySSHAgen
0a20: 74 45 6e 63 6f 64 65 4c 56 28 63 61 63 6b 65 79  tEncodeLV(cackey
0a30: 53 53 48 41 67 65 6e 74 45 6e 63 6f 64 65 54 6f  SSHAgentEncodeTo
0a40: 55 54 46 38 41 72 72 61 79 28 73 74 72 69 6e 67  UTF8Array(string
0a50: 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 73  ));...return(res
0a60: 75 6c 74 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  ult);.}..functio
0a70: 6e 20 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74  n cackeySSHAgent
0a80: 45 6e 63 6f 64 65 42 69 6e 61 72 79 54 6f 48 65  EncodeBinaryToHe
0a90: 78 28 62 69 6e 61 72 79 53 74 72 69 6e 67 29 20  x(binaryString) 
0aa0: 7b 0a 09 76 61 72 20 62 75 66 66 65 72 3b 0a 0a  {..var buffer;..
0ab0: 09 73 77 69 74 63 68 20 28 74 79 70 65 6f 66 28  .switch (typeof(
0ac0: 62 69 6e 61 72 79 53 74 72 69 6e 67 29 29 20 7b  binaryString)) {
0ad0: 0a 09 09 63 61 73 65 20 22 73 74 72 69 6e 67 22  ...case "string"
0ae0: 3a 0a 09 09 09 62 75 66 66 65 72 20 3d 20 62 69  :....buffer = bi
0af0: 6e 61 72 79 53 74 72 69 6e 67 2e 73 70 6c 69 74  naryString.split
0b00: 28 22 22 29 2e 6d 61 70 28 66 75 6e 63 74 69 6f  ("").map(functio
0b10: 6e 28 63 29 20 7b 0a 09 09 09 09 72 65 74 75 72  n(c) {.....retur
0b20: 6e 28 63 2e 63 68 61 72 43 6f 64 65 41 74 28 30  n(c.charCodeAt(0
0b30: 29 2e 74 6f 53 74 72 69 6e 67 28 31 36 29 2e 70  ).toString(16).p
0b40: 61 64 53 74 61 72 74 28 32 2c 20 27 30 27 29 29  adStart(2, '0'))
0b50: 3b 0a 09 09 09 7d 29 2e 6a 6f 69 6e 28 22 22 29  ;....}).join("")
0b60: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65  ;....break;...de
0b70: 66 61 75 6c 74 3a 0a 09 09 09 62 75 66 66 65 72  fault:....buffer
0b80: 20 3d 20 5b 5d 3b 0a 09 09 09 6e 65 77 20 55 69   = [];....new Ui
0b90: 6e 74 38 41 72 72 61 79 28 62 69 6e 61 72 79 53  nt8Array(binaryS
0ba0: 74 72 69 6e 67 29 2e 6d 61 70 28 66 75 6e 63 74  tring).map(funct
0bb0: 69 6f 6e 28 63 29 20 7b 0a 09 09 09 09 62 75 66  ion(c) {.....buf
0bc0: 66 65 72 2e 70 75 73 68 28 63 2e 74 6f 53 74 72  fer.push(c.toStr
0bd0: 69 6e 67 28 31 36 29 2e 70 61 64 53 74 61 72 74  ing(16).padStart
0be0: 28 32 2c 20 27 30 27 29 29 3b 0a 09 09 09 7d 29  (2, '0'));....})
0bf0: 3b 0a 09 09 09 62 75 66 66 65 72 20 3d 20 62 75  ;....buffer = bu
0c00: 66 66 65 72 2e 6a 6f 69 6e 28 22 22 29 3b 0a 09  ffer.join("");..
0c10: 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65  ..break;..}...re
0c20: 74 75 72 6e 28 62 75 66 66 65 72 29 3b 0a 7d 0a  turn(buffer);.}.
0c30: 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79  .function cackey
0c40: 53 53 48 41 67 65 6e 74 45 6e 63 6f 64 65 43 65  SSHAgentEncodeCe
0c50: 72 74 54 6f 4b 65 79 41 6e 64 49 44 28 63 65 72  rtToKeyAndID(cer
0c60: 74 29 20 7b 0a 09 76 61 72 20 72 65 73 75 6c 74  t) {..var result
0c70: 20 3d 20 6e 75 6c 6c 2c 20 72 65 73 75 6c 74 4b   = null, resultK
0c80: 65 79 20 3d 20 6e 75 6c 6c 3b 0a 09 76 61 72 20  ey = null;..var 
0c90: 63 65 72 74 4f 62 6a 3b 0a 09 76 61 72 20 70 75  certObj;..var pu
0ca0: 62 6c 69 63 4b 65 79 3b 0a 0a 09 63 65 72 74 4f  blicKey;...certO
0cb0: 62 6a 20 3d 20 6e 65 77 20 58 35 30 39 3b 0a 09  bj = new X509;..
0cc0: 69 66 20 28 21 63 65 72 74 4f 62 6a 29 20 7b 0a  if (!certObj) {.
0cd0: 09 09 72 65 74 75 72 6e 28 72 65 73 75 6c 74 29  ..return(result)
0ce0: 3b 0a 09 7d 0a 0a 09 63 65 72 74 4f 62 6a 2e 72  ;..}...certObj.r
0cf0: 65 61 64 43 65 72 74 48 65 78 28 63 61 63 6b 65  eadCertHex(cacke
0d00: 79 53 53 48 41 67 65 6e 74 45 6e 63 6f 64 65 42  ySSHAgentEncodeB
0d10: 69 6e 61 72 79 54 6f 48 65 78 28 63 65 72 74 29  inaryToHex(cert)
0d20: 29 3b 0a 0a 09 70 75 62 6c 69 63 4b 65 79 20 3d  );...publicKey =
0d30: 20 63 65 72 74 4f 62 6a 2e 67 65 74 50 75 62 6c   certObj.getPubl
0d40: 69 63 4b 65 79 28 29 3b 0a 0a 09 73 77 69 74 63  icKey();...switc
0d50: 68 20 28 70 75 62 6c 69 63 4b 65 79 2e 74 79 70  h (publicKey.typ
0d60: 65 29 20 7b 0a 09 09 63 61 73 65 20 22 52 53 41  e) {...case "RSA
0d70: 22 3a 0a 09 09 09 72 65 73 75 6c 74 4b 65 79 20  ":....resultKey 
0d80: 3d 20 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74  = cackeySSHAgent
0d90: 45 6e 63 6f 64 65 53 74 72 69 6e 67 28 22 73 73  EncodeString("ss
0da0: 68 2d 72 73 61 22 29 3b 0a 09 09 09 72 65 73 75  h-rsa");....resu
0db0: 6c 74 4b 65 79 20 3d 20 72 65 73 75 6c 74 4b 65  ltKey = resultKe
0dc0: 79 2e 63 6f 6e 63 61 74 28 63 61 63 6b 65 79 53  y.concat(cackeyS
0dd0: 53 48 41 67 65 6e 74 45 6e 63 6f 64 65 42 69 67  SHAgentEncodeBig
0de0: 49 6e 74 28 70 75 62 6c 69 63 4b 65 79 2e 65 29  Int(publicKey.e)
0df0: 29 3b 0a 09 09 09 72 65 73 75 6c 74 4b 65 79 20  );....resultKey 
0e00: 3d 20 72 65 73 75 6c 74 4b 65 79 2e 63 6f 6e 63  = resultKey.conc
0e10: 61 74 28 63 61 63 6b 65 79 53 53 48 41 67 65 6e  at(cackeySSHAgen
0e20: 74 45 6e 63 6f 64 65 42 69 67 49 6e 74 28 70 75  tEncodeBigInt(pu
0e30: 62 6c 69 63 4b 65 79 2e 6e 29 29 3b 0a 09 09 09  blicKey.n));....
0e40: 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74  break;...default
0e50: 3a 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67  :....console.log
0e60: 28 22 5b 63 61 63 6b 65 79 53 53 48 5d 20 55 6e  ("[cackeySSH] Un
0e70: 73 75 70 70 6f 72 74 65 64 20 70 75 62 6c 69 63  supported public
0e80: 20 6b 65 79 20 74 79 70 65 3a 22 2c 20 70 75 62   key type:", pub
0e90: 6c 69 63 4b 65 79 2e 74 79 70 65 2c 20 22 2d 2d  licKey.type, "--
0ea0: 20 69 67 6e 6f 72 69 6e 67 2e 22 29 3b 0a 09 7d   ignoring.");..}
0eb0: 0a 0a 09 69 66 20 28 72 65 73 75 6c 74 4b 65 79  ...if (resultKey
0ec0: 29 20 7b 0a 09 09 72 65 73 75 6c 74 20 3d 20 7b  ) {...result = {
0ed0: 0a 09 09 09 69 64 3a 20 63 65 72 74 4f 62 6a 2e  ....id: certObj.
0ee0: 67 65 74 53 75 62 6a 65 63 74 53 74 72 69 6e 67  getSubjectString
0ef0: 28 29 2c 0a 09 09 09 6b 65 79 3a 20 72 65 73 75  (),....key: resu
0f00: 6c 74 4b 65 79 0a 09 09 7d 3b 0a 09 7d 0a 0a 09  ltKey...};..}...
0f10: 72 65 74 75 72 6e 28 72 65 73 75 6c 74 29 3b 0a  return(result);.
0f20: 7d 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d 6d 61 6e 64  }../*. * Command
0f30: 20 48 61 6e 64 6c 65 72 73 0a 20 2a 2f 0a 61 73   Handlers. */.as
0f40: 79 6e 63 20 66 75 6e 63 74 69 6f 6e 20 63 61 63  ync function cac
0f50: 6b 65 79 53 53 48 41 67 65 6e 74 43 6f 6d 6d 61  keySSHAgentComma
0f60: 6e 64 52 65 71 75 65 73 74 49 64 65 6e 74 69 74  ndRequestIdentit
0f70: 79 28 72 65 71 75 65 73 74 29 20 7b 0a 09 76 61  y(request) {..va
0f80: 72 20 72 65 73 70 6f 6e 73 65 3b 0a 09 76 61 72  r response;..var
0f90: 20 63 65 72 74 73 20 3d 20 5b 5d 3b 0a 09 76 61   certs = [];..va
0fa0: 72 20 6b 65 79 73 20 3d 20 5b 5d 3b 0a 0a 09 2f  r keys = [];.../
0fb0: 2a 0a 09 20 2a 20 47 65 74 20 61 20 6c 69 73 74  *.. * Get a list
0fc0: 20 6f 66 20 63 65 72 74 69 66 69 63 61 74 65 73   of certificates
0fd0: 0a 09 20 2a 2f 0a 09 63 65 72 74 73 20 3d 20 61  .. */..certs = a
0fe0: 77 61 69 74 20 63 61 63 6b 65 79 4c 69 73 74 43  wait cackeyListC
0ff0: 65 72 74 69 66 69 63 61 74 65 73 28 29 3b 0a 0a  ertificates();..
1000: 09 2f 2a 0a 09 20 2a 20 43 6f 6e 76 65 72 74 20  ./*.. * Convert 
1010: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65  each certificate
1020: 20 74 6f 20 61 6e 20 53 53 48 20 6b 65 79 20 62   to an SSH key b
1030: 6c 6f 62 0a 09 20 2a 2f 0a 09 63 65 72 74 73 2e  lob.. */..certs.
1040: 66 6f 72 45 61 63 68 28 66 75 6e 63 74 69 6f 6e  forEach(function
1050: 28 63 65 72 74 29 20 7b 0a 09 09 76 61 72 20 6b  (cert) {...var k
1060: 65 79 3b 0a 0a 09 09 6b 65 79 20 3d 20 63 61 63  ey;....key = cac
1070: 6b 65 79 53 53 48 41 67 65 6e 74 45 6e 63 6f 64  keySSHAgentEncod
1080: 65 43 65 72 74 54 6f 4b 65 79 41 6e 64 49 44 28  eCertToKeyAndID(
1090: 63 65 72 74 2e 63 65 72 74 69 66 69 63 61 74 65  cert.certificate
10a0: 29 3b 0a 0a 09 09 69 66 20 28 6b 65 79 29 20 7b  );....if (key) {
10b0: 0a 09 09 09 6b 65 79 73 2e 70 75 73 68 28 6b 65  ....keys.push(ke
10c0: 79 29 3b 0a 09 09 7d 0a 09 7d 29 3b 0a 0a 09 2f  y);...}..});.../
10d0: 2a 0a 09 20 2a 20 45 6e 63 6f 64 65 20 72 65 73  *.. * Encode res
10e0: 70 6f 6e 73 65 0a 09 20 2a 2f 0a 09 72 65 73 70  ponse.. */..resp
10f0: 6f 6e 73 65 20 3d 20 5b 5d 3b 0a 0a 09 72 65 73  onse = [];...res
1100: 70 6f 6e 73 65 2e 70 75 73 68 28 63 61 63 6b 65  ponse.push(cacke
1110: 79 53 53 48 41 67 65 6e 74 4d 65 73 73 61 67 65  ySSHAgentMessage
1120: 2e 53 53 48 5f 41 47 45 4e 54 5f 49 44 45 4e 54  .SSH_AGENT_IDENT
1130: 49 54 49 45 53 5f 41 4e 53 57 45 52 29 3b 0a 09  ITIES_ANSWER);..
1140: 72 65 73 70 6f 6e 73 65 20 3d 20 72 65 73 70 6f  response = respo
1150: 6e 73 65 2e 63 6f 6e 63 61 74 28 63 61 63 6b 65  nse.concat(cacke
1160: 79 53 53 48 41 67 65 6e 74 45 6e 63 6f 64 65 49  ySSHAgentEncodeI
1170: 6e 74 28 6b 65 79 73 2e 6c 65 6e 67 74 68 29 29  nt(keys.length))
1180: 3b 0a 09 6b 65 79 73 2e 66 6f 72 45 61 63 68 28  ;..keys.forEach(
1190: 66 75 6e 63 74 69 6f 6e 28 6b 65 79 29 20 7b 0a  function(key) {.
11a0: 09 09 72 65 73 70 6f 6e 73 65 20 3d 20 72 65 73  ..response = res
11b0: 70 6f 6e 73 65 2e 63 6f 6e 63 61 74 28 63 61 63  ponse.concat(cac
11c0: 6b 65 79 53 53 48 41 67 65 6e 74 45 6e 63 6f 64  keySSHAgentEncod
11d0: 65 4c 56 28 6b 65 79 2e 6b 65 79 29 29 3b 0a 09  eLV(key.key));..
11e0: 09 72 65 73 70 6f 6e 73 65 20 3d 20 72 65 73 70  .response = resp
11f0: 6f 6e 73 65 2e 63 6f 6e 63 61 74 28 63 61 63 6b  onse.concat(cack
1200: 65 79 53 53 48 41 67 65 6e 74 45 6e 63 6f 64 65  eySSHAgentEncode
1210: 53 74 72 69 6e 67 28 22 43 41 43 4b 65 79 3a 20  String("CACKey: 
1220: 22 20 2b 20 6b 65 79 2e 69 64 29 29 3b 0a 09 7d  " + key.id));..}
1230: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 73 70  );...return(resp
1240: 6f 6e 73 65 29 3b 0a 7d 0a 0a 61 73 79 6e 63 20  onse);.}..async 
1250: 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 53  function cackeyS
1260: 53 48 41 67 65 6e 74 43 6f 6d 6d 61 6e 64 53 69  SHAgentCommandSi
1270: 67 6e 52 65 71 75 65 73 74 28 72 65 71 75 65 73  gnRequest(reques
1280: 74 29 20 7b 0a 09 76 61 72 20 6b 65 79 49 6e 66  t) {..var keyInf
1290: 6f 2c 20 64 61 74 61 2c 20 66 6c 61 67 73 3b 0a  o, data, flags;.
12a0: 09 76 61 72 20 63 65 72 74 73 2c 20 63 65 72 74  .var certs, cert
12b0: 54 6f 55 73 65 3b 0a 09 76 61 72 20 68 61 73 68  ToUse;..var hash
12c0: 4d 65 74 68 6f 64 2c 20 73 69 67 6e 65 64 44 61  Method, signedDa
12d0: 74 61 2c 20 73 69 67 6e 65 64 44 61 74 61 48 65  ta, signedDataHe
12e0: 61 64 65 72 2c 20 73 69 67 6e 52 65 71 75 65 73  ader, signReques
12f0: 74 3b 0a 09 76 61 72 20 72 65 73 70 6f 6e 73 65  t;..var response
1300: 3b 0a 09 76 61 72 20 66 6c 61 67 4d 65 61 6e 69  ;..var flagMeani
1310: 6e 67 20 3d 20 7b 0a 09 09 53 53 48 5f 41 47 45  ng = {...SSH_AGE
1320: 4e 54 5f 52 53 41 5f 53 48 41 32 5f 32 35 36 3a  NT_RSA_SHA2_256:
1330: 20 32 2c 0a 09 09 53 53 48 5f 41 47 45 4e 54 5f   2,...SSH_AGENT_
1340: 52 53 41 5f 53 48 41 32 5f 35 31 32 3a 20 34 0a  RSA_SHA2_512: 4.
1350: 09 7d 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 53 74 72  .};.../*.. * Str
1360: 69 70 20 6f 66 66 20 74 68 65 20 63 6f 6d 6d 61  ip off the comma
1370: 6e 64 0a 09 20 2a 2f 0a 09 72 65 71 75 65 73 74  nd.. */..request
1380: 20 3d 20 72 65 71 75 65 73 74 2e 73 6c 69 63 65   = request.slice
1390: 28 31 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 47 65  (1);.../*.. * Ge
13a0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f  t certificate to
13b0: 20 73 69 67 6e 20 75 73 69 6e 67 0a 09 20 2a 2f   sign using.. */
13c0: 0a 09 6b 65 79 49 6e 66 6f 20 3d 20 63 61 63 6b  ..keyInfo = cack
13d0: 65 79 53 53 48 41 67 65 6e 74 44 65 63 6f 64 65  eySSHAgentDecode
13e0: 4c 56 28 72 65 71 75 65 73 74 29 3b 0a 09 72 65  LV(request);..re
13f0: 71 75 65 73 74 20 3d 20 6b 65 79 49 6e 66 6f 2e  quest = keyInfo.
1400: 6f 75 74 70 75 74 3b 0a 09 6b 65 79 49 6e 66 6f  output;..keyInfo
1410: 20 3d 20 6b 65 79 49 6e 66 6f 2e 76 61 6c 75 65   = keyInfo.value
1420: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 47 65 74 20 74  ;.../*.. * Get t
1430: 68 65 20 64 61 74 61 20 74 6f 20 73 69 67 6e 0a  he data to sign.
1440: 09 20 2a 2f 0a 09 64 61 74 61 20 3d 20 63 61 63  . */..data = cac
1450: 6b 65 79 53 53 48 41 67 65 6e 74 44 65 63 6f 64  keySSHAgentDecod
1460: 65 4c 56 28 72 65 71 75 65 73 74 29 3b 0a 09 72  eLV(request);..r
1470: 65 71 75 65 73 74 20 3d 20 64 61 74 61 2e 6f 75  equest = data.ou
1480: 74 70 75 74 3b 0a 09 64 61 74 61 20 3d 20 64 61  tput;..data = da
1490: 74 61 2e 76 61 6c 75 65 3b 0a 0a 09 2f 2a 0a 09  ta.value;.../*..
14a0: 20 2a 20 47 65 74 20 74 68 65 20 66 6c 61 67 73   * Get the flags
14b0: 0a 09 20 2a 2f 0a 09 66 6c 61 67 73 20 3d 20 63  .. */..flags = c
14c0: 61 63 6b 65 79 53 53 48 41 67 65 6e 74 44 65 63  ackeySSHAgentDec
14d0: 6f 64 65 49 6e 74 28 72 65 71 75 65 73 74 29 3b  odeInt(request);
14e0: 0a 09 72 65 71 75 65 73 74 20 3d 20 66 6c 61 67  ..request = flag
14f0: 73 2e 6f 75 74 70 75 74 3b 0a 09 66 6c 61 67 73  s.output;..flags
1500: 20 3d 20 66 6c 61 67 73 2e 76 61 6c 75 65 3b 0a   = flags.value;.
1510: 0a 09 2f 2a 0a 09 20 2a 20 46 69 6e 64 20 74 68  ../*.. * Find th
1520: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 68  e certificate th
1530: 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 72  at matches the r
1540: 65 71 75 65 73 74 65 64 20 6b 65 79 0a 09 20 2a  equested key.. *
1550: 2f 0a 09 63 65 72 74 73 20 3d 20 61 77 61 69 74  /..certs = await
1560: 20 63 61 63 6b 65 79 4c 69 73 74 43 65 72 74 69   cackeyListCerti
1570: 66 69 63 61 74 65 73 28 29 3b 0a 09 63 65 72 74  ficates();..cert
1580: 54 6f 55 73 65 20 3d 20 6e 75 6c 6c 3b 0a 09 63  ToUse = null;..c
1590: 65 72 74 73 2e 66 6f 72 45 61 63 68 28 66 75 6e  erts.forEach(fun
15a0: 63 74 69 6f 6e 28 63 65 72 74 29 20 7b 0a 09 09  ction(cert) {...
15b0: 76 61 72 20 6b 65 79 3b 0a 0a 09 09 6b 65 79 20  var key;....key 
15c0: 3d 20 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74  = cackeySSHAgent
15d0: 45 6e 63 6f 64 65 43 65 72 74 54 6f 4b 65 79 41  EncodeCertToKeyA
15e0: 6e 64 49 44 28 63 65 72 74 2e 63 65 72 74 69 66  ndID(cert.certif
15f0: 69 63 61 74 65 29 3b 0a 0a 09 09 69 66 20 28 6b  icate);....if (k
1600: 65 79 2e 6b 65 79 2e 6a 6f 69 6e 28 29 20 3d 3d  ey.key.join() ==
1610: 20 6b 65 79 49 6e 66 6f 2e 6a 6f 69 6e 28 29 29   keyInfo.join())
1620: 20 7b 0a 09 09 09 63 65 72 74 54 6f 55 73 65 20   {....certToUse 
1630: 3d 20 63 65 72 74 3b 0a 09 09 7d 0a 09 7d 29 3b  = cert;...}..});
1640: 0a 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 6e 6f 20  .../*.. * If no 
1650: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 66  certificate is f
1660: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 6e 20  ound, return an 
1670: 65 72 72 6f 72 0a 09 20 2a 2f 0a 09 69 66 20 28  error.. */..if (
1680: 21 63 65 72 74 54 6f 55 73 65 29 20 7b 0a 09 09  !certToUse) {...
1690: 63 6f 6e 73 6f 6c 65 2e 69 6e 66 6f 28 22 5b 63  console.info("[c
16a0: 61 63 6b 65 79 53 53 48 5d 20 55 6e 61 62 6c 65  ackeySSH] Unable
16b0: 20 74 6f 20 66 69 6e 64 20 61 20 63 65 72 74 69   to find a certi
16c0: 66 69 63 61 74 65 20 74 6f 20 6d 61 74 63 68 20  ficate to match 
16d0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6b 65  the requested ke
16e0: 79 3a 22 2c 20 6b 65 79 49 6e 66 6f 29 3b 0a 0a  y:", keyInfo);..
16f0: 09 09 72 65 74 75 72 6e 28 6e 75 6c 6c 29 3b 0a  ..return(null);.
1700: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 50 65 72 66  .}.../*.. * Perf
1710: 6f 72 6d 20 68 61 73 68 69 6e 67 20 6f 66 20 74  orm hashing of t
1720: 68 65 20 64 61 74 61 20 61 73 20 73 70 65 63 69  he data as speci
1730: 66 69 65 64 20 62 79 20 74 68 65 20 66 6c 61 67  fied by the flag
1740: 73 0a 09 20 2a 2f 0a 09 69 66 20 28 28 66 6c 61  s.. */..if ((fla
1750: 67 73 20 26 20 66 6c 61 67 4d 65 61 6e 69 6e 67  gs & flagMeaning
1760: 2e 53 53 48 5f 41 47 45 4e 54 5f 52 53 41 5f 53  .SSH_AGENT_RSA_S
1770: 48 41 32 5f 35 31 32 29 20 3d 3d 20 66 6c 61 67  HA2_512) == flag
1780: 4d 65 61 6e 69 6e 67 2e 53 53 48 5f 41 47 45 4e  Meaning.SSH_AGEN
1790: 54 5f 52 53 41 5f 53 48 41 32 5f 35 31 32 29 20  T_RSA_SHA2_512) 
17a0: 7b 0a 09 09 68 61 73 68 4d 65 74 68 6f 64 20 3d  {...hashMethod =
17b0: 20 22 53 48 41 35 31 32 22 3b 0a 09 09 64 61 74   "SHA512";...dat
17c0: 61 20 3d 20 61 77 61 69 74 20 63 72 79 70 74 6f  a = await crypto
17d0: 2e 73 75 62 74 6c 65 2e 64 69 67 65 73 74 28 22  .subtle.digest("
17e0: 53 48 41 2d 35 31 32 22 2c 20 6e 65 77 20 55 69  SHA-512", new Ui
17f0: 6e 74 38 41 72 72 61 79 28 64 61 74 61 29 29 3b  nt8Array(data));
1800: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 28 66 6c  ..} else if ((fl
1810: 61 67 73 20 26 20 66 6c 61 67 4d 65 61 6e 69 6e  ags & flagMeanin
1820: 67 2e 53 53 48 5f 41 47 45 4e 54 5f 52 53 41 5f  g.SSH_AGENT_RSA_
1830: 53 48 41 32 5f 32 35 36 29 20 3d 3d 20 66 6c 61  SHA2_256) == fla
1840: 67 4d 65 61 6e 69 6e 67 2e 53 53 48 5f 41 47 45  gMeaning.SSH_AGE
1850: 4e 54 5f 52 53 41 5f 53 48 41 32 5f 32 35 36 29  NT_RSA_SHA2_256)
1860: 20 7b 0a 09 09 68 61 73 68 4d 65 74 68 6f 64 20   {...hashMethod 
1870: 3d 20 22 53 48 41 32 35 36 22 3b 0a 09 09 64 61  = "SHA256";...da
1880: 74 61 20 3d 20 61 77 61 69 74 20 63 72 79 70 74  ta = await crypt
1890: 6f 2e 73 75 62 74 6c 65 2e 64 69 67 65 73 74 28  o.subtle.digest(
18a0: 22 53 48 41 2d 32 35 36 22 2c 20 6e 65 77 20 55  "SHA-256", new U
18b0: 69 6e 74 38 41 72 72 61 79 28 64 61 74 61 29 29  int8Array(data))
18c0: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 66 6c  ;..} else if (fl
18d0: 61 67 73 20 3d 3d 20 30 29 20 7b 0a 09 09 68 61  ags == 0) {...ha
18e0: 73 68 4d 65 74 68 6f 64 20 3d 20 22 53 48 41 31  shMethod = "SHA1
18f0: 22 3b 0a 09 09 64 61 74 61 20 3d 20 61 77 61 69  ";...data = awai
1900: 74 20 63 72 79 70 74 6f 2e 73 75 62 74 6c 65 2e  t crypto.subtle.
1910: 64 69 67 65 73 74 28 22 53 48 41 2d 31 22 2c 20  digest("SHA-1", 
1920: 6e 65 77 20 55 69 6e 74 38 41 72 72 61 79 28 64  new Uint8Array(d
1930: 61 74 61 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  ata));..} else {
1940: 0a 09 09 63 6f 6e 73 6f 6c 65 2e 69 6e 66 6f 28  ...console.info(
1950: 22 5b 63 61 63 6b 65 79 53 53 48 5d 20 53 69 67  "[cackeySSH] Sig
1960: 6e 20 72 65 71 75 65 73 74 20 77 69 74 68 20 66  n request with f
1970: 6c 61 67 73 20 73 65 74 20 74 6f 22 2c 20 66 6c  lags set to", fl
1980: 61 67 73 2c 20 22 77 68 69 63 68 20 69 73 20 75  ags, "which is u
1990: 6e 73 75 70 70 6f 72 74 65 64 2c 20 66 61 69 6c  nsupported, fail
19a0: 69 6e 67 20 74 68 65 20 72 65 71 75 65 73 74 2e  ing the request.
19b0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 6e 75  ");....return(nu
19c0: 6c 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  ll);..}.../*.. *
19d0: 20 53 69 67 6e 20 74 68 65 20 64 61 74 61 0a 09   Sign the data..
19e0: 20 2a 2f 0a 09 73 69 67 6e 52 65 71 75 65 73 74   */..signRequest
19f0: 20 3d 20 7b 0a 09 09 68 61 73 68 3a 20 68 61 73   = {...hash: has
1a00: 68 4d 65 74 68 6f 64 2c 0a 09 09 64 69 67 65 73  hMethod,...diges
1a10: 74 3a 20 6e 65 77 20 55 69 6e 74 38 41 72 72 61  t: new Uint8Arra
1a20: 79 28 64 61 74 61 29 0a 09 7d 3b 0a 09 73 69 67  y(data)..};..sig
1a30: 6e 65 64 44 61 74 61 20 3d 20 61 77 61 69 74 20  nedData = await 
1a40: 63 61 63 6b 65 79 53 69 67 6e 4d 65 73 73 61 67  cackeySignMessag
1a50: 65 28 73 69 67 6e 52 65 71 75 65 73 74 29 3b 0a  e(signRequest);.
1a60: 09 73 69 67 6e 65 64 44 61 74 61 20 3d 20 41 72  .signedData = Ar
1a70: 72 61 79 2e 66 72 6f 6d 28 6e 65 77 20 55 69 6e  ray.from(new Uin
1a80: 74 38 41 72 72 61 79 28 73 69 67 6e 65 64 44 61  t8Array(signedDa
1a90: 74 61 29 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 45  ta));.../*.. * E
1aa0: 6e 63 6f 64 65 20 73 69 67 6e 61 74 75 72 65 0a  ncode signature.
1ab0: 09 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 68 61  . */..switch (ha
1ac0: 73 68 4d 65 74 68 6f 64 29 20 7b 0a 09 09 63 61  shMethod) {...ca
1ad0: 73 65 20 22 53 48 41 31 22 3a 0a 09 09 09 73 69  se "SHA1":....si
1ae0: 67 6e 65 64 44 61 74 61 48 65 61 64 65 72 20 3d  gnedDataHeader =
1af0: 20 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74 45   cackeySSHAgentE
1b00: 6e 63 6f 64 65 53 74 72 69 6e 67 28 22 73 73 68  ncodeString("ssh
1b10: 2d 72 73 61 22 29 3b 0a 09 09 09 62 72 65 61 6b  -rsa");....break
1b20: 3b 0a 09 09 63 61 73 65 20 22 53 48 41 32 35 36  ;...case "SHA256
1b30: 22 3a 0a 09 09 09 73 69 67 6e 65 64 44 61 74 61  ":....signedData
1b40: 48 65 61 64 65 72 20 3d 20 63 61 63 6b 65 79 53  Header = cackeyS
1b50: 53 48 41 67 65 6e 74 45 6e 63 6f 64 65 53 74 72  SHAgentEncodeStr
1b60: 69 6e 67 28 22 72 73 61 2d 73 68 61 32 2d 32 35  ing("rsa-sha2-25
1b70: 36 22 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  6");....break;..
1b80: 09 63 61 73 65 20 22 53 48 41 35 31 32 22 3a 0a  .case "SHA512":.
1b90: 09 09 09 73 69 67 6e 65 64 44 61 74 61 48 65 61  ...signedDataHea
1ba0: 64 65 72 20 3d 20 63 61 63 6b 65 79 53 53 48 41  der = cackeySSHA
1bb0: 67 65 6e 74 45 6e 63 6f 64 65 53 74 72 69 6e 67  gentEncodeString
1bc0: 28 22 72 73 61 2d 73 68 61 32 2d 35 31 32 22 29  ("rsa-sha2-512")
1bd0: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65  ;....break;...de
1be0: 66 61 75 6c 74 3a 0a 09 09 09 73 69 67 6e 65 64  fault:....signed
1bf0: 44 61 74 61 48 65 61 64 65 72 20 3d 20 5b 5d 3b  DataHeader = [];
1c00: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 09 73  ....break;..}..s
1c10: 69 67 6e 65 64 44 61 74 61 20 3d 20 73 69 67 6e  ignedData = sign
1c20: 65 64 44 61 74 61 48 65 61 64 65 72 2e 63 6f 6e  edDataHeader.con
1c30: 63 61 74 28 63 61 63 6b 65 79 53 53 48 41 67 65  cat(cackeySSHAge
1c40: 6e 74 45 6e 63 6f 64 65 4c 56 28 73 69 67 6e 65  ntEncodeLV(signe
1c50: 64 44 61 74 61 29 29 3b 0a 0a 09 2f 2a 0a 09 20  dData));.../*.. 
1c60: 2a 20 45 6e 63 6f 64 65 20 72 65 73 70 6f 6e 73  * Encode respons
1c70: 65 0a 09 20 2a 2f 0a 09 72 65 73 70 6f 6e 73 65  e.. */..response
1c80: 20 3d 20 5b 5d 3b 0a 0a 09 72 65 73 70 6f 6e 73   = [];...respons
1c90: 65 2e 70 75 73 68 28 63 61 63 6b 65 79 53 53 48  e.push(cackeySSH
1ca0: 41 67 65 6e 74 4d 65 73 73 61 67 65 2e 53 53 48  AgentMessage.SSH
1cb0: 5f 41 47 45 4e 54 5f 53 49 47 4e 5f 52 45 53 50  _AGENT_SIGN_RESP
1cc0: 4f 4e 53 45 29 3b 0a 09 72 65 73 70 6f 6e 73 65  ONSE);..response
1cd0: 20 3d 20 72 65 73 70 6f 6e 73 65 2e 63 6f 6e 63   = response.conc
1ce0: 61 74 28 63 61 63 6b 65 79 53 53 48 41 67 65 6e  at(cackeySSHAgen
1cf0: 74 45 6e 63 6f 64 65 4c 56 28 73 69 67 6e 65 64  tEncodeLV(signed
1d00: 44 61 74 61 29 29 3b 0a 0a 09 72 65 74 75 72 6e  Data));...return
1d10: 28 72 65 73 70 6f 6e 73 65 29 3b 0a 7d 0a 0a 2f  (response);.}../
1d20: 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 68 61 6e  *. * Session han
1d30: 64 6c 69 6e 67 0a 20 2a 2f 0a 61 73 79 6e 63 20  dling. */.async 
1d40: 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 53  function cackeyS
1d50: 53 48 41 67 65 6e 74 48 61 6e 64 6c 65 4d 65 73  SHAgentHandleMes
1d60: 73 61 67 65 28 73 6f 63 6b 65 74 2c 20 72 65 71  sage(socket, req
1d70: 75 65 73 74 29 20 7b 0a 09 76 61 72 20 73 73 68  uest) {..var ssh
1d80: 52 65 71 75 65 73 74 49 44 2c 20 73 73 68 52 65  RequestID, sshRe
1d90: 71 75 65 73 74 2c 20 72 65 73 70 6f 6e 73 65 2c  quest, response,
1da0: 20 73 73 68 52 65 73 70 6f 6e 73 65 3b 0a 09 76   sshResponse;..v
1db0: 61 72 20 73 73 68 48 61 6e 64 6c 65 72 45 72 72  ar sshHandlerErr
1dc0: 6f 72 3b 0a 0a 09 69 66 20 28 21 72 65 71 75 65  or;...if (!reque
1dd0: 73 74 2e 74 79 70 65 20 7c 7c 20 72 65 71 75 65  st.type || reque
1de0: 73 74 2e 74 79 70 65 20 21 3d 3d 20 22 61 75 74  st.type !== "aut
1df0: 68 2d 61 67 65 6e 74 40 6f 70 65 6e 73 73 68 2e  h-agent@openssh.
1e00: 63 6f 6d 22 29 20 7b 0a 09 09 72 65 74 75 72 6e  com") {...return
1e10: 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 72 65 71 75  ;..}...if (!requ
1e20: 65 73 74 2e 64 61 74 61 20 7c 7c 20 72 65 71 75  est.data || requ
1e30: 65 73 74 2e 64 61 74 61 2e 6c 65 6e 67 74 68 20  est.data.length 
1e40: 3c 20 31 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  < 1) {...return;
1e50: 0a 09 7d 0a 0a 09 73 73 68 52 65 71 75 65 73 74  ..}...sshRequest
1e60: 49 44 20 3d 20 72 65 71 75 65 73 74 2e 64 61 74  ID = request.dat
1e70: 61 5b 30 5d 3b 0a 09 73 73 68 52 65 71 75 65 73  a[0];..sshReques
1e80: 74 20 3d 20 7b 7d 3b 0a 09 69 66 20 28 73 73 68  t = {};..if (ssh
1e90: 52 65 71 75 65 73 74 49 44 20 3c 20 63 61 63 6b  RequestID < cack
1ea0: 65 79 53 53 48 41 67 65 6e 74 43 6f 6d 6d 61 6e  eySSHAgentComman
1eb0: 64 73 2e 6c 65 6e 67 74 68 29 20 7b 0a 09 09 73  ds.length) {...s
1ec0: 73 68 52 65 71 75 65 73 74 20 3d 20 63 61 63 6b  shRequest = cack
1ed0: 65 79 53 53 48 41 67 65 6e 74 43 6f 6d 6d 61 6e  eySSHAgentComman
1ee0: 64 73 5b 73 73 68 52 65 71 75 65 73 74 49 44 5d  ds[sshRequestID]
1ef0: 3b 0a 09 7d 0a 0a 09 72 65 73 70 6f 6e 73 65 20  ;..}...response 
1f00: 3d 20 6e 75 6c 6c 3b 0a 09 69 66 20 28 21 73 73  = null;..if (!ss
1f10: 68 52 65 71 75 65 73 74 2e 6e 61 6d 65 29 20 7b  hRequest.name) {
1f20: 0a 09 09 69 66 20 28 67 6f 6f 67 2e 44 45 42 55  ...if (goog.DEBU
1f30: 47 29 20 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e  G) {....console.
1f40: 6c 6f 67 28 22 5b 63 61 63 6b 65 79 53 53 48 5d  log("[cackeySSH]
1f50: 20 55 6e 73 75 70 70 6f 72 74 65 64 20 72 65 71   Unsupported req
1f60: 75 65 73 74 3a 20 22 2c 20 72 65 71 75 65 73 74  uest: ", request
1f70: 2c 20 22 3b 20 66 72 6f 6d 3a 20 22 2c 20 73 6f  , "; from: ", so
1f80: 63 6b 65 74 2e 73 65 6e 64 65 72 2e 69 64 29 3b  cket.sender.id);
1f90: 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
1fa0: 09 69 66 20 28 67 6f 6f 67 2e 44 45 42 55 47 29  .if (goog.DEBUG)
1fb0: 20 7b 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f   {....console.lo
1fc0: 67 28 22 5b 63 61 63 6b 65 79 53 53 48 5d 20 52  g("[cackeySSH] R
1fd0: 65 71 75 65 73 74 3a 20 22 2c 20 73 73 68 52 65  equest: ", sshRe
1fe0: 71 75 65 73 74 2e 6e 61 6d 65 2c 20 22 3b 20 66  quest.name, "; f
1ff0: 72 6f 6d 3a 20 22 2c 20 73 6f 63 6b 65 74 2e 73  rom: ", socket.s
2000: 65 6e 64 65 72 2e 69 64 29 3b 0a 09 09 7d 0a 0a  ender.id);...}..
2010: 09 09 74 72 79 20 7b 0a 09 09 09 72 65 73 70 6f  ..try {....respo
2020: 6e 73 65 20 3d 20 61 77 61 69 74 20 73 73 68 52  nse = await sshR
2030: 65 71 75 65 73 74 2e 68 61 6e 64 6c 65 72 28 72  equest.handler(r
2040: 65 71 75 65 73 74 2e 64 61 74 61 29 3b 0a 09 09  equest.data);...
2050: 7d 20 63 61 74 63 68 20 28 73 73 68 48 61 6e 64  } catch (sshHand
2060: 6c 65 72 45 72 72 6f 72 29 20 7b 0a 09 09 09 72  lerError) {....r
2070: 65 73 70 6f 6e 73 65 20 3d 20 6e 75 6c 6c 3b 0a  esponse = null;.
2080: 0a 09 09 09 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f  ....console.erro
2090: 72 28 22 5b 63 61 63 6b 65 79 53 53 48 5d 20 52  r("[cackeySSH] R
20a0: 65 71 75 65 73 74 3a 22 2c 20 73 73 68 52 65 71  equest:", sshReq
20b0: 75 65 73 74 2e 6e 61 6d 65 2c 20 22 28 22 2c 20  uest.name, "(", 
20c0: 72 65 71 75 65 73 74 2c 20 22 29 20 45 52 52 4f  request, ") ERRO
20d0: 52 3a 22 2c 20 73 73 68 48 61 6e 64 6c 65 72 45  R:", sshHandlerE
20e0: 72 72 6f 72 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  rror);...}..}...
20f0: 69 66 20 28 21 72 65 73 70 6f 6e 73 65 29 20 7b  if (!response) {
2100: 0a 09 09 72 65 73 70 6f 6e 73 65 20 3d 20 5b 63  ...response = [c
2110: 61 63 6b 65 79 53 53 48 41 67 65 6e 74 4d 65 73  ackeySSHAgentMes
2120: 73 61 67 65 2e 53 53 48 5f 41 47 45 4e 54 5f 46  sage.SSH_AGENT_F
2130: 41 49 4c 55 52 45 5d 3b 0a 09 7d 0a 0a 09 73 73  AILURE];..}...ss
2140: 68 52 65 73 70 6f 6e 73 65 20 3d 20 7b 0a 09 09  hResponse = {...
2150: 74 79 70 65 3a 20 22 61 75 74 68 2d 61 67 65 6e  type: "auth-agen
2160: 74 40 6f 70 65 6e 73 73 68 2e 63 6f 6d 22 2c 0a  t@openssh.com",.
2170: 09 09 64 61 74 61 3a 20 72 65 73 70 6f 6e 73 65  ..data: response
2180: 0a 09 7d 3b 0a 0a 09 69 66 20 28 67 6f 6f 67 2e  ..};...if (goog.
2190: 44 45 42 55 47 29 20 7b 0a 09 09 63 6f 6e 73 6f  DEBUG) {...conso
21a0: 6c 65 2e 6c 6f 67 28 22 5b 63 61 63 6b 65 79 53  le.log("[cackeyS
21b0: 53 48 5d 20 52 65 73 70 6f 6e 73 65 3a 20 22 2c  SH] Response: ",
21c0: 20 73 73 68 52 65 73 70 6f 6e 73 65 29 3b 0a 09   sshResponse);..
21d0: 7d 0a 0a 09 73 6f 63 6b 65 74 2e 70 6f 73 74 4d  }...socket.postM
21e0: 65 73 73 61 67 65 28 73 73 68 52 65 73 70 6f 6e  essage(sshRespon
21f0: 73 65 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  se);...return;.}
2200: 0a 0a 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65  ..function cacke
2210: 79 53 53 48 41 67 65 6e 74 41 63 63 65 70 74 43  ySSHAgentAcceptC
2220: 6f 6e 6e 65 63 74 69 6f 6e 28 73 6f 63 6b 65 74  onnection(socket
2230: 29 20 7b 0a 09 69 66 20 28 21 73 6f 63 6b 65 74  ) {..if (!socket
2240: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
2250: 0a 0a 09 2f 2a 0a 09 20 2a 20 4f 6e 6c 79 20 61  .../*.. * Only a
2260: 63 63 65 70 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  ccept connection
2270: 73 20 66 72 6f 6d 20 61 70 70 72 6f 76 65 64 20  s from approved 
2280: 61 70 70 73 0a 09 20 2a 2f 0a 09 69 66 20 28 21  apps.. */..if (!
2290: 73 6f 63 6b 65 74 2e 73 65 6e 64 65 72 20 7c 7c  socket.sender ||
22a0: 20 21 73 6f 63 6b 65 74 2e 73 65 6e 64 65 72 2e   !socket.sender.
22b0: 69 64 20 7c 7c 20 21 63 61 63 6b 65 79 53 53 48  id || !cackeySSH
22c0: 41 67 65 6e 74 41 70 70 72 6f 76 65 64 41 70 70  AgentApprovedApp
22d0: 73 2e 69 6e 63 6c 75 64 65 73 28 73 6f 63 6b 65  s.includes(socke
22e0: 74 2e 73 65 6e 64 65 72 2e 69 64 29 29 20 7b 0a  t.sender.id)) {.
22f0: 09 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 5b  ..console.log("[
2300: 63 61 63 6b 65 79 53 53 48 5d 20 44 69 73 63 6f  cackeySSH] Disco
2310: 6e 6e 65 63 74 69 6e 67 20 75 6e 61 70 70 72 6f  nnecting unappro
2320: 76 65 64 20 61 70 70 3a 20 22 2c 20 73 6f 63 6b  ved app: ", sock
2330: 65 74 2e 73 65 6e 64 65 72 29 3b 0a 0a 09 09 73  et.sender);....s
2340: 6f 63 6b 65 74 2e 64 69 73 63 6f 6e 6e 65 63 74  ocket.disconnect
2350: 28 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09  ();....return;..
2360: 7d 0a 0a 09 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28  }...console.log(
2370: 22 5b 63 61 63 6b 65 79 53 53 48 5d 20 41 63 63  "[cackeySSH] Acc
2380: 65 70 74 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  epted connection
2390: 20 66 72 6f 6d 3a 20 22 2c 20 73 6f 63 6b 65 74   from: ", socket
23a0: 2e 73 65 6e 64 65 72 2e 69 64 29 3b 0a 09 73 6f  .sender.id);..so
23b0: 63 6b 65 74 2e 6f 6e 4d 65 73 73 61 67 65 2e 61  cket.onMessage.a
23c0: 64 64 4c 69 73 74 65 6e 65 72 28 66 75 6e 63 74  ddListener(funct
23d0: 69 6f 6e 28 72 65 71 75 65 73 74 29 20 7b 0a 09  ion(request) {..
23e0: 09 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74 48  .cackeySSHAgentH
23f0: 61 6e 64 6c 65 4d 65 73 73 61 67 65 28 73 6f 63  andleMessage(soc
2400: 6b 65 74 2c 20 72 65 71 75 65 73 74 29 3b 0a 09  ket, request);..
2410: 7d 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  });.}..function 
2420: 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74 49 6e  cackeySSHAgentIn
2430: 69 74 28 29 20 7b 0a 09 63 68 72 6f 6d 65 2e 72  it() {..chrome.r
2440: 75 6e 74 69 6d 65 2e 6f 6e 43 6f 6e 6e 65 63 74  untime.onConnect
2450: 45 78 74 65 72 6e 61 6c 2e 61 64 64 4c 69 73 74  External.addList
2460: 65 6e 65 72 28 63 61 63 6b 65 79 53 53 48 41 67  ener(cackeySSHAg
2470: 65 6e 74 41 63 63 65 70 74 43 6f 6e 6e 65 63 74  entAcceptConnect
2480: 69 6f 6e 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  ion);.}..functio
2490: 6e 20 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74  n cackeySSHAgent
24a0: 55 6e 69 6e 69 74 28 29 20 7b 0a 09 63 68 72 6f  Uninit() {..chro
24b0: 6d 65 2e 72 75 6e 74 69 6d 65 2e 6f 6e 43 6f 6e  me.runtime.onCon
24c0: 6e 65 63 74 45 78 74 65 72 6e 61 6c 2e 72 65 6d  nectExternal.rem
24d0: 6f 76 65 4c 69 73 74 65 6e 65 72 28 63 61 63 6b  oveListener(cack
24e0: 65 79 53 53 48 41 67 65 6e 74 41 63 63 65 70 74  eySSHAgentAccept
24f0: 43 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 7d 0a 0a  Connection);.}..
2500: 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74 43 6f  cackeySSHAgentCo
2510: 6d 6d 61 6e 64 73 20 3d 20 5b 0a 09 7b 20 2f 2a  mmands = [..{ /*
2520: 20 30 3a 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e   0: Not implemen
2530: 74 65 64 20 2a 2f 20 7d 2c 0a 09 7b 20 2f 2a 20  ted */ },..{ /* 
2540: 31 3a 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  1: Not implement
2550: 65 64 20 2a 2f 20 7d 2c 0a 09 7b 20 2f 2a 20 32  ed */ },..{ /* 2
2560: 3a 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65  : Not implemente
2570: 64 20 2a 2f 20 7d 2c 0a 09 7b 20 2f 2a 20 33 3a  d */ },..{ /* 3:
2580: 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
2590: 20 2a 2f 20 7d 2c 0a 09 7b 20 2f 2a 20 34 3a 20   */ },..{ /* 4: 
25a0: 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  Not implemented 
25b0: 2a 2f 20 7d 2c 0a 09 7b 20 2f 2a 20 35 3a 20 4e  */ },..{ /* 5: N
25c0: 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a  ot implemented *
25d0: 2f 20 7d 2c 0a 09 7b 20 2f 2a 20 36 3a 20 4e 6f  / },..{ /* 6: No
25e0: 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f  t implemented */
25f0: 20 7d 2c 0a 09 7b 20 2f 2a 20 37 3a 20 4e 6f 74   },..{ /* 7: Not
2600: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 20   implemented */ 
2610: 7d 2c 0a 09 7b 20 2f 2a 20 38 3a 20 4e 6f 74 20  },..{ /* 8: Not 
2620: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d  implemented */ }
2630: 2c 0a 09 7b 20 2f 2a 20 39 3a 20 4e 6f 74 20 69  ,..{ /* 9: Not i
2640: 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c  mplemented */ },
2650: 0a 09 7b 20 2f 2a 20 31 30 3a 20 4e 6f 74 20 69  ..{ /* 10: Not i
2660: 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c  mplemented */ },
2670: 0a 09 7b 0a 09 09 6e 61 6d 65 3a 20 22 72 65 71  ..{...name: "req
2680: 75 65 73 74 49 64 65 6e 74 69 74 69 65 73 22 2c  uestIdentities",
2690: 0a 09 09 68 61 6e 64 6c 65 72 3a 20 63 61 63 6b  ...handler: cack
26a0: 65 79 53 53 48 41 67 65 6e 74 43 6f 6d 6d 61 6e  eySSHAgentComman
26b0: 64 52 65 71 75 65 73 74 49 64 65 6e 74 69 74 79  dRequestIdentity
26c0: 0a 09 7d 2c 0a 09 7b 20 2f 2a 20 31 32 3a 20 4e  ..},..{ /* 12: N
26d0: 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a  ot implemented *
26e0: 2f 20 7d 2c 0a 09 7b 0a 09 09 6e 61 6d 65 3a 20  / },..{...name: 
26f0: 22 73 69 67 6e 52 65 71 75 65 73 74 22 2c 0a 09  "signRequest",..
2700: 09 68 61 6e 64 6c 65 72 3a 20 63 61 63 6b 65 79  .handler: cackey
2710: 53 53 48 41 67 65 6e 74 43 6f 6d 6d 61 6e 64 53  SSHAgentCommandS
2720: 69 67 6e 52 65 71 75 65 73 74 0a 09 7d 2c 0a 09  ignRequest..},..
2730: 7b 20 2f 2a 20 31 34 3a 20 4e 6f 74 20 69 6d 70  { /* 14: Not imp
2740: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
2750: 7b 20 2f 2a 20 31 35 3a 20 4e 6f 74 20 69 6d 70  { /* 15: Not imp
2760: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
2770: 7b 20 2f 2a 20 31 36 3a 20 4e 6f 74 20 69 6d 70  { /* 16: Not imp
2780: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
2790: 7b 20 2f 2a 20 31 37 3a 20 4e 6f 74 20 69 6d 70  { /* 17: Not imp
27a0: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
27b0: 7b 20 2f 2a 20 31 38 3a 20 4e 6f 74 20 69 6d 70  { /* 18: Not imp
27c0: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
27d0: 7b 20 2f 2a 20 31 39 3a 20 4e 6f 74 20 69 6d 70  { /* 19: Not imp
27e0: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
27f0: 7b 20 2f 2a 20 32 30 3a 20 4e 6f 74 20 69 6d 70  { /* 20: Not imp
2800: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
2810: 7b 20 2f 2a 20 32 31 3a 20 4e 6f 74 20 69 6d 70  { /* 21: Not imp
2820: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
2830: 7b 20 2f 2a 20 32 32 3a 20 4e 6f 74 20 69 6d 70  { /* 22: Not imp
2840: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
2850: 7b 20 2f 2a 20 32 33 3a 20 4e 6f 74 20 69 6d 70  { /* 23: Not imp
2860: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
2870: 7b 20 2f 2a 20 32 34 3a 20 4e 6f 74 20 69 6d 70  { /* 24: Not imp
2880: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
2890: 7b 20 2f 2a 20 32 35 3a 20 4e 6f 74 20 69 6d 70  { /* 25: Not imp
28a0: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
28b0: 7b 20 2f 2a 20 32 36 3a 20 4e 6f 74 20 69 6d 70  { /* 26: Not imp
28c0: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
28d0: 7b 20 2f 2a 20 32 37 3a 20 4e 6f 74 20 69 6d 70  { /* 27: Not imp
28e0: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 2c 0a 09  lemented */ },..
28f0: 7b 20 2f 2a 20 32 38 3a 20 4e 6f 74 20 69 6d 70  { /* 28: Not imp
2900: 6c 65 6d 65 6e 74 65 64 20 2a 2f 20 7d 0a 5d 3b  lemented */ }.];
2910: 0a 0a 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74  ..cackeySSHAgent
2920: 4d 65 73 73 61 67 65 20 3d 20 7b 0a 09 53 53 48  Message = {..SSH
2930: 5f 41 47 45 4e 54 5f 46 41 49 4c 55 52 45 3a 20  _AGENT_FAILURE: 
2940: 35 2c 0a 09 53 53 48 5f 41 47 45 4e 54 5f 53 55  5,..SSH_AGENT_SU
2950: 43 43 45 53 53 3a 20 36 2c 0a 09 53 53 48 5f 41  CCESS: 6,..SSH_A
2960: 47 45 4e 54 5f 45 58 54 45 4e 53 49 4f 4e 5f 46  GENT_EXTENSION_F
2970: 41 49 4c 55 52 45 3a 20 32 38 2c 0a 09 53 53 48  AILURE: 28,..SSH
2980: 5f 41 47 45 4e 54 5f 49 44 45 4e 54 49 54 49 45  _AGENT_IDENTITIE
2990: 53 5f 41 4e 53 57 45 52 3a 20 31 32 2c 0a 09 53  S_ANSWER: 12,..S
29a0: 53 48 5f 41 47 45 4e 54 5f 53 49 47 4e 5f 52 45  SH_AGENT_SIGN_RE
29b0: 53 50 4f 4e 53 45 3a 20 31 34 0a 7d 3b 0a 0a 63  SPONSE: 14.};..c
29c0: 61 63 6b 65 79 53 53 48 41 67 65 6e 74 49 6e 69  ackeySSHAgentIni
29d0: 74 28 29 3b 0a                                   t();.