Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/dh/dh_key.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* | - | ||||||||||||
2 | * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. | - | ||||||||||||
3 | * | - | ||||||||||||
4 | * Licensed under the OpenSSL license (the "License"). You may not use | - | ||||||||||||
5 | * this file except in compliance with the License. You can obtain a copy | - | ||||||||||||
6 | * in the file LICENSE in the source distribution or at | - | ||||||||||||
7 | * https://www.openssl.org/source/license.html | - | ||||||||||||
8 | */ | - | ||||||||||||
9 | - | |||||||||||||
10 | #include <stdio.h> | - | ||||||||||||
11 | #include "internal/cryptlib.h" | - | ||||||||||||
12 | #include "dh_locl.h" | - | ||||||||||||
13 | #include "internal/bn_int.h" | - | ||||||||||||
14 | - | |||||||||||||
15 | static int generate_key(DH *dh); | - | ||||||||||||
16 | static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh); | - | ||||||||||||
17 | static int dh_bn_mod_exp(const DH *dh, BIGNUM *r, | - | ||||||||||||
18 | const BIGNUM *a, const BIGNUM *p, | - | ||||||||||||
19 | const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); | - | ||||||||||||
20 | static int dh_init(DH *dh); | - | ||||||||||||
21 | static int dh_finish(DH *dh); | - | ||||||||||||
22 | - | |||||||||||||
23 | int DH_generate_key(DH *dh) | - | ||||||||||||
24 | { | - | ||||||||||||
25 | return dh->meth->generate_key(dh); executed 232 times by 1 test: return dh->meth->generate_key(dh); Executed by:
| 232 | ||||||||||||
26 | } | - | ||||||||||||
27 | - | |||||||||||||
28 | int DH_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh) | - | ||||||||||||
29 | { | - | ||||||||||||
30 | return dh->meth->compute_key(key, pub_key, dh); executed 233 times by 1 test: return dh->meth->compute_key(key, pub_key, dh); Executed by:
| 233 | ||||||||||||
31 | } | - | ||||||||||||
32 | - | |||||||||||||
33 | int DH_compute_key_padded(unsigned char *key, const BIGNUM *pub_key, DH *dh) | - | ||||||||||||
34 | { | - | ||||||||||||
35 | int rv, pad; | - | ||||||||||||
36 | rv = dh->meth->compute_key(key, pub_key, dh); | - | ||||||||||||
37 | if (rv <= 0)
| 0-3 | ||||||||||||
38 | return rv; never executed: return rv; | 0 | ||||||||||||
39 | pad = BN_num_bytes(dh->p) - rv; | - | ||||||||||||
40 | if (pad > 0) {
| 1-2 | ||||||||||||
41 | memmove(key + pad, key, rv); | - | ||||||||||||
42 | memset(key, 0, pad); | - | ||||||||||||
43 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||
44 | return rv + pad; executed 3 times by 1 test: return rv + pad; Executed by:
| 3 | ||||||||||||
45 | } | - | ||||||||||||
46 | - | |||||||||||||
47 | static DH_METHOD dh_ossl = { | - | ||||||||||||
48 | "OpenSSL DH Method", | - | ||||||||||||
49 | generate_key, | - | ||||||||||||
50 | compute_key, | - | ||||||||||||
51 | dh_bn_mod_exp, | - | ||||||||||||
52 | dh_init, | - | ||||||||||||
53 | dh_finish, | - | ||||||||||||
54 | DH_FLAG_FIPS_METHOD, | - | ||||||||||||
55 | NULL, | - | ||||||||||||
56 | NULL | - | ||||||||||||
57 | }; | - | ||||||||||||
58 | - | |||||||||||||
59 | static const DH_METHOD *default_DH_method = &dh_ossl; | - | ||||||||||||
60 | - | |||||||||||||
61 | const DH_METHOD *DH_OpenSSL(void) | - | ||||||||||||
62 | { | - | ||||||||||||
63 | return &dh_ossl; never executed: return &dh_ossl; | 0 | ||||||||||||
64 | } | - | ||||||||||||
65 | - | |||||||||||||
66 | void DH_set_default_method(const DH_METHOD *meth) | - | ||||||||||||
67 | { | - | ||||||||||||
68 | default_DH_method = meth; | - | ||||||||||||
69 | } never executed: end of block | 0 | ||||||||||||
70 | - | |||||||||||||
71 | const DH_METHOD *DH_get_default_method(void) | - | ||||||||||||
72 | { | - | ||||||||||||
73 | return default_DH_method; executed 12258 times by 1 test: return default_DH_method; Executed by:
| 12258 | ||||||||||||
74 | } | - | ||||||||||||
75 | - | |||||||||||||
76 | static int generate_key(DH *dh) | - | ||||||||||||
77 | { | - | ||||||||||||
78 | int ok = 0; | - | ||||||||||||
79 | int generate_new_key = 0; | - | ||||||||||||
80 | unsigned l; | - | ||||||||||||
81 | BN_CTX *ctx = NULL; | - | ||||||||||||
82 | BN_MONT_CTX *mont = NULL; | - | ||||||||||||
83 | BIGNUM *pub_key = NULL, *priv_key = NULL; | - | ||||||||||||
84 | - | |||||||||||||
85 | if (BN_num_bits(dh->p) > OPENSSL_DH_MAX_MODULUS_BITS) {
| 0-232 | ||||||||||||
86 | DHerr(DH_F_GENERATE_KEY, DH_R_MODULUS_TOO_LARGE); | - | ||||||||||||
87 | return 0; never executed: return 0; | 0 | ||||||||||||
88 | } | - | ||||||||||||
89 | - | |||||||||||||
90 | ctx = BN_CTX_new(); | - | ||||||||||||
91 | if (ctx == NULL)
| 0-232 | ||||||||||||
92 | goto err; never executed: goto err; | 0 | ||||||||||||
93 | - | |||||||||||||
94 | if (dh->priv_key == NULL) {
| 12-220 | ||||||||||||
95 | priv_key = BN_secure_new(); | - | ||||||||||||
96 | if (priv_key == NULL)
| 0-220 | ||||||||||||
97 | goto err; never executed: goto err; | 0 | ||||||||||||
98 | generate_new_key = 1; | - | ||||||||||||
99 | } else executed 220 times by 1 test: end of block Executed by:
| 220 | ||||||||||||
100 | priv_key = dh->priv_key; executed 12 times by 1 test: priv_key = dh->priv_key; Executed by:
| 12 | ||||||||||||
101 | - | |||||||||||||
102 | if (dh->pub_key == NULL) {
| 0-232 | ||||||||||||
103 | pub_key = BN_new(); | - | ||||||||||||
104 | if (pub_key == NULL)
| 0-232 | ||||||||||||
105 | goto err; never executed: goto err; | 0 | ||||||||||||
106 | } else executed 232 times by 1 test: end of block Executed by:
| 232 | ||||||||||||
107 | pub_key = dh->pub_key; never executed: pub_key = dh->pub_key; | 0 | ||||||||||||
108 | - | |||||||||||||
109 | if (dh->flags & DH_FLAG_CACHE_MONT_P) {
| 0-232 | ||||||||||||
110 | mont = BN_MONT_CTX_set_locked(&dh->method_mont_p, | - | ||||||||||||
111 | dh->lock, dh->p, ctx); | - | ||||||||||||
112 | if (!mont)
| 0-232 | ||||||||||||
113 | goto err; never executed: goto err; | 0 | ||||||||||||
114 | } executed 232 times by 1 test: end of block Executed by:
| 232 | ||||||||||||
115 | - | |||||||||||||
116 | if (generate_new_key) {
| 12-220 | ||||||||||||
117 | if (dh->q) {
| 2-218 | ||||||||||||
118 | do { | - | ||||||||||||
119 | if (!BN_priv_rand_range(priv_key, dh->q))
| 0-2 | ||||||||||||
120 | goto err; never executed: goto err; | 0 | ||||||||||||
121 | } executed 2 times by 1 test: end of block Executed by:
| 2 | ||||||||||||
122 | while (BN_is_zero(priv_key) || BN_is_one(priv_key));
| 0-2 | ||||||||||||
123 | } else { executed 2 times by 1 test: end of block Executed by:
| 2 | ||||||||||||
124 | /* secret exponent length */ | - | ||||||||||||
125 | l = dh->length ? dh->length : BN_num_bits(dh->p) - 1;
| 11-207 | ||||||||||||
126 | if (!BN_priv_rand(priv_key, l, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY))
| 0-218 | ||||||||||||
127 | goto err; never executed: goto err; | 0 | ||||||||||||
128 | } executed 218 times by 1 test: end of block Executed by:
| 218 | ||||||||||||
129 | } | - | ||||||||||||
130 | - | |||||||||||||
131 | { | - | ||||||||||||
132 | BIGNUM *prk = BN_new(); | - | ||||||||||||
133 | - | |||||||||||||
134 | if (prk == NULL)
| 0-232 | ||||||||||||
135 | goto err; never executed: goto err; | 0 | ||||||||||||
136 | BN_with_flags(prk, priv_key, BN_FLG_CONSTTIME); | - | ||||||||||||
137 | - | |||||||||||||
138 | if (!dh->meth->bn_mod_exp(dh, pub_key, dh->g, prk, dh->p, ctx, mont)) {
| 0-232 | ||||||||||||
139 | BN_free(prk); | - | ||||||||||||
140 | goto err; never executed: goto err; | 0 | ||||||||||||
141 | } | - | ||||||||||||
142 | /* We MUST free prk before any further use of priv_key */ | - | ||||||||||||
143 | BN_free(prk); | - | ||||||||||||
144 | } | - | ||||||||||||
145 | - | |||||||||||||
146 | dh->pub_key = pub_key; | - | ||||||||||||
147 | dh->priv_key = priv_key; | - | ||||||||||||
148 | ok = 1; | - | ||||||||||||
149 | err: code before this statement executed 232 times by 1 test: err: Executed by:
| 232 | ||||||||||||
150 | if (ok != 1)
| 0-232 | ||||||||||||
151 | DHerr(DH_F_GENERATE_KEY, ERR_R_BN_LIB); never executed: ERR_put_error(5,(103),(3),__FILE__,151); | 0 | ||||||||||||
152 | - | |||||||||||||
153 | if (pub_key != dh->pub_key)
| 0-232 | ||||||||||||
154 | BN_free(pub_key); never executed: BN_free(pub_key); | 0 | ||||||||||||
155 | if (priv_key != dh->priv_key)
| 0-232 | ||||||||||||
156 | BN_free(priv_key); never executed: BN_free(priv_key); | 0 | ||||||||||||
157 | BN_CTX_free(ctx); | - | ||||||||||||
158 | return ok; executed 232 times by 1 test: return ok; Executed by:
| 232 | ||||||||||||
159 | } | - | ||||||||||||
160 | - | |||||||||||||
161 | static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh) | - | ||||||||||||
162 | { | - | ||||||||||||
163 | BN_CTX *ctx = NULL; | - | ||||||||||||
164 | BN_MONT_CTX *mont = NULL; | - | ||||||||||||
165 | BIGNUM *tmp; | - | ||||||||||||
166 | int ret = -1; | - | ||||||||||||
167 | int check_result; | - | ||||||||||||
168 | - | |||||||||||||
169 | if (BN_num_bits(dh->p) > OPENSSL_DH_MAX_MODULUS_BITS) {
| 0-236 | ||||||||||||
170 | DHerr(DH_F_COMPUTE_KEY, DH_R_MODULUS_TOO_LARGE); | - | ||||||||||||
171 | goto err; never executed: goto err; | 0 | ||||||||||||
172 | } | - | ||||||||||||
173 | - | |||||||||||||
174 | ctx = BN_CTX_new(); | - | ||||||||||||
175 | if (ctx == NULL)
| 0-236 | ||||||||||||
176 | goto err; never executed: goto err; | 0 | ||||||||||||
177 | BN_CTX_start(ctx); | - | ||||||||||||
178 | tmp = BN_CTX_get(ctx); | - | ||||||||||||
179 | if (tmp == NULL)
| 0-236 | ||||||||||||
180 | goto err; never executed: goto err; | 0 | ||||||||||||
181 | - | |||||||||||||
182 | if (dh->priv_key == NULL) {
| 0-236 | ||||||||||||
183 | DHerr(DH_F_COMPUTE_KEY, DH_R_NO_PRIVATE_VALUE); | - | ||||||||||||
184 | goto err; never executed: goto err; | 0 | ||||||||||||
185 | } | - | ||||||||||||
186 | - | |||||||||||||
187 | if (dh->flags & DH_FLAG_CACHE_MONT_P) {
| 0-236 | ||||||||||||
188 | mont = BN_MONT_CTX_set_locked(&dh->method_mont_p, | - | ||||||||||||
189 | dh->lock, dh->p, ctx); | - | ||||||||||||
190 | BN_set_flags(dh->priv_key, BN_FLG_CONSTTIME); | - | ||||||||||||
191 | if (!mont)
| 0-236 | ||||||||||||
192 | goto err; never executed: goto err; | 0 | ||||||||||||
193 | } executed 236 times by 1 test: end of block Executed by:
| 236 | ||||||||||||
194 | - | |||||||||||||
195 | if (!DH_check_pub_key(dh, pub_key, &check_result) || check_result) {
| 0-236 | ||||||||||||
196 | DHerr(DH_F_COMPUTE_KEY, DH_R_INVALID_PUBKEY); | - | ||||||||||||
197 | goto err; executed 16 times by 1 test: goto err; Executed by:
| 16 | ||||||||||||
198 | } | - | ||||||||||||
199 | - | |||||||||||||
200 | if (!dh->
| 0-220 | ||||||||||||
201 | meth->bn_mod_exp(dh, tmp, pub_key, dh->priv_key, dh->p, ctx, mont)) {
| 0-220 | ||||||||||||
202 | DHerr(DH_F_COMPUTE_KEY, ERR_R_BN_LIB); | - | ||||||||||||
203 | goto err; never executed: goto err; | 0 | ||||||||||||
204 | } | - | ||||||||||||
205 | - | |||||||||||||
206 | ret = BN_bn2bin(tmp, key); | - | ||||||||||||
207 | err: code before this statement executed 220 times by 1 test: err: Executed by:
| 220 | ||||||||||||
208 | if (ctx != NULL) {
| 0-236 | ||||||||||||
209 | BN_CTX_end(ctx); | - | ||||||||||||
210 | BN_CTX_free(ctx); | - | ||||||||||||
211 | } executed 236 times by 1 test: end of block Executed by:
| 236 | ||||||||||||
212 | return ret; executed 236 times by 1 test: return ret; Executed by:
| 236 | ||||||||||||
213 | } | - | ||||||||||||
214 | - | |||||||||||||
215 | static int dh_bn_mod_exp(const DH *dh, BIGNUM *r, | - | ||||||||||||
216 | const BIGNUM *a, const BIGNUM *p, | - | ||||||||||||
217 | const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx) | - | ||||||||||||
218 | { | - | ||||||||||||
219 | return BN_mod_exp_mont(r, a, p, m, ctx, m_ctx); executed 452 times by 1 test: return BN_mod_exp_mont(r, a, p, m, ctx, m_ctx); Executed by:
| 452 | ||||||||||||
220 | } | - | ||||||||||||
221 | - | |||||||||||||
222 | static int dh_init(DH *dh) | - | ||||||||||||
223 | { | - | ||||||||||||
224 | dh->flags |= DH_FLAG_CACHE_MONT_P; | - | ||||||||||||
225 | return 1; executed 12258 times by 1 test: return 1; Executed by:
| 12258 | ||||||||||||
226 | } | - | ||||||||||||
227 | - | |||||||||||||
228 | static int dh_finish(DH *dh) | - | ||||||||||||
229 | { | - | ||||||||||||
230 | BN_MONT_CTX_free(dh->method_mont_p); | - | ||||||||||||
231 | return 1; executed 12258 times by 1 test: return 1; Executed by:
| 12258 | ||||||||||||
232 | } | - | ||||||||||||
Source code | Switch to Preprocessed file |