Browse Source

Remove old faketls package

tags/v2.2.0^2^2
9seconds 1 month ago
parent
commit
00403e3a94
31 changed files with 0 additions and 1302 deletions
  1. 0
    134
      mtglib/internal/faketls/client_hello.go
  2. 0
    21
      mtglib/internal/faketls/client_hello_fuzz_test.go
  3. 0
    191
      mtglib/internal/faketls/client_hello_test.go
  4. 0
    72
      mtglib/internal/faketls/conn.go
  5. 0
    153
      mtglib/internal/faketls/conn_test.go
  6. 0
    59
      mtglib/internal/faketls/init.go
  7. 0
    84
      mtglib/internal/faketls/record/init.go
  8. 0
    79
      mtglib/internal/faketls/record/init_test.go
  9. 0
    20
      mtglib/internal/faketls/record/pools.go
  10. 0
    86
      mtglib/internal/faketls/record/record.go
  11. 0
    110
      mtglib/internal/faketls/record/record_test.go
  12. 0
    6
      mtglib/internal/faketls/record/testdata/05eb6b71f87b6802.json
  13. 0
    6
      mtglib/internal/faketls/record/testdata/4eef4abc15b206b6.json
  14. 0
    6
      mtglib/internal/faketls/record/testdata/736f358216afe91f.json
  15. 0
    6
      mtglib/internal/faketls/record/testdata/8405d94222bd0b6a.json
  16. 0
    6
      mtglib/internal/faketls/record/testdata/9036f76e517f0cd1.json
  17. 0
    6
      mtglib/internal/faketls/record/testdata/9244766a0fe4a02a.json
  18. 0
    6
      mtglib/internal/faketls/record/testdata/9255c73d3de76e7b.json
  19. 0
    6
      mtglib/internal/faketls/record/testdata/aeb65b9924315cf8.json
  20. 0
    6
      mtglib/internal/faketls/record/testdata/b0acd44296056b54.json
  21. 0
    6
      mtglib/internal/faketls/record/testdata/c0545a13fd9a3fa3.json
  22. 0
    6
      mtglib/internal/faketls/record/testdata/f083f4501668b759.json
  23. 0
    6
      mtglib/internal/faketls/record/testdata/f5696bcdffd11706.json
  24. 0
    8
      mtglib/internal/faketls/testdata/client-hello-bad-fa2e46cdb33e2a1b.json
  25. 0
    8
      mtglib/internal/faketls/testdata/client-hello-ok-19dfe38384b9884b.json
  26. 0
    8
      mtglib/internal/faketls/testdata/client-hello-ok-48f8a72a56f3174a.json
  27. 0
    8
      mtglib/internal/faketls/testdata/client-hello-ok-651054256093c6cd.json
  28. 0
    8
      mtglib/internal/faketls/testdata/client-hello-ok-79d01ef18a9d2621.json
  29. 0
    8
      mtglib/internal/faketls/testdata/client-hello-ok-7a5569f05b118145.json
  30. 0
    91
      mtglib/internal/faketls/welcome.go
  31. 0
    82
      mtglib/internal/faketls/welcome_test.go

+ 0
- 134
mtglib/internal/faketls/client_hello.go View File

@@ -1,134 +0,0 @@
1
-package faketls
2
-
3
-import (
4
-	"crypto/hmac"
5
-	"crypto/sha256"
6
-	"crypto/subtle"
7
-	"encoding/binary"
8
-	"fmt"
9
-	"time"
10
-
11
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
12
-)
13
-
14
-type ClientHello struct {
15
-	Time        time.Time
16
-	Random      [RandomLen]byte
17
-	SessionID   []byte
18
-	Host        string
19
-	CipherSuite uint16
20
-}
21
-
22
-func (c ClientHello) Valid(hostname string, tolerateTimeSkewness time.Duration) error {
23
-	if c.Host != "" && c.Host != hostname {
24
-		return fmt.Errorf("incorrect hostname %s", hostname)
25
-	}
26
-
27
-	now := time.Now()
28
-
29
-	timeDiff := now.Sub(c.Time)
30
-	if timeDiff < 0 {
31
-		timeDiff = -timeDiff
32
-	}
33
-
34
-	if timeDiff > tolerateTimeSkewness {
35
-		return fmt.Errorf("incorrect timestamp. got=%d, now=%d, diff=%s",
36
-			c.Time.Unix(), now.Unix(), timeDiff.String())
37
-	}
38
-
39
-	return nil
40
-}
41
-
42
-func ParseClientHello(secret, handshake []byte) (ClientHello, error) {
43
-	hello := ClientHello{}
44
-
45
-	if len(handshake) < ClientHelloMinLen {
46
-		return hello, fmt.Errorf("lengh of handshake is too small: %d", len(handshake))
47
-	}
48
-
49
-	if handshake[0] != HandshakeTypeClient {
50
-		return hello, fmt.Errorf("unknown handshake type %#x", handshake[0])
51
-	}
52
-
53
-	handshakeSizeBytes := [4]byte{0, handshake[1], handshake[2], handshake[3]}
54
-	handshakeLength := binary.BigEndian.Uint32(handshakeSizeBytes[:])
55
-
56
-	if len(handshake)-4 != int(handshakeLength) {
57
-		return hello,
58
-			fmt.Errorf("incorrect handshake size. manifested=%d, real=%d",
59
-				handshakeLength, len(handshake)-4)
60
-	}
61
-
62
-	copy(hello.Random[:], handshake[ClientHelloRandomOffset:])
63
-	copy(handshake[ClientHelloRandomOffset:], clientHelloEmptyRandom)
64
-
65
-	rec := record.AcquireRecord()
66
-	defer record.ReleaseRecord(rec)
67
-
68
-	rec.Type = record.TypeHandshake
69
-	rec.Version = record.Version10
70
-	rec.Payload.Write(handshake)
71
-
72
-	// mac is calculated for the whole record, not only
73
-	// for the payload part
74
-	mac := hmac.New(sha256.New, secret)
75
-	rec.Dump(mac) //nolint: errcheck
76
-
77
-	computedRandom := mac.Sum(nil)
78
-
79
-	for i := range RandomLen {
80
-		computedRandom[i] ^= hello.Random[i]
81
-	}
82
-
83
-	if subtle.ConstantTimeCompare(clientHelloEmptyRandom[:RandomLen-4], computedRandom[:RandomLen-4]) != 1 {
84
-		return hello, ErrBadDigest
85
-	}
86
-
87
-	timestamp := int64(binary.LittleEndian.Uint32(computedRandom[RandomLen-4:]))
88
-	hello.Time = time.Unix(timestamp, 0)
89
-
90
-	parseSessionID(&hello, handshake)
91
-	parseCipherSuite(&hello, handshake)
92
-	parseSNI(&hello, handshake)
93
-
94
-	return hello, nil
95
-}
96
-
97
-func parseSessionID(hello *ClientHello, handshake []byte) {
98
-	hello.SessionID = make([]byte, handshake[ClientHelloSessionIDOffset])
99
-	copy(hello.SessionID, handshake[ClientHelloSessionIDOffset+1:])
100
-}
101
-
102
-func parseCipherSuite(hello *ClientHello, handshake []byte) {
103
-	cipherSuiteOffset := ClientHelloSessionIDOffset + len(hello.SessionID) + 3
104
-	hello.CipherSuite = binary.BigEndian.Uint16(handshake[cipherSuiteOffset : cipherSuiteOffset+2])
105
-}
106
-
107
-func parseSNI(hello *ClientHello, handshake []byte) {
108
-	cipherSuiteOffset := ClientHelloSessionIDOffset + len(hello.SessionID) + 1
109
-	handshake = handshake[cipherSuiteOffset:]
110
-
111
-	cipherSuiteLength := binary.BigEndian.Uint16(handshake[:2])
112
-	handshake = handshake[2+cipherSuiteLength:]
113
-
114
-	compressionMethodsLength := int(handshake[0])
115
-	handshake = handshake[1+compressionMethodsLength:]
116
-
117
-	extensionsLength := binary.BigEndian.Uint16(handshake[:2])
118
-	handshake = handshake[2 : 2+extensionsLength]
119
-
120
-	for len(handshake) > 0 {
121
-		if binary.BigEndian.Uint16(handshake[:2]) != ExtensionSNI {
122
-			extensionsLength := binary.BigEndian.Uint16(handshake[2:4])
123
-			handshake = handshake[4+extensionsLength:]
124
-
125
-			continue
126
-		}
127
-
128
-		hostnameLength := binary.BigEndian.Uint16(handshake[7:9])
129
-		handshake = handshake[9:]
130
-		hello.Host = string(handshake[:int(hostnameLength)])
131
-
132
-		return
133
-	}
134
-}

