diff options
Diffstat (limited to 'src/lib/libcrypto/dsa')
| -rw-r--r-- | src/lib/libcrypto/dsa/Makefile | 7 | ||||
| -rw-r--r-- | src/lib/libcrypto/dsa/dsa.h | 20 | ||||
| -rw-r--r-- | src/lib/libcrypto/dsa/dsa_asn1.c | 40 | ||||
| -rw-r--r-- | src/lib/libcrypto/dsa/dsa_err.c | 7 | ||||
| -rw-r--r-- | src/lib/libcrypto/dsa/dsa_gen.c | 35 | ||||
| -rw-r--r-- | src/lib/libcrypto/dsa/dsa_key.c | 16 | ||||
| -rw-r--r-- | src/lib/libcrypto/dsa/dsa_lib.c | 22 | ||||
| -rw-r--r-- | src/lib/libcrypto/dsa/dsa_ossl.c | 16 | ||||
| -rw-r--r-- | src/lib/libcrypto/dsa/dsa_sign.c | 50 | ||||
| -rw-r--r-- | src/lib/libcrypto/dsa/dsa_vrf.c | 29 |
10 files changed, 196 insertions, 46 deletions
diff --git a/src/lib/libcrypto/dsa/Makefile b/src/lib/libcrypto/dsa/Makefile index 8073c4ecfe..5fef4ca5ad 100644 --- a/src/lib/libcrypto/dsa/Makefile +++ b/src/lib/libcrypto/dsa/Makefile | |||
| @@ -99,8 +99,9 @@ dsa_asn1.o: ../../include/openssl/dsa.h ../../include/openssl/e_os2.h | |||
| 99 | dsa_asn1.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | 99 | dsa_asn1.o: ../../include/openssl/err.h ../../include/openssl/lhash.h |
| 100 | dsa_asn1.o: ../../include/openssl/opensslconf.h | 100 | dsa_asn1.o: ../../include/openssl/opensslconf.h |
| 101 | dsa_asn1.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h | 101 | dsa_asn1.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h |
| 102 | dsa_asn1.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h | 102 | dsa_asn1.o: ../../include/openssl/rand.h ../../include/openssl/safestack.h |
| 103 | dsa_asn1.o: ../../include/openssl/symhacks.h ../cryptlib.h dsa_asn1.c | 103 | dsa_asn1.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h |
| 104 | dsa_asn1.o: ../cryptlib.h dsa_asn1.c | ||
| 104 | dsa_depr.o: ../../e_os.h ../../include/openssl/asn1.h | 105 | dsa_depr.o: ../../e_os.h ../../include/openssl/asn1.h |
| 105 | dsa_depr.o: ../../include/openssl/bio.h ../../include/openssl/bn.h | 106 | dsa_depr.o: ../../include/openssl/bio.h ../../include/openssl/bn.h |
| 106 | dsa_depr.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | 107 | dsa_depr.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h |
| @@ -189,7 +190,7 @@ dsa_prn.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h | |||
| 189 | dsa_prn.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h | 190 | dsa_prn.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h |
| 190 | dsa_prn.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h | 191 | dsa_prn.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h |
| 191 | dsa_prn.o: ../cryptlib.h dsa_prn.c | 192 | dsa_prn.o: ../cryptlib.h dsa_prn.c |
| 192 | dsa_sign.o: ../../e_os.h ../../include/openssl/bio.h | 193 | dsa_sign.o: ../../e_os.h ../../include/openssl/bio.h ../../include/openssl/bn.h |
| 193 | dsa_sign.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | 194 | dsa_sign.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h |
| 194 | dsa_sign.o: ../../include/openssl/dsa.h ../../include/openssl/e_os2.h | 195 | dsa_sign.o: ../../include/openssl/dsa.h ../../include/openssl/e_os2.h |
| 195 | dsa_sign.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | 196 | dsa_sign.o: ../../include/openssl/err.h ../../include/openssl/lhash.h |
diff --git a/src/lib/libcrypto/dsa/dsa.h b/src/lib/libcrypto/dsa/dsa.h index ac50a5c846..a6f6d0b0b2 100644 --- a/src/lib/libcrypto/dsa/dsa.h +++ b/src/lib/libcrypto/dsa/dsa.h | |||
| @@ -97,6 +97,21 @@ | |||
| 97 | * be used for all exponents. | 97 | * be used for all exponents. |
| 98 | */ | 98 | */ |
| 99 | 99 | ||
| 100 | /* If this flag is set the DSA method is FIPS compliant and can be used | ||
| 101 | * in FIPS mode. This is set in the validated module method. If an | ||
| 102 | * application sets this flag in its own methods it is its reposibility | ||
| 103 | * to ensure the result is compliant. | ||
| 104 | */ | ||
| 105 | |||
| 106 | #define DSA_FLAG_FIPS_METHOD 0x0400 | ||
| 107 | |||
| 108 | /* If this flag is set the operations normally disabled in FIPS mode are | ||
| 109 | * permitted it is then the applications responsibility to ensure that the | ||
| 110 | * usage is compliant. | ||
| 111 | */ | ||
| 112 | |||
| 113 | #define DSA_FLAG_NON_FIPS_ALLOW 0x0400 | ||
| 114 | |||
| 100 | #ifdef __cplusplus | 115 | #ifdef __cplusplus |
| 101 | extern "C" { | 116 | extern "C" { |
| 102 | #endif | 117 | #endif |
| @@ -272,6 +287,8 @@ void ERR_load_DSA_strings(void); | |||
| 272 | #define DSA_F_DSAPARAMS_PRINT_FP 101 | 287 | #define DSA_F_DSAPARAMS_PRINT_FP 101 |
| 273 | #define DSA_F_DSA_DO_SIGN 112 | 288 | #define DSA_F_DSA_DO_SIGN 112 |
| 274 | #define DSA_F_DSA_DO_VERIFY 113 | 289 | #define DSA_F_DSA_DO_VERIFY 113 |
| 290 | #define DSA_F_DSA_GENERATE_KEY 124 | ||
| 291 | #define DSA_F_DSA_GENERATE_PARAMETERS_EX 123 | ||
| 275 | #define DSA_F_DSA_NEW_METHOD 103 | 292 | #define DSA_F_DSA_NEW_METHOD 103 |
| 276 | #define DSA_F_DSA_PARAM_DECODE 119 | 293 | #define DSA_F_DSA_PARAM_DECODE 119 |
| 277 | #define DSA_F_DSA_PRINT_FP 105 | 294 | #define DSA_F_DSA_PRINT_FP 105 |
| @@ -282,6 +299,7 @@ void ERR_load_DSA_strings(void); | |||
| 282 | #define DSA_F_DSA_SIGN 106 | 299 | #define DSA_F_DSA_SIGN 106 |
| 283 | #define DSA_F_DSA_SIGN_SETUP 107 | 300 | #define DSA_F_DSA_SIGN_SETUP 107 |
| 284 | #define DSA_F_DSA_SIG_NEW 109 | 301 | #define DSA_F_DSA_SIG_NEW 109 |
| 302 | #define DSA_F_DSA_SIG_PRINT 125 | ||
| 285 | #define DSA_F_DSA_VERIFY 108 | 303 | #define DSA_F_DSA_VERIFY 108 |
| 286 | #define DSA_F_I2D_DSA_SIG 111 | 304 | #define DSA_F_I2D_DSA_SIG 111 |
| 287 | #define DSA_F_OLD_DSA_PRIV_DECODE 122 | 305 | #define DSA_F_OLD_DSA_PRIV_DECODE 122 |
| @@ -298,6 +316,8 @@ void ERR_load_DSA_strings(void); | |||
| 298 | #define DSA_R_INVALID_DIGEST_TYPE 106 | 316 | #define DSA_R_INVALID_DIGEST_TYPE 106 |
| 299 | #define DSA_R_MISSING_PARAMETERS 101 | 317 | #define DSA_R_MISSING_PARAMETERS 101 |
| 300 | #define DSA_R_MODULUS_TOO_LARGE 103 | 318 | #define DSA_R_MODULUS_TOO_LARGE 103 |
| 319 | #define DSA_R_NEED_NEW_SETUP_VALUES 110 | ||
| 320 | #define DSA_R_NON_FIPS_DSA_METHOD 111 | ||
| 301 | #define DSA_R_NO_PARAMETERS_SET 107 | 321 | #define DSA_R_NO_PARAMETERS_SET 107 |
| 302 | #define DSA_R_PARAMETER_ENCODING_ERROR 105 | 322 | #define DSA_R_PARAMETER_ENCODING_ERROR 105 |
| 303 | 323 | ||
diff --git a/src/lib/libcrypto/dsa/dsa_asn1.c b/src/lib/libcrypto/dsa/dsa_asn1.c index c37460b2d6..6058534374 100644 --- a/src/lib/libcrypto/dsa/dsa_asn1.c +++ b/src/lib/libcrypto/dsa/dsa_asn1.c | |||
| @@ -61,6 +61,7 @@ | |||
| 61 | #include <openssl/dsa.h> | 61 | #include <openssl/dsa.h> |
| 62 | #include <openssl/asn1.h> | 62 | #include <openssl/asn1.h> |
| 63 | #include <openssl/asn1t.h> | 63 | #include <openssl/asn1t.h> |
| 64 | #include <openssl/rand.h> | ||
| 64 | 65 | ||
| 65 | /* Override the default new methods */ | 66 | /* Override the default new methods */ |
| 66 | static int sig_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | 67 | static int sig_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, |
| @@ -87,7 +88,7 @@ ASN1_SEQUENCE_cb(DSA_SIG, sig_cb) = { | |||
| 87 | ASN1_SIMPLE(DSA_SIG, s, CBIGNUM) | 88 | ASN1_SIMPLE(DSA_SIG, s, CBIGNUM) |
| 88 | } ASN1_SEQUENCE_END_cb(DSA_SIG, DSA_SIG) | 89 | } ASN1_SEQUENCE_END_cb(DSA_SIG, DSA_SIG) |
| 89 | 90 | ||
| 90 | IMPLEMENT_ASN1_FUNCTIONS_const(DSA_SIG) | 91 | IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA_SIG, DSA_SIG, DSA_SIG) |
| 91 | 92 | ||
| 92 | /* Override the default free and new methods */ | 93 | /* Override the default free and new methods */ |
| 93 | static int dsa_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | 94 | static int dsa_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, |
| @@ -148,3 +149,40 @@ DSA *DSAparams_dup(DSA *dsa) | |||
| 148 | { | 149 | { |
| 149 | return ASN1_item_dup(ASN1_ITEM_rptr(DSAparams), dsa); | 150 | return ASN1_item_dup(ASN1_ITEM_rptr(DSAparams), dsa); |
| 150 | } | 151 | } |
| 152 | |||
| 153 | int DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig, | ||
| 154 | unsigned int *siglen, DSA *dsa) | ||
| 155 | { | ||
| 156 | DSA_SIG *s; | ||
| 157 | RAND_seed(dgst, dlen); | ||
| 158 | s=DSA_do_sign(dgst,dlen,dsa); | ||
| 159 | if (s == NULL) | ||
| 160 | { | ||
| 161 | *siglen=0; | ||
| 162 | return(0); | ||
| 163 | } | ||
| 164 | *siglen=i2d_DSA_SIG(s,&sig); | ||
| 165 | DSA_SIG_free(s); | ||
| 166 | return(1); | ||
| 167 | } | ||
| 168 | |||
| 169 | /* data has already been hashed (probably with SHA or SHA-1). */ | ||
| 170 | /* returns | ||
| 171 | * 1: correct signature | ||
| 172 | * 0: incorrect signature | ||
| 173 | * -1: error | ||
| 174 | */ | ||
| 175 | int DSA_verify(int type, const unsigned char *dgst, int dgst_len, | ||
| 176 | const unsigned char *sigbuf, int siglen, DSA *dsa) | ||
| 177 | { | ||
| 178 | DSA_SIG *s; | ||
| 179 | int ret=-1; | ||
| 180 | |||
| 181 | s = DSA_SIG_new(); | ||
| 182 | if (s == NULL) return(ret); | ||
| 183 | if (d2i_DSA_SIG(&s,&sigbuf,siglen) == NULL) goto err; | ||
| 184 | ret=DSA_do_verify(dgst,dgst_len,s,dsa); | ||
| 185 | err: | ||
| 186 | DSA_SIG_free(s); | ||
| 187 | return(ret); | ||
| 188 | } | ||
diff --git a/src/lib/libcrypto/dsa/dsa_err.c b/src/lib/libcrypto/dsa/dsa_err.c index bba984e92e..00545b7b9f 100644 --- a/src/lib/libcrypto/dsa/dsa_err.c +++ b/src/lib/libcrypto/dsa/dsa_err.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* crypto/dsa/dsa_err.c */ | 1 | /* crypto/dsa/dsa_err.c */ |
| 2 | /* ==================================================================== | 2 | /* ==================================================================== |
| 3 | * Copyright (c) 1999-2006 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 1999-2011 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| 5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
| 6 | * modification, are permitted provided that the following conditions | 6 | * modification, are permitted provided that the following conditions |
| @@ -76,6 +76,8 @@ static ERR_STRING_DATA DSA_str_functs[]= | |||
| 76 | {ERR_FUNC(DSA_F_DSAPARAMS_PRINT_FP), "DSAparams_print_fp"}, | 76 | {ERR_FUNC(DSA_F_DSAPARAMS_PRINT_FP), "DSAparams_print_fp"}, |
| 77 | {ERR_FUNC(DSA_F_DSA_DO_SIGN), "DSA_do_sign"}, | 77 | {ERR_FUNC(DSA_F_DSA_DO_SIGN), "DSA_do_sign"}, |
| 78 | {ERR_FUNC(DSA_F_DSA_DO_VERIFY), "DSA_do_verify"}, | 78 | {ERR_FUNC(DSA_F_DSA_DO_VERIFY), "DSA_do_verify"}, |
| 79 | {ERR_FUNC(DSA_F_DSA_GENERATE_KEY), "DSA_generate_key"}, | ||
| 80 | {ERR_FUNC(DSA_F_DSA_GENERATE_PARAMETERS_EX), "DSA_generate_parameters_ex"}, | ||
| 79 | {ERR_FUNC(DSA_F_DSA_NEW_METHOD), "DSA_new_method"}, | 81 | {ERR_FUNC(DSA_F_DSA_NEW_METHOD), "DSA_new_method"}, |
| 80 | {ERR_FUNC(DSA_F_DSA_PARAM_DECODE), "DSA_PARAM_DECODE"}, | 82 | {ERR_FUNC(DSA_F_DSA_PARAM_DECODE), "DSA_PARAM_DECODE"}, |
| 81 | {ERR_FUNC(DSA_F_DSA_PRINT_FP), "DSA_print_fp"}, | 83 | {ERR_FUNC(DSA_F_DSA_PRINT_FP), "DSA_print_fp"}, |
| @@ -86,6 +88,7 @@ static ERR_STRING_DATA DSA_str_functs[]= | |||
| 86 | {ERR_FUNC(DSA_F_DSA_SIGN), "DSA_sign"}, | 88 | {ERR_FUNC(DSA_F_DSA_SIGN), "DSA_sign"}, |
| 87 | {ERR_FUNC(DSA_F_DSA_SIGN_SETUP), "DSA_sign_setup"}, | 89 | {ERR_FUNC(DSA_F_DSA_SIGN_SETUP), "DSA_sign_setup"}, |
| 88 | {ERR_FUNC(DSA_F_DSA_SIG_NEW), "DSA_SIG_new"}, | 90 | {ERR_FUNC(DSA_F_DSA_SIG_NEW), "DSA_SIG_new"}, |
| 91 | {ERR_FUNC(DSA_F_DSA_SIG_PRINT), "DSA_SIG_PRINT"}, | ||
| 89 | {ERR_FUNC(DSA_F_DSA_VERIFY), "DSA_verify"}, | 92 | {ERR_FUNC(DSA_F_DSA_VERIFY), "DSA_verify"}, |
| 90 | {ERR_FUNC(DSA_F_I2D_DSA_SIG), "i2d_DSA_SIG"}, | 93 | {ERR_FUNC(DSA_F_I2D_DSA_SIG), "i2d_DSA_SIG"}, |
| 91 | {ERR_FUNC(DSA_F_OLD_DSA_PRIV_DECODE), "OLD_DSA_PRIV_DECODE"}, | 94 | {ERR_FUNC(DSA_F_OLD_DSA_PRIV_DECODE), "OLD_DSA_PRIV_DECODE"}, |
| @@ -105,6 +108,8 @@ static ERR_STRING_DATA DSA_str_reasons[]= | |||
| 105 | {ERR_REASON(DSA_R_INVALID_DIGEST_TYPE) ,"invalid digest type"}, | 108 | {ERR_REASON(DSA_R_INVALID_DIGEST_TYPE) ,"invalid digest type"}, |
| 106 | {ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"}, | 109 | {ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"}, |
| 107 | {ERR_REASON(DSA_R_MODULUS_TOO_LARGE) ,"modulus too large"}, | 110 | {ERR_REASON(DSA_R_MODULUS_TOO_LARGE) ,"modulus too large"}, |
| 111 | {ERR_REASON(DSA_R_NEED_NEW_SETUP_VALUES) ,"need new setup values"}, | ||
| 112 | {ERR_REASON(DSA_R_NON_FIPS_DSA_METHOD) ,"non fips dsa method"}, | ||
| 108 | {ERR_REASON(DSA_R_NO_PARAMETERS_SET) ,"no parameters set"}, | 113 | {ERR_REASON(DSA_R_NO_PARAMETERS_SET) ,"no parameters set"}, |
| 109 | {ERR_REASON(DSA_R_PARAMETER_ENCODING_ERROR),"parameter encoding error"}, | 114 | {ERR_REASON(DSA_R_PARAMETER_ENCODING_ERROR),"parameter encoding error"}, |
| 110 | {0,NULL} | 115 | {0,NULL} |
diff --git a/src/lib/libcrypto/dsa/dsa_gen.c b/src/lib/libcrypto/dsa/dsa_gen.c index cb0b4538a4..c398761d0d 100644 --- a/src/lib/libcrypto/dsa/dsa_gen.c +++ b/src/lib/libcrypto/dsa/dsa_gen.c | |||
| @@ -81,13 +81,33 @@ | |||
| 81 | #include <openssl/sha.h> | 81 | #include <openssl/sha.h> |
| 82 | #include "dsa_locl.h" | 82 | #include "dsa_locl.h" |
| 83 | 83 | ||
| 84 | #ifdef OPENSSL_FIPS | ||
| 85 | #include <openssl/fips.h> | ||
| 86 | #endif | ||
| 87 | |||
| 84 | int DSA_generate_parameters_ex(DSA *ret, int bits, | 88 | int DSA_generate_parameters_ex(DSA *ret, int bits, |
| 85 | const unsigned char *seed_in, int seed_len, | 89 | const unsigned char *seed_in, int seed_len, |
| 86 | int *counter_ret, unsigned long *h_ret, BN_GENCB *cb) | 90 | int *counter_ret, unsigned long *h_ret, BN_GENCB *cb) |
| 87 | { | 91 | { |
| 92 | #ifdef OPENSSL_FIPS | ||
| 93 | if (FIPS_mode() && !(ret->meth->flags & DSA_FLAG_FIPS_METHOD) | ||
| 94 | && !(ret->flags & DSA_FLAG_NON_FIPS_ALLOW)) | ||
| 95 | { | ||
| 96 | DSAerr(DSA_F_DSA_GENERATE_PARAMETERS_EX, DSA_R_NON_FIPS_DSA_METHOD); | ||
| 97 | return 0; | ||
| 98 | } | ||
| 99 | #endif | ||
| 88 | if(ret->meth->dsa_paramgen) | 100 | if(ret->meth->dsa_paramgen) |
| 89 | return ret->meth->dsa_paramgen(ret, bits, seed_in, seed_len, | 101 | return ret->meth->dsa_paramgen(ret, bits, seed_in, seed_len, |
| 90 | counter_ret, h_ret, cb); | 102 | counter_ret, h_ret, cb); |
| 103 | #ifdef OPENSSL_FIPS | ||
| 104 | else if (FIPS_mode()) | ||
| 105 | { | ||
| 106 | return FIPS_dsa_generate_parameters_ex(ret, bits, | ||
| 107 | seed_in, seed_len, | ||
| 108 | counter_ret, h_ret, cb); | ||
| 109 | } | ||
| 110 | #endif | ||
| 91 | else | 111 | else |
| 92 | { | 112 | { |
| 93 | const EVP_MD *evpmd; | 113 | const EVP_MD *evpmd; |
| @@ -105,12 +125,13 @@ int DSA_generate_parameters_ex(DSA *ret, int bits, | |||
| 105 | } | 125 | } |
| 106 | 126 | ||
| 107 | return dsa_builtin_paramgen(ret, bits, qbits, evpmd, | 127 | return dsa_builtin_paramgen(ret, bits, qbits, evpmd, |
| 108 | seed_in, seed_len, counter_ret, h_ret, cb); | 128 | seed_in, seed_len, NULL, counter_ret, h_ret, cb); |
| 109 | } | 129 | } |
| 110 | } | 130 | } |
| 111 | 131 | ||
| 112 | int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits, | 132 | int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits, |
| 113 | const EVP_MD *evpmd, const unsigned char *seed_in, size_t seed_len, | 133 | const EVP_MD *evpmd, const unsigned char *seed_in, size_t seed_len, |
| 134 | unsigned char *seed_out, | ||
| 114 | int *counter_ret, unsigned long *h_ret, BN_GENCB *cb) | 135 | int *counter_ret, unsigned long *h_ret, BN_GENCB *cb) |
| 115 | { | 136 | { |
| 116 | int ok=0; | 137 | int ok=0; |
| @@ -201,8 +222,10 @@ int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits, | |||
| 201 | } | 222 | } |
| 202 | 223 | ||
| 203 | /* step 2 */ | 224 | /* step 2 */ |
| 204 | EVP_Digest(seed, qsize, md, NULL, evpmd, NULL); | 225 | if (!EVP_Digest(seed, qsize, md, NULL, evpmd, NULL)) |
| 205 | EVP_Digest(buf, qsize, buf2, NULL, evpmd, NULL); | 226 | goto err; |
| 227 | if (!EVP_Digest(buf, qsize, buf2, NULL, evpmd, NULL)) | ||
| 228 | goto err; | ||
| 206 | for (i = 0; i < qsize; i++) | 229 | for (i = 0; i < qsize; i++) |
| 207 | md[i]^=buf2[i]; | 230 | md[i]^=buf2[i]; |
| 208 | 231 | ||
| @@ -251,7 +274,9 @@ int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits, | |||
| 251 | break; | 274 | break; |
| 252 | } | 275 | } |
| 253 | 276 | ||
| 254 | EVP_Digest(buf, qsize, md ,NULL, evpmd, NULL); | 277 | if (!EVP_Digest(buf, qsize, md ,NULL, evpmd, |
| 278 | NULL)) | ||
| 279 | goto err; | ||
| 255 | 280 | ||
| 256 | /* step 8 */ | 281 | /* step 8 */ |
| 257 | if (!BN_bin2bn(md, qsize, r0)) | 282 | if (!BN_bin2bn(md, qsize, r0)) |
| @@ -332,6 +357,8 @@ err: | |||
| 332 | } | 357 | } |
| 333 | if (counter_ret != NULL) *counter_ret=counter; | 358 | if (counter_ret != NULL) *counter_ret=counter; |
| 334 | if (h_ret != NULL) *h_ret=h; | 359 | if (h_ret != NULL) *h_ret=h; |
| 360 | if (seed_out) | ||
| 361 | memcpy(seed_out, seed, qsize); | ||
| 335 | } | 362 | } |
| 336 | if(ctx) | 363 | if(ctx) |
| 337 | { | 364 | { |
diff --git a/src/lib/libcrypto/dsa/dsa_key.c b/src/lib/libcrypto/dsa/dsa_key.c index c4aa86bc6d..9cf669b921 100644 --- a/src/lib/libcrypto/dsa/dsa_key.c +++ b/src/lib/libcrypto/dsa/dsa_key.c | |||
| @@ -64,12 +64,28 @@ | |||
| 64 | #include <openssl/dsa.h> | 64 | #include <openssl/dsa.h> |
| 65 | #include <openssl/rand.h> | 65 | #include <openssl/rand.h> |
| 66 | 66 | ||
| 67 | #ifdef OPENSSL_FIPS | ||
| 68 | #include <openssl/fips.h> | ||
| 69 | #endif | ||
| 70 | |||
| 67 | static int dsa_builtin_keygen(DSA *dsa); | 71 | static int dsa_builtin_keygen(DSA *dsa); |
| 68 | 72 | ||
| 69 | int DSA_generate_key(DSA *dsa) | 73 | int DSA_generate_key(DSA *dsa) |
| 70 | { | 74 | { |
| 75 | #ifdef OPENSSL_FIPS | ||
| 76 | if (FIPS_mode() && !(dsa->meth->flags & DSA_FLAG_FIPS_METHOD) | ||
| 77 | && !(dsa->flags & DSA_FLAG_NON_FIPS_ALLOW)) | ||
| 78 | { | ||
| 79 | DSAerr(DSA_F_DSA_GENERATE_KEY, DSA_R_NON_FIPS_DSA_METHOD); | ||
| 80 | return 0; | ||
| 81 | } | ||
| 82 | #endif | ||
| 71 | if(dsa->meth->dsa_keygen) | 83 | if(dsa->meth->dsa_keygen) |
| 72 | return dsa->meth->dsa_keygen(dsa); | 84 | return dsa->meth->dsa_keygen(dsa); |
| 85 | #ifdef OPENSSL_FIPS | ||
| 86 | if (FIPS_mode()) | ||
| 87 | return FIPS_dsa_generate_key(dsa); | ||
| 88 | #endif | ||
| 73 | return dsa_builtin_keygen(dsa); | 89 | return dsa_builtin_keygen(dsa); |
| 74 | } | 90 | } |
| 75 | 91 | ||
diff --git a/src/lib/libcrypto/dsa/dsa_lib.c b/src/lib/libcrypto/dsa/dsa_lib.c index e9b75902db..96d8d0c4b4 100644 --- a/src/lib/libcrypto/dsa/dsa_lib.c +++ b/src/lib/libcrypto/dsa/dsa_lib.c | |||
| @@ -70,6 +70,10 @@ | |||
| 70 | #include <openssl/dh.h> | 70 | #include <openssl/dh.h> |
| 71 | #endif | 71 | #endif |
| 72 | 72 | ||
| 73 | #ifdef OPENSSL_FIPS | ||
| 74 | #include <openssl/fips.h> | ||
| 75 | #endif | ||
| 76 | |||
| 73 | const char DSA_version[]="DSA" OPENSSL_VERSION_PTEXT; | 77 | const char DSA_version[]="DSA" OPENSSL_VERSION_PTEXT; |
| 74 | 78 | ||
| 75 | static const DSA_METHOD *default_DSA_method = NULL; | 79 | static const DSA_METHOD *default_DSA_method = NULL; |
| @@ -82,7 +86,16 @@ void DSA_set_default_method(const DSA_METHOD *meth) | |||
| 82 | const DSA_METHOD *DSA_get_default_method(void) | 86 | const DSA_METHOD *DSA_get_default_method(void) |
| 83 | { | 87 | { |
| 84 | if(!default_DSA_method) | 88 | if(!default_DSA_method) |
| 89 | { | ||
| 90 | #ifdef OPENSSL_FIPS | ||
| 91 | if (FIPS_mode()) | ||
| 92 | return FIPS_dsa_openssl(); | ||
| 93 | else | ||
| 94 | return DSA_OpenSSL(); | ||
| 95 | #else | ||
| 85 | default_DSA_method = DSA_OpenSSL(); | 96 | default_DSA_method = DSA_OpenSSL(); |
| 97 | #endif | ||
| 98 | } | ||
| 86 | return default_DSA_method; | 99 | return default_DSA_method; |
| 87 | } | 100 | } |
| 88 | 101 | ||
| @@ -163,7 +176,7 @@ DSA *DSA_new_method(ENGINE *engine) | |||
| 163 | ret->method_mont_p=NULL; | 176 | ret->method_mont_p=NULL; |
| 164 | 177 | ||
| 165 | ret->references=1; | 178 | ret->references=1; |
| 166 | ret->flags=ret->meth->flags; | 179 | ret->flags=ret->meth->flags & ~DSA_FLAG_NON_FIPS_ALLOW; |
| 167 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_DSA, ret, &ret->ex_data); | 180 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_DSA, ret, &ret->ex_data); |
| 168 | if ((ret->meth->init != NULL) && !ret->meth->init(ret)) | 181 | if ((ret->meth->init != NULL) && !ret->meth->init(ret)) |
| 169 | { | 182 | { |
| @@ -276,7 +289,8 @@ void *DSA_get_ex_data(DSA *d, int idx) | |||
| 276 | DH *DSA_dup_DH(const DSA *r) | 289 | DH *DSA_dup_DH(const DSA *r) |
| 277 | { | 290 | { |
| 278 | /* DSA has p, q, g, optional pub_key, optional priv_key. | 291 | /* DSA has p, q, g, optional pub_key, optional priv_key. |
| 279 | * DH has p, optional length, g, optional pub_key, optional priv_key. | 292 | * DH has p, optional length, g, optional pub_key, optional priv_key, |
| 293 | * optional q. | ||
| 280 | */ | 294 | */ |
| 281 | 295 | ||
| 282 | DH *ret = NULL; | 296 | DH *ret = NULL; |
| @@ -290,7 +304,11 @@ DH *DSA_dup_DH(const DSA *r) | |||
| 290 | if ((ret->p = BN_dup(r->p)) == NULL) | 304 | if ((ret->p = BN_dup(r->p)) == NULL) |
| 291 | goto err; | 305 | goto err; |
| 292 | if (r->q != NULL) | 306 | if (r->q != NULL) |
| 307 | { | ||
| 293 | ret->length = BN_num_bits(r->q); | 308 | ret->length = BN_num_bits(r->q); |
| 309 | if ((ret->q = BN_dup(r->q)) == NULL) | ||
| 310 | goto err; | ||
| 311 | } | ||
| 294 | if (r->g != NULL) | 312 | if (r->g != NULL) |
| 295 | if ((ret->g = BN_dup(r->g)) == NULL) | 313 | if ((ret->g = BN_dup(r->g)) == NULL) |
| 296 | goto err; | 314 | goto err; |
diff --git a/src/lib/libcrypto/dsa/dsa_ossl.c b/src/lib/libcrypto/dsa/dsa_ossl.c index a3ddd7d281..b3d78e524c 100644 --- a/src/lib/libcrypto/dsa/dsa_ossl.c +++ b/src/lib/libcrypto/dsa/dsa_ossl.c | |||
| @@ -136,6 +136,7 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | |||
| 136 | BN_CTX *ctx=NULL; | 136 | BN_CTX *ctx=NULL; |
| 137 | int reason=ERR_R_BN_LIB; | 137 | int reason=ERR_R_BN_LIB; |
| 138 | DSA_SIG *ret=NULL; | 138 | DSA_SIG *ret=NULL; |
| 139 | int noredo = 0; | ||
| 139 | 140 | ||
| 140 | BN_init(&m); | 141 | BN_init(&m); |
| 141 | BN_init(&xr); | 142 | BN_init(&xr); |
| @@ -150,7 +151,7 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | |||
| 150 | if (s == NULL) goto err; | 151 | if (s == NULL) goto err; |
| 151 | ctx=BN_CTX_new(); | 152 | ctx=BN_CTX_new(); |
| 152 | if (ctx == NULL) goto err; | 153 | if (ctx == NULL) goto err; |
| 153 | 154 | redo: | |
| 154 | if ((dsa->kinv == NULL) || (dsa->r == NULL)) | 155 | if ((dsa->kinv == NULL) || (dsa->r == NULL)) |
| 155 | { | 156 | { |
| 156 | if (!DSA_sign_setup(dsa,ctx,&kinv,&r)) goto err; | 157 | if (!DSA_sign_setup(dsa,ctx,&kinv,&r)) goto err; |
| @@ -161,6 +162,7 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | |||
| 161 | dsa->kinv=NULL; | 162 | dsa->kinv=NULL; |
| 162 | r=dsa->r; | 163 | r=dsa->r; |
| 163 | dsa->r=NULL; | 164 | dsa->r=NULL; |
| 165 | noredo = 1; | ||
| 164 | } | 166 | } |
| 165 | 167 | ||
| 166 | 168 | ||
| @@ -181,6 +183,18 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | |||
| 181 | 183 | ||
| 182 | ret=DSA_SIG_new(); | 184 | ret=DSA_SIG_new(); |
| 183 | if (ret == NULL) goto err; | 185 | if (ret == NULL) goto err; |
| 186 | /* Redo if r or s is zero as required by FIPS 186-3: this is | ||
| 187 | * very unlikely. | ||
| 188 | */ | ||
| 189 | if (BN_is_zero(r) || BN_is_zero(s)) | ||
| 190 | { | ||
| 191 | if (noredo) | ||
| 192 | { | ||
| 193 | reason = DSA_R_NEED_NEW_SETUP_VALUES; | ||
| 194 | goto err; | ||
| 195 | } | ||
| 196 | goto redo; | ||
| 197 | } | ||
| 184 | ret->r = r; | 198 | ret->r = r; |
| 185 | ret->s = s; | 199 | ret->s = s; |
| 186 | 200 | ||
diff --git a/src/lib/libcrypto/dsa/dsa_sign.c b/src/lib/libcrypto/dsa/dsa_sign.c index 17555e5892..c3cc3642ce 100644 --- a/src/lib/libcrypto/dsa/dsa_sign.c +++ b/src/lib/libcrypto/dsa/dsa_sign.c | |||
| @@ -61,30 +61,54 @@ | |||
| 61 | #include "cryptlib.h" | 61 | #include "cryptlib.h" |
| 62 | #include <openssl/dsa.h> | 62 | #include <openssl/dsa.h> |
| 63 | #include <openssl/rand.h> | 63 | #include <openssl/rand.h> |
| 64 | #include <openssl/bn.h> | ||
| 64 | 65 | ||
| 65 | DSA_SIG * DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | 66 | DSA_SIG * DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) |
| 66 | { | 67 | { |
| 68 | #ifdef OPENSSL_FIPS | ||
| 69 | if (FIPS_mode() && !(dsa->meth->flags & DSA_FLAG_FIPS_METHOD) | ||
| 70 | && !(dsa->flags & DSA_FLAG_NON_FIPS_ALLOW)) | ||
| 71 | { | ||
| 72 | DSAerr(DSA_F_DSA_DO_SIGN, DSA_R_NON_FIPS_DSA_METHOD); | ||
| 73 | return NULL; | ||
| 74 | } | ||
| 75 | #endif | ||
| 67 | return dsa->meth->dsa_do_sign(dgst, dlen, dsa); | 76 | return dsa->meth->dsa_do_sign(dgst, dlen, dsa); |
| 68 | } | 77 | } |
| 69 | 78 | ||
| 70 | int DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig, | 79 | int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp) |
| 71 | unsigned int *siglen, DSA *dsa) | ||
| 72 | { | 80 | { |
| 73 | DSA_SIG *s; | 81 | #ifdef OPENSSL_FIPS |
| 74 | RAND_seed(dgst, dlen); | 82 | if (FIPS_mode() && !(dsa->meth->flags & DSA_FLAG_FIPS_METHOD) |
| 75 | s=DSA_do_sign(dgst,dlen,dsa); | 83 | && !(dsa->flags & DSA_FLAG_NON_FIPS_ALLOW)) |
| 76 | if (s == NULL) | ||
| 77 | { | 84 | { |
| 78 | *siglen=0; | 85 | DSAerr(DSA_F_DSA_SIGN_SETUP, DSA_R_NON_FIPS_DSA_METHOD); |
| 79 | return(0); | 86 | return 0; |
| 80 | } | 87 | } |
| 81 | *siglen=i2d_DSA_SIG(s,&sig); | 88 | #endif |
| 82 | DSA_SIG_free(s); | 89 | return dsa->meth->dsa_sign_setup(dsa, ctx_in, kinvp, rp); |
| 83 | return(1); | ||
| 84 | } | 90 | } |
| 85 | 91 | ||
| 86 | int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp) | 92 | DSA_SIG *DSA_SIG_new(void) |
| 87 | { | 93 | { |
| 88 | return dsa->meth->dsa_sign_setup(dsa, ctx_in, kinvp, rp); | 94 | DSA_SIG *sig; |
| 95 | sig = OPENSSL_malloc(sizeof(DSA_SIG)); | ||
| 96 | if (!sig) | ||
| 97 | return NULL; | ||
| 98 | sig->r = NULL; | ||
| 99 | sig->s = NULL; | ||
| 100 | return sig; | ||
| 101 | } | ||
| 102 | |||
| 103 | void DSA_SIG_free(DSA_SIG *sig) | ||
| 104 | { | ||
| 105 | if (sig) | ||
| 106 | { | ||
| 107 | if (sig->r) | ||
| 108 | BN_free(sig->r); | ||
| 109 | if (sig->s) | ||
| 110 | BN_free(sig->s); | ||
| 111 | OPENSSL_free(sig); | ||
| 112 | } | ||
| 89 | } | 113 | } |
| 90 | 114 | ||
diff --git a/src/lib/libcrypto/dsa/dsa_vrf.c b/src/lib/libcrypto/dsa/dsa_vrf.c index 226a75ff3f..674cb5fa5f 100644 --- a/src/lib/libcrypto/dsa/dsa_vrf.c +++ b/src/lib/libcrypto/dsa/dsa_vrf.c | |||
| @@ -64,26 +64,13 @@ | |||
| 64 | int DSA_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, | 64 | int DSA_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, |
| 65 | DSA *dsa) | 65 | DSA *dsa) |
| 66 | { | 66 | { |
| 67 | #ifdef OPENSSL_FIPS | ||
| 68 | if (FIPS_mode() && !(dsa->meth->flags & DSA_FLAG_FIPS_METHOD) | ||
| 69 | && !(dsa->flags & DSA_FLAG_NON_FIPS_ALLOW)) | ||
| 70 | { | ||
| 71 | DSAerr(DSA_F_DSA_DO_VERIFY, DSA_R_NON_FIPS_DSA_METHOD); | ||
| 72 | return -1; | ||
| 73 | } | ||
| 74 | #endif | ||
| 67 | return dsa->meth->dsa_do_verify(dgst, dgst_len, sig, dsa); | 75 | return dsa->meth->dsa_do_verify(dgst, dgst_len, sig, dsa); |
| 68 | } | 76 | } |
| 69 | |||
| 70 | /* data has already been hashed (probably with SHA or SHA-1). */ | ||
| 71 | /* returns | ||
| 72 | * 1: correct signature | ||
| 73 | * 0: incorrect signature | ||
| 74 | * -1: error | ||
| 75 | */ | ||
| 76 | int DSA_verify(int type, const unsigned char *dgst, int dgst_len, | ||
| 77 | const unsigned char *sigbuf, int siglen, DSA *dsa) | ||
| 78 | { | ||
| 79 | DSA_SIG *s; | ||
| 80 | int ret=-1; | ||
| 81 | |||
| 82 | s = DSA_SIG_new(); | ||
| 83 | if (s == NULL) return(ret); | ||
| 84 | if (d2i_DSA_SIG(&s,&sigbuf,siglen) == NULL) goto err; | ||
| 85 | ret=DSA_do_verify(dgst,dgst_len,s,dsa); | ||
| 86 | err: | ||
| 87 | DSA_SIG_free(s); | ||
| 88 | return(ret); | ||
| 89 | } | ||
