voucher/internal/pkg/cmb/smutil.go

83 lines
1.7 KiB
Go

package cmb
import (
"crypto/rand"
"fmt"
"math/big"
"strings"
"voucher/internal/pkg/helper"
)
func GenerateSM4Key() []byte {
str := "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890"
buffer := make([]byte, 16)
for i := 0; i < 16; i++ {
nextInt, _ := rand.Int(rand.Reader, big.NewInt(int64(len(str))))
buffer[i] = str[nextInt.Int64()]
}
return buffer
}
// GetSM4IV 获取SM4的IV
func GetSM4IV() []byte {
return RandomBytes(16)
}
func RandomBytes(length int) []byte {
str := "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890"
buffer := make([]byte, length)
for i := 0; i < 16; i++ {
nextInt, _ := rand.Int(rand.Reader, big.NewInt(int64(len(str))))
buffer[i] = str[nextInt.Int64()]
}
return buffer
}
func Padding(input []byte, mode int) []byte {
if input == nil {
return nil
} else {
var ret []byte
if mode == 1 {
p := 16 - len(input)%16
ret = make([]byte, len(input)+p)
copy(ret, input)
for i := 0; i < p; i++ {
ret[len(input)+i] = byte(p)
}
} else {
p := input[len(input)-1]
ret = make([]byte, len(input)-int(p))
copy(ret, input[:len(input)-int(p)])
}
return ret
}
}
func AssemblingByteArray(key, iv []byte) []byte {
os := make([]byte, 0)
os = append(os, key...)
os = append(os, []byte("|")...)
os = append(os, iv...)
return os
}
func SortStructStr(req interface{}, funcName string) string {
kvRows := helper.SortStructFieldsByKey(req)
var strToBeSigned strings.Builder
for _, kv := range kvRows {
if kv.Key == "sign" {
continue
}
if kv.Value == "" {
continue
}
strToBeSigned.WriteString(fmt.Sprintf("%s=%s&", kv.Key, kv.Value))
}
return fmt.Sprintf("%s?%s", funcName, strings.TrimRight(strToBeSigned.String(), "&"))
}