Line | Source | Count |
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | | - |
11 | | - |
12 | | - |
13 | | - |
14 | | - |
15 | | - |
16 | | - |
17 | | - |
18 | | - |
19 | | - |
20 | | - |
21 | | - |
22 | | - |
23 | | - |
24 | | - |
25 | | - |
26 | | - |
27 | | - |
28 | | - |
29 | | - |
30 | | - |
31 | | - |
32 | | - |
33 | | - |
34 | | - |
35 | | - |
36 | | - |
37 | | - |
38 | | - |
39 | | - |
40 | | - |
41 | | - |
42 | | - |
43 | | - |
44 | | - |
45 | | - |
46 | | - |
47 | | - |
48 | | - |
49 | | - |
50 | | - |
51 | | - |
52 | | - |
53 | | - |
54 | | - |
55 | | - |
56 | | - |
57 | | - |
58 | | - |
59 | #include <limits.h> | - |
60 | #include <stdio.h> | - |
61 | #include <string.h> | - |
62 | | - |
63 | #include <openssl/asn1t.h> | - |
64 | #include <openssl/bn.h> | - |
65 | #include <openssl/dh.h> | - |
66 | #include <openssl/err.h> | - |
67 | #include <openssl/evp.h> | - |
68 | #include <openssl/x509.h> | - |
69 | | - |
70 | #include "evp_locl.h" | - |
71 | | - |
72 | | - |
73 | | - |
74 | typedef struct { | - |
75 | | - |
76 | int prime_len; | - |
77 | int generator; | - |
78 | int use_dsa; | - |
79 | | - |
80 | int gentmp[2]; | - |
81 | | - |
82 | } DH_PKEY_CTX; | - |
83 | | - |
84 | static int | - |
85 | pkey_dh_init(EVP_PKEY_CTX *ctx) | - |
86 | { | - |
87 | DH_PKEY_CTX *dctx; | - |
88 | | - |
89 | dctx = malloc(sizeof(DH_PKEY_CTX)); | - |
90 | if (!dctx)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
91 | return 0; never executed: return 0; | 0 |
92 | dctx->prime_len = 1024; | - |
93 | dctx->generator = 2; | - |
94 | dctx->use_dsa = 0; | - |
95 | | - |
96 | ctx->data = dctx; | - |
97 | ctx->keygen_info = dctx->gentmp; | - |
98 | ctx->keygen_info_count = 2; | - |
99 | | - |
100 | return 1; never executed: return 1; | 0 |
101 | } | - |
102 | | - |
103 | static int | - |
104 | pkey_dh_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) | - |
105 | { | - |
106 | DH_PKEY_CTX *dctx, *sctx; | - |
107 | | - |
108 | if (!pkey_dh_init(dst))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
109 | return 0; never executed: return 0; | 0 |
110 | sctx = src->data; | - |
111 | dctx = dst->data; | - |
112 | dctx->prime_len = sctx->prime_len; | - |
113 | dctx->generator = sctx->generator; | - |
114 | dctx->use_dsa = sctx->use_dsa; | - |
115 | return 1; never executed: return 1; | 0 |
116 | } | - |
117 | | - |
118 | static void | - |
119 | pkey_dh_cleanup(EVP_PKEY_CTX *ctx) | - |
120 | { | - |
121 | DH_PKEY_CTX *dctx = ctx->data; | - |
122 | | - |
123 | free(dctx); | - |
124 | } never executed: end of block | 0 |
125 | | - |
126 | static int | - |
127 | pkey_dh_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) | - |
128 | { | - |
129 | DH_PKEY_CTX *dctx = ctx->data; | - |
130 | | - |
131 | switch (type) { | - |
132 | case EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN: never executed: case (0x1000 + 1): | 0 |
133 | if (p1 < 256)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
134 | return -2; never executed: return -2; | 0 |
135 | dctx->prime_len = p1; | - |
136 | return 1; never executed: return 1; | 0 |
137 | | - |
138 | case EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR: never executed: case (0x1000 + 2): | 0 |
139 | dctx->generator = p1; | - |
140 | return 1; never executed: return 1; | 0 |
141 | | - |
142 | case EVP_PKEY_CTRL_PEER_KEY: never executed: case 2: | 0 |
143 | | - |
144 | return 1; never executed: return 1; | 0 |
145 | | - |
146 | default: never executed: default: | 0 |
147 | return -2; never executed: return -2; | 0 |
148 | } | - |
149 | } | - |
150 | | - |
151 | static int | - |
152 | pkey_dh_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, const char *value) | - |
153 | { | - |
154 | long lval; | - |
155 | char *ep; | - |
156 | int len; | - |
157 | | - |
158 | if (!strcmp(type, "dh_paramgen_prime_len")) { never executed: __result = (((const unsigned char *) (const char *) ( type ))[3] - __s2[3]); never executed: end of block never executed: end of block never executed: __result = (((const unsigned char *) (const char *) ( "dh_paramgen_prime_len" ))[3] - __s2[3]); never executed: end of block never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
159 | errno = 0; | - |
160 | lval = strtol(value, &ep, 10); | - |
161 | if (value[0] == '\0' || *ep != '\0')TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
162 | goto not_a_number; never executed: goto not_a_number; | 0 |
163 | if ((errno == ERANGE &&TRUE | never evaluated | FALSE | never evaluated |
| 0 |
164 | (lval == LONG_MAX || lval == LONG_MIN)) ||TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
165 | (lval > INT_MAX || lval < INT_MIN))TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
166 | goto out_of_range; never executed: goto out_of_range; | 0 |
167 | len = lval; | - |
168 | return EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len); never executed: return EVP_PKEY_CTX_ctrl(ctx, 28, (1<<1), (0x1000 + 1), len, ((void *)0) ); | 0 |
169 | } else if (!strcmp(type, "dh_paramgen_generator")) { never executed: __result = (((const unsigned char *) (const char *) ( type ))[3] - __s2[3]); never executed: end of block never executed: end of block never executed: __result = (((const unsigned char *) (const char *) ( "dh_paramgen_generator" ))[3] - __s2[3]); never executed: end of block never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
170 | errno = 0; | - |
171 | lval = strtol(value, &ep, 10); | - |
172 | if (value[0] == '\0' || *ep != '\0')TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
173 | goto not_a_number; never executed: goto not_a_number; | 0 |
174 | if ((errno == ERANGE &&TRUE | never evaluated | FALSE | never evaluated |
| 0 |
175 | (lval == LONG_MAX || lval == LONG_MIN)) ||TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
176 | (lval > INT_MAX || lval < INT_MIN))TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
177 | goto out_of_range; never executed: goto out_of_range; | 0 |
178 | len = lval; | - |
179 | return EVP_PKEY_CTX_set_dh_paramgen_generator(ctx, len); never executed: return EVP_PKEY_CTX_ctrl(ctx, 28, (1<<1), (0x1000 + 2), len, ((void *)0) ); | 0 |
180 | } | - |
181 | | - |
182 | not_a_number: code before this statement never executed: not_a_number: | 0 |
183 | out_of_range: | - |
184 | return -2; never executed: return -2; | 0 |
185 | } | - |
186 | | - |
187 | static int | - |
188 | pkey_dh_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) | - |
189 | { | - |
190 | DH *dh = NULL; | - |
191 | DH_PKEY_CTX *dctx = ctx->data; | - |
192 | BN_GENCB *pcb, cb; | - |
193 | int ret; | - |
194 | | - |
195 | if (ctx->pkey_gencb) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
196 | pcb = &cb; | - |
197 | evp_pkey_set_cb_translate(pcb, ctx); | - |
198 | } else never executed: end of block | 0 |
199 | pcb = NULL; never executed: pcb = ((void *)0) ; | 0 |
200 | dh = DH_new(); | - |
201 | if (!dh)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
202 | return 0; never executed: return 0; | 0 |
203 | ret = DH_generate_parameters_ex(dh, dctx->prime_len, dctx->generator, | - |
204 | pcb); | - |
205 | if (ret)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
206 | EVP_PKEY_assign_DH(pkey, dh); never executed: EVP_PKEY_assign((pkey),28, (char *)(dh)); | 0 |
207 | else | - |
208 | DH_free(dh); never executed: DH_free(dh); | 0 |
209 | return ret; never executed: return ret; | 0 |
210 | } | - |
211 | | - |
212 | static int | - |
213 | pkey_dh_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) | - |
214 | { | - |
215 | DH *dh = NULL; | - |
216 | | - |
217 | if (ctx->pkey == NULL) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
218 | DHerror(DH_R_NO_PARAMETERS_SET); | - |
219 | return 0; never executed: return 0; | 0 |
220 | } | - |
221 | dh = DH_new(); | - |
222 | if (!dh)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
223 | return 0; never executed: return 0; | 0 |
224 | EVP_PKEY_assign_DH(pkey, dh); | - |
225 | | - |
226 | if (!EVP_PKEY_copy_parameters(pkey, ctx->pkey))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
227 | return 0; never executed: return 0; | 0 |
228 | return DH_generate_key(pkey->pkey.dh); never executed: return DH_generate_key(pkey->pkey.dh); | 0 |
229 | } | - |
230 | | - |
231 | static int | - |
232 | pkey_dh_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen) | - |
233 | { | - |
234 | int ret; | - |
235 | | - |
236 | if (!ctx->pkey || !ctx->peerkey) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
237 | DHerror(DH_R_KEYS_NOT_SET); | - |
238 | return 0; never executed: return 0; | 0 |
239 | } | - |
240 | ret = DH_compute_key(key, ctx->peerkey->pkey.dh->pub_key, | - |
241 | ctx->pkey->pkey.dh); | - |
242 | if (ret < 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
243 | return ret; never executed: return ret; | 0 |
244 | *keylen = ret; | - |
245 | return 1; never executed: return 1; | 0 |
246 | } | - |
247 | | - |
248 | const EVP_PKEY_METHOD dh_pkey_meth = { | - |
249 | .pkey_id = EVP_PKEY_DH, | - |
250 | .flags = EVP_PKEY_FLAG_AUTOARGLEN, | - |
251 | | - |
252 | .init = pkey_dh_init, | - |
253 | .copy = pkey_dh_copy, | - |
254 | .cleanup = pkey_dh_cleanup, | - |
255 | | - |
256 | .paramgen = pkey_dh_paramgen, | - |
257 | | - |
258 | .keygen = pkey_dh_keygen, | - |
259 | | - |
260 | .derive = pkey_dh_derive, | - |
261 | | - |
262 | .ctrl = pkey_dh_ctrl, | - |
263 | .ctrl_str = pkey_dh_ctrl_str | - |
264 | }; | - |
| | |