57 lines
1.0 KiB
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]
|
|
}
|
|
}
|