diff options
Diffstat (limited to 'src/lib/libcrypto/dsa/dsa_lib.c')
| -rw-r--r-- | src/lib/libcrypto/dsa/dsa_lib.c | 68 |
1 files changed, 65 insertions, 3 deletions
diff --git a/src/lib/libcrypto/dsa/dsa_lib.c b/src/lib/libcrypto/dsa/dsa_lib.c index ce8e204f7e..224e412afc 100644 --- a/src/lib/libcrypto/dsa/dsa_lib.c +++ b/src/lib/libcrypto/dsa/dsa_lib.c | |||
| @@ -66,7 +66,38 @@ | |||
| 66 | 66 | ||
| 67 | const char *DSA_version="DSA" OPENSSL_VERSION_PTEXT; | 67 | const char *DSA_version="DSA" OPENSSL_VERSION_PTEXT; |
| 68 | 68 | ||
| 69 | static DSA_METHOD *default_DSA_method; | ||
| 70 | static int dsa_meth_num = 0; | ||
| 71 | static STACK_OF(CRYPTO_EX_DATA_FUNCS) *dsa_meth = NULL; | ||
| 72 | |||
| 73 | void DSA_set_default_method(DSA_METHOD *meth) | ||
| 74 | { | ||
| 75 | default_DSA_method = meth; | ||
| 76 | } | ||
| 77 | |||
| 78 | DSA_METHOD *DSA_get_default_method(void) | ||
| 79 | { | ||
| 80 | if(!default_DSA_method) default_DSA_method = DSA_OpenSSL(); | ||
| 81 | return default_DSA_method; | ||
| 82 | } | ||
| 83 | |||
| 69 | DSA *DSA_new(void) | 84 | DSA *DSA_new(void) |
| 85 | { | ||
| 86 | return DSA_new_method(NULL); | ||
| 87 | } | ||
| 88 | |||
| 89 | DSA_METHOD *DSA_set_method(DSA *dsa, DSA_METHOD *meth) | ||
| 90 | { | ||
| 91 | DSA_METHOD *mtmp; | ||
| 92 | mtmp = dsa->meth; | ||
| 93 | if (mtmp->finish) mtmp->finish(dsa); | ||
| 94 | dsa->meth = meth; | ||
| 95 | if (meth->init) meth->init(dsa); | ||
| 96 | return mtmp; | ||
| 97 | } | ||
| 98 | |||
| 99 | |||
| 100 | DSA *DSA_new_method(DSA_METHOD *meth) | ||
| 70 | { | 101 | { |
| 71 | DSA *ret; | 102 | DSA *ret; |
| 72 | 103 | ||
| @@ -76,13 +107,15 @@ DSA *DSA_new(void) | |||
| 76 | DSAerr(DSA_F_DSA_NEW,ERR_R_MALLOC_FAILURE); | 107 | DSAerr(DSA_F_DSA_NEW,ERR_R_MALLOC_FAILURE); |
| 77 | return(NULL); | 108 | return(NULL); |
| 78 | } | 109 | } |
| 110 | if(!default_DSA_method) default_DSA_method = DSA_OpenSSL(); | ||
| 111 | if(meth) ret->meth = meth; | ||
| 112 | else ret->meth = default_DSA_method; | ||
| 79 | ret->pad=0; | 113 | ret->pad=0; |
| 80 | ret->version=0; | 114 | ret->version=0; |
| 81 | ret->write_params=1; | 115 | ret->write_params=1; |
| 82 | ret->p=NULL; | 116 | ret->p=NULL; |
| 83 | ret->q=NULL; | 117 | ret->q=NULL; |
| 84 | ret->g=NULL; | 118 | ret->g=NULL; |
| 85 | ret->flags=DSA_FLAG_CACHE_MONT_P; | ||
| 86 | 119 | ||
| 87 | ret->pub_key=NULL; | 120 | ret->pub_key=NULL; |
| 88 | ret->priv_key=NULL; | 121 | ret->priv_key=NULL; |
| @@ -92,6 +125,15 @@ DSA *DSA_new(void) | |||
| 92 | ret->method_mont_p=NULL; | 125 | ret->method_mont_p=NULL; |
| 93 | 126 | ||
| 94 | ret->references=1; | 127 | ret->references=1; |
| 128 | ret->flags=ret->meth->flags; | ||
| 129 | if ((ret->meth->init != NULL) && !ret->meth->init(ret)) | ||
| 130 | { | ||
| 131 | Free(ret); | ||
| 132 | ret=NULL; | ||
| 133 | } | ||
| 134 | else | ||
| 135 | CRYPTO_new_ex_data(dsa_meth,ret,&ret->ex_data); | ||
| 136 | |||
| 95 | return(ret); | 137 | return(ret); |
| 96 | } | 138 | } |
| 97 | 139 | ||
| @@ -114,6 +156,10 @@ void DSA_free(DSA *r) | |||
| 114 | } | 156 | } |
| 115 | #endif | 157 | #endif |
| 116 | 158 | ||
| 159 | CRYPTO_free_ex_data(dsa_meth, r, &r->ex_data); | ||
| 160 | |||
| 161 | if(r->meth->finish) r->meth->finish(r); | ||
| 162 | |||
| 117 | if (r->p != NULL) BN_clear_free(r->p); | 163 | if (r->p != NULL) BN_clear_free(r->p); |
| 118 | if (r->q != NULL) BN_clear_free(r->q); | 164 | if (r->q != NULL) BN_clear_free(r->q); |
| 119 | if (r->g != NULL) BN_clear_free(r->g); | 165 | if (r->g != NULL) BN_clear_free(r->g); |
| @@ -121,8 +167,6 @@ void DSA_free(DSA *r) | |||
| 121 | if (r->priv_key != NULL) BN_clear_free(r->priv_key); | 167 | if (r->priv_key != NULL) BN_clear_free(r->priv_key); |
| 122 | if (r->kinv != NULL) BN_clear_free(r->kinv); | 168 | if (r->kinv != NULL) BN_clear_free(r->kinv); |
| 123 | if (r->r != NULL) BN_clear_free(r->r); | 169 | if (r->r != NULL) BN_clear_free(r->r); |
| 124 | if (r->method_mont_p != NULL) | ||
| 125 | BN_MONT_CTX_free((BN_MONT_CTX *)r->method_mont_p); | ||
| 126 | Free(r); | 170 | Free(r); |
| 127 | } | 171 | } |
| 128 | 172 | ||
| @@ -145,6 +189,24 @@ int DSA_size(DSA *r) | |||
| 145 | return(ret); | 189 | return(ret); |
| 146 | } | 190 | } |
| 147 | 191 | ||
| 192 | int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | ||
| 193 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | ||
| 194 | { | ||
| 195 | dsa_meth_num++; | ||
| 196 | return(CRYPTO_get_ex_new_index(dsa_meth_num-1, | ||
| 197 | &dsa_meth,argl,argp,new_func,dup_func,free_func)); | ||
| 198 | } | ||
| 199 | |||
| 200 | int DSA_set_ex_data(DSA *d, int idx, void *arg) | ||
| 201 | { | ||
| 202 | return(CRYPTO_set_ex_data(&d->ex_data,idx,arg)); | ||
| 203 | } | ||
| 204 | |||
| 205 | void *DSA_get_ex_data(DSA *d, int idx) | ||
| 206 | { | ||
| 207 | return(CRYPTO_get_ex_data(&d->ex_data,idx)); | ||
| 208 | } | ||
| 209 | |||
| 148 | #ifndef NO_DH | 210 | #ifndef NO_DH |
| 149 | DH *DSA_dup_DH(DSA *r) | 211 | DH *DSA_dup_DH(DSA *r) |
| 150 | { | 212 | { |
