/[smecontribs]/rpms/openssl3/contribs10/0074-FIPS-Use-digest_sign-digest_verify-in-self-test.patch
ViewVC logotype

Contents of /rpms/openssl3/contribs10/0074-FIPS-Use-digest_sign-digest_verify-in-self-test.patch

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (show annotations) (download)
Wed Jan 31 17:24:44 2024 UTC (9 months, 3 weeks ago) by jpp
Branch: MAIN
CVS Tags: openssl3-3_0_7-5_el7_sme_1, HEAD
Initial import

1 From 97ac06e5a8e3a8699279c06eeb64c8e958bad7bd Mon Sep 17 00:00:00 2001
2 From: Clemens Lang <cllang@redhat.com>
3 Date: Fri, 15 Jul 2022 17:45:40 +0200
4 Subject: [PATCH] FIPS: Use digest_sign & digest_verify in self test
5
6 In review for FIPS 140-3, the lack of a self-test for the digest_sign
7 and digest_verify provider functions was highlighted as a problem. NIST
8 no longer provides ACVP tests for the RSA SigVer primitive (see
9 https://github.com/usnistgov/ACVP/issues/1347). Because FIPS 140-3
10 recommends the use of functions that compute the digest and signature
11 within the module, we have been advised in our module review that the
12 self tests should also use the combined digest and signature APIs, i.e.
13 the digest_sign and digest_verify provider functions.
14
15 Modify the signature self-test to use these instead by switching to
16 EVP_DigestSign and EVP_DigestVerify. This requires adding more ifdefs to
17 crypto/evp/m_sigver.c to make these functions usable in the FIPS module.
18
19 Signed-off-by: Clemens Lang <cllang@redhat.com>
20 ---
21 crypto/evp/m_sigver.c | 43 +++++++++++++++++++++++++++------
22 providers/fips/self_test_kats.c | 37 +++++++++++++++-------------
23 2 files changed, 56 insertions(+), 24 deletions(-)
24
25 diff --git a/crypto/evp/m_sigver.c b/crypto/evp/m_sigver.c
26 index db1a1d7bc3..c94c3c53bd 100644
27 --- a/crypto/evp/m_sigver.c
28 +++ b/crypto/evp/m_sigver.c
29 @@ -88,6 +88,7 @@ static int update(EVP_MD_CTX *ctx, const void *data, size_t datalen)
30 ERR_raise(ERR_LIB_EVP, EVP_R_ONLY_ONESHOT_SUPPORTED);
31 return 0;
32 }
33 +#endif /* !defined(FIPS_MODULE) */
34
35 /*
36 * If we get the "NULL" md then the name comes back as "UNDEF". We want to use
37 @@ -130,8 +131,10 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
38 reinit = 0;
39 if (e == NULL)
40 ctx->pctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, props);
41 +#ifndef FIPS_MODULE
42 else
43 ctx->pctx = EVP_PKEY_CTX_new(pkey, e);
44 +#endif /* !defined(FIPS_MODULE) */
45 }
46 if (ctx->pctx == NULL)
47 return 0;
48 @@ -139,8 +142,10 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
49 locpctx = ctx->pctx;
50 ERR_set_mark();
51
52 +#ifndef FIPS_MODULE
53 if (evp_pkey_ctx_is_legacy(locpctx))
54 goto legacy;
55 +#endif /* !defined(FIPS_MODULE) */
56
57 /* do not reinitialize if pkey is set or operation is different */
58 if (reinit
59 @@ -225,8 +230,10 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
60 signature =
61 evp_signature_fetch_from_prov((OSSL_PROVIDER *)tmp_prov,
62 supported_sig, locpctx->propquery);
63 +#ifndef FIPS_MODULE
64 if (signature == NULL)
65 goto legacy;
66 +#endif /* !defined(FIPS_MODULE) */
67 break;
68 }
69 if (signature == NULL)
70 @@ -310,6 +317,7 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
71 ctx->fetched_digest = EVP_MD_fetch(locpctx->libctx, mdname, props);
72 if (ctx->fetched_digest != NULL) {
73 ctx->digest = ctx->reqdigest = ctx->fetched_digest;
74 +#ifndef FIPS_MODULE
75 } else {
76 /* legacy engine support : remove the mark when this is deleted */
77 ctx->reqdigest = ctx->digest = EVP_get_digestbyname(mdname);
78 @@ -318,11 +326,13 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
79 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
80 goto err;
81 }
82 +#endif /* !defined(FIPS_MODULE) */
83 }
84 (void)ERR_pop_to_mark();
85 }
86 }
87
88 +#ifndef FIPS_MODULE
89 if (ctx->reqdigest != NULL
90 && !EVP_PKEY_is_a(locpctx->pkey, SN_hmac)
91 && !EVP_PKEY_is_a(locpctx->pkey, SN_tls1_prf)
92 @@ -334,6 +344,7 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
93 goto err;
94 }
95 }
96 +#endif /* !defined(FIPS_MODULE) */
97
98 if (ver) {
99 if (signature->digest_verify_init == NULL) {
100 @@ -366,6 +377,7 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
101 EVP_KEYMGMT_free(tmp_keymgmt);
102 return 0;
103
104 +#ifndef FIPS_MODULE
105 legacy:
106 /*
107 * If we don't have the full support we need with provided methods,
108 @@ -437,6 +449,7 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
109 ctx->pctx->flag_call_digest_custom = 1;
110
111 ret = 1;
112 +#endif /* !defined(FIPS_MODULE) */
113
114 end:
115 #ifndef FIPS_MODULE
116 @@ -479,7 +492,6 @@ int EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
117 return do_sigver_init(ctx, pctx, type, NULL, NULL, NULL, e, pkey, 1,
118 NULL);
119 }
120 -#endif /* FIPS_MDOE */
121
122 int EVP_DigestSignUpdate(EVP_MD_CTX *ctx, const void *data, size_t dsize)
123 {
124 @@ -541,23 +553,29 @@ int EVP_DigestVerifyUpdate(EVP_MD_CTX *ctx, const void *data, size_t dsize)
125 return EVP_DigestUpdate(ctx, data, dsize);
126 }
127
128 -#ifndef FIPS_MODULE
129 int EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret,
130 size_t *siglen)
131 {
132 - int sctx = 0, r = 0;
133 - EVP_PKEY_CTX *dctx, *pctx = ctx->pctx;
134 + int r = 0;
135 +#ifndef FIPS_MODULE
136 + int sctx = 0;
137 + EVP_PKEY_CTX *dctx;
138 +#endif /* !defined(FIPS_MODULE) */
139 + EVP_PKEY_CTX *pctx = ctx->pctx;
140
141 +#ifndef FIPS_MODULE
142 if (pctx == NULL
143 || pctx->operation != EVP_PKEY_OP_SIGNCTX
144 || pctx->op.sig.algctx == NULL
145 || pctx->op.sig.signature == NULL)
146 goto legacy;
147 +#endif /* !defined(FIPS_MODULE) */
148
149 if (sigret == NULL || (ctx->flags & EVP_MD_CTX_FLAG_FINALISE) != 0)
150 return pctx->op.sig.signature->digest_sign_final(pctx->op.sig.algctx,
151 sigret, siglen,
152 sigret == NULL ? 0 : *siglen);
153 +#ifndef FIPS_MODULE
154 dctx = EVP_PKEY_CTX_dup(pctx);
155 if (dctx == NULL)
156 return 0;
157 @@ -566,8 +584,10 @@ int EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret,
158 sigret, siglen,
159 *siglen);
160 EVP_PKEY_CTX_free(dctx);
161 +#endif /* defined(FIPS_MODULE) */
162 return r;
163
164 +#ifndef FIPS_MODULE
165 legacy:
166 if (pctx == NULL || pctx->pmeth == NULL) {
167 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
168 @@ -639,6 +659,7 @@ int EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret,
169 }
170 }
171 return 1;
172 +#endif /* !defined(FIPS_MODULE) */
173 }
174
175 int EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen,
176 @@ -669,21 +690,27 @@ int EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen,
177 int EVP_DigestVerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sig,
178 size_t siglen)
179 {
180 - unsigned char md[EVP_MAX_MD_SIZE];
181 int r = 0;
182 +#ifndef FIPS_MODULE
183 + unsigned char md[EVP_MAX_MD_SIZE];
184 unsigned int mdlen = 0;
185 int vctx = 0;
186 - EVP_PKEY_CTX *dctx, *pctx = ctx->pctx;
187 + EVP_PKEY_CTX *dctx;
188 +#endif /* !defined(FIPS_MODULE) */
189 + EVP_PKEY_CTX *pctx = ctx->pctx;
190
191 +#ifndef FIPS_MODULE
192 if (pctx == NULL
193 || pctx->operation != EVP_PKEY_OP_VERIFYCTX
194 || pctx->op.sig.algctx == NULL
195 || pctx->op.sig.signature == NULL)
196 goto legacy;
197 +#endif /* !defined(FIPS_MODULE) */
198
199 if ((ctx->flags & EVP_MD_CTX_FLAG_FINALISE) != 0)
200 return pctx->op.sig.signature->digest_verify_final(pctx->op.sig.algctx,
201 sig, siglen);
202 +#ifndef FIPS_MODULE
203 dctx = EVP_PKEY_CTX_dup(pctx);
204 if (dctx == NULL)
205 return 0;
206 @@ -691,8 +718,10 @@ int EVP_DigestVerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sig,
207 r = dctx->op.sig.signature->digest_verify_final(dctx->op.sig.algctx,
208 sig, siglen);
209 EVP_PKEY_CTX_free(dctx);
210 +#endif /* !defined(FIPS_MODULE) */
211 return r;
212
213 +#ifndef FIPS_MODULE
214 legacy:
215 if (pctx == NULL || pctx->pmeth == NULL) {
216 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
217 @@ -732,6 +761,7 @@ int EVP_DigestVerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sig,
218 if (vctx || !r)
219 return r;
220 return EVP_PKEY_verify(pctx, sig, siglen, md, mdlen);
221 +#endif /* !defined(FIPS_MODULE) */
222 }
223
224 int EVP_DigestVerify(EVP_MD_CTX *ctx, const unsigned char *sigret,
225 @@ -757,4 +787,3 @@ int EVP_DigestVerify(EVP_MD_CTX *ctx, const unsigned char *sigret,
226 return -1;
227 return EVP_DigestVerifyFinal(ctx, sigret, siglen);
228 }
229 -#endif /* FIPS_MODULE */
230 diff --git a/providers/fips/self_test_kats.c b/providers/fips/self_test_kats.c
231 index b6d5e8e134..77eec075e6 100644
232 --- a/providers/fips/self_test_kats.c
233 +++ b/providers/fips/self_test_kats.c
234 @@ -444,11 +444,14 @@ static int self_test_sign(const ST_KAT_SIGN *t,
235 int ret = 0;
236 OSSL_PARAM *params = NULL, *params_sig = NULL;
237 OSSL_PARAM_BLD *bld = NULL;
238 + EVP_MD *md = NULL;
239 + EVP_MD_CTX *ctx = NULL;
240 EVP_PKEY_CTX *sctx = NULL, *kctx = NULL;
241 EVP_PKEY *pkey = NULL;
242 - unsigned char sig[256];
243 BN_CTX *bnctx = NULL;
244 BIGNUM *K = NULL;
245 + const char *msg = "Hello World!";
246 + unsigned char sig[256];
247 size_t siglen = sizeof(sig);
248 static const unsigned char dgst[] = {
249 0x7f, 0x83, 0xb1, 0x65, 0x7f, 0xf1, 0xfc, 0x53, 0xb9, 0x2d, 0xc1, 0x81,
250 @@ -488,23 +491,26 @@ static int self_test_sign(const ST_KAT_SIGN *t,
251 || EVP_PKEY_fromdata(kctx, &pkey, EVP_PKEY_KEYPAIR, params) <= 0)
252 goto err;
253
254 - /* Create a EVP_PKEY_CTX to use for the signing operation */
255 - sctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, NULL);
256 - if (sctx == NULL
257 - || EVP_PKEY_sign_init(sctx) <= 0)
258 - goto err;
259 -
260 - /* set signature parameters */
261 - if (!OSSL_PARAM_BLD_push_utf8_string(bld, OSSL_SIGNATURE_PARAM_DIGEST,
262 - t->mdalgorithm,
263 - strlen(t->mdalgorithm) + 1))
264 - goto err;
265 + /* Create a EVP_MD_CTX to use for the signature operation, assign signature
266 + * parameters and sign */
267 params_sig = OSSL_PARAM_BLD_to_param(bld);
268 - if (EVP_PKEY_CTX_set_params(sctx, params_sig) <= 0)
269 + md = EVP_MD_fetch(libctx, "SHA256", NULL);
270 + ctx = EVP_MD_CTX_new();
271 + if (md == NULL || ctx == NULL)
272 + goto err;
273 + EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_FINALISE | EVP_MD_CTX_FLAG_ONESHOT);
274 + if (EVP_DigestSignInit(ctx, &sctx, md, NULL, pkey) <= 0
275 + || EVP_PKEY_CTX_set_params(sctx, params_sig) <= 0
276 + || EVP_DigestSign(ctx, sig, &siglen, (const unsigned char *)msg, strlen(msg)) <= 0
277 + || EVP_MD_CTX_reset(ctx) <= 0)
278 goto err;
279
280 - if (EVP_PKEY_sign(sctx, sig, &siglen, dgst, sizeof(dgst)) <= 0
281 - || EVP_PKEY_verify_init(sctx) <= 0
282 + /* sctx is not freed automatically inside the FIPS module */
283 + EVP_PKEY_CTX_free(sctx);
284 + sctx = NULL;
285 +
286 + EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_FINALISE | EVP_MD_CTX_FLAG_ONESHOT);
287 + if (EVP_DigestVerifyInit(ctx, &sctx, md, NULL, pkey) <= 0
288 || EVP_PKEY_CTX_set_params(sctx, params_sig) <= 0)
289 goto err;
290
291 @@ -509,14 +510,17 @@ static int self_test_sign(const ST_KAT_SIGN *t,
292 goto err;
293
294 OSSL_SELF_TEST_oncorrupt_byte(st, sig);
295 - if (EVP_PKEY_verify(sctx, sig, siglen, dgst, sizeof(dgst)) <= 0)
296 + if (EVP_DigestVerify(ctx, sig, siglen, (const unsigned char *)msg, strlen(msg)) <= 0)
297 goto err;
298 ret = 1;
299 err:
300 BN_CTX_free(bnctx);
301 EVP_PKEY_free(pkey);
302 - EVP_PKEY_CTX_free(kctx);
303 + EVP_MD_free(md);
304 + EVP_MD_CTX_free(ctx);
305 + /* sctx is not freed automatically inside the FIPS module */
306 EVP_PKEY_CTX_free(sctx);
307 + EVP_PKEY_CTX_free(kctx);
308 OSSL_PARAM_free(params);
309 OSSL_PARAM_free(params_sig);
310 OSSL_PARAM_BLD_free(bld);
311 --
312 2.37.1
313

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed