summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2023-08-10 09:36:37 +0000
committertb <>2023-08-10 09:36:37 +0000
commit0c08015642e4fb2a5ce32565ab942ffc9579d487 (patch)
tree645163b671a71474f8e6f2df15ee1b735dce1d07 /src
parent6fffbab1235c36f552a36cd026ebffdfdc63bd59 (diff)
downloadopenbsd-0c08015642e4fb2a5ce32565ab942ffc9579d487.tar.gz
openbsd-0c08015642e4fb2a5ce32565ab942ffc9579d487.tar.bz2
openbsd-0c08015642e4fb2a5ce32565ab942ffc9579d487.zip
rsa_priv_encode: plug leak on PKCS8_pkey_set0() failure
Change the code to use safer idioms and avoid nested function calls. ok jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/rsa/rsa_ameth.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_ameth.c b/src/lib/libcrypto/rsa/rsa_ameth.c
index 825a9f4447..737bba7366 100644
--- a/src/lib/libcrypto/rsa/rsa_ameth.c
+++ b/src/lib/libcrypto/rsa/rsa_ameth.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: rsa_ameth.c,v 1.30 2023/07/07 06:59:18 tb Exp $ */ 1/* $OpenBSD: rsa_ameth.c,v 1.31 2023/08/10 09:36:37 tb Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2006. 3 * project 2006.
4 */ 4 */
@@ -212,29 +212,33 @@ old_rsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder)
212static int 212static int
213rsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey) 213rsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey)
214{ 214{
215 unsigned char *rk = NULL; 215 ASN1_STRING *str = NULL;
216 int rklen; 216 ASN1_OBJECT *aobj;
217 ASN1_STRING *str;
218 int strtype; 217 int strtype;
218 unsigned char *rk = NULL;
219 int rklen = 0;
219 220
220 if (!rsa_param_encode(pkey, &str, &strtype)) 221 if (!rsa_param_encode(pkey, &str, &strtype))
221 return 0; 222 goto err;
222 223 if ((rklen = i2d_RSAPrivateKey(pkey->pkey.rsa, &rk)) <= 0) {
223 rklen = i2d_RSAPrivateKey(pkey->pkey.rsa, &rk);
224 if (rklen <= 0) {
225 RSAerror(ERR_R_MALLOC_FAILURE); 224 RSAerror(ERR_R_MALLOC_FAILURE);
226 ASN1_STRING_free(str); 225 rklen = 0;
227 return 0; 226 goto err;
228 } 227 }
229 228 if ((aobj = OBJ_nid2obj(pkey->ameth->pkey_id)) == NULL)
230 if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(pkey->ameth->pkey_id), 0, 229 goto err;
231 strtype, str, rk, rklen)) { 230 if (!PKCS8_pkey_set0(p8, aobj, 0, strtype, str, rk, rklen)) {
232 RSAerror(ERR_R_MALLOC_FAILURE); 231 RSAerror(ERR_R_MALLOC_FAILURE);
233 ASN1_STRING_free(str); 232 goto err;
234 return 0;
235 } 233 }
236 234
237 return 1; 235 return 1;
236
237 err:
238 ASN1_STRING_free(str);
239 freezero(rk, rklen);
240
241 return 0;
238} 242}
239 243
240static int 244static int