Blame SOURCES/000-initial-setup.patch

28fbfc
diff --git a/src/cmd/go/testdata/script/gopath_std_vendor.txt b/src/cmd/go/testdata/script/gopath_std_vendor.txt
28fbfc
index a0a41a5..208aa70 100644
28fbfc
--- a/src/cmd/go/testdata/script/gopath_std_vendor.txt
28fbfc
+++ b/src/cmd/go/testdata/script/gopath_std_vendor.txt
28fbfc
@@ -21,11 +21,11 @@ go build .
28fbfc
 
28fbfc
 go list -deps -f '{{.ImportPath}} {{.Dir}}' .
28fbfc
 stdout $GOPATH[/\\]src[/\\]vendor[/\\]golang.org[/\\]x[/\\]net[/\\]http2[/\\]hpack
28fbfc
-! stdout $GOROOT[/\\]src[/\\]vendor
28fbfc
+! stdout $GOROOT[/\\]src[/\\]vendor[/\\]golang.org[/\\]x[/\\]net[/\\]http2[/\\]hpack
28fbfc
 
28fbfc
 go list -test -deps -f '{{.ImportPath}} {{.Dir}}' .
28fbfc
 stdout $GOPATH[/\\]src[/\\]vendor[/\\]golang.org[/\\]x[/\\]net[/\\]http2[/\\]hpack
28fbfc
-! stdout $GOROOT[/\\]src[/\\]vendor
28fbfc
+! stdout $GOROOT[/\\]src[/\\]vendor[/\\]golang.org[/\\]x[/\\]net[/\\]http2[/\\]hpack
28fbfc
 
28fbfc
 -- issue16333/issue16333.go --
28fbfc
 package vendoring17
28fbfc
diff --git a/src/crypto/ed25519/ed25519_test.go b/src/crypto/ed25519/ed25519_test.go
28fbfc
index 7c51817..102c4e5 100644
28fbfc
--- a/src/crypto/ed25519/ed25519_test.go
28fbfc
+++ b/src/crypto/ed25519/ed25519_test.go
28fbfc
@@ -187,6 +187,7 @@ func TestMalleability(t *testing.T) {
28fbfc
 }
28fbfc
 
