package macx import ( "crypto/hmac" "crypto/md5" "crypto/sha1" "crypto/sha256" "crypto/sha512" "encoding/hex" "hash" "strings" "golang.org/x/crypto/md4" "golang.org/x/crypto/ripemd160" ) func chmac(message, key []byte, f func() hash.Hash) []byte { h := hmac.New(f, key) _, _ = h.Write(message) return h.Sum(nil) } func chmacStr(message, key []byte, f func() hash.Hash) string { return hex.EncodeToString(chmac(message, key, f)) } func verifyHMAC(message, key, sum []byte, f func() hash.Hash) bool { expected := chmac(message, key, f) return hmac.Equal(expected, sum) } func verifyHMACStr(message, key []byte, hexSum string, f func() hash.Hash) bool { sum, err := hex.DecodeString(strings.TrimSpace(hexSum)) if err != nil { return false } return verifyHMAC(message, key, sum, f) } func HmacMd4(message, key []byte) []byte { return chmac(message, key, md4.New) } func HmacMd4Str(message, key []byte) string { return chmacStr(message, key, md4.New) } func VerifyHmacMd4(message, key, sum []byte) bool { return verifyHMAC(message, key, sum, md4.New) } func VerifyHmacMd4Str(message, key []byte, hexSum string) bool { return verifyHMACStr(message, key, hexSum, md4.New) } func HmacMd5(message, key []byte) []byte { return chmac(message, key, md5.New) } func HmacMd5Str(message, key []byte) string { return chmacStr(message, key, md5.New) } func VerifyHmacMd5(message, key, sum []byte) bool { return verifyHMAC(message, key, sum, md5.New) } func VerifyHmacMd5Str(message, key []byte, hexSum string) bool { return verifyHMACStr(message, key, hexSum, md5.New) } func HmacSHA1(message, key []byte) []byte { return chmac(message, key, sha1.New) } func HmacSHA1Str(message, key []byte) string { return chmacStr(message, key, sha1.New) } func VerifyHmacSHA1(message, key, sum []byte) bool { return verifyHMAC(message, key, sum, sha1.New) } func VerifyHmacSHA1Str(message, key []byte, hexSum string) bool { return verifyHMACStr(message, key, hexSum, sha1.New) } func HmacSHA256(message, key []byte) []byte { return chmac(message, key, sha256.New) } func HmacSHA256Str(message, key []byte) string { return chmacStr(message, key, sha256.New) } func VerifyHmacSHA256(message, key, sum []byte) bool { return verifyHMAC(message, key, sum, sha256.New) } func VerifyHmacSHA256Str(message, key []byte, hexSum string) bool { return verifyHMACStr(message, key, hexSum, sha256.New) } func HmacSHA384(message, key []byte) []byte { return chmac(message, key, sha512.New384) } func HmacSHA384Str(message, key []byte) string { return chmacStr(message, key, sha512.New384) } func VerifyHmacSHA384(message, key, sum []byte) bool { return verifyHMAC(message, key, sum, sha512.New384) } func VerifyHmacSHA384Str(message, key []byte, hexSum string) bool { return verifyHMACStr(message, key, hexSum, sha512.New384) } func HmacSHA512(message, key []byte) []byte { return chmac(message, key, sha512.New) } func HmacSHA512Str(message, key []byte) string { return chmacStr(message, key, sha512.New) } func VerifyHmacSHA512(message, key, sum []byte) bool { return verifyHMAC(message, key, sum, sha512.New) } func VerifyHmacSHA512Str(message, key []byte, hexSum string) bool { return verifyHMACStr(message, key, hexSum, sha512.New) } func HmacSHA224(message, key []byte) []byte { return chmac(message, key, sha256.New224) } func HmacSHA224Str(message, key []byte) string { return chmacStr(message, key, sha256.New224) } func VerifyHmacSHA224(message, key, sum []byte) bool { return verifyHMAC(message, key, sum, sha256.New224) } func VerifyHmacSHA224Str(message, key []byte, hexSum string) bool { return verifyHMACStr(message, key, hexSum, sha256.New224) } func HmacRipeMd160(message, key []byte) []byte { return chmac(message, key, ripemd160.New) } func HmacRipeMd160Str(message, key []byte) string { return chmacStr(message, key, ripemd160.New) } func VerifyHmacRipeMd160(message, key, sum []byte) bool { return verifyHMAC(message, key, sum, ripemd160.New) } func VerifyHmacRipeMd160Str(message, key []byte, hexSum string) bool { return verifyHMACStr(message, key, hexSum, ripemd160.New) }