Fixes golang/go#65250 Change-Id: I6a6a6964a2c87e529be50dd67fec462483b07b75 Reviewed-on: https://go-review.googlesource.com/c/crypto/+/701535 Reviewed-by: Mark Freeman <markfreeman@google.com> Auto-Submit: Filippo Valsorda <filippo@golang.org> Reviewed-by: Daniel McCarney <daniel@binaryparadox.net> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Pratt <mpratt@google.com>
50 lines
1.4 KiB
Go
50 lines
1.4 KiB
Go
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Package auth authenticates a message using a secret key.
|
|
//
|
|
// This package is interoperable with [NaCl].
|
|
//
|
|
// The auth package is essentially a wrapper for HMAC-SHA-512 (implemented by
|
|
// crypto/hmac and crypto/sha512), truncated to 32 bytes. It is [frozen] and is
|
|
// not accepting new features.
|
|
//
|
|
// [NaCl]: https://nacl.cr.yp.to/auth.html
|
|
// [frozen]: https://go.dev/wiki/Frozen
|
|
package auth
|
|
|
|
import (
|
|
"crypto/hmac"
|
|
"crypto/sha512"
|
|
)
|
|
|
|
const (
|
|
// Size is the size, in bytes, of an authenticated digest.
|
|
Size = 32
|
|
// KeySize is the size, in bytes, of an authentication key.
|
|
KeySize = 32
|
|
)
|
|
|
|
// Sum generates an authenticator for m using a secret key and returns the
|
|
// 32-byte digest.
|
|
func Sum(m []byte, key *[KeySize]byte) *[Size]byte {
|
|
mac := hmac.New(sha512.New, key[:])
|
|
mac.Write(m)
|
|
out := new([Size]byte)
|
|
copy(out[:], mac.Sum(nil)[:Size])
|
|
return out
|
|
}
|
|
|
|
// Verify checks that digest is a valid authenticator of message m under the
|
|
// given secret key. Verify does not leak timing information.
|
|
func Verify(digest []byte, m []byte, key *[KeySize]byte) bool {
|
|
if len(digest) != Size {
|
|
return false
|
|
}
|
|
mac := hmac.New(sha512.New, key[:])
|
|
mac.Write(m)
|
|
expectedMAC := mac.Sum(nil) // first 256 bits of 512-bit sum
|
|
return hmac.Equal(digest, expectedMAC[:Size])
|
|
}
|