EC_POINT_NEW(3) Library Functions Manual EC_POINT_NEW(3)

EC_POINT_new, EC_POINT_free, EC_POINT_clear_free, EC_POINT_copy, EC_POINT_dupallocate, free and copy elliptic curve points

/* -lcrypto */
#include <openssl/ec.h>


EC_POINT *
EC_POINT_new(const EC_GROUP *group);

void
EC_POINT_free(EC_POINT *point);

void
EC_POINT_clear_free(EC_POINT *point);

int
EC_POINT_copy(EC_POINT *dst, const EC_POINT *src);

EC_POINT *
EC_POINT_dup(const EC_POINT *point, const EC_GROUP *group);

An EC_POINT object holds a point on the elliptic curve represented by an EC_GROUP. The details of the internal representation depend on the group and should never be an application's concern since the EC library has API to set a point's coordinates, EC_POINT_set_affine_coordinates(3).

() allocates and initializes an EC_POINT object to be used with the group. Before explicitly setting its coordinates, the returned EC_POINT is invalid.

() frees point and all memory associated with it. If point is a NULL pointer, no action occurs.

() is intended to destroy sensitive data held in point in addition to freeing all memory associated with it. Since elliptic curve points usually hold public data, this is rarely needed. In LibreSSL, EC_POINT_free() and EC_POINT_clear_free() behave identically.

() copies the internal representation of src into dst. If src and dst are identical, no action occurs. Both src and dst should be the result of EC_POINT_new() with the same group argument, although EC_POINT_copy() cannot check that.

() creates a deep copy of point by combining EC_POINT_new() with ().

EC_POINT_new() returns a newly allocated EC_POINT or NULL on memory allocation failure.

EC_POINT_copy() returns 1 on success or 0 on error. Error conditions include memory allocation failure and that dst is incompatible with the group on which src is defined.

EC_POINT_dup() returns a newly allocated EC_POINT or NULL on failure. Error conditions include memory allocation failure or that group is incompatible with src.

BN_CTX_new(3), BN_is_zero(3), crypto(3), d2i_ECPKParameters(3), EC_GROUP_check(3), EC_GROUP_get_curve_name(3), EC_GROUP_new_by_curve_name(3), EC_GROUP_new_curve_GFp(3), EC_KEY_METHOD_new(3), EC_KEY_new(3), EC_POINT_add(3), EC_POINT_get_affine_coordinates(3), EC_POINT_point2oct(3), ECDH_compute_key(3), ECDSA_SIG_new(3)

EC_POINT_new(), EC_POINT_free(), EC_POINT_clear_free(), and EC_POINT_copy() first appeared in OpenSSL 0.9.7 and have been available since OpenBSD 3.2.

EC_POINT_dup() first appeared in OpenSSL 0.9.8 and has been available since OpenBSD 4.5.

A fundamental flaw in the OpenSSL API toolkit is that *_new() functions usually create invalid objects that are tricky to turn into valid objects. One specific flaw in the EC library internals is that EC_POINT objects do not hold a reference to the group they live on despite the fact that EC_POINT_new() has a group argument. This is difficult to fix because EC_GROUP objects are not reference counted and because of const qualifiers in the API. This is the root cause for various contortions in the EC library and API and there are security implications because not only does the library not know whether an EC_POINT object represents a valid point, even if it did know that it would still not know on what curve.

The signature of EC_GROUP_dup() is bizarre and the order of point and group is inconsistent with the rest of the EC API.

OpenBSD 7.8 June 13, 2025 EC_POINT_NEW(3)