in lib/crypto.go [549:581]
func hmacHash(args ...ref.Val) ref.Val {
if len(args) != 3 {
return types.NewErr("no such overload for hmac")
}
var val []byte
switch arg := args[0].(type) {
case types.Bytes:
val = []byte(arg)
case types.String:
val = []byte(arg)
default:
return types.NoSuchOverloadErr()
}
hashName, ok := args[1].(types.String)
if !ok {
return types.ValOrErr(args[1], "no such overload")
}
key, ok := args[2].(types.Bytes)
if !ok {
return types.ValOrErr(args[2], "no such overload")
}
var mac hash.Hash
switch hashName {
case "sha1":
mac = hmac.New(sha1.New, key)
case "sha256":
mac = hmac.New(sha256.New, key)
default:
return types.NewErr("invalid hash for hmac: %s", hashName)
}
mac.Write([]byte(val))
return types.Bytes(mac.Sum(nil))
}