+ 0
- 21
mtglib/internal/faketls/client_hello_fuzz_test.go View File

@@ -1,21 +0,0 @@
1
-package faketls_test
2
-
3
-import (
4
-	"testing"
5
-
6
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls"
7
-	"github.com/stretchr/testify/require"
8
-)
9
-
10
-var FuzzClientHelloSecret = []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
11
-
12
-func FuzzClientHello(f *testing.F) {
13
-	f.Add([]byte{1, 2, 3})
14
-
15
-	f.Fuzz(func(t *testing.T, frame []byte) {
16
-		_, err := faketls.ParseClientHello(FuzzClientHelloSecret, frame)
17
-
18
-		// a probability of having != err is almost negligible
19
-		require.Error(t, err)
20
-	})
21
-}

+ 0
- 191
mtglib/internal/faketls/client_hello_test.go View File

@@ -1,191 +0,0 @@
1
-package faketls_test
2
-
3
-import (
4
-	"encoding/base64"
5
-	"encoding/json"
6
-	"os"
7
-	"path/filepath"
8
-	"strings"
9
-	"testing"
10
-	"time"
11
-
12
-	"github.com/9seconds/mtg/v2/mtglib"
13
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls"
14
-	"github.com/stretchr/testify/assert"
15
-	"github.com/stretchr/testify/suite"
16
-)
17
-
18
-type ClientHelloSnapshot struct {
19
-	Time        int    `json:"time"`
20
-	Random      string `json:"random"`
21
-	SessionID   string `json:"sessionId"`
22
-	Host        string `json:"host"`
23
-	CipherSuite int    `json:"cipherSuite"`
24
-	Full        string `json:"full"`
25
-}
26
-
27
-func (c ClientHelloSnapshot) GetTime() time.Time {
28
-	return time.Unix(int64(c.Time), 0)
29
-}
30
-
31
-func (c ClientHelloSnapshot) GetRandom() []byte {
32
-	data, _ := base64.StdEncoding.DecodeString(c.Random)
33
-
34
-	return data
35
-}
36
-
37
-func (c ClientHelloSnapshot) GetSessionID() []byte {
38
-	data, _ := base64.StdEncoding.DecodeString(c.SessionID)
39
-
40
-	return data
41
-}
42
-
43
-func (c ClientHelloSnapshot) GetHost() string {
44
-	return c.Host
45
-}
46
-
47
-func (c ClientHelloSnapshot) GetCipherSuite() uint16 {
48
-	return uint16(c.CipherSuite)
49
-}
50
-
51
-func (c ClientHelloSnapshot) GetFull() []byte {
52
-	data, _ := base64.StdEncoding.DecodeString(c.Full)
53
-
54
-	return data
55
-}
56
-
57
-type ClientHelloTestSuite struct {
58
-	suite.Suite
59
-
60
-	secret mtglib.Secret
61
-}
62
-
63
-func (suite *ClientHelloTestSuite) SetupSuite() {
64
-	parsed, err := mtglib.ParseSecret("ee367a189aee18fa31c190054efd4a8e9573746f726167652e676f6f676c65617069732e636f6d")
65
-	if err != nil {
66
-		panic(err)
67
-	}
68
-
69
-	suite.secret = parsed
70
-}
71
-
72
-func (suite *ClientHelloTestSuite) TestEmptyHandshake() {
73
-	_, err := faketls.ParseClientHello(suite.secret.Key[:], nil)
74
-	suite.Error(err)
75
-}
76
-
77
-func (suite *ClientHelloTestSuite) TestIncorrectHandshakeType() {
78
-	data := make([]byte, 1024)
79
-	data[0] = 0x02
80
-
81
-	_, err := faketls.ParseClientHello(suite.secret.Key[:], data)
82
-	suite.Error(err)
83
-}
84
-
85
-func (suite *ClientHelloTestSuite) TestIncorrectLength() {
86
-	data := make([]byte, 1024)
87
-	data[0] = 0x01
88
-	data[1] = 0xff
89
-	data[2] = 0xff
90
-
91
-	_, err := faketls.ParseClientHello(suite.secret.Key[:], data)
92
-	suite.Error(err)
93
-}
94
-
95
-func (suite *ClientHelloTestSuite) TestSnapshotOk() {
96
-	files, err := os.ReadDir("testdata")
97
-	suite.NoError(err)
98
-
99
-	testData := []string{}
100
-
101
-	for _, v := range files {
102
-		if strings.HasPrefix(v.Name(), "client-hello-ok") {
103
-			testData = append(testData, v.Name())
104
-		}
105
-	}
106
-
107
-	for _, name := range testData {
108
-		path := filepath.Join("testdata", name)
109
-
110
-		suite.T().Run(name, func(t *testing.T) {
111
-			fileData, err := os.ReadFile(path)
112
-			assert.NoError(t, err)
113
-
114
-			snapshot := &ClientHelloSnapshot{}
115
-			assert.NoError(t, json.Unmarshal(fileData, snapshot))
116
-
117
-			hello, err := faketls.ParseClientHello(suite.secret.Key[:], snapshot.GetFull())
118
-			assert.NoError(t, err)
119
-			assert.WithinDuration(t, snapshot.GetTime(), hello.Time, time.Second)
120
-			assert.Equal(t, snapshot.GetRandom(), hello.Random[:])
121
-			assert.Equal(t, snapshot.GetSessionID(), hello.SessionID)
122
-			assert.Equal(t, snapshot.GetHost(), hello.Host)
123
-			assert.Equal(t, snapshot.GetCipherSuite(), hello.CipherSuite)
124
-		})
125
-	}
126
-}
127
-
128
-func (suite *ClientHelloTestSuite) TestSnapshotBad() {
129
-	files, err := os.ReadDir("testdata")
130
-	suite.NoError(err)
131
-
132
-	testData := []string{}
133
-
134
-	for _, v := range files {
135
-		if strings.HasPrefix(v.Name(), "client-hello-bad") {
136
-			testData = append(testData, v.Name())
137
-		}
138
-	}
139
-
140
-	for _, name := range testData {
141
-		path := filepath.Join("testdata", name)
142
-
143
-		suite.T().Run(name, func(t *testing.T) {
144
-			fileData, err := os.ReadFile(path)
145
-			assert.NoError(t, err)
146
-
147
-			snapshot := &ClientHelloSnapshot{}
148
-			assert.NoError(t, json.Unmarshal(fileData, snapshot))
149
-
150
-			_, err = faketls.ParseClientHello(suite.secret.Key[:], snapshot.GetFull())
151
-			assert.Error(t, err)
152
-		})
153
-	}
154
-}
155
-
156
-func (suite *ClientHelloTestSuite) TestValidateHostname() {
157
-	hello := faketls.ClientHello{
158
-		Time: time.Now(),
159
-	}
160
-	suite.NoError(hello.Valid("hostname", time.Second))
161
-
162
-	hello.Host = "hostname"
163
-	suite.Error(hello.Valid("hostname2", time.Second))
164
-	suite.NoError(hello.Valid("hostname", time.Second))
165
-}
166
-
167
-func (suite *ClientHelloTestSuite) TestValidateTime() {
168
-	testData := []time.Duration{
169
-		-2 * time.Second,
170
-		2 * time.Second,
171
-	}
172
-
173
-	for _, v := range testData {
174
-		value := v
175
-
176
-		suite.T().Run(value.String(), func(t *testing.T) {
177
-			hello := faketls.ClientHello{
178
-				Host: "hostname",
179
-				Time: time.Now().Add(value),
180
-			}
181
-			suite.Error(hello.Valid("hostname", 500*time.Millisecond))
182
-			suite.Error(hello.Valid("hostname", time.Second))
183
-			suite.NoError(hello.Valid("hostname", 3*time.Second))
184
-		})
185
-	}
186
-}
187
-
188
-func TestClientHello(t *testing.T) {
189
-	t.Parallel()
190
-	suite.Run(t, &ClientHelloTestSuite{})
191
-}

