Files
wechat_ipad_pro/clientsdk/mmtls/mmrequest.go
2026-02-17 13:06:23 +08:00

158 lines
5.2 KiB
Go

package mmtls
import (
"errors"
"time"
"xiawan/wx/clientsdk/baseutils"
)
// CreateRecordData 根据请求创建完整的mmtls数据包
func CreateRecordData(recordType byte, data []byte) []byte {
recordHead := &RecordHead{}
recordHead.Type = recordType
recordHead.Tag = 0xF103
recordHead.Size = uint16(len(data))
// 组包返回
retBytes := make([]byte, 0)
retBytes = append(retBytes, RecordHeadSerialize(recordHead)[0:]...)
retBytes = append(retBytes, data[0:]...)
return retBytes
}
// GetRecordDataByLength 根据长度获取RecordData
func GetRecordDataByLength(recordType byte, len uint16) []byte {
recordHead := &RecordHead{}
recordHead.Type = recordType
recordHead.Tag = 0xF103
recordHead.Size = len
return RecordHeadSerialize(recordHead)
}
// CreateHandShakeClientHelloData 创建ClientHello数据包
func CreateHandShakeClientHelloData(mmInfo *MMInfo) []byte {
clientHello := &ClientHello{}
// Version
clientHello.Version = 0xF103
// CipherSuiteList
clientHello.CipherSuiteList = make([]*CipherSuite, 2)
cipherSuite1 := &CipherSuite{}
cipherSuite1.SuiteCode = 0xC02B
clientHello.CipherSuiteList[0] = cipherSuite1
cipherSuite2 := &CipherSuite{}
cipherSuite2.SuiteCode = 0xA8
clientHello.CipherSuiteList[1] = cipherSuite2
// RandomBytes
clientHello.RandomBytes = baseutils.RandomBytes(32)
// ClientGmtTime
clientHello.ClientGmtTime = (uint32)(time.Now().UnixNano() / 1000000000)
// ExtensionList
extensionList := make([]*Extension, 0)
pskCount := len(mmInfo.ShortPskList)
if pskCount > 1 {
// 握手是用最后一个
extensionList = append(extensionList, CreatePreSharedKeyExtensionData(mmInfo.ShortPskList[pskCount-1]))
}
// 随机生成两队ECDHKey
extensionList = append(extensionList, CreateClientKeyShareExtensionData(mmInfo.ClientEcdhKeys))
clientHello.ExtensionList = extensionList
return ClientHelloSerialize(clientHello)
}
// CreatePreSharedKeyExtensionData 创建CreatePreSharedKeyExtension数据
func CreatePreSharedKeyExtensionData(psk *Psk) *Extension {
preSharedKeyExtension := &PreSharedKeyExtension{}
preSharedKeyExtension.PskList = make([]*Psk, 1)
// 选取前面协商的最后一个Psk
preSharedKeyExtension.PskList[0] = psk
// 序列化
retExtension := PreSharedKeyExtensionSerialize(preSharedKeyExtension)
return retExtension
}
// CreateClientKeyShareExtensionData 创建ClientKeyShareExtension数据
func CreateClientKeyShareExtensionData(clientEcdhKeys *ClientEcdhKeys) *Extension {
// retExtension
clientKeyShareExtension := &ClientKeyShareExtension{}
// ClientKeyOfferList
clientKeyShareExtension.ClientKeyOfferList = make([]*ClientKeyOffer, 2)
// 随机第一个EcdhKey
clientKeyShareExtension.ClientKeyOfferList[0] = CreateClientKeyOfferData(1, clientEcdhKeys.PubKeyBuf1)
// 随机第一个EcdhKey
clientKeyShareExtension.ClientKeyOfferList[1] = CreateClientKeyOfferData(2, clientEcdhKeys.PubKeyBuf2)
// CertificateVersion
clientKeyShareExtension.CertificateVersion = 1
// 返回序列化的ClientKeyShareExtension
return ClientKeyShareExtensionSerialize(clientKeyShareExtension)
}
// CreateClientKeyOfferData 创建CreateClientKeyOffer数据
func CreateClientKeyOfferData(version uint32, publicKey []byte) *ClientKeyOffer {
clientKeyOffser := &ClientKeyOffer{}
clientKeyOffser.PublicValue = publicKey
clientKeyOffser.Version = version
return clientKeyOffser
}
// CreateClientHelloData 创建ClientHello数据包
func CreateClientHelloData(mmInfo *MMInfo) (*ClientHello, error) {
clientHello := &ClientHello{}
// Version
clientHello.Version = 0xF103
// CipherSuiteList
clientHello.CipherSuiteList = make([]*CipherSuite, 1)
cipherSuite := &CipherSuite{}
cipherSuite.SuiteCode = 0xA8
clientHello.CipherSuiteList[0] = cipherSuite
// RandomBytes
clientHello.RandomBytes = baseutils.RandomBytes(32)
// ClientGmtTime
clientHello.ClientGmtTime = (uint32)(time.Now().UnixNano() / 1000000000)
// ExtensionList
extensionList := make([]*Extension, 0)
pskCount := len(mmInfo.ShortPskList)
if pskCount <= 0 {
return nil, errors.New("CreateClientHelloData error: mmInfo.PskList empty")
}
extensionList = append(extensionList, CreatePreSharedKeyExtensionData(mmInfo.ShortPskList[0]))
clientHello.ExtensionList = extensionList
return clientHello, nil
}
// CreateEarlyEncryptDataExtension 创建EarlyEncryptDataExtension
func CreateEarlyEncryptDataExtension() *Extension {
retEarlyEncryptDataExtension := &EarlyEncryptDataExtension{}
retEarlyEncryptDataExtension.ClientGmtTime = (uint32)(time.Now().UnixNano() / 1000000000)
return EarlyEncryptDataExtensionSerialize(retEarlyEncryptDataExtension)
}
// CreateEncryptedExtensions 创建EncryptedExtensions
func CreateEncryptedExtensions() *EncryptedExtensions {
retEncryptedExtensions := &EncryptedExtensions{}
// ExtensionList
retEncryptedExtensions.ExtensionList = make([]*Extension, 1)
retEncryptedExtensions.ExtensionList[0] = CreateEarlyEncryptDataExtension()
return retEncryptedExtensions
}
// CreateFinished 创建Finish包
func CreateFinished(verifyData []byte) *Finished {
retFinished := &Finished{}
retFinished.VerifyData = verifyData
return retFinished
}
// GetAlertData 获取Alert数据
func GetAlertData() []byte {
return []byte{0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x01}
}