first commit
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
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}
|
||||
}
|
||||
Reference in New Issue
Block a user