first commit
This commit is contained in:
@@ -0,0 +1,271 @@
|
||||
package mmtls
|
||||
|
||||
import (
|
||||
"xiawan/wx/clientsdk/baseutils"
|
||||
)
|
||||
|
||||
// RecordHeadSerialize 序列化RecordHead
|
||||
func RecordHeadSerialize(recordHead *RecordHead) []byte {
|
||||
retBytes := make([]byte, 0)
|
||||
// Type
|
||||
retBytes = append(retBytes, recordHead.Type)
|
||||
// Tag
|
||||
retBytes = append(retBytes, baseutils.Int16ToBytesBigEndian(recordHead.Tag)[0:]...)
|
||||
// size
|
||||
retBytes = append(retBytes, baseutils.Int16ToBytesBigEndian(recordHead.Size)[0:]...)
|
||||
|
||||
return retBytes
|
||||
}
|
||||
|
||||
// ClientHelloSerialize 序列化ClientHello
|
||||
func ClientHelloSerialize(clientHello *ClientHello) []byte {
|
||||
bodyData := make([]byte, 0)
|
||||
// Type
|
||||
bodyData = append(bodyData, ClientHelloType)
|
||||
// Version
|
||||
bodyData = append(bodyData, baseutils.Int16ToBytesLittleEndian(clientHello.Version)[0:]...)
|
||||
// suiteCount
|
||||
suiteCount := byte(len(clientHello.CipherSuiteList))
|
||||
bodyData = append(bodyData, suiteCount)
|
||||
// suiteList
|
||||
suiteList := clientHello.CipherSuiteList
|
||||
for index := 0; index < int(suiteCount); index++ {
|
||||
// suiteCode
|
||||
bodyData = append(bodyData, baseutils.Int16ToBytesBigEndian(suiteList[index].SuiteCode)[0:]...)
|
||||
}
|
||||
// RandomBytes
|
||||
bodyData = append(bodyData, clientHello.RandomBytes[0:]...)
|
||||
// ClientGmtTime
|
||||
bodyData = append(bodyData, baseutils.Int32ToBytes(clientHello.ClientGmtTime)[0:]...)
|
||||
// Extensions
|
||||
extensionsData := ExtensionsSerialize(clientHello.ExtensionList)
|
||||
bodyData = append(bodyData, extensionsData[0:]...)
|
||||
|
||||
// 返回数据
|
||||
retBytes := make([]byte, 0)
|
||||
totalLength := uint32(len(bodyData))
|
||||
retBytes = append(retBytes, baseutils.Int32ToBytes(totalLength)[0:]...)
|
||||
retBytes = append(retBytes, bodyData[0:]...)
|
||||
return retBytes
|
||||
}
|
||||
|
||||
// ExtensionsSerialize 序列化Extensions
|
||||
func ExtensionsSerialize(extensionList []*Extension) []byte {
|
||||
retBytes := make([]byte, 0)
|
||||
|
||||
// bodyData
|
||||
bodyData := make([]byte, 0)
|
||||
// MapSize
|
||||
extensionCount := byte(len(extensionList))
|
||||
bodyData = append(bodyData, extensionCount)
|
||||
for index := 0; index < int(extensionCount); index++ {
|
||||
// Extension TotalLength
|
||||
extensionLength := uint32(len(extensionList[index].ExtensionData))
|
||||
bodyData = append(bodyData, baseutils.Int32ToBytes(extensionLength)[0:]...)
|
||||
// extensionData
|
||||
bodyData = append(bodyData, extensionList[index].ExtensionData[0:]...)
|
||||
}
|
||||
|
||||
// Extensions Size
|
||||
extensionsSize := uint32(len(bodyData))
|
||||
retBytes = append(retBytes, baseutils.Int32ToBytes(extensionsSize)[0:]...)
|
||||
|
||||
// ExtensionsData
|
||||
retBytes = append(retBytes, bodyData[0:]...)
|
||||
return retBytes
|
||||
}
|
||||
|
||||
// PskSerialize 序列化Psk
|
||||
func PskSerialize(psk *Psk) []byte {
|
||||
// BodyData
|
||||
bodyData := make([]byte, 0)
|
||||
// Type
|
||||
bodyData = append(bodyData, psk.Type)
|
||||
// TicketLifeTimeHint
|
||||
bodyData = append(bodyData, baseutils.Int32ToBytes(psk.TicketKLifeTimeHint)[0:]...)
|
||||
// MacValue
|
||||
macValueLen := uint16(len(psk.MacValue))
|
||||
bodyData = append(bodyData, baseutils.Int16ToBytesBigEndian(macValueLen)[0:]...)
|
||||
bodyData = append(bodyData, psk.MacValue[0:]...)
|
||||
// KeyVersion
|
||||
bodyData = append(bodyData, baseutils.Int32ToBytes(psk.KeyVersion)[0:]...)
|
||||
// IV
|
||||
ivLen := uint16(len(psk.Iv))
|
||||
bodyData = append(bodyData, baseutils.Int16ToBytesBigEndian(ivLen)[0:]...)
|
||||
bodyData = append(bodyData, psk.Iv[0:]...)
|
||||
// EncryptTicket
|
||||
encryptTicketLen := uint16(len(psk.EncryptedTicket))
|
||||
bodyData = append(bodyData, baseutils.Int16ToBytesBigEndian(encryptTicketLen)[0:]...)
|
||||
bodyData = append(bodyData, psk.EncryptedTicket[0:]...)
|
||||
|
||||
// 返回数据
|
||||
retBytes := make([]byte, 0)
|
||||
bodyLen := uint32(len(bodyData))
|
||||
retBytes = append(retBytes, baseutils.Int32ToBytes(bodyLen)[0:]...)
|
||||
retBytes = append(retBytes, bodyData[0:]...)
|
||||
|
||||
return retBytes
|
||||
}
|
||||
|
||||
// ClientKeyOfferSerialize 序列化ClientKeyOffer
|
||||
func ClientKeyOfferSerialize(clientKeyOffer *ClientKeyOffer) []byte {
|
||||
// BodyData
|
||||
bodyData := make([]byte, 0)
|
||||
// Version
|
||||
bodyData = append(bodyData, baseutils.Int32ToBytes(clientKeyOffer.Version)[0:]...)
|
||||
// PublicValue
|
||||
publicValueLen := uint16(len(clientKeyOffer.PublicValue))
|
||||
bodyData = append(bodyData, baseutils.Int16ToBytesBigEndian(publicValueLen)[0:]...)
|
||||
if publicValueLen > 0 {
|
||||
bodyData = append(bodyData, clientKeyOffer.PublicValue[0:]...)
|
||||
}
|
||||
|
||||
// 返回数据
|
||||
retBytes := make([]byte, 0)
|
||||
bodyDataLen := uint32(len(bodyData))
|
||||
retBytes = append(retBytes, baseutils.Int32ToBytes(bodyDataLen)[0:]...)
|
||||
retBytes = append(retBytes, bodyData[0:]...)
|
||||
return retBytes
|
||||
}
|
||||
|
||||
// EncryptedExtensionsSerialize 序列化EncryptedExtensions
|
||||
func EncryptedExtensionsSerialize(encryptedExtensions *EncryptedExtensions) []byte {
|
||||
bodyData := make([]byte, 0)
|
||||
// Type
|
||||
bodyData = append(bodyData, EncryptedExtensionsType)
|
||||
// ExtensionList
|
||||
extensionsData := ExtensionsSerialize(encryptedExtensions.ExtensionList)
|
||||
bodyData = append(bodyData, extensionsData[0:]...)
|
||||
|
||||
// 返回数据
|
||||
retBytes := make([]byte, 0)
|
||||
bodyDataLen := uint32(len(bodyData))
|
||||
retBytes = append(retBytes, baseutils.Int32ToBytes(bodyDataLen)[0:]...)
|
||||
retBytes = append(retBytes, bodyData[0:]...)
|
||||
return retBytes
|
||||
}
|
||||
|
||||
// HTTPHandlerSerialize 序列化HTTPHandler
|
||||
func HTTPHandlerSerialize(httpHandler *HTTPHandler) []byte {
|
||||
bodyData := make([]byte, 0)
|
||||
// URL
|
||||
urlLength := uint16(len(httpHandler.URL))
|
||||
bodyData = append(bodyData, baseutils.Int16ToBytesBigEndian(urlLength)[0:]...)
|
||||
bodyData = append(bodyData, []byte(httpHandler.URL)[0:]...)
|
||||
|
||||
// Host
|
||||
hostLength := uint16(len(httpHandler.Host))
|
||||
bodyData = append(bodyData, baseutils.Int16ToBytesBigEndian(hostLength)[0:]...)
|
||||
bodyData = append(bodyData, []byte(httpHandler.Host)[0:]...)
|
||||
|
||||
// MMPkg
|
||||
mmpkgLength := uint32(len(httpHandler.MMPkg))
|
||||
bodyData = append(bodyData, baseutils.Int32ToBytes(mmpkgLength)[0:]...)
|
||||
bodyData = append(bodyData, httpHandler.MMPkg[0:]...)
|
||||
|
||||
// 返回数据
|
||||
retBytes := make([]byte, 0)
|
||||
bodyDataLen := uint32(len(bodyData))
|
||||
retBytes = append(retBytes, baseutils.Int32ToBytes(bodyDataLen)[0:]...)
|
||||
retBytes = append(retBytes, bodyData[0:]...)
|
||||
return retBytes
|
||||
}
|
||||
|
||||
// FinishedSerialize 序列化Finished包
|
||||
func FinishedSerialize(finished *Finished) []byte {
|
||||
bodyData := make([]byte, 0)
|
||||
// Type
|
||||
bodyData = append(bodyData, FinishedType)
|
||||
// VerifyData
|
||||
verifyDataLen := uint16(uint32(len(finished.VerifyData)))
|
||||
bodyData = append(bodyData, baseutils.Int16ToBytesBigEndian(verifyDataLen)[0:]...)
|
||||
bodyData = append(bodyData, finished.VerifyData[0:]...)
|
||||
|
||||
// 返回数据
|
||||
retBytes := make([]byte, 0)
|
||||
bodyDataLen := uint32(len(bodyData))
|
||||
retBytes = append(retBytes, baseutils.Int32ToBytes(bodyDataLen)[0:]...)
|
||||
retBytes = append(retBytes, bodyData[0:]...)
|
||||
return retBytes
|
||||
}
|
||||
|
||||
// --------------- 各类Extension的序列化 ---------------
|
||||
|
||||
// PreSharedKeyExtensionSerialize 序列化PreSharedKeyExtension
|
||||
func PreSharedKeyExtensionSerialize(preSharedKeyExtension *PreSharedKeyExtension) *Extension {
|
||||
// ExtensionBytes
|
||||
extensionBytes := make([]byte, 0)
|
||||
// PreSharedKeyExtensionType
|
||||
extensionBytes = append(extensionBytes, baseutils.Int16ToBytesBigEndian(PreSharedKeyExtensionType)[0:]...)
|
||||
// pskCount
|
||||
pskCount := byte(len(preSharedKeyExtension.PskList))
|
||||
extensionBytes = append(extensionBytes, pskCount)
|
||||
// PskList
|
||||
for index := 0; index < int(pskCount); index++ {
|
||||
psk := preSharedKeyExtension.PskList[index]
|
||||
pskData := PskSerialize(psk)
|
||||
extensionBytes = append(extensionBytes, pskData[0:]...)
|
||||
}
|
||||
|
||||
// 返回数据
|
||||
retExtension := &Extension{}
|
||||
retExtension.ExtensionType = PreSharedKeyExtensionType
|
||||
retExtension.ExtensionData = extensionBytes
|
||||
return retExtension
|
||||
}
|
||||
|
||||
// ClientKeyShareExtensionSerialize 序列化ClientKeyShareExtension
|
||||
func ClientKeyShareExtensionSerialize(clientKeyShareExtension *ClientKeyShareExtension) *Extension {
|
||||
// ExtensionBytes
|
||||
extensionBytes := make([]byte, 0)
|
||||
// ClientKeyShareType
|
||||
extensionBytes = append(extensionBytes, baseutils.Int16ToBytesBigEndian(ClientKeyShareType)[0:]...)
|
||||
// KeyOfferCount
|
||||
keyOfferCount := byte(len(clientKeyShareExtension.ClientKeyOfferList))
|
||||
extensionBytes = append(extensionBytes, keyOfferCount)
|
||||
// KeyOfferList
|
||||
for index := 0; index < int(keyOfferCount); index++ {
|
||||
keyOffer := clientKeyShareExtension.ClientKeyOfferList[index]
|
||||
keyOfferData := ClientKeyOfferSerialize(keyOffer)
|
||||
extensionBytes = append(extensionBytes, keyOfferData[0:]...)
|
||||
}
|
||||
// CertificateVersion
|
||||
extensionBytes = append(extensionBytes, baseutils.Int32ToBytes(clientKeyShareExtension.CertificateVersion)[0:]...)
|
||||
|
||||
// 返回数据
|
||||
retExtension := &Extension{}
|
||||
retExtension.ExtensionType = ClientKeyShareType
|
||||
retExtension.ExtensionData = extensionBytes
|
||||
return retExtension
|
||||
}
|
||||
|
||||
// EarlyEncryptDataExtensionSerialize 序列化EarlyEncryptDataExtension
|
||||
func EarlyEncryptDataExtensionSerialize(earlyEncryptDataExtension *EarlyEncryptDataExtension) *Extension {
|
||||
// ExtensionBytes
|
||||
extensionBytes := make([]byte, 0)
|
||||
// ClientKeyShareType
|
||||
extensionBytes = append(extensionBytes, baseutils.Int16ToBytesBigEndian(EarlyEncryptDataType)[0:]...)
|
||||
// ClientGmtTime
|
||||
extensionBytes = append(extensionBytes, baseutils.Int32ToBytes(earlyEncryptDataExtension.ClientGmtTime)[0:]...)
|
||||
|
||||
// 返回数据
|
||||
retExtension := &Extension{}
|
||||
retExtension.ExtensionType = EarlyEncryptDataType
|
||||
retExtension.ExtensionData = extensionBytes
|
||||
return retExtension
|
||||
}
|
||||
|
||||
// LongPackHeaderInfoSerialize 序列化LongPackHeaderInfo
|
||||
func LongPackHeaderInfoSerialize(packTagInfo *LongPackHeaderInfo) []byte {
|
||||
retBytes := make([]byte, 0)
|
||||
// Type
|
||||
retBytes = append(retBytes, baseutils.Int16ToBytesBigEndian(packTagInfo.HeaderLen)[0:]...)
|
||||
// Version
|
||||
retBytes = append(retBytes, baseutils.Int16ToBytesBigEndian(packTagInfo.Version)[0:]...)
|
||||
// Operation
|
||||
retBytes = append(retBytes, baseutils.Int32ToBytes(packTagInfo.Operation)[0:]...)
|
||||
// SequenceNumber
|
||||
retBytes = append(retBytes, baseutils.Int32ToBytes(packTagInfo.SequenceNumber)[0:]...)
|
||||
|
||||
return retBytes
|
||||
}
|
||||
Reference in New Issue
Block a user