Check-in [24e37c4dab]
Overview
Comment:More testing of the Tcl implementation of the SSH agent
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1:24e37c4dabf274f87e5522c425afc4e7fb61cf9e
User & Date: rkeene on 2019-06-12 22:41:22
Other Links: manifest | tags
Context
2019-08-08
16:52
Added softokn3 wrapper module check-in: 3eb54f93b1 user: rkeene tags: trunk
2019-06-12
22:41
More testing of the Tcl implementation of the SSH agent check-in: 24e37c4dab user: rkeene tags: trunk
19:40
Tcl-based interface to JS SSH Agent check-in: 7ef094be65 user: rkeene tags: trunk
Changes

Modified build/tcl/ssh-agent.tcl from [757d0fe647] to [3e65cda43f].

     1      1   #! /usr/bin/env tclsh
     2      2   
     3         -lappend auto_path /home/rkeene/devel/tcl-duktape/build/work /home/rkeene/devel/tuapi /home/rkeene/devel/tclpkcs11-fossil/build/work {*}[glob -nocomplain -directory /opt/appfs/rkeene.org/tcllib/platform/latest/lib/ tcllib*]
            3  +if {[info exists ::env(SSH_AGENT_LIB_PATH)]} {
            4  +	lappend auto_path {*}$::env(SSH_AGENT_LIB_PATH)
            5  +}
     4      6   
     5         -package provide pki 0.10
     6         -catch {
     7         -	source /home/rkeene/devel/tcllib-pki/pki.tcl
            7  +if {[info exists ::env(SSH_AGENT_PKCS11_MODULE)]} {
            8  +	set ::pkcs11ModuleFilename $::env(SSH_AGENT_PKCS11_MODULE)
            9  +} else {
           10  +	set ::pkcs11ModuleFilename /home/rkeene/tmp/cackey/build/tcl/softokn3-pkcs11.so
     8     11   }
     9         -package require duktape
           12  +
           13  +package require duktape 0.7
    10     14   package require tuapi
    11         -package require pki::pkcs11
           15  +package require pki 0.6
           16  +package require pki::pkcs11 0.9.9
           17  +
           18  +## HACK: Fix up older versions of "pki" to include the raw certificate
           19  +##       this is needed
           20  +apply {{} {
           21  +	set procToUpdate ::pki::x509::parse_cert
           22  +	if {![string match "*set ret(raw)*" [info body $procToUpdate]]} {
           23  +		set body [info body $procToUpdate]
           24  +		set body [string map {
           25  +			"::asn::asnGetSequence cert_seq wholething"
           26  +			"set ret(raw) $cert_seq; binary scan $ret(raw) H* ret(raw); ::asn::asnGetSequence cert_seq wholething"
           27  +		} $body]
           28  +		proc $procToUpdate [info args $procToUpdate] $body
           29  +	}
           30  +}}
    12     31   
    13     32   proc pkcs11ModuleHandle {} {
    14     33   	if {![info exists ::pkcs11ModuleHandle]} {
    15         -		set ::pkcs11ModuleHandle [::pki::pkcs11::loadmodule /home/rkeene/tmp/cackey/build/tcl/softokn3-pkcs11.so]
           34  +		set ::pkcs11ModuleHandle [::pki::pkcs11::loadmodule $::pkcs11ModuleFilename]
    16     35   	}
    17     36   	return $::pkcs11ModuleHandle
    18     37   }
    19     38   
    20     39   proc pkcs11ModuleUnload {handle} {
    21     40   	if {[info exists ::pkcs11ModuleHandle] && $handle eq $::pkcs11ModuleHandle} {
    22     41   		unset ::pkcs11ModuleHandle
................................................................................
   107    126   			}
   108    127   		}
   109    128   		X509.parseCert = __parseCert;
   110    129   		delete __parseCert;
   111    130   	}
   112    131   }
   113    132   
   114         -proc initSSHAgent {} {
   115         -	foreach file {chrome-emu.js ssh-agent-noasync.js} {
   116         -		unset -nocomplain fd
          133  +proc readFile {fileName} {
          134  +	if {![info exists ::readFile($fileName)]} {
   117    135   		catch {
   118         -			set fd [open $file]
   119         -			set js($file) [read $fd]
          136  +			set fd [open $fileName]
          137  +			set ::readFile($fileName) [read $fd]
   120    138   		}
   121    139   		catch {
   122    140   			close $fd
   123    141   		}
   124    142   	}
   125    143   
          144  +	return $::readFile($fileName)
          145  +}
          146  +
          147  +proc initSSHAgent {} {
   126    148   	set jsHandle [::duktape::init -safe true]
   127    149   
   128    150   	::duktape::tcl-function $jsHandle __puts {args} {
   129    151   		if {[llength $args] ni {1 2}} {
   130    152   			return -code error "wrong # args: puts ?{stderr|stdout}? message"
   131    153   		}
   132    154   		if {[llength $args] == 2} {
................................................................................
   142    164   		runtime = {};
   143    165   		runtime.puts = __puts;
   144    166   		runtime.stderr = "stderr";
   145    167   		delete __puts;
   146    168   	}
   147    169   
   148    170   	::duktape::eval $jsHandle {var goog = {DEBUG: false};}
   149         -	::duktape::eval $jsHandle $js(chrome-emu.js)
          171  +	::duktape::eval $jsHandle [readFile chrome-emu.js]
   150    172   	addRSAToJS $jsHandle
   151         -	::duktape::eval $jsHandle $js(ssh-agent-noasync.js)
          173  +	::duktape::eval $jsHandle [readFile ssh-agent-noasync.js]
   152    174   	::duktape::eval $jsHandle {cackeySSHAgentFeatures.enabled = true;}
   153         -	::duktape::eval $jsHandle {cackeySSHAgentFeatures.includeCerts = true;}
          175  +	::duktape::eval $jsHandle {cackeySSHAgentFeatures.includeCerts = false;}
          176  +	::duktape::eval $jsHandle {cackeySSHAgentFeatures.legacy = false;}
   154    177   	::duktape::eval $jsHandle {
   155    178   		function connection(callback) {
   156    179   			this.sender = {
   157    180   				id: "pnhechapfaindjhompbnflcldabbghjo"
   158    181   			};
   159    182   			this.onMessage = {
   160    183   				listeners: [],
................................................................................
   336    359   		puts stderr "ERROR: $::errorInfo"
   337    360   		close $sock
   338    361   	}
   339    362   }
   340    363   
   341    364   proc incomingConnection {sock args} {
   342    365   	if {[catch {
   343         -		set jsHandle [initSSHAgent]
          366  +		if {![info exists ::jsHandle]} {
          367  +			set ::jsHandle [initSSHAgent]
          368  +		}
          369  +		set jsHandle $::jsHandle
   344    370   
   345    371   		::duktape::eval $jsHandle {var socket = new connection(handleDataFromAgent);}
   346    372   		::duktape::eval $jsHandle "socket.handle = \"$sock\";"
   347    373   		::duktape::eval $jsHandle {chrome.runtime.externalConnect(socket);}
   348    374   
   349    375   		fconfigure $sock -translation binary -encoding binary -blocking true
   350    376   		fileevent $sock readable [list handleData $sock $jsHandle]