From 491b674e702e805ebffb0950c393b57641c4dd21 Mon Sep 17 00:00:00 2001 From: 9seconds Date: Wed, 31 Mar 2021 12:24:04 +0300 Subject: [PATCH] Add tests for client hello --- mtglib/internal/faketls/client_hello_test.go | 159 ++++++++++++++++++ .../client-hello-bad-fa2e46cdb33e2a1b.json | 8 + .../client-hello-ok-19dfe38384b9884b.json | 8 + .../client-hello-ok-48f8a72a56f3174a.json | 8 + .../client-hello-ok-651054256093c6cd.json | 8 + .../client-hello-ok-79d01ef18a9d2621.json | 8 + .../client-hello-ok-7a5569f05b118145.json | 8 + 7 files changed, 207 insertions(+) create mode 100644 mtglib/internal/faketls/client_hello_test.go create mode 100644 mtglib/internal/faketls/testdata/client-hello-bad-fa2e46cdb33e2a1b.json create mode 100644 mtglib/internal/faketls/testdata/client-hello-ok-19dfe38384b9884b.json create mode 100644 mtglib/internal/faketls/testdata/client-hello-ok-48f8a72a56f3174a.json create mode 100644 mtglib/internal/faketls/testdata/client-hello-ok-651054256093c6cd.json create mode 100644 mtglib/internal/faketls/testdata/client-hello-ok-79d01ef18a9d2621.json create mode 100644 mtglib/internal/faketls/testdata/client-hello-ok-7a5569f05b118145.json diff --git a/mtglib/internal/faketls/client_hello_test.go b/mtglib/internal/faketls/client_hello_test.go new file mode 100644 index 0000000..f088cf2 --- /dev/null +++ b/mtglib/internal/faketls/client_hello_test.go @@ -0,0 +1,159 @@ +package faketls_test + +import ( + "encoding/base64" + "encoding/json" + "os" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/9seconds/mtg/v2/mtglib" + "github.com/9seconds/mtg/v2/mtglib/internal/faketls" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" +) + +type ClientHelloSnapshot struct { + Time int `json:"time"` + Random string `json:"random"` + SessionID string `json:"session-id"` + Host string `json:"host"` + CipherSuite int `json:"cipher-suite"` + Full string `json:"full"` +} + +func (c ClientHelloSnapshot) GetTime() time.Time { + return time.Unix(int64(c.Time), 0) +} + +func (c ClientHelloSnapshot) GetRandom() []byte { + data, _ := base64.StdEncoding.DecodeString(c.Random) + + return data +} + +func (c ClientHelloSnapshot) GetSessionID() []byte { + data, _ := base64.StdEncoding.DecodeString(c.SessionID) + + return data +} + +func (c ClientHelloSnapshot) GetHost() string { + return c.Host +} + +func (c ClientHelloSnapshot) GetCipherSuite() uint16 { + return uint16(c.CipherSuite) +} + +func (c ClientHelloSnapshot) GetFull() []byte { + data, _ := base64.StdEncoding.DecodeString(c.Full) + + return data +} + +type ClientHelloTestSuite struct { + suite.Suite + + secret mtglib.Secret +} + +func (suite *ClientHelloTestSuite) SetupSuite() { + parsed, err := mtglib.ParseSecret("ee367a189aee18fa31c190054efd4a8e9573746f726167652e676f6f676c65617069732e636f6d") + if err != nil { + panic(err) + } + + suite.secret = parsed +} + +func (suite *ClientHelloTestSuite) TestEmptyHandshake() { + _, err := faketls.ParseClientHello(suite.secret.Key[:], nil) + suite.Error(err) +} + +func (suite *ClientHelloTestSuite) TestIncorrectHandshakeType() { + data := make([]byte, 1024) + data[0] = 0x02 + + _, err := faketls.ParseClientHello(suite.secret.Key[:], data) + suite.Error(err) +} + +func (suite *ClientHelloTestSuite) TestIncorrectLength() { + data := make([]byte, 1024) + data[0] = 0x01 + data[1] = 0xff + data[2] = 0xff + + _, err := faketls.ParseClientHello(suite.secret.Key[:], data) + suite.Error(err) +} + +func (suite *ClientHelloTestSuite) TestSnapshotOk() { + files, err := os.ReadDir("testdata") + suite.NoError(err) + + testData := []string{} + + for _, v := range files { + if strings.HasPrefix(v.Name(), "client-hello-ok") { + testData = append(testData, v.Name()) + } + } + + for _, name := range testData { + path := filepath.Join("testdata", name) + + suite.T().Run(name, func(t *testing.T) { + fileData, err := os.ReadFile(path) + assert.NoError(t, err) + + snapshot := &ClientHelloSnapshot{} + assert.NoError(t, json.Unmarshal(fileData, snapshot)) + + hello, err := faketls.ParseClientHello(suite.secret.Key[:], snapshot.GetFull()) + assert.NoError(t, err) + assert.WithinDuration(t, snapshot.GetTime(), hello.Time, time.Second) + assert.Equal(t, snapshot.GetRandom(), hello.Random[:]) + assert.Equal(t, snapshot.GetSessionID(), hello.SessionID) + assert.Equal(t, snapshot.GetHost(), hello.Host) + assert.Equal(t, snapshot.GetCipherSuite(), hello.CipherSuite) + }) + } +} + +func (suite *ClientHelloTestSuite) TestSnapshotBad() { + files, err := os.ReadDir("testdata") + suite.NoError(err) + + testData := []string{} + + for _, v := range files { + if strings.HasPrefix(v.Name(), "client-hello-bad") { + testData = append(testData, v.Name()) + } + } + + for _, name := range testData { + path := filepath.Join("testdata", name) + + suite.T().Run(name, func(t *testing.T) { + fileData, err := os.ReadFile(path) + assert.NoError(t, err) + + snapshot := &ClientHelloSnapshot{} + assert.NoError(t, json.Unmarshal(fileData, snapshot)) + + _, err = faketls.ParseClientHello(suite.secret.Key[:], snapshot.GetFull()) + assert.Error(t, err) + }) + } +} + +func TestClientHello(t *testing.T) { + t.Parallel() + suite.Run(t, &ClientHelloTestSuite{}) +} diff --git a/mtglib/internal/faketls/testdata/client-hello-bad-fa2e46cdb33e2a1b.json b/mtglib/internal/faketls/testdata/client-hello-bad-fa2e46cdb33e2a1b.json new file mode 100644 index 0000000..046a122 --- /dev/null +++ b/mtglib/internal/faketls/testdata/client-hello-bad-fa2e46cdb33e2a1b.json @@ -0,0 +1,8 @@ +{ + "time": 1617181365, + "random": "XvCPc3aAbHbhRLv0kUmy6BfPZOGvsused5/HNsKXEPs=", + "session-id": "St2BZ2uHMFn3B2trD1jfdtpjoJOOg6JBeLhFcyCMCq4=", + "host": "storage.googleapis.com", + "cipher-suite": 4867, + "full": "AQAB/AMDXvCPc3aAbHbhRLv0kUmy6BfPZOGvsused5/HNsKXEPsgSt2BZ2uHMFn3B2trD1jfdtpjoJOOg6JBeLhFcyCACq4ANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFANAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAgB/7oLx9JElIALsLJS91H2QNyU1H0osKwIUelVndsLyIALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" +} diff --git a/mtglib/internal/faketls/testdata/client-hello-ok-19dfe38384b9884b.json b/mtglib/internal/faketls/testdata/client-hello-ok-19dfe38384b9884b.json new file mode 100644 index 0000000..0a47b92 --- /dev/null +++ b/mtglib/internal/faketls/testdata/client-hello-ok-19dfe38384b9884b.json @@ -0,0 +1,8 @@ +{ + "time": 1617181365, + "random": "XvCPc3aAbHbhRLv0kUmy6BfPZOGvsused5/HNsKXEPs=", + "session-id": "St2BZ2uHMFn3B2trD1jfdtpjoJOOg6JBeLhFcyCMCq4=", + "host": "storage.googleapis.com", + "cipher-suite": 4867, + "full": "AQAB/AMDXvCPc3aAbHbhRLv0kUmy6BfPZOGvsused5/HNsKXEPsgSt2BZ2uHMFn3B2trD1jfdtpjoJOOg6JBeLhFcyCMCq4ANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAgB/7oLx9JElIALsLJS91H2QNyU1H0osKwIUelVndsLyIALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" +} \ No newline at end of file diff --git a/mtglib/internal/faketls/testdata/client-hello-ok-48f8a72a56f3174a.json b/mtglib/internal/faketls/testdata/client-hello-ok-48f8a72a56f3174a.json new file mode 100644 index 0000000..adc7cc7 --- /dev/null +++ b/mtglib/internal/faketls/testdata/client-hello-ok-48f8a72a56f3174a.json @@ -0,0 +1,8 @@ +{ + "time": 1617181352, + "random": "oYEu33jl+zQbUKMtQbV1OHB0gXIM2y2aq9iY0QX12os=", + "session-id": "FGqA3ZFYrSlj//xl7lammNn64K9/MK2mQ3HJUGvP+8g=", + "host": "storage.googleapis.com", + "cipher-suite": 4867, + "full": "AQAB/AMDoYEu33jl+zQbUKMtQbV1OHB0gXIM2y2aq9iY0QX12osgFGqA3ZFYrSlj//xl7lammNn64K9/MK2mQ3HJUGvP+8gANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAga6CocpFP8Qd4YCFR9pkaCr97po2ALj0P5nI9Nnb3UWMALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" +} \ No newline at end of file diff --git a/mtglib/internal/faketls/testdata/client-hello-ok-651054256093c6cd.json b/mtglib/internal/faketls/testdata/client-hello-ok-651054256093c6cd.json new file mode 100644 index 0000000..c5165fb --- /dev/null +++ b/mtglib/internal/faketls/testdata/client-hello-ok-651054256093c6cd.json @@ -0,0 +1,8 @@ +{ + "time": 1617181352, + "random": "5V5sSprk/tFIgy+x1BeKNGhLlFkqfggLpgN7GYOA1ro=", + "session-id": "jxr4d6PXPDk+Lwx3WUp9wvj8TGlOxEdrRJ0ydyJ9+H8=", + "host": "storage.googleapis.com", + "cipher-suite": 4867, + "full": "AQAB/AMD5V5sSprk/tFIgy+x1BeKNGhLlFkqfggLpgN7GYOA1rogjxr4d6PXPDk+Lwx3WUp9wvj8TGlOxEdrRJ0ydyJ9+H8ANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAgrulAaqUdKeVYM0F+pu6on/h6LBpOyzOKG4xFIKcoFk4ALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" +} \ No newline at end of file diff --git a/mtglib/internal/faketls/testdata/client-hello-ok-79d01ef18a9d2621.json b/mtglib/internal/faketls/testdata/client-hello-ok-79d01ef18a9d2621.json new file mode 100644 index 0000000..a642fec --- /dev/null +++ b/mtglib/internal/faketls/testdata/client-hello-ok-79d01ef18a9d2621.json @@ -0,0 +1,8 @@ +{ + "time": 1617181365, + "random": "8xljlOhkDlkafEF5vu3e1r3fWvh8AX548wC3hLZ3szQ=", + "session-id": "00uvDYKnFyZFKyf3HlLwWGCOyeHsPFiU5UZ+Fs5pDAU=", + "host": "storage.googleapis.com", + "cipher-suite": 4867, + "full": "AQAB/AMD8xljlOhkDlkafEF5vu3e1r3fWvh8AX548wC3hLZ3szQg00uvDYKnFyZFKyf3HlLwWGCOyeHsPFiU5UZ+Fs5pDAUANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAg/9P7140NtKzjyDwBf99mOy1+FjRPAPHTNQ9WxHOKpV4ALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" +} \ No newline at end of file diff --git a/mtglib/internal/faketls/testdata/client-hello-ok-7a5569f05b118145.json b/mtglib/internal/faketls/testdata/client-hello-ok-7a5569f05b118145.json new file mode 100644 index 0000000..5b803da --- /dev/null +++ b/mtglib/internal/faketls/testdata/client-hello-ok-7a5569f05b118145.json @@ -0,0 +1,8 @@ +{ + "time": 1617181352, + "random": "zja3MLZ8WGSfsQRtPV75+tY6gbK3zKPi1Sy7SBBafg4=", + "session-id": "qPut2yMqXa9zGLII/872SQ3d4Tfqo0uoDb7tpkRfBnA=", + "host": "storage.googleapis.com", + "cipher-suite": 4867, + "full": "AQAB/AMDzja3MLZ8WGSfsQRtPV75+tY6gbK3zKPi1Sy7SBBafg4gqPut2yMqXa9zGLII/872SQ3d4Tfqo0uoDb7tpkRfBnAANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAgXviLRAqAYJ8xOLdlcsUhldI4Xl0g/s9+y2Qrd8raPEgALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" +} \ No newline at end of file