blob: 5dae32a3a79e9a5e603d38ea3a4ea35523ae21ed [file] [log] [blame]
// Copyright 2025 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 fips140
import (
"internal/godebug"
_ "unsafe" // for linkname
)
// WithoutEnforcement disables strict FIPS 140-3 enforcement while executing f.
// Calling WithoutEnforcement without strict enforcement enabled
// (GODEBUG=fips140=only is not set or already inside of a call to
// WithoutEnforcement) is a no-op.
//
// WithoutEnforcement is inherited by any goroutines spawned while executing f.
//
// As this disables enforcement, it should be applied carefully to tightly
// scoped functions.
func WithoutEnforcement(f func()) {
if !Enabled() || !Enforced() {
f()
return
}
setBypass()
defer unsetBypass()
f()
}
var enabled = godebug.New("fips140").Value() == "only"
// Enforced indicates if strict FIPS 140-3 enforcement is enabled. Strict
// enforcement is enabled when a program is run with GODEBUG=fips140=only and
// enforcement has not been disabled by a call to [WithoutEnforcement].
func Enforced() bool {
return enabled && !isBypassed()
}
//go:linkname setBypass
func setBypass()
//go:linkname isBypassed
func isBypassed() bool
//go:linkname unsetBypass
func unsetBypass()