+ 0
- 72
mtglib/internal/faketls/conn.go View File

@@ -1,72 +0,0 @@
1
-package faketls
2
-
3
-import (
4
-	"bytes"
5
-	"fmt"
6
-	"math/rand/v2"
7
-
8
-	"github.com/9seconds/mtg/v2/essentials"
9
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
10
-)
11
-
12
-type Conn struct {
13
-	essentials.Conn
14
-
15
-	readBuffer bytes.Buffer
16
-}
17
-
18
-func (c *Conn) Read(p []byte) (int, error) {
19
-	if n, _ := c.readBuffer.Read(p); n > 0 {
20
-		return n, nil
21
-	}
22
-
23
-	rec := record.AcquireRecord()
24
-	defer record.ReleaseRecord(rec)
25
-
26
-	for {
27
-		if err := rec.Read(c.Conn); err != nil {
28
-			return 0, err //nolint: wrapcheck
29
-		}
30
-
31
-		switch rec.Type { //nolint: exhaustive
32
-		case record.TypeApplicationData:
33
-			rec.Payload.WriteTo(&c.readBuffer) //nolint: errcheck
34
-
35
-			return c.readBuffer.Read(p) //nolint: wrapcheck
36
-		case record.TypeChangeCipherSpec:
37
-		default:
38
-			return 0, fmt.Errorf("unsupported record type %v", rec.Type)
39
-		}
40
-	}
41
-}
42
-
43
-func (c *Conn) Write(p []byte) (int, error) {
44
-	rec := record.AcquireRecord()
45
-	defer record.ReleaseRecord(rec)
46
-
47
-	rec.Type = record.TypeApplicationData
48
-	rec.Version = record.Version12
49
-
50
-	written := 0
51
-
52
-	for len(p) > 0 {
53
-		chunkSize := rand.IntN(record.TLSMaxRecordSize)
54
-		if chunkSize > len(p) || chunkSize == 0 {
55
-			chunkSize = len(p)
56
-		}
57
-
58
-		rec.Payload.Reset()
59
-		rec.Payload.Write(p[:chunkSize])
60
-
61
-		err := rec.Dump(c.Conn)
62
-		written += chunkSize
63
-
64
-		if err != nil {
65
-			return written, err
66
-		}
67
-
68
-		p = p[chunkSize:]
69
-	}
70
-
71
-	return written, nil
72
-}

+ 0
- 153
mtglib/internal/faketls/conn_test.go View File

