Source file src/crypto/internal/fips140hash/hash.go
1 // Copyright 2024 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package fips140hash 6 7 import ( 8 fsha3 "crypto/internal/fips140/sha3" 9 "crypto/sha3" 10 "hash" 11 _ "unsafe" 12 ) 13 14 //go:linkname sha3Unwrap 15 func sha3Unwrap(*sha3.SHA3) *fsha3.Digest 16 17 // Unwrap returns h, or a crypto/internal/fips140 inner implementation of h. 18 // 19 // The return value can be type asserted to one of 20 // [crypto/internal/fips140/sha256.Digest], 21 // [crypto/internal/fips140/sha512.Digest], or 22 // [crypto/internal/fips140/sha3.Digest] if it is a FIPS 140-3 approved hash. 23 func Unwrap(h hash.Hash) hash.Hash { 24 if sha3, ok := h.(*sha3.SHA3); ok { 25 return sha3Unwrap(sha3) 26 } 27 return h 28 } 29 30 // UnwrapNew returns a function that calls newHash and applies [Unwrap] to the 31 // return value. 32 func UnwrapNew[Hash hash.Hash](newHash func() Hash) func() hash.Hash { 33 return func() hash.Hash { return Unwrap(newHash()) } 34 } 35