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 definingOPENSSL_API_COMPATwith a suitable version value β peepopenssl_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_addtakes the two pointsaandb, adds them, and drops the result intor. iconic.EC_POINT_dbldoubles the pointaand puts the result inr. π«- in both of those cases,
ris allowed to also be one ofaorbβ go off, aliasing β¨ EC_POINT_invertcalculates the inverse of the point you hand it asa, and the result goes right back intoa. girl puts herself back together π
the little tests π
EC_POINT_is_at_infinitychecks whether the point you gave it is at infinity or not.EC_POINT_is_on_curvechecks whether the point you gave it is on the curve or not.EC_POINT_cmpcompares 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_affineandEC_POINTs_make_affineforce the internal representation of theEC_POINT(s) into the affine coordinate system.- for
EC_POINTs_make_affine, the valuenumtells you how many points are chilling in the arraypointsthat 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
nmay beNULL, in which case the result is justq * mβ that's variable point multiplication. - alternatively, both
qandmmay beNULL, andnnon-NULL, in which case the result is justgenerator * 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
norm) 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 valuenmay beNULL, ornummay be zero. - when performing a fixed point multiplication (
nis non-NULLandnumis 0) or a variable point multiplication (nisNULLandnumis 1), the underlying implementation uses a constant time algorithm, when the input scalar (eithernorm[0]) is in the range[0, ec_group_order). - modern versions should instead use
EC_POINT_mul(), combined (if needed) withEC_POINT_add()in such rare circumstances. glow-up achieved π
precomputation (also deprecated, RIP)
EC_GROUP_precompute_multstores multiples of the generator so point multiplication goes faster.EC_GROUP_have_precompute_multtests 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()andEC_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_infinityreturns1if the point is at infinity, or0otherwise.EC_POINT_is_on_curvereturns1if the point is on the curve,0if not, or-1on error.EC_POINT_cmpreturns1if the points are not equal,0if they are, or-1on error.EC_GROUP_have_precompute_multreturns1if a precomputation has been done, or0if 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 π
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
- ubuntu stonking: libssl-doc 4.0.3-1ubuntu1 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms