Hex Artifact Content

Artifact 183583332c474aa97342fe20a6c35b7fdcec7efc:


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 0a 09 09 23 20 50 61 64 20 74  t n]]....# Pad t
0650: 6f 20 65 76 65 6e 20 73 69 7a 65 20 66 6f 72 20  o even size for 
0660: 68 65 78 20 77 69 64 74 68 0a 09 09 69 66 20 7b  hex width...if {
0670: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
0680: 65 5d 20 25 20 32 20 21 3d 20 30 7d 20 7b 0a 09  e] % 2 != 0} {..
0690: 09 09 73 65 74 20 65 20 22 30 24 65 22 0a 09 09  ..set e "0$e"...
06a0: 7d 0a 09 09 69 66 20 7b 5b 73 74 72 69 6e 67 20  }...if {[string 
06b0: 6c 65 6e 67 74 68 20 24 6e 5d 20 25 20 32 20 21  length $n] % 2 !
06c0: 3d 20 30 7d 20 7b 0a 09 09 09 73 65 74 20 6e 20  = 0} {....set n 
06d0: 22 30 24 6e 22 0a 09 09 7d 0a 0a 09 09 23 20 41  "0$n"...}....# A
06e0: 64 64 20 61 20 6c 65 61 64 69 6e 67 20 7a 65 72  dd a leading zer
06f0: 6f 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  o if the value i
0700: 73 20 68 69 67 68 20 65 6e 6f 75 67 68 0a 09 09  s high enough...
0710: 69 66 20 7b 22 30 78 5b 73 74 72 69 6e 67 20 72  if {"0x[string r
0720: 61 6e 67 65 20 24 6e 20 30 20 31 5d 22 20 3e 20  ange $n 0 1]" > 
0730: 30 78 37 66 7d 20 7b 0a 09 09 09 73 65 74 20 6e  0x7f} {....set n
0740: 20 22 30 30 24 6e 22 0a 09 09 7d 0a 0a 09 09 73   "00$n"...}....s
0750: 65 74 20 72 65 74 76 61 6c 20 22 5c 7b 0a 09 09  et retval "\{...
0760: 09 5c 22 70 75 62 6c 69 63 4b 65 79 5c 22 3a 20  .\"publicKey\": 
0770: 5c 7b 0a 09 09 09 09 5c 22 74 79 70 65 5c 22 3a  \{.....\"type\":
0780: 5c 22 5b 73 74 72 69 6e 67 20 74 6f 75 70 70 65  \"[string touppe
0790: 72 20 5b 64 69 63 74 20 67 65 74 20 24 63 65 72  r [dict get $cer
07a0: 74 20 74 79 70 65 5d 5d 5c 22 2c 0a 09 09 09 09  t type]]\",.....
07b0: 5c 22 65 5c 22 3a 5c 22 24 65 5c 22 2c 0a 09 09  \"e\":\"$e\",...
07c0: 09 09 5c 22 6e 5c 22 3a 5c 22 24 6e 5c 22 0a 09  ..\"n\":\"$n\"..
07d0: 09 09 5c 7d 2c 0a 09 09 09 5c 22 73 75 62 6a 65  ..\},....\"subje
07e0: 63 74 5c 22 3a 20 5c 22 5b 64 69 63 74 20 67 65  ct\": \"[dict ge
07f0: 74 20 24 63 65 72 74 20 73 75 62 6a 65 63 74 5d  t $cert subject]
0800: 5c 22 2c 0a 09 09 09 5c 22 69 73 73 75 65 72 5c  \",....\"issuer\
0810: 22 3a 20 5c 22 5b 64 69 63 74 20 67 65 74 20 24  ": \"[dict get $
0820: 63 65 72 74 20 69 73 73 75 65 72 5d 5c 22 2c 0a  cert issuer]\",.
0830: 09 09 09 5c 22 73 65 72 69 61 6c 5c 22 3a 20 5c  ...\"serial\": \
0840: 22 5b 64 69 63 74 20 67 65 74 20 24 63 65 72 74  "[dict get $cert
0850: 20 73 65 72 69 61 6c 5f 6e 75 6d 62 65 72 5d 5c   serial_number]\
0860: 22 0a 09 09 5c 7d 22 0a 0a 09 09 72 65 74 75 72  "...\}"....retur
0870: 6e 20 24 72 65 74 76 61 6c 0a 09 7d 0a 0a 09 3a  n $retval..}...:
0880: 3a 64 75 6b 74 61 70 65 3a 3a 74 63 6c 2d 66 75  :duktape::tcl-fu
0890: 6e 63 74 69 6f 6e 20 24 6a 73 48 61 6e 64 6c 65  nction $jsHandle
08a0: 20 5f 5f 63 72 79 70 74 6f 5f 73 75 62 74 6c 65   __crypto_subtle
08b0: 5f 64 69 67 65 73 74 20 62 79 74 65 61 72 72 61  _digest bytearra
08c0: 79 20 7b 68 61 73 68 20 64 61 74 61 7d 20 7b 0a  y {hash data} {.
08d0: 09 09 73 77 69 74 63 68 20 2d 65 78 61 63 74 20  ..switch -exact 
08e0: 2d 2d 20 24 68 61 73 68 20 7b 0a 09 09 09 22 53  -- $hash {...."S
08f0: 48 41 2d 32 35 36 22 20 7b 0a 09 09 09 09 70 61  HA-256" {.....pa
0900: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 73 68  ckage require sh
0910: 61 32 35 36 0a 09 09 09 09 72 65 74 75 72 6e 20  a256.....return 
0920: 5b 3a 3a 73 68 61 32 3a 3a 73 68 61 32 35 36 20  [::sha2::sha256 
0930: 2d 2d 20 24 64 61 74 61 5d 0a 09 09 09 7d 0a 09  -- $data]....}..
0940: 09 09 22 53 48 41 2d 31 22 20 7b 0a 09 09 09 09  .."SHA-1" {.....
0950: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
0960: 73 68 61 31 0a 09 09 09 09 72 65 74 75 72 6e 20  sha1.....return 
0970: 5b 3a 3a 73 68 61 31 3a 3a 73 68 61 31 20 2d 2d  [::sha1::sha1 --
0980: 20 24 64 61 74 61 5d 0a 09 09 09 7d 0a 09 09 09   $data]....}....
0990: 64 65 66 61 75 6c 74 20 7b 0a 09 09 09 09 65 72  default {.....er
09a0: 72 6f 72 20 22 48 61 73 68 20 6e 6f 74 20 73 75  ror "Hash not su
09b0: 70 70 6f 72 74 65 64 3a 20 24 68 61 73 68 22 0a  pported: $hash".
09c0: 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 3a 3a  ...}...}..}...::
09d0: 64 75 6b 74 61 70 65 3a 3a 65 76 61 6c 20 24 6a  duktape::eval $j
09e0: 73 48 61 6e 64 6c 65 20 7b 0a 09 09 63 72 79 70  sHandle {...cryp
09f0: 74 6f 2e 73 75 62 74 6c 65 2e 64 69 67 65 73 74  to.subtle.digest
0a00: 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 5f 5f 63 72  .internal = __cr
0a10: 79 70 74 6f 5f 73 75 62 74 6c 65 5f 64 69 67 65  ypto_subtle_dige
0a20: 73 74 3b 0a 09 09 64 65 6c 65 74 65 20 5f 5f 63  st;...delete __c
0a30: 72 79 70 74 6f 5f 73 75 62 74 6c 65 5f 64 69 67  rypto_subtle_dig
0a40: 65 73 74 3b 0a 09 7d 0a 0a 09 3a 3a 64 75 6b 74  est;..}...::dukt
0a50: 61 70 65 3a 3a 65 76 61 6c 20 24 6a 73 48 61 6e  ape::eval $jsHan
0a60: 64 6c 65 20 7b 0a 09 09 66 75 6e 63 74 69 6f 6e  dle {...function
0a70: 20 58 35 30 39 28 29 20 7b 0a 09 09 09 74 68 69   X509() {....thi
0a80: 73 2e 68 65 78 20 3d 20 22 22 3b 0a 09 09 09 74  s.hex = "";....t
0a90: 68 69 73 2e 72 65 61 64 43 65 72 74 48 65 78 20  his.readCertHex 
0aa0: 3d 20 66 75 6e 63 74 69 6f 6e 28 73 74 72 69 6e  = function(strin
0ab0: 67 29 20 7b 0a 09 09 09 09 74 68 69 73 2e 68 65  g) {.....this.he
0ac0: 78 20 3d 20 73 74 72 69 6e 67 3b 0a 09 09 09 7d  x = string;....}
0ad0: 3b 0a 09 09 09 74 68 69 73 2e 63 6f 6d 70 75 74  ;....this.comput
0ae0: 65 43 65 72 74 44 61 74 61 20 3d 20 66 75 6e 63  eCertData = func
0af0: 74 69 6f 6e 28 29 20 7b 0a 09 09 09 09 69 66 20  tion() {.....if 
0b00: 28 74 68 69 73 2e 63 65 72 74 44 61 74 61 29 20  (this.certData) 
0b10: 7b 0a 09 09 09 09 09 72 65 74 75 72 6e 3b 0a 09  {......return;..
0b20: 09 09 09 7d 0a 09 09 09 09 74 68 69 73 2e 63 65  ...}.....this.ce
0b30: 72 74 44 61 74 61 20 3d 20 58 35 30 39 2e 70 61  rtData = X509.pa
0b40: 72 73 65 43 65 72 74 28 74 68 69 73 2e 68 65 78  rseCert(this.hex
0b50: 29 3b 0a 09 09 09 09 74 68 69 73 2e 63 65 72 74  );.....this.cert
0b60: 44 61 74 61 2e 70 75 62 6c 69 63 4b 65 79 2e 6e  Data.publicKey.n
0b70: 20 3d 20 44 75 6b 74 61 70 65 2e 64 65 63 28 27   = Duktape.dec('
0b80: 68 65 78 27 2c 20 74 68 69 73 2e 63 65 72 74 44  hex', this.certD
0b90: 61 74 61 2e 70 75 62 6c 69 63 4b 65 79 2e 6e 29  ata.publicKey.n)
0ba0: 3b 0a 09 09 09 09 74 68 69 73 2e 63 65 72 74 44  ;.....this.certD
0bb0: 61 74 61 2e 70 75 62 6c 69 63 4b 65 79 2e 65 20  ata.publicKey.e 
0bc0: 3d 20 44 75 6b 74 61 70 65 2e 64 65 63 28 27 68  = Duktape.dec('h
0bd0: 65 78 27 2c 20 74 68 69 73 2e 63 65 72 74 44 61  ex', this.certDa
0be0: 74 61 2e 70 75 62 6c 69 63 4b 65 79 2e 65 29 3b  ta.publicKey.e);
0bf0: 0a 09 09 09 7d 0a 09 09 09 74 68 69 73 2e 67 65  ....}....this.ge
0c00: 74 50 75 62 6c 69 63 4b 65 79 20 3d 20 66 75 6e  tPublicKey = fun
0c10: 63 74 69 6f 6e 28 29 20 7b 0a 09 09 09 09 74 68  ction() {.....th
0c20: 69 73 2e 63 6f 6d 70 75 74 65 43 65 72 74 44 61  is.computeCertDa
0c30: 74 61 28 29 3b 0a 09 09 09 09 72 65 74 75 72 6e  ta();.....return
0c40: 28 74 68 69 73 2e 63 65 72 74 44 61 74 61 2e 70  (this.certData.p
0c50: 75 62 6c 69 63 4b 65 79 29 3b 0a 09 09 09 7d 3b  ublicKey);....};
0c60: 0a 09 09 09 74 68 69 73 2e 67 65 74 53 75 62 6a  ....this.getSubj
0c70: 65 63 74 53 74 72 69 6e 67 20 3d 20 66 75 6e 63  ectString = func
0c80: 74 69 6f 6e 28 29 20 7b 0a 09 09 09 09 74 68 69  tion() {.....thi
0c90: 73 2e 63 6f 6d 70 75 74 65 43 65 72 74 44 61 74  s.computeCertDat
0ca0: 61 28 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 28  a();.....return(
0cb0: 74 68 69 73 2e 63 65 72 74 44 61 74 61 2e 73 75  this.certData.su
0cc0: 62 6a 65 63 74 29 3b 0a 09 09 09 7d 3b 0a 09 09  bject);....};...
0cd0: 09 74 68 69 73 2e 67 65 74 45 78 74 53 75 62 6a  .this.getExtSubj
0ce0: 65 63 74 41 6c 74 4e 61 6d 65 32 20 3d 20 66 75  ectAltName2 = fu
0cf0: 6e 63 74 69 6f 6e 28 29 20 7b 0a 09 09 09 09 72  nction() {.....r
0d00: 65 74 75 72 6e 28 5b 5d 29 3b 0a 09 09 09 7d 0a  eturn([]);....}.
0d10: 09 09 7d 0a 09 09 58 35 30 39 2e 70 61 72 73 65  ..}...X509.parse
0d20: 43 65 72 74 20 3d 20 5f 5f 70 61 72 73 65 43 65  Cert = __parseCe
0d30: 72 74 3b 0a 09 09 64 65 6c 65 74 65 20 5f 5f 70  rt;...delete __p
0d40: 61 72 73 65 43 65 72 74 3b 0a 09 7d 0a 7d 0a 0a  arseCert;..}.}..
0d50: 70 72 6f 63 20 72 65 61 64 46 69 6c 65 20 7b 66  proc readFile {f
0d60: 69 6c 65 4e 61 6d 65 7d 20 7b 0a 09 69 66 20 7b  ileName} {..if {
0d70: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
0d80: 72 65 61 64 46 69 6c 65 28 24 66 69 6c 65 4e 61  readFile($fileNa
0d90: 6d 65 29 5d 7d 20 7b 0a 09 09 63 61 74 63 68 20  me)]} {...catch 
0da0: 7b 0a 09 09 09 73 65 74 20 66 64 20 5b 6f 70 65  {....set fd [ope
0db0: 6e 20 24 66 69 6c 65 4e 61 6d 65 5d 0a 09 09 09  n $fileName]....
0dc0: 73 65 74 20 3a 3a 72 65 61 64 46 69 6c 65 28 24  set ::readFile($
0dd0: 66 69 6c 65 4e 61 6d 65 29 20 5b 72 65 61 64 20  fileName) [read 
0de0: 24 66 64 5d 0a 09 09 7d 0a 09 09 63 61 74 63 68  $fd]...}...catch
0df0: 20 7b 0a 09 09 09 63 6c 6f 73 65 20 24 66 64 0a   {....close $fd.
0e00: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20  ..}..}...return 
0e10: 24 3a 3a 72 65 61 64 46 69 6c 65 28 24 66 69 6c  $::readFile($fil
0e20: 65 4e 61 6d 65 29 0a 7d 0a 0a 70 72 6f 63 20 69  eName).}..proc i
0e30: 6e 69 74 53 53 48 41 67 65 6e 74 20 7b 7d 20 7b  nitSSHAgent {} {
0e40: 0a 09 73 65 74 20 6a 73 48 61 6e 64 6c 65 20 5b  ..set jsHandle [
0e50: 3a 3a 64 75 6b 74 61 70 65 3a 3a 69 6e 69 74 20  ::duktape::init 
0e60: 2d 73 61 66 65 20 74 72 75 65 5d 0a 0a 09 3a 3a  -safe true]...::
0e70: 64 75 6b 74 61 70 65 3a 3a 74 63 6c 2d 66 75 6e  duktape::tcl-fun
0e80: 63 74 69 6f 6e 20 24 6a 73 48 61 6e 64 6c 65 20  ction $jsHandle 
0e90: 5f 5f 70 75 74 73 20 7b 61 72 67 73 7d 20 7b 0a  __puts {args} {.
0ea0: 09 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  ..if {[llength $
0eb0: 61 72 67 73 5d 20 6e 69 20 7b 31 20 32 7d 7d 20  args] ni {1 2}} 
0ec0: 7b 0a 09 09 09 72 65 74 75 72 6e 20 2d 63 6f 64  {....return -cod
0ed0: 65 20 65 72 72 6f 72 20 22 77 72 6f 6e 67 20 23  e error "wrong #
0ee0: 20 61 72 67 73 3a 20 70 75 74 73 20 3f 7b 73 74   args: puts ?{st
0ef0: 64 65 72 72 7c 73 74 64 6f 75 74 7d 3f 20 6d 65  derr|stdout}? me
0f00: 73 73 61 67 65 22 0a 09 09 7d 0a 09 09 69 66 20  ssage"...}...if 
0f10: 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d  {[llength $args]
0f20: 20 3d 3d 20 32 7d 20 7b 0a 09 09 09 73 65 74 20   == 2} {....set 
0f30: 63 68 61 6e 20 5b 6c 69 6e 64 65 78 20 24 61 72  chan [lindex $ar
0f40: 67 73 20 30 5d 0a 09 09 09 69 66 20 7b 24 63 68  gs 0]....if {$ch
0f50: 61 6e 20 6e 69 20 7b 73 74 64 6f 75 74 20 73 74  an ni {stdout st
0f60: 64 65 72 72 7d 7d 20 7b 0a 09 09 09 09 72 65 74  derr}} {.....ret
0f70: 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20  urn -code error 
0f80: 22 4f 6e 6c 79 20 73 74 64 65 72 72 20 61 6e 64  "Only stderr and
0f90: 20 73 74 64 6f 75 74 20 61 6c 6c 6f 77 65 64 22   stdout allowed"
0fa0: 0a 09 09 09 7d 0a 09 09 7d 0a 09 09 70 75 74 73  ....}...}...puts
0fb0: 20 7b 2a 7d 24 61 72 67 73 0a 09 7d 0a 0a 09 3a   {*}$args..}...:
0fc0: 3a 64 75 6b 74 61 70 65 3a 3a 65 76 61 6c 20 24  :duktape::eval $
0fd0: 6a 73 48 61 6e 64 6c 65 20 7b 0a 09 09 72 75 6e  jsHandle {...run
0fe0: 74 69 6d 65 20 3d 20 7b 7d 3b 0a 09 09 72 75 6e  time = {};...run
0ff0: 74 69 6d 65 2e 70 75 74 73 20 3d 20 5f 5f 70 75  time.puts = __pu
1000: 74 73 3b 0a 09 09 72 75 6e 74 69 6d 65 2e 73 74  ts;...runtime.st
1010: 64 65 72 72 20 3d 20 22 73 74 64 65 72 72 22 3b  derr = "stderr";
1020: 0a 09 09 64 65 6c 65 74 65 20 5f 5f 70 75 74 73  ...delete __puts
1030: 3b 0a 09 7d 0a 0a 09 3a 3a 64 75 6b 74 61 70 65  ;..}...::duktape
1040: 3a 3a 65 76 61 6c 20 24 6a 73 48 61 6e 64 6c 65  ::eval $jsHandle
1050: 20 7b 76 61 72 20 67 6f 6f 67 20 3d 20 7b 44 45   {var goog = {DE
1060: 42 55 47 3a 20 66 61 6c 73 65 7d 3b 7d 0a 09 3a  BUG: false};}..:
1070: 3a 64 75 6b 74 61 70 65 3a 3a 65 76 61 6c 20 24  :duktape::eval $
1080: 6a 73 48 61 6e 64 6c 65 20 5b 72 65 61 64 46 69  jsHandle [readFi
1090: 6c 65 20 63 68 72 6f 6d 65 2d 65 6d 75 2e 6a 73  le chrome-emu.js
10a0: 5d 0a 09 61 64 64 52 53 41 54 6f 4a 53 20 24 6a  ]..addRSAToJS $j
10b0: 73 48 61 6e 64 6c 65 0a 09 3a 3a 64 75 6b 74 61  sHandle..::dukta
10c0: 70 65 3a 3a 65 76 61 6c 20 24 6a 73 48 61 6e 64  pe::eval $jsHand
10d0: 6c 65 20 5b 72 65 61 64 46 69 6c 65 20 73 73 68  le [readFile ssh
10e0: 2d 61 67 65 6e 74 2d 6e 6f 61 73 79 6e 63 2e 6a  -agent-noasync.j
10f0: 73 5d 0a 09 3a 3a 64 75 6b 74 61 70 65 3a 3a 65  s]..::duktape::e
1100: 76 61 6c 20 24 6a 73 48 61 6e 64 6c 65 20 7b 63  val $jsHandle {c
1110: 61 63 6b 65 79 53 53 48 41 67 65 6e 74 46 65 61  ackeySSHAgentFea
1120: 74 75 72 65 73 2e 65 6e 61 62 6c 65 64 20 3d 20  tures.enabled = 
1130: 74 72 75 65 3b 7d 0a 09 3a 3a 64 75 6b 74 61 70  true;}..::duktap
1140: 65 3a 3a 65 76 61 6c 20 24 6a 73 48 61 6e 64 6c  e::eval $jsHandl
1150: 65 20 7b 63 61 63 6b 65 79 53 53 48 41 67 65 6e  e {cackeySSHAgen
1160: 74 46 65 61 74 75 72 65 73 2e 69 6e 63 6c 75 64  tFeatures.includ
1170: 65 43 65 72 74 73 20 3d 20 66 61 6c 73 65 3b 7d  eCerts = false;}
1180: 0a 09 3a 3a 64 75 6b 74 61 70 65 3a 3a 65 76 61  ..::duktape::eva
1190: 6c 20 24 6a 73 48 61 6e 64 6c 65 20 7b 63 61 63  l $jsHandle {cac
11a0: 6b 65 79 53 53 48 41 67 65 6e 74 46 65 61 74 75  keySSHAgentFeatu
11b0: 72 65 73 2e 6c 65 67 61 63 79 20 3d 20 66 61 6c  res.legacy = fal
11c0: 73 65 3b 7d 0a 09 3a 3a 64 75 6b 74 61 70 65 3a  se;}..::duktape:
11d0: 3a 65 76 61 6c 20 24 6a 73 48 61 6e 64 6c 65 20  :eval $jsHandle 
11e0: 7b 0a 09 09 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  {...function con
11f0: 6e 65 63 74 69 6f 6e 28 63 61 6c 6c 62 61 63 6b  nection(callback
1200: 29 20 7b 0a 09 09 09 74 68 69 73 2e 73 65 6e 64  ) {....this.send
1210: 65 72 20 3d 20 7b 0a 09 09 09 09 69 64 3a 20 22  er = {.....id: "
1220: 70 6e 68 65 63 68 61 70 66 61 69 6e 64 6a 68 6f  pnhechapfaindjho
1230: 6d 70 62 6e 66 6c 63 6c 64 61 62 62 67 68 6a 6f  mpbnflcldabbghjo
1240: 22 0a 09 09 09 7d 3b 0a 09 09 09 74 68 69 73 2e  "....};....this.
1250: 6f 6e 4d 65 73 73 61 67 65 20 3d 20 7b 0a 09 09  onMessage = {...
1260: 09 09 6c 69 73 74 65 6e 65 72 73 3a 20 5b 5d 2c  ..listeners: [],
1270: 0a 09 09 09 09 61 64 64 4c 69 73 74 65 6e 65 72  .....addListener
1280: 3a 20 66 75 6e 63 74 69 6f 6e 28 63 61 6c 6c 62  : function(callb
1290: 61 63 6b 29 20 7b 0a 09 09 09 09 09 74 68 69 73  ack) {......this
12a0: 2e 6c 69 73 74 65 6e 65 72 73 2e 70 75 73 68 28  .listeners.push(
12b0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 09 09 09 7d  callback);.....}
12c0: 0a 09 09 09 7d 3b 0a 09 09 09 74 68 69 73 2e 70  ....};....this.p
12d0: 6f 73 74 4d 65 73 73 61 67 65 20 3d 20 66 75 6e  ostMessage = fun
12e0: 63 74 69 6f 6e 28 6d 65 73 73 61 67 65 29 20 7b  ction(message) {
12f0: 0a 09 09 09 09 72 65 74 75 72 6e 28 63 61 6c 6c  .....return(call
1300: 62 61 63 6b 28 74 68 69 73 2c 20 6d 65 73 73 61  back(this, messa
1310: 67 65 29 29 3b 0a 09 09 09 7d 3b 0a 09 09 09 74  ge));....};....t
1320: 68 69 73 2e 73 65 6e 64 20 3d 20 66 75 6e 63 74  his.send = funct
1330: 69 6f 6e 28 6d 65 73 73 61 67 65 29 20 7b 0a 09  ion(message) {..
1340: 09 09 09 74 68 69 73 2e 6f 6e 4d 65 73 73 61 67  ...this.onMessag
1350: 65 2e 6c 69 73 74 65 6e 65 72 73 2e 66 6f 72 45  e.listeners.forE
1360: 61 63 68 28 66 75 6e 63 74 69 6f 6e 28 6c 69 73  ach(function(lis
1370: 74 65 6e 65 72 29 20 7b 0a 09 09 09 09 09 6c 69  tener) {......li
1380: 73 74 65 6e 65 72 28 6d 65 73 73 61 67 65 29 3b  stener(message);
1390: 0a 09 09 09 09 7d 29 3b 0a 09 09 09 7d 3b 0a 09  .....});....};..
13a0: 09 7d 0a 0a 09 09 66 75 6e 63 74 69 6f 6e 20 68  .}....function h
13b0: 61 6e 64 6c 65 44 61 74 61 46 72 6f 6d 41 67 65  andleDataFromAge
13c0: 6e 74 28 73 6f 63 6b 65 74 2c 20 64 61 74 61 29  nt(socket, data)
13d0: 20 7b 0a 09 09 09 69 66 20 28 21 64 61 74 61 20   {....if (!data 
13e0: 7c 7c 20 21 64 61 74 61 2e 74 79 70 65 20 7c 7c  || !data.type ||
13f0: 20 21 64 61 74 61 2e 64 61 74 61 29 20 7b 0a 09   !data.data) {..
1400: 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09 7d 0a  ...return;....}.
1410: 0a 09 09 09 69 66 20 28 64 61 74 61 2e 74 79 70  ....if (data.typ
1420: 65 20 21 3d 20 22 61 75 74 68 2d 61 67 65 6e 74  e != "auth-agent
1430: 40 6f 70 65 6e 73 73 68 2e 63 6f 6d 22 29 20 7b  @openssh.com") {
1440: 0a 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09  .....return;....
1450: 7d 0a 0a 09 09 09 77 72 69 74 65 46 72 61 6d 65  }.....writeFrame
1460: 64 28 73 6f 63 6b 65 74 2e 68 61 6e 64 6c 65 2c  d(socket.handle,
1470: 20 64 61 74 61 2e 64 61 74 61 29 3b 0a 09 09 7d   data.data);...}
1480: 0a 0a 09 09 66 75 6e 63 74 69 6f 6e 20 68 61 6e  ....function han
1490: 64 6c 65 44 61 74 61 46 72 6f 6d 53 6f 63 6b 65  dleDataFromSocke
14a0: 74 28 73 6f 63 6b 65 74 2c 20 64 61 74 61 29 20  t(socket, data) 
14b0: 7b 0a 09 09 09 73 6f 63 6b 65 74 2e 73 65 6e 64  {....socket.send
14c0: 28 7b 0a 09 09 09 09 74 79 70 65 3a 20 22 61 75  ({.....type: "au
14d0: 74 68 2d 61 67 65 6e 74 40 6f 70 65 6e 73 73 68  th-agent@openssh
14e0: 2e 63 6f 6d 22 2c 0a 09 09 09 09 64 61 74 61 3a  .com",.....data:
14f0: 20 41 72 72 61 79 2e 66 72 6f 6d 28 64 61 74 61   Array.from(data
1500: 29 0a 09 09 09 7d 29 3b 0a 09 09 7d 0a 0a 09 09  )....});...}....
1510: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 46 72  function writeFr
1520: 61 6d 65 64 28 73 6f 63 6b 2c 20 64 61 74 61 29  amed(sock, data)
1530: 20 7b 0a 09 09 09 76 61 72 20 62 75 66 66 65 72   {....var buffer
1540: 3b 0a 09 09 09 76 61 72 20 69 64 78 3b 0a 0a 09  ;....var idx;...
1550: 09 09 62 75 66 66 65 72 20 3d 20 6e 65 77 20 42  ..buffer = new B
1560: 75 66 66 65 72 28 64 61 74 61 2e 6c 65 6e 67 74  uffer(data.lengt
1570: 68 29 3b 0a 09 09 09 66 6f 72 20 28 69 64 78 20  h);....for (idx 
1580: 3d 20 30 3b 20 69 64 78 20 3c 20 64 61 74 61 2e  = 0; idx < data.
1590: 6c 65 6e 67 74 68 3b 20 69 64 78 2b 2b 29 20 7b  length; idx++) {
15a0: 0a 09 09 09 09 62 75 66 66 65 72 5b 69 64 78 5d  .....buffer[idx]
15b0: 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b 0a 09 09   = data[idx];...
15c0: 09 7d 0a 09 09 09 72 65 74 75 72 6e 28 77 72 69  .}....return(wri
15d0: 74 65 46 72 61 6d 65 64 42 75 66 66 65 72 28 73  teFramedBuffer(s
15e0: 6f 63 6b 2c 20 62 75 66 66 65 72 29 29 3b 0a 09  ock, buffer));..
15f0: 09 7d 0a 0a 09 09 66 75 6e 63 74 69 6f 6e 20 63  .}....function c
1600: 61 63 6b 65 79 4c 69 73 74 43 65 72 74 69 66 69  ackeyListCertifi
1610: 63 61 74 65 73 28 29 20 7b 0a 09 09 09 76 61 72  cates() {....var
1620: 20 63 65 72 74 73 3b 0a 09 09 09 76 61 72 20 63   certs;....var c
1630: 65 72 74 4f 62 6a 73 3b 0a 0a 09 09 09 63 65 72  ertObjs;.....cer
1640: 74 4f 62 6a 73 20 3d 20 5b 5d 3b 0a 09 09 09 63  tObjs = [];....c
1650: 65 72 74 73 20 3d 20 63 61 63 6b 65 79 4c 69 73  erts = cackeyLis
1660: 74 43 65 72 74 69 66 69 63 61 74 65 73 42 61 72  tCertificatesBar
1670: 65 28 29 3b 0a 09 09 09 63 65 72 74 73 2e 66 6f  e();....certs.fo
1680: 72 45 61 63 68 28 66 75 6e 63 74 69 6f 6e 28 63  rEach(function(c
1690: 65 72 74 29 20 7b 0a 09 09 09 09 63 65 72 74 4f  ert) {.....certO
16a0: 62 6a 73 2e 70 75 73 68 28 7b 0a 09 09 09 09 09  bjs.push({......
16b0: 63 65 72 74 69 66 69 63 61 74 65 3a 20 6e 65 77  certificate: new
16c0: 20 55 69 6e 74 38 41 72 72 61 79 28 63 65 72 74   Uint8Array(cert
16d0: 29 2c 0a 09 09 09 09 09 73 75 70 70 6f 72 74 65  ),......supporte
16e0: 64 48 61 73 68 65 73 3a 20 5b 27 53 48 41 31 27  dHashes: ['SHA1'
16f0: 2c 20 27 53 48 41 32 35 36 27 2c 20 27 53 48 41  , 'SHA256', 'SHA
1700: 35 31 32 27 2c 20 27 4d 44 35 5f 53 48 41 31 27  512', 'MD5_SHA1'
1710: 5d 0a 09 09 09 09 7d 29 3b 0a 09 09 09 7d 29 3b  ].....});....});
1720: 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 74  .....return(cert
1730: 4f 62 6a 73 29 3b 0a 09 09 7d 0a 0a 09 09 66 75  Objs);...}....fu
1740: 6e 63 74 69 6f 6e 20 63 61 63 6b 65 79 53 69 67  nction cackeySig
1750: 6e 4d 65 73 73 61 67 65 28 72 65 71 75 65 73 74  nMessage(request
1760: 29 20 7b 0a 09 09 09 76 61 72 20 72 65 74 76 61  ) {....var retva
1770: 6c 3b 0a 09 09 09 76 61 72 20 64 69 67 65 73 74  l;....var digest
1780: 2c 20 64 69 67 65 73 74 48 65 61 64 65 72 3b 0a  , digestHeader;.
1790: 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 58 58 58  ..../*.... * XXX
17a0: 3a 54 4f 44 4f 3a 20 50 75 6c 6c 20 74 68 69 73  :TODO: Pull this
17b0: 20 6f 75 74 20 6f 66 20 63 61 63 6b 65 79 2e 6a   out of cackey.j
17c0: 73 20 69 6e 74 6f 20 61 20 63 6f 6d 6d 6f 6e 2e  s into a common.
17d0: 6a 73 0a 09 09 09 20 2a 2f 0a 09 09 09 73 77 69  js.... */....swi
17e0: 74 63 68 20 28 72 65 71 75 65 73 74 2e 68 61 73  tch (request.has
17f0: 68 29 20 7b 0a 09 09 09 09 63 61 73 65 20 22 53  h) {.....case "S
1800: 48 41 31 22 3a 0a 09 09 09 09 09 64 69 67 65 73  HA1":......diges
1810: 74 48 65 61 64 65 72 20 3d 20 6e 65 77 20 55 69  tHeader = new Ui
1820: 6e 74 38 41 72 72 61 79 28 5b 30 78 33 30 2c 20  nt8Array([0x30, 
1830: 30 78 32 31 2c 20 30 78 33 30 2c 20 30 78 30 39  0x21, 0x30, 0x09
1840: 2c 20 30 78 30 36 2c 20 30 78 30 35 2c 20 30 78  , 0x06, 0x05, 0x
1850: 32 62 2c 20 30 78 30 65 2c 20 30 78 30 33 2c 20  2b, 0x0e, 0x03, 
1860: 30 78 30 32 2c 20 30 78 31 61 2c 20 30 78 30 35  0x02, 0x1a, 0x05
1870: 2c 20 30 78 30 30 2c 20 30 78 30 34 2c 20 30 78  , 0x00, 0x04, 0x
1880: 31 34 5d 29 3b 0a 09 09 09 09 09 62 72 65 61 6b  14]);......break
1890: 3b 0a 09 09 09 09 63 61 73 65 20 22 53 48 41 32  ;.....case "SHA2
18a0: 35 36 22 3a 0a 09 09 09 09 09 64 69 67 65 73 74  56":......digest
18b0: 48 65 61 64 65 72 20 3d 20 6e 65 77 20 55 69 6e  Header = new Uin
18c0: 74 38 41 72 72 61 79 28 5b 30 78 33 30 2c 20 30  t8Array([0x30, 0
18d0: 78 33 31 2c 20 30 78 33 30 2c 20 30 78 30 64 2c  x31, 0x30, 0x0d,
18e0: 20 30 78 30 36 2c 20 30 78 30 39 2c 20 30 78 36   0x06, 0x09, 0x6
18f0: 30 2c 20 30 78 38 36 2c 20 30 78 34 38 2c 20 30  0, 0x86, 0x48, 0
1900: 78 30 31 2c 20 30 78 36 35 2c 20 30 78 30 33 2c  x01, 0x65, 0x03,
1910: 20 30 78 30 34 2c 20 30 78 30 32 2c 20 30 78 30   0x04, 0x02, 0x0
1920: 31 2c 20 30 78 30 35 2c 20 30 78 30 30 2c 20 30  1, 0x05, 0x00, 0
1930: 78 30 34 2c 20 30 78 32 30 5d 29 3b 0a 09 09 09  x04, 0x20]);....
1940: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73  ..break;.....cas
1950: 65 20 22 53 48 41 35 31 32 22 3a 0a 09 09 09 09  e "SHA512":.....
1960: 09 64 69 67 65 73 74 48 65 61 64 65 72 20 3d 20  .digestHeader = 
1970: 6e 65 77 20 55 69 6e 74 38 41 72 72 61 79 28 5b  new Uint8Array([
1980: 30 78 33 30 2c 20 30 78 35 31 2c 20 30 78 33 30  0x30, 0x51, 0x30
1990: 2c 20 30 78 30 64 2c 20 30 78 30 36 2c 20 30 78  , 0x0d, 0x06, 0x
19a0: 30 39 2c 20 30 78 36 30 2c 20 30 78 38 36 2c 20  09, 0x60, 0x86, 
19b0: 30 78 34 38 2c 20 30 78 30 31 2c 20 30 78 36 35  0x48, 0x01, 0x65
19c0: 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78  , 0x03, 0x04, 0x
19d0: 30 32 2c 20 30 78 30 33 2c 20 30 78 30 35 2c 20  02, 0x03, 0x05, 
19e0: 30 78 30 30 2c 20 30 78 30 34 2c 20 30 78 34 30  0x00, 0x04, 0x40
19f0: 5d 29 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ]);......break;.
1a00: 09 09 09 09 63 61 73 65 20 22 4d 44 35 5f 53 48  ....case "MD5_SH
1a10: 41 31 22 3a 0a 09 09 09 09 63 61 73 65 20 22 52  A1":.....case "R
1a20: 41 57 22 3a 0a 09 09 09 09 09 64 69 67 65 73 74  AW":......digest
1a30: 48 65 61 64 65 72 20 3d 20 6e 65 77 20 55 69 6e  Header = new Uin
1a40: 74 38 41 72 72 61 79 28 29 3b 0a 09 09 09 09 09  t8Array();......
1a50: 62 72 65 61 6b 3b 0a 09 09 09 09 64 65 66 61 75  break;.....defau
1a60: 6c 74 3a 0a 09 09 09 09 09 63 6f 6e 73 6f 6c 65  lt:......console
1a70: 2e 65 72 72 6f 72 28 22 5b 63 61 63 6b 65 79 5d  .error("[cackey]
1a80: 20 41 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 61   Asked to sign a
1a90: 20 6d 65 73 73 61 67 65 20 77 69 74 68 20 61 20   message with a 
1aa0: 68 61 73 68 20 77 65 20 64 6f 20 6e 6f 74 20 73  hash we do not s
1ab0: 75 70 70 6f 72 74 3a 20 22 20 2b 20 72 65 71 75  upport: " + requ
1ac0: 65 73 74 2e 68 61 73 68 29 3b 0a 09 09 09 09 09  est.hash);......
1ad0: 72 65 74 75 72 6e 28 6e 75 6c 6c 29 3b 0a 09 09  return(null);...
1ae0: 09 7d 0a 0a 09 09 09 64 69 67 65 73 74 20 3d 20  .}.....digest = 
1af0: 41 72 72 61 79 2e 66 72 6f 6d 28 64 69 67 65 73  Array.from(diges
1b00: 74 48 65 61 64 65 72 29 3b 0a 09 09 09 64 69 67  tHeader);....dig
1b10: 65 73 74 20 3d 20 64 69 67 65 73 74 2e 63 6f 6e  est = digest.con
1b20: 63 61 74 28 41 72 72 61 79 2e 66 72 6f 6d 28 72  cat(Array.from(r
1b30: 65 71 75 65 73 74 2e 64 69 67 65 73 74 29 29 3b  equest.digest));
1b40: 0a 09 09 09 64 69 67 65 73 74 20 3d 20 6e 65 77  ....digest = new
1b50: 20 42 75 66 66 65 72 28 64 69 67 65 73 74 29 3b   Buffer(digest);
1b60: 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 63 61  .....retval = ca
1b70: 63 6b 65 79 53 69 67 6e 42 61 72 65 28 72 65 71  ckeySignBare(req
1b80: 75 65 73 74 2e 63 65 72 74 69 66 69 63 61 74 65  uest.certificate
1b90: 2c 20 64 69 67 65 73 74 29 3b 0a 0a 09 09 09 72  , digest);.....r
1ba0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09  eturn(retval);..
1bb0: 09 7d 0a 09 7d 0a 0a 09 3a 3a 64 75 6b 74 61 70  .}..}...::duktap
1bc0: 65 3a 3a 74 63 6c 2d 66 75 6e 63 74 69 6f 6e 20  e::tcl-function 
1bd0: 24 6a 73 48 61 6e 64 6c 65 20 77 72 69 74 65 46  $jsHandle writeF
1be0: 72 61 6d 65 64 42 75 66 66 65 72 20 7b 73 6f 63  ramedBuffer {soc
1bf0: 6b 20 6d 65 73 73 61 67 65 7d 20 7b 0a 09 09 73  k message} {...s
1c00: 65 74 20 64 61 74 61 4c 65 6e 20 5b 73 74 72 69  et dataLen [stri
1c10: 6e 67 20 6c 65 6e 67 74 68 20 24 6d 65 73 73 61  ng length $messa
1c20: 67 65 5d 0a 09 09 73 65 74 20 64 61 74 61 4c 65  ge]...set dataLe
1c30: 6e 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74  n [binary format
1c40: 20 49 20 24 64 61 74 61 4c 65 6e 5d 0a 09 09 70   I $dataLen]...p
1c50: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
1c60: 73 6f 63 6b 20 22 24 7b 64 61 74 61 4c 65 6e 7d  sock "${dataLen}
1c70: 24 7b 6d 65 73 73 61 67 65 7d 22 0a 09 09 66 6c  ${message}"...fl
1c80: 75 73 68 20 24 73 6f 63 6b 0a 0a 09 09 72 65 74  ush $sock....ret
1c90: 75 72 6e 20 22 22 0a 09 7d 0a 0a 09 3a 3a 64 75  urn ""..}...::du
1ca0: 6b 74 61 70 65 3a 3a 74 63 6c 2d 66 75 6e 63 74  ktape::tcl-funct
1cb0: 69 6f 6e 20 24 6a 73 48 61 6e 64 6c 65 20 72 65  ion $jsHandle re
1cc0: 61 64 46 72 61 6d 65 64 20 62 79 74 65 61 72 72  adFramed bytearr
1cd0: 61 79 20 7b 73 6f 63 6b 7d 20 7b 0a 09 09 63 61  ay {sock} {...ca
1ce0: 74 63 68 20 7b 0a 09 09 09 73 65 74 20 64 61 74  tch {....set dat
1cf0: 61 4c 65 6e 20 5b 72 65 61 64 20 24 73 6f 63 6b  aLen [read $sock
1d00: 20 34 5d 0a 09 09 7d 0a 09 09 69 66 20 7b 21 5b   4]...}...if {![
1d10: 69 6e 66 6f 20 65 78 69 73 74 73 20 64 61 74 61  info exists data
1d20: 4c 65 6e 5d 20 7c 7c 20 5b 73 74 72 69 6e 67 20  Len] || [string 
1d30: 6c 65 6e 67 74 68 20 24 64 61 74 61 4c 65 6e 5d  length $dataLen]
1d40: 20 21 3d 20 34 7d 20 7b 0a 09 09 09 63 6c 6f 73   != 4} {....clos
1d50: 65 20 24 73 6f 63 6b 0a 09 09 09 72 65 74 75 72  e $sock....retur
1d60: 6e 0a 09 09 7d 0a 0a 09 09 62 69 6e 61 72 79 20  n...}....binary 
1d70: 73 63 61 6e 20 24 64 61 74 61 4c 65 6e 20 49 20  scan $dataLen I 
1d80: 64 61 74 61 4c 65 6e 0a 0a 09 09 73 65 74 20 64  dataLen....set d
1d90: 61 74 61 20 5b 72 65 61 64 20 24 73 6f 63 6b 20  ata [read $sock 
1da0: 24 64 61 74 61 4c 65 6e 5d 0a 0a 09 09 72 65 74  $dataLen]....ret
1db0: 75 72 6e 20 24 64 61 74 61 0a 09 7d 0a 0a 0a 09  urn $data..}....
1dc0: 3a 3a 64 75 6b 74 61 70 65 3a 3a 74 63 6c 2d 66  ::duktape::tcl-f
1dd0: 75 6e 63 74 69 6f 6e 20 24 6a 73 48 61 6e 64 6c  unction $jsHandl
1de0: 65 20 63 61 63 6b 65 79 53 69 67 6e 42 61 72 65  e cackeySignBare
1df0: 20 62 79 74 65 61 72 72 61 79 20 7b 63 65 72 74   bytearray {cert
1e00: 20 6d 65 73 73 61 67 65 7d 20 7b 0a 09 09 73 65   message} {...se
1e10: 74 20 68 61 6e 64 6c 65 20 5b 70 6b 63 73 31 31  t handle [pkcs11
1e20: 4d 6f 64 75 6c 65 48 61 6e 64 6c 65 5d 0a 09 09  ModuleHandle]...
1e30: 73 65 74 20 63 65 72 74 49 6e 66 6f 20 5b 6c 69  set certInfo [li
1e40: 73 74 43 65 72 74 73 20 24 68 61 6e 64 6c 65 20  stCerts $handle 
1e50: 24 63 65 72 74 5d 0a 09 09 69 66 20 7b 21 5b 64  $cert]...if {![d
1e60: 69 63 74 20 65 78 69 73 74 73 20 24 63 65 72 74  ict exists $cert
1e70: 49 6e 66 6f 20 70 6b 63 73 31 31 5f 73 6c 6f 74  Info pkcs11_slot
1e80: 69 64 5d 7d 20 7b 0a 09 09 09 70 6b 63 73 31 31  id]} {....pkcs11
1e90: 4d 6f 64 75 6c 65 55 6e 6c 6f 61 64 20 24 68 61  ModuleUnload $ha
1ea0: 6e 64 6c 65 0a 09 09 09 72 65 74 75 72 6e 20 2d  ndle....return -
1eb0: 63 6f 64 65 20 65 72 72 6f 72 20 22 55 6e 61 62  code error "Unab
1ec0: 6c 65 20 74 6f 20 66 69 6e 64 20 63 65 72 74 69  le to find certi
1ed0: 66 69 63 61 74 65 20 74 6f 20 73 69 67 6e 20 77  ficate to sign w
1ee0: 69 74 68 22 0a 09 09 7d 0a 0a 09 09 73 65 74 20  ith"...}....set 
1ef0: 73 6c 6f 74 49 64 20 5b 64 69 63 74 20 67 65 74  slotId [dict get
1f00: 20 24 63 65 72 74 49 6e 66 6f 20 70 6b 63 73 31   $certInfo pkcs1
1f10: 31 5f 73 6c 6f 74 69 64 5d 0a 09 09 73 65 74 20  1_slotid]...set 
1f20: 64 61 74 61 20 5b 3a 3a 70 6b 69 3a 3a 73 69 67  data [::pki::sig
1f30: 6e 20 24 6d 65 73 73 61 67 65 20 24 63 65 72 74  n $message $cert
1f40: 49 6e 66 6f 20 72 61 77 5d 0a 0a 09 09 72 65 74  Info raw]....ret
1f50: 75 72 6e 20 24 64 61 74 61 0a 09 7d 0a 0a 09 3a  urn $data..}...:
1f60: 3a 64 75 6b 74 61 70 65 3a 3a 74 63 6c 2d 66 75  :duktape::tcl-fu
1f70: 6e 63 74 69 6f 6e 20 24 6a 73 48 61 6e 64 6c 65  nction $jsHandle
1f80: 20 63 61 63 6b 65 79 4c 69 73 74 43 65 72 74 69   cackeyListCerti
1f90: 66 69 63 61 74 65 73 42 61 72 65 20 7b 61 72 72  ficatesBare {arr
1fa0: 61 79 6c 69 73 74 20 62 79 74 65 61 72 72 61 79  aylist bytearray
1fb0: 7d 20 7b 7d 20 7b 0a 09 09 73 65 74 20 68 61 6e  } {} {...set han
1fc0: 64 6c 65 20 5b 70 6b 63 73 31 31 4d 6f 64 75 6c  dle [pkcs11Modul
1fd0: 65 48 61 6e 64 6c 65 5d 0a 09 09 72 65 74 75 72  eHandle]...retur
1fe0: 6e 20 5b 6c 69 73 74 43 65 72 74 73 20 24 68 61  n [listCerts $ha
1ff0: 6e 64 6c 65 5d 0a 09 7d 0a 0a 09 72 65 74 75 72  ndle]..}...retur
2000: 6e 20 24 6a 73 48 61 6e 64 6c 65 0a 7d 0a 0a 70  n $jsHandle.}..p
2010: 72 6f 63 20 6c 69 73 74 43 65 72 74 73 20 7b 68  roc listCerts {h
2020: 61 6e 64 6c 65 20 7b 6d 61 74 63 68 20 22 22 7d  andle {match ""}
2030: 7d 20 7b 0a 09 73 65 74 20 63 65 72 74 73 20 5b  } {..set certs [
2040: 6c 69 73 74 5d 0a 0a 09 73 65 74 20 73 6c 6f 74  list]...set slot
2050: 73 20 5b 3a 3a 70 6b 69 3a 3a 70 6b 63 73 31 31  s [::pki::pkcs11
2060: 3a 3a 6c 69 73 74 73 6c 6f 74 73 20 24 68 61 6e  ::listslots $han
2070: 64 6c 65 5d 0a 09 66 6f 72 65 61 63 68 20 73 6c  dle]..foreach sl
2080: 6f 74 49 6e 66 6f 20 24 73 6c 6f 74 73 20 7b 0a  otInfo $slots {.
2090: 09 09 73 65 74 20 73 6c 6f 74 49 64 20 5b 6c 69  ..set slotId [li
20a0: 6e 64 65 78 20 24 73 6c 6f 74 49 6e 66 6f 20 30  ndex $slotInfo 0
20b0: 5d 0a 09 09 73 65 74 20 73 6c 6f 74 4c 61 62 65  ]...set slotLabe
20c0: 6c 20 5b 6c 69 6e 64 65 78 20 24 73 6c 6f 74 49  l [lindex $slotI
20d0: 6e 66 6f 20 31 5d 0a 09 09 73 65 74 20 73 6c 6f  nfo 1]...set slo
20e0: 74 46 6c 61 67 73 20 5b 6c 69 6e 64 65 78 20 24  tFlags [lindex $
20f0: 73 6c 6f 74 49 6e 66 6f 20 32 5d 0a 0a 09 09 73  slotInfo 2]....s
2100: 65 74 20 73 6c 6f 74 43 65 72 74 73 20 5b 3a 3a  et slotCerts [::
2110: 70 6b 69 3a 3a 70 6b 63 73 31 31 3a 3a 6c 69 73  pki::pkcs11::lis
2120: 74 63 65 72 74 73 20 24 68 61 6e 64 6c 65 20 24  tcerts $handle $
2130: 73 6c 6f 74 49 64 5d 0a 09 09 66 6f 72 65 61 63  slotId]...foreac
2140: 68 20 6b 65 79 4c 69 73 74 20 24 73 6c 6f 74 43  h keyList $slotC
2150: 65 72 74 73 20 7b 0a 09 09 09 73 65 74 20 63 65  erts {....set ce
2160: 72 74 20 5b 64 69 63 74 20 67 65 74 20 24 6b 65  rt [dict get $ke
2170: 79 4c 69 73 74 20 72 61 77 5d 0a 09 09 09 73 65  yList raw]....se
2180: 74 20 63 65 72 74 20 5b 62 69 6e 61 72 79 20 64  t cert [binary d
2190: 65 63 6f 64 65 20 68 65 78 20 24 63 65 72 74 5d  ecode hex $cert]
21a0: 0a 09 09 09 69 66 20 7b 24 6d 61 74 63 68 20 65  ....if {$match e
21b0: 71 20 24 63 65 72 74 7d 20 7b 0a 09 09 09 09 72  q $cert} {.....r
21c0: 65 74 75 72 6e 20 24 6b 65 79 4c 69 73 74 0a 09  eturn $keyList..
21d0: 09 09 7d 0a 09 09 09 6c 61 70 70 65 6e 64 20 63  ..}....lappend c
21e0: 65 72 74 73 20 24 63 65 72 74 0a 09 09 7d 0a 09  erts $cert...}..
21f0: 7d 0a 0a 09 69 66 20 7b 24 6d 61 74 63 68 20 6e  }...if {$match n
2200: 65 20 22 22 7d 20 7b 0a 09 09 72 65 74 75 72 6e  e ""} {...return
2210: 20 5b 6c 69 73 74 5d 0a 09 7d 0a 0a 09 72 65 74   [list]..}...ret
2220: 75 72 6e 20 24 63 65 72 74 73 0a 7d 0a 0a 70 72  urn $certs.}..pr
2230: 6f 63 20 68 61 6e 64 6c 65 44 61 74 61 20 7b 73  oc handleData {s
2240: 6f 63 6b 20 6a 73 48 61 6e 64 6c 65 7d 20 7b 0a  ock jsHandle} {.
2250: 09 69 66 20 7b 5b 63 61 74 63 68 20 7b 0a 09 09  .if {[catch {...
2260: 3a 3a 64 75 6b 74 61 70 65 3a 3a 65 76 61 6c 20  ::duktape::eval 
2270: 24 6a 73 48 61 6e 64 6c 65 20 7b 68 61 6e 64 6c  $jsHandle {handl
2280: 65 44 61 74 61 46 72 6f 6d 53 6f 63 6b 65 74 28  eDataFromSocket(
2290: 73 6f 63 6b 65 74 2c 20 72 65 61 64 46 72 61 6d  socket, readFram
22a0: 65 64 28 73 6f 63 6b 65 74 2e 68 61 6e 64 6c 65  ed(socket.handle
22b0: 29 29 3b 7d 0a 09 7d 5d 7d 20 7b 0a 09 09 70 75  ));}..}]} {...pu
22c0: 74 73 20 73 74 64 65 72 72 20 22 45 52 52 4f 52  ts stderr "ERROR
22d0: 3a 20 24 3a 3a 65 72 72 6f 72 49 6e 66 6f 22 0a  : $::errorInfo".
22e0: 09 09 63 6c 6f 73 65 20 24 73 6f 63 6b 0a 09 7d  ..close $sock..}
22f0: 0a 7d 0a 0a 70 72 6f 63 20 69 6e 63 6f 6d 69 6e  .}..proc incomin
2300: 67 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 73 6f 63  gConnection {soc
2310: 6b 20 61 72 67 73 7d 20 7b 0a 09 69 66 20 7b 5b  k args} {..if {[
2320: 63 61 74 63 68 20 7b 0a 09 09 69 66 20 7b 21 5b  catch {...if {![
2330: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6a 73  info exists ::js
2340: 48 61 6e 64 6c 65 5d 7d 20 7b 0a 09 09 09 73 65  Handle]} {....se
2350: 74 20 3a 3a 6a 73 48 61 6e 64 6c 65 20 5b 69 6e  t ::jsHandle [in
2360: 69 74 53 53 48 41 67 65 6e 74 5d 0a 09 09 7d 0a  itSSHAgent]...}.
2370: 09 09 73 65 74 20 6a 73 48 61 6e 64 6c 65 20 24  ..set jsHandle $
2380: 3a 3a 6a 73 48 61 6e 64 6c 65 0a 0a 09 09 3a 3a  ::jsHandle....::
2390: 64 75 6b 74 61 70 65 3a 3a 65 76 61 6c 20 24 6a  duktape::eval $j
23a0: 73 48 61 6e 64 6c 65 20 7b 76 61 72 20 73 6f 63  sHandle {var soc
23b0: 6b 65 74 20 3d 20 6e 65 77 20 63 6f 6e 6e 65 63  ket = new connec
23c0: 74 69 6f 6e 28 68 61 6e 64 6c 65 44 61 74 61 46  tion(handleDataF
23d0: 72 6f 6d 41 67 65 6e 74 29 3b 7d 0a 09 09 3a 3a  romAgent);}...::
23e0: 64 75 6b 74 61 70 65 3a 3a 65 76 61 6c 20 24 6a  duktape::eval $j
23f0: 73 48 61 6e 64 6c 65 20 22 73 6f 63 6b 65 74 2e  sHandle "socket.
2400: 68 61 6e 64 6c 65 20 3d 20 5c 22 24 73 6f 63 6b  handle = \"$sock
2410: 5c 22 3b 22 0a 09 09 3a 3a 64 75 6b 74 61 70 65  \";"...::duktape
2420: 3a 3a 65 76 61 6c 20 24 6a 73 48 61 6e 64 6c 65  ::eval $jsHandle
2430: 20 7b 63 68 72 6f 6d 65 2e 72 75 6e 74 69 6d 65   {chrome.runtime
2440: 2e 65 78 74 65 72 6e 61 6c 43 6f 6e 6e 65 63 74  .externalConnect
2450: 28 73 6f 63 6b 65 74 29 3b 7d 0a 0a 09 09 66 63  (socket);}....fc
2460: 6f 6e 66 69 67 75 72 65 20 24 73 6f 63 6b 20 2d  onfigure $sock -
2470: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61  translation bina
2480: 72 79 20 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e  ry -encoding bin
2490: 61 72 79 20 2d 62 6c 6f 63 6b 69 6e 67 20 74 72  ary -blocking tr
24a0: 75 65 0a 09 09 66 69 6c 65 65 76 65 6e 74 20 24  ue...fileevent $
24b0: 73 6f 63 6b 20 72 65 61 64 61 62 6c 65 20 5b 6c  sock readable [l
24c0: 69 73 74 20 68 61 6e 64 6c 65 44 61 74 61 20 24  ist handleData $
24d0: 73 6f 63 6b 20 24 6a 73 48 61 6e 64 6c 65 5d 0a  sock $jsHandle].
24e0: 09 7d 5d 7d 20 7b 0a 09 09 70 75 74 73 20 73 74  .}]} {...puts st
24f0: 64 65 72 72 20 22 45 52 52 4f 52 3a 20 24 3a 3a  derr "ERROR: $::
2500: 65 72 72 6f 72 49 6e 66 6f 22 0a 09 09 63 6c 6f  errorInfo"...clo
2510: 73 65 20 24 73 6f 63 6b 0a 09 7d 0a 7d 0a 0a 3a  se $sock..}.}..:
2520: 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a  :tuapi::syscall:
2530: 3a 73 6f 63 6b 65 74 5f 75 6e 69 78 20 2d 73 65  :socket_unix -se
2540: 72 76 65 72 20 69 6e 63 6f 6d 69 6e 67 43 6f 6e  rver incomingCon
2550: 6e 65 63 74 69 6f 6e 20 22 2e 2f 61 67 65 6e 74  nection "./agent
2560: 22 0a 0a 76 77 61 69 74 20 66 6f 72 65 76 65 72  "..vwait forever
2570: 0a                                               .