28fbfc
 func TestAllocations(t *testing.T) {
28fbfc
+	t.Skip("Allocations test broken with openssl linkage")
28fbfc
 	if boring.Enabled {
28fbfc
 		t.Skip("skipping allocations test with BoringCrypto")
28fbfc
 	}
28fbfc
diff --git a/src/crypto/ed25519/ed25519vectors_test.go b/src/crypto/ed25519/ed25519vectors_test.go
28fbfc
index f933f28..223ce04 100644
28fbfc
--- a/src/crypto/ed25519/ed25519vectors_test.go
28fbfc
+++ b/src/crypto/ed25519/ed25519vectors_test.go
28fbfc
@@ -72,6 +72,7 @@ func TestEd25519Vectors(t *testing.T) {
28fbfc
 }
28fbfc
 
28fbfc
 func downloadEd25519Vectors(t *testing.T) []byte {
28fbfc
+	t.Skip("skipping test that downloads external data")
28fbfc
 	testenv.MustHaveExternalNetwork(t)
28fbfc
 
28fbfc
 	// Create a temp dir and modcache subdir.
28fbfc
diff --git a/src/crypto/internal/backend/bbig/big.go b/src/crypto/internal/backend/bbig/big.go
28fbfc
new file mode 100644
28fbfc
index 0000000..c0800df
28fbfc
--- /dev/null
28fbfc
+++ b/src/crypto/internal/backend/bbig/big.go
28fbfc
@@ -0,0 +1,38 @@
28fbfc
+// Copyright 2022 The Go Authors. All rights reserved.
28fbfc
+// Use of this source code is governed by a BSD-style
28fbfc
+// license that can be found in the LICENSE file.
28fbfc
+
28fbfc
+// This is a mirror of crypto/internal/boring/bbig/big.go.
28fbfc
+
28fbfc
+package bbig
28fbfc
+
28fbfc
+import (
28fbfc
+	"math/big"
28fbfc
+	"unsafe"
28fbfc
+
28fbfc
+	"github.com/golang-fips/openssl-fips/openssl"
28fbfc
+)
28fbfc
+
28fbfc
+func Enc(b *big.Int) openssl.BigInt {
28fbfc
+	if b == nil {
28fbfc
+		return nil
28fbfc
+	}
28fbfc
+	x := b.Bits()
28fbfc
+	if len(x) == 0 {
28fbfc
+		return openssl.BigInt{}
28fbfc
+	}
28fbfc
+	// TODO: Use unsafe.Slice((*uint)(&x[0]), len(x)) once go1.16 is no longer supported.
28fbfc
+	return (*(*[]uint)(unsafe.Pointer(&x)))[:len(x)]
28fbfc
+}
28fbfc
+
28fbfc
+func Dec(b openssl.BigInt) *big.Int {
28fbfc
+	if b == nil {
28fbfc
+		return nil
28fbfc
+	}
28fbfc
+	if len(b) == 0 {
28fbfc
+		return new(big.Int)
28fbfc
+	}
28fbfc
+	// TODO: Use unsafe.Slice((*uint)(&b[0]), len(b)) once go1.16 is no longer supported.
28fbfc
+	x := (*(*[]big.Word)(unsafe.Pointer(&b)))[:len(b)]
28fbfc
+	return new(big.Int).SetBits(x)
28fbfc
+}
28fbfc
diff --git a/src/crypto/internal/backend/dummy.s b/src/crypto/internal/backend/dummy.s
28fbfc
new file mode 100644
28fbfc
index 0000000..e69de29
28fbfc
diff --git a/src/crypto/internal/backend/nobackend.go b/src/crypto/internal/backend/nobackend.go
28fbfc
new file mode 100644
28fbfc
index 0000000..1d75287
28fbfc
--- /dev/null
28fbfc
+++ b/src/crypto/internal/backend/nobackend.go
28fbfc
@@ -0,0 +1,140 @@
28fbfc
+// Copyright 2017 The Go Authors. All rights reserved.
28fbfc
+// Use of this source code is governed by a BSD-style
28fbfc
+// license that can be found in the LICENSE file.
28fbfc
+
28fbfc
+//go:build !linux || !cgo || android || cmd_go_bootstrap || msan || no_openssl
28fbfc
+// +build !linux !cgo android cmd_go_bootstrap msan no_openssl
28fbfc
+
28fbfc
+package backend
28fbfc
+
28fbfc
+import (
28fbfc
+	"crypto"
28fbfc
+	"crypto/cipher"
28fbfc
+	"crypto/internal/boring/sig"
28fbfc
+	"github.com/golang-fips/openssl-fips/openssl"
28fbfc
+	"hash"
28fbfc
+)
28fbfc
+
28fbfc
+var enabled = false
28fbfc
+
28fbfc
+// Unreachable marks code that should be unreachable
28fbfc
+// when BoringCrypto is in use. It is a no-op without BoringCrypto.
28fbfc
+func Unreachable() {
28fbfc
+	// Code that's unreachable when using BoringCrypto
28fbfc
+	// is exactly the code we want to detect for reporting
28fbfc
+	// standard Go crypto.
28fbfc
+	sig.StandardCrypto()
28fbfc
+}
28fbfc
+
28fbfc
+// UnreachableExceptTests marks code that should be unreachable
28fbfc
+// when BoringCrypto is in use. It is a no-op without BoringCrypto.
28fbfc
+func UnreachableExceptTests() {}
28fbfc
+
28fbfc
+func ExecutingTest() bool { return false }
28fbfc
+
28fbfc
+// This is a noop withotu BoringCrytpo.
28fbfc
+func PanicIfStrictFIPS(v interface{}) {}
28fbfc
+
28fbfc
+type randReader int
28fbfc
+
28fbfc
+func (randReader) Read(b []byte) (int, error) { panic("boringcrypto: not available") }
28fbfc
+
28fbfc
+const RandReader = randReader(0)
28fbfc
+
28fbfc
+func Enabled() bool   { return false }
28fbfc
+func NewSHA1() hash.Hash   { panic("boringcrypto: not available") }
28fbfc
+func NewSHA224() hash.Hash { panic("boringcrypto: not available") }
28fbfc
+func NewSHA256() hash.Hash { panic("boringcrypto: not available") }
28fbfc
+func NewSHA384() hash.Hash { panic("boringcrypto: not available") }
28fbfc
+func NewSHA512() hash.Hash { panic("boringcrypto: not available") }
28fbfc
+func SHA1(_ []byte) [20]byte { panic("boringcrypto: not available") }
28fbfc
+func SHA224(_ []byte) [28]byte { panic("boringcrypto: not available") }
28fbfc
+func SHA256(_ []byte) [32]byte { panic("boringcrypto: not available") }
28fbfc
+func SHA384(_ []byte) [48]byte { panic("boringcrypto: not available") }
28fbfc
+func SHA512(_ []byte) [64]byte { panic("boringcrypto: not available") }
28fbfc
+
28fbfc
+func NewHMAC(h func() hash.Hash, key []byte) hash.Hash { panic("boringcrypto: not available") }
28fbfc
+
28fbfc
+func NewAESCipher(key []byte) (cipher.Block, error) { panic("boringcrypto: not available") }
28fbfc
+
28fbfc
+type PublicKeyECDSA struct{ _ int }
28fbfc
+type PrivateKeyECDSA struct{ _ int }
28fbfc
+
28fbfc
+func NewGCMTLS(c cipher.Block) (cipher.AEAD, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func GenerateKeyECDSA(curve string) (X, Y, D openssl.BigInt, err error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func NewPrivateKeyECDSA(curve string, X, Y, D openssl.BigInt) (*PrivateKeyECDSA, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func NewPublicKeyECDSA(curve string, X, Y openssl.BigInt) (*PublicKeyECDSA, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func SignECDSA(priv *PrivateKeyECDSA, hash []byte, h crypto.Hash) (r, s openssl.BigInt, err error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func SignMarshalECDSA(priv *PrivateKeyECDSA, hash []byte) ([]byte, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func VerifyECDSA(pub *PublicKeyECDSA, hash, sig []byte) bool {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+
28fbfc
+type PublicKeyECDH struct{ _ int }
28fbfc
+type PrivateKeyECDH struct{ _ int }
28fbfc
+
28fbfc
+func GenerateKeyECDH(curve string) (X, Y, D openssl.BigInt, err error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func NewPrivateKeyECDH(curve string, X, Y, D openssl.BigInt) (*PrivateKeyECDH, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func NewPublicKeyECDH(curve string, X, Y openssl.BigInt) (*PublicKeyECDH, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func SharedKeyECDH(priv *PrivateKeyECDH, peerPublicKey []byte) ([]byte, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+
28fbfc
+type PublicKeyRSA struct{ _ int }
28fbfc
+type PrivateKeyRSA struct{ _ int }
28fbfc
+
28fbfc
+func DecryptRSAOAEP(h hash.Hash, priv *PrivateKeyRSA, ciphertext, label []byte) ([]byte, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func DecryptRSAPKCS1(priv *PrivateKeyRSA, ciphertext []byte) ([]byte, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func DecryptRSANoPadding(priv *PrivateKeyRSA, ciphertext []byte) ([]byte, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func EncryptRSAOAEP(h hash.Hash, pub *PublicKeyRSA, msg, label []byte) ([]byte, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func EncryptRSAPKCS1(pub *PublicKeyRSA, msg []byte) ([]byte, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func EncryptRSANoPadding(pub *PublicKeyRSA, msg []byte) ([]byte, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func GenerateKeyRSA(bits int) (N, E, D, P, Q, Dp, Dq, Qinv openssl.BigInt, err error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func NewPrivateKeyRSA(N, E, D, P, Q, Dp, Dq, Qinv openssl.BigInt) (*PrivateKeyRSA, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func NewPublicKeyRSA(N, E openssl.BigInt) (*PublicKeyRSA, error) { panic("boringcrypto: not available") }
28fbfc
+func SignRSAPKCS1v15(priv *PrivateKeyRSA, h crypto.Hash, hashed []byte, msgHashed bool) ([]byte, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func SignRSAPSS(priv *PrivateKeyRSA, h crypto.Hash, hashed []byte, saltLen int) ([]byte, error) {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func VerifyRSAPKCS1v15(pub *PublicKeyRSA, h crypto.Hash, hashed, sig []byte, msgHashed bool) error {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
+func VerifyRSAPSS(pub *PublicKeyRSA, h crypto.Hash, hashed, sig []byte, saltLen int) error {
28fbfc
+	panic("boringcrypto: not available")
28fbfc
+}
28fbfc
diff --git a/src/crypto/internal/backend/openssl.go b/src/crypto/internal/backend/openssl.go
28fbfc
new file mode 100644
28fbfc
index 0000000..4c327e0
28fbfc
--- /dev/null
28fbfc
+++ b/src/crypto/internal/backend/openssl.go
28fbfc
@@ -0,0 +1,92 @@
28fbfc
+// Copyright 2017 The Go Authors. All rights reserved.
28fbfc
+// Use of this source code is governed by a BSD-style
28fbfc
+// license that can be found in the LICENSE file.
28fbfc
+
28fbfc
+//go:build linux && !android && !gocrypt && !cmd_go_bootstrap && !msan && !no_openssl
28fbfc
+// +build linux,!android,!gocrypt,!cmd_go_bootstrap,!msan,!no_openssl
28fbfc
+
28fbfc
+// Package openssl provides access to OpenSSLCrypto implementation functions.
28fbfc
+// Check the variable Enabled to find out whether OpenSSLCrypto is available.
28fbfc
+// If OpenSSLCrypto is not available, the functions in this package all panic.
28fbfc
+package backend
28fbfc
+
28fbfc
+import (
28fbfc
+	"github.com/golang-fips/openssl-fips/openssl"
28fbfc
+)
28fbfc
+
28fbfc
+// Enabled controls whether FIPS crypto is enabled.
28fbfc
+var Enabled = openssl.Enabled
28fbfc
+
28fbfc
+// Unreachable marks code that should be unreachable
28fbfc
+// when OpenSSLCrypto is in use. It panics only when
28fbfc
+// the system is in FIPS mode.
28fbfc
+func Unreachable() {
28fbfc
+	if Enabled() {
28fbfc
+		panic("opensslcrypto: invalid code execution")
28fbfc
+	}
28fbfc
+}
28fbfc
+
28fbfc
+// Provided by runtime.crypto_backend_runtime_arg0 to avoid os import.
28fbfc
+func runtime_arg0() string
28fbfc
+
28fbfc
+func hasSuffix(s, t string) bool {
28fbfc
+	return len(s) > len(t) && s[len(s)-len(t):] == t
28fbfc
+}
28fbfc
+
28fbfc
+// UnreachableExceptTests marks code that should be unreachable
28fbfc
+// when OpenSSLCrypto is in use. It panics.
28fbfc
+func UnreachableExceptTests() {
28fbfc
+	name := runtime_arg0()
28fbfc
+	// If OpenSSLCrypto ran on Windows we'd need to allow _test.exe and .test.exe as well.
28fbfc
+	if Enabled() && !hasSuffix(name, "_test") && !hasSuffix(name, ".test") {
28fbfc
+		println("opensslcrypto: unexpected code execution in", name)
28fbfc
+		panic("opensslcrypto: invalid code execution")
28fbfc
+	}
28fbfc
+}
28fbfc
+
28fbfc
+var ExecutingTest = openssl.ExecutingTest
28fbfc
+
28fbfc
+const RandReader = openssl.RandReader
28fbfc
+
28fbfc
+var NewGCMTLS = openssl.NewGCMTLS
28fbfc
+var NewSHA1 = openssl.NewSHA1
28fbfc
+var NewSHA224 = openssl.NewSHA224
28fbfc
+var NewSHA256 = openssl.NewSHA256
28fbfc
+var NewSHA384 = openssl.NewSHA384
28fbfc
+var NewSHA512 = openssl.NewSHA512
28fbfc
+
28fbfc
+var SHA1 = openssl.SHA1
28fbfc
+var SHA224 = openssl.SHA224
28fbfc
+var SHA256 = openssl.SHA256
28fbfc
+var SHA384 = openssl.SHA384
28fbfc
+var SHA512 = openssl.SHA512
28fbfc
+
28fbfc
+var NewHMAC = openssl.NewHMAC
28fbfc
+
28fbfc
+var NewAESCipher = openssl.NewAESCipher
28fbfc
+
28fbfc
+type PublicKeyECDSA = openssl.PublicKeyECDSA
28fbfc
+type PrivateKeyECDSA = openssl.PrivateKeyECDSA
28fbfc
+
28fbfc
+var GenerateKeyECDSA = openssl.GenerateKeyECDSA
28fbfc
+var NewPrivateKeyECDSA = openssl.NewPrivateKeyECDSA
28fbfc
+var NewPublicKeyECDSA = openssl.NewPublicKeyECDSA
28fbfc
+var SignMarshalECDSA = openssl.SignMarshalECDSA
28fbfc
+var VerifyECDSA = openssl.VerifyECDSA
28fbfc
+
28fbfc
+type PublicKeyRSA = openssl.PublicKeyRSA
28fbfc
+type PrivateKeyRSA = openssl.PrivateKeyRSA
28fbfc
+
28fbfc
+var DecryptRSAOAEP = openssl.DecryptRSAOAEP
28fbfc
+var DecryptRSAPKCS1 = openssl.DecryptRSAPKCS1
28fbfc
+var DecryptRSANoPadding = openssl.DecryptRSANoPadding
28fbfc
+var EncryptRSAOAEP = openssl.EncryptRSAOAEP
28fbfc
+var EncryptRSAPKCS1 = openssl.EncryptRSAPKCS1
28fbfc
+var EncryptRSANoPadding = openssl.EncryptRSANoPadding
28fbfc
+var GenerateKeyRSA = openssl.GenerateKeyRSA
28fbfc
+var NewPrivateKeyRSA = openssl.NewPrivateKeyRSA
28fbfc
+var NewPublicKeyRSA = openssl.NewPublicKeyRSA
28fbfc
+var SignRSAPKCS1v15 = openssl.SignRSAPKCS1v15
28fbfc
+var SignRSAPSS = openssl.SignRSAPSS
28fbfc
+var VerifyRSAPKCS1v15 = openssl.VerifyRSAPKCS1v15
28fbfc
+var VerifyRSAPSS = openssl.VerifyRSAPSS
28fbfc
diff --git a/src/crypto/tls/boring.go b/src/crypto/tls/boring.go
28fbfc
index 1827f76..239e6a2 100644
28fbfc
--- a/src/crypto/tls/boring.go
28fbfc
+++ b/src/crypto/tls/boring.go
28fbfc
@@ -8,8 +8,15 @@ package tls
28fbfc
 
28fbfc
 import (
28fbfc
 	"crypto/internal/boring/fipstls"
28fbfc
+	boring "crypto/internal/backend"
28fbfc
 )
28fbfc
 
28fbfc
+func init() {
28fbfc
+       if boring.Enabled && !boring.ExecutingTest() {
28fbfc
+               fipstls.Force()
28fbfc
+       }
28fbfc
+}
28fbfc
+
28fbfc
 // needFIPS returns fipstls.Required(); it avoids a new import in common.go.
28fbfc
 func needFIPS() bool {
28fbfc
 	return fipstls.Required()
28fbfc
diff --git a/src/crypto/tls/handshake_client_test.go b/src/crypto/tls/handshake_client_test.go
28fbfc
index 380de9f..02b4ac8 100644
28fbfc
--- a/src/crypto/tls/handshake_client_test.go
28fbfc
+++ b/src/crypto/tls/handshake_client_test.go
28fbfc
@@ -2135,6 +2135,7 @@ func testBuffering(t *testing.T, version uint16) {
28fbfc
 }
28fbfc
 
28fbfc
 func TestAlertFlushing(t *testing.T) {
28fbfc
+       t.Skip("unsupported in FIPS mode, different error returned")
28fbfc
 	c, s := localPipe(t)
28fbfc
 	done := make(chan bool)
28fbfc
 
28fbfc
diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go
28fbfc
index 141fdb9..71434f2 100644
28fbfc
--- a/src/go/build/deps_test.go
28fbfc
+++ b/src/go/build/deps_test.go
28fbfc
@@ -414,19 +414,23 @@ var depsRules = `
28fbfc
 	< crypto/internal/edwards25519
28fbfc
 	< crypto/cipher;
28fbfc
 
28fbfc
-	crypto/cipher,
28fbfc
+	fmt, crypto/cipher,
28fbfc
 	crypto/internal/boring/bcache
28fbfc
 	< crypto/internal/boring
28fbfc
+	< github.com/golang-fips/openssl-fips/openssl
28fbfc
+	< crypto/internal/backend
28fbfc
 	< crypto/boring
28fbfc
 	< crypto/aes, crypto/des, crypto/hmac, crypto/md5, crypto/rc4,
28fbfc
 	  crypto/sha1, crypto/sha256, crypto/sha512
28fbfc
 	< CRYPTO;
28fbfc
 
28fbfc
-	CGO, fmt, net !< CRYPTO;
28fbfc
+	CGO, net !< CRYPTO;
28fbfc
 
28fbfc
 	# CRYPTO-MATH is core bignum-based crypto - no cgo, net; fmt now ok.
28fbfc
 	CRYPTO, FMT, math/big, embed
28fbfc
+	< github.com/golang-fips/openssl-fips/openssl/bbig
28fbfc
 	< crypto/internal/boring/bbig
28fbfc
+	< crypto/internal/backend/bbig
28fbfc
 	< crypto/internal/randutil
28fbfc
 	< crypto/rand
28fbfc
 	< crypto/ed25519
28fbfc
@@ -644,7 +648,7 @@ var buildIgnore = []byte("\n//go:build ignore")
28fbfc
 
28fbfc
 func findImports(pkg string) ([]string, error) {
28fbfc
 	vpkg := pkg
28fbfc
-	if strings.HasPrefix(pkg, "golang.org") {
28fbfc
+	if strings.HasPrefix(pkg, "golang.org") || strings.HasPrefix(pkg, "github.com") {
28fbfc
 		vpkg = "vendor/" + pkg
28fbfc
 	}
28fbfc
 	dir := filepath.Join(Default.GOROOT, "src", vpkg)
28fbfc
@@ -654,7 +658,7 @@ func findImports(pkg string) ([]string, error) {
28fbfc
 	}
28fbfc
 	var imports []string
28fbfc
 	var haveImport = map[string]bool{}
28fbfc
-	if pkg == "crypto/internal/boring" {
28fbfc
+	if pkg == "crypto/internal/boring" || pkg == "github.com/golang-fips/openssl-fips/openssl" {
28fbfc
 		haveImport["C"] = true // kludge: prevent C from appearing in crypto/internal/boring imports
28fbfc
 	}
28fbfc
 	fset := token.NewFileSet()
28fbfc
diff --git a/src/runtime/runtime_boring.go b/src/runtime/runtime_boring.go
28fbfc
index 5a98b20..dc25cdc 100644
28fbfc
--- a/src/runtime/runtime_boring.go
28fbfc
+++ b/src/runtime/runtime_boring.go
28fbfc
@@ -17,3 +17,8 @@ func boring_runtime_arg0() string {
28fbfc
 
28fbfc
 //go:linkname fipstls_runtime_arg0 crypto/internal/boring/fipstls.runtime_arg0
28fbfc
 func fipstls_runtime_arg0() string { return boring_runtime_arg0() }
28fbfc
+
28fbfc
+//go:linkname crypto_backend_runtime_arg0 crypto/internal/backend.runtime_arg0
28fbfc
+func crypto_backend_runtime_arg0() string {
28fbfc
+	return boring_runtime_arg0()
28fbfc
+}
28fbfc
\ No newline at end of file