// 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. //go:build boringcrypto // Package fipstls allows control over whether crypto/tls requires FIPS-approved settings. // This package only exists with GOEXPERIMENT=boringcrypto, but the effects are independent // of the use of BoringCrypto. package fipstls import "sync/atomic" var required atomic.Bool // Force forces crypto/tls to restrict TLS configurations to FIPS-approved settings. // By design, this call is impossible to undo (except in tests). // // Note that this call has an effect even in programs using // standard crypto (that is, even when Enabled = false). func Force() { required.Store(true) } // Abandon allows non-FIPS-approved settings. // If called from a non-test binary, it panics. func Abandon() { // Note: Not using boring.UnreachableExceptTests because we want // this test to happen even when boring.Enabled = false. name := runtime_arg0() // Allow _test for Go command, .test for Bazel, // NaClMain for NaCl (where all binaries run as NaClMain), // and empty string for Windows (where runtime_arg0 can't easily find the name). // Since this is an internal package, testing that this isn't used on the // other operating systems should suffice to catch any mistakes. if !hasSuffix(name, "_test") && !hasSuffix(name, ".test") && name != "NaClMain" && name != "" { panic("fipstls: invalid use of Abandon in " + name) } required.Store(false) } // provided by runtime func runtime_arg0() string func hasSuffix(s, t string) bool { return len(s) > len(t) && s[len(s)-len(t):] == t } // Required reports whether FIPS-approved settings are required. func Required() bool { return required.Load() }