Hex Artifact Content

Artifact 3e65cda43f7f82e192a1de05538d623dff0ae2a3:


0000: 23 21 20 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20  #! /usr/bin/env 
0010: 74 63 6c 73 68 0a 0a 69 66 20 7b 5b 69 6e 66 6f  tclsh..if {[info
0020: 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 53 53   exists ::env(SS
0030: 48 5f 41 47 45 4e 54 5f 4c 49 42 5f 50 41 54 48  H_AGENT_LIB_PATH
0040: 29 5d 7d 20 7b 0a 09 6c 61 70 70 65 6e 64 20 61  )]} {..lappend a
0050: 75 74 6f 5f 70 61 74 68 20 7b 2a 7d 24 3a 3a 65  uto_path {*}$::e
0060: 6e 76 28 53 53 48 5f 41 47 45 4e 54 5f 4c 49 42  nv(SSH_AGENT_LIB
0070: 5f 50 41 54 48 29 0a 7d 0a 0a 69 66 20 7b 5b 69  _PATH).}..if {[i
0080: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76  nfo exists ::env
0090: 28 53 53 48 5f 41 47 45 4e 54 5f 50 4b 43 53 31  (SSH_AGENT_PKCS1
00a0: 31 5f 4d 4f 44 55 4c 45 29 5d 7d 20 7b 0a 09 73  1_MODULE)]} {..s
00b0: 65 74 20 3a 3a 70 6b 63 73 31 31 4d 6f 64 75 6c  et ::pkcs11Modul
00c0: 65 46 69 6c 65 6e 61 6d 65 20 24 3a 3a 65 6e 76  eFilename $::env
00d0: 28 53 53 48 5f 41 47 45 4e 54 5f 50 4b 43 53 31  (SSH_AGENT_PKCS1
00e0: 31 5f 4d 4f 44 55 4c 45 29 0a 7d 20 65 6c 73 65  1_MODULE).} else
00f0: 20 7b 0a 09 73 65 74 20 3a 3a 70 6b 63 73 31 31   {..set ::pkcs11
0100: 4d 6f 64 75 6c 65 46 69 6c 65 6e 61 6d 65 20 2f  ModuleFilename /
0110: 68 6f 6d 65 2f 72 6b 65 65 6e 65 2f 74 6d 70 2f  home/rkeene/tmp/
0120: 63 61 63 6b 65 79 2f 62 75 69 6c 64 2f 74 63 6c  cackey/build/tcl
0130: 2f 73 6f 66 74 6f 6b 6e 33 2d 70 6b 63 73 31 31  /softokn3-pkcs11
0140: 2e 73 6f 0a 7d 0a 0a 70 61 63 6b 61 67 65 20 72  .so.}..package r
0150: 65 71 75 69 72 65 20 64 75 6b 74 61 70 65 20 30  equire duktape 0
0160: 2e 37 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69  .7.package requi
0170: 72 65 20 74 75 61 70 69 0a 70 61 63 6b 61 67 65  re tuapi.package
0180: 20 72 65 71 75 69 72 65 20 70 6b 69 20 30 2e 36   require pki 0.6
0190: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  .package require
01a0: 20 70 6b 69 3a 3a 70 6b 63 73 31 31 20 30 2e 39   pki::pkcs11 0.9
01b0: 2e 39 0a 0a 23 23 20 48 41 43 4b 3a 20 46 69 78  .9..## HACK: Fix
01c0: 20 75 70 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   up older versio
01d0: 6e 73 20 6f 66 20 22 70 6b 69 22 20 74 6f 20 69  ns of "pki" to i
01e0: 6e 63 6c 75 64 65 20 74 68 65 20 72 61 77 20 63  nclude the raw c
01f0: 65 72 74 69 66 69 63 61 74 65 0a 23 23 20 20 20  ertificate.##   
0200: 20 20 20 20 74 68 69 73 20 69 73 20 6e 65 65 64      this is need
0210: 65 64 0a 61 70 70 6c 79 20 7b 7b 7d 20 7b 0a 09  ed.apply {{} {..
0220: 73 65 74 20 70 72 6f 63 54 6f 55 70 64 61 74 65  set procToUpdate
0230: 20 3a 3a 70 6b 69 3a 3a 78 35 30 39 3a 3a 70 61   ::pki::x509::pa
0240: 72 73 65 5f 63 65 72 74 0a 09 69 66 20 7b 21 5b  rse_cert..if {![
0250: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 22 2a 73  string match "*s
0260: 65 74 20 72 65 74 28 72 61 77 29 2a 22 20 5b 69  et ret(raw)*" [i
0270: 6e 66 6f 20 62 6f 64 79 20 24 70 72 6f 63 54 6f  nfo body $procTo
0280: 55 70 64 61 74 65 5d 5d 7d 20 7b 0a 09 09 73 65  Update]]} {...se
0290: 74 20 62 6f 64 79 20 5b 69 6e 66 6f 20 62 6f 64  t body [info bod
02a0: 79 20 24 70 72 6f 63 54 6f 55 70 64 61 74 65 5d  y $procToUpdate]
02b0: 0a 09 09 73 65 74 20 62 6f 64 79 20 5b 73 74 72  ...set body [str
02c0: 69 6e 67 20 6d 61 70 20 7b 0a 09 09 09 22 3a 3a  ing map {...."::
02d0: 61 73 6e 3a 3a 61 73 6e 47 65 74 53 65 71 75 65  asn::asnGetSeque
02e0: 6e 63 65 20 63 65 72 74 5f 73 65 71 20 77 68 6f  nce cert_seq who
02f0: 6c 65 74 68 69 6e 67 22 0a 09 09 09 22 73 65 74  lething"...."set
0300: 20 72 65 74 28 72 61 77 29 20 24 63 65 72 74 5f   ret(raw) $cert_
0310: 73 65 71 3b 20 62 69 6e 61 72 79 20 73 63 61 6e  seq; binary scan
0320: 20 24 72 65 74 28 72 61 77 29 20 48 2a 20 72 65   $ret(raw) H* re
0330: 74 28 72 61 77 29 3b 20 3a 3a 61 73 6e 3a 3a 61  t(raw); ::asn::a
0340: 73 6e 47 65 74 53 65 71 75 65 6e 63 65 20 63 65  snGetSequence ce
0350: 72 74 5f 73 65 71 20 77 68 6f 6c 65 74 68 69 6e  rt_seq wholethin
0360: 67 22 0a 09 09 7d 20 24 62 6f 64 79 5d 0a 09 09  g"...} $body]...
0370: 70 72 6f 63 20 24 70 72 6f 63 54 6f 55 70 64 61  proc $procToUpda
0380: 74 65 20 5b 69 6e 66 6f 20 61 72 67 73 20 24 70  te [info args $p
0390: 72 6f 63 54 6f 55 70 64 61 74 65 5d 20 24 62 6f  rocToUpdate] $bo
03a0: 64 79 0a 09 7d 0a 7d 7d 0a 0a 70 72 6f 63 20 70  dy..}.}}..proc p
03b0: 6b 63 73 31 31 4d 6f 64 75 6c 65 48 61 6e 64 6c  kcs11ModuleHandl
03c0: 65 20 7b 7d 20 7b 0a 09 69 66 20 7b 21 5b 69 6e  e {} {..if {![in
03d0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 70 6b 63 73  fo exists ::pkcs
03e0: 31 31 4d 6f 64 75 6c 65 48 61 6e 64 6c 65 5d 7d  11ModuleHandle]}
03f0: 20 7b 0a 09 09 73 65 74 20 3a 3a 70 6b 63 73 31   {...set ::pkcs1
0400: 31 4d 6f 64 75 6c 65 48 61 6e 64 6c 65 20 5b 3a  1ModuleHandle [:
0410: 3a 70 6b 69 3a 3a 70 6b 63 73 31 31 3a 3a 6c 6f  :pki::pkcs11::lo
0420: 61 64 6d 6f 64 75 6c 65 20 24 3a 3a 70 6b 63 73  admodule $::pkcs
0430: 31 31 4d 6f 64 75 6c 65 46 69 6c 65 6e 61 6d 65  11ModuleFilename
0440: 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24 3a 3a  ]..}..return $::
0450: 70 6b 63 73 31 31 4d 6f 64 75 6c 65 48 61 6e 64  pkcs11ModuleHand
0460: 6c 65 0a 7d 0a 0a 70 72 6f 63 20 70 6b 63 73 31  le.}..proc pkcs1
0470: 31 4d 6f 64 75 6c 65 55 6e 6c 6f 61 64 20 7b 68  1ModuleUnload {h
0480: 61 6e 64 6c 65 7d 20 7b 0a 09 69 66 20 7b 5b 69  andle} {..if {[i
0490: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 70 6b 63  nfo exists ::pkc
04a0: 73 31 31 4d 6f 64 75 6c 65 48 61 6e 64 6c 65 5d  s11ModuleHandle]
04b0: 20 26 26 20 24 68 61 6e 64 6c 65 20 65 71 20 24   && $handle eq $
04c0: 3a 3a 70 6b 63 73 31 31 4d 6f 64 75 6c 65 48 61  ::pkcs11ModuleHa
04d0: 6e 64 6c 65 7d 20 7b 0a 09 09 75 6e 73 65 74 20  ndle} {...unset 
04e0: 3a 3a 70 6b 63 73 31 31 4d 6f 64 75 6c 65 48 61  ::pkcs11ModuleHa
04f0: 6e 64 6c 65 0a 09 7d 0a 09 3a 3a 70 6b 69 3a 3a  ndle..}..::pki::
0500: 70 6b 63 73 31 31 3a 3a 75 6e 6c 6f 61 64 6d 6f  pkcs11::unloadmo
0510: 64 75 6c 65 20 24 68 61 6e 64 6c 65 0a 7d 0a 0a  dule $handle.}..
0520: 70 72 6f 63 20 61 64 64 52 53 41 54 6f 4a 53 20  proc addRSAToJS 
0530: 7b 6a 73 48 61 6e 64 6c 65 7d 20 7b 0a 09 3a 3a  {jsHandle} {..::
0540: 64 75 6b 74 61 70 65 3a 3a 74 63 6c 2d 66 75 6e  duktape::tcl-fun
0550: 63 74 69 6f 6e 20 24 6a 73 48 61 6e 64 6c 65 20  ction $jsHandle 
0560: 5f 5f 70 61 72 73 65 43 65 72 74 20 6a 73 6f 6e  __parseCert json
0570: 20 7b 63 65 72 74 7d 20 7b 0a 09 09 73 65 74 20   {cert} {...set 
0580: 63 65 72 74 20 5b 62 69 6e 61 72 79 20 64 65 63  cert [binary dec
0590: 6f 64 65 20 68 65 78 20 24 63 65 72 74 5d 0a 09  ode hex $cert]..
05a0: 09 69 66 20 7b 5b 63 61 74 63 68 20 7b 0a 09 09  .if {[catch {...
05b0: 09 73 65 74 20 63 65 72 74 20 5b 3a 3a 70 6b 69  .set cert [::pki
05c0: 3a 3a 78 35 30 39 3a 3a 70 61 72 73 65 5f 63 65  ::x509::parse_ce
05d0: 72 74 20 24 63 65 72 74 5d 0a 09 09 7d 5d 7d 20  rt $cert]...}]} 
05e0: 7b 0a 09 09 09 72 65 74 75 72 6e 20 22 22 0a 09  {....return ""..
05f0: 09 7d 0a 0a 09 09 73 65 74 20 65 20 5b 66 6f 72  .}....set e [for
0600: 6d 61 74 20 25 6c 6c 78 20 5b 64 69 63 74 20 67  mat %llx [dict g
0610: 65 74 20 24 63 65 72 74 20 65 5d 5d 0a 09 09 73  et $cert e]]...s
0620: 65 74 20 6e 20 5b 66 6f 72 6d 61 74 20 25 6c 6c  et n [format %ll
0630: 78 20 5b 64 69 63 74 20 67 65 74 20 24 63 65 72  x [dict get $cer
0640: 74 20 6e 5d 5d 0a 09 09 69 66 20 7b 5b 73 74 72  t n]]...if {[str
0650: 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 5d 20 25  ing length $e] %
0660: 20 32 20 21 3d 20 30 7d 20 7b 0a 09 09 09 73 65   2 != 0} {....se
0670: 74 20 65 20 22 30 24 65 22 0a 09 09 7d 0a 09 09  t e "0$e"...}...
0680: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
0690: 74 68 20 24 6e 5d 20 25 20 32 20 21 3d 20 30 7d  th $n] % 2 != 0}
06a0: 20 7b 0a 09 09 09 73 65 74 20 6e 20 22 30 24 6e   {....set n "0$n
06b0: 22 0a 09 09 7d 0a 09 09 69 66 20 7b 5b 73 74 72  "...}...if {[str
06c0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 5d 20 25  ing length $n] %
06d0: 20 34 20 3d 3d 20 30 7d 20 7b 0a 09 09 09 73 65   4 == 0} {....se
06e0: 74 20 6e 20 22 30 30 24 6e 22 0a 09 09 7d 0a 0a  t n "00$n"...}..
06f0: 09 09 73 65 74 20 72 65 74 76 61 6c 20 22 5c 7b  ..set retval "\{
0700: 0a 09 09 09 5c 22 70 75 62 6c 69 63 4b 65 79 5c  ....\"publicKey\
0710: 22 3a 20 5c 7b 0a 09 09 09 09 5c 22 74 79 70 65  ": \{.....\"type
0720: 5c 22 3a 5c 22 5b 73 74 72 69 6e 67 20 74 6f 75  \":\"[string tou
0730: 70 70 65 72 20 5b 64 69 63 74 20 67 65 74 20 24  pper [dict get $
0740: 63 65 72 74 20 74 79 70 65 5d 5d 5c 22 2c 0a 09  cert type]]\",..
0750: 09 09 09 5c 22 65 5c 22 3a 5c 22 24 65 5c 22 2c  ...\"e\":\"$e\",
0760: 0a 09 09 09 09 5c 22 6e 5c 22 3a 5c 22 24 6e 5c  .....\"n\":\"$n\
0770: 22 0a 09 09 09 5c 7d 2c 0a 09 09 09 5c 22 73 75  "....\},....\"su
0780: 62 6a 65 63 74 5c 22 3a 20 5c 22 5b 64 69 63 74  bject\": \"[dict
0790: 20 67 65 74 20 24 63 65 72 74 20 73 75 62 6a 65   get $cert subje
07a0: 63 74 5d 5c 22 2c 0a 09 09 09 5c 22 69 73 73 75  ct]\",....\"issu
07b0: 65 72 5c 22 3a 20 5c 22 5b 64 69 63 74 20 67 65  er\": \"[dict ge
07c0: 74 20 24 63 65 72 74 20 69 73 73 75 65 72 5d 5c  t $cert issuer]\
07d0: 22 2c 0a 09 09 09 5c 22 73 65 72 69 61 6c 5c 22  ",....\"serial\"
07e0: 3a 20 5c 22 5b 64 69 63 74 20 67 65 74 20 24 63  : \"[dict get $c
07f0: 65 72 74 20 73 65 72 69 61 6c 5f 6e 75 6d 62 65  ert serial_numbe
0800: 72 5d 5c 22 0a 09 09 5c 7d 22 0a 0a 09 09 72 65  r]\"...\}"....re
0810: 74 75 72 6e 20 24 72 65 74 76 61 6c 0a 09 7d 0a  turn $retval..}.
0820: 0a 09 3a 3a 64 75 6b 74 61 70 65 3a 3a 74 63 6c  ..::duktape::tcl
0830: 2d 66 75 6e 63 74 69 6f 6e 20 24 6a 73 48 61 6e  -function $jsHan
0840: 64 6c 65 20 5f 5f 63 72 79 70 74 6f 5f 73 75 62  dle __crypto_sub
0850: 74 6c 65 5f 64 69 67 65 73 74 20 62 79 74 65 61  tle_digest bytea
0860: 72 72 61 79 20 7b 68 61 73 68 20 64 61 74 61 7d  rray {hash data}
0870: 20 7b 0a 09 09 73 77 69 74 63 68 20 2d 65 78 61   {...switch -exa
0880: 63 74 20 2d 2d 20 24 68 61 73 68 20 7b 0a 09 09  ct -- $hash {...
0890: 09 22 53 48 41 2d 32 35 36 22 20 7b 0a 09 09 09  ."SHA-256" {....
08a0: 09 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  .package require
08b0: 20 73 68 61 32 35 36 0a 09 09 09 09 72 65 74 75   sha256.....retu
08c0: 72 6e 20 5b 3a 3a 73 68 61 32 3a 3a 73 68 61 32  rn [::sha2::sha2
08d0: 35 36 20 2d 2d 20 24 64 61 74 61 5d 0a 09 09 09  56 -- $data]....
08e0: 7d 0a 09 09 09 22 53 48 41 2d 31 22 20 7b 0a 09  }...."SHA-1" {..
08f0: 09 09 09 70 61 63 6b 61 67 65 20 72 65 71 75 69  ...package requi
0900: 72 65 20 73 68 61 31 0a 09 09 09 09 72 65 74 75  re sha1.....retu
0910: 72 6e 20 5b 3a 3a 73 68 61 31 3a 3a 73 68 61 31  rn [::sha1::sha1
0920: 20 2d 2d 20 24 64 61 74 61 5d 0a 09 09 09 7d 0a   -- $data]....}.
0930: 09 09 09 64 65 66 61 75 6c 74 20 7b 0a 09 09 09  ...default {....
0940: 09 65 72 72 6f 72 20 22 48 61 73 68 20 6e 6f 74  .error "Hash not
0950: 20 73 75 70 70 6f 72 74 65 64 3a 20 24 68 61 73   supported: $has
0960: 68 22 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a  h"....}...}..}..
0970: 09 3a 3a 64 75 6b 74 61 70 65 3a 3a 65 76 61 6c  .::duktape::eval
0980: 20 24 6a 73 48 61 6e 64 6c 65 20 7b 0a 09 09 63   $jsHandle {...c
0990: 72 79 70 74 6f 2e 73 75 62 74 6c 65 2e 64 69 67  rypto.subtle.dig
09a0: 65 73 74 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 5f  est.internal = _
09b0: 5f 63 72 79 70 74 6f 5f 73 75 62 74 6c 65 5f 64  _crypto_subtle_d
09c0: 69 67 65 73 74 3b 0a 09 09 64 65 6c 65 74 65 20  igest;...delete 
09d0: 5f 5f 63 72 79 70 74 6f 5f 73 75 62 74 6c 65 5f  __crypto_subtle_
09e0: 64 69 67 65 73 74 3b 0a 09 7d 0a 0a 09 3a 3a 64  digest;..}...::d
09f0: 75 6b 74 61 70 65 3a 3a 65 76 61 6c 20 24 6a 73  uktape::eval $js
0a00: 48 61 6e 64 6c 65 20 7b 0a 09 09 66 75 6e 63 74  Handle {...funct
0a10: 69 6f 6e 20 58 35 30 39 28 29 20 7b 0a 09 09 09  ion X509() {....
0a20: 74 68 69 73 2e 68 65 78 20 3d 20 22 22 3b 0a 09  this.hex = "";..
0a30: 09 09 74 68 69 73 2e 72 65 61 64 43 65 72 74 48  ..this.readCertH
0a40: 65 78 20 3d 20 66 75 6e 63 74 69 6f 6e 28 73 74  ex = function(st
0a50: 72 69 6e 67 29 20 7b 0a 09 09 09 09 74 68 69 73  ring) {.....this
0a60: 2e 68 65 78 20 3d 20 73 74 72 69 6e 67 3b 0a 09  .hex = string;..
0a70: 09 09 7d 3b 0a 09 09 09 74 68 69 73 2e 63 6f 6d  ..};....this.com
0a80: 70 75 74 65 43 65 72 74 44 61 74 61 20 3d 20 66  puteCertData = f
0a90: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 09 09 09 09  unction() {.....
0aa0: 69 66 20 28 74 68 69 73 2e 63 65 72 74 44 61 74  if (this.certDat
0ab0: 61 29 20 7b 0a 09 09 09 09 09 72 65 74 75 72 6e  a) {......return
0ac0: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 74 68 69 73  ;.....}.....this
0ad0: 2e 63 65 72 74 44 61 74 61 20 3d 20 58 35 30 39  .certData = X509
0ae0: 2e 70 61 72 73 65 43 65 72 74 28 74 68 69 73 2e  .parseCert(this.
0af0: 68 65 78 29 3b 0a 09 09 09 09 74 68 69 73 2e 63  hex);.....this.c
0b00: 65 72 74 44 61 74 61 2e 70 75 62 6c 69 63 4b 65  ertData.publicKe
0b10: 79 2e 6e 20 3d 20 44 75 6b 74 61 70 65 2e 64 65  y.n = Duktape.de
0b20: 63 28 27 68 65 78 27 2c 20 74 68 69 73 2e 63 65  c('hex', this.ce
0b30: 72 74 44 61 74 61 2e 70 75 62 6c 69 63 4b 65 79  rtData.publicKey
0b40: 2e 6e 29 3b 0a 09 09 09 09 74 68 69 73 2e 63 65  .n);.....this.ce
0b50: 72 74 44 61 74 61 2e 70 75 62 6c 69 63 4b 65 79  rtData.publicKey
0b60: 2e 65 20 3d 20 44 75 6b 74 61 70 65 2e 64 65 63  .e = Duktape.dec
0b70: 28 27 68 65 78 27 2c 20 74 68 69 73 2e 63 65 72  ('hex', this.cer
0b80: 74 44 61 74 61 2e 70 75 62 6c 69 63 4b 65 79 2e  tData.publicKey.
0b90: 65 29 3b 0a 09 09 09 7d 0a 09 09 09 74 68 69 73  e);....}....this
0ba0: 2e 67 65 74 50 75 62 6c 69 63 4b 65 79 20 3d 20  .getPublicKey = 
0bb0: 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 09 09 09  function() {....
0bc0: 09 74 68 69 73 2e 63 6f 6d 70 75 74 65 43 65 72  .this.computeCer
0bd0: 74 44 61 74 61 28 29 3b 0a 09 09 09 09 72 65 74  tData();.....ret
0be0: 75 72 6e 28 74 68 69 73 2e 63 65 72 74 44 61 74  urn(this.certDat
0bf0: 61 2e 70 75 62 6c 69 63 4b 65 79 29 3b 0a 09 09  a.publicKey);...
0c00: 09 7d 3b 0a 09 09 09 74 68 69 73 2e 67 65 74 53  .};....this.getS
0c10: 75 62 6a 65 63 74 53 74 72 69 6e 67 20 3d 20 66  ubjectString = f
0c20: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 09 09 09 09  unction() {.....
0c30: 74 68 69 73 2e 63 6f 6d 70 75 74 65 43 65 72 74  this.computeCert
0c40: 44 61 74 61 28 29 3b 0a 09 09 09 09 72 65 74 75  Data();.....retu
0c50: 72 6e 28 74 68 69 73 2e 63 65 72 74 44 61 74 61  rn(this.certData
0c60: 2e 73 75 62 6a 65 63 74 29 3b 0a 09 09 09 7d 3b  .subject);....};
0c70: 0a 09 09 09 74 68 69 73 2e 67 65 74 45 78 74 53  ....this.getExtS
0c80: 75 62 6a 65 63 74 41 6c 74 4e 61 6d 65 32 20 3d  ubjectAltName2 =
0c90: 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 09 09   function() {...
0ca0: 09 09 72 65 74 75 72 6e 28 5b 5d 29 3b 0a 09 09  ..return([]);...
0cb0: 09 7d 0a 09 09 7d 0a 09 09 58 35 30 39 2e 70 61  .}...}...X509.pa
0cc0: 72 73 65 43 65 72 74 20 3d 20 5f 5f 70 61 72 73  rseCert = __pars
0cd0: 65 43 65 72 74 3b 0a 09 09 64 65 6c 65 74 65 20  eCert;...delete 
0ce0: 5f 5f 70 61 72 73 65 43 65 72 74 3b 0a 09 7d 0a  __parseCert;..}.
0cf0: 7d 0a 0a 70 72 6f 63 20 72 65 61 64 46 69 6c 65  }..proc readFile
0d00: 20 7b 66 69 6c 65 4e 61 6d 65 7d 20 7b 0a 09 69   {fileName} {..i
0d10: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
0d20: 20 3a 3a 72 65 61 64 46 69 6c 65 28 24 66 69 6c   ::readFile($fil
0d30: 65 4e 61 6d 65 29 5d 7d 20 7b 0a 09 09 63 61 74  eName)]} {...cat
0d40: 63 68 20 7b 0a 09 09 09 73 65 74 20 66 64 20 5b  ch {....set fd [
0d50: 6f 70 65 6e 20 24 66 69 6c 65 4e 61 6d 65 5d 0a  open $fileName].
0d60: 09 09 09 73 65 74 20 3a 3a 72 65 61 64 46 69 6c  ...set ::readFil
0d70: 65 28 24 66 69 6c 65 4e 61 6d 65 29 20 5b 72 65  e($fileName) [re
0d80: 61 64 20 24 66 64 5d 0a 09 09 7d 0a 09 09 63 61  ad $fd]...}...ca
0d90: 74 63 68 20 7b 0a 09 09 09 63 6c 6f 73 65 20 24  tch {....close $
0da0: 66 64 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75  fd...}..}...retu
0db0: 72 6e 20 24 3a 3a 72 65 61 64 46 69 6c 65 28 24  rn $::readFile($
0dc0: 66 69 6c 65 4e 61 6d 65 29 0a 7d 0a 0a 70 72 6f  fileName).}..pro
0dd0: 63 20 69 6e 69 74 53 53 48 41 67 65 6e 74 20 7b  c initSSHAgent {
0de0: 7d 20 7b 0a 09 73 65 74 20 6a 73 48 61 6e 64 6c  } {..set jsHandl
0df0: 65 20 5b 3a 3a 64 75 6b 74 61 70 65 3a 3a 69 6e  e [::duktape::in
0e00: 69 74 20 2d 73 61 66 65 20 74 72 75 65 5d 0a 0a  it -safe true]..
0e10: 09 3a 3a 64 75 6b 74 61 70 65 3a 3a 74 63 6c 2d  .::duktape::tcl-
0e20: 66 75 6e 63 74 69 6f 6e 20 24 6a 73 48 61 6e 64  function $jsHand
0e30: 6c 65 20 5f 5f 70 75 74 73 20 7b 61 72 67 73 7d  le __puts {args}
0e40: 20 7b 0a 09 09 69 66 20 7b 5b 6c 6c 65 6e 67 74   {...if {[llengt
0e50: 68 20 24 61 72 67 73 5d 20 6e 69 20 7b 31 20 32  h $args] ni {1 2
0e60: 7d 7d 20 7b 0a 09 09 09 72 65 74 75 72 6e 20 2d  }} {....return -
0e70: 63 6f 64 65 20 65 72 72 6f 72 20 22 77 72 6f 6e  code error "wron
0e80: 67 20 23 20 61 72 67 73 3a 20 70 75 74 73 20 3f  g # args: puts ?
0e90: 7b 73 74 64 65 72 72 7c 73 74 64 6f 75 74 7d 3f  {stderr|stdout}?
0ea0: 20 6d 65 73 73 61 67 65 22 0a 09 09 7d 0a 09 09   message"...}...
0eb0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72  if {[llength $ar
0ec0: 67 73 5d 20 3d 3d 20 32 7d 20 7b 0a 09 09 09 73  gs] == 2} {....s
0ed0: 65 74 20 63 68 61 6e 20 5b 6c 69 6e 64 65 78 20  et chan [lindex 
0ee0: 24 61 72 67 73 20 30 5d 0a 09 09 09 69 66 20 7b  $args 0]....if {
0ef0: 24 63 68 61 6e 20 6e 69 20 7b 73 74 64 6f 75 74  $chan ni {stdout
0f00: 20 73 74 64 65 72 72 7d 7d 20 7b 0a 09 09 09 09   stderr}} {.....
0f10: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
0f20: 6f 72 20 22 4f 6e 6c 79 20 73 74 64 65 72 72 20  or "Only stderr 
0f30: 61 6e 64 20 73 74 64 6f 75 74 20 61 6c 6c 6f 77  and stdout allow
0f40: 65 64 22 0a 09 09 09 7d 0a 09 09 7d 0a 09 09 70  ed"....}...}...p
0f50: 75 74 73 20 7b 2a 7d 24 61 72 67 73 0a 09 7d 0a  uts {*}$args..}.
0f60: 0a 09 3a 3a 64 75 6b 74 61 70 65 3a 3a 65 76 61  ..::duktape::eva
0f70: 6c 20 24 6a 73 48 61 6e 64 6c 65 20 7b 0a 09 09  l $jsHandle {...
0f80: 72 75 6e 74 69 6d 65 20 3d 20 7b 7d 3b 0a 09 09  runtime = {};...
0f90: 72 75 6e 74 69 6d 65 2e 70 75 74 73 20 3d 20 5f  runtime.puts = _
0fa0: 5f 70 75 74 73 3b 0a 09 09 72 75 6e 74 69 6d 65  _puts;...runtime
0fb0: 2e 73 74 64 65 72 72 20 3d 20 22 73 74 64 65 72  .stderr = "stder
0fc0: 72 22 3b 0a 09 09 64 65 6c 65 74 65 20 5f 5f 70  r";...delete __p
0fd0: 75 74 73 3b 0a 09 7d 0a 0a 09 3a 3a 64 75 6b 74  uts;..}...::dukt
0fe0: 61 70 65 3a 3a 65 76 61 6c 20 24 6a 73 48 61 6e  ape::eval $jsHan
0ff0: 64 6c 65 20 7b 76 61 72 20 67 6f 6f 67 20 3d 20  dle {var goog = 
1000: 7b 44 45 42 55 47 3a 20 66 61 6c 73 65 7d 3b 7d  {DEBUG: false};}
1010: 0a 09 3a 3a 64 75 6b 74 61 70 65 3a 3a 65 76 61  ..::duktape::eva
1020: 6c 20 24 6a 73 48 61 6e 64 6c 65 20 5b 72 65 61  l $jsHandle [rea
1030: 64 46 69 6c 65 20 63 68 72 6f 6d 65 2d 65 6d 75  dFile chrome-emu
1040: 2e 6a 73 5d 0a 09 61 64 64 52 53 41 54 6f 4a 53  .js]..addRSAToJS
1050: 20 24 6a 73 48 61 6e 64 6c 65 0a 09 3a 3a 64 75   $jsHandle..::du
1060: 6b 74 61 70 65 3a 3a 65 76 61 6c 20 24 6a 73 48  ktape::eval $jsH
1070: 61 6e 64 6c 65 20 5b 72 65 61 64 46 69 6c 65 20  andle [readFile 
1080: 73 73 68 2d 61 67 65 6e 74 2d 6e 6f 61 73 79 6e  ssh-agent-noasyn
1090: 63 2e 6a 73 5d 0a 09 3a 3a 64 75 6b 74 61 70 65  c.js]..::duktape
10a0: 3a 3a 65 76 61 6c 20 24 6a 73 48 61 6e 64 6c 65  ::eval $jsHandle
10b0: 20 7b 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74   {cackeySSHAgent
10c0: 46 65 61 74 75 72 65 73 2e 65 6e 61 62 6c 65 64  Features.enabled
10d0: 20 3d 20 74 72 75 65 3b 7d 0a 09 3a 3a 64 75 6b   = true;}..::duk
10e0: 74 61 70 65 3a 3a 65 76 61 6c 20 24 6a 73 48 61  tape::eval $jsHa
10f0: 6e 64 6c 65 20 7b 63 61 63 6b 65 79 53 53 48 41  ndle {cackeySSHA
1100: 67 65 6e 74 46 65 61 74 75 72 65 73 2e 69 6e 63  gentFeatures.inc
1110: 6c 75 64 65 43 65 72 74 73 20 3d 20 66 61 6c 73  ludeCerts = fals
1120: 65 3b 7d 0a 09 3a 3a 64 75 6b 74 61 70 65 3a 3a  e;}..::duktape::
1130: 65 76 61 6c 20 24 6a 73 48 61 6e 64 6c 65 20 7b  eval $jsHandle {
1140: 63 61 63 6b 65 79 53 53 48 41 67 65 6e 74 46 65  cackeySSHAgentFe
1150: 61 74 75 72 65 73 2e 6c 65 67 61 63 79 20 3d 20  atures.legacy = 
1160: 66 61 6c 73 65 3b 7d 0a 09 3a 3a 64 75 6b 74 61  false;}..::dukta
1170: 70 65 3a 3a 65 76 61 6c 20 24 6a 73 48 61 6e 64  pe::eval $jsHand
1180: 6c 65 20 7b 0a 09 09 66 75 6e 63 74 69 6f 6e 20  le {...function 
1190: 63 6f 6e 6e 65 63 74 69 6f 6e 28 63 61 6c 6c 62  connection(callb
11a0: 61 63 6b 29 20 7b 0a 09 09 09 74 68 69 73 2e 73  ack) {....this.s
11b0: 65 6e 64 65 72 20 3d 20 7b 0a 09 09 09 09 69 64  ender = {.....id
11c0: 3a 20 22 70 6e 68 65 63 68 61 70 66 61 69 6e 64  : "pnhechapfaind
11d0: 6a 68 6f 6d 70 62 6e 66 6c 63 6c 64 61 62 62 67  jhompbnflcldabbg
11e0: 68 6a 6f 22 0a 09 09 09 7d 3b 0a 09 09 09 74 68  hjo"....};....th
11f0: 69 73 2e 6f 6e 4d 65 73 73 61 67 65 20 3d 20 7b  is.onMessage = {
1200: 0a 09 09 09 09 6c 69 73 74 65 6e 65 72 73 3a 20  .....listeners: 
1210: 5b 5d 2c 0a 09 09 09 09 61 64 64 4c 69 73 74 65  [],.....addListe
1220: 6e 65 72 3a 20 66 75 6e 63 74 69 6f 6e 28 63 61  ner: function(ca
1230: 6c 6c 62 61 63 6b 29 20 7b 0a 09 09 09 09 09 74  llback) {......t
1240: 68 69 73 2e 6c 69 73 74 65 6e 65 72 73 2e 70 75  his.listeners.pu
1250: 73 68 28 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 09  sh(callback);...
1260: 09 09 7d 0a 09 09 09 7d 3b 0a 09 09 09 74 68 69  ..}....};....thi
1270: 73 2e 70 6f 73 74 4d 65 73 73 61 67 65 20 3d 20  s.postMessage = 
1280: 66 75 6e 63 74 69 6f 6e 28 6d 65 73 73 61 67 65  function(message
1290: 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 63  ) {.....return(c
12a0: 61 6c 6c 62 61 63 6b 28 74 68 69 73 2c 20 6d 65  allback(this, me
12b0: 73 73 61 67 65 29 29 3b 0a 09 09 09 7d 3b 0a 09  ssage));....};..
12c0: 09 09 74 68 69 73 2e 73 65 6e 64 20 3d 20 66 75  ..this.send = fu
12d0: 6e 63 74 69 6f 6e 28 6d 65 73 73 61 67 65 29 20  nction(message) 
12e0: 7b 0a 09 09 09 09 74 68 69 73 2e 6f 6e 4d 65 73  {.....this.onMes
12f0: 73 61 67 65 2e 6c 69 73 74 65 6e 65 72 73 2e 66  sage.listeners.f
1300: 6f 72 45 61 63 68 28 66 75 6e 63 74 69 6f 6e 28  orEach(function(
1310: 6c 69 73 74 65 6e 65 72 29 20 7b 0a 09 09 09 09  listener) {.....
1320: 09 6c 69 73 74 65 6e 65 72 28 6d 65 73 73 61 67  .listener(messag
1330: 65 29 3b 0a 09 09 09 09 7d 29 3b 0a 09 09 09 7d  e);.....});....}
1340: 3b 0a 09 09 7d 0a 0a 09 09 66 75 6e 63 74 69 6f  ;...}....functio
1350: 6e 20 68 61 6e 64 6c 65 44 61 74 61 46 72 6f 6d  n handleDataFrom
1360: 41 67 65 6e 74 28 73 6f 63 6b 65 74 2c 20 64 61  Agent(socket, da
1370: 74 61 29 20 7b 0a 09 09 09 69 66 20 28 21 64 61  ta) {....if (!da
1380: 74 61 20 7c 7c 20 21 64 61 74 61 2e 74 79 70 65  ta || !data.type
1390: 20 7c 7c 20 21 64 61 74 61 2e 64 61 74 61 29 20   || !data.data) 
13a0: 7b 0a 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09  {.....return;...
13b0: 09 7d 0a 0a 09 09 09 69 66 20 28 64 61 74 61 2e  .}.....if (data.
13c0: 74 79 70 65 20 21 3d 20 22 61 75 74 68 2d 61 67  type != "auth-ag
13d0: 65 6e 74 40 6f 70 65 6e 73 73 68 2e 63 6f 6d 22  ent@openssh.com"
13e0: 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 3b 0a  ) {.....return;.
13f0: 09 09 09 7d 0a 0a 09 09 09 77 72 69 74 65 46 72  ...}.....writeFr
1400: 61 6d 65 64 28 73 6f 63 6b 65 74 2e 68 61 6e 64  amed(socket.hand
1410: 6c 65 2c 20 64 61 74 61 2e 64 61 74 61 29 3b 0a  le, data.data);.
1420: 09 09 7d 0a 0a 09 09 66 75 6e 63 74 69 6f 6e 20  ..}....function 
1430: 68 61 6e 64 6c 65 44 61 74 61 46 72 6f 6d 53 6f  handleDataFromSo
1440: 63 6b 65 74 28 73 6f 63 6b 65 74 2c 20 64 61 74  cket(socket, dat
1450: 61 29 20 7b 0a 09 09 09 73 6f 63 6b 65 74 2e 73  a) {....socket.s
1460: 65 6e 64 28 7b 0a 09 09 09 09 74 79 70 65 3a 20  end({.....type: 
1470: 22 61 75 74 68 2d 61 67 65 6e 74 40 6f 70 65 6e  "auth-agent@open
1480: 73 73 68 2e 63 6f 6d 22 2c 0a 09 09 09 09 64 61  ssh.com",.....da
1490: 74 61 3a 20 41 72 72 61 79 2e 66 72 6f 6d 28 64  ta: Array.from(d
14a0: 61 74 61 29 0a 09 09 09 7d 29 3b 0a 09 09 7d 0a  ata)....});...}.
14b0: 0a 09 09 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ...function writ
14c0: 65 46 72 61 6d 65 64 28 73 6f 63 6b 2c 20 64 61  eFramed(sock, da
14d0: 74 61 29 20 7b 0a 09 09 09 76 61 72 20 62 75 66  ta) {....var buf
14e0: 66 65 72 3b 0a 09 09 09 76 61 72 20 69 64 78 3b  fer;....var idx;
14f0: 0a 0a 09 09 09 62 75 66 66 65 72 20 3d 20 6e 65  .....buffer = ne
1500: 77 20 42 75 66 66 65 72 28 64 61 74 61 2e 6c 65  w Buffer(data.le
1510: 6e 67 74 68 29 3b 0a 09 09 09 66 6f 72 20 28 69  ngth);....for (i
1520: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 64 61  dx = 0; idx < da
1530: 74 61 2e 6c 65 6e 67 74 68 3b 20 69 64 78 2b 2b  ta.length; idx++
1540: 29 20 7b 0a 09 09 09 09 62 75 66 66 65 72 5b 69  ) {.....buffer[i
1550: 64 78 5d 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b  dx] = data[idx];
1560: 0a 09 09 09 7d 0a 09 09 09 72 65 74 75 72 6e 28  ....}....return(
1570: 77 72 69 74 65 46 72 61 6d 65 64 42 75 66 66 65  writeFramedBuffe
1580: 72 28 73 6f 63 6b 2c 20 62 75 66 66 65 72 29 29  r(sock, buffer))
1590: 3b 0a 09 09 7d 0a 0a 09 09 66 75 6e 63 74 69 6f  ;...}....functio
15a0: 6e 20 63 61 63 6b 65 79 4c 69 73 74 43 65 72 74  n cackeyListCert
15b0: 69 66 69 63 61 74 65 73 28 29 20 7b 0a 09 09 09  ificates() {....
15c0: 76 61 72 20 63 65 72 74 73 3b 0a 09 09 09 76 61  var certs;....va
15d0: 72 20 63 65 72 74 4f 62 6a 73 3b 0a 0a 09 09 09  r certObjs;.....
15e0: 63 65 72 74 4f 62 6a 73 20 3d 20 5b 5d 3b 0a 09  certObjs = [];..
15f0: 09 09 63 65 72 74 73 20 3d 20 63 61 63 6b 65 79  ..certs = cackey
1600: 4c 69 73 74 43 65 72 74 69 66 69 63 61 74 65 73  ListCertificates
1610: 42 61 72 65 28 29 3b 0a 09 09 09 63 65 72 74 73  Bare();....certs
1620: 2e 66 6f 72 45 61 63 68 28 66 75 6e 63 74 69 6f  .forEach(functio
1630: 6e 28 63 65 72 74 29 20 7b 0a 09 09 09 09 63 65  n(cert) {.....ce
1640: 72 74 4f 62 6a 73 2e 70 75 73 68 28 7b 0a 09 09  rtObjs.push({...
1650: 09 09 09 63 65 72 74 69 66 69 63 61 74 65 3a 20  ...certificate: 
1660: 6e 65 77 20 55 69 6e 74 38 41 72 72 61 79 28 63  new Uint8Array(c
1670: 65 72 74 29 2c 0a 09 09 09 09 09 73 75 70 70 6f  ert),......suppo
1680: 72 74 65 64 48 61 73 68 65 73 3a 20 5b 27 53 48  rtedHashes: ['SH
1690: 41 31 27 2c 20 27 53 48 41 32 35 36 27 2c 20 27  A1', 'SHA256', '
16a0: 53 48 41 35 31 32 27 2c 20 27 4d 44 35 5f 53 48  SHA512', 'MD5_SH
16b0: 41 31 27 5d 0a 09 09 09 09 7d 29 3b 0a 09 09 09  A1'].....});....
16c0: 7d 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  });.....return(c
16d0: 65 72 74 4f 62 6a 73 29 3b 0a 09 09 7d 0a 0a 09  ertObjs);...}...
16e0: 09 66 75 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79  .function cackey
16f0: 53 69 67 6e 4d 65 73 73 61 67 65 28 72 65 71 75  SignMessage(requ
1700: 65 73 74 29 20 7b 0a 09 09 09 76 61 72 20 72 65  est) {....var re
1710: 74 76 61 6c 3b 0a 09 09 09 76 61 72 20 64 69 67  tval;....var dig
1720: 65 73 74 2c 20 64 69 67 65 73 74 48 65 61 64 65  est, digestHeade
1730: 72 3b 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20  r;...../*.... * 
1740: 58 58 58 3a 54 4f 44 4f 3a 20 50 75 6c 6c 20 74  XXX:TODO: Pull t
1750: 68 69 73 20 6f 75 74 20 6f 66 20 63 61 63 6b 65  his out of cacke
1760: 79 2e 6a 73 20 69 6e 74 6f 20 61 20 63 6f 6d 6d  y.js into a comm
1770: 6f 6e 2e 6a 73 0a 09 09 09 20 2a 2f 0a 09 09 09  on.js.... */....
1780: 73 77 69 74 63 68 20 28 72 65 71 75 65 73 74 2e  switch (request.
1790: 68 61 73 68 29 20 7b 0a 09 09 09 09 63 61 73 65  hash) {.....case
17a0: 20 22 53 48 41 31 22 3a 0a 09 09 09 09 09 64 69   "SHA1":......di
17b0: 67 65 73 74 48 65 61 64 65 72 20 3d 20 6e 65 77  gestHeader = new
17c0: 20 55 69 6e 74 38 41 72 72 61 79 28 5b 30 78 33   Uint8Array([0x3
17d0: 30 2c 20 30 78 32 31 2c 20 30 78 33 30 2c 20 30  0, 0x21, 0x30, 0
17e0: 78 30 39 2c 20 30 78 30 36 2c 20 30 78 30 35 2c  x09, 0x06, 0x05,
17f0: 20 30 78 32 62 2c 20 30 78 30 65 2c 20 30 78 30   0x2b, 0x0e, 0x0
1800: 33 2c 20 30 78 30 32 2c 20 30 78 31 61 2c 20 30  3, 0x02, 0x1a, 0
1810: 78 30 35 2c 20 30 78 30 30 2c 20 30 78 30 34 2c  x05, 0x00, 0x04,
1820: 20 30 78 31 34 5d 29 3b 0a 09 09 09 09 09 62 72   0x14]);......br
1830: 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 22 53  eak;.....case "S
1840: 48 41 32 35 36 22 3a 0a 09 09 09 09 09 64 69 67  HA256":......dig
1850: 65 73 74 48 65 61 64 65 72 20 3d 20 6e 65 77 20  estHeader = new 
1860: 55 69 6e 74 38 41 72 72 61 79 28 5b 30 78 33 30  Uint8Array([0x30
1870: 2c 20 30 78 33 31 2c 20 30 78 33 30 2c 20 30 78  , 0x31, 0x30, 0x
1880: 30 64 2c 20 30 78 30 36 2c 20 30 78 30 39 2c 20  0d, 0x06, 0x09, 
1890: 30 78 36 30 2c 20 30 78 38 36 2c 20 30 78 34 38  0x60, 0x86, 0x48
18a0: 2c 20 30 78 30 31 2c 20 30 78 36 35 2c 20 30 78  , 0x01, 0x65, 0x
18b0: 30 33 2c 20 30 78 30 34 2c 20 30 78 30 32 2c 20  03, 0x04, 0x02, 
18c0: 30 78 30 31 2c 20 30 78 30 35 2c 20 30 78 30 30  0x01, 0x05, 0x00
18d0: 2c 20 30 78 30 34 2c 20 30 78 32 30 5d 29 3b 0a  , 0x04, 0x20]);.
18e0: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
18f0: 63 61 73 65 20 22 53 48 41 35 31 32 22 3a 0a 09  case "SHA512":..
1900: 09 09 09 09 64 69 67 65 73 74 48 65 61 64 65 72  ....digestHeader
1910: 20 3d 20 6e 65 77 20 55 69 6e 74 38 41 72 72 61   = new Uint8Arra
1920: 79 28 5b 30 78 33 30 2c 20 30 78 35 31 2c 20 30  y([0x30, 0x51, 0
1930: 78 33 30 2c 20 30 78 30 64 2c 20 30 78 30 36 2c  x30, 0x0d, 0x06,
1940: 20 30 78 30 39 2c 20 30 78 36 30 2c 20 30 78 38   0x09, 0x60, 0x8
1950: 36 2c 20 30 78 34 38 2c 20 30 78 30 31 2c 20 30  6, 0x48, 0x01, 0
1960: 78 36 35 2c 20 30 78 30 33 2c 20 30 78 30 34 2c  x65, 0x03, 0x04,
1970: 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30   0x02, 0x03, 0x0
1980: 35 2c 20 30 78 30 30 2c 20 30 78 30 34 2c 20 30  5, 0x00, 0x04, 0
1990: 78 34 30 5d 29 3b 0a 09 09 09 09 09 62 72 65 61  x40]);......brea
19a0: 6b 3b 0a 09 09 09 09 63 61 73 65 20 22 4d 44 35  k;.....case "MD5
19b0: 5f 53 48 41 31 22 3a 0a 09 09 09 09 63 61 73 65  _SHA1":.....case
19c0: 20 22 52 41 57 22 3a 0a 09 09 09 09 09 64 69 67   "RAW":......dig
19d0: 65 73 74 48 65 61 64 65 72 20 3d 20 6e 65 77 20  estHeader = new 
19e0: 55 69 6e 74 38 41 72 72 61 79 28 29 3b 0a 09 09  Uint8Array();...
19f0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 64 65  ...break;.....de
1a00: 66 61 75 6c 74 3a 0a 09 09 09 09 09 63 6f 6e 73  fault:......cons
1a10: 6f 6c 65 2e 65 72 72 6f 72 28 22 5b 63 61 63 6b  ole.error("[cack
1a20: 65 79 5d 20 41 73 6b 65 64 20 74 6f 20 73 69 67  ey] Asked to sig
1a30: 6e 20 61 20 6d 65 73 73 61 67 65 20 77 69 74 68  n a message with
1a40: 20 61 20 68 61 73 68 20 77 65 20 64 6f 20 6e 6f   a hash we do no
1a50: 74 20 73 75 70 70 6f 72 74 3a 20 22 20 2b 20 72  t support: " + r
1a60: 65 71 75 65 73 74 2e 68 61 73 68 29 3b 0a 09 09  equest.hash);...
1a70: 09 09 09 72 65 74 75 72 6e 28 6e 75 6c 6c 29 3b  ...return(null);
1a80: 0a 09 09 09 7d 0a 0a 09 09 09 64 69 67 65 73 74  ....}.....digest
1a90: 20 3d 20 41 72 72 61 79 2e 66 72 6f 6d 28 64 69   = Array.from(di
1aa0: 67 65 73 74 48 65 61 64 65 72 29 3b 0a 09 09 09  gestHeader);....
1ab0: 64 69 67 65 73 74 20 3d 20 64 69 67 65 73 74 2e  digest = digest.
1ac0: 63 6f 6e 63 61 74 28 41 72 72 61 79 2e 66 72 6f  concat(Array.fro
1ad0: 6d 28 72 65 71 75 65 73 74 2e 64 69 67 65 73 74  m(request.digest
1ae0: 29 29 3b 0a 09 09 09 64 69 67 65 73 74 20 3d 20  ));....digest = 
1af0: 6e 65 77 20 42 75 66 66 65 72 28 64 69 67 65 73  new Buffer(diges
1b00: 74 29 3b 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d  t);.....retval =
1b10: 20 63 61 63 6b 65 79 53 69 67 6e 42 61 72 65 28   cackeySignBare(
1b20: 72 65 71 75 65 73 74 2e 63 65 72 74 69 66 69 63  request.certific
1b30: 61 74 65 2c 20 64 69 67 65 73 74 29 3b 0a 0a 09  ate, digest);...
1b40: 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
1b50: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 3a 3a 64 75 6b  ;...}..}...::duk
1b60: 74 61 70 65 3a 3a 74 63 6c 2d 66 75 6e 63 74 69  tape::tcl-functi
1b70: 6f 6e 20 24 6a 73 48 61 6e 64 6c 65 20 77 72 69  on $jsHandle wri
1b80: 74 65 46 72 61 6d 65 64 42 75 66 66 65 72 20 7b  teFramedBuffer {
1b90: 73 6f 63 6b 20 6d 65 73 73 61 67 65 7d 20 7b 0a  sock message} {.
1ba0: 09 09 73 65 74 20 64 61 74 61 4c 65 6e 20 5b 73  ..set dataLen [s
1bb0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 65  tring length $me
1bc0: 73 73 61 67 65 5d 0a 09 09 73 65 74 20 64 61 74  ssage]...set dat
1bd0: 61 4c 65 6e 20 5b 62 69 6e 61 72 79 20 66 6f 72  aLen [binary for
1be0: 6d 61 74 20 49 20 24 64 61 74 61 4c 65 6e 5d 0a  mat I $dataLen].
1bf0: 09 09 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e  ..puts -nonewlin
1c00: 65 20 24 73 6f 63 6b 20 22 24 7b 64 61 74 61 4c  e $sock "${dataL
1c10: 65 6e 7d 24 7b 6d 65 73 73 61 67 65 7d 22 0a 09  en}${message}"..
1c20: 09 66 6c 75 73 68 20 24 73 6f 63 6b 0a 0a 09 09  .flush $sock....
1c30: 72 65 74 75 72 6e 20 22 22 0a 09 7d 0a 0a 09 3a  return ""..}...:
1c40: 3a 64 75 6b 74 61 70 65 3a 3a 74 63 6c 2d 66 75  :duktape::tcl-fu
1c50: 6e 63 74 69 6f 6e 20 24 6a 73 48 61 6e 64 6c 65  nction $jsHandle
1c60: 20 72 65 61 64 46 72 61 6d 65 64 20 62 79 74 65   readFramed byte
1c70: 61 72 72 61 79 20 7b 73 6f 63 6b 7d 20 7b 0a 09  array {sock} {..
1c80: 09 63 61 74 63 68 20 7b 0a 09 09 09 73 65 74 20  .catch {....set 
1c90: 64 61 74 61 4c 65 6e 20 5b 72 65 61 64 20 24 73  dataLen [read $s
1ca0: 6f 63 6b 20 34 5d 0a 09 09 7d 0a 09 09 69 66 20  ock 4]...}...if 
1cb0: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64  {![info exists d
1cc0: 61 74 61 4c 65 6e 5d 20 7c 7c 20 5b 73 74 72 69  ataLen] || [stri
1cd0: 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 61 4c  ng length $dataL
1ce0: 65 6e 5d 20 21 3d 20 34 7d 20 7b 0a 09 09 09 63  en] != 4} {....c
1cf0: 6c 6f 73 65 20 24 73 6f 63 6b 0a 09 09 09 72 65  lose $sock....re
1d00: 74 75 72 6e 0a 09 09 7d 0a 0a 09 09 62 69 6e 61  turn...}....bina
1d10: 72 79 20 73 63 61 6e 20 24 64 61 74 61 4c 65 6e  ry scan $dataLen
1d20: 20 49 20 64 61 74 61 4c 65 6e 0a 0a 09 09 73 65   I dataLen....se
1d30: 74 20 64 61 74 61 20 5b 72 65 61 64 20 24 73 6f  t data [read $so
1d40: 63 6b 20 24 64 61 74 61 4c 65 6e 5d 0a 0a 09 09  ck $dataLen]....
1d50: 72 65 74 75 72 6e 20 24 64 61 74 61 0a 09 7d 0a  return $data..}.
1d60: 0a 0a 09 3a 3a 64 75 6b 74 61 70 65 3a 3a 74 63  ...::duktape::tc
1d70: 6c 2d 66 75 6e 63 74 69 6f 6e 20 24 6a 73 48 61  l-function $jsHa
1d80: 6e 64 6c 65 20 63 61 63 6b 65 79 53 69 67 6e 42  ndle cackeySignB
1d90: 61 72 65 20 62 79 74 65 61 72 72 61 79 20 7b 63  are bytearray {c
1da0: 65 72 74 20 6d 65 73 73 61 67 65 7d 20 7b 0a 09  ert message} {..
1db0: 09 73 65 74 20 68 61 6e 64 6c 65 20 5b 70 6b 63  .set handle [pkc
1dc0: 73 31 31 4d 6f 64 75 6c 65 48 61 6e 64 6c 65 5d  s11ModuleHandle]
1dd0: 0a 09 09 73 65 74 20 63 65 72 74 49 6e 66 6f 20  ...set certInfo 
1de0: 5b 6c 69 73 74 43 65 72 74 73 20 24 68 61 6e 64  [listCerts $hand
1df0: 6c 65 20 24 63 65 72 74 5d 0a 09 09 69 66 20 7b  le $cert]...if {
1e00: 21 5b 64 69 63 74 20 65 78 69 73 74 73 20 24 63  ![dict exists $c
1e10: 65 72 74 49 6e 66 6f 20 70 6b 63 73 31 31 5f 73  ertInfo pkcs11_s
1e20: 6c 6f 74 69 64 5d 7d 20 7b 0a 09 09 09 70 6b 63  lotid]} {....pkc
1e30: 73 31 31 4d 6f 64 75 6c 65 55 6e 6c 6f 61 64 20  s11ModuleUnload 
1e40: 24 68 61 6e 64 6c 65 0a 09 09 09 72 65 74 75 72  $handle....retur
1e50: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 55  n -code error "U
1e60: 6e 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 63 65  nable to find ce
1e70: 72 74 69 66 69 63 61 74 65 20 74 6f 20 73 69 67  rtificate to sig
1e80: 6e 20 77 69 74 68 22 0a 09 09 7d 0a 0a 09 09 73  n with"...}....s
1e90: 65 74 20 73 6c 6f 74 49 64 20 5b 64 69 63 74 20  et slotId [dict 
1ea0: 67 65 74 20 24 63 65 72 74 49 6e 66 6f 20 70 6b  get $certInfo pk
1eb0: 63 73 31 31 5f 73 6c 6f 74 69 64 5d 0a 09 09 73  cs11_slotid]...s
1ec0: 65 74 20 64 61 74 61 20 5b 3a 3a 70 6b 69 3a 3a  et data [::pki::
1ed0: 73 69 67 6e 20 24 6d 65 73 73 61 67 65 20 24 63  sign $message $c
1ee0: 65 72 74 49 6e 66 6f 20 72 61 77 5d 0a 0a 09 09  ertInfo raw]....
1ef0: 72 65 74 75 72 6e 20 24 64 61 74 61 0a 09 7d 0a  return $data..}.
1f00: 0a 09 3a 3a 64 75 6b 74 61 70 65 3a 3a 74 63 6c  ..::duktape::tcl
1f10: 2d 66 75 6e 63 74 69 6f 6e 20 24 6a 73 48 61 6e  -function $jsHan
1f20: 64 6c 65 20 63 61 63 6b 65 79 4c 69 73 74 43 65  dle cackeyListCe
1f30: 72 74 69 66 69 63 61 74 65 73 42 61 72 65 20 7b  rtificatesBare {
1f40: 61 72 72 61 79 6c 69 73 74 20 62 79 74 65 61 72  arraylist bytear
1f50: 72 61 79 7d 20 7b 7d 20 7b 0a 09 09 73 65 74 20  ray} {} {...set 
1f60: 68 61 6e 64 6c 65 20 5b 70 6b 63 73 31 31 4d 6f  handle [pkcs11Mo
1f70: 64 75 6c 65 48 61 6e 64 6c 65 5d 0a 09 09 72 65  duleHandle]...re
1f80: 74 75 72 6e 20 5b 6c 69 73 74 43 65 72 74 73 20  turn [listCerts 
1f90: 24 68 61 6e 64 6c 65 5d 0a 09 7d 0a 0a 09 72 65  $handle]..}...re
1fa0: 74 75 72 6e 20 24 6a 73 48 61 6e 64 6c 65 0a 7d  turn $jsHandle.}
1fb0: 0a 0a 70 72 6f 63 20 6c 69 73 74 43 65 72 74 73  ..proc listCerts
1fc0: 20 7b 68 61 6e 64 6c 65 20 7b 6d 61 74 63 68 20   {handle {match 
1fd0: 22 22 7d 7d 20 7b 0a 09 73 65 74 20 63 65 72 74  ""}} {..set cert
1fe0: 73 20 5b 6c 69 73 74 5d 0a 0a 09 73 65 74 20 73  s [list]...set s
1ff0: 6c 6f 74 73 20 5b 3a 3a 70 6b 69 3a 3a 70 6b 63  lots [::pki::pkc
2000: 73 31 31 3a 3a 6c 69 73 74 73 6c 6f 74 73 20 24  s11::listslots $
2010: 68 61 6e 64 6c 65 5d 0a 09 66 6f 72 65 61 63 68  handle]..foreach
2020: 20 73 6c 6f 74 49 6e 66 6f 20 24 73 6c 6f 74 73   slotInfo $slots
2030: 20 7b 0a 09 09 73 65 74 20 73 6c 6f 74 49 64 20   {...set slotId 
2040: 5b 6c 69 6e 64 65 78 20 24 73 6c 6f 74 49 6e 66  [lindex $slotInf
2050: 6f 20 30 5d 0a 09 09 73 65 74 20 73 6c 6f 74 4c  o 0]...set slotL
2060: 61 62 65 6c 20 5b 6c 69 6e 64 65 78 20 24 73 6c  abel [lindex $sl
2070: 6f 74 49 6e 66 6f 20 31 5d 0a 09 09 73 65 74 20  otInfo 1]...set 
2080: 73 6c 6f 74 46 6c 61 67 73 20 5b 6c 69 6e 64 65  slotFlags [linde
2090: 78 20 24 73 6c 6f 74 49 6e 66 6f 20 32 5d 0a 0a  x $slotInfo 2]..
20a0: 09 09 73 65 74 20 73 6c 6f 74 43 65 72 74 73 20  ..set slotCerts 
20b0: 5b 3a 3a 70 6b 69 3a 3a 70 6b 63 73 31 31 3a 3a  [::pki::pkcs11::
20c0: 6c 69 73 74 63 65 72 74 73 20 24 68 61 6e 64 6c  listcerts $handl
20d0: 65 20 24 73 6c 6f 74 49 64 5d 0a 09 09 66 6f 72  e $slotId]...for
20e0: 65 61 63 68 20 6b 65 79 4c 69 73 74 20 24 73 6c  each keyList $sl
20f0: 6f 74 43 65 72 74 73 20 7b 0a 09 09 09 73 65 74  otCerts {....set
2100: 20 63 65 72 74 20 5b 64 69 63 74 20 67 65 74 20   cert [dict get 
2110: 24 6b 65 79 4c 69 73 74 20 72 61 77 5d 0a 09 09  $keyList raw]...
2120: 09 73 65 74 20 63 65 72 74 20 5b 62 69 6e 61 72  .set cert [binar
2130: 79 20 64 65 63 6f 64 65 20 68 65 78 20 24 63 65  y decode hex $ce
2140: 72 74 5d 0a 09 09 09 69 66 20 7b 24 6d 61 74 63  rt]....if {$matc
2150: 68 20 65 71 20 24 63 65 72 74 7d 20 7b 0a 09 09  h eq $cert} {...
2160: 09 09 72 65 74 75 72 6e 20 24 6b 65 79 4c 69 73  ..return $keyLis
2170: 74 0a 09 09 09 7d 0a 09 09 09 6c 61 70 70 65 6e  t....}....lappen
2180: 64 20 63 65 72 74 73 20 24 63 65 72 74 0a 09 09  d certs $cert...
2190: 7d 0a 09 7d 0a 0a 09 69 66 20 7b 24 6d 61 74 63  }..}...if {$matc
21a0: 68 20 6e 65 20 22 22 7d 20 7b 0a 09 09 72 65 74  h ne ""} {...ret
21b0: 75 72 6e 20 5b 6c 69 73 74 5d 0a 09 7d 0a 0a 09  urn [list]..}...
21c0: 72 65 74 75 72 6e 20 24 63 65 72 74 73 0a 7d 0a  return $certs.}.
21d0: 0a 70 72 6f 63 20 68 61 6e 64 6c 65 44 61 74 61  .proc handleData
21e0: 20 7b 73 6f 63 6b 20 6a 73 48 61 6e 64 6c 65 7d   {sock jsHandle}
21f0: 20 7b 0a 09 69 66 20 7b 5b 63 61 74 63 68 20 7b   {..if {[catch {
2200: 0a 09 09 3a 3a 64 75 6b 74 61 70 65 3a 3a 65 76  ...::duktape::ev
2210: 61 6c 20 24 6a 73 48 61 6e 64 6c 65 20 7b 68 61  al $jsHandle {ha
2220: 6e 64 6c 65 44 61 74 61 46 72 6f 6d 53 6f 63 6b  ndleDataFromSock
2230: 65 74 28 73 6f 63 6b 65 74 2c 20 72 65 61 64 46  et(socket, readF
2240: 72 61 6d 65 64 28 73 6f 63 6b 65 74 2e 68 61 6e  ramed(socket.han
2250: 64 6c 65 29 29 3b 7d 0a 09 7d 5d 7d 20 7b 0a 09  dle));}..}]} {..
2260: 09 70 75 74 73 20 73 74 64 65 72 72 20 22 45 52  .puts stderr "ER
2270: 52 4f 52 3a 20 24 3a 3a 65 72 72 6f 72 49 6e 66  ROR: $::errorInf
2280: 6f 22 0a 09 09 63 6c 6f 73 65 20 24 73 6f 63 6b  o"...close $sock
2290: 0a 09 7d 0a 7d 0a 0a 70 72 6f 63 20 69 6e 63 6f  ..}.}..proc inco
22a0: 6d 69 6e 67 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b  mingConnection {
22b0: 73 6f 63 6b 20 61 72 67 73 7d 20 7b 0a 09 69 66  sock args} {..if
22c0: 20 7b 5b 63 61 74 63 68 20 7b 0a 09 09 69 66 20   {[catch {...if 
22d0: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
22e0: 3a 6a 73 48 61 6e 64 6c 65 5d 7d 20 7b 0a 09 09  :jsHandle]} {...
22f0: 09 73 65 74 20 3a 3a 6a 73 48 61 6e 64 6c 65 20  .set ::jsHandle 
2300: 5b 69 6e 69 74 53 53 48 41 67 65 6e 74 5d 0a 09  [initSSHAgent]..
2310: 09 7d 0a 09 09 73 65 74 20 6a 73 48 61 6e 64 6c  .}...set jsHandl
2320: 65 20 24 3a 3a 6a 73 48 61 6e 64 6c 65 0a 0a 09  e $::jsHandle...
2330: 09 3a 3a 64 75 6b 74 61 70 65 3a 3a 65 76 61 6c  .::duktape::eval
2340: 20 24 6a 73 48 61 6e 64 6c 65 20 7b 76 61 72 20   $jsHandle {var 
2350: 73 6f 63 6b 65 74 20 3d 20 6e 65 77 20 63 6f 6e  socket = new con
2360: 6e 65 63 74 69 6f 6e 28 68 61 6e 64 6c 65 44 61  nection(handleDa
2370: 74 61 46 72 6f 6d 41 67 65 6e 74 29 3b 7d 0a 09  taFromAgent);}..
2380: 09 3a 3a 64 75 6b 74 61 70 65 3a 3a 65 76 61 6c  .::duktape::eval
2390: 20 24 6a 73 48 61 6e 64 6c 65 20 22 73 6f 63 6b   $jsHandle "sock
23a0: 65 74 2e 68 61 6e 64 6c 65 20 3d 20 5c 22 24 73  et.handle = \"$s
23b0: 6f 63 6b 5c 22 3b 22 0a 09 09 3a 3a 64 75 6b 74  ock\";"...::dukt
23c0: 61 70 65 3a 3a 65 76 61 6c 20 24 6a 73 48 61 6e  ape::eval $jsHan
23d0: 64 6c 65 20 7b 63 68 72 6f 6d 65 2e 72 75 6e 74  dle {chrome.runt
23e0: 69 6d 65 2e 65 78 74 65 72 6e 61 6c 43 6f 6e 6e  ime.externalConn
23f0: 65 63 74 28 73 6f 63 6b 65 74 29 3b 7d 0a 0a 09  ect(socket);}...
2400: 09 66 63 6f 6e 66 69 67 75 72 65 20 24 73 6f 63  .fconfigure $soc
2410: 6b 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62  k -translation b
2420: 69 6e 61 72 79 20 2d 65 6e 63 6f 64 69 6e 67 20  inary -encoding 
2430: 62 69 6e 61 72 79 20 2d 62 6c 6f 63 6b 69 6e 67  binary -blocking
2440: 20 74 72 75 65 0a 09 09 66 69 6c 65 65 76 65 6e   true...fileeven
2450: 74 20 24 73 6f 63 6b 20 72 65 61 64 61 62 6c 65  t $sock readable
2460: 20 5b 6c 69 73 74 20 68 61 6e 64 6c 65 44 61 74   [list handleDat
2470: 61 20 24 73 6f 63 6b 20 24 6a 73 48 61 6e 64 6c  a $sock $jsHandl
2480: 65 5d 0a 09 7d 5d 7d 20 7b 0a 09 09 70 75 74 73  e]..}]} {...puts
2490: 20 73 74 64 65 72 72 20 22 45 52 52 4f 52 3a 20   stderr "ERROR: 
24a0: 24 3a 3a 65 72 72 6f 72 49 6e 66 6f 22 0a 09 09  $::errorInfo"...
24b0: 63 6c 6f 73 65 20 24 73 6f 63 6b 0a 09 7d 0a 7d  close $sock..}.}
24c0: 0a 0a 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61  ..::tuapi::sysca
24d0: 6c 6c 3a 3a 73 6f 63 6b 65 74 5f 75 6e 69 78 20  ll::socket_unix 
24e0: 2d 73 65 72 76 65 72 20 69 6e 63 6f 6d 69 6e 67  -server incoming
24f0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 22 2e 2f 61 67  Connection "./ag
2500: 65 6e 74 22 0a 0a 76 77 61 69 74 20 66 6f 72 65  ent"..vwait fore
2510: 76 65 72 0a                                      ver.