// Copyright 2024 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 fips140hash import ( fsha3 "crypto/internal/fips140/sha3" "crypto/sha3" "hash" _ "unsafe" ) //go:linkname sha3Unwrap func sha3Unwrap(*sha3.SHA3) *fsha3.Digest // Unwrap returns h, or a crypto/internal/fips140 inner implementation of h. // // The return value can be type asserted to one of // [crypto/internal/fips140/sha256.Digest], // [crypto/internal/fips140/sha512.Digest], or // [crypto/internal/fips140/sha3.Digest] if it is a FIPS 140-3 approved hash. func Unwrap(h hash.Hash) hash.Hash { if sha3, ok := h.(*sha3.SHA3); ok { return sha3Unwrap(sha3) } return h } // UnwrapNew returns a function that calls newHash and applies [Unwrap] to the // return value. func UnwrapNew[Hash hash.Hash](newHash func() Hash) func() hash.Hash { return func() hash.Hash { return Unwrap(newHash()) } }