EC_POINT_ADD(3SSL)

πŸ’– EC_POINT_ADD β€” the OpenSSL glow-up for elliptic curve math πŸ’–

okay bestie, so this is one of those OpenSSL manual pages (it lives in section 3SSL, in case anyone asks), and it's literally the whole friend group of functions for doing math and vibe checks on EC_POINT objects. no cap. let's get into it 🫢


✨ NAME ✨

Not one function, a whole squad: EC_POINT_add, EC_POINT_dbl, EC_POINT_invert, EC_POINT_is_at_infinity, EC_POINT_is_on_curve, EC_POINT_cmp, EC_POINT_make_affine, EC_POINTs_make_affine, EC_POINTs_mul, EC_POINT_mul, EC_GROUP_precompute_mult, EC_GROUP_have_precompute_mult β€” every single one of them here to do mathematical operations and tests on EC_POINT objects. main character energy, honestly πŸ’…


✨ SYNOPSIS ✨

bestie start by pulling in the header, always:

#include <openssl/ec.h>

here's the current, not-deprecated lineup:

int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
                 const EC_POINT *b, BN_CTX *ctx);
int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx);
int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx);
int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *p);
int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx);
int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx);
int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n,
                 const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx);

🚫 the deprecated girlies (OpenSSL 3.0 said no)

ok so heads up: everything below has been deprecated since OpenSSL 3.0. you can hide the whole group by defining OPENSSL_API_COMPAT with a suitable version value β€” peep openssl_user_macros(7) for that.
int EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx);
int EC_POINTs_make_affine(const EC_GROUP *group, size_t num,
                          EC_POINT *points[], BN_CTX *ctx);
int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, size_t num,
                  const EC_POINT *p[], const BIGNUM *m[], BN_CTX *ctx);
int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx);
int EC_GROUP_have_precompute_mult(const EC_GROUP *group);

🌸 DESCRIPTION 🌸

math time, but cute

  • EC_POINT_add takes the two points a and b, adds them, and drops the result into r. iconic.
  • EC_POINT_dbl doubles the point a and puts the result in r. πŸ’«
  • in both of those cases, r is allowed to also be one of a or b β€” go off, aliasing ✨
  • EC_POINT_invert calculates the inverse of the point you hand it as a, and the result goes right back into a. girl puts herself back together πŸ’…

the little tests πŸ”

  • EC_POINT_is_at_infinity checks whether the point you gave it is at infinity or not.
  • EC_POINT_is_on_curve checks whether the point you gave it is on the curve or not.
  • EC_POINT_cmp compares the two points you gave it and tells you whether or not they're equal. sisterhood compatibility test 🫢

affine stuff (the deprecated era)

  • EC_POINT_make_affine and EC_POINTs_make_affine force the internal representation of the EC_POINT(s) into the affine coordinate system.
  • for EC_POINTs_make_affine, the value num tells you how many points are chilling in the array points that you want forced.
  • but β€” these two were deprecated in OpenSSL 3.0 and should no longer be used. modern versions just automatically do this conversion when needed, so it's giving solved-on-its-own 🧚

EC_POINT_mul β€” the big one

EC_POINT_mul calculates generator * n + q * m and stores the result in r.

  • the value n may be NULL, in which case the result is just q * m β€” that's variable point multiplication.
  • alternatively, both q and m may be NULL, and n non-NULL, in which case the result is just generator * n β€” that's fixed point multiplication.
  • when performing a single fixed or variable point multiplication, the underlying implementation uses a constant time algorithm, when the input scalar (either n or m) is in the range [0, ec_group_order). iykyk, constant time is the whole point πŸ”₯

EC_POINTs_mul β€” deprecated, but here's what it did

deprecated in OpenSSL 3.0, should no longer be used. do not come for me, I'm just reporting the lore.

EC_POINTs_mul calculates the value generator * n + q[0] * m[0] + ... + q[num-1] * m[num-1].

  • just like EC_POINT_mul, the value n may be NULL, or num may be zero.
  • when performing a fixed point multiplication (n is non-NULL and num is 0) or a variable point multiplication (n is NULL and num is 1), the underlying implementation uses a constant time algorithm, when the input scalar (either n or m[0]) is in the range [0, ec_group_order).
  • modern versions should instead use EC_POINT_mul(), combined (if needed) with EC_POINT_add() in such rare circumstances. glow-up achieved πŸ’–

precomputation (also deprecated, RIP)

  • EC_GROUP_precompute_mult stores multiples of the generator so point multiplication goes faster.
  • EC_GROUP_have_precompute_mult tests whether precomputation has already been done.
  • curious about the generator itself? see EC_GROUP_copy(3) for the info.
  • precomputation functionality was deprecated in OpenSSL 3.0. users of EC_GROUP_precompute_mult() and EC_GROUP_have_precompute_mult() should switch to named curves, which OpenSSL has hardcoded lookup tables for. the upgrade was right there the whole time, bestie 😭

⭐ RETURN VALUES ⭐

these ones return 1 on success or 0 on error: EC_POINT_add, EC_POINT_dbl, EC_POINT_invert, EC_POINT_make_affine, EC_POINTs_make_affine, EC_POINTs_make_affine, EC_POINT_mul, EC_POINTs_mul and EC_GROUP_precompute_mult.

(yes, EC_POINTs_make_affine really is listed twice up there. the original said it twice and I'm not about to commit crimes against the source βœ‹)
  • EC_POINT_is_at_infinity returns 1 if the point is at infinity, or 0 otherwise.
  • EC_POINT_is_on_curve returns 1 if the point is on the curve, 0 if not, or -1 on error.
  • EC_POINT_cmp returns 1 if the points are not equal, 0 if they are, or -1 on error.
  • EC_GROUP_have_precompute_mult returns 1 if a precomputation has been done, or 0 if not.

πŸ¦‹ SEE ALSO πŸ¦‹

crypto(7), EC_GROUP_new(3), EC_GROUP_copy(3), EC_POINT_new(3), EC_KEY_new(3), EC_GFp_simple_method(3), d2i_ECPKParameters(3)

go read them, bestie, they're the extended universe 🌈


πŸ“œ HISTORY πŸ“œ

EC_POINT_make_affine(), EC_POINTs_make_affine(), EC_POINTs_mul(), EC_GROUP_precompute_mult(), and EC_GROUP_have_precompute_mult() were deprecated in OpenSSL 3.0. that's the whole tea. πŸ«–


Copyright 2013-2023 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License"). You may not use this file except in compliance with the License. You can obtain a copy in the file LICENSE in the source distribution or at <https://www.openssl.org/source/license.html>.


okay that's the whole page!! this was 4.0.3, dated 2026-09-29, and it's an OpenSSL 3SSL joint β€” love that for us. mwah, go do secure curve math responsibly πŸ’–βœ¨πŸŽ€πŸ¦‹πŸŒΈπŸ’…πŸ«Ά

πŸ“¦ where this page comes from