prime8dev

prime8dev
git clone https://git.prime8.dev/prime8dev.git
Log | Files | Refs | README | LICENSE

kex_test.go (1364B)


      1 package ssh
      2 
      3 import (
      4 	"crypto/ed25519"
      5 	"crypto/rand"
      6 	"net"
      7 	"testing"
      8 
      9 	gossh "golang.org/x/crypto/ssh"
     10 )
     11 
     12 // TestPostQuantumKeyExchange checks that a client offering only
     13 // mlkem768x25519-sha256 completes the handshake against our KEX list.
     14 func TestPostQuantumKeyExchange(t *testing.T) {
     15 	_, priv, err := ed25519.GenerateKey(rand.Reader)
     16 	if err != nil {
     17 		t.Fatal(err)
     18 	}
     19 	signer, err := gossh.NewSignerFromKey(priv)
     20 	if err != nil {
     21 		t.Fatal(err)
     22 	}
     23 	cfg := &gossh.ServerConfig{Config: gossh.Config{KeyExchanges: keyExchanges}, NoClientAuth: true}
     24 	cfg.AddHostKey(signer)
     25 
     26 	ln, err := net.Listen("tcp", "127.0.0.1:0")
     27 	if err != nil {
     28 		t.Fatal(err)
     29 	}
     30 	defer ln.Close()
     31 	errc := make(chan error, 1)
     32 	go func() {
     33 		serverConn, err := ln.Accept()
     34 		if err != nil {
     35 			errc <- err
     36 			return
     37 		}
     38 		defer serverConn.Close()
     39 		conn, _, _, err := gossh.NewServerConn(serverConn, cfg)
     40 		if err == nil {
     41 			conn.Close()
     42 		}
     43 		errc <- err
     44 	}()
     45 
     46 	client, err := gossh.Dial("tcp", ln.Addr().String(), &gossh.ClientConfig{
     47 		User:            "visitor",
     48 		Config:          gossh.Config{KeyExchanges: []string{gossh.KeyExchangeMLKEM768X25519}},
     49 		HostKeyCallback: gossh.InsecureIgnoreHostKey(),
     50 	})
     51 	if err != nil {
     52 		t.Fatalf("mlkem768x25519-sha256 handshake failed: %v", err)
     53 	}
     54 	client.Close()
     55 	if err := <-errc; err != nil {
     56 		t.Fatalf("server side: %v", err)
     57 	}
     58 }