blob: bbd8556d759085f289a60dd6a974307f55a714c0 [file] [log] [blame]
// Copyright 2021 CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Package hmac implements the Keyed-Hash Message Authentication Code (HMAC) as
// defined in U.S. Federal Information Processing Standards Publication 198.
//
// An HMAC is a cryptographic hash that uses a key to sign a message.
// The receiver verifies the hash by recomputing it using the same key.
package hmac
import (
"crypto/hmac"
"crypto/md5"
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"fmt"
"hash"
)
const (
MD5 = "MD5"
SHA1 = "SHA1"
SHA224 = "SHA224"
SHA256 = "SHA256"
SHA384 = "SHA384"
SHA512 = "SHA512"
SHA512_224 = "SHA512_224"
SHA512_256 = "SHA512_256"
)
// Sign returns the HMAC signature of the data, using the provided key and hash function.
//
// Supported hash functions: "MD5", "SHA1", "SHA224", "SHA256", "SHA384", "SHA512", "SHA512_224",
// and "SHA512_256".
func Sign(hashName string, key []byte, data []byte) ([]byte, error) {
hash, err := hashFromName(hashName)
if err != nil {
return nil, err
}
mac := hmac.New(hash, key)
mac.Write(data)
return mac.Sum(nil), nil
}
func hashFromName(hash string) (func() hash.Hash, error) {
switch hash {
case MD5:
return md5.New, nil
case SHA1:
return sha1.New, nil
case SHA224:
return sha256.New224, nil
case SHA256:
return sha256.New, nil
case SHA384:
return sha512.New384, nil
case SHA512:
return sha512.New, nil
case SHA512_224:
return sha512.New512_224, nil
case SHA512_256:
return sha512.New512_256, nil
}
return nil, fmt.Errorf("unsupported hash function")
}