- OPENSSL_ECDSA_ABORT(ECDSA_R_MISSING_PARAMETERS)
- if ((priv_key = ECDSAPrivateKey_new()) == NULL)
- OPENSSL_ECDSA_ABORT(ECDSA_R_ECDSAPRIVATEKEY_NEW_FAILURE)
- if ((priv_key->parameters = ECDSA_get_EC_PARAMETERS(a, priv_key->parameters)) == NULL)
- OPENSSL_ECDSA_ABORT(ECDSA_R_ECDSA_GET_X9_62_EC_PARAMETERS_FAILURE)
- priv_key->version = a->version;
- priv_key->write_params = a->write_params;
- buf_len = EC_POINT_point2oct(a->group, a->pub_key, POINT_CONVERSION_FORM, NULL, 0, NULL);
- if (!buf_len || (buffer = OPENSSL_malloc(buf_len)) == NULL)
- OPENSSL_ECDSA_ABORT(ERR_R_MALLOC_FAILURE)
- if (!EC_POINT_point2oct(a->group, a->pub_key, POINT_CONVERSION_FORM,
- buffer, buf_len, NULL)) goto err;
- if (!M_ASN1_OCTET_STRING_set(priv_key->pub_key, buffer, buf_len))
- OPENSSL_ECDSA_ABORT(ERR_R_ASN1_LIB)
- if ((ret = i2d_ecdsaPublicKey(priv_key, out)) == 0)
- OPENSSL_ECDSA_ABORT(ECDSA_R_I2D_ECDSA_PUBLICKEY)
- ok = 1;
-
-err: if (!ok)
- ECDSAerr(ECDSA_F_I2D_ECDSAPUBLICKEY, reason);
- if (buffer) OPENSSL_free(buffer);
- if (priv_key) ECDSAPrivateKey_free(priv_key);
- return(ok?ret:0);
+ {
+ ECDSAerr(ECDSA_F_I2D_ECDSAPUBLICKEY, ECDSA_R_MISSING_PARAMETERS);
+ return 0;
+ }
+ buf_len = EC_POINT_point2oct(a->group, a->pub_key, ECDSA_get_conversion_form(a), NULL, 0, NULL);
+ if (out == NULL || buf_len == 0)
+ /* out == NULL => just return the length of the octet string */
+ return buf_len;
+ if (*out == NULL)
+ if ((*out = OPENSSL_malloc(buf_len)) == NULL)
+ {
+ ECDSAerr(ECDSA_F_I2D_ECDSAPUBLICKEY, ERR_R_MALLOC_FAILURE);
+ return 0;
+ }
+ if (!EC_POINT_point2oct(a->group, a->pub_key, ECDSA_get_conversion_form(a),
+ *out, buf_len, NULL))
+ {
+ ECDSAerr(ECDSA_F_I2D_ECDSAPUBLICKEY, ERR_R_EC_LIB);
+ OPENSSL_free(*out);
+ *out = NULL;
+ return 0;
+ }
+ return buf_len;