package pbkd

import (
	"xdx.jelly/xgcl/mac"
)

type pbmacWithHmacSm3 struct {
	mac mac.MAC
}

func NewPbmacWithHmacSm3(password, salt []byte, count int) (mac.MAC, error) {
	key, err := PbkdfWithHmacSm3(password, salt, count, 16)
	if err != nil {
		return nil, err
	}
	mac, err := mac.NewHMacSm3(key, hmacSm3TagSize)
	if err != nil {
		return nil, err
	}

	return &pbmacWithHmacSm3{
		mac: mac,
	}, nil
}

// func PbmacWithHmacSm3(password, salt []byte, count int, dst, src, iv []byte, op int) ([]byte, error) {
// }

// ComputeMAC computes message authentication code (MAC) for code data.
func (p *pbmacWithHmacSm3) ComputeMAC(data []byte) ([]byte, error) {
	return p.mac.ComputeMAC(data)
}

// Verify returns nil if mac is a correct authentication code (MAC) for data,
// otherwise it returns an error.
func (p *pbmacWithHmacSm3) VerifyMAC(mac, data []byte) error {
	return p.mac.VerifyMAC(mac, data)
}
