test/dhtest.c: fix resource leak
Reported by Coverity Scan (CID 1439136)
[extended tests]
Reviewed-by: Nicola Tuveri <nic.tuv@gmail.com>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/7155)
Dr. Matthias St. Pierre authored 5 years ago
Matt Caswell committed 5 years ago
25 | 25 | |
26 | 26 | static int dh_test(void) |
27 | 27 | { |
28 | DH *dh; | |
29 | BIGNUM *p, *q, *g; | |
28 | DH *dh = NULL; | |
29 | BIGNUM *p = NULL, *q = NULL, *g = NULL; | |
30 | 30 | const BIGNUM *p2, *q2, *g2; |
31 | BIGNUM *priv_key; | |
31 | BIGNUM *priv_key = NULL; | |
32 | 32 | const BIGNUM *pub_key2, *priv_key2; |
33 | 33 | BN_GENCB *_cb = NULL; |
34 | 34 | DH *a = NULL; |
48 | 48 | || !TEST_ptr(q = BN_new()) |
49 | 49 | || !TEST_ptr(g = BN_new()) |
50 | 50 | || !TEST_ptr(priv_key = BN_new())) |
51 | goto err; | |
51 | goto err1; | |
52 | 52 | |
53 | 53 | /* |
54 | 54 | * I) basic tests |
59 | 59 | || !TEST_true(BN_set_word(q, 2039L)) |
60 | 60 | || !TEST_true(BN_set_word(g, 3L)) |
61 | 61 | || !TEST_true(DH_set0_pqg(dh, p, q, g))) |
62 | goto err; | |
62 | goto err1; | |
63 | 63 | |
64 | 64 | /* test the combined getter for p, q, and g */ |
65 | 65 | DH_get0_pqg(dh, &p2, &q2, &g2); |
66 | 66 | if (!TEST_ptr_eq(p2, p) |
67 | 67 | || !TEST_ptr_eq(q2, q) |
68 | 68 | || !TEST_ptr_eq(g2, g)) |
69 | goto err; | |
69 | goto err2; | |
70 | 70 | |
71 | 71 | /* test the simple getters for p, q, and g */ |
72 | 72 | if (!TEST_ptr_eq(DH_get0_p(dh), p2) |
73 | 73 | || !TEST_ptr_eq(DH_get0_q(dh), q2) |
74 | 74 | || !TEST_ptr_eq(DH_get0_g(dh), g2)) |
75 | goto err; | |
75 | goto err2; | |
76 | 76 | |
77 | 77 | /* set the private key only*/ |
78 | 78 | if (!TEST_true(BN_set_word(priv_key, 1234L)) |
79 | 79 | || !TEST_true(DH_set0_key(dh, NULL, priv_key))) |
80 | goto err; | |
80 | goto err2; | |
81 | 81 | |
82 | 82 | /* test the combined getter for pub_key and priv_key */ |
83 | 83 | DH_get0_key(dh, &pub_key2, &priv_key2); |
84 | 84 | if (!TEST_ptr_eq(pub_key2, NULL) |
85 | 85 | || !TEST_ptr_eq(priv_key2, priv_key)) |
86 | goto err; | |
86 | goto err3; | |
87 | 87 | |
88 | 88 | /* test the simple getters for pub_key and priv_key */ |
89 | 89 | if (!TEST_ptr_eq(DH_get0_pub_key(dh), pub_key2) |
90 | 90 | || !TEST_ptr_eq(DH_get0_priv_key(dh), priv_key2)) |
91 | goto err; | |
91 | goto err3; | |
92 | 92 | |
93 | 93 | /* now generate a key pair ... */ |
94 | 94 | if (!DH_generate_key(dh)) |
95 | goto err; | |
95 | goto err3; | |
96 | 96 | |
97 | 97 | /* ... and check whether the private key was reused: */ |
98 | 98 | |
100 | 100 | DH_get0_key(dh, &pub_key2, &priv_key2); |
101 | 101 | if (!TEST_ptr(pub_key2) |
102 | 102 | || !TEST_ptr_eq(priv_key2, priv_key)) |
103 | goto err; | |
103 | goto err3; | |
104 | 104 | |
105 | 105 | /* test it the simple getters for pub_key and priv_key */ |
106 | 106 | if (!TEST_ptr_eq(DH_get0_pub_key(dh), pub_key2) |
107 | 107 | || !TEST_ptr_eq(DH_get0_priv_key(dh), priv_key2)) |
108 | goto err; | |
109 | ||
110 | /* check whether the public key was calculated correclty */ | |
108 | goto err3; | |
109 | ||
110 | /* check whether the public key was calculated correctly */ | |
111 | 111 | TEST_uint_eq(BN_get_word(pub_key2), 3331L); |
112 | 112 | |
113 | 113 | /* |
116 | 116 | |
117 | 117 | /* generate a DH group ... */ |
118 | 118 | if (!TEST_ptr(_cb = BN_GENCB_new())) |
119 | goto err; | |
119 | goto err3; | |
120 | 120 | BN_GENCB_set(_cb, &cb, NULL); |
121 | 121 | if (!TEST_ptr(a = DH_new()) |
122 | 122 | || !TEST_true(DH_generate_parameters_ex(a, 64, |
123 | 123 | DH_GENERATOR_5, _cb))) |
124 | goto err; | |
124 | goto err3; | |
125 | 125 | |
126 | 126 | /* ... and check whether it is valid */ |
127 | 127 | if (!DH_check(a, &i)) |
128 | goto err; | |
128 | goto err3; | |
129 | 129 | if (!TEST_false(i & DH_CHECK_P_NOT_PRIME) |
130 | 130 | || !TEST_false(i & DH_CHECK_P_NOT_SAFE_PRIME) |
131 | 131 | || !TEST_false(i & DH_UNABLE_TO_CHECK_GENERATOR) |
132 | 132 | || !TEST_false(i & DH_NOT_SUITABLE_GENERATOR)) |
133 | goto err; | |
133 | goto err3; | |
134 | 134 | |
135 | 135 | DH_get0_pqg(a, &ap, NULL, &ag); |
136 | 136 | |
137 | 137 | /* now create another copy of the DH group for the peer */ |
138 | 138 | if (!TEST_ptr(b = DH_new())) |
139 | goto err; | |
139 | goto err3; | |
140 | 140 | |
141 | 141 | if (!TEST_ptr(bp = BN_dup(ap)) |
142 | 142 | || !TEST_ptr(bg = BN_dup(ag)) |
143 | 143 | || !TEST_true(DH_set0_pqg(b, bp, NULL, bg))) |
144 | goto err; | |
144 | goto err3; | |
145 | 145 | bp = bg = NULL; |
146 | 146 | |
147 | 147 | /* |
149 | 149 | */ |
150 | 150 | |
151 | 151 | if (!DH_generate_key(a)) |
152 | goto err; | |
152 | goto err3; | |
153 | 153 | DH_get0_key(a, &apub_key, NULL); |
154 | 154 | |
155 | 155 | if (!DH_generate_key(b)) |
156 | goto err; | |
156 | goto err3; | |
157 | 157 | DH_get0_key(b, &bpub_key, &bpriv_key); |
158 | 158 | |
159 | 159 | /* Also test with a private-key-only copy of |b|. */ |
160 | 160 | if (!TEST_ptr(c = DHparams_dup(b)) |
161 | 161 | || !TEST_ptr(cpriv_key = BN_dup(bpriv_key)) |
162 | 162 | || !TEST_true(DH_set0_key(c, NULL, cpriv_key))) |
163 | goto err; | |
163 | goto err3; | |
164 | 164 | cpriv_key = NULL; |
165 | 165 | |
166 | 166 | alen = DH_size(a); |
167 | 167 | if (!TEST_ptr(abuf = OPENSSL_malloc(alen)) |
168 | 168 | || !TEST_true((aout = DH_compute_key(abuf, bpub_key, a)) != -1)) |
169 | goto err; | |
169 | goto err3; | |
170 | 170 | |
171 | 171 | blen = DH_size(b); |
172 | 172 | if (!TEST_ptr(bbuf = OPENSSL_malloc(blen)) |
173 | 173 | || !TEST_true((bout = DH_compute_key(bbuf, apub_key, b)) != -1)) |
174 | goto err; | |
174 | goto err3; | |
175 | 175 | |
176 | 176 | clen = DH_size(c); |
177 | 177 | if (!TEST_ptr(cbuf = OPENSSL_malloc(clen)) |
178 | 178 | || !TEST_true((cout = DH_compute_key(cbuf, apub_key, c)) != -1)) |
179 | goto err; | |
179 | goto err3; | |
180 | 180 | |
181 | 181 | if (!TEST_true(aout >= 4) |
182 | 182 | || !TEST_mem_eq(abuf, aout, bbuf, bout) |
183 | 183 | || !TEST_mem_eq(abuf, aout, cbuf, cout)) |
184 | goto err; | |
184 | goto err3; | |
185 | 185 | |
186 | 186 | ret = 1; |
187 | ||
188 | err: | |
187 | goto success; | |
188 | ||
189 | err1: | |
190 | /* an error occurred before p,q,g were assigned to dh */ | |
191 | BN_free(p); | |
192 | BN_free(q); | |
193 | BN_free(g); | |
194 | err2: | |
195 | /* an error occured before priv_key was assigned to dh */ | |
196 | BN_free(priv_key); | |
197 | err3: | |
198 | success: | |
189 | 199 | OPENSSL_free(abuf); |
190 | 200 | OPENSSL_free(bbuf); |
191 | 201 | OPENSSL_free(cbuf); |