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 }