mirror of https://gogs.blitter.com/RLabs/xs
				
				
				
			-BREAKING CHANGE: pre-KEx byte sent for KEx alg (default and only for now: KEX_HERRADURA)
This commit is contained in:
		
							parent
							
								
									5f1d57f987
								
							
						
					
					
						commit
						dcb42d43f1
					
				| 
						 | 
				
			
			@ -9,6 +9,14 @@
 | 
			
		|||
 | 
			
		||||
package hkexnet
 | 
			
		||||
 | 
			
		||||
// TODO:
 | 
			
		||||
// If key exchange algs other than the experimental HerraduraKEx are to
 | 
			
		||||
// be supported, the Dial() and Accept() methods should take a kex param,
 | 
			
		||||
// specifying which to use; and the client/server negotiation must then
 | 
			
		||||
// prefix the channel setup with this param over the wire in order to decide
 | 
			
		||||
// which is in use.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// Implementation of HKEx-wrapped versions of the golang standard
 | 
			
		||||
// net package interfaces, allowing clients and servers to simply replace
 | 
			
		||||
// 'net.Dial' and 'net.Listen' with 'hkex.Dial' and 'hkex.Listen'
 | 
			
		||||
| 
						 | 
				
			
			@ -34,6 +42,17 @@ import (
 | 
			
		|||
	"blitter.com/go/hkexsh/herradurakex"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// KEx type - sent from client to server in order to specify which
 | 
			
		||||
// algo shall be used (eg., HerraduraKEx, [TODO: others...])
 | 
			
		||||
type KEX uint8
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	KEX_HERRADURA = iota // this MUST be first for default if omitted in ctor
 | 
			
		||||
	//KEX_FOO
 | 
			
		||||
	//KEX_DH
 | 
			
		||||
	//KEX_ETC
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// const CSExtendedCode - extended (>255 UNIX exit status) codes
 | 
			
		||||
// This indicate channel-related or internal errors
 | 
			
		||||
const (
 | 
			
		||||
| 
						 | 
				
			
			@ -76,6 +95,7 @@ type (
 | 
			
		|||
 | 
			
		||||
	// Conn is a HKex connection - a superset of net.Conn
 | 
			
		||||
	Conn struct {
 | 
			
		||||
		kex        KEX
 | 
			
		||||
		m          *sync.Mutex
 | 
			
		||||
		c          net.Conn // which also implements io.Reader, io.Writer, ...
 | 
			
		||||
		h          *hkex.HerraduraKEx
 | 
			
		||||
| 
						 | 
				
			
			@ -146,6 +166,14 @@ func (hc *Conn) SetOpts(opts uint32) {
 | 
			
		|||
func (hc *Conn) applyConnExtensions(extensions ...string) {
 | 
			
		||||
	for _, s := range extensions {
 | 
			
		||||
		switch s {
 | 
			
		||||
		case "KEX_HERRADURA":
 | 
			
		||||
			log.Println("[extension arg = KEX_HERRADURA]")
 | 
			
		||||
			hc.kex = KEX_HERRADURA
 | 
			
		||||
			break
 | 
			
		||||
		//case "KEX_FOO":
 | 
			
		||||
		//	log.Println("[extension arg = KEX_FOO]")
 | 
			
		||||
		//	hc.kex = KEX_FOO
 | 
			
		||||
		//	break
 | 
			
		||||
		case "C_AES_256":
 | 
			
		||||
			log.Println("[extension arg = C_AES_256]")
 | 
			
		||||
			hc.cipheropts &= (0xFFFFFF00)
 | 
			
		||||
| 
						 | 
				
			
			@ -173,7 +201,9 @@ func (hc *Conn) applyConnExtensions(extensions ...string) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dial as net.Dial(), but with implicit HKEx PeerD read on connect
 | 
			
		||||
// Dial as net.Dial(), but with implicit key exchange to set up secure
 | 
			
		||||
// channel on connect
 | 
			
		||||
//
 | 
			
		||||
//   Can be called like net.Dial(), defaulting to C_AES_256/H_SHA256,
 | 
			
		||||
//   or additional option arguments can be passed amongst the following:
 | 
			
		||||
//
 | 
			
		||||
| 
						 | 
				
			
			@ -187,9 +217,17 @@ func Dial(protocol string, ipport string, extensions ...string) (hc *Conn, err e
 | 
			
		|||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	// Init hkexnet.Conn hc over net.Conn c
 | 
			
		||||
	// NOTE: kex default of KEX_HERRADURA may be overridden by
 | 
			
		||||
	// future extension args to applyConnExtensions(), which is
 | 
			
		||||
	// called prior to Dial()
 | 
			
		||||
	hc = &Conn{m: &sync.Mutex{}, c: c, closeStat: new(uint32), h: hkex.New(0, 0), dBuf: new(bytes.Buffer)}
 | 
			
		||||
	hc.applyConnExtensions(extensions...)
 | 
			
		||||
 | 
			
		||||
	// TODO: Factor out ALL params following this to helpers for
 | 
			
		||||
	// specific KEx algs
 | 
			
		||||
	fmt.Fprintf(c, "%02x\n", hc.kex)
 | 
			
		||||
	// --
 | 
			
		||||
 | 
			
		||||
	// Send hkexnet.Conn parameters to remote side
 | 
			
		||||
	// d is value for Herradura key exchange
 | 
			
		||||
	fmt.Fprintf(c, "0x%s\n%08x:%08x\n", hc.h.D().Text(16),
 | 
			
		||||
| 
						 | 
				
			
			@ -326,9 +364,19 @@ func (hl *HKExListener) Accept() (hc Conn, err error) {
 | 
			
		|||
	}
 | 
			
		||||
	log.Println("[Accepted]")
 | 
			
		||||
 | 
			
		||||
	hc = Conn{m: &sync.Mutex{}, c: c, h: hkex.New(0, 0), closeStat: new(uint32), WinCh: make(chan WinSize, 1),
 | 
			
		||||
	hc = Conn{ /*kex: from client,*/ m: &sync.Mutex{}, c: c, h: hkex.New(0, 0), closeStat: new(uint32), WinCh: make(chan WinSize, 1),
 | 
			
		||||
		dBuf: new(bytes.Buffer)}
 | 
			
		||||
 | 
			
		||||
	// TODO: Factor out ALL params following this to helpers for
 | 
			
		||||
	// specific KEx algs
 | 
			
		||||
	var kexAlg uint8
 | 
			
		||||
	_, err = fmt.Fscanln(c, &kexAlg)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return hc, err
 | 
			
		||||
	}
 | 
			
		||||
	log.Printf("[KEx alg: %v]\n", kexAlg)
 | 
			
		||||
	// --
 | 
			
		||||
 | 
			
		||||
	// Read in hkexnet.Conn parameters over raw Conn c
 | 
			
		||||
	// d is value for Herradura key exchange
 | 
			
		||||
	d := big.NewInt(0)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -478,7 +478,7 @@ func main() {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	conn, err := hkexnet.Dial("tcp", server, cAlg, hAlg)
 | 
			
		||||
	conn, err := hkexnet.Dial("tcp", server, /*[kexAlg eg. "KEX_HERRADURA"], */ cAlg, hAlg)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("Err!")
 | 
			
		||||
		panic(err)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue