Software APIs
hardened_unittest.cc
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
6 
7 #include <limits>
8 #include <type_traits>
9 
10 #include "gmock/gmock.h"
11 #include "gtest/gtest.h"
12 
13 namespace hardened_unittest {
14 namespace {
15 
16 MATCHER(IsZero, "is zero") { return arg == 0; }
17 
18 MATCHER(IsAllOnes, "is all ones") {
19  return arg ==
20  std::numeric_limits<std::remove_reference_t<decltype(arg)>>::max();
21 }
22 
23 TEST(ConstTime, Sltz) {
24  EXPECT_THAT(ct_sltz32(42), IsZero());
25  EXPECT_THAT(ct_sltz32(0), IsZero());
26  EXPECT_THAT(ct_sltz32(-42), IsAllOnes());
27 
28  EXPECT_THAT(ct_sltzw(42), IsZero());
29  EXPECT_THAT(ct_sltzw(0), IsZero());
30  EXPECT_THAT(ct_sltzw(-42), IsAllOnes());
31 }
32 
33 TEST(ConstTime, Slt) {
34  EXPECT_THAT(ct_sltu32(42, 120), IsAllOnes());
35  EXPECT_THAT(ct_sltu32(192874, 1231), IsZero());
36  EXPECT_THAT(ct_sltu32(12121212, 12121212), IsZero());
37  EXPECT_THAT(ct_sltu32(0, 0), IsZero());
38 
39  EXPECT_THAT(ct_sltuw(42, 120), IsAllOnes());
40  EXPECT_THAT(ct_sltuw(192874, 1231), IsZero());
41  EXPECT_THAT(ct_sltuw(12121212, 12121212), IsZero());
42  EXPECT_THAT(ct_sltuw(0, 0), IsZero());
43 }
44 
45 TEST(ConstTime, Seqz) {
46  EXPECT_THAT(ct_seqz32(0), IsAllOnes());
47  EXPECT_THAT(ct_seqz32(1), IsZero());
48  EXPECT_THAT(ct_seqz32(42), IsZero());
49 
50  EXPECT_THAT(ct_seqzw(0), IsAllOnes());
51  EXPECT_THAT(ct_seqzw(1), IsZero());
52  EXPECT_THAT(ct_seqzw(42), IsZero());
53 }
54 
55 TEST(ConstTime, Seq) {
56  EXPECT_THAT(ct_seq32(42, 120), IsZero());
57  EXPECT_THAT(ct_seq32(192874, 1231), IsZero());
58  EXPECT_THAT(ct_seq32(12121212, 12121212), IsAllOnes());
59  EXPECT_THAT(ct_seq32(0, 0), IsAllOnes());
60 
61  EXPECT_THAT(ct_seqw(42, 120), IsZero());
62  EXPECT_THAT(ct_seqw(192874, 1231), IsZero());
63  EXPECT_THAT(ct_seqw(12121212, 12121212), IsAllOnes());
64  EXPECT_THAT(ct_seqw(0, 0), IsAllOnes());
65 }
66 
67 TEST(ConstTime, Cmov) {
68  EXPECT_EQ(ct_cmov32(-1, 0xdeadbeef, 0xc0ffee), 0xdeadbeef);
69  EXPECT_EQ(ct_cmov32(0, 0xdeadbeef, 0xc0ffee), 0xc0ffee);
70 
71  EXPECT_EQ(ct_cmovw(-1, 0xdeadbeef, 0xc0ffee), 0xdeadbeef);
72  EXPECT_EQ(ct_cmovw(0, 0xdeadbeef, 0xc0ffee), 0xc0ffee);
73 }
74 
75 } // namespace
76 } // namespace hardened_unittest