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 | { |