mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-09-01 15:04:01 +03:00
Add base faketls processing
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
package faketls
|
||||
|
||||
import (
|
||||
"crypto/hmac"
|
||||
"crypto/rand"
|
||||
"crypto/sha256"
|
||||
"encoding/binary"
|
||||
"io"
|
||||
mrand "math/rand"
|
||||
|
||||
"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
|
||||
"golang.org/x/crypto/curve25519"
|
||||
)
|
||||
|
||||
func SendWelcomePacket(writer io.Writer, secret []byte, clientHello ClientHello) error {
|
||||
buf := acquireBytesBuffer()
|
||||
defer releaseBytesBuffer(buf)
|
||||
|
||||
rec := record.AcquireRecord()
|
||||
defer record.ReleaseRecord(rec)
|
||||
|
||||
rec.Type = record.TypeHandshake
|
||||
rec.Version = record.Version12
|
||||
|
||||
generateServerHello(&rec.Payload, clientHello)
|
||||
rec.Dump(buf)
|
||||
rec.Reset()
|
||||
|
||||
rec.Type = record.TypeChangeCipherSpec
|
||||
rec.Version = record.Version12
|
||||
rec.Payload.WriteByte(0x01)
|
||||
|
||||
rec.Dump(buf)
|
||||
rec.Reset()
|
||||
|
||||
rec.Type = record.TypeApplicationData
|
||||
rec.Version = record.Version12
|
||||
|
||||
if _, err := io.CopyN(&rec.Payload, rand.Reader, int64(1024+mrand.Intn(3092))); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
rec.Dump(buf)
|
||||
|
||||
packet := buf.Bytes()
|
||||
mac := hmac.New(sha256.New, secret)
|
||||
|
||||
mac.Write(clientHello.Random[:])
|
||||
mac.Write(packet)
|
||||
|
||||
copy(packet[WelcomePacketRandomOffset:], mac.Sum(nil))
|
||||
|
||||
if _, err := writer.Write(packet); err != nil {
|
||||
return err // nolint: wrapcheck
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func generateServerHello(writer io.Writer, clientHello ClientHello) {
|
||||
bodyBuf := acquireBytesBuffer()
|
||||
defer releaseBytesBuffer(bodyBuf)
|
||||
|
||||
sliceBuf := [2]byte{}
|
||||
digest := [RandomLen]byte{}
|
||||
|
||||
binary.BigEndian.PutUint16(sliceBuf[:], uint16(record.Version12))
|
||||
bodyBuf.Write(sliceBuf[:])
|
||||
bodyBuf.Write(digest[:])
|
||||
bodyBuf.WriteByte(byte(len(clientHello.SessionID)))
|
||||
bodyBuf.Write(clientHello.SessionID)
|
||||
|
||||
binary.BigEndian.PutUint16(sliceBuf[:], clientHello.CipherSuite)
|
||||
bodyBuf.Write(sliceBuf[:])
|
||||
bodyBuf.Write(serverHelloSuffix)
|
||||
|
||||
scalar := [32]byte{}
|
||||
rand.Read(scalar[:])
|
||||
curve, _ := curve25519.X25519(scalar[:], curve25519.Basepoint)
|
||||
bodyBuf.Write(curve)
|
||||
|
||||
header := [4]byte{0, 0, 0, 0}
|
||||
binary.BigEndian.PutUint32(header[:], uint32(bodyBuf.Len()))
|
||||
header[0] = HandshakeTypeServer
|
||||
|
||||
writer.Write(header[:])
|
||||
bodyBuf.WriteTo(writer)
|
||||
}
|
||||
Reference in New Issue
Block a user