voucher/internal/pkg/cmb/sm2/sdk/cmblife.go

57 lines
1.0 KiB
Go

package sdk
import (
"crypto/elliptic"
"encoding/binary"
"math/big"
"voucher/internal/pkg/cmb/sm2/util"
)
// CmbLifeSdk 招商银行生活服务
type CmbLifeSdk struct {
BaseSdk
}
func NewCmbLifeSdk() SDK {
return &CmbLifeSdk{}
}
func (c *CmbLifeSdk) Kdf(cur elliptic.Curve, x *big.Int, y *big.Int, c2 []byte) error {
bufSize := 4
digest := util.New()
if bufSize < digest.Size() {
bufSize = digest.Size()
}
buf := make([]byte, bufSize)
encDataLen := len(c2)
c1xBytes := util.BigIntToByte(x)
c1yBytes := util.BigIntToByte(y)
off := 0
ct := uint32(0)
for off < encDataLen {
digest.Reset()
digest.Write(c1xBytes)
digest.Write(c1yBytes)
ct++
binary.BigEndian.PutUint32(buf, ct)
digest.Write(buf[:4])
tmp := digest.Sum(nil)
copy(buf[:bufSize], tmp[:bufSize])
xorLen := encDataLen - off
if xorLen > digest.Size() {
xorLen = digest.Size()
}
xor(c2[off:], buf, xorLen)
off += xorLen
}
return nil
}
func xor(data []byte, kdfOut []byte, dRemaining int) {
for i := 0; i < dRemaining; i++ {
data[i] ^= kdfOut[i]
}
}