github.com/psiphon-labs/psiphon-tunnel-core@v2.0.28+incompatible/psiphon/common/crypto/ssh/transport_test.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package ssh 6 7 import ( 8 "bytes" 9 "crypto/rand" 10 "encoding/binary" 11 "strings" 12 "testing" 13 ) 14 15 func TestReadVersion(t *testing.T) { 16 longVersion := strings.Repeat("SSH-2.0-bla", 50)[:253] 17 multiLineVersion := strings.Repeat("ignored\r\n", 20) + "SSH-2.0-bla\r\n" 18 cases := map[string]string{ 19 "SSH-2.0-bla\r\n": "SSH-2.0-bla", 20 "SSH-2.0-bla\n": "SSH-2.0-bla", 21 multiLineVersion: "SSH-2.0-bla", 22 longVersion + "\r\n": longVersion, 23 } 24 25 for in, want := range cases { 26 result, err := readVersion(bytes.NewBufferString(in)) 27 if err != nil { 28 t.Errorf("readVersion(%q): %s", in, err) 29 } 30 got := string(result) 31 if got != want { 32 t.Errorf("got %q, want %q", got, want) 33 } 34 } 35 } 36 37 func TestReadVersionError(t *testing.T) { 38 longVersion := strings.Repeat("SSH-2.0-bla", 50)[:253] 39 multiLineVersion := strings.Repeat("ignored\r\n", 50) + "SSH-2.0-bla\r\n" 40 cases := []string{ 41 longVersion + "too-long\r\n", 42 multiLineVersion, 43 } 44 for _, in := range cases { 45 if _, err := readVersion(bytes.NewBufferString(in)); err == nil { 46 t.Errorf("readVersion(%q) should have failed", in) 47 } 48 } 49 } 50 51 func TestExchangeVersionsBasic(t *testing.T) { 52 v := "SSH-2.0-bla" 53 buf := bytes.NewBufferString(v + "\r\n") 54 them, err := exchangeVersions(buf, []byte("xyz")) 55 if err != nil { 56 t.Errorf("exchangeVersions: %v", err) 57 } 58 59 if want := "SSH-2.0-bla"; string(them) != want { 60 t.Errorf("got %q want %q for our version", them, want) 61 } 62 } 63 64 func TestExchangeVersions(t *testing.T) { 65 cases := []string{ 66 "not\x000allowed", 67 "not allowed\x01\r\n", 68 } 69 for _, c := range cases { 70 buf := bytes.NewBufferString("SSH-2.0-bla\r\n") 71 if _, err := exchangeVersions(buf, []byte(c)); err == nil { 72 t.Errorf("exchangeVersions(%q): should have failed", c) 73 } 74 } 75 } 76 77 type closerBuffer struct { 78 bytes.Buffer 79 } 80 81 func (b *closerBuffer) Close() error { 82 return nil 83 } 84 85 func TestTransportMaxPacketWrite(t *testing.T) { 86 buf := &closerBuffer{} 87 tr := newTransport(buf, rand.Reader, true) 88 huge := make([]byte, maxPacket+1) 89 err := tr.writePacket(huge) 90 if err == nil { 91 t.Errorf("transport accepted write for a huge packet.") 92 } 93 } 94 95 func TestTransportMaxPacketReader(t *testing.T) { 96 var header [5]byte 97 huge := make([]byte, maxPacket+128) 98 binary.BigEndian.PutUint32(header[0:], uint32(len(huge))) 99 // padding. 100 header[4] = 0 101 102 buf := &closerBuffer{} 103 buf.Write(header[:]) 104 buf.Write(huge) 105 106 tr := newTransport(buf, rand.Reader, true) 107 _, err := tr.readPacket() 108 if err == nil { 109 t.Errorf("transport succeeded reading huge packet.") 110 } else if !strings.Contains(err.Error(), "large") { 111 t.Errorf("got %q, should mention %q", err.Error(), "large") 112 } 113 }