package sdk import ( "PaymentCenter/app/third/paymentService/psbc/internal/gmutil/sm2/util" "crypto/elliptic" "encoding/binary" "math/big" ) // 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 := c.bigIntToByte(x) c1yBytes := c.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] } }