Software APIs
ecdsa_p256_verify_functest.c
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 
5 #include "sw/device/lib/testing/test_framework/check.h"
7 #include "sw/device/silicon_creator/lib/otbn_boot_services.h"
8 #include "sw/device/silicon_creator/lib/sigverify/ecdsa_p256_verify.h"
9 
10 OTTF_DEFINE_TEST_CONFIG();
11 
12 // Message value for signature generation/verification tests.
13 const char kTestMessage[] = "Test message.";
14 const size_t kTestMessageLen = sizeof(kTestMessage) - 1;
15 
16 // Digest of the test message above.
17 hmac_digest_t digest;
18 
19 // Valid ECDSA-P256 public key.
20 static const ecdsa_p256_public_key_t kEcdsaKey = {
21  .x =
22  {
23  0x1ceb402b,
24  0x9dc600d1,
25  0x182ec21b,
26  0x5ede3640,
27  0x3566bdac,
28  0x1debf94b,
29  0x1a286a75,
30  0x8904d749,
31  },
32  .y =
33  {
34  0x63eab6dc,
35  0x0c53bf99,
36  0x086d3ee7,
37  0x1076efa6,
38  0x8dd8ece2,
39  0xbfececf0,
40  0x9b94e34d,
41  0x59b12f3c,
42  },
43 };
44 
45 // Valid ECDSA-P256 signature for `kTestMessage`.
46 static const ecdsa_p256_signature_t kEcdsaSignature = {
47  .r =
48  {
49  0x4811545a,
50  0x088d927b,
51  0x5d8624b5,
52  0x2ef1f329,
53  0x184ba14a,
54  0xf655eede,
55  0xaaed0d54,
56  0xa20e1ac7,
57  },
58  .s =
59  {
60  0x729b945d,
61  0x181dc116,
62  0x1025dba4,
63  0xb99828a0,
64  0xe7225df3,
65  0x0e200e9b,
66  0x785690b4,
67  0xf47efe98,
68  },
69 };
70 
71 static const ecdsa_p256_signature_t kEcdsaSignatureBad = {
72  .r =
73  {
74  0x481154ff,
75  0x088d92ff,
76  0x5d8624b5,
77  0x2ef1f329,
78  0x184ba14a,
79  0xf655eede,
80  0xaaed0d54,
81  0xa20e1ac7,
82  },
83  .s =
84  {
85  0x729b945d,
86  0x181dc116,
87  0x1025dba4,
88  0xb99828a0,
89  0xe7225df3,
90  0x0e200e9b,
91  0x785690b4,
92  0xf47efe98,
93  },
94 };
95 
96 rom_error_t ecdsa_p256_verify_ok_test(void) {
97  uint32_t flash_exec = 0;
98  rom_error_t result = sigverify_ecdsa_p256_verify(&kEcdsaSignature, &kEcdsaKey,
99  &digest, &flash_exec);
100  CHECK(flash_exec == kSigverifyEcdsaSuccess);
101  return result;
102 }
103 
104 rom_error_t ecdsa_p256_verify_negative_test(void) {
105  uint32_t flash_exec = 0;
106  // Signature verification should fail when using the wrong signature.
107  if (sigverify_ecdsa_p256_verify(&kEcdsaSignatureBad, &kEcdsaKey, &digest,
108  &flash_exec) == kErrorOk) {
109  return kErrorUnknown;
110  }
111  CHECK(flash_exec == UINT32_MAX);
112  return kErrorOk;
113 }
114 
115 bool test_main(void) {
116  CHECK(otbn_boot_app_load() == kErrorOk);
117 
118  status_t result = OK_STATUS();
119  hmac_sha256(kTestMessage, kTestMessageLen, &digest);
120 
121  EXECUTE_TEST(result, ecdsa_p256_verify_ok_test);
122  EXECUTE_TEST(result, ecdsa_p256_verify_negative_test);
123  return status_ok(result);
124 }