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