Branch data Line data Source code
1 : : /**
2 : : * Copyright Notice:
3 : : * Copyright 2023-2026 DMTF. All rights reserved.
4 : : * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
5 : : **/
6 : :
7 : : #include "internal/libspdm_crypt_lib.h"
8 : : #include "internal/libspdm_common_lib.h"
9 : : #include "internal/libspdm_fips_lib.h"
10 : : #include "library/spdm_crypt_lib.h"
11 : :
12 : : #if LIBSPDM_FIPS_MODE
13 : :
14 : 8 : void libspdm_fips_selftest_rsa_pss(void *fips_selftest_context)
15 : : {
16 : : #if (LIBSPDM_RSA_PSS_SUPPORT) && (LIBSPDM_SHA2_SUPPORT)
17 : 8 : bool result = true;
18 : :
19 : 8 : libspdm_fips_selftest_context_t *context = fips_selftest_context;
20 : 8 : LIBSPDM_ASSERT(fips_selftest_context != NULL);
21 : :
22 : : /* any test fail cause the FIPS fail*/
23 [ + + ]: 8 : if (context->tested_algo != context->self_test_result) {
24 : 4 : return;
25 : : }
26 : :
27 : : /* check if run before.*/
28 [ + + ]: 6 : if ((context->tested_algo & LIBSPDM_FIPS_SELF_TEST_RSA_PSS) != 0) {
29 : 2 : return;
30 : : }
31 : :
32 : : uint8_t signature[512];
33 : : size_t sig_size;
34 : : void *rsa;
35 : : size_t hash_nid;
36 : :
37 : 4 : sig_size = sizeof(signature);
38 : 4 : libspdm_zero_mem(signature, sig_size);
39 : :
40 : : /* Test vector (key, message, salt and signature) from the NIST CAVP:
41 : : * RSA SigGenPSS_186-3.txt, [mod = 2048], SHA-256/SHA-384/SHA-512, first record.
42 : : * https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/digital-signatures
43 : : * At least one of SHA-256/SHA-384/SHA-512 is required for the RSA-PSS FIPS self-test to run;
44 : : * the strongest one enabled at build time is used.
45 : : */
46 : 4 : const uint8_t public_n[] = {
47 : : 0xc5, 0x06, 0x2b, 0x58, 0xd8, 0x53, 0x9c, 0x76,
48 : : 0x5e, 0x1e, 0x5d, 0xba, 0xf1, 0x4c, 0xf7, 0x5d,
49 : : 0xd5, 0x6c, 0x2e, 0x13, 0x10, 0x5f, 0xec, 0xfd,
50 : : 0x1a, 0x93, 0x0b, 0xbb, 0x59, 0x48, 0xff, 0x32,
51 : : 0x8f, 0x12, 0x6a, 0xbe, 0x77, 0x93, 0x59, 0xca,
52 : : 0x59, 0xbc, 0xa7, 0x52, 0xc3, 0x08, 0xd2, 0x81,
53 : : 0x57, 0x3b, 0xc6, 0x17, 0x8b, 0x6c, 0x0f, 0xef,
54 : : 0x7d, 0xc4, 0x45, 0xe4, 0xf8, 0x26, 0x43, 0x04,
55 : : 0x37, 0xb9, 0xf9, 0xd7, 0x90, 0x58, 0x1d, 0xe5,
56 : : 0x74, 0x9c, 0x2c, 0xb9, 0xcb, 0x26, 0xd4, 0x2b,
57 : : 0x2f, 0xee, 0x15, 0xb6, 0xb2, 0x6f, 0x09, 0xc9,
58 : : 0x96, 0x70, 0x33, 0x64, 0x23, 0xb8, 0x6b, 0xc5,
59 : : 0xbe, 0xc7, 0x11, 0x13, 0x15, 0x7b, 0xe2, 0xd9,
60 : : 0x44, 0xd7, 0xff, 0x3e, 0xeb, 0xff, 0xb2, 0x84,
61 : : 0x13, 0x14, 0x3e, 0xa3, 0x67, 0x55, 0xdb, 0x0a,
62 : : 0xe6, 0x2f, 0xf5, 0xb7, 0x24, 0xee, 0xcb, 0x3d,
63 : : 0x31, 0x6b, 0x6b, 0xac, 0x67, 0xe8, 0x9c, 0xac,
64 : : 0xd8, 0x17, 0x19, 0x37, 0xe2, 0xab, 0x19, 0xbd,
65 : : 0x35, 0x3a, 0x89, 0xac, 0xea, 0x8c, 0x36, 0xf8,
66 : : 0x1c, 0x89, 0xa6, 0x20, 0xd5, 0xfd, 0x2e, 0xff,
67 : : 0xea, 0x89, 0x66, 0x01, 0xc7, 0xf9, 0xda, 0xca,
68 : : 0x7f, 0x03, 0x3f, 0x63, 0x5a, 0x3a, 0x94, 0x33,
69 : : 0x31, 0xd1, 0xb1, 0xb4, 0xf5, 0x28, 0x87, 0x90,
70 : : 0xb5, 0x3a, 0xf3, 0x52, 0xf1, 0x12, 0x1c, 0xa1,
71 : : 0xbe, 0xf2, 0x05, 0xf4, 0x0d, 0xc0, 0x12, 0xc4,
72 : : 0x12, 0xb4, 0x0b, 0xdd, 0x27, 0x58, 0x5b, 0x94,
73 : : 0x64, 0x66, 0xd7, 0x5f, 0x7e, 0xe0, 0xa7, 0xf9,
74 : : 0xd5, 0x49, 0xb4, 0xbe, 0xce, 0x6f, 0x43, 0xac,
75 : : 0x3e, 0xe6, 0x5f, 0xe7, 0xfd, 0x37, 0x12, 0x33,
76 : : 0x59, 0xd9, 0xf1, 0xa8, 0x50, 0xad, 0x45, 0x0a,
77 : : 0xaf, 0x5c, 0x94, 0xeb, 0x11, 0xde, 0xa3, 0xfc,
78 : : 0x0f, 0xc6, 0xe9, 0x85, 0x6b, 0x18, 0x05, 0xef
79 : : };
80 : :
81 : 4 : const uint8_t e[] = {
82 : : 0x86, 0xc9, 0x4f
83 : : };
84 : :
85 : 4 : const uint8_t private_d[] = {
86 : : 0x49, 0xe5, 0x78, 0x6b, 0xb4, 0xd3, 0x32, 0xf9,
87 : : 0x45, 0x86, 0x32, 0x7b, 0xde, 0x08, 0x88, 0x75,
88 : : 0x37, 0x9b, 0x75, 0xd1, 0x28, 0x48, 0x8f, 0x08,
89 : : 0xe5, 0x74, 0xab, 0x47, 0x15, 0x30, 0x2a, 0x87,
90 : : 0xee, 0xa5, 0x2d, 0x4c, 0x4a, 0x23, 0xd8, 0xb9,
91 : : 0x7a, 0xf7, 0x94, 0x48, 0x04, 0x33, 0x7c, 0x5f,
92 : : 0x55, 0xe1, 0x6b, 0xa9, 0xff, 0xaf, 0xc0, 0xc9,
93 : : 0xfd, 0x9b, 0x88, 0xec, 0xa4, 0x43, 0xf3, 0x9b,
94 : : 0x79, 0x67, 0x17, 0x0d, 0xdb, 0x8c, 0xe7, 0xdd,
95 : : 0xb9, 0x3c, 0x60, 0x87, 0xc8, 0x06, 0x6c, 0x4a,
96 : : 0x95, 0x53, 0x8a, 0x44, 0x1b, 0x9d, 0xc8, 0x0d,
97 : : 0xc9, 0xf7, 0x81, 0x00, 0x54, 0xfd, 0x1e, 0x5c,
98 : : 0x9d, 0x02, 0x50, 0xc9, 0x78, 0xbb, 0x2d, 0x74,
99 : : 0x8a, 0xbe, 0x1e, 0x94, 0x65, 0xd7, 0x1a, 0x81,
100 : : 0x65, 0xd3, 0x12, 0x6d, 0xce, 0x5d, 0xb2, 0xad,
101 : : 0xac, 0xc0, 0x03, 0xe9, 0x06, 0x2b, 0xa3, 0x7a,
102 : : 0x54, 0xb6, 0x3e, 0x5f, 0x49, 0xa4, 0xea, 0xfe,
103 : : 0xbd, 0x7e, 0x4b, 0xf5, 0xb0, 0xa7, 0x96, 0xc2,
104 : : 0xb3, 0xa9, 0x50, 0xfa, 0x09, 0xc7, 0x98, 0xd3,
105 : : 0xfa, 0x3e, 0x86, 0xc4, 0xb6, 0x2c, 0x33, 0xba,
106 : : 0x93, 0x65, 0xed, 0xa0, 0x54, 0xe5, 0xfe, 0x74,
107 : : 0xa4, 0x1f, 0x21, 0xb5, 0x95, 0x02, 0x6a, 0xcf,
108 : : 0x10, 0x93, 0xc9, 0x0a, 0x8c, 0x71, 0x72, 0x2f,
109 : : 0x91, 0xaf, 0x1e, 0xd2, 0x9a, 0x41, 0xa2, 0x44,
110 : : 0x9a, 0x32, 0x0f, 0xc7, 0xba, 0x31, 0x20, 0xe3,
111 : : 0xe8, 0xc3, 0xe4, 0x24, 0x0c, 0x04, 0x92, 0x5c,
112 : : 0xc6, 0x98, 0xec, 0xd6, 0x6c, 0x7c, 0x90, 0x6b,
113 : : 0xdf, 0x24, 0x0a, 0xda, 0xd9, 0x72, 0xb4, 0xdf,
114 : : 0xf4, 0x86, 0x9d, 0x40, 0x0b, 0x5d, 0x13, 0xe3,
115 : : 0x3e, 0xeb, 0xa3, 0x8e, 0x07, 0x5e, 0x87, 0x2b,
116 : : 0x0e, 0xd3, 0xe9, 0x1c, 0xc9, 0xc2, 0x83, 0x86,
117 : : 0x7a, 0x4f, 0xfc, 0x39, 0x01, 0xd2, 0x06, 0x9f
118 : : };
119 : :
120 : : #if LIBSPDM_SHA512_SUPPORT
121 : 4 : hash_nid = LIBSPDM_CRYPTO_NID_SHA512;
122 : :
123 : : /* The message to sign, and the salt of the signature. */
124 : 4 : const uint8_t message[] = {
125 : : 0x5f, 0x0f, 0xe2, 0xaf, 0xa6, 0x1b, 0x62, 0x8c,
126 : : 0x43, 0xea, 0x3b, 0x6b, 0xa6, 0x05, 0x67, 0xb1,
127 : : 0xae, 0x95, 0xf6, 0x82, 0x07, 0x6f, 0x01, 0xdf,
128 : : 0xb6, 0x4d, 0xe0, 0x11, 0xf2, 0x5e, 0x9c, 0x4b,
129 : : 0x36, 0x02, 0xa7, 0x8b, 0x94, 0xce, 0xcb, 0xc1,
130 : : 0x4c, 0xd7, 0x61, 0x33, 0x9d, 0x2d, 0xc3, 0x20,
131 : : 0xdb, 0xa5, 0x04, 0xa3, 0xc2, 0xdc, 0xde, 0xdb,
132 : : 0x0a, 0x78, 0xeb, 0x49, 0x3b, 0xb1, 0x18, 0x79,
133 : : 0xc3, 0x11, 0x58, 0xe5, 0x46, 0x77, 0x95, 0x16,
134 : : 0x35, 0x62, 0xec, 0x0c, 0xa2, 0x6c, 0x19, 0xe0,
135 : : 0x53, 0x15, 0x30, 0xa8, 0x15, 0xc2, 0x8f, 0x9b,
136 : : 0x52, 0x06, 0x10, 0x76, 0xe6, 0x1f, 0x83, 0x1e,
137 : : 0x2f, 0xc4, 0x5b, 0x86, 0x63, 0x1e, 0xa7, 0xd3,
138 : : 0x27, 0x14, 0x44, 0xbe, 0x5d, 0xcb, 0x51, 0x3a,
139 : : 0x3d, 0x6d, 0xe4, 0x57, 0xa7, 0x2a, 0xfb, 0x67,
140 : : 0xb7, 0x7d, 0xb6, 0x5f, 0x9b, 0xb1, 0xc3, 0x80
141 : : };
142 : :
143 : 4 : const uint8_t salt[] = {
144 : : 0xaa, 0x10, 0xfe, 0xc3, 0xf8, 0x3b, 0x7a, 0x97,
145 : : 0xe0, 0x92, 0x87, 0x7a, 0x5b, 0xf9, 0x08, 0x12,
146 : : 0x83, 0xf5, 0x02, 0xa0, 0xa4, 0x6b, 0x50, 0xe3,
147 : : 0x95, 0xab, 0x98, 0x3a, 0x49, 0xac
148 : : };
149 : :
150 : 4 : const uint8_t expected_sig[] = {
151 : : 0x5e, 0x07, 0x12, 0xbb, 0x36, 0x3e, 0x50, 0x34,
152 : : 0xef, 0x6b, 0x23, 0xc1, 0x19, 0xe3, 0xb4, 0x98,
153 : : 0x64, 0x44, 0x45, 0xfa, 0xab, 0x5a, 0x4c, 0x0b,
154 : : 0x4e, 0x21, 0x7e, 0x4c, 0x83, 0x2a, 0xb3, 0x4c,
155 : : 0x14, 0x2d, 0x7f, 0x81, 0xdb, 0xf8, 0xaf, 0xfd,
156 : : 0xb2, 0xda, 0xce, 0xfa, 0xbb, 0x2f, 0x83, 0x52,
157 : : 0x4c, 0x5a, 0xa8, 0x83, 0xfc, 0x5f, 0x06, 0xe5,
158 : : 0x28, 0xb2, 0x32, 0xd9, 0x0f, 0xbe, 0xa9, 0xca,
159 : : 0x08, 0xae, 0x5a, 0xc1, 0x80, 0xd4, 0x77, 0xea,
160 : : 0xed, 0x27, 0xd1, 0x37, 0xe2, 0xb5, 0x1b, 0xd6,
161 : : 0x13, 0xb6, 0x9c, 0x54, 0x3d, 0x55, 0x5b, 0xfc,
162 : : 0x7c, 0xd8, 0x1a, 0x4f, 0x79, 0x57, 0x53, 0xc8,
163 : : 0xc6, 0x4c, 0x6b, 0x5d, 0x2a, 0xcd, 0x9e, 0x26,
164 : : 0xd6, 0x22, 0x5f, 0x5b, 0x26, 0xe4, 0xe6, 0x6a,
165 : : 0x94, 0x5f, 0xd6, 0x47, 0x7a, 0x27, 0x7b, 0x58,
166 : : 0x0d, 0xbe, 0xaa, 0x46, 0xd0, 0xbe, 0x49, 0x8d,
167 : : 0xf9, 0xa0, 0x93, 0x39, 0x29, 0x26, 0xc9, 0x05,
168 : : 0x64, 0x19, 0x45, 0xec, 0x5b, 0x95, 0x97, 0x52,
169 : : 0x5e, 0x44, 0x9a, 0xf3, 0x74, 0x3f, 0x80, 0x55,
170 : : 0x47, 0x88, 0xfc, 0x35, 0x8b, 0xc0, 0x40, 0x1a,
171 : : 0x96, 0x8f, 0xf9, 0x8a, 0xaf, 0x34, 0xe5, 0x0b,
172 : : 0x35, 0x27, 0x51, 0xf3, 0x22, 0x74, 0x75, 0x0f,
173 : : 0xf5, 0xc1, 0xfb, 0xa5, 0x03, 0x05, 0x02, 0x04,
174 : : 0xce, 0xc9, 0xc7, 0x7d, 0xee, 0xde, 0x7f, 0x8f,
175 : : 0xa2, 0x08, 0x45, 0xd9, 0x5f, 0x51, 0x77, 0x03,
176 : : 0x0b, 0xc9, 0x1d, 0x51, 0xf2, 0x6f, 0x29, 0xd2,
177 : : 0xa6, 0x5b, 0x87, 0x0d, 0xc7, 0x2b, 0x81, 0xe5,
178 : : 0xef, 0x9e, 0xee, 0xf9, 0x90, 0xd7, 0xc7, 0x14,
179 : : 0x5b, 0xbf, 0x1a, 0x3b, 0xc7, 0xae, 0xdd, 0x19,
180 : : 0xfa, 0x7c, 0xbb, 0x02, 0x07, 0x56, 0x52, 0x5f,
181 : : 0x18, 0x02, 0x21, 0x6c, 0x13, 0x29, 0x6f, 0xd6,
182 : : 0xaa, 0xc1, 0x1b, 0xf2, 0xd2, 0xd9, 0x04, 0x94
183 : : };
184 : : #elif LIBSPDM_SHA384_SUPPORT
185 : : hash_nid = LIBSPDM_CRYPTO_NID_SHA384;
186 : :
187 : : /* The message to sign, and the salt of the signature. */
188 : : const uint8_t message[] = {
189 : : 0x83, 0x3a, 0xa2, 0xb1, 0xdc, 0xc7, 0x76, 0x07,
190 : : 0xa4, 0x4e, 0x80, 0x4e, 0xe7, 0x7d, 0x45, 0x40,
191 : : 0x85, 0x86, 0xc5, 0x36, 0x86, 0x1f, 0x66, 0x48,
192 : : 0xad, 0xcd, 0x2f, 0xb6, 0x50, 0x63, 0x36, 0x87,
193 : : 0x67, 0xc5, 0x5c, 0x6f, 0xe2, 0xf2, 0x37, 0xf6,
194 : : 0x40, 0x42, 0x50, 0xd7, 0x5d, 0xec, 0x8f, 0xa6,
195 : : 0x8b, 0xca, 0xf3, 0xb6, 0xe5, 0x61, 0x86, 0x3a,
196 : : 0xe0, 0x1c, 0x91, 0xaa, 0x23, 0xd8, 0x0c, 0x69,
197 : : 0x99, 0xa5, 0x58, 0xa4, 0xc4, 0xcb, 0x31, 0x7d,
198 : : 0x54, 0x0c, 0xde, 0x69, 0xf8, 0x29, 0xaa, 0xd6,
199 : : 0x74, 0xa8, 0x98, 0x12, 0xf4, 0xd3, 0x53, 0x68,
200 : : 0x9f, 0x04, 0x64, 0x8c, 0x70, 0x20, 0xa7, 0x39,
201 : : 0x41, 0x62, 0x00, 0x18, 0x29, 0x5a, 0x4a, 0xe4,
202 : : 0x08, 0x35, 0x90, 0xcc, 0x60, 0x3e, 0x80, 0x18,
203 : : 0x67, 0xa5, 0x1c, 0x10, 0x5a, 0x7f, 0xb3, 0x19,
204 : : 0x13, 0x0f, 0x10, 0x22, 0xde, 0x44, 0xf1, 0x3e
205 : : };
206 : :
207 : : const uint8_t salt[] = {
208 : : 0xb7, 0x50, 0x58, 0x76, 0x71, 0xaf, 0xd7, 0x68,
209 : : 0x86, 0xe8, 0xff, 0xb7, 0x86, 0x5e, 0x78, 0xf7,
210 : : 0x06, 0x64, 0x1b, 0x2e, 0x42, 0x51, 0xb4, 0x87,
211 : : 0x06
212 : : };
213 : :
214 : : const uint8_t expected_sig[] = {
215 : : 0x2c, 0xa3, 0x7a, 0x3d, 0x6a, 0xbd, 0x28, 0xc1,
216 : : 0xea, 0xf9, 0xbd, 0xe5, 0xe7, 0xac, 0x17, 0xf1,
217 : : 0xfa, 0x79, 0x9c, 0xe1, 0xb4, 0xb8, 0x99, 0xd1,
218 : : 0x99, 0x85, 0xc2, 0xff, 0x7c, 0x8b, 0xa9, 0x59,
219 : : 0xfe, 0x54, 0xe5, 0xaf, 0xb8, 0xbc, 0x40, 0x21,
220 : : 0xa1, 0xf1, 0xc6, 0x87, 0xee, 0xbb, 0x8c, 0xba,
221 : : 0x80, 0x0d, 0x1c, 0x51, 0x63, 0x6b, 0x1f, 0x68,
222 : : 0xdc, 0x3e, 0x48, 0xf6, 0x3e, 0x2d, 0xa6, 0xbc,
223 : : 0x6d, 0x09, 0xc6, 0x66, 0x8f, 0x68, 0xe5, 0x08,
224 : : 0xc5, 0xd8, 0xc1, 0x9b, 0xef, 0x15, 0x47, 0x59,
225 : : 0xe2, 0xf8, 0x9a, 0xde, 0x15, 0x27, 0x17, 0x37,
226 : : 0x0a, 0x89, 0x44, 0xf5, 0x37, 0x57, 0x82, 0x96,
227 : : 0x38, 0x0d, 0x1f, 0xe6, 0xbe, 0x80, 0x9e, 0x8b,
228 : : 0x11, 0x3d, 0x2b, 0x9d, 0x89, 0xe6, 0xa4, 0x6f,
229 : : 0x5c, 0x33, 0x3d, 0x4f, 0xd4, 0x87, 0x70, 0xfc,
230 : : 0x1e, 0xa1, 0xc5, 0x48, 0x10, 0x45, 0x75, 0xb8,
231 : : 0x4c, 0xf0, 0x71, 0x04, 0x2b, 0xfe, 0x5a, 0xcf,
232 : : 0x49, 0x63, 0x92, 0xbe, 0x83, 0x51, 0xa4, 0x1c,
233 : : 0x46, 0xa2, 0xca, 0xb0, 0x86, 0x4c, 0x4c, 0x1c,
234 : : 0x5b, 0x5e, 0x0c, 0x7b, 0x27, 0xe7, 0xb8, 0x8c,
235 : : 0x69, 0xf3, 0x7f, 0xfa, 0x7e, 0x1a, 0x8c, 0xd9,
236 : : 0x8f, 0x34, 0x3a, 0xc8, 0x4a, 0x4a, 0xd6, 0x70,
237 : : 0x25, 0xa4, 0x0e, 0xd8, 0xf6, 0x64, 0xe9, 0xd6,
238 : : 0x30, 0x33, 0x7d, 0xe6, 0xe4, 0x8b, 0xb2, 0x12,
239 : : 0x5e, 0x25, 0x52, 0x12, 0x36, 0x09, 0x49, 0x1f,
240 : : 0x18, 0x3a, 0xfd, 0x92, 0x63, 0x44, 0x87, 0xf0,
241 : : 0xb2, 0xcf, 0x97, 0x1f, 0x26, 0x26, 0xe8, 0x88,
242 : : 0x58, 0x87, 0x9d, 0x45, 0xa2, 0x9b, 0x0f, 0xef,
243 : : 0xb6, 0x6c, 0xd4, 0x1b, 0x2e, 0x4e, 0x96, 0x83,
244 : : 0x85, 0xbd, 0x9f, 0xc8, 0xc7, 0x21, 0x19, 0x76,
245 : : 0xbc, 0x6b, 0xd3, 0xe1, 0xad, 0x6d, 0xf6, 0x08,
246 : : 0x56, 0x98, 0x5a, 0x82, 0x5f, 0x47, 0x26, 0xd2
247 : : };
248 : : #elif LIBSPDM_SHA256_SUPPORT
249 : : hash_nid = LIBSPDM_CRYPTO_NID_SHA256;
250 : :
251 : : /* The message to sign, and the salt of the signature. */
252 : : const uint8_t message[] = {
253 : : 0xdf, 0xc2, 0x26, 0x04, 0xb9, 0x5d, 0x15, 0x32,
254 : : 0x80, 0x59, 0x74, 0x5c, 0x6c, 0x98, 0xeb, 0x9d,
255 : : 0xfb, 0x34, 0x7c, 0xf9, 0xf1, 0x70, 0xaf, 0xf1,
256 : : 0x9d, 0xee, 0xec, 0x55, 0x5f, 0x22, 0x28, 0x5a,
257 : : 0x67, 0x06, 0xc4, 0xec, 0xbf, 0x0f, 0xb1, 0x45,
258 : : 0x8c, 0x60, 0xd9, 0xbf, 0x91, 0x3f, 0xba, 0xe6,
259 : : 0xf4, 0xc5, 0x54, 0xd2, 0x45, 0xd9, 0x46, 0xb4,
260 : : 0xbc, 0x5f, 0x34, 0xae, 0xc2, 0xac, 0x6b, 0xe8,
261 : : 0xb3, 0x3d, 0xc8, 0xe0, 0xe3, 0xa9, 0xd6, 0x01,
262 : : 0xdf, 0xd5, 0x36, 0x78, 0xf5, 0x67, 0x44, 0x43,
263 : : 0xf6, 0x7d, 0xf7, 0x8a, 0x3a, 0x9e, 0x09, 0x33,
264 : : 0xe5, 0xf1, 0x58, 0xb1, 0x69, 0xac, 0x8d, 0x1c,
265 : : 0x4c, 0xd0, 0xfb, 0x87, 0x2c, 0x14, 0xca, 0x8e,
266 : : 0x00, 0x1e, 0x54, 0x2e, 0xa0, 0xf9, 0xcf, 0xda,
267 : : 0x88, 0xc4, 0x2d, 0xca, 0xd8, 0xa7, 0x40, 0x97,
268 : : 0xa0, 0x0c, 0x22, 0x05, 0x5b, 0x0b, 0xd4, 0x1f
269 : : };
270 : :
271 : : const uint8_t salt[] = {
272 : : 0xe1, 0x25, 0x6f, 0xc1, 0xee, 0xef, 0x81, 0x77,
273 : : 0x3f, 0xdd, 0x54, 0x65, 0x7e, 0x40, 0x07, 0xfd,
274 : : 0xe6, 0xbc, 0xb9, 0xb1
275 : : };
276 : :
277 : : const uint8_t expected_sig[] = {
278 : : 0x8b, 0x46, 0xf2, 0xc8, 0x89, 0xd8, 0x19, 0xf8,
279 : : 0x60, 0xaf, 0x0a, 0x6c, 0x4c, 0x88, 0x9e, 0x4d,
280 : : 0x14, 0x36, 0xc6, 0xca, 0x17, 0x44, 0x64, 0xd2,
281 : : 0x2a, 0xe1, 0x1b, 0x9c, 0xcc, 0x26, 0x5d, 0x74,
282 : : 0x3c, 0x67, 0xe5, 0x69, 0xac, 0xcb, 0xc5, 0xa8,
283 : : 0x0d, 0x4d, 0xd5, 0xf1, 0xbf, 0x40, 0x39, 0xe2,
284 : : 0x3d, 0xe5, 0x2a, 0xec, 0xe4, 0x02, 0x91, 0xc7,
285 : : 0x5f, 0x89, 0x36, 0xc5, 0x8c, 0x9a, 0x2f, 0x77,
286 : : 0xa7, 0x80, 0xbb, 0xe7, 0xad, 0x31, 0xeb, 0x76,
287 : : 0x74, 0x2f, 0x7b, 0x2b, 0x8b, 0x14, 0xca, 0x1a,
288 : : 0x71, 0x96, 0xaf, 0x7e, 0x67, 0x3a, 0x3c, 0xfc,
289 : : 0x23, 0x7d, 0x50, 0xf6, 0x15, 0xb7, 0x5c, 0xf4,
290 : : 0xa7, 0xea, 0x78, 0xa9, 0x48, 0xbe, 0xda, 0xf9,
291 : : 0x24, 0x24, 0x94, 0xb4, 0x1e, 0x1d, 0xb5, 0x1f,
292 : : 0x43, 0x7f, 0x15, 0xfd, 0x25, 0x51, 0xbb, 0x5d,
293 : : 0x24, 0xee, 0xfb, 0x1c, 0x3e, 0x60, 0xf0, 0x36,
294 : : 0x94, 0xd0, 0x03, 0x3a, 0x1e, 0x0a, 0x9b, 0x9f,
295 : : 0x5e, 0x4a, 0xb9, 0x7d, 0x45, 0x7d, 0xff, 0x9b,
296 : : 0x9d, 0xa5, 0x16, 0xdc, 0x22, 0x6d, 0x6d, 0x65,
297 : : 0x29, 0x50, 0x03, 0x08, 0xed, 0x74, 0xa2, 0xe6,
298 : : 0xd9, 0xf3, 0xc1, 0x05, 0x95, 0x78, 0x8a, 0x52,
299 : : 0xa1, 0xbc, 0x06, 0x64, 0xae, 0xdf, 0x33, 0xef,
300 : : 0xc8, 0xba, 0xdd, 0x03, 0x7e, 0xb7, 0xb8, 0x80,
301 : : 0x77, 0x2b, 0xdb, 0x04, 0xa6, 0x04, 0x6e, 0x9e,
302 : : 0xde, 0xee, 0x41, 0x97, 0xc2, 0x55, 0x07, 0xfb,
303 : : 0x0f, 0x11, 0xab, 0x1c, 0x9f, 0x63, 0xf5, 0x3c,
304 : : 0x88, 0x20, 0xea, 0x84, 0x05, 0xcf, 0xd7, 0x72,
305 : : 0x16, 0x92, 0x47, 0x5b, 0x4d, 0x72, 0x35, 0x5f,
306 : : 0xa9, 0xa3, 0x80, 0x4f, 0x29, 0xe6, 0xb6, 0xa7,
307 : : 0xb0, 0x59, 0xc4, 0x44, 0x1d, 0x54, 0xb2, 0x8e,
308 : : 0x4e, 0xed, 0x25, 0x29, 0xc6, 0x10, 0x3b, 0x54,
309 : : 0x32, 0xc7, 0x13, 0x32, 0xce, 0x74, 0x2b, 0xcc
310 : : };
311 : : #endif
312 : :
313 : 4 : rsa = libspdm_rsa_new();
314 [ - + ]: 4 : if (rsa == NULL) {
315 : 0 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "RSA_PSS rsa new failed \n"));
316 : 0 : result = false;
317 : 0 : goto update;
318 : : }
319 : :
320 : 4 : result = libspdm_rsa_set_key(rsa, LIBSPDM_RSA_KEY_N, public_n, sizeof(public_n));
321 [ - + ]: 4 : if (!result) {
322 : 0 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "RSA_PSS rsa set key failed \n"));
323 : 0 : libspdm_rsa_free(rsa);
324 : 0 : result = false;
325 : 0 : goto update;
326 : : }
327 : :
328 : 4 : result = libspdm_rsa_set_key(rsa, LIBSPDM_RSA_KEY_E, e, sizeof(e));
329 [ - + ]: 4 : if (!result) {
330 : 0 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "RSA_PSS rsa set key failed \n"));
331 : 0 : libspdm_rsa_free(rsa);
332 : 0 : result = false;
333 : 0 : goto update;
334 : : }
335 : :
336 : 4 : result = libspdm_rsa_set_key(rsa, LIBSPDM_RSA_KEY_D, private_d, sizeof(private_d));
337 [ - + ]: 4 : if (!result) {
338 : 0 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "RSA_PSS rsa set key failed \n"));
339 : 0 : libspdm_rsa_free(rsa);
340 : 0 : result = false;
341 : 0 : goto update;
342 : : }
343 : :
344 : 4 : result = libspdm_rsa_pss_sign_fips(rsa, hash_nid,
345 : : message, sizeof(message),
346 : : salt, sizeof(salt),
347 : : signature, &sig_size);
348 [ - + ]: 4 : if (!result) {
349 : 0 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "RSA_PSS rsa sign failed \n"));
350 : 0 : libspdm_rsa_free(rsa);
351 : 0 : result = false;
352 : 0 : goto update;
353 : : }
354 : :
355 : : /*KAT test*/
356 [ - + ]: 4 : if (!libspdm_consttime_is_mem_equal(signature, expected_sig,
357 : : sizeof(expected_sig))) {
358 : 0 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "RSA_PSS KAT failed \n"));
359 : 0 : libspdm_rsa_free(rsa);
360 : 0 : result = false;
361 : 0 : goto update;
362 : : }
363 : :
364 : 4 : result = libspdm_rsa_pss_verify_fips(rsa, hash_nid,
365 : : message, sizeof(message),
366 : : sizeof(salt),
367 : : signature, sig_size);
368 [ - + ]: 4 : if (!result) {
369 : 0 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "RSA_PSS selftest failed \n"));
370 : 0 : libspdm_rsa_free(rsa);
371 : 0 : result = false;
372 : 0 : goto update;
373 : : }
374 : :
375 : 4 : libspdm_rsa_free(rsa);
376 : :
377 : 4 : update:
378 : : /* mark it as tested*/
379 : 4 : context->tested_algo |= LIBSPDM_FIPS_SELF_TEST_RSA_PSS;
380 : :
381 : : /* record test result*/
382 [ + - ]: 4 : if (result) {
383 : 4 : context->self_test_result |= LIBSPDM_FIPS_SELF_TEST_RSA_PSS;
384 : : } else {
385 : 0 : context->self_test_result &= ~LIBSPDM_FIPS_SELF_TEST_RSA_PSS;
386 : : }
387 : :
388 : : #endif/*(LIBSPDM_RSA_PSS_SUPPORT) && (LIBSPDM_SHA2_SUPPORT)*/
389 : : }
390 : :
391 : : #endif
|