158 lines
5.2 KiB
Go
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}
|
|
}
|