1 package reverseproxy 2 3 import ( 4 "bytes" 5 "errors" 6 "testing" 7 8 "vimagination.zapto.org/memio" 9 ) 10 11 var tlsBase = [...]byte{ 12 22, // TLS Handshake 13 3, 3, // Version 14 0, 0, // Length of TLS Fragment 15 1, // CLIENT_HELLO 16 0, 0, 0, // Length of body 17 3, 3, // Version 18 0, 0, 0, 0, // Unix Time 19 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, // Random 20 0, // Session ID 21 0, 2, // Cipher Suite Length 22 0, 0, // Cipher Suite 23 1, 0, // Compression (Length + ) Method 24 } 25 26 func tlsServerName(name string) []byte { 27 l := len(name) 28 buf := make([]byte, len(tlsBase), len(tlsBase)+11+l) 29 copy(buf, tlsBase[:]) 30 buf[3] = byte((56 + l) >> 8) 31 buf[4] = byte(56 + l) 32 buf[7] = byte((52 + l) >> 8) 33 buf[8] = byte(52 + l) 34 return append(append(buf, byte((l+9)>>8), byte(l+9), 0, 0, byte((l+5)>>8), byte(l+5), byte((l+3)>>8), byte(l+3), 0, byte(l>>8), byte(l)), name...) 35 } 36 37 func TestTLS(t *testing.T) { 38 buf := tlsServerName("aaa.com") 39 rBuf := make([]byte, 100) 40 rBuf[0] = buf[0] 41 aBuf := memio.Buffer(buf[1:]) 42 name, b, err := readTLSServerName(&aBuf, rBuf) 43 if err != nil { 44 t.Errorf("test 1: unexpected error, %s", err) 45 return 46 } 47 if name != "aaa.com" { 48 t.Errorf("test 1: expecting name \"aaa.com\", got %q", name) 49 return 50 } 51 if !bytes.Equal(buf, b) { 52 t.Errorf("test 1: expecting bytes %v, got %v", buf, b) 53 return 54 } 55 buf = tlsServerName("example.com") 56 aBuf = memio.Buffer(buf[1:]) 57 name, b, err = readTLSServerName(&aBuf, rBuf) 58 if err != nil { 59 t.Errorf("test 2: unexpected error, %s", err) 60 return 61 } 62 if name != "example.com" { 63 t.Errorf("test 2: expecting name \"example.com\", got %q", name) 64 return 65 } 66 if !bytes.Equal(buf, b) { 67 t.Errorf("test 2: expecting bytes %v, got %v", buf, b) 68 return 69 } 70 buf = tlsServerName("") 71 buf[52] = 1 72 aBuf = memio.Buffer(buf[1:]) 73 _, _, err = readTLSServerName(&aBuf, rBuf) 74 if !errors.Is(err, errNoName) { 75 t.Errorf("test 3: expecting error errNoName, got, %s", err) 76 return 77 } 78 } 79