OLD | NEW |
| (Empty) |
1 /* fips_rsa_sign.c */ | |
2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | |
3 * project 2007. | |
4 */ | |
5 /* ==================================================================== | |
6 * Copyright (c) 2007 The OpenSSL Project. All rights reserved. | |
7 * | |
8 * Redistribution and use in source and binary forms, with or without | |
9 * modification, are permitted provided that the following conditions | |
10 * are met: | |
11 * | |
12 * 1. Redistributions of source code must retain the above copyright | |
13 * notice, this list of conditions and the following disclaimer. | |
14 * | |
15 * 2. Redistributions in binary form must reproduce the above copyright | |
16 * notice, this list of conditions and the following disclaimer in | |
17 * the documentation and/or other materials provided with the | |
18 * distribution. | |
19 * | |
20 * 3. All advertising materials mentioning features or use of this | |
21 * software must display the following acknowledgment: | |
22 * "This product includes software developed by the OpenSSL Project | |
23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" | |
24 * | |
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | |
26 * endorse or promote products derived from this software without | |
27 * prior written permission. For written permission, please contact | |
28 * licensing@OpenSSL.org. | |
29 * | |
30 * 5. Products derived from this software may not be called "OpenSSL" | |
31 * nor may "OpenSSL" appear in their names without prior written | |
32 * permission of the OpenSSL Project. | |
33 * | |
34 * 6. Redistributions of any form whatsoever must retain the following | |
35 * acknowledgment: | |
36 * "This product includes software developed by the OpenSSL Project | |
37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" | |
38 * | |
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | |
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | |
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |
50 * OF THE POSSIBILITY OF SUCH DAMAGE. | |
51 * ==================================================================== | |
52 * | |
53 * This product includes cryptographic software written by Eric Young | |
54 * (eay@cryptsoft.com). This product includes software written by Tim | |
55 * Hudson (tjh@cryptsoft.com). | |
56 * | |
57 */ | |
58 | |
59 #include <string.h> | |
60 #include <openssl/evp.h> | |
61 #include <openssl/rsa.h> | |
62 #include <openssl/err.h> | |
63 #include <openssl/sha.h> | |
64 | |
65 #ifdef OPENSSL_FIPS | |
66 | |
67 /* FIPS versions of RSA_sign() and RSA_verify(). | |
68 * These will only have to deal with SHA* signatures and by including | |
69 * pregenerated encodings all ASN1 dependencies can be avoided | |
70 */ | |
71 | |
72 /* Standard encodings including NULL parameter */ | |
73 | |
74 static const unsigned char sha1_bin[] = { | |
75 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, | |
76 0x00, 0x04, 0x14 | |
77 }; | |
78 | |
79 static const unsigned char sha224_bin[] = { | |
80 0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, | |
81 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 0x1c | |
82 }; | |
83 | |
84 static const unsigned char sha256_bin[] = { | |
85 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, | |
86 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20 | |
87 }; | |
88 | |
89 static const unsigned char sha384_bin[] = { | |
90 0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, | |
91 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30 | |
92 }; | |
93 | |
94 static const unsigned char sha512_bin[] = { | |
95 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, | |
96 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40 | |
97 }; | |
98 | |
99 /* Alternate encodings with absent parameters. We don't generate signature | |
100 * using this format but do tolerate received signatures of this form. | |
101 */ | |
102 | |
103 static unsigned char sha1_nn_bin[] = { | |
104 0x30, 0x1f, 0x30, 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x04, | |
105 0x14 | |
106 }; | |
107 | |
108 static unsigned char sha224_nn_bin[] = { | |
109 0x30, 0x2b, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, | |
110 0x04, 0x02, 0x04, 0x04, 0x1c | |
111 }; | |
112 | |
113 static unsigned char sha256_nn_bin[] = { | |
114 0x30, 0x2f, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, | |
115 0x04, 0x02, 0x01, 0x04, 0x20 | |
116 }; | |
117 | |
118 static unsigned char sha384_nn_bin[] = { | |
119 0x30, 0x3f, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, | |
120 0x04, 0x02, 0x02, 0x04, 0x30 | |
121 }; | |
122 | |
123 static unsigned char sha512_nn_bin[] = { | |
124 0x30, 0x4f, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, | |
125 0x04, 0x02, 0x03, 0x04, 0x40 | |
126 }; | |
127 | |
128 | |
129 static const unsigned char *fips_digestinfo_encoding(int nid, unsigned int *len) | |
130 { | |
131 switch (nid) | |
132 { | |
133 | |
134 case NID_sha1: | |
135 *len = sizeof(sha1_bin); | |
136 return sha1_bin; | |
137 | |
138 case NID_sha224: | |
139 *len = sizeof(sha224_bin); | |
140 return sha224_bin; | |
141 | |
142 case NID_sha256: | |
143 *len = sizeof(sha256_bin); | |
144 return sha256_bin; | |
145 | |
146 case NID_sha384: | |
147 *len = sizeof(sha384_bin); | |
148 return sha384_bin; | |
149 | |
150 case NID_sha512: | |
151 *len = sizeof(sha512_bin); | |
152 return sha512_bin; | |
153 | |
154 default: | |
155 return NULL; | |
156 | |
157 } | |
158 } | |
159 | |
160 static const unsigned char *fips_digestinfo_nn_encoding(int nid, unsigned int *l
en) | |
161 { | |
162 switch (nid) | |
163 { | |
164 | |
165 case NID_sha1: | |
166 *len = sizeof(sha1_nn_bin); | |
167 return sha1_nn_bin; | |
168 | |
169 case NID_sha224: | |
170 *len = sizeof(sha224_nn_bin); | |
171 return sha224_nn_bin; | |
172 | |
173 case NID_sha256: | |
174 *len = sizeof(sha256_nn_bin); | |
175 return sha256_nn_bin; | |
176 | |
177 case NID_sha384: | |
178 *len = sizeof(sha384_nn_bin); | |
179 return sha384_nn_bin; | |
180 | |
181 case NID_sha512: | |
182 *len = sizeof(sha512_nn_bin); | |
183 return sha512_nn_bin; | |
184 | |
185 default: | |
186 return NULL; | |
187 | |
188 } | |
189 } | |
190 | |
191 static int fips_rsa_sign(int type, const unsigned char *x, unsigned int y, | |
192 unsigned char *sigret, unsigned int *siglen, EVP_MD_SVCTX *sv) | |
193 { | |
194 int i=0,j,ret=0; | |
195 unsigned int dlen; | |
196 const unsigned char *der; | |
197 unsigned int m_len; | |
198 int pad_mode = sv->mctx->flags & EVP_MD_CTX_FLAG_PAD_MASK; | |
199 int rsa_pad_mode = 0; | |
200 RSA *rsa = sv->key; | |
201 /* Largest DigestInfo: 19 (max encoding) + max MD */ | |
202 unsigned char tmpdinfo[19 + EVP_MAX_MD_SIZE]; | |
203 unsigned char md[EVP_MAX_MD_SIZE + 1]; | |
204 | |
205 EVP_DigestFinal_ex(sv->mctx, md, &m_len); | |
206 | |
207 if((rsa->flags & RSA_FLAG_SIGN_VER) && rsa->meth->rsa_sign) | |
208 { | |
209 ret = rsa->meth->rsa_sign(type, md, m_len, | |
210 sigret, siglen, rsa); | |
211 goto done; | |
212 } | |
213 | |
214 if (pad_mode == EVP_MD_CTX_FLAG_PAD_X931) | |
215 { | |
216 int hash_id; | |
217 memcpy(tmpdinfo, md, m_len); | |
218 hash_id = RSA_X931_hash_id(M_EVP_MD_CTX_type(sv->mctx)); | |
219 if (hash_id == -1) | |
220 { | |
221 RSAerr(RSA_F_FIPS_RSA_SIGN,RSA_R_UNKNOWN_ALGORITHM_TYPE)
; | |
222 return 0; | |
223 } | |
224 tmpdinfo[m_len] = (unsigned char)hash_id; | |
225 i = m_len + 1; | |
226 rsa_pad_mode = RSA_X931_PADDING; | |
227 } | |
228 else if (pad_mode == EVP_MD_CTX_FLAG_PAD_PKCS1) | |
229 { | |
230 | |
231 der = fips_digestinfo_encoding(type, &dlen); | |
232 | |
233 if (!der) | |
234 { | |
235 RSAerr(RSA_F_FIPS_RSA_SIGN,RSA_R_UNKNOWN_ALGORITHM_TYPE)
; | |
236 return 0; | |
237 } | |
238 memcpy(tmpdinfo, der, dlen); | |
239 memcpy(tmpdinfo + dlen, md, m_len); | |
240 | |
241 i = dlen + m_len; | |
242 rsa_pad_mode = RSA_PKCS1_PADDING; | |
243 | |
244 } | |
245 else if (pad_mode == EVP_MD_CTX_FLAG_PAD_PSS) | |
246 { | |
247 unsigned char *sbuf; | |
248 int saltlen; | |
249 i = RSA_size(rsa); | |
250 sbuf = OPENSSL_malloc(RSA_size(rsa)); | |
251 saltlen = M_EVP_MD_CTX_FLAG_PSS_SALT(sv->mctx); | |
252 if (saltlen == EVP_MD_CTX_FLAG_PSS_MDLEN) | |
253 saltlen = -1; | |
254 else if (saltlen == EVP_MD_CTX_FLAG_PSS_MREC) | |
255 saltlen = -2; | |
256 if (!sbuf) | |
257 { | |
258 RSAerr(RSA_F_FIPS_RSA_SIGN,ERR_R_MALLOC_FAILURE); | |
259 goto psserr; | |
260 } | |
261 if (!RSA_padding_add_PKCS1_PSS(rsa, sbuf, md, | |
262 M_EVP_MD_CTX_md(sv->mctx), saltlen)) | |
263 goto psserr; | |
264 j=rsa->meth->rsa_priv_enc(i,sbuf,sigret,rsa,RSA_NO_PADDING); | |
265 if (j > 0) | |
266 { | |
267 ret=1; | |
268 *siglen=j; | |
269 } | |
270 psserr: | |
271 OPENSSL_cleanse(md,m_len); | |
272 OPENSSL_cleanse(sbuf, i); | |
273 OPENSSL_free(sbuf); | |
274 return ret; | |
275 } | |
276 | |
277 j=RSA_size(rsa); | |
278 if (i > (j-RSA_PKCS1_PADDING_SIZE)) | |
279 { | |
280 RSAerr(RSA_F_FIPS_RSA_SIGN,RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY); | |
281 goto done; | |
282 } | |
283 /* NB: call underlying method directly to avoid FIPS blocking */ | |
284 j=rsa->meth->rsa_priv_enc(i,tmpdinfo,sigret,rsa,rsa_pad_mode); | |
285 if (j > 0) | |
286 { | |
287 ret=1; | |
288 *siglen=j; | |
289 } | |
290 | |
291 done: | |
292 OPENSSL_cleanse(tmpdinfo,i); | |
293 OPENSSL_cleanse(md,m_len); | |
294 return ret; | |
295 } | |
296 | |
297 static int fips_rsa_verify(int dtype, | |
298 const unsigned char *x, unsigned int y, | |
299 unsigned char *sigbuf, unsigned int siglen, EVP_MD_SVCTX *sv) | |
300 { | |
301 int i,ret=0; | |
302 unsigned int dlen, diglen; | |
303 int pad_mode = sv->mctx->flags & EVP_MD_CTX_FLAG_PAD_MASK; | |
304 int rsa_pad_mode = 0; | |
305 unsigned char *s; | |
306 const unsigned char *der; | |
307 unsigned char dig[EVP_MAX_MD_SIZE]; | |
308 RSA *rsa = sv->key; | |
309 | |
310 if (siglen != (unsigned int)RSA_size(sv->key)) | |
311 { | |
312 RSAerr(RSA_F_FIPS_RSA_VERIFY,RSA_R_WRONG_SIGNATURE_LENGTH); | |
313 return(0); | |
314 } | |
315 | |
316 EVP_DigestFinal_ex(sv->mctx, dig, &diglen); | |
317 | |
318 if((rsa->flags & RSA_FLAG_SIGN_VER) && rsa->meth->rsa_verify) | |
319 { | |
320 return rsa->meth->rsa_verify(dtype, dig, diglen, | |
321 sigbuf, siglen, rsa); | |
322 } | |
323 | |
324 | |
325 s= OPENSSL_malloc((unsigned int)siglen); | |
326 if (s == NULL) | |
327 { | |
328 RSAerr(RSA_F_FIPS_RSA_VERIFY,ERR_R_MALLOC_FAILURE); | |
329 goto err; | |
330 } | |
331 if (pad_mode == EVP_MD_CTX_FLAG_PAD_X931) | |
332 rsa_pad_mode = RSA_X931_PADDING; | |
333 else if (pad_mode == EVP_MD_CTX_FLAG_PAD_PKCS1) | |
334 rsa_pad_mode = RSA_PKCS1_PADDING; | |
335 else if (pad_mode == EVP_MD_CTX_FLAG_PAD_PSS) | |
336 rsa_pad_mode = RSA_NO_PADDING; | |
337 | |
338 /* NB: call underlying method directly to avoid FIPS blocking */ | |
339 i=rsa->meth->rsa_pub_dec((int)siglen,sigbuf,s, rsa, rsa_pad_mode); | |
340 | |
341 if (i <= 0) goto err; | |
342 | |
343 if (pad_mode == EVP_MD_CTX_FLAG_PAD_X931) | |
344 { | |
345 int hash_id; | |
346 if (i != (int)(diglen + 1)) | |
347 { | |
348 RSAerr(RSA_F_FIPS_RSA_VERIFY,RSA_R_BAD_SIGNATURE); | |
349 goto err; | |
350 } | |
351 hash_id = RSA_X931_hash_id(M_EVP_MD_CTX_type(sv->mctx)); | |
352 if (hash_id == -1) | |
353 { | |
354 RSAerr(RSA_F_FIPS_RSA_VERIFY,RSA_R_UNKNOWN_ALGORITHM_TYP
E); | |
355 goto err; | |
356 } | |
357 if (s[diglen] != (unsigned char)hash_id) | |
358 { | |
359 RSAerr(RSA_F_FIPS_RSA_VERIFY,RSA_R_BAD_SIGNATURE); | |
360 goto err; | |
361 } | |
362 if (memcmp(s, dig, diglen)) | |
363 { | |
364 RSAerr(RSA_F_FIPS_RSA_VERIFY,RSA_R_BAD_SIGNATURE); | |
365 goto err; | |
366 } | |
367 ret = 1; | |
368 } | |
369 else if (pad_mode == EVP_MD_CTX_FLAG_PAD_PKCS1) | |
370 { | |
371 | |
372 der = fips_digestinfo_encoding(dtype, &dlen); | |
373 | |
374 if (!der) | |
375 { | |
376 RSAerr(RSA_F_FIPS_RSA_VERIFY,RSA_R_UNKNOWN_ALGORITHM_TYP
E); | |
377 return(0); | |
378 } | |
379 | |
380 /* Compare, DigestInfo length, DigestInfo header and finally | |
381 * digest value itself | |
382 */ | |
383 | |
384 /* If length mismatch try alternate encoding */ | |
385 if (i != (int)(dlen + diglen)) | |
386 der = fips_digestinfo_nn_encoding(dtype, &dlen); | |
387 | |
388 if ((i != (int)(dlen + diglen)) || memcmp(der, s, dlen) | |
389 || memcmp(s + dlen, dig, diglen)) | |
390 { | |
391 RSAerr(RSA_F_FIPS_RSA_VERIFY,RSA_R_BAD_SIGNATURE); | |
392 goto err; | |
393 } | |
394 ret = 1; | |
395 | |
396 } | |
397 else if (pad_mode == EVP_MD_CTX_FLAG_PAD_PSS) | |
398 { | |
399 int saltlen; | |
400 saltlen = M_EVP_MD_CTX_FLAG_PSS_SALT(sv->mctx); | |
401 if (saltlen == EVP_MD_CTX_FLAG_PSS_MDLEN) | |
402 saltlen = -1; | |
403 else if (saltlen == EVP_MD_CTX_FLAG_PSS_MREC) | |
404 saltlen = -2; | |
405 ret = RSA_verify_PKCS1_PSS(rsa, dig, M_EVP_MD_CTX_md(sv->mctx), | |
406 s, saltlen); | |
407 if (ret < 0) | |
408 ret = 0; | |
409 } | |
410 err: | |
411 if (s != NULL) | |
412 { | |
413 OPENSSL_cleanse(s, siglen); | |
414 OPENSSL_free(s); | |
415 } | |
416 return(ret); | |
417 } | |
418 | |
419 #define EVP_PKEY_RSA_fips_method \ | |
420 (evp_sign_method *)fips_rsa_sign, \ | |
421 (evp_verify_method *)fips_rsa_verify, \ | |
422 {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} | |
423 | |
424 static int init(EVP_MD_CTX *ctx) | |
425 { return SHA1_Init(ctx->md_data); } | |
426 | |
427 static int update(EVP_MD_CTX *ctx,const void *data,size_t count) | |
428 { return SHA1_Update(ctx->md_data,data,count); } | |
429 | |
430 static int final(EVP_MD_CTX *ctx,unsigned char *md) | |
431 { return SHA1_Final(md,ctx->md_data); } | |
432 | |
433 static const EVP_MD sha1_md= | |
434 { | |
435 NID_sha1, | |
436 NID_sha1WithRSAEncryption, | |
437 SHA_DIGEST_LENGTH, | |
438 EVP_MD_FLAG_FIPS|EVP_MD_FLAG_SVCTX, | |
439 init, | |
440 update, | |
441 final, | |
442 NULL, | |
443 NULL, | |
444 EVP_PKEY_RSA_fips_method, | |
445 SHA_CBLOCK, | |
446 sizeof(EVP_MD *)+sizeof(SHA_CTX), | |
447 }; | |
448 | |
449 const EVP_MD *EVP_sha1(void) | |
450 { | |
451 return(&sha1_md); | |
452 } | |
453 | |
454 static int init224(EVP_MD_CTX *ctx) | |
455 { return SHA224_Init(ctx->md_data); } | |
456 static int init256(EVP_MD_CTX *ctx) | |
457 { return SHA256_Init(ctx->md_data); } | |
458 /* | |
459 * Even though there're separate SHA224_[Update|Final], we call | |
460 * SHA256 functions even in SHA224 context. This is what happens | |
461 * there anyway, so we can spare few CPU cycles:-) | |
462 */ | |
463 static int update256(EVP_MD_CTX *ctx,const void *data,size_t count) | |
464 { return SHA256_Update(ctx->md_data,data,count); } | |
465 static int final256(EVP_MD_CTX *ctx,unsigned char *md) | |
466 { return SHA256_Final(md,ctx->md_data); } | |
467 | |
468 static const EVP_MD sha224_md= | |
469 { | |
470 NID_sha224, | |
471 NID_sha224WithRSAEncryption, | |
472 SHA224_DIGEST_LENGTH, | |
473 EVP_MD_FLAG_FIPS|EVP_MD_FLAG_SVCTX, | |
474 init224, | |
475 update256, | |
476 final256, | |
477 NULL, | |
478 NULL, | |
479 EVP_PKEY_RSA_fips_method, | |
480 SHA256_CBLOCK, | |
481 sizeof(EVP_MD *)+sizeof(SHA256_CTX), | |
482 }; | |
483 | |
484 const EVP_MD *EVP_sha224(void) | |
485 { return(&sha224_md); } | |
486 | |
487 static const EVP_MD sha256_md= | |
488 { | |
489 NID_sha256, | |
490 NID_sha256WithRSAEncryption, | |
491 SHA256_DIGEST_LENGTH, | |
492 EVP_MD_FLAG_FIPS|EVP_MD_FLAG_SVCTX, | |
493 init256, | |
494 update256, | |
495 final256, | |
496 NULL, | |
497 NULL, | |
498 EVP_PKEY_RSA_fips_method, | |
499 SHA256_CBLOCK, | |
500 sizeof(EVP_MD *)+sizeof(SHA256_CTX), | |
501 }; | |
502 | |
503 const EVP_MD *EVP_sha256(void) | |
504 { return(&sha256_md); } | |
505 | |
506 static int init384(EVP_MD_CTX *ctx) | |
507 { return SHA384_Init(ctx->md_data); } | |
508 static int init512(EVP_MD_CTX *ctx) | |
509 { return SHA512_Init(ctx->md_data); } | |
510 /* See comment in SHA224/256 section */ | |
511 static int update512(EVP_MD_CTX *ctx,const void *data,size_t count) | |
512 { return SHA512_Update(ctx->md_data,data,count); } | |
513 static int final512(EVP_MD_CTX *ctx,unsigned char *md) | |
514 { return SHA512_Final(md,ctx->md_data); } | |
515 | |
516 static const EVP_MD sha384_md= | |
517 { | |
518 NID_sha384, | |
519 NID_sha384WithRSAEncryption, | |
520 SHA384_DIGEST_LENGTH, | |
521 EVP_MD_FLAG_FIPS|EVP_MD_FLAG_SVCTX, | |
522 init384, | |
523 update512, | |
524 final512, | |
525 NULL, | |
526 NULL, | |
527 EVP_PKEY_RSA_fips_method, | |
528 SHA512_CBLOCK, | |
529 sizeof(EVP_MD *)+sizeof(SHA512_CTX), | |
530 }; | |
531 | |
532 const EVP_MD *EVP_sha384(void) | |
533 { return(&sha384_md); } | |
534 | |
535 static const EVP_MD sha512_md= | |
536 { | |
537 NID_sha512, | |
538 NID_sha512WithRSAEncryption, | |
539 SHA512_DIGEST_LENGTH, | |
540 EVP_MD_FLAG_FIPS|EVP_MD_FLAG_SVCTX, | |
541 init512, | |
542 update512, | |
543 final512, | |
544 NULL, | |
545 NULL, | |
546 EVP_PKEY_RSA_fips_method, | |
547 SHA512_CBLOCK, | |
548 sizeof(EVP_MD *)+sizeof(SHA512_CTX), | |
549 }; | |
550 | |
551 const EVP_MD *EVP_sha512(void) | |
552 { return(&sha512_md); } | |
553 | |
554 #endif | |
OLD | NEW |