blob: 5525307195661ba1ca3ebab638bdedccb312fc73 [file] [log] [blame] [edit]
// 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 constanttime
// The functions in this package are compiler intrinsics for constant-time
// operations. They are exposed by crypto/subtle and used directly by the
// FIPS 140-3 module.
// Select returns x if v == 1 and y if v == 0.
// Its behavior is undefined if v takes any other value.
func Select(v, x, y int) int {
// This is intrinsicified on arches with CMOV.
// It implements the following superset behavior:
// ConstantTimeSelect returns x if v != 0 and y if v == 0.
// Do the same here to avoid non portable UB.
v = int(boolToUint8(v != 0))
return ^(v-1)&x | (v-1)&y
}
// ByteEq returns 1 if x == y and 0 otherwise.
func ByteEq(x, y uint8) int {
return int(boolToUint8(x == y))
}
// Eq returns 1 if x == y and 0 otherwise.
func Eq(x, y int32) int {
return int(boolToUint8(x == y))
}
// LessOrEq returns 1 if x <= y and 0 otherwise.
// Its behavior is undefined if x or y are negative or > 2**31 - 1.
func LessOrEq(x, y int) int {
return int(boolToUint8(x <= y))
}
// boolToUint8 is a compiler intrinsic.
// It returns 1 for true and 0 for false.
func boolToUint8(b bool) uint8 {
panic("unreachable; must be intrinsicified")
}