diff options
Diffstat (limited to 'lib/libcrypto/dsa')
-rw-r--r-- | lib/libcrypto/dsa/dsa_ameth.c | 89 |
1 files changed, 47 insertions, 42 deletions
diff --git a/lib/libcrypto/dsa/dsa_ameth.c b/lib/libcrypto/dsa/dsa_ameth.c index aab4588b5a0..28aafebc04f 100644 --- a/lib/libcrypto/dsa/dsa_ameth.c +++ b/lib/libcrypto/dsa/dsa_ameth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dsa_ameth.c,v 1.45 2023/08/10 15:11:16 tb Exp $ */ +/* $OpenBSD: dsa_ameth.c,v 1.46 2023/08/10 16:57:15 tb Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 2006. */ @@ -139,55 +139,57 @@ static int dsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey) { const DSA *dsa = pkey->pkey.dsa; - ASN1_STRING *str = NULL; + ASN1_STRING *params = NULL; int ptype = V_ASN1_UNDEF; - ASN1_INTEGER *pub_key = NULL; + ASN1_INTEGER *key = NULL; ASN1_OBJECT *aobj; - unsigned char *data = NULL, *penc = NULL; - int datalen = 0, penclen = 0; + unsigned char *params_der = NULL, *key_der = NULL; + int params_len = 0, key_len = 0; + int ret = 0; if (pkey->save_parameters && dsa->p && dsa->q && dsa->g) { - if ((datalen = i2d_DSAparams(dsa, &data)) <= 0) { + if ((params_len = i2d_DSAparams(dsa, ¶ms_der)) <= 0) { DSAerror(ERR_R_MALLOC_FAILURE); - datalen = 0; + params_len = 0; goto err; } - if ((str = ASN1_STRING_new()) == NULL) { + if ((params = ASN1_STRING_new()) == NULL) { DSAerror(ERR_R_MALLOC_FAILURE); goto err; } - ASN1_STRING_set0(str, data, datalen); - data = NULL; - datalen = 0; + ASN1_STRING_set0(params, params_der, params_len); + params_der = NULL; + params_len = 0; ptype = V_ASN1_SEQUENCE; } - if ((pub_key = BN_to_ASN1_INTEGER(dsa->pub_key, NULL)) == NULL) { + if ((key = BN_to_ASN1_INTEGER(dsa->pub_key, NULL)) == NULL) { DSAerror(ERR_R_MALLOC_FAILURE); goto err; } - if ((penclen = i2d_ASN1_INTEGER(pub_key, &penc)) <= 0) { + if ((key_len = i2d_ASN1_INTEGER(key, &key_der)) <= 0) { DSAerror(ERR_R_MALLOC_FAILURE); - penclen = 0; + key_len = 0; goto err; } - ASN1_INTEGER_free(pub_key); - pub_key = NULL; if ((aobj = OBJ_nid2obj(EVP_PKEY_DSA)) == NULL) goto err; - if (!X509_PUBKEY_set0_param(pk, aobj, ptype, str, penc, penclen)) + if (!X509_PUBKEY_set0_param(pk, aobj, ptype, params, key_der, key_len)) goto err; + params = NULL; + key_der = NULL; + key_len = 0; - return 1; + ret = 1; err: - ASN1_STRING_free(str); - ASN1_INTEGER_free(pub_key); - freezero(data, datalen); - freezero(penc, penclen); + ASN1_STRING_free(params); + ASN1_INTEGER_free(key); + freezero(params_der, params_len); + freezero(key_der, key_len); - return 0; + return ret; } /* In PKCS#8 DSA: you just get a private key integer and parameters in the @@ -274,50 +276,53 @@ dsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey) { const DSA *dsa = pkey->pkey.dsa; ASN1_STRING *params = NULL; - ASN1_INTEGER *prkey = NULL; + int ptype = V_ASN1_SEQUENCE; + ASN1_INTEGER *key = NULL; ASN1_OBJECT *aobj; - unsigned char *data = NULL, *dp = NULL; - int datalen = 0, dplen = 0; + unsigned char *params_der = NULL, *key_der = NULL; + int params_len = 0, key_len = 0; + int ret = 0; - if ((datalen = i2d_DSAparams(dsa, &data)) <= 0) { + if ((params_len = i2d_DSAparams(dsa, ¶ms_der)) <= 0) { DSAerror(ERR_R_MALLOC_FAILURE); - datalen = 0; + params_len = 0; goto err; } if ((params = ASN1_STRING_type_new(V_ASN1_SEQUENCE)) == NULL) { DSAerror(ERR_R_MALLOC_FAILURE); goto err; } - ASN1_STRING_set0(params, data, datalen); - data = NULL; - datalen = 0; + ASN1_STRING_set0(params, params_der, params_len); + params_der = NULL; + params_len = 0; - if ((prkey = BN_to_ASN1_INTEGER(dsa->priv_key, NULL)) == NULL) { + if ((key = BN_to_ASN1_INTEGER(dsa->priv_key, NULL)) == NULL) { DSAerror(DSA_R_BN_ERROR); goto err; } - if ((dplen = i2d_ASN1_INTEGER(prkey, &dp)) <= 0) { + if ((key_len = i2d_ASN1_INTEGER(key, &key_der)) <= 0) { DSAerror(ERR_R_MALLOC_FAILURE); - dplen = 0; + key_len = 0; goto err; } - ASN1_INTEGER_free(prkey); - prkey = NULL; if ((aobj = OBJ_nid2obj(NID_dsa)) == NULL) goto err; - if (!PKCS8_pkey_set0(p8, aobj, 0, V_ASN1_SEQUENCE, params, dp, dplen)) + if (!PKCS8_pkey_set0(p8, aobj, 0, ptype, params, key_der, key_len)) goto err; + params = NULL; + key_der = NULL; + key_len = 0; - return 1; + ret = 1; err: ASN1_STRING_free(params); - ASN1_INTEGER_free(prkey); - freezero(data, datalen); - freezero(dp, dplen); + ASN1_INTEGER_free(key); + freezero(params_der, params_len); + freezero(key_der, key_len); - return 0; + return ret; } static int |