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 .