@@ -1,153 +0,0 @@
1
-package faketls_test
2
-
3
-import (
4
-	"bytes"
5
-	"crypto/rand"
6
-	"errors"
7
-	"io"
8
-	"testing"
9
-
10
-	"github.com/9seconds/mtg/v2/internal/testlib"
11
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls"
12
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
13
-	"github.com/stretchr/testify/mock"
14
-	"github.com/stretchr/testify/suite"
15
-)
16
-
17
-type ConnMock struct {
18
-	testlib.EssentialsConnMock
19
-
20
-	readBuffer  bytes.Buffer
21
-	writeBuffer bytes.Buffer
22
-}
23
-
24
-func (m *ConnMock) Read(p []byte) (int, error) {
25
-	m.Called(p)
26
-
27
-	return m.readBuffer.Read(p) //nolint: wrapcheck
28
-}
29
-
30
-func (m *ConnMock) Write(p []byte) (int, error) {
31
-	m.Called(p)
32
-
33
-	return m.writeBuffer.Write(p) //nolint: wrapcheck
34
-}
35
-
36
-type ConnTestSuite struct {
37
-	suite.Suite
38
-
39
-	connMock *ConnMock
40
-	c        *faketls.Conn
41
-}
42
-
43
-func (suite *ConnTestSuite) SetupTest() {
44
-	suite.connMock = &ConnMock{}
45
-	suite.c = &faketls.Conn{
46
-		Conn: suite.connMock,
47
-	}
48
-}
49
-
50
-func (suite *ConnTestSuite) TearDownTest() {
51
-	suite.connMock.AssertExpectations(suite.T())
52
-}
53
-
54
-func (suite *ConnTestSuite) TestRead() {
55
-	suite.connMock.On("Read", mock.Anything).Return(0, nil)
56
-
57
-	rec := record.AcquireRecord()
58
-	defer record.ReleaseRecord(rec)
59
-
60
-	rec.Type = record.TypeChangeCipherSpec
61
-	rec.Version = record.Version12
62
-
63
-	rec.Payload.WriteByte(0x01)
64
-	rec.Dump(&suite.connMock.readBuffer) //nolint: errcheck
65
-	rec.Reset()
66
-
67
-	rec.Type = record.TypeApplicationData
68
-	rec.Version = record.Version12
69
-
70
-	rec.Payload.Write([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
71
-	rec.Dump(&suite.connMock.readBuffer) //nolint: errcheck
72
-
73
-	resultBuffer := &bytes.Buffer{}
74
-	buf := make([]byte, 2)
75
-
76
-	for {
77
-		n, err := suite.c.Read(buf)
78
-		if errors.Is(err, io.EOF) {
79
-			break
80
-		}
81
-
82
-		resultBuffer.Write(buf[:n])
83
-	}
84
-
85
-	suite.Equal([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, resultBuffer.Bytes())
86
-}
87
-
88
-func (suite *ConnTestSuite) TestReadUnexpected() {
89
-	suite.connMock.On("Read", mock.Anything).Return(0, nil)
90
-
91
-	rec := record.AcquireRecord()
92
-	defer record.ReleaseRecord(rec)
93
-
94
-	rec.Type = record.TypeChangeCipherSpec
95
-	rec.Version = record.Version12
96
-
97
-	rec.Payload.WriteByte(0x01)
98
-	rec.Dump(&suite.connMock.readBuffer) //nolint: errcheck
99
-	rec.Reset()
100
-
101
-	rec.Type = record.TypeHandshake
102
-	rec.Version = record.Version12
103
-
104
-	rec.Payload.Write([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
105
-	rec.Dump(&suite.connMock.readBuffer) //nolint: errcheck
106
-
107
-	buf := make([]byte, 2)
108
-
109
-	for {
110
-		_, err := suite.c.Read(buf)
111
-
112
-		switch {
113
-		case err == nil:
114
-		case errors.Is(err, io.EOF):
115
-			suite.FailNow("unexpected to finish")
116
-		default:
117
-			return
118
-		}
119
-	}
120
-}
121
-
122
-func (suite *ConnTestSuite) TestWrite() {
123
-	suite.connMock.On("Write", mock.Anything).Return(0, nil)
124
-
125
-	dataToRec := make([]byte, record.TLSMaxRecordSize*2)
126
-	rand.Read(dataToRec) //nolint: staticcheck, errcheck
127
-
128
-	n, err := suite.c.Write(dataToRec)
129
-	suite.NoError(err)
130
-	suite.Equal(len(dataToRec), n)
131
-
132
-	rec := record.AcquireRecord()
133
-	defer record.ReleaseRecord(rec)
134
-
135
-	buf := &bytes.Buffer{}
136
-
137
-	for {
138
-		if err := rec.Read(&suite.connMock.writeBuffer); err != nil {
139
-			break
140
-		}
141
-
142
-		suite.Equal(record.TypeApplicationData, rec.Type)
143
-		suite.Equal(record.Version12, rec.Version)
144
-		rec.Payload.WriteTo(buf) //nolint: errcheck
145
-	}
146
-
147
-	suite.Equal(dataToRec, buf.Bytes())
148
-}
149
-
150
-func TestConn(t *testing.T) {
151
-	t.Parallel()
152
-	suite.Run(t, &ConnTestSuite{})
153
-}

+ 0
- 59
mtglib/internal/faketls/init.go View File

@@ -1,59 +0,0 @@
1
-package faketls
2
-
3
-import (
4
-	"bytes"
5
-	"errors"
6
-)
7
-
8
-const (
9
-	// RandomLen defines a size of the random digest in TLS Hellos.
10
-	RandomLen = 32
11
-
12
-	// ClientHelloRandomOffset is an offset in ClientHello record where
13
-	// random digest is started.
14
-	ClientHelloRandomOffset = 6
15
-
16
-	// ClientHelloSessionIDOffset is an offset in ClientHello record where
17
-	// SessionID is started.
18
-	ClientHelloSessionIDOffset = ClientHelloRandomOffset + RandomLen
19
-
20
-	// ClientHelloMinLen is a minimal possible length of
21
-	// ClientHello record.
22
-	ClientHelloMinLen = 6
23
-
24
-	// WelcomePacketRandomOffset is an offset of random in ServerHello
25
-	// packet (including record envelope).
26
-	WelcomePacketRandomOffset = 11
27
-
28
-	// HandshakeTypeClient is a value representing a client handshake.
29
-	HandshakeTypeClient = 0x01
30
-
31
-	// HandshakeTypeServer is a value representing a server handshake.
32
-	HandshakeTypeServer = 0x02
33
-
34
-	// ChangeCipherValue is a value representing a change cipher
35
-	// specification record.
36
-	ChangeCipherValue = 0x01
37
-
38
-	// ExtensionSNI is a value for TLS extension 'SNI'.
39
-	ExtensionSNI = 0x00
40
-)
41
-
42
-var (
43
-	// ErrBadDigest is returned if given TLS Client Hello mismatches with a
44
-	// derived one.
45
-	ErrBadDigest = errors.New("bad digest")
46
-
47
-	serverHelloSuffix = []byte{
48
-		0x00,       // no compression
49
-		0x00, 0x2e, // 46 bytes of data
50
-		0x00, 0x2b, // Extension - Supported Versions
51
-		0x00, 0x02, // 2 bytes are following
52
-		0x03, 0x04, // TLS 1.3
53
-		0x00, 0x33, // Extension - Key Share
54
-		0x00, 0x24, // 36 bytes
55
-		0x00, 0x1d, // x25519 curve
56
-		0x00, 0x20, // 32 bytes of key
57
-	}
58
-	clientHelloEmptyRandom = bytes.Repeat([]byte{0}, RandomLen)
59
-)

+ 0
- 84
mtglib/internal/faketls/record/init.go View File

@@ -1,84 +0,0 @@
1
-package record
2
-
3
-import "fmt"
4
-
5
-const TLSMaxRecordSize = 65535 // max uint16
6
-
7
-type Type uint8
8
-
9
-const (
10
-	// TypeChangeCipherSpec defines a byte value of the TLS record when a
11
-	// peer wants to change a specifications of the chosen cipher.
12
-	TypeChangeCipherSpec Type = 0x14
13
-
14
-	// TypeHandshake defines a byte value of the TLS record when a peer
15
-	// initiates a new TLS connection and wants to make a handshake
16
-	// ceremony.
17
-	TypeHandshake Type = 0x16
18
-
19
-	// TypeApplicationData defines a byte value of the TLS record when a
20
-	// peer sends an user data, not a control frames.
21
-	TypeApplicationData Type = 0x17
22
-)
23
-
24
-func (t Type) String() string {
25
-	switch t {
26
-	case TypeChangeCipherSpec:
27
-		return "changeCipher(0x14)"
28
-	case TypeHandshake:
29
-		return "handshake(0x16)"
30
-	case TypeApplicationData:
31
-		return "applicationData(0x17)"
32
-	}
33
-
34
-	return fmt.Sprintf("unknown(%#x)", byte(t))
35
-}
36
-
37
-func (t Type) Valid() error {
38
-	switch t {
39
-	case TypeChangeCipherSpec, TypeHandshake, TypeApplicationData:
40
-		return nil
41
-	}
42
-
43
-	return fmt.Errorf("unknown type %#x", byte(t))
44
-}
45
-
46
-type Version uint16
47
-
48
-const (
49
-	// Version10 defines a TLS1.0.
50
-	Version10 Version = 769 // 0x03 0x01
51
-
52
-	// Version11 defines a TLS1.1.
53
-	Version11 Version = 770 // 0x03 0x02
54
-
55
-	// Version12 defines a TLS1.2.
56
-	Version12 Version = 771 // 0x03 0x03
57
-
58
-	// Version13 defines a TLS1.3.
59
-	Version13 Version = 772 // 0x03 0x04
60
-)
61
-
62
-func (v Version) String() string {
63
-	switch v {
64
-	case Version10:
65
-		return "tls1.0"
66
-	case Version11:
67
-		return "tls1.1"
68
-	case Version12:
69
-		return "tls1.2"
70
-	case Version13:
71
-		return "tls1.3"
72
-	}
73
-
74
-	return fmt.Sprintf("tls?(%d)", uint16(v))
75
-}
76
-
77
-func (v Version) Valid() error {
78
-	switch v {
79
-	case Version10, Version11, Version12, Version13:
80
-		return nil
81
-	}
82
-
83
-	return fmt.Errorf("unknown version %d", uint16(v))
84
-}

+ 0
- 79
mtglib/internal/faketls/record/init_test.go View File

@@ -1,79 +0,0 @@
1
-package record_test
2
-
3
-import (
4
-	"testing"
5
-
6
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
7
-	"github.com/stretchr/testify/suite"
8
-)
9
-
10
-type TypeTestSuite struct {
11
-	suite.Suite
12
-}
13
-
14
-func (suite *TypeTestSuite) TestChangeCipherSpec() {
15
-	suite.Contains(record.TypeChangeCipherSpec.String(), "changeCipher")
16
-	suite.Contains(record.TypeChangeCipherSpec.String(), "0x14")
17
-	suite.NoError(record.TypeChangeCipherSpec.Valid())
18
-}
19
-
20
-func (suite *TypeTestSuite) TestHandshake() {
21
-	suite.Contains(record.TypeHandshake.String(), "handshake")
22
-	suite.Contains(record.TypeHandshake.String(), "0x16")
23
-	suite.NoError(record.TypeHandshake.Valid())
24
-}
25
-
26
-func (suite *TypeTestSuite) TestApplicationData() {
27
-	suite.Contains(record.TypeApplicationData.String(), "applicationData")
28
-	suite.Contains(record.TypeApplicationData.String(), "0x17")
29
-	suite.NoError(record.TypeApplicationData.Valid())
30
-}
31
-
32
-func (suite *TypeTestSuite) TestUnknown() {
33
-	value := record.Type(0x20)
34
-
35
-	suite.Contains(value.String(), "unknown")
36
-	suite.Contains(value.String(), "0x20")
37
-	suite.Error(value.Valid())
38
-}
39
-
40
-type VersionTestSuite struct {
41
-	suite.Suite
42
-}
43
-
44
-func (suite *VersionTestSuite) Test10() {
45
-	suite.Equal("tls1.0", record.Version10.String())
46
-	suite.NoError(record.Version10.Valid())
47
-}
48
-
49
-func (suite *VersionTestSuite) Test11() {
50
-	suite.Equal("tls1.1", record.Version11.String())
51
-	suite.NoError(record.Version11.Valid())
52
-}
53
-
54
-func (suite *VersionTestSuite) Test12() {
55
-	suite.Equal("tls1.2", record.Version12.String())
56
-	suite.NoError(record.Version12.Valid())
57
-}
58
-
59
-func (suite *VersionTestSuite) Test13() {
60
-	suite.Equal("tls1.3", record.Version13.String())
61
-	suite.NoError(record.Version13.Valid())
62
-}
63
-
64
-func (suite *VersionTestSuite) TestUnknown() {
65
-	value := record.Version(900)
66
-
67
-	suite.Equal("tls?(900)", value.String())
68
-	suite.Error(value.Valid())
69
-}
70
-
71
-func TestType(t *testing.T) {
72
-	t.Parallel()
73
-	suite.Run(t, &TypeTestSuite{})
74
-}
75
-
76
-func TestVersion(t *testing.T) {
77
-	t.Parallel()
78
-	suite.Run(t, &VersionTestSuite{})
79
-}

+ 0
- 20
mtglib/internal/faketls/record/pools.go View File

@@ -1,20 +0,0 @@
1
-package record
2
-
3
-import (
4
-	"sync"
5
-)
6
-
7
-var recordPool = sync.Pool{
8
-	New: func() any {
9
-		return &Record{}
10
-	},
11
-}
12
-
13
-func AcquireRecord() *Record {
14
-	return recordPool.Get().(*Record) //nolint: forcetypeassert
15
-}
16
-
17
-func ReleaseRecord(r *Record) {
18
-	r.Reset()
19
-	recordPool.Put(r)
20
-}

+ 0
- 86
mtglib/internal/faketls/record/record.go View File

@@ -1,86 +0,0 @@
1
-package record
2
-
3
-import (
4
-	"bytes"
5
-	"encoding/base64"
6
-	"encoding/binary"
7
-	"fmt"
8
-	"io"
9
-)
10
-
11
-type Record struct {
12
-	Type    Type
13
-	Version Version
14
-	Payload bytes.Buffer
15
-}
16
-
17
-func (r *Record) String() string {
18
-	return fmt.Sprintf("<tlsRecord(type=%v, version=%v, payload=%s)>",
19
-		r.Type,
20
-		r.Version,
21
-		base64.StdEncoding.EncodeToString(r.Payload.Bytes()))
22
-}
23
-
24
-func (r *Record) Reset() {
25
-	r.Payload.Reset()
26
-}
27
-
28
-func (r *Record) Read(reader io.Reader) error {
29
-	r.Reset()
30
-
31
-	buf := [2]byte{}
32
-
33
-	if _, err := io.ReadFull(reader, buf[:1]); err != nil {
34
-		return fmt.Errorf("cannot read type: %w", err)
35
-	}
36
-
37
-	r.Type = Type(buf[0])
38
-	if err := r.Type.Valid(); err != nil {
39
-		return fmt.Errorf("invalid type: %w", err)
40
-	}
41
-
42
-	if _, err := io.ReadFull(reader, buf[:]); err != nil {
43
-		return fmt.Errorf("cannot read version: %w", err)
44
-	}
45
-
46
-	r.Version = Version(binary.BigEndian.Uint16(buf[:]))
47
-	if err := r.Version.Valid(); err != nil {
48
-		return fmt.Errorf("invalid version: %w", err)
49
-	}
50
-
51
-	if _, err := io.ReadFull(reader, buf[:]); err != nil {
52
-		return fmt.Errorf("cannot read payload length: %w", err)
53
-	}
54
-
55
-	length := int64(binary.BigEndian.Uint16(buf[:]))
56
-	if _, err := io.CopyN(&r.Payload, reader, length); err != nil {
57
-		return fmt.Errorf("cannot read payload: %w", err)
58
-	}
59
-
60
-	return nil
61
-}
62
-
63
-func (r *Record) Dump(writer io.Writer) error {
64
-	buf := [2]byte{byte(r.Type), 0}
65
-	if _, err := writer.Write(buf[:1]); err != nil {
66
-		return fmt.Errorf("cannot dump record type: %w", err)
67
-	}
68
-
69
-	binary.BigEndian.PutUint16(buf[:], uint16(r.Version))
70
-
71
-	if _, err := writer.Write(buf[:]); err != nil {
72
-		return fmt.Errorf("cannot dump version: %w", err)
73
-	}
74
-
75
-	binary.BigEndian.PutUint16(buf[:], uint16(r.Payload.Len()))
76
-
77
-	if _, err := writer.Write(buf[:]); err != nil {
78
-		return fmt.Errorf("cannot dump payload length: %w", err)
79
-	}
80
-
81
-	if _, err := writer.Write(r.Payload.Bytes()); err != nil {
82
-		return fmt.Errorf("cannot dump record: %w", err)
83
-	}
84
-
85
-	return nil
86
-}

+ 0
- 110
mtglib/internal/faketls/record/record_test.go View File

@@ -1,110 +0,0 @@
1
-package record_test
2
-
3
-import (
4
-	"bytes"
5
-	"encoding/base64"
6
-	"encoding/json"
7
-	"os"
8
-	"path/filepath"
9
-	"testing"
10
-
11
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
12
-	"github.com/stretchr/testify/assert"
13
-	"github.com/stretchr/testify/suite"
14
-)
15
-
16
-type RecordTestSnapshot struct {
17
-	Type    int    `json:"type"`
18
-	Version int    `json:"version"`
19
-	Payload string `json:"payload"`
20
-	Record  string `json:"record"`
21
-}
22
-
23
-func (r RecordTestSnapshot) RecordBytes() []byte {
24
-	data, _ := base64.StdEncoding.DecodeString(r.Record)
25
-
26
-	return data
27
-}
28
-
29
-func (r RecordTestSnapshot) PayloadBytes() []byte {
30
-	data, _ := base64.StdEncoding.DecodeString(r.Payload)
31
-
32
-	return data
33
-}
34
-
35
-type RecordTestSuite struct {
36
-	suite.Suite
37
-
38
-	r   *record.Record
39
-	buf *bytes.Buffer
40
-}
41
-
42
-func (suite *RecordTestSuite) SetupTest() {
43
-	suite.r = record.AcquireRecord()
44
-	suite.buf = &bytes.Buffer{}
45
-}
46
-
47
-func (suite *RecordTestSuite) TearDownTest() {
48
-	record.ReleaseRecord(suite.r)
49
-	suite.buf.Reset()
50
-}
51
-
52
-func (suite *RecordTestSuite) TestIdempotent() {
53
-	suite.r.Type = record.TypeApplicationData
54
-	suite.r.Version = record.Version13
55
-
56
-	suite.r.Payload.Write([]byte{1, 2, 3})
57
-	suite.NoError(suite.r.Dump(suite.buf))
58
-
59
-	suite.r.Reset()
60
-	suite.NoError(suite.r.Read(suite.buf))
61
-
62
-	suite.Equal(0, suite.buf.Len())
63
-	suite.Equal(record.TypeApplicationData, suite.r.Type)
64
-	suite.Equal(record.Version13, suite.r.Version)
65
-	suite.Equal([]byte{1, 2, 3}, suite.r.Payload.Bytes())
66
-}
67
-
68
-func (suite *RecordTestSuite) TestString() {
69
-	_ = suite.r.String()
70
-}
71
-
72
-func (suite *RecordTestSuite) TestSnapshot() {
73
-	files, err := os.ReadDir("testdata")
74
-	suite.NoError(err)
75
-
76
-	testData := map[string]string{}
77
-
78
-	for _, f := range files {
79
-		testData[f.Name()] = filepath.Join("testdata", f.Name())
80
-	}
81
-
82
-	for name, pathV := range testData {
83
-		path := pathV
84
-
85
-		suite.T().Run(name, func(t *testing.T) {
86
-			data, err := os.ReadFile(path)
87
-			assert.NoError(t, err)
88
-
89
-			snapshot := &RecordTestSnapshot{}
90
-			assert.NoError(t, json.Unmarshal(data, snapshot))
91
-
92
-			rec := record.AcquireRecord()
93
-			defer record.ReleaseRecord(rec)
94
-
95
-			assert.NoError(t, rec.Read(bytes.NewReader(snapshot.RecordBytes())))
96
-			assert.Equal(t, snapshot.Type, int(rec.Type))
97
-			assert.Equal(t, snapshot.Version, int(rec.Version))
98
-			assert.Equal(t, snapshot.PayloadBytes(), rec.Payload.Bytes())
99
-
100
-			buf := &bytes.Buffer{}
101
-			assert.NoError(t, rec.Dump(buf))
102
-			assert.Equal(t, snapshot.RecordBytes(), buf.Bytes())
103
-		})
104
-	}
105
-}
106
-
107
-func TestRecord(t *testing.T) {
108
-	t.Parallel()
109
-	suite.Run(t, &RecordTestSuite{})
110
-}

+ 0
- 6
mtglib/internal/faketls/record/testdata/05eb6b71f87b6802.json View File

@@ -1,6 +0,0 @@
1
-{
2
-  "type": 20,
3
-  "version": 772,
4
-  "payload": "sxS+0oAyk+NBv0LLVtQOp9WSx4CweyUZPz01tQ0o4oyp8aaBl6/kMFvLq3q52KE8lCiKejLw2NxVBUkE+4izCf2gLx9qfr81opWnqJTChWzcDijvttbq9cmtDFNL+odKsS3v1/TfYEFtPsoRPrJRmOHRAnqnf49Y5Q==",
5
-  "record": "FAMEAHmzFL7SgDKT40G/QstW1A6n1ZLHgLB7JRk/PTW1DSjijKnxpoGXr+QwW8urernYoTyUKIp6MvDY3FUFSQT7iLMJ/aAvH2p+vzWilaeolMKFbNwOKO+21ur1ya0MU0v6h0qxLe/X9N9gQW0+yhE+slGY4dECeqd/j1jl"
6
-}

+ 0
- 6
mtglib/internal/faketls/record/testdata/4eef4abc15b206b6.json View File

@@ -1,6 +0,0 @@
1
-{
2
-  "type": 22,
3
-  "version": 772,
4
-  "payload": "waNH223htyxCBKAb6hm0u/SK/9mhI8Ck91nfWob7QMOaIREogrDYREJH4Djcp47XrpAlEaUIDiCvoFLVJ/LK1nYs4swzfHSSl/+Aj1eqPA63XqPa8EG4FAbf0DwjwXxV9qVIhvP9b2TafKbzr4Yb5GCygzFRb/zawA==",
5
-  "record": "FgMEAHnBo0fbbeG3LEIEoBvqGbS79Ir/2aEjwKT3Wd9ahvtAw5ohESiCsNhEQkfgONynjteukCURpQgOIK+gUtUn8srWdizizDN8dJKX/4CPV6o8Drdeo9rwQbgUBt/QPCPBfFX2pUiG8/1vZNp8pvOvhhvkYLKDMVFv/NrA"
6
-}

+ 0
- 6
mtglib/internal/faketls/record/testdata/736f358216afe91f.json View File

@@ -1,6 +0,0 @@
1
-{
2
-  "type": 23,
3
-  "version": 769,
4
-  "payload": "jmJ0o1E5+ehAHHYAbCo4AMV03X7RSivYl250s06nD9CO44fyjaoGELz0N7IeCg1jFKcRVSCRmYYmiIY9wydn2fXOJhKif8B0BlM3qhbethYgyP+l1S8hyyETpIiOtiiiOnAJwl1D1j9OryFiJFSdRRXReIMZ4CPqPg==",
5
-  "record": "FwMBAHmOYnSjUTn56EAcdgBsKjgAxXTdftFKK9iXbnSzTqcP0I7jh/KNqgYQvPQ3sh4KDWMUpxFVIJGZhiaIhj3DJ2fZ9c4mEqJ/wHQGUzeqFt62FiDI/6XVLyHLIROkiI62KKI6cAnCXUPWP06vIWIkVJ1FFdF4gxngI+o+"
6
-}

+ 0
- 6
mtglib/internal/faketls/record/testdata/8405d94222bd0b6a.json View File

@@ -1,6 +0,0 @@
1
-{
2
-  "type": 22,
3
-  "version": 769,
4
-  "payload": "hBnpBnNUdlqe/rKXa7Judcz79u7AkUgSGOycn8EqvbkZpVxnI31rNOvAsPZqG+GF7DWJ3R7H2ETmFmrpnyyng32MjSs1jptmV1oAs63zTADD7sVipgid9AJHwfl4CrC3FIQr43IPMYd29JPOl5bqu/SfrgI16PBiJw==",
5
-  "record": "FgMBAHmEGekGc1R2Wp7+spdrsm51zPv27sCRSBIY7JyfwSq9uRmlXGcjfWs068Cw9mob4YXsNYndHsfYROYWaumfLKeDfYyNKzWOm2ZXWgCzrfNMAMPuxWKmCJ30AkfB+XgKsLcUhCvjcg8xh3b0k86Xluq79J+uAjXo8GIn"
6
-}

+ 0
- 6
mtglib/internal/faketls/record/testdata/9036f76e517f0cd1.json View File

@@ -1,6 +0,0 @@
1
-{
2
-  "type": 23,
3
-  "version": 770,
4
-  "payload": "Vm/C+DO56czlbtR915aHzsugSyDtp8CtojF9w1jKY0efyyfcLrNuhNg/pZm3gQ7v2BBbL1UJ97v/RIjST+5gRIfg3bBN1BE9hkf+N2AYY2lHLi0yeInHB0zFWPeHscsDopDFadIi5KtC8HvbEMuK+kK8POVk5tN9UQ==",
5
-  "record": "FwMCAHlWb8L4M7npzOVu1H3XlofOy6BLIO2nwK2iMX3DWMpjR5/LJ9wus26E2D+lmbeBDu/YEFsvVQn3u/9EiNJP7mBEh+DdsE3UET2GR/43YBhjaUcuLTJ4iccHTMVY94exywOikMVp0iLkq0Lwe9sQy4r6Qrw85WTm031R"
6
-}

+ 0
- 6
mtglib/internal/faketls/record/testdata/9244766a0fe4a02a.json View File

@@ -1,6 +0,0 @@
1
-{
2
-  "type": 22,
3
-  "version": 770,
4
-  "payload": "ajPzpsgk4gwm2stRQKbllvKRLdI7vmyaj1uxEJ/kKoQnQSPumdDNKD618U2Cq6PVd0/b+9YtH67Uzx1QxtpKuby5fUXqw06WUuDAQsmjq7F26EkE5FND6rQUjUPC+e1U0dF4TQzOUSS4IAkFQPAaVehUVTRxVWa/0g==",
5
-  "record": "FgMCAHlqM/OmyCTiDCbay1FApuWW8pEt0ju+bJqPW7EQn+QqhCdBI+6Z0M0oPrXxTYKro9V3T9v71i0frtTPHVDG2kq5vLl9RerDTpZS4MBCyaOrsXboSQTkU0PqtBSNQ8L57VTR0XhNDM5RJLggCQVA8BpV6FRVNHFVZr/S"
6
-}

+ 0
- 6
mtglib/internal/faketls/record/testdata/9255c73d3de76e7b.json View File

@@ -1,6 +0,0 @@
1
-{
2
-  "type": 20,
3
-  "version": 771,
4
-  "payload": "d1Hiv1NYVgEDR9mtJyv9j8mg3dWqfUpeKfOsL+jzSDfVIxeDiJZFLDT50TjNW44/yEOVEX/Y/pk+wnc7E8aCEiwGwAvB+Insw1UCJ2ejt689VWLo2u4klGVKTHuOpUvdGVTc7Lo4FAt91KQSPLYB5iqxomjEv5e3Vg==",
5
-  "record": "FAMDAHl3UeK/U1hWAQNH2a0nK/2PyaDd1ap9Sl4p86wv6PNIN9UjF4OIlkUsNPnROM1bjj/IQ5URf9j+mT7CdzsTxoISLAbAC8H4iezDVQInZ6O3rz1VYuja7iSUZUpMe46lS90ZVNzsujgUC33UpBI8tgHmKrGiaMS/l7dW"
6
-}

+ 0
- 6
mtglib/internal/faketls/record/testdata/aeb65b9924315cf8.json View File

@@ -1,6 +0,0 @@
1
-{
2
-  "type": 23,
3
-  "version": 771,
4
-  "payload": "wbdU1CbrzuAJDsh6CFjGyE+AFArJj/Wmsa2wtDyW0kRuE2vUO8gg+nXkg0kkoz0WnvQEOdaswfJIaVrloD78yoyeQVfBB+VUP/63vqn60v5ccaQEn0jLdxgLjiTAxKDQDxCTMRoLnFE2ZZf28zw+HfqpIxiOZs8LhQ==",
5
-  "record": "FwMDAHnBt1TUJuvO4AkOyHoIWMbIT4AUCsmP9aaxrbC0PJbSRG4Ta9Q7yCD6deSDSSSjPRae9AQ51qzB8khpWuWgPvzKjJ5BV8EH5VQ//re+qfrS/lxxpASfSMt3GAuOJMDEoNAPEJMxGgucUTZll/bzPD4d+qkjGI5mzwuF"
6
-}

+ 0
- 6
mtglib/internal/faketls/record/testdata/b0acd44296056b54.json View File

@@ -1,6 +0,0 @@
1
-{
2
-  "type": 23,
3
-  "version": 772,
4
-  "payload": "qqnBMb1Af3zZt4DPHpVRuIiON9ODGJUNFicFjranORh67L/HI4D6HnHyycZFUSBOw2FjMBF6UialY8snOYaRKrQmQzuUNg1Ztq7yAZ+Lgj3TBarR6OMlYhEAY0Px9Xv1UuJ0YcvQx33gdM1skJ5HBR3yZvEKNJV1LA==",
5
-  "record": "FwMEAHmqqcExvUB/fNm3gM8elVG4iI4304MYlQ0WJwWOtqc5GHrsv8cjgPoecfLJxkVRIE7DYWMwEXpSJqVjyyc5hpEqtCZDO5Q2DVm2rvIBn4uCPdMFqtHo4yViEQBjQ/H1e/VS4nRhy9DHfeB0zWyQnkcFHfJm8Qo0lXUs"
6
-}

+ 0
- 6
mtglib/internal/faketls/record/testdata/c0545a13fd9a3fa3.json View File

@@ -1,6 +0,0 @@
1
-{
2
-  "type": 20,
3
-  "version": 769,
4
-  "payload": "NEe735TuQFp7bWpFQhASas/e1XaySvus0ovXmkfCbFq334MyFHq2eDMadziXsfu/GfBjoYggvk0LgYUeoAkBNKR0dfSovjSndaqmIUonoWl+6sZObiGZkRIMwuY2q4Eaw4/iuDu/pZhjRW/iAIH+YH7cyk/1tgdJDg==",
5
-  "record": "FAMBAHk0R7vflO5AWnttakVCEBJqz97VdrJK+6zSi9eaR8JsWrffgzIUerZ4Mxp3OJex+78Z8GOhiCC+TQuBhR6gCQE0pHR19Ki+NKd1qqYhSiehaX7qxk5uIZmREgzC5jargRrDj+K4O7+lmGNFb+IAgf5gftzKT/W2B0kO"
6
-}

+ 0
- 6
mtglib/internal/faketls/record/testdata/f083f4501668b759.json View File

@@ -1,6 +0,0 @@
1
-{
2
-  "type": 22,
3
-  "version": 771,
4
-  "payload": "wrXjZrPm3OSyzO0klv6/G+z2PDloR/colS/RlWwQE31Vb2xm8YkEchDDKwlc/KPLD73qMoz3MQOQLtSLc8LhVYp+l7L9jz49yTaVKtBI5UuGbo09snsKxFCgCyYUBETKabATBQtiaEu/D8dmF4Yk/2ww4sEb8DwKLQ==",
5
-  "record": "FgMDAHnCteNms+bc5LLM7SSW/r8b7PY8OWhH9yiVL9GVbBATfVVvbGbxiQRyEMMrCVz8o8sPveoyjPcxA5Au1ItzwuFVin6Xsv2PPj3JNpUq0EjlS4ZujT2yewrEUKALJhQERMppsBMFC2JoS78Px2YXhiT/bDDiwRvwPAot"
6
-}

+ 0
- 6
mtglib/internal/faketls/record/testdata/f5696bcdffd11706.json View File

@@ -1,6 +0,0 @@
1
-{
2
-  "type": 20,
3
-  "version": 770,
4
-  "payload": "OU5s8Sa11hpXWEarWzFlX55IZt3Eo+F4AMbQ/2RwB4rfHS/JNl8n63OR4oYs9QXw3RfCrYJuU9n6Xn+I/+7ZzAgZ0PbLSXW1PrLtttdfmhTErK90b49YEWdY9na4g++NMkKykwgXvY1hNxZIHX/qawEWJgxXUR3DdQ==",
5
-  "record": "FAMCAHk5TmzxJrXWGldYRqtbMWVfnkhm3cSj4XgAxtD/ZHAHit8dL8k2Xyfrc5Hihiz1BfDdF8Ktgm5T2fpef4j/7tnMCBnQ9stJdbU+su2211+aFMSsr3Rvj1gRZ1j2driD740yQrKTCBe9jWE3Fkgdf+prARYmDFdRHcN1"
6
-}

+ 0
- 8
mtglib/internal/faketls/testdata/client-hello-bad-fa2e46cdb33e2a1b.json View File

@@ -1,8 +0,0 @@
1
-{
2
-  "time": 1617181365,
3
-  "random": "XvCPc3aAbHbhRLv0kUmy6BfPZOGvsused5/HNsKXEPs=",
4
-  "sessionId": "St2BZ2uHMFn3B2trD1jfdtpjoJOOg6JBeLhFcyCMCq4=",
5
-  "host": "storage.googleapis.com",
6
-  "cipherSuite": 4867,
7
-  "full": "AQAB/AMDXvCPc3aAbHbhRLv0kUmy6BfPZOGvsused5/HNsKXEPsgSt2BZ2uHMFn3B2trD1jfdtpjoJOOg6JBeLhFcyCACq4ANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFANAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAgB/7oLx9JElIALsLJS91H2QNyU1H0osKwIUelVndsLyIALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
8
-}

+ 0
- 8
mtglib/internal/faketls/testdata/client-hello-ok-19dfe38384b9884b.json View File

@@ -1,8 +0,0 @@
1
-{
2
-  "time": 1617181365,
3
-  "random": "XvCPc3aAbHbhRLv0kUmy6BfPZOGvsused5/HNsKXEPs=",
4
-  "sessionId": "St2BZ2uHMFn3B2trD1jfdtpjoJOOg6JBeLhFcyCMCq4=",
5
-  "host": "storage.googleapis.com",
6
-  "cipherSuite": 4867,
7
-  "full": "AQAB/AMDXvCPc3aAbHbhRLv0kUmy6BfPZOGvsused5/HNsKXEPsgSt2BZ2uHMFn3B2trD1jfdtpjoJOOg6JBeLhFcyCMCq4ANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAgB/7oLx9JElIALsLJS91H2QNyU1H0osKwIUelVndsLyIALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
8
-}

+ 0
- 8
mtglib/internal/faketls/testdata/client-hello-ok-48f8a72a56f3174a.json View File

@@ -1,8 +0,0 @@
1
-{
2
-  "time": 1617181352,
3
-  "random": "oYEu33jl+zQbUKMtQbV1OHB0gXIM2y2aq9iY0QX12os=",
4
-  "sessionId": "FGqA3ZFYrSlj//xl7lammNn64K9/MK2mQ3HJUGvP+8g=",
5
-  "host": "storage.googleapis.com",
6
-  "cipherSuite": 4867,
7
-  "full": "AQAB/AMDoYEu33jl+zQbUKMtQbV1OHB0gXIM2y2aq9iY0QX12osgFGqA3ZFYrSlj//xl7lammNn64K9/MK2mQ3HJUGvP+8gANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAga6CocpFP8Qd4YCFR9pkaCr97po2ALj0P5nI9Nnb3UWMALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
8
-}

+ 0
- 8
mtglib/internal/faketls/testdata/client-hello-ok-651054256093c6cd.json View File

@@ -1,8 +0,0 @@
1
-{
2
-  "time": 1617181352,
3
-  "random": "5V5sSprk/tFIgy+x1BeKNGhLlFkqfggLpgN7GYOA1ro=",
4
-  "sessionId": "jxr4d6PXPDk+Lwx3WUp9wvj8TGlOxEdrRJ0ydyJ9+H8=",
5
-  "host": "storage.googleapis.com",
6
-  "cipherSuite": 4867,
7
-  "full": "AQAB/AMD5V5sSprk/tFIgy+x1BeKNGhLlFkqfggLpgN7GYOA1rogjxr4d6PXPDk+Lwx3WUp9wvj8TGlOxEdrRJ0ydyJ9+H8ANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAgrulAaqUdKeVYM0F+pu6on/h6LBpOyzOKG4xFIKcoFk4ALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
8
-}

+ 0
- 8
mtglib/internal/faketls/testdata/client-hello-ok-79d01ef18a9d2621.json View File

@@ -1,8 +0,0 @@
1
-{
2
-  "time": 1617181365,
3
-  "random": "8xljlOhkDlkafEF5vu3e1r3fWvh8AX548wC3hLZ3szQ=",
4
-  "sessionId": "00uvDYKnFyZFKyf3HlLwWGCOyeHsPFiU5UZ+Fs5pDAU=",
5
-  "host": "storage.googleapis.com",
6
-  "cipherSuite": 4867,
7
-  "full": "AQAB/AMD8xljlOhkDlkafEF5vu3e1r3fWvh8AX548wC3hLZ3szQg00uvDYKnFyZFKyf3HlLwWGCOyeHsPFiU5UZ+Fs5pDAUANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAg/9P7140NtKzjyDwBf99mOy1+FjRPAPHTNQ9WxHOKpV4ALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
8
-}

+ 0
- 8
mtglib/internal/faketls/testdata/client-hello-ok-7a5569f05b118145.json View File

@@ -1,8 +0,0 @@
1
-{
2
-  "time": 1617181352,
3
-  "random": "zja3MLZ8WGSfsQRtPV75+tY6gbK3zKPi1Sy7SBBafg4=",
4
-  "sessionId": "qPut2yMqXa9zGLII/872SQ3d4Tfqo0uoDb7tpkRfBnA=",
5
-  "host": "storage.googleapis.com",
6
-  "cipherSuite": 4867,
7
-  "full": "AQAB/AMDzja3MLZ8WGSfsQRtPV75+tY6gbK3zKPi1Sy7SBBafg4gqPut2yMqXa9zGLII/872SQ3d4Tfqo0uoDb7tpkRfBnAANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAgXviLRAqAYJ8xOLdlcsUhldI4Xl0g/s9+y2Qrd8raPEgALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
8
-}

+ 0
- 91
mtglib/internal/faketls/welcome.go View File

@@ -1,91 +0,0 @@
1
-package faketls
2
-
3
-import (
4
-	"bytes"
5
-	"crypto/hmac"
6
-	"crypto/rand"
7
-	"crypto/sha256"
8
-	"encoding/binary"
9
-	"io"
10
-	mrand "math/rand/v2"
11
-
12
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
13
-	"golang.org/x/crypto/curve25519"
14
-)
15
-
16
-func SendWelcomePacket(writer io.Writer, secret []byte, clientHello ClientHello) error {
17
-	buf := &bytes.Buffer{}
18
-
19
-	rec := record.AcquireRecord()
20
-	defer record.ReleaseRecord(rec)
21
-
22
-	rec.Type = record.TypeHandshake
23
-	rec.Version = record.Version12
24
-
25
-	generateServerHello(&rec.Payload, clientHello)
26
-	rec.Dump(buf) //nolint: errcheck
27
-	rec.Reset()
28
-
29
-	rec.Type = record.TypeChangeCipherSpec
30
-	rec.Version = record.Version12
31
-	rec.Payload.WriteByte(ChangeCipherValue)
32
-
33
-	rec.Dump(buf) //nolint: errcheck
34
-	rec.Reset()
35
-
36
-	rec.Type = record.TypeApplicationData
37
-	rec.Version = record.Version12
38
-
39
-	if _, err := io.CopyN(&rec.Payload, rand.Reader, int64(1024+mrand.IntN(3092))); err != nil {
40
-		panic(err)
41
-	}
42
-
43
-	rec.Dump(buf) //nolint: errcheck
44
-
45
-	packet := buf.Bytes()
46
-	mac := hmac.New(sha256.New, secret)
47
-
48
-	mac.Write(clientHello.Random[:])
49
-	mac.Write(packet)
50
-
51
-	copy(packet[WelcomePacketRandomOffset:], mac.Sum(nil))
52
-
53
-	if _, err := writer.Write(packet); err != nil {
54
-		return err //nolint: wrapcheck
55
-	}
56
-
57
-	return nil
58
-}
59
-
60
-func generateServerHello(writer io.Writer, clientHello ClientHello) {
61
-	bodyBuf := &bytes.Buffer{}
62
-
63
-	sliceBuf := [2]byte{}
64
-	digest := [RandomLen]byte{}
65
-
66
-	binary.BigEndian.PutUint16(sliceBuf[:], uint16(record.Version12))
67
-	bodyBuf.Write(sliceBuf[:])
68
-	bodyBuf.Write(digest[:])
69
-	bodyBuf.WriteByte(byte(len(clientHello.SessionID)))
70
-	bodyBuf.Write(clientHello.SessionID)
71
-
72
-	binary.BigEndian.PutUint16(sliceBuf[:], clientHello.CipherSuite)
73
-	bodyBuf.Write(sliceBuf[:])
74
-	bodyBuf.Write(serverHelloSuffix)
75
-
76
-	scalar := [32]byte{}
77
-
78
-	if _, err := rand.Read(scalar[:]); err != nil {
79
-		panic(err)
80
-	}
81
-
82
-	curve, _ := curve25519.X25519(scalar[:], curve25519.Basepoint)
83
-	bodyBuf.Write(curve)
84
-
85
-	header := [4]byte{0, 0, 0, 0}
86
-	binary.BigEndian.PutUint32(header[:], uint32(bodyBuf.Len()))
87
-	header[0] = HandshakeTypeServer
88
-
89
-	writer.Write(header[:]) //nolint: errcheck
90
-	bodyBuf.WriteTo(writer) //nolint: errcheck
91
-}

+ 0
- 82
mtglib/internal/faketls/welcome_test.go View File

@@ -1,82 +0,0 @@
1
-package faketls_test
2
-
3
-import (
4
-	"bytes"
5
-	"crypto/hmac"
6
-	"crypto/rand"
7
-	"crypto/sha256"
8
-	"testing"
9
-	"time"
10
-
11
-	"github.com/9seconds/mtg/v2/mtglib"
12
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls"
13
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
14
-	"github.com/stretchr/testify/suite"
15
-)
16
-
17
-type WelcomeTestSuite struct {
18
-	suite.Suite
19
-
20
-	h      *faketls.ClientHello
21
-	buf    *bytes.Buffer
22
-	secret mtglib.Secret
23
-}
24
-
25
-func (suite *WelcomeTestSuite) SetupTest() {
26
-	suite.h = &faketls.ClientHello{
27
-		Time:        time.Now(),
28
-		Host:        "google.com",
29
-		CipherSuite: 4867,
30
-		SessionID:   make([]byte, 32),
31
-	}
32
-
33
-	_, err := rand.Read(suite.h.SessionID) //nolint: staticcheck
34
-	suite.NoError(err)
35
-
36
-	_, err = rand.Read(suite.h.Random[:]) //nolint: staticcheck
37
-	suite.NoError(err)
38
-
39
-	suite.buf = &bytes.Buffer{}
40
-
41
-	suite.secret = mtglib.GenerateSecret("google.com")
42
-}
43
-
44
-func (suite *WelcomeTestSuite) TestOk() {
45
-	suite.NoError(faketls.SendWelcomePacket(suite.buf, suite.secret.Key[:], *suite.h))
46
-
47
-	welcomePacket := []byte{}
48
-	welcomePacket = append(welcomePacket, suite.buf.Bytes()...)
49
-
50
-	rec := record.AcquireRecord()
51
-	defer record.ReleaseRecord(rec)
52
-
53
-	suite.NoError(rec.Read(suite.buf))
54
-	suite.Equal(record.TypeHandshake, rec.Type)
55
-	suite.Equal(record.Version12, rec.Version)
56
-
57
-	suite.NoError(rec.Read(suite.buf))
58
-	suite.Equal(record.TypeChangeCipherSpec, rec.Type)
59
-	suite.Equal(record.Version12, rec.Version)
60
-
61
-	suite.NoError(rec.Read(suite.buf))
62
-	suite.Equal(record.TypeApplicationData, rec.Type)
63
-	suite.Equal(record.Version12, rec.Version)
64
-	suite.Empty(suite.buf.Bytes())
65
-
66
-	random := make([]byte, 32)
67
-	copy(random, welcomePacket[11:])
68
-
69
-	empty := make([]byte, 32)
70
-	copy(welcomePacket[11:], empty)
71
-
72
-	mac := hmac.New(sha256.New, suite.secret.Key[:])
73
-	mac.Write(suite.h.Random[:])
74
-	mac.Write(welcomePacket)
75
-
76
-	suite.Equal(random, mac.Sum(nil))
77
-}
78
-
79
-func TestWelcome(t *testing.T) {
80
-	t.Parallel()
81
-	suite.Run(t, &WelcomeTestSuite{})
82
-}

Loading…
Cancel
Save