diff options
Diffstat (limited to 'src/lib/libcrypto/dh/dh_ameth.c')
| -rw-r--r-- | src/lib/libcrypto/dh/dh_ameth.c | 89 |
1 files changed, 47 insertions, 42 deletions
diff --git a/src/lib/libcrypto/dh/dh_ameth.c b/src/lib/libcrypto/dh/dh_ameth.c index 3898db89f0..4a600b3bbd 100644 --- a/src/lib/libcrypto/dh/dh_ameth.c +++ b/src/lib/libcrypto/dh/dh_ameth.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: dh_ameth.c,v 1.32 2023/08/10 15:11:16 tb Exp $ */ | 1 | /* $OpenBSD: dh_ameth.c,v 1.33 2023/08/10 16:57:15 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 | */ |
| @@ -131,50 +131,52 @@ static int | |||
| 131 | dh_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey) | 131 | dh_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey) |
| 132 | { | 132 | { |
| 133 | const DH *dh = pkey->pkey.dh; | 133 | const DH *dh = pkey->pkey.dh; |
| 134 | ASN1_STRING *str = NULL; | 134 | ASN1_STRING *params = NULL; |
| 135 | int ptype = V_ASN1_SEQUENCE; | 135 | int ptype = V_ASN1_SEQUENCE; |
| 136 | ASN1_INTEGER *pub_key = NULL; | 136 | ASN1_INTEGER *key = NULL; |
| 137 | ASN1_OBJECT *aobj; | 137 | ASN1_OBJECT *aobj; |
| 138 | unsigned char *data = NULL, *penc = NULL; | 138 | unsigned char *params_der = NULL, *key_der = NULL; |
| 139 | int datalen = 0, penclen = 0; | 139 | int params_len = 0, key_len = 0; |
| 140 | int ret = 0; | ||
| 140 | 141 | ||
| 141 | if ((datalen = i2d_DHparams(dh, &data)) <= 0) { | 142 | if ((params_len = i2d_DHparams(dh, ¶ms_der)) <= 0) { |
| 142 | DHerror(ERR_R_MALLOC_FAILURE); | 143 | DHerror(ERR_R_MALLOC_FAILURE); |
| 143 | datalen = 0; | 144 | params_len = 0; |
| 144 | goto err; | 145 | goto err; |
| 145 | } | 146 | } |
| 146 | if ((str = ASN1_STRING_new()) == NULL) { | 147 | if ((params = ASN1_STRING_new()) == NULL) { |
| 147 | DHerror(ERR_R_MALLOC_FAILURE); | 148 | DHerror(ERR_R_MALLOC_FAILURE); |
| 148 | goto err; | 149 | goto err; |
| 149 | } | 150 | } |
| 150 | ASN1_STRING_set0(str, data, datalen); | 151 | ASN1_STRING_set0(params, params_der, params_len); |
| 151 | data = NULL; | 152 | params_der = NULL; |
| 152 | datalen = 0; | 153 | params_len = 0; |
| 153 | 154 | ||
| 154 | if ((pub_key = BN_to_ASN1_INTEGER(dh->pub_key, NULL)) == NULL) | 155 | if ((key = BN_to_ASN1_INTEGER(dh->pub_key, NULL)) == NULL) |
| 155 | goto err; | 156 | goto err; |
| 156 | if ((penclen = i2d_ASN1_INTEGER(pub_key, &penc)) <= 0) { | 157 | if ((key_len = i2d_ASN1_INTEGER(key, &key_der)) <= 0) { |
| 157 | DHerror(ERR_R_MALLOC_FAILURE); | 158 | DHerror(ERR_R_MALLOC_FAILURE); |
| 158 | penclen = 0; | 159 | key_len = 0; |
| 159 | goto err; | 160 | goto err; |
| 160 | } | 161 | } |
| 161 | ASN1_INTEGER_free(pub_key); | ||
| 162 | pub_key = NULL; | ||
| 163 | 162 | ||
| 164 | if ((aobj = OBJ_nid2obj(EVP_PKEY_DH)) == NULL) | 163 | if ((aobj = OBJ_nid2obj(EVP_PKEY_DH)) == NULL) |
| 165 | goto err; | 164 | goto err; |
| 166 | if (!X509_PUBKEY_set0_param(pk, aobj, ptype, str, penc, penclen)) | 165 | if (!X509_PUBKEY_set0_param(pk, aobj, ptype, params, key_der, key_len)) |
| 167 | goto err; | 166 | goto err; |
| 167 | params = NULL; | ||
| 168 | key_der = NULL; | ||
| 169 | key_len = 0; | ||
| 168 | 170 | ||
| 169 | return 1; | 171 | ret = 1; |
| 170 | 172 | ||
| 171 | err: | 173 | err: |
| 172 | ASN1_STRING_free(str); | 174 | ASN1_STRING_free(params); |
| 173 | ASN1_INTEGER_free(pub_key); | 175 | ASN1_INTEGER_free(key); |
| 174 | freezero(data, datalen); | 176 | freezero(params_der, params_len); |
| 175 | freezero(penc, penclen); | 177 | freezero(key_der, key_len); |
| 176 | 178 | ||
| 177 | return 0; | 179 | return ret; |
| 178 | } | 180 | } |
| 179 | 181 | ||
| 180 | /* | 182 | /* |
| @@ -239,50 +241,53 @@ dh_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey) | |||
| 239 | { | 241 | { |
| 240 | const DH *dh = pkey->pkey.dh; | 242 | const DH *dh = pkey->pkey.dh; |
| 241 | ASN1_STRING *params = NULL; | 243 | ASN1_STRING *params = NULL; |
| 242 | ASN1_INTEGER *prkey = NULL; | 244 | int ptype = V_ASN1_SEQUENCE; |
| 245 | ASN1_INTEGER *key = NULL; | ||
| 243 | ASN1_OBJECT *aobj; | 246 | ASN1_OBJECT *aobj; |
| 244 | unsigned char *data = NULL, *dp = NULL; | 247 | unsigned char *params_der = NULL, *key_der = NULL; |
| 245 | int datalen = 0, dplen = 0; | 248 | int params_len = 0, key_len = 0; |
| 249 | int ret = 0; | ||
| 246 | 250 | ||
| 247 | if ((datalen = i2d_DHparams(dh, &data)) <= 0) { | 251 | if ((params_len = i2d_DHparams(dh, ¶ms_der)) <= 0) { |
| 248 | DHerror(ERR_R_MALLOC_FAILURE); | 252 | DHerror(ERR_R_MALLOC_FAILURE); |
| 249 | datalen = 0; | 253 | params_len = 0; |
| 250 | goto err; | 254 | goto err; |
| 251 | } | 255 | } |
| 252 | if ((params = ASN1_STRING_type_new(V_ASN1_SEQUENCE)) == NULL) { | 256 | if ((params = ASN1_STRING_type_new(V_ASN1_SEQUENCE)) == NULL) { |
| 253 | DHerror(ERR_R_MALLOC_FAILURE); | 257 | DHerror(ERR_R_MALLOC_FAILURE); |
| 254 | goto err; | 258 | goto err; |
| 255 | } | 259 | } |
| 256 | ASN1_STRING_set0(params, data, datalen); | 260 | ASN1_STRING_set0(params, params_der, params_len); |
| 257 | data = NULL; | 261 | params_der = NULL; |
| 258 | datalen = 0; | 262 | params_len = 0; |
| 259 | 263 | ||
| 260 | if ((prkey = BN_to_ASN1_INTEGER(dh->priv_key, NULL)) == NULL) { | 264 | if ((key = BN_to_ASN1_INTEGER(dh->priv_key, NULL)) == NULL) { |
| 261 | DHerror(DH_R_BN_ERROR); | 265 | DHerror(DH_R_BN_ERROR); |
| 262 | goto err; | 266 | goto err; |
| 263 | } | 267 | } |
| 264 | if ((dplen = i2d_ASN1_INTEGER(prkey, &dp)) <= 0) { | 268 | if ((key_len = i2d_ASN1_INTEGER(key, &key_der)) <= 0) { |
| 265 | DHerror(ERR_R_MALLOC_FAILURE); | 269 | DHerror(ERR_R_MALLOC_FAILURE); |
| 266 | dplen = 0; | 270 | key_len = 0; |
| 267 | goto err; | 271 | goto err; |
| 268 | } | 272 | } |
| 269 | ASN1_INTEGER_free(prkey); | ||
| 270 | prkey = NULL; | ||
| 271 | 273 | ||
| 272 | if ((aobj = OBJ_nid2obj(NID_dhKeyAgreement)) == NULL) | 274 | if ((aobj = OBJ_nid2obj(NID_dhKeyAgreement)) == NULL) |
| 273 | goto err; | 275 | goto err; |
| 274 | if (!PKCS8_pkey_set0(p8, aobj, 0, V_ASN1_SEQUENCE, params, dp, dplen)) | 276 | if (!PKCS8_pkey_set0(p8, aobj, 0, ptype, params, key_der, key_len)) |
| 275 | goto err; | 277 | goto err; |
| 278 | params = NULL; | ||
| 279 | key_der = NULL; | ||
| 280 | key_len = 0; | ||
| 276 | 281 | ||
| 277 | return 1; | 282 | ret = 1; |
| 278 | 283 | ||
| 279 | err: | 284 | err: |
| 280 | ASN1_STRING_free(params); | 285 | ASN1_STRING_free(params); |
| 281 | ASN1_INTEGER_free(prkey); | 286 | ASN1_INTEGER_free(key); |
| 282 | freezero(data, datalen); | 287 | freezero(params_der, params_len); |
| 283 | freezero(dp, dplen); | 288 | freezero(key_der, key_len); |
| 284 | 289 | ||
| 285 | return 0; | 290 | return ret; |
| 286 | } | 291 | } |
| 287 | 292 | ||
| 288 | static int | 293 | static int |
