starcrypto/macx/hmac.go

167 lines
4.0 KiB
Go

